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

commits at source.squeak.org commits at source.squeak.org
Sat Apr 16 22:00:02 UTC 2016


Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1811.mcz

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

Name: VMMaker.oscog-nice.1811
Author: nice
Time: 16 April 2016, 11:56:26.526 pm
UUID: 71c9a6ca-9f1c-4def-90c8-37f8954f87d7
Ancestors: VMMaker.oscog-cb.1810

Demonstrate how faster could a LargeIntegersPlugin primitive be if only it would not resort to naive (interpreterProxy is: oop KindOf: #Integer).
Up to twice faster.

=============== Diff against VMMaker.oscog-cb.1810 ===============

Item was added:
+ ----- Method: LargeIntegersPlugin>>isLargeIntegerOop: (in category 'util') -----
+ isLargeIntegerOop: oop
+ 	| oopClass |
+ 	oopClass := interpreterProxy fetchClassOf: oop.
+ 	^oopClass == interpreterProxy classLargeNegativeInteger or: [oopClass == interpreterProxy classLargePositiveInteger]!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitCompare: (in category 'Integer primitives') -----
  primDigitCompare: secondInteger 
+ 	| firstVal secondVal firstInteger firstIsSmall secondIsSmall |
- 	| firstVal secondVal firstInteger |
  	self debugCode: [self msg: 'primDigitCompare: secondInteger'].
+ 	firstInteger := self primitive: 'primDigitCompare'.
- 	firstInteger := self
- 				primitive: 'primDigitCompare'
- 				parameters: #(#Integer )
- 				receiver: #Integer.
  	"shortcut: aSmallInteger has to be smaller in Magnitude as aLargeInteger"
+ 	firstIsSmall := interpreterProxy isIntegerObject: firstInteger.
+ 	secondIsSmall := interpreterProxy isIntegerObject: secondInteger.
+ 	firstIsSmall ifFalse: [(self isLargeIntegerOop: firstInteger) ifFalse: [^self primitiveFail]].
+ 	secondIsSmall ifFalse: [(self isLargeIntegerOop: secondInteger) ifFalse: [^self primitiveFail]].
+ 	firstIsSmall
+ 		ifTrue: 
+ 			[secondIsSmall
+ 				ifTrue: 
+ 					[(firstVal := interpreterProxy integerValueOf: firstInteger) > (secondVal := interpreterProxy integerValueOf: secondInteger)
- 	(interpreterProxy isIntegerObject: firstInteger)
- 		ifTrue: ["first"
- 			(interpreterProxy isIntegerObject: secondInteger)
- 				ifTrue: ["second"
- 					(firstVal := interpreterProxy integerValueOf: firstInteger) > (secondVal := interpreterProxy integerValueOf: secondInteger)
  						ifTrue: [^ 1 asOop: SmallInteger"first > second"]
  						ifFalse: [firstVal < secondVal
  								ifTrue: [^ -1 asOop: SmallInteger"first < second"]
  								ifFalse: [^ 0 asOop: SmallInteger"first = second"]]]
+ 				ifFalse: 
+ 					[^ -1 asOop: SmallInteger"first < SECOND"]]
+ 		ifFalse: 
+ 			[secondIsSmall
+ 				ifTrue: 
+ 					[^ 1 asOop: SmallInteger"FIRST > second"]
+ 				ifFalse: 
+ 					[^ self digitCompareLarge: firstInteger with: secondInteger]]!
- 				ifFalse: ["SECOND"
- 					^ -1 asOop: SmallInteger"first < SECOND"]]
- 		ifFalse: ["FIRST"
- 			(interpreterProxy isIntegerObject: secondInteger)
- 				ifTrue: ["second"
- 					^ 1 asOop: SmallInteger"FIRST > second"]
- 				ifFalse: ["SECOND"
- 					^ self digitCompareLarge: firstInteger with: secondInteger]]!



More information about the Vm-dev mailing list