Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.533.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.533 Author: eem Time: 4 December 2013, 7:43:03.331 pm UUID: 596ae385-70cc-4593-98e9-244920c6d7d2 Ancestors: VMMaker.oscog-eem.532 it runs. Fix bounds checking in CogObjectRepresentationFor32BitSpur>>genInnerPrimitiveAt:. Simplify primitiveShortAtPut (isWordsOrBytes: filters-out immediates anyway). Add shortAt:put: to the Spur simulators. =============== Diff against VMMaker.oscog-eem.532 =============== Item was changed: ----- Method: CogObjectRepresentationFor32BitSpur>>genInnerPrimitiveAt: (in category 'primitive generators') ----- genInnerPrimitiveAt: retNoffset "Implement the guts of primitiveAt; dispatch on size" | formatReg jumpNotIndexable jumpSmallSize jumpImmediate jumpBadIndex jumpBytesDone jumpShortsDone jumpWordsDone jumpFixedFieldsDone jumpIsBytes jumpIsShorts jumpIsWords jumpWordTooBig jumpIsArray jumpHasFixedFields jumpIsContext jumpBytesOutOfBounds jumpShortsOutOfBounds jumpWordsOutOfBounds jumpArrayOutOfBounds jumpFixedFieldsOutOfBounds | <inline: true> "c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:" <var: #jumpIsBytes type: #'AbstractInstruction *'> <var: #jumpIsShorts type: #'AbstractInstruction *'> <var: #jumpBadIndex type: #'AbstractInstruction *'> <var: #jumpSmallSize type: #'AbstractInstruction *'> <var: #jumpIsContext type: #'AbstractInstruction *'> <var: #jumpImmediate type: #'AbstractInstruction *'> <var: #jumpBytesDone type: #'AbstractInstruction *'> <var: #jumpShortsDone type: #'AbstractInstruction *'> <var: #jumpWordsDone type: #'AbstractInstruction *'> <var: #jumpWordTooBig type: #'AbstractInstruction *'> <var: #jumpNotIndexable type: #'AbstractInstruction *'> <var: #jumpHasFixedFields type: #'AbstractInstruction *'> <var: #jumpFixedFieldsDone type: #'AbstractInstruction *'> <var: #jumpArrayOutOfBounds type: #'AbstractInstruction *'> <var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'> <var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'> <var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'> <var: #jumpFixedFieldsOutOfBounds type: #'AbstractInstruction *'> cogit MoveR: ReceiverResultReg R: TempReg. jumpImmediate := self genJumpImmediateInScratchReg: TempReg. cogit MoveR: Arg0Reg R: TempReg. jumpBadIndex := self genJumpNotSmallIntegerInScratchReg: TempReg. self genConvertSmallIntegerToIntegerInScratchReg: Arg0Reg. cogit SubCq: 1 R: Arg0Reg. "1-rel => 0-rel" formatReg := SendNumArgsReg. cogit + MoveMw: 0 r: ReceiverResultReg R: formatReg; "formatReg := least significant half of self baseHeader: receiver" - MoveMw: 0 r: ReceiverResultReg R: formatReg; "formatReg := least significant half of self baseHeader: receiver" MoveR: formatReg R: TempReg; LogicalShiftRightCq: objectMemory formatShift R: formatReg; AndCq: objectMemory formatMask R: formatReg. "formatReg := self formatOfHeader: destReg" "get numSlots into ClassReg." cogit MoveCq: 0 R: ClassReg. "N.B. MoveMb:r:R: does not zero other bits" cogit MoveMb: 7 r: ReceiverResultReg R: ClassReg. "MSB of header" cogit CmpCq: objectMemory numSlotsMask R: ClassReg. jumpSmallSize := cogit JumpLess: 0. cogit MoveMw: -8 r: ReceiverResultReg R: ClassReg. "LSW of overflow size header" "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" jumpSmallSize jmpTarget: (cogit CmpCq: objectMemory firstByteFormat R: formatReg). jumpIsBytes := cogit JumpGreaterOrEqual: 0. cogit CmpCq: objectMemory arrayFormat R: formatReg. jumpIsArray := cogit JumpZero: 0. jumpNotIndexable := cogit JumpLess: 0. cogit CmpCq: objectMemory weakArrayFormat R: formatReg. jumpHasFixedFields := cogit JumpLessOrEqual: 0. cogit CmpCq: objectMemory firstShortFormat R: formatReg. jumpIsShorts := cogit JumpGreaterOrEqual: 0. cogit CmpCq: objectMemory firstLongFormat R: formatReg. jumpIsWords := cogit JumpGreaterOrEqual: 0. "For now ignore 64-bit indexability." jumpNotIndexable jmpTarget: cogit Label. jumpNotIndexable := cogit Jump: 0. jumpIsBytes jmpTarget: (cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg). cogit AndCq: objectMemory wordSize - 1 R: formatReg. cogit SubR: formatReg R: ClassReg; CmpR: Arg0Reg R: ClassReg. + jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0. - jumpBytesOutOfBounds := cogit JumpAboveOrEqual: 0. cogit AddCq: objectMemory baseHeaderSize R: Arg0Reg. cogit MoveXbr: Arg0Reg R: ReceiverResultReg R: ReceiverResultReg. self genConvertIntegerToSmallIntegerInScratchReg: ReceiverResultReg. jumpBytesDone := cogit Jump: 0. jumpIsShorts jmpTarget: (cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg). cogit AndCq: 1 R: formatReg. cogit SubR: formatReg R: ClassReg; CmpR: Arg0Reg R: ClassReg. + jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0. - jumpShortsOutOfBounds := cogit JumpAboveOrEqual: 0. cogit AddR: Arg0Reg R: ReceiverResultReg. cogit MoveM16: objectMemory baseHeaderSize r: ReceiverResultReg R: ReceiverResultReg. self genConvertIntegerToSmallIntegerInScratchReg: ReceiverResultReg. jumpShortsDone := cogit Jump: 0. jumpIsWords jmpTarget: (cogit CmpR: Arg0Reg R: ClassReg). + jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0. - jumpWordsOutOfBounds := cogit JumpAboveOrEqual: 0. cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg. cogit MoveXwr: Arg0Reg R: ReceiverResultReg R: TempReg. cogit SubCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg. jumpWordTooBig := self jumpNotSmallIntegerUnsignedValueInRegister: TempReg. cogit MoveR: TempReg R: ReceiverResultReg. self genConvertIntegerToSmallIntegerInScratchReg: ReceiverResultReg. jumpWordsDone := cogit Jump: 0. jumpHasFixedFields jmpTarget: (cogit AndCq: objectMemory classIndexMask R: TempReg). cogit CmpCq: ClassMethodContextCompactIndex R: TempReg. cogit MoveR: TempReg R: formatReg. cogit CmpCq: ClassMethodContextCompactIndex R: TempReg. jumpIsContext := cogit JumpZero: 0. cogit PushR: ClassReg. self genGetClassObjectOfClassIndex: formatReg into: ClassReg scratchReg: TempReg. self genLoadSlot: InstanceSpecificationIndex sourceReg: ClassReg destReg: formatReg. cogit PopR: ClassReg. self genConvertSmallIntegerToIntegerInScratchReg: formatReg. cogit AndCq: objectMemory fixedFieldsOfClassFormatMask R: formatReg; SubR: formatReg R: ClassReg; CmpR: Arg0Reg R: ClassReg. + jumpFixedFieldsOutOfBounds := cogit JumpBelowOrEqual: 0. - jumpFixedFieldsOutOfBounds := cogit JumpAboveOrEqual: 0. "index is (formatReg (fixed fields) + Arg0Reg (0-rel index)) * wordSize + baseHeaderSize" cogit AddR: formatReg R: Arg0Reg. cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg. cogit MoveXwr: Arg0Reg R: ReceiverResultReg R: ReceiverResultReg. jumpFixedFieldsDone := cogit Jump: 0. jumpIsArray jmpTarget: (cogit CmpR: Arg0Reg R: ClassReg). + jumpArrayOutOfBounds := cogit JumpBelowOrEqual: 0. - jumpArrayOutOfBounds := cogit JumpAboveOrEqual: 0. cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg. cogit MoveXwr: Arg0Reg R: ReceiverResultReg R: ReceiverResultReg. jumpFixedFieldsDone jmpTarget: (jumpWordsDone jmpTarget: (jumpShortsDone jmpTarget: (jumpBytesDone jmpTarget: (cogit RetN: retNoffset)))). jumpFixedFieldsOutOfBounds jmpTarget: (jumpArrayOutOfBounds jmpTarget: (jumpBytesOutOfBounds jmpTarget: (jumpShortsOutOfBounds jmpTarget: (jumpWordsOutOfBounds jmpTarget: (jumpWordTooBig jmpTarget: (jumpNotIndexable jmpTarget: (jumpIsContext jmpTarget: cogit Label))))))). cogit AddCq: 1 R: Arg0Reg. "0-rel => 1-rel" self genConvertIntegerToSmallIntegerInScratchReg: Arg0Reg. (jumpBadIndex jmpTarget: (jumpImmediate jmpTarget: cogit Label)). ^0! Item was changed: ----- Method: InterpreterPrimitives>>primitiveShortAtPut (in category 'sound primitives') ----- primitiveShortAtPut "Treat the receiver, which can be indexible by either bytes or words, as an array of signed 16-bit values. Set the contents of the given index to the given value. Note that the index specifies the i-th 16-bit entry, not the i-th byte or word." | index rcvr sz addr value | value := self stackIntegerValue: 0. index := self stackIntegerValue: 1. (self successful and: [(value >= -32768) and: [value <= 32767]]) ifFalse: [^self primitiveFailFor: PrimErrBadArgument]. rcvr := self stackValue: 2. + (objectMemory isWordsOrBytes: rcvr) ifFalse: - ((objectMemory isIntegerObject: rcvr) not and: [objectMemory isWordsOrBytes: rcvr]) ifFalse: [^self primitiveFailFor: PrimErrInappropriate]. sz := ((objectMemory sizeBitsOf: rcvr) - BaseHeaderSize) // 2. "number of 16-bit fields" (index >= 1 and: [index <= sz]) ifFalse: [^self primitiveFailFor: PrimErrBadIndex]. addr := rcvr + BaseHeaderSize + (2 * (index - 1)). objectMemory shortAt: addr put: value. self pop: 3 thenPush: (objectMemory integerObjectOf: value) "pop all; return value"! Item was added: + ----- Method: Spur32BitMMLECoSimulator>>shortAt:put: (in category 'memory access') ----- + shortAt: byteAddress put: a16BitValue + "Return the half-word at byteAddress which must be even." + | lowBits long longAddress | + lowBits := byteAddress bitAnd: 2. + lowBits = 0 + ifTrue: "storing into LS word" + [long := self longAt: byteAddress. + self longAt: byteAddress + put: ((long bitAnd: 16rFFFF0000) bitOr: a16BitValue)] + ifFalse: "storing into MS word" + [longAddress := byteAddress - 2. + long := self longAt: longAddress. + self longAt: longAddress + put: ((long bitAnd: 16rFFFF) bitOr: (a16BitValue bitShift: 16))]. + ^a16BitValue! Item was added: + ----- Method: Spur32BitMMLESimulator>>shortAt:put: (in category 'memory access') ----- + shortAt: byteAddress put: a16BitValue + "Return the half-word at byteAddress which must be even." + | lowBits long longAddress | + lowBits := byteAddress bitAnd: 2. + lowBits = 0 + ifTrue: "storing into LS word" + [long := self longAt: byteAddress. + self longAt: byteAddress + put: ((long bitAnd: 16rFFFF0000) bitOr: a16BitValue)] + ifFalse: "storing into MS word" + [longAddress := byteAddress - 2. + long := self longAt: longAddress. + self longAt: longAddress + put: ((long bitAnd: 16rFFFF) bitOr: (a16BitValue bitShift: 16))]. + ^a16BitValue! |
Free forum by Nabble | Edit this page |