Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2658.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2658 Author: eem Time: 9 January 2020, 9:55:28.591616 pm UUID: b536e0cb-6717-41f5-886d-9e11b5bb3e19 Ancestors: VMMaker.oscog-eem.2657 Cogit: Fix a few Slang complaints. =============== Diff against VMMaker.oscog-eem.2657 =============== Item was changed: ----- Method: CogObjectRepresentation>>genSmallIntegerComparison:orDoubleComparison:invert: (in category 'primitive generators') ----- genSmallIntegerComparison: jumpOpcode orDoubleComparison: jumpFPOpcodeGenerator invert: invertComparison "Stack looks like return address" | jumpNonInt jumpFail jumpCond r | <var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction * NoDbgRegParms (*jumpFPOpcodeGenerator)(void *)'> - <var: #jumpNonInt type: #'AbstractInstruction *'> - <var: #jumpCond type: #'AbstractInstruction *'> - <var: #jumpFail type: #'AbstractInstruction *'> r := self genSmallIntegerComparison: jumpOpcode. r < 0 ifTrue: [^r]. self cppIf: #DPFPReg0 defined ifTrue: "Fall through on non-SmallInteger argument. Argument may be a Float : let us check or fail" [self smallIntegerIsOnlyImmediateType ifFalse: [jumpNonInt := self genJumpImmediate: Arg0Reg]. self genGetCompactClassIndexNonImmOf: Arg0Reg into: SendNumArgsReg. self genCmpClassFloatCompactIndexR: SendNumArgsReg. jumpFail := cogit JumpNonZero: 0. "It was a Float, so convert the receiver to double and perform the operation" self genConvertSmallIntegerToIntegerInReg: ReceiverResultReg. cogit ConvertR: ReceiverResultReg Rd: DPFPReg0. self genGetDoubleValueOf: Arg0Reg into: DPFPReg1. invertComparison "May need to invert for NaNs" ifTrue: [cogit CmpRd: DPFPReg0 Rd: DPFPReg1] ifFalse: [cogit CmpRd: DPFPReg1 Rd: DPFPReg0]. jumpCond := cogit perform: jumpFPOpcodeGenerator with: 0. "FP jumps are a little weird" cogit genMoveFalseR: ReceiverResultReg. cogit genPrimReturn. jumpCond jmpTarget: (cogit genMoveTrueR: ReceiverResultReg). cogit genPrimReturn. self smallIntegerIsOnlyImmediateType ifTrue: [jumpFail jmpTarget: cogit Label] ifFalse: [jumpNonInt jmpTarget: (jumpFail jmpTarget: cogit Label)]]. ^CompletePrimitive! Item was changed: ----- Method: CogObjectRepresentationFor64BitSpur>>genSmallIntegerComparison:orDoubleComparison:invert: (in category 'primitive generators') ----- genSmallIntegerComparison: jumpOpcode orDoubleComparison: jumpFPOpcodeGenerator invert: invertComparison "Stack looks like return address" | jumpCond r compareIntFloat jumpAmbiguous jumpNotBoxedFloat jumpNotFloatAtAll jumpNotSmallFloat jumpTrue returnTrue | <var: #jumpFPOpcodeGenerator declareC: 'AbstractInstruction * NoDbgRegParms (*jumpFPOpcodeGenerator)(void *)'> - <var: #jumpNonInt type: #'AbstractInstruction *'> - <var: #jumpCond type: #'AbstractInstruction *'> - <var: #jumpTrue type: #'AbstractInstruction *'> - <var: #returnTrue type: #'AbstractInstruction *'> - <var: #jumpAmbiguous type: #'AbstractInstruction *'> - <var: #jumpNotBoxedFloat type: #'AbstractInstruction *'> - <var: #jumpNotSmallFloat type: #'AbstractInstruction *'> - <var: #jumpNotFloatAtAll type: #'AbstractInstruction *'> - <var: #compareIntFloat type: #'AbstractInstruction *'> r := self genSmallIntegerComparison: jumpOpcode. r < 0 ifTrue: [^r]. self cppIf: #DPFPReg0 defined ifTrue: "Fall through on non-SmallInteger argument. Argument may be a Float : let us check or fail" [ "check for Small Float argument" jumpNotSmallFloat := self genJumpNotSmallFloat: Arg0Reg. self genGetSmallFloatValueOf: Arg0Reg scratch: TempReg into: DPFPReg1. "Case of (int compare: float). Test for ambiguity, that is when (double) intRcvr == floatArg" compareIntFloat := cogit Label. self genConvertSmallIntegerToIntegerInReg: ReceiverResultReg. cogit ConvertR: ReceiverResultReg Rd: DPFPReg0. cogit CmpRd: DPFPReg0 Rd: DPFPReg1. jumpAmbiguous := cogit perform: #JumpFPEqual: with: 0. "Case of non ambiguity, use compareFloat((double) intRcvr,floatArg)" invertComparison "May need to invert for NaNs" ifTrue: [cogit CmpRd: DPFPReg0 Rd: DPFPReg1] ifFalse: [cogit CmpRd: DPFPReg1 Rd: DPFPReg0]. jumpCond := cogit perform: jumpFPOpcodeGenerator with: 0. "FP jumps are a little weird" cogit genMoveFalseR: ReceiverResultReg. cogit genPrimReturn. jumpCond jmpTarget: (returnTrue := cogit genMoveTrueR: ReceiverResultReg). cogit genPrimReturn. "Case of ambiguity, use compareInt(intRcvr , (int64) floatArg)" jumpAmbiguous jmpTarget: (cogit ConvertRd: DPFPReg1 R: Arg0Reg). cogit CmpR: Arg0Reg R: ReceiverResultReg. "N.B. FLAGS := RRReg - Arg0Reg" jumpTrue := cogit genConditionalBranch: jumpOpcode operand: 0. cogit genMoveFalseR: ReceiverResultReg. cogit genPrimReturn. jumpTrue jmpTarget: returnTrue. "not a Small Float, check for Boxed Float argument" jumpNotSmallFloat jmpTarget:cogit Label. jumpNotFloatAtAll := self genJumpImmediate: Arg0Reg. self genGetCompactClassIndexNonImmOf: Arg0Reg into: SendNumArgsReg. self genCmpClassFloatCompactIndexR: SendNumArgsReg. jumpNotBoxedFloat := cogit JumpNonZero: 0. "It was a Boxed Float, so convert the receiver to double and perform the (int compare: float) operation" self genGetDoubleValueOf: Arg0Reg into: DPFPReg1. cogit Jump: compareIntFloat. "not a Float, just let the primitive fall thru failure" jumpNotBoxedFloat jmpTarget: (jumpNotFloatAtAll jmpTarget: cogit Label)]. ^CompletePrimitive! |
Free forum by Nabble | Edit this page |