tim Rowledge uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-tpr.1413.mcz
==================== Summary ====================
Name: VMMaker.oscog-tpr.1413 Author: tpr Time: 13 July 2015, 2:54:04.432 pm UUID: 3dc53b94-e67c-42b2-aecb-ca3e226316a1 Ancestors: VMMaker.oscog-tpr.1412, VMMaker.oscog-eem.1412
Calls to ARM __aeabi_idivmod now work; Possibly messed up merge with VMMaker.oscog-eem.1412 may make this go awry; let's see.
=============== Diff against VMMaker.oscog-tpr.1412 ===============
Item was changed: ----- Method: CogARMCompiler>>aeabiDivModFunctionAddr (in category 'ARM convenience instructions') ----- aeabiDivModFunctionAddr "return the address of the __aeabi_idivmod() call provided by the ARM low level libs to do an integer divide that returns the quo in R0 and rem in R1" + <returnTypeC: #usqInt> - <var: #'__aeabi_idivmod' declareC: 'extern void __aeabi_idivmod(int dividend, ind divisor)'> ^self cCode: '(usqInt)__aeabi_idivmod' inSmalltalk:[#aeabiDiv:Mod:]!
Item was removed: - ----- Method: CogARMCompiler>>initialize (in category 'generate machine code') ----- - initialize - "This method intializes the Smalltalk instance. The C instance is merely a struct and doesn't need initialization." - <doNotGenerate> - operands := CArrayAccessor on: (Array new: NumOperands). - machineCode := CArrayAccessor on: (Array new: self machineCodeWords)!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPrimitiveDiv (in category 'primitive generators') ----- genPrimitiveDiv | jumpNotSI jumpZero jumpExact jumpSameSign convert | - "this is for primitive 12" <var: #convert type: #'AbstractInstruction *'> <var: #jumpZero type: #'AbstractInstruction *'> <var: #jumpNotSI type: #'AbstractInstruction *'> <var: #jumpExact type: #'AbstractInstruction *'> <var: #jumpSameSign type: #'AbstractInstruction *'> self MoveR: Arg0Reg R: ClassReg. self MoveR: Arg0Reg R: Arg1Reg. jumpNotSI := objectRepresentation genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg. "We must shift away the tags, not just subtract them, so that the overflow case doesn't actually overflow the machine instruction." objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: ClassReg. (self lastOpcode setsConditionCodesFor: JumpZero) ifFalse: [self CmpCq: 0 R: ClassReg]. jumpZero := self JumpZero: 0. self MoveR: ReceiverResultReg R: TempReg. objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: TempReg. self DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg. "If remainder is zero we must check for overflow." self CmpCq: 0 R: ClassReg. jumpExact := self JumpZero: 0. "If arg and remainder signs are different we must round down." self XorR: ClassReg R: Arg1Reg. (self lastOpcode setsConditionCodesFor: JumpZero) ifFalse: [self CmpCq: 0 R: Arg1Reg]. jumpSameSign := self JumpGreaterOrEqual: 0. self SubCq: 1 R: TempReg. jumpSameSign jmpTarget: (convert := self Label). objectRepresentation genConvertIntegerToSmallIntegerInReg: TempReg. self MoveR: TempReg R: ReceiverResultReg. self RetN: 0. "test for overflow; the only case is SmallInteger minVal // -1" jumpExact jmpTarget: (self CmpCq: (1 << (objectRepresentation numSmallIntegerBits - 1)) R: TempReg). self JumpLess: convert. jumpZero jmpTarget: (jumpNotSI jmpTarget: self Label). ^0!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPrimitiveDivide (in category 'primitive generators') ----- genPrimitiveDivide | jumpNotSI jumpZero jumpInexact jumpOverflow | - "this is for primitive 10" <var: #jumpNotSI type: #'AbstractInstruction *'> <var: #jumpZero type: #'AbstractInstruction *'> <var: #jumpInexact type: #'AbstractInstruction *'> <var: #jumpOverflow type: #'AbstractInstruction *'> self MoveR: Arg0Reg R: ClassReg. jumpNotSI := objectRepresentation genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg. "We must shift away the tags, not just subtract them, so that the overflow case doesn't actually overflow the machine instruction." objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: ClassReg. jumpZero := self JumpZero: 0. self MoveR: ReceiverResultReg R: TempReg. objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: TempReg. self DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg. "If remainder is non-zero fail." self CmpCq: 0 R: ClassReg. jumpInexact := self JumpNonZero: 0. "test for overflow; the only case is SmallInteger minVal / -1" self CmpCq: (1 << (objectRepresentation numSmallIntegerBits - 1)) R: TempReg. jumpOverflow := self JumpGreaterOrEqual: 0. objectRepresentation genConvertIntegerToSmallIntegerInReg: TempReg. self MoveR: TempReg R: ReceiverResultReg. self RetN: 0. jumpOverflow jmpTarget: (jumpInexact jmpTarget: (jumpZero jmpTarget: (jumpNotSI jmpTarget: self Label))). ^0!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPrimitiveMod (in category 'primitive generators') ----- genPrimitiveMod | jumpNotSI jumpZero jumpExact jumpSameSign | - "this is for primitive 11" <var: #jumpNotSI type: #'AbstractInstruction *'> <var: #jumpZero type: #'AbstractInstruction *'> <var: #jumpExact type: #'AbstractInstruction *'> <var: #jumpSameSign type: #'AbstractInstruction *'> self MoveR: Arg0Reg R: ClassReg. jumpNotSI := objectRepresentation genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg. objectRepresentation genRemoveSmallIntegerTagsInScratchReg: ClassReg. jumpZero := self JumpZero: 0. self MoveR: ClassReg R: Arg1Reg. self MoveR: ReceiverResultReg R: TempReg. objectRepresentation genRemoveSmallIntegerTagsInScratchReg: TempReg. self DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg. "If remainder is zero we're done." self CmpCq: 0 R: ClassReg. jumpExact := self JumpZero: 0. "If arg and remainder signs are different we must reflect around zero." self XorR: ClassReg R: Arg1Reg. (self lastOpcode setsConditionCodesFor: JumpZero) ifFalse: [self CmpCq: 0 R: Arg1Reg]. jumpSameSign := self JumpGreaterOrEqual: 0. self XorR: ClassReg R: Arg1Reg. self AddR: Arg1Reg R: ClassReg. jumpSameSign jmpTarget: (jumpExact jmpTarget: self Label). objectRepresentation genSetSmallIntegerTagsIn: ClassReg. self MoveR: ClassReg R: ReceiverResultReg. self RetN: 0. jumpZero jmpTarget: (jumpNotSI jmpTarget: self Label). ^0!
Item was changed: ----- Method: StackToRegisterMappingCogit>>genPrimitiveQuo (in category 'primitive generators') ----- genPrimitiveQuo | jumpNotSI jumpZero jumpOverflow | - "this is for primitive 13" <var: #jumpNotSI type: #'AbstractInstruction *'> <var: #jumpZero type: #'AbstractInstruction *'> <var: #jumpOverflow type: #'AbstractInstruction *'> self MoveR: Arg0Reg R: ClassReg. jumpNotSI := objectRepresentation genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg. "We must shift away the tags, not just subtract them, so that the overflow case doesn't actually overflow the machine instruction." objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: ClassReg. (self lastOpcode setsConditionCodesFor: JumpZero) ifFalse: [self CmpCq: 0 R: ClassReg]. jumpZero := self JumpZero: 0. self MoveR: ReceiverResultReg R: TempReg. objectRepresentation genShiftAwaySmallIntegerTagsInScratchReg: TempReg. self DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg. "test for overflow; the only case is SmallInteger minVal quo: -1" self CmpCq: (1 << (objectRepresentation numSmallIntegerBits - 1)) R: TempReg. jumpOverflow := self JumpGreaterOrEqual: 0. objectRepresentation genConvertIntegerToSmallIntegerInReg: TempReg. self MoveR: TempReg R: ReceiverResultReg. self RetN: 0. jumpOverflow jmpTarget: (jumpZero jmpTarget: (jumpNotSI jmpTarget: self Label)). ^0!
vm-dev@lists.squeakfoundation.org