[Vm-dev] VM Maker: VMMaker.oscog-tpr.1413.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jul 13 21:55:25 UTC 2015
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!
More information about the Vm-dev
mailing list