[Vm-dev] VM Maker: VMMaker.oscog-eem.806.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jul 7 13:14:06 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.806.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.806
Author: eem
Time: 7 July 2014, 6:11:24.633 am
UUID: 30171e00-68a3-43a3-bd72-fdb9494f9cb7
Ancestors: VMMaker.oscog-eem.805
Make genSmallIntegerComparison:orDoubleComparison:
observe hasDoublePrecisionFloatingPointSupport (for ARM).
=============== Diff against VMMaker.oscog-eem.805 ===============
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 |
<var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction *(*jumpFPOpcodeGenerator)(void *)'>
<var: #jumpDouble type: #'AbstractInstruction *'>
<var: #jumpNonInt type: #'AbstractInstruction *'>
<var: #jumpCond type: #'AbstractInstruction *'>
<var: #jumpTrue type: #'AbstractInstruction *'>
<var: #jumpFail type: #'AbstractInstruction *'>
+ backEnd hasDoublePrecisionFloatingPointSupport ifFalse:
+ [^self genSmallIntegerComparison: jumpOpcode].
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)].
^0!
More information about the Vm-dev
mailing list