[Vm-dev] VM Maker: VMMaker.oscog-eem.637.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Mar 10 23:54:36 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.637.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.637
Author: eem
Time: 10 March 2014, 4:51:23.09 pm
UUID: 313e51e8-63ef-40f1-a824-c26eaa2b39b7
Ancestors: VMMaker.oscog-eem.636
Fix genSmallIntegerComparison:orDoubleComparison: (which lies
behind SmallInteger>>#= primitive 6) for Spur which has
immediate Characters.
=============== Diff against VMMaker.oscog-eem.636 ===============
Item was changed:
----- Method: SimpleStackBasedCogit>>genSmallIntegerComparison:orDoubleComparison: (in category 'primitive generators') -----
genSmallIntegerComparison: jumpOpcode orDoubleComparison: jumpFPOpcodeGenerator
"Stack looks like
receiver (also in ResultReceiverReg)
arg
return address"
+ | jumpDouble jumpNonInt jumpFail jumpTrue jumpCond |
- | jumpDouble jumpFail jumpTrue jumpCond |
<var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction *(*jumpFPOpcodeGenerator)(void *)'>
<var: #jumpDouble type: #'AbstractInstruction *'>
+ <var: #jumpNonInt type: #'AbstractInstruction *'>
+ <var: #jumpCond type: #'AbstractInstruction *'>
- <var: #jumpFail type: #'AbstractInstruction *'>
<var: #jumpTrue type: #'AbstractInstruction *'>
+ <var: #jumpFail type: #'AbstractInstruction *'>
- <var: #jumpCond type: #'AbstractInstruction *'>
self MoveMw: BytesPerWord r: SPReg R: TempReg.
self MoveR: TempReg R: ClassReg.
jumpDouble := objectRepresentation genJumpNotSmallIntegerInScratchReg: TempReg.
self CmpR: ClassReg R: ReceiverResultReg. "N.B. FLAGS := RRReg - ClassReg"
jumpTrue := self gen: jumpOpcode.
self annotate: (self MoveCw: objectMemory falseObject R: ReceiverResultReg)
objRef: objectMemory falseObject.
self flag: 'currently caller pushes result'.
self RetN: BytesPerWord * 2.
jumpTrue jmpTarget: (self annotate: (self MoveCw: objectMemory trueObject R: ReceiverResultReg)
objRef: objectMemory trueObject).
self RetN: BytesPerWord * 2.
"Argument may be a Float : let us check or fail"
jumpDouble jmpTarget: self Label.
+ objectRepresentation smallIntegerIsOnlyImmediateType ifFalse:
+ [self MoveR: ClassReg R: TempReg.
+ jumpNonInt := objectRepresentation genJumpImmediateInScratchReg: TempReg].
objectRepresentation genGetCompactClassIndexNonImmOf: ClassReg into: SendNumArgsReg.
self CmpCq: objectMemory classFloatCompactIndex R: SendNumArgsReg.
jumpFail := self JumpNonZero: 0.
+
-
"It was a Float, so convert the receiver to double and perform the operation"
self MoveR: ReceiverResultReg R: TempReg.
objectRepresentation genConvertSmallIntegerToIntegerInReg: TempReg.
self ConvertR: TempReg Rd: DPFPReg0.
objectRepresentation genGetDoubleValueOf: ClassReg into: DPFPReg1.
self CmpRd: DPFPReg1 Rd: DPFPReg0.
jumpCond := self perform: jumpFPOpcodeGenerator with: 0. "FP jumps are a little weird"
self annotate: (self MoveCw: objectMemory falseObject R: ReceiverResultReg)
objRef: objectMemory falseObject.
self flag: 'currently caller pushes result'.
self RetN: BytesPerWord * 2.
jumpCond jmpTarget: (self annotate: (self MoveCw: objectMemory trueObject R: ReceiverResultReg)
objRef: objectMemory trueObject).
self RetN: BytesPerWord * 2.
+ objectRepresentation smallIntegerIsOnlyImmediateType
+ ifTrue: [jumpFail jmpTarget: self Label]
+ ifFalse: [jumpNonInt jmpTarget: (jumpFail jmpTarget: self Label)].
- jumpFail jmpTarget: self Label.
^0!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genSmallIntegerComparison:orDoubleComparison: (in category 'primitive generators') -----
genSmallIntegerComparison: jumpOpcode orDoubleComparison: jumpFPOpcodeGenerator
"Stack looks like
return address"
+ | jumpDouble jumpNonInt jumpFail jumpTrue jumpCond |
- | jumpDouble jumpFail jumpTrue jumpCond |
<var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction *(*jumpFPOpcodeGenerator)(void *)'>
<var: #jumpDouble type: #'AbstractInstruction *'>
+ <var: #jumpNonInt type: #'AbstractInstruction *'>
+ <var: #jumpCond type: #'AbstractInstruction *'>
- <var: #jumpFail type: #'AbstractInstruction *'>
<var: #jumpTrue type: #'AbstractInstruction *'>
+ <var: #jumpFail type: #'AbstractInstruction *'>
- <var: #jumpCond type: #'AbstractInstruction *'>
self MoveR: Arg0Reg R: TempReg.
jumpDouble := objectRepresentation genJumpNotSmallIntegerInScratchReg: TempReg.
self CmpR: Arg0Reg R: ReceiverResultReg. "N.B. FLAGS := RRReg - Arg0Reg"
jumpTrue := self gen: jumpOpcode.
self annotate: (self MoveCw: objectMemory falseObject R: ReceiverResultReg)
objRef: objectMemory falseObject.
self RetN: 0.
jumpTrue jmpTarget: (self annotate: (self MoveCw: objectMemory trueObject R: ReceiverResultReg)
objRef: objectMemory trueObject).
self RetN: 0.
"Argument may be a Float : let us check or fail"
jumpDouble jmpTarget: self Label.
+ objectRepresentation smallIntegerIsOnlyImmediateType ifFalse:
+ [self MoveR: ClassReg R: TempReg.
+ jumpNonInt := objectRepresentation genJumpImmediateInScratchReg: TempReg].
objectRepresentation genGetCompactClassIndexNonImmOf: Arg0Reg into: SendNumArgsReg.
self CmpCq: objectMemory classFloatCompactIndex R: SendNumArgsReg.
jumpFail := self JumpNonZero: 0.
+
-
"It was a Float, so convert the receiver to double and perform the operation"
objectRepresentation genConvertSmallIntegerToIntegerInReg: ReceiverResultReg.
self ConvertR: ReceiverResultReg Rd: DPFPReg0.
objectRepresentation genGetDoubleValueOf: Arg0Reg into: DPFPReg1.
self CmpRd: DPFPReg1 Rd: DPFPReg0.
jumpCond := self perform: jumpFPOpcodeGenerator with: 0. "FP jumps are a little weird"
self annotate: (self MoveCw: objectMemory falseObject R: ReceiverResultReg)
objRef: objectMemory falseObject.
self RetN: 0.
jumpCond jmpTarget: (self annotate: (self MoveCw: objectMemory trueObject R: ReceiverResultReg)
objRef: objectMemory trueObject).
self RetN: 0.
+
+ objectRepresentation smallIntegerIsOnlyImmediateType
+ ifTrue: [jumpFail jmpTarget: self Label]
+ ifFalse: [jumpNonInt jmpTarget: (jumpFail jmpTarget: self Label)].
- jumpFail jmpTarget: self Label.
^0!
More information about the Vm-dev
mailing list