[Vm-dev] VM Maker: VMMaker.oscog-rmacnak.1595.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Dec 15 03:33:24 UTC 2015
Ryan Macnak uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1595.mcz
==================== Summary ====================
Name: VMMaker.oscog-rmacnak.1595
Author: rmacnak
Time: 14 December 2015, 7:29:18.283 pm
UUID: 3aac3671-b1ff-45b9-8ed0-f3ecc5bca0b3
Ancestors: VMMaker.oscog-eem.1594
MIPS: Complete simulation of the Newspeak test suite! (~30 billion instructions) (Modulo Aliens, which don't work under the IA32 simulation either.)
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.
Handle PushCw in storeLiteral:beforeFollowingAddress:.
Add the GC's variant of rewriteInlineCacheTag:at:.
Fix MNU in followForwardingPointersInScheduler.
=============== Diff against VMMaker.oscog-eem.1594 ===============
Item was changed:
----- Method: CogMIPSELCompiler>>rewriteITypeBranchAtAddress:target: (in category 'inline cacheing') -----
rewriteITypeBranchAtAddress: mcpc target: newTarget
+ | newDisplacement oldInstruction newInstruction |
+ newDisplacement := newTarget - (mcpc + 4). "Displacement is relative to delay slot."
+ newDisplacement := newDisplacement >> 2. "Displacement is in words."
- | newDisplacement oldInstruction newInstruction |
- newDisplacement := newTarget - (mcpc - 4). "Displacement relative to delay slot"
- newDisplacement := newDisplacement >> 2.
self assert: (newDisplacement between: -16r8000 and: 16r7FFF).
newDisplacement < 0
ifTrue: [newDisplacement := newDisplacement + 16r10000]
ifFalse: [newDisplacement := newDisplacement].
self assert: (newDisplacement between: 0 and: 16rFFFF).
oldInstruction := objectMemory longAt: mcpc.
newInstruction := (oldInstruction bitAnd: 16rFFFF0000) bitOr: newDisplacement.
objectMemory longAt: mcpc put: newInstruction.!
Item was added:
+ ----- Method: CogMIPSELCompiler>>rewriteInlineCacheTag:at: (in category 'inline cacheing') -----
+ rewriteInlineCacheTag: cacheTag at: callSiteReturnAddress
+ "Rewrite an inline cache with a new tag. This variant is used
+ by the garbage collector."
+
+ "MoveCwR ClassReg selectorIndex/expectedClass
+ Call: unlinked send stub/expectedTarget
+ Push ReceiverResult <-- callSiteReturnAddress"
+
+ "lui s3, selector/tagHigh
+ ori s3, s3, selector/tagLow
+ lui t9, stub/targetHigh
+ ori t9, t9, stub/targetLow
+ jalr t9
+ nop (delay slot)
+ ... <-- callSiteReturnAddress"
+
+ <var: #callSiteReturnAddress type: #usqInt>
+ <var: #callTargetAddress type: #usqInt>
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 24) = LUI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 20) = ORI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 16) = LUI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 12) = ORI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 8) = SPECIAL.
+ self assert: (self functionAtAddress: callSiteReturnAddress - 8) = JALR.
+ self assert: (objectMemory longAt: callSiteReturnAddress - 4) = self nop.
+ "cogit disassembleFrom: callSiteReturnAddress - 24 to: callSiteReturnAddress."
+
+ self literalAtAddress: callSiteReturnAddress - 20 put: cacheTag.
+
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 24) = LUI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 20) = ORI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 16) = LUI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 12) = ORI.
+ self assert: (self opcodeAtAddress: callSiteReturnAddress - 8) = SPECIAL.
+ self assert: (self functionAtAddress: callSiteReturnAddress - 8) = JALR.
+ self assert: (objectMemory longAt: callSiteReturnAddress - 4) = self nop.
+ "cogit disassembleFrom: callSiteReturnAddress - 24 to: callSiteReturnAddress."!
Item was changed:
----- Method: CogMIPSELCompiler>>storeLiteral:beforeFollowingAddress: (in category 'inline cacheing') -----
storeLiteral: literal beforeFollowingAddress: followingAddress
"Rewrite the long constant loaded by a MoveCwR or PushCwR before the given address"
- | lastOpcode lastFunction oriAddress |
self flag: #bogus. "The caller ought to know what it is patching, and this should be split into separate methods with stricter checking."
+ "Cmp/MoveCwR
+ pc-8 lui rx, uper
+ pc-4 ori rx, rx, lower"
+ (self opcodeAtAddress: followingAddress - 4) = ORI ifTrue:
+ [^self literalAtAddress: followingAddress - 4 put: literal].
+
+ "PushCw
+ pc-16 lui at, upper
+ pc-12 ori at, at, lower
+ pc-8 addiu sp, sp, -4
+ pc-4 sw at, 0(sp)"
+ ((self opcodeAtAddress: followingAddress - 4) = SW and:
+ [(self opcodeAtAddress: followingAddress - 8) = ADDIU]) ifTrue:
+ [^self literalAtAddress: followingAddress - 12 put: literal].
+
+ self unreachable.
+ ^0!
- lastOpcode := self opcodeAtAddress: followingAddress - 4.
- lastFunction := self functionAtAddress: followingAddress - 4.
- oriAddress := 0.
- lastOpcode = ORI ifTrue: [oriAddress := followingAddress - 4].
- lastOpcode = ADDIU ifTrue: [oriAddress := followingAddress - 16].
- lastOpcode = SPECIAL ifTrue: [lastFunction = SUBU ifTrue: [oriAddress := followingAddress - 8]].
- self assert: oriAddress ~= 0.
- ^self literalAtAddress: oriAddress put: literal!
Item was changed:
----- Method: StackInterpreter>>followForwardingPointersInScheduler (in category 'object memory support') -----
followForwardingPointersInScheduler
| schedAssoc sched procLists |
schedAssoc := objectMemory splObj: SchedulerAssociation.
"the GC follows pointers in the special objects array for us."
self assert: (objectMemory isForwarded: schedAssoc) not.
"Make sure the active process has been followed."
+ objectMemory followForwardedObjectFields: schedAssoc toDepth: 1.
- self followForwardedObjectFields: schedAssoc toDepth: 1.
sched := objectMemory fetchPointer: ValueIndex ofObject: schedAssoc.
procLists := objectMemory followObjField: ProcessListsIndex ofObject: sched.
"Follow all links in the process list to ensure the lists are valid."
0 to: (objectMemory numSlotsOf: procLists) - 1 do:
[:i| | list first last next |
list := objectMemory followObjField: i ofObject: procLists.
first := objectMemory followObjField: FirstLinkIndex ofObject: list.
last := objectMemory followObjField: LastLinkIndex ofObject: list.
[first ~= last] whileTrue:
[next := objectMemory followObjField: NextLinkIndex ofObject: first.
first := next]]
!
More information about the Vm-dev
mailing list