[Vm-dev] VM Maker: VMMaker.oscog-rmacnak.1595.mcz
Eliot Miranda
eliot.miranda at gmail.com
Tue Dec 15 08:31:59 UTC 2015
> On Dec 15, 2015, at 12:15 AM, commits at source.squeak.org wrote:
>
>
> 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.)
Woot!!
> 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