[Vm-dev] VM Maker: VMMaker.oscog-nice.2547.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Sep 4 19:31:21 UTC 2019


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2547.mcz

==================== Summary ====================

Name: VMMaker.oscog-nice.2547
Author: nice
Time: 31 August 2019, 2:02:51.22464 am
UUID: 66e4c466-c54c-4035-a7fa-6078386cbc66
Ancestors: VMMaker.oscog-nice.2546

Fix genPrimitiveHighBit

We must not modify ReceiverResultReg when we CompletePrimitive (in case of negative receiver).

Hence, like in WIN64, we must better use TempReg.

=============== Diff against VMMaker.oscog-nice.2546 ===============

Item was changed:
  ----- Method: CogObjectRepresentation>>genPrimitiveHighBit (in category 'primitive generators') -----
  genPrimitiveHighBit
+ 	"Implementation notes: there are two reasons to use TempReg
+ 	-1) if primitive fails, ReceiverResultReg must remain unchanged (we CompletePrimitive)
+ 	-2) CLZ/BSR only work on 64bits for registers R0-R7 on Intel X64. But Win64 uses R9
+ 	Normally, this should be backEnd dependent, but for now we have a single 64bits target..."
+ 	
  	| jumpNegativeReceiver |
  	<var: #jumpNegativeReceiver type: #'AbstractInstruction *'>
  	"remove excess tag bits from the receiver oop"
+ 	cogit MoveR: ReceiverResultReg R: TempReg.
  	self numSmallIntegerTagBits > 1
  		ifTrue:
+ 			[cogit OrCq: 1 << self numSmallIntegerTagBits - 1 R: TempReg.
+ 			cogit ArithmeticShiftRightCq: self numSmallIntegerTagBits - 1 R: TempReg].
- 			[cogit OrCq: 1 << self numSmallIntegerTagBits - 1 R: ReceiverResultReg.
- 			cogit ArithmeticShiftRightCq: self numSmallIntegerTagBits - 1 R: ReceiverResultReg].
  	"and use the abstract cogit facility for case of single tag-bit"
+ 	jumpNegativeReceiver := cogit genHighBitIn: TempReg ofSmallIntegerOopWithSingleTagBit: TempReg.
- 	jumpNegativeReceiver := cogit genHighBitIn: ReceiverResultReg ofSmallIntegerOopWithSingleTagBit: ReceiverResultReg.
  	"Jump is NULL if above operation is not implemented, else return the result"
  	jumpNegativeReceiver = 0
  		ifFalse:
+ 			[cogit MoveR: TempReg R: ReceiverResultReg.
+ 			cogit genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- 			[cogit genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
  			cogit genPrimReturn.
  			jumpNegativeReceiver jmpTarget: cogit Label].
  	^CompletePrimitive!

Item was removed:
- ----- Method: CogObjectRepresentation>>genPrimitiveHighBitgenPrimitiveHighBit (in category 'primitive generators') -----
- genPrimitiveHighBitgenPrimitiveHighBit
- 	| jumpNegativeReceiver |
- 	<var: #jumpNegativeReceiver type: #'AbstractInstruction *'>
- 	"remove excess tag bits from the receiver oop"
- 	self numSmallIntegerTagBits > 1
- 		ifTrue:
- 			[cogit OrCw: 1 << self numSmallIntegerTagBits - 1 R: ReceiverResultReg.
- 			cogit ArithmeticShiftRightCq: self numSmallIntegerTagBits - 1 R: ReceiverResultReg].
- 	"and use the abstract cogit facility for case of single tag-bit"
- 	jumpNegativeReceiver := cogit genHighBitIn: ReceiverResultReg ofSmallIntegerOopWithSingleTagBit: ReceiverResultReg.
- 	"The jump instruction is NULL when backend does not really has a jitted implementation: fallback to normal primitive"
- 	jumpNegativeReceiver = 0 ifTrue: [^CompletePrimitive].
- 	cogit genPrimReturn.
- 	jumpNegativeReceiver jmpTarget: cogit Label.
- 	^UnimplementedPrimitive!

Item was removed:
- ----- Method: CogObjectRepresentationFor64BitSpur>>genPrimitiveHighBit (in category 'primitive generators') -----
- genPrimitiveHighBit
- 	"Implementation notes: same as super, but CLZ/BSR only work on 64bits for registers R0-R7 on Intel X64.
- 	Normally, this should be backEnd dependent, but for now we have a single 64bits target..."
- 	| jumpNegativeReceiver reg |
- 	<var: #jumpNegativeReceiver type: #'AbstractInstruction *'>
- 	"remove excess tag bits from the receiver oop"
- 	
- 	ReceiverResultReg > 7
- 		ifTrue: [cogit MoveR: ReceiverResultReg R: (reg := TempReg)]
- 		ifFalse: [reg := ReceiverResultReg].
- 	self numSmallIntegerTagBits > 1
- 		ifTrue:
- 			[cogit OrCw: 1 << self numSmallIntegerTagBits - 1 R: reg.
- 			cogit ArithmeticShiftRightCq: self numSmallIntegerTagBits - 1 R: reg].
- 	"and use the abstract cogit facility for case of single tag-bit"
- 	jumpNegativeReceiver := cogit genHighBitIn: reg ofSmallIntegerOopWithSingleTagBit: reg.
- 	"Jump is NULL if above operation is not implemented, else return the result"
- 	jumpNegativeReceiver = 0
- 		ifFalse:
- 			[ReceiverResultReg > 7
- 				ifTrue: [cogit MoveR: reg R: ReceiverResultReg].
- 			cogit genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- 			cogit genPrimReturn.
- 			jumpNegativeReceiver jmpTarget: cogit Label].
- 	^CompletePrimitive!



More information about the Vm-dev mailing list