[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