<div dir="ltr">Hi Ryan,<div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 14, 2015 at 7:32 PM, <span dir="ltr"><<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
Ryan Macnak uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1595.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1595.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-rmacnak.1595<br>
Author: rmacnak<br>
Time: 14 December 2015, 7:29:18.283 pm<br>
UUID: 3aac3671-b1ff-45b9-8ed0-f3ecc5bca0b3<br>
Ancestors: VMMaker.oscog-eem.1594<br>
<br>
MIPS: Complete simulation of the Newspeak test suite! (~30 billion instructions) (Modulo Aliens, which don't work under the IA32 simulation either.)<br></blockquote><div><br></div><div>Can you say a little bit more about this? How long did the simulation take? What machine(s) did you run it on? I *love* that you caught the MNU in followForwardingPointersInScheduler. I want to set this up for Squeak but never had the patience/.resources before.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Fix off-by-8 in patching I-type branches. Bug had the effect of skipping loading the cPIC address for a cPIC miss if the cPIC was created for an MNU case.<br>
<br>
Handle PushCw in storeLiteral:beforeFollowingAddress:.<br>
<br>
Add the GC's variant of rewriteInlineCacheTag:at:.<br>
<br>
Fix MNU in followForwardingPointersInScheduler.<br>
<br>
=============== Diff against VMMaker.oscog-eem.1594 ===============<br>
<br>
Item was changed:<br>
----- Method: CogMIPSELCompiler>>rewriteITypeBranchAtAddress:target: (in category 'inline cacheing') -----<br>
rewriteITypeBranchAtAddress: mcpc target: newTarget<br>
+ | newDisplacement oldInstruction newInstruction |<br>
+ newDisplacement := newTarget - (mcpc + 4). "Displacement is relative to delay slot."<br>
+ newDisplacement := newDisplacement >> 2. "Displacement is in words."<br>
- | newDisplacement oldInstruction newInstruction |<br>
- newDisplacement := newTarget - (mcpc - 4). "Displacement relative to delay slot"<br>
- newDisplacement := newDisplacement >> 2.<br>
<br>
self assert: (newDisplacement between: -16r8000 and: 16r7FFF).<br>
newDisplacement < 0<br>
ifTrue: [newDisplacement := newDisplacement + 16r10000]<br>
ifFalse: [newDisplacement := newDisplacement].<br>
self assert: (newDisplacement between: 0 and: 16rFFFF).<br>
<br>
oldInstruction := objectMemory longAt: mcpc.<br>
newInstruction := (oldInstruction bitAnd: 16rFFFF0000) bitOr: newDisplacement.<br>
<br>
objectMemory longAt: mcpc put: newInstruction.!<br>
<br>
Item was added:<br>
+ ----- Method: CogMIPSELCompiler>>rewriteInlineCacheTag:at: (in category 'inline cacheing') -----<br>
+ rewriteInlineCacheTag: cacheTag at: callSiteReturnAddress<br>
+ "Rewrite an inline cache with a new tag. This variant is used<br>
+ by the garbage collector."<br>
+<br>
+ "MoveCwR ClassReg selectorIndex/expectedClass<br>
+ Call: unlinked send stub/expectedTarget<br>
+ Push ReceiverResult <-- callSiteReturnAddress"<br>
+<br>
+ "lui s3, selector/tagHigh<br>
+ ori s3, s3, selector/tagLow<br>
+ lui t9, stub/targetHigh<br>
+ ori t9, t9, stub/targetLow<br>
+ jalr t9<br>
+ nop (delay slot)<br>
+ ... <-- callSiteReturnAddress"<br>
+<br>
+ <var: #callSiteReturnAddress type: #usqInt><br>
+ <var: #callTargetAddress type: #usqInt><br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 24) = LUI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 20) = ORI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 16) = LUI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 12) = ORI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 8) = SPECIAL.<br>
+ self assert: (self functionAtAddress: callSiteReturnAddress - 8) = JALR.<br>
+ self assert: (objectMemory longAt: callSiteReturnAddress - 4) = self nop.<br>
+ "cogit disassembleFrom: callSiteReturnAddress - 24 to: callSiteReturnAddress."<br>
+<br>
+ self literalAtAddress: callSiteReturnAddress - 20 put: cacheTag.<br>
+<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 24) = LUI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 20) = ORI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 16) = LUI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 12) = ORI.<br>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 8) = SPECIAL.<br>
+ self assert: (self functionAtAddress: callSiteReturnAddress - 8) = JALR.<br>
+ self assert: (objectMemory longAt: callSiteReturnAddress - 4) = self nop.<br>
+ "cogit disassembleFrom: callSiteReturnAddress - 24 to: callSiteReturnAddress."!<br>
<br>
Item was changed:<br>
----- Method: CogMIPSELCompiler>>storeLiteral:beforeFollowingAddress: (in category 'inline cacheing') -----<br>
storeLiteral: literal beforeFollowingAddress: followingAddress<br>
"Rewrite the long constant loaded by a MoveCwR or PushCwR before the given address"<br>
- | lastOpcode lastFunction oriAddress |<br>
self flag: #bogus. "The caller ought to know what it is patching, and this should be split into separate methods with stricter checking."<br>
<br>
+ "Cmp/MoveCwR<br>
+ pc-8 lui rx, uper<br>
+ pc-4 ori rx, rx, lower"<br>
+ (self opcodeAtAddress: followingAddress - 4) = ORI ifTrue:<br>
+ [^self literalAtAddress: followingAddress - 4 put: literal].<br>
+<br>
+ "PushCw<br>
+ pc-16 lui at, upper<br>
+ pc-12 ori at, at, lower<br>
+ pc-8 addiu sp, sp, -4<br>
+ pc-4 sw at, 0(sp)"<br>
+ ((self opcodeAtAddress: followingAddress - 4) = SW and:<br>
+ [(self opcodeAtAddress: followingAddress - 8) = ADDIU]) ifTrue:<br>
+ [^self literalAtAddress: followingAddress - 12 put: literal].<br>
+<br>
+ self unreachable.<br>
+ ^0!<br>
- lastOpcode := self opcodeAtAddress: followingAddress - 4.<br>
- lastFunction := self functionAtAddress: followingAddress - 4.<br>
- oriAddress := 0.<br>
- lastOpcode = ORI ifTrue: [oriAddress := followingAddress - 4].<br>
- lastOpcode = ADDIU ifTrue: [oriAddress := followingAddress - 16].<br>
- lastOpcode = SPECIAL ifTrue: [lastFunction = SUBU ifTrue: [oriAddress := followingAddress - 8]].<br>
- self assert: oriAddress ~= 0.<br>
- ^self literalAtAddress: oriAddress put: literal!<br>
<br>
Item was changed:<br>
----- Method: StackInterpreter>>followForwardingPointersInScheduler (in category 'object memory support') -----<br>
followForwardingPointersInScheduler<br>
| schedAssoc sched procLists |<br>
schedAssoc := objectMemory splObj: SchedulerAssociation.<br>
"the GC follows pointers in the special objects array for us."<br>
self assert: (objectMemory isForwarded: schedAssoc) not.<br>
<br>
"Make sure the active process has been followed."<br>
+ objectMemory followForwardedObjectFields: schedAssoc toDepth: 1.<br>
- self followForwardedObjectFields: schedAssoc toDepth: 1.<br>
<br>
sched := objectMemory fetchPointer: ValueIndex ofObject: schedAssoc.<br>
<br>
procLists := objectMemory followObjField: ProcessListsIndex ofObject: sched.<br>
<br>
"Follow all links in the process list to ensure the lists are valid."<br>
0 to: (objectMemory numSlotsOf: procLists) - 1 do:<br>
[:i| | list first last next |<br>
list := objectMemory followObjField: i ofObject: procLists.<br>
first := objectMemory followObjField: FirstLinkIndex ofObject: list.<br>
last := objectMemory followObjField: LastLinkIndex ofObject: list.<br>
[first ~= last] whileTrue:<br>
[next := objectMemory followObjField: NextLinkIndex ofObject: first.<br>
first := next]]<br>
!<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>