[Vm-dev] VM Maker: VMMaker.oscog-eem.1642.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Jan 16 15:41:25 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1642.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1642
Author: eem
Time: 16 January 2016, 7:39:32.736816 am
UUID: 32f50135-e850-42ef-af03-cf236135405b
Ancestors: VMMaker.oscog-eem.1641
x64 Cogit:
Fix at least some of the bounds checking issues in SPur's genPrimitiveStringAt[Put].
Fix the receiver in recent follow of stacked closure change.
=============== Diff against VMMaker.oscog-eem.1641 ===============
Item was changed:
----- Method: CogObjectRepresentationFor32BitSpur>>genPrimitiveStringAt (in category 'primitive generators') -----
genPrimitiveStringAt
| formatReg jumpNotIndexable jumpBadIndex done
+ jumpIsBytes jumpIsShorts jumpWordTooBig jumpWordsDone
- jumpIsBytes jumpIsShorts jumpIsWords jumpWordTooBig
jumpBytesOutOfBounds jumpShortsOutOfBounds jumpWordsOutOfBounds |
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #done type: #'AbstractInstruction *'>
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
- <var: #jumpIsWords type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
+ <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpWordTooBig type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
cogit genLoadArgAtDepth: 0 into: Arg0Reg.
cogit MoveR: Arg0Reg R: Arg1Reg.
jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
self genConvertSmallIntegerToIntegerInReg: Arg1Reg.
cogit SubCq: 1 R: Arg1Reg. "1-rel => 0-rel"
self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: NoReg.
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format in a combination of highest dynamic frequency order first and convenience.
0 = 0 sized objects (UndefinedObject True False et al)
1 = non-indexable objects with inst vars (Point et al)
2 = indexable objects with no inst vars (Array et al)
3 = indexable objects with inst vars (MethodContext AdditionalMethodState et al)
4 = weak indexable objects with inst vars (WeakArray et al)
5 = weak non-indexable objects with inst vars (ephemerons) (Ephemeron)
6 unused, reserved for exotic pointer objects?
7 Forwarded Object, 1st field is pointer, rest of fields are ignored
8 unused, reserved for exotic non-pointer objects?
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
jumpIsBytes := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
jumpIsShorts := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
+ jumpNotIndexable := cogit JumpLess: 0.
- jumpIsWords := cogit JumpGreaterOrEqual: 0.
- jumpNotIndexable := cogit Jump: 0.
+ "fall through to double words"
+ cogit CmpR: Arg1Reg R: ClassReg.
+ jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
+ cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
+ cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: TempReg.
+ jumpWordTooBig := self jumpNotCharacterUnsignedValueInRegister: TempReg.
+ cogit MoveR: TempReg R: ReceiverResultReg.
+ jumpWordsDone := cogit Jump: 0.
+
jumpIsBytes jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg).
+ cogit AndCq: objectMemory wordSize - 1 R: formatReg.
+ cogit SubR: formatReg R: ClassReg.
+ cogit CmpR: Arg1Reg R: ClassReg.
- cogit AndCq: objectMemory wordSize - 1 R: formatReg.
- cogit SubR: formatReg R: ClassReg;
- CmpR: Arg1Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize R: Arg1Reg.
cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
cogit backEnd byteReadsZeroExtend ifFalse:
[cogit AndCq: 255 R: ReceiverResultReg].
+ jumpWordsDone jmpTarget: (done := cogit Label).
- done := cogit Label.
self genConvertIntegerToCharacterInReg: ReceiverResultReg.
cogit genPrimReturn.
jumpIsShorts jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg).
+ cogit AndCq: objectMemory wordSize / 1 - 1 R: formatReg.
+ cogit SubR: formatReg R: ClassReg.
+ cogit CmpR: Arg1Reg R: ClassReg.
- cogit AndCq: 1 R: formatReg.
- cogit SubR: formatReg R: ClassReg;
- CmpR: Arg1Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddR: Arg1Reg R: ReceiverResultReg.
cogit MoveM16: objectMemory baseHeaderSize r: ReceiverResultReg R: ReceiverResultReg.
cogit Jump: done.
- jumpIsWords jmpTarget:
- (cogit CmpR: Arg1Reg R: ClassReg).
- jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
- cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
- cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: TempReg.
- cogit SubCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
- jumpWordTooBig := self jumpNotCharacterUnsignedValueInRegister: TempReg.
- cogit MoveR: TempReg R: ReceiverResultReg.
- cogit Jump: done.
+ jumpWordTooBig jmpTarget:
+ (jumpBytesOutOfBounds jmpTarget:
- jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget:
- (jumpWordTooBig jmpTarget:
(jumpNotIndexable jmpTarget:
(jumpBadIndex jmpTarget: cogit Label))))).
^CompletePrimitive!
Item was changed:
----- Method: CogObjectRepresentationFor32BitSpur>>genPrimitiveStringAtPut (in category 'primitive generators') -----
genPrimitiveStringAtPut
+ | formatReg jumpBadIndex jumpBadArg jumpImmutable
+ jumpIsBytes jumpIsShorts jumpNotString jumpIsCompiledMethod
- | formatReg jumpBadIndex jumpBadArg jumpShortsDone jumpWordsDone
jumpBytesOutOfRange jumpShortsOutOfRange jumpWordsOutOfRange
- jumpIsBytes jumpIsShorts jumpNotString jumpIsCompiledMethod jumpImmutable
jumpBytesOutOfBounds jumpWordsOutOfBounds jumpShortsOutOfBounds |
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #jumpBadArg type: #'AbstractInstruction *'>
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
- <var: #jumpShortsDone type: #'AbstractInstruction *'>
- <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfRange type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfRange type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfRange type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
cogit genLoadArgAtDepth: 1 into: Arg0Reg.
cogit genLoadArgAtDepth: 0 into: Arg1Reg.
jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg.
cogit MoveR: Arg1Reg R: TempReg.
jumpBadArg := self genJumpNotCharacterInScratchReg: TempReg.
self genConvertSmallIntegerToIntegerInReg: Arg0Reg.
cogit SubCq: 1 R: Arg0Reg. "1-rel => 0-rel"
"formatReg := self formatOf: ReceiverResultReg"
self cppIf: IMMUTABILITY
ifTrue:
[ self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: TempReg.
jumpImmutable := self genJumpBaseHeaderImmutable: TempReg ]
ifFalse:
[ self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: NoReg ].
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format; words and/or bytes.
0 to 8 = pointer objects, forwarders, reserved.
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
+ jumpNotString := cogit JumpBelow: 0.
- jumpNotString := cogit JumpBelowOrEqual: 0.
cogit CmpCq: objectMemory firstCompiledMethodFormat R: formatReg.
jumpIsCompiledMethod := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
+ jumpIsBytes := cogit JumpAboveOrEqual: 0.
- jumpIsBytes := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
+ jumpIsShorts := cogit JumpAboveOrEqual: 0.
- jumpIsShorts := cogit JumpGreaterOrEqual: 0.
+ "fall through to double words"
cogit CmpCq: 0 R: Arg1Reg.
jumpWordsOutOfRange := cogit JumpLess: 0.
cogit CmpR: Arg0Reg R: ClassReg.
jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertSmallIntegerToIntegerInReg: TempReg.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg.
cogit MoveR: TempReg Xwr: Arg0Reg R: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpWordsDone := cogit Jump: 0.
jumpIsShorts jmpTarget:
(cogit CmpCq: (objectMemory characterObjectOf: 65535) R: Arg1Reg).
jumpShortsOutOfRange := cogit JumpAbove: 0.
cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg.
+ cogit AndCq: objectMemory wordSize / 2 - 1 R: formatReg.
- cogit AndCq: 1 R: formatReg.
cogit SubR: formatReg R: ClassReg.
cogit CmpR: Arg0Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertSmallIntegerToIntegerInReg: TempReg.
cogit AddR: Arg0Reg R: ReceiverResultReg.
cogit MoveR: TempReg M16: objectMemory baseHeaderSize r: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpShortsDone := cogit Jump: 0.
jumpIsBytes jmpTarget:
(cogit CmpCq: (objectMemory characterObjectOf: 255) R: Arg1Reg).
jumpBytesOutOfRange := cogit JumpAbove: 0.
cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg.
cogit AndCq: objectMemory wordSize - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg.
cogit CmpR: Arg0Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertCharacterToCodeInReg: TempReg.
cogit AddCq: objectMemory baseHeaderSize R: Arg0Reg.
cogit MoveR: TempReg Xbr: Arg0Reg R: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpShortsDone jmpTarget:
- (jumpWordsDone jmpTarget: cogit genPrimReturn).
-
jumpNotString jmpTarget:
(jumpBytesOutOfRange jmpTarget:
(jumpShortsOutOfRange jmpTarget:
(jumpWordsOutOfRange jmpTarget:
(jumpIsCompiledMethod jmpTarget:
(jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget: cogit Label))))))).
self cppIf: IMMUTABILITY
ifTrue: [jumpImmutable jmpTarget: jumpNotString getJmpTarget].
cogit AddCq: 1 R: Arg0Reg. "0-rel => 1-rel"
self genConvertIntegerToSmallIntegerInReg: Arg0Reg.
jumpBadArg jmpTarget:
(jumpBadIndex jmpTarget: cogit Label).
^CompletePrimitive!
Item was changed:
----- Method: CogObjectRepresentationFor64BitSpur>>genPrimitiveStringAt (in category 'primitive generators') -----
genPrimitiveStringAt
| formatReg jumpNotIndexable jumpBadIndex done
+ jumpIsBytes jumpIsShorts jumpWordTooBig jumpWordsDone
- jumpIsBytes jumpIsShorts jumpIsWords jumpWordTooBig
jumpBytesOutOfBounds jumpShortsOutOfBounds jumpWordsOutOfBounds |
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #done type: #'AbstractInstruction *'>
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
- <var: #jumpIsWords type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
+ <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpWordTooBig type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
cogit genLoadArgAtDepth: 0 into: Arg0Reg.
cogit MoveR: Arg0Reg R: Arg1Reg.
jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
self genConvertSmallIntegerToIntegerInReg: Arg1Reg.
cogit SubCq: 1 R: Arg1Reg. "1-rel => 0-rel"
self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: NoReg.
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format in a combination of highest dynamic frequency order first and convenience.
0 = 0 sized objects (UndefinedObject True False et al)
1 = non-indexable objects with inst vars (Point et al)
2 = indexable objects with no inst vars (Array et al)
3 = indexable objects with inst vars (MethodContext AdditionalMethodState et al)
4 = weak indexable objects with inst vars (WeakArray et al)
5 = weak non-indexable objects with inst vars (ephemerons) (Ephemeron)
6 unused, reserved for exotic pointer objects?
7 Forwarded Object, 1st field is pointer, rest of fields are ignored
8 unused, reserved for exotic non-pointer objects?
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
jumpIsBytes := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
jumpIsShorts := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
+ jumpNotIndexable := cogit JumpLess: 0.
- jumpIsWords := cogit JumpGreaterOrEqual: 0.
- jumpNotIndexable := cogit Jump: 0.
+ "fall through to double words"
+ cogit LogicalShiftLeftCq: objectMemory shiftForWord - 2 R: ClassReg.
+ cogit AndCq: objectMemory wordSize / 4 - 1 R: formatReg.
+ cogit SubR: formatReg R: ClassReg.
+ cogit CmpR: Arg1Reg R: ClassReg.
+ jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
+ cogit AddCq: objectMemory baseHeaderSize >> (objectMemory shiftForWord - 1) R: Arg1Reg.
+ cogit MoveX32r: Arg1Reg R: ReceiverResultReg R: TempReg.
+ jumpWordTooBig := self jumpNotCharacterUnsignedValueInRegister: TempReg.
+ cogit MoveR: TempReg R: ReceiverResultReg.
+ jumpWordsDone := cogit Jump: 0.
+
jumpIsBytes jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg).
+ cogit AndCq: objectMemory wordSize - 1 R: formatReg.
+ cogit SubR: formatReg R: ClassReg.
+ cogit CmpR: Arg1Reg R: ClassReg.
- cogit AndCq: objectMemory wordSize - 1 R: formatReg.
- cogit SubR: formatReg R: ClassReg;
- CmpR: Arg1Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize R: Arg1Reg.
cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
cogit backEnd byteReadsZeroExtend ifFalse:
[cogit AndCq: 255 R: ReceiverResultReg].
+ jumpWordsDone jmpTarget: (done := cogit Label).
- done := cogit Label.
self genConvertIntegerToCharacterInReg: ReceiverResultReg.
cogit genPrimReturn.
jumpIsShorts jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg).
+ cogit AndCq: objectMemory wordSize / 2 - 1 R: formatReg.
+ cogit SubR: formatReg R: ClassReg.
+ cogit CmpR: Arg1Reg R: ClassReg.
- cogit AndCq: objectMemory wordSize / 2 - 1 R: formatReg.
- cogit SubR: formatReg R: ClassReg;
- CmpR: Arg1Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddR: Arg1Reg R: ReceiverResultReg.
cogit MoveM16: objectMemory baseHeaderSize r: ReceiverResultReg R: ReceiverResultReg.
cogit Jump: done.
- jumpIsWords jmpTarget:
- (cogit LogicalShiftLeftCq: objectMemory shiftForWord - 2 R: ClassReg).
- cogit AndCq: objectMemory wordSize / 4 - 1 R: formatReg.
- cogit SubR: formatReg R: ClassReg;
- CmpR: Arg1Reg R: ClassReg.
- jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
- cogit AddCq: objectMemory baseHeaderSize >> (objectMemory shiftForWord - 1) R: Arg1Reg.
- cogit MoveX32r: Arg1Reg R: ReceiverResultReg R: TempReg.
- jumpWordTooBig := self jumpNotCharacterUnsignedValueInRegister: TempReg.
- cogit MoveR: TempReg R: ReceiverResultReg.
- cogit Jump: done.
-
jumpWordTooBig jmpTarget:
+ (jumpBytesOutOfBounds jmpTarget:
- (cogit SubCq: objectMemory baseHeaderSize >> (objectMemory shiftForWord - 1) R: Arg1Reg).
-
- jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget:
(jumpNotIndexable jmpTarget:
+ (jumpBadIndex jmpTarget: cogit Label))))).
- (jumpBadIndex jmpTarget: cogit Label)))).
^CompletePrimitive!
Item was changed:
----- Method: CogObjectRepresentationFor64BitSpur>>genPrimitiveStringAtPut (in category 'primitive generators') -----
genPrimitiveStringAtPut
+ | formatReg jumpBadIndex jumpBadArg jumpImmutable
+ jumpIsBytes jumpIsShorts jumpNotString jumpIsCompiledMethod
- | formatReg jumpBadIndex jumpBadArg jumpShortsDone jumpWordsDone
jumpBytesOutOfRange jumpShortsOutOfRange jumpWordsOutOfRange
- jumpIsBytes jumpIsShorts jumpNotString jumpIsCompiledMethod jumpImmutable
jumpBytesOutOfBounds jumpWordsOutOfBounds jumpShortsOutOfBounds |
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #jumpBadArg type: #'AbstractInstruction *'>
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
- <var: #jumpShortsDone type: #'AbstractInstruction *'>
- <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfRange type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfRange type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfRange type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
cogit genLoadArgAtDepth: 1 into: Arg0Reg.
cogit genLoadArgAtDepth: 0 into: Arg1Reg.
jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
jumpBadArg := self genJumpNotCharacter: Arg1Reg scratchReg: TempReg.
self genConvertSmallIntegerToIntegerInReg: Arg0Reg.
cogit SubCq: 1 R: Arg0Reg. "1-rel => 0-rel"
"formatReg := self formatOf: ReceiverResultReg"
self cppIf: IMMUTABILITY
ifTrue:
[ self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: TempReg.
jumpImmutable := self genJumpBaseHeaderImmutable: TempReg ]
ifFalse:
[ self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: NoReg ].
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format; words and/or bytes.
0 to 8 = pointer objects, forwarders, reserved.
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
+ jumpNotString := cogit JumpBelow: 0.
- jumpNotString := cogit JumpBelowOrEqual: 0.
cogit CmpCq: objectMemory firstCompiledMethodFormat R: formatReg.
jumpIsCompiledMethod := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
+ jumpIsBytes := cogit JumpAboveOrEqual: 0.
- jumpIsBytes := cogit JumpGreaterOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
+ jumpIsShorts := cogit JumpAboveOrEqual: 0.
- jumpIsShorts := cogit JumpGreaterOrEqual: 0.
+ "fall through to double words"
cogit CmpCq: (objectMemory characterObjectOf: 1 << self numCharacterBits - 1) R: Arg1Reg.
+ jumpWordsOutOfRange := cogit JumpAbove: 0.
- jumpWordsOutOfRange := cogit JumpAbove: Arg1Reg.
cogit LogicalShiftLeftCq: objectMemory shiftForWord - 2 R: ClassReg.
cogit AndCq: objectMemory wordSize / 4 - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg.
cogit CmpR: Arg0Reg R: ClassReg.
jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertSmallIntegerToIntegerInReg: TempReg.
cogit AddCq: objectMemory baseHeaderSize >> (objectMemory shiftForWord - 1) R: Arg0Reg.
cogit MoveR: TempReg X32r: Arg0Reg R: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpWordsDone := cogit Jump: 0.
jumpIsShorts jmpTarget:
(cogit CmpCq: (objectMemory characterObjectOf: 65535) R: Arg1Reg).
jumpShortsOutOfRange := cogit JumpAbove: 0.
cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg.
cogit AndCq: objectMemory wordSize / 2 - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg.
cogit CmpR: Arg0Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertSmallIntegerToIntegerInReg: TempReg.
cogit AddR: Arg0Reg R: ReceiverResultReg.
cogit MoveR: TempReg M16: objectMemory baseHeaderSize r: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpShortsDone := cogit Jump: 0.
jumpIsBytes jmpTarget:
(cogit CmpCq: (objectMemory characterObjectOf: 255) R: Arg1Reg).
jumpBytesOutOfRange := cogit JumpAbove: 0.
cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg.
cogit AndCq: objectMemory wordSize - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg.
cogit CmpR: Arg0Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit MoveR: Arg1Reg R: TempReg.
self genConvertCharacterToCodeInReg: TempReg.
cogit AddCq: objectMemory baseHeaderSize R: Arg0Reg.
cogit MoveR: TempReg Xbr: Arg0Reg R: ReceiverResultReg.
cogit MoveR: Arg1Reg R: ReceiverResultReg.
+ cogit genPrimReturn.
- jumpWordsDone jmpTarget:
- (jumpShortsDone jmpTarget: cogit genPrimReturn).
-
jumpNotString jmpTarget:
(jumpBytesOutOfRange jmpTarget:
(jumpShortsOutOfRange jmpTarget:
(jumpWordsOutOfRange jmpTarget:
(jumpIsCompiledMethod jmpTarget:
(jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget: cogit Label))))))).
self cppIf: IMMUTABILITY
ifTrue: [jumpImmutable jmpTarget: jumpNotString getJmpTarget].
cogit AddCq: 1 R: Arg0Reg. "0-rel => 1-rel"
self genConvertIntegerToSmallIntegerInReg: Arg0Reg.
jumpBadArg jmpTarget:
(jumpBadIndex jmpTarget: cogit Label).
^CompletePrimitive!
Item was changed:
----- Method: StackInterpreter>>followForwardedFrameContents:stackPointer: (in category 'lazy become') -----
followForwardedFrameContents: theFP stackPointer: theSP
"follow pointers in the current stack frame up to theSP."
<var: #theFP type: #'char *'>
<var: #theSP type: #'char *'>
<inline: false>
| oop |
<var: #ptr type: #'char *'>
theSP
to: (self frameReceiverLocation: theFP)
by: objectMemory wordSize
do: [:ptr|
oop := stackPages longAt: ptr.
((objectMemory isNonImmediate: oop)
and: [objectMemory isForwarded: oop]) ifTrue:
[stackPages longAt: ptr put: (objectMemory followForwarded: oop)]].
theFP + FoxCallerSavedIP + objectMemory wordSize
to: theFP + (self frameStackedReceiverOffset: theFP)
by: objectMemory wordSize
do: [:ptr|
oop := stackPages longAt: ptr.
((objectMemory isNonImmediate: oop)
and: [objectMemory isForwarded: oop]) ifTrue:
[oop := objectMemory followForwarded: oop.
stackPages longAt: ptr put: oop]].
"If we're in a block then also follow fields in the stacked closure as it may be activated again."
(self frameIsBlockActivation: theFP) ifTrue:
[self assert: oop = (stackPages longAt: theFP + (self frameStackedReceiverOffset: theFP)).
+ objectMemory followForwardedObjectFields: oop toDepth: 0].
- self followForwardedObjectFields: oop toDepth: 0].
self assert: (objectMemory isForwarded: (self frameMethodObject: theFP)) not.
(self frameHasContext: theFP) ifTrue:
[self assert: (objectMemory isForwarded: (self frameContext: theFP)) not]!
More information about the Vm-dev
mailing list