[Vm-dev] VM Maker: VMMaker.oscog-eem.433.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Oct 4 00:31:14 UTC 2013
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.433.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.433
Author: eem
Time: 3 October 2013, 5:28:26.615 pm
UUID: a3ae4b63-36dd-4fef-918a-5f92b009851a
Ancestors: VMMaker.oscog-eem.432
Implement CogObjectRepresentationFor32BitSpur>>genInnerPrimitiveNew:.
Recategorize the format definitions so there's a convenient list of them.
=============== Diff against VMMaker.oscog-eem.432 ===============
Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>genGetHashFieldNonImmOf:into: (in category 'compile abstract instructions') -----
+ genGetHashFieldNonImmOf: instReg into: destReg
+ "Fetch the instance's identity hash into destReg, unencoded."
+ cogit MoveMw: 4 r: instReg R: destReg.
+ cogit AndCq: objectMemory identityHashHalfWordMask R: destReg.
+ ^0!
Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>genInnerPrimitiveNew: (in category 'primitive generators') -----
+ genInnerPrimitiveNew: retNoffset
+ "Implement primitiveNew for convenient cases:
+ - the receiver has a hash
+ - the receiver is fixed size (excluding ephemerons to save instructions & miniscule time)
+ - single word header/num slots < numSlotsMask
+ - the result fits in eden"
+
+ | halfHeaderReg instSpecReg
+ jumpUnhashed jumpVariableOrEphemeron jumpNoSpace jumpTooBig jumpHasSlots fillLoop skip |
+ <var: 'skip' type: #'AbstractInstruction *'>
+ <var: 'fillLoop' type: #'AbstractInstruction *'>
+ <var: 'jumpTooBig' type: #'AbstractInstruction *'>
+ <var: 'jumpHasSlots' type: #'AbstractInstruction *'>
+ <var: 'jumpNoSpace' type: #'AbstractInstruction *'>
+ <var: 'jumpUnhashed' type: #'AbstractInstruction *'>
+ <var: 'jumpVariableOrEphemeron' type: #'AbstractInstruction *'>
+
+ "half header will contain classIndex (class's hash) and format, then fixed size and eventually nilObject"
+ halfHeaderReg := SendNumArgsReg.
+ "inst spec will hold class's instance specification and then byte size and finally numSlots half of header"
+ instSpecReg := ClassReg.
+
+ "get freeStart as early as possible so as not to wait later..."
+ cogit MoveAw: objectMemory freeStartAddress R: Arg1Reg.
+ "get class's hash & fail if 0"
+ self genGetHashFieldNonImmOf: ReceiverResultReg into: halfHeaderReg.
+ jumpUnhashed := cogit JumpZero: 0.
+ "get class's format inst var for both inst spec (format field) and num fixed fields"
+ self genLoadSlot: InstanceSpecificationIndex sourceReg: ReceiverResultReg destReg: TempReg.
+ self genConvertSmallIntegerToIntegerInScratchReg: TempReg.
+ cogit MoveR: TempReg R: instSpecReg.
+ cogit LogicalShiftRightCq: objectMemory fixedFieldsFieldWidth R: TempReg.
+ cogit AndCq: objectMemory formatMask R: TempReg.
+ cogit AndCq: objectMemory fixedFieldsOfClassFormatMask R: instSpecReg.
+ "fail if not fixed or if ephemeron (rare beasts so save the cycles)"
+ cogit CmpCq: objectMemory nonIndexablePointerFormat R: TempReg.
+ jumpVariableOrEphemeron := cogit JumpAbove: 0.
+ cogit CmpCq: objectMemory numSlotsMask R: instSpecReg.
+ jumpTooBig := cogit JumpAboveOrEqual: 0.
+ "Add format to classIndex/format half header; other word contains numSlots"
+ cogit LogicalShiftLeftCq: objectMemory formatShift R: TempReg.
+ cogit AddR: TempReg R: halfHeaderReg.
+ "write half header now; it frees halfHeaderReg"
+ cogit MoveR: halfHeaderReg Mw: 0 r: Arg1Reg.
+ "save unrounded numSlots for header"
+ cogit MoveR: instSpecReg R: halfHeaderReg.
+ "compute byte size; remember 0-sized objects still need 1 slot & allocation is
+ rounded up to 8 bytes."
+ cogit CmpCq: 0 R: instSpecReg.
+ jumpHasSlots := cogit JumpNonZero: 0.
+ cogit MoveCq: objectMemory baseHeaderSize * 2 R: instSpecReg.
+ skip := cogit Jump: 0.
+ "round up to allocationUnit"
+ jumpHasSlots jmpTarget:
+ (cogit MoveR: instSpecReg R: TempReg).
+ cogit AndCq: 1 R: TempReg.
+ cogit AddR: TempReg R: instSpecReg.
+ cogit AddCq: objectMemory baseHeaderSize / objectMemory wordSize R: instSpecReg.
+ cogit LogicalShiftLeftCq: objectMemory shiftForWord R: instSpecReg.
+ skip jmpTarget: "get scavengeThreshold (have freeStart already)"
+ (cogit MoveAw: objectMemory scavengeThresholdAddress R: TempReg).
+ "shift halfHeaderReg to put numSlots in correct place"
+ cogit LogicalShiftLeftCq: objectMemory numSlotsHalfShift R: halfHeaderReg.
+ "check if allocation fits"
+ cogit SubR: Arg1Reg R: TempReg.
+ cogit CmpR: TempReg R: instSpecReg.
+ jumpNoSpace := cogit JumpAbove: 0.
+ "get result, increment freeStart and write it back. Arg1Reg holds new freeStart, the limit of the object"
+ cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit AddR: instSpecReg R: Arg1Reg.
+ cogit MoveR: Arg1Reg Aw: objectMemory freeStartAddress.
+ "write other half of header (numSlots/identityHash)"
+ cogit MoveR: halfHeaderReg Mw: 4 r: ReceiverResultReg.
+ "now fill"
+ cogit LoadEffectiveAddressMw: objectMemory baseHeaderSize r: ReceiverResultReg R: instSpecReg.
+ cogit MoveCq: objectMemory nilObject R: halfHeaderReg.
+ "at least two words; so can make this a [fill 2 words. reached limit?] whileFalse"
+ fillLoop :=
+ cogit MoveR: halfHeaderReg Mw: 0 r: instSpecReg.
+ cogit MoveR: halfHeaderReg Mw: 4 r: instSpecReg.
+ cogit AddCq: 8 R: instSpecReg.
+ cogit CmpR: Arg1Reg R: instSpecReg.
+ cogit JumpBelow: fillLoop.
+ cogit RetN: retNoffset.
+
+ jumpUnhashed jmpTarget:
+ (jumpVariableOrEphemeron jmpTarget:
+ (jumpTooBig jmpTarget:
+ (jumpNoSpace jmpTarget: cogit Label))).
+
+ ^0!
Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>genInnerPrimitiveNew: (in category 'primitive generators') -----
+ genInnerPrimitiveNew: retNoffset
+ "Implement primitiveNew for convenient cases:
+ - the receiver has a hash
+ - the receiver is fixed size
+ - the result fits in eden"
+
+ self subclassResponsibility!
Item was changed:
+ ----- Method: SpurMemoryManager>>arrayFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>arrayFormat (in category 'header format') -----
arrayFormat
^2!
Item was changed:
+ ----- Method: SpurMemoryManager>>ephemeronFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>ephemeronFormat (in category 'header format') -----
ephemeronFormat
^5!
Item was changed:
+ ----- Method: SpurMemoryManager>>firstByteFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>firstByteFormat (in category 'header format') -----
firstByteFormat
^16!
Item was changed:
+ ----- Method: SpurMemoryManager>>firstCompiledMethodFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>firstCompiledMethodFormat (in category 'header format') -----
firstCompiledMethodFormat
^24!
Item was changed:
+ ----- Method: SpurMemoryManager>>firstLongFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>firstLongFormat (in category 'header format') -----
firstLongFormat
^10!
Item was changed:
+ ----- Method: SpurMemoryManager>>firstShortFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>firstShortFormat (in category 'header format') -----
firstShortFormat
^12!
Item was changed:
+ ----- Method: SpurMemoryManager>>firstStringyFakeFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>firstStringyFakeFormat (in category 'header format') -----
firstStringyFakeFormat
"A fake format for the interpreter used to mark indexable strings in
the interpreter's at cache. This is larger than any format."
^32!
Item was changed:
+ ----- Method: SpurMemoryManager>>forwardedFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>forwardedFormat (in category 'header format') -----
forwardedFormat
"A special format used by the GC to follow only the first pointer."
^7!
Item was changed:
+ ----- Method: SpurMemoryManager>>indexablePointersFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>indexablePointersFormat (in category 'header format') -----
indexablePointersFormat
^3!
Item was changed:
+ ----- Method: SpurMemoryManager>>lastPointerFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>lastPointerFormat (in category 'header format') -----
lastPointerFormat
^5!
Item was changed:
+ ----- Method: SpurMemoryManager>>nonIndexablePointerFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>nonIndexablePointerFormat (in category 'header format') -----
nonIndexablePointerFormat
^1!
Item was changed:
+ ----- Method: SpurMemoryManager>>sixtyFourBitIndexableFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>sixtyFourBitIndexableFormat (in category 'header format') -----
sixtyFourBitIndexableFormat
^9!
Item was changed:
+ ----- Method: SpurMemoryManager>>weakArrayFormat (in category 'header formats') -----
- ----- Method: SpurMemoryManager>>weakArrayFormat (in category 'header format') -----
weakArrayFormat
^4!
More information about the Vm-dev
mailing list