[Vm-dev] VM Maker: VMMaker.oscog-nice.1812.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Apr 16 22:38:28 UTC 2016
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1812.mcz
==================== Summary ====================
Name: VMMaker.oscog-nice.1812
Author: nice
Time: 17 April 2016, 12:34:58.361 am
UUID: 7e94561e-6dca-48d9-99e6-206c528b632c
Ancestors: VMMaker.oscog-nice.1811
Revisit LargeIntegersPlugin and suppress the is:KindOf: way of testing if oops are kind of Integer.
The is for the benefit of primitive speed.
=============== Diff against VMMaker.oscog-nice.1811 ===============
Item was changed:
----- Method: LargeIntegersPlugin>>digitBitLogic:with:opIndex: (in category 'oop functions') -----
digitBitLogic: firstInteger with: secondInteger opIndex: opIx
"Bit logic here is only implemented for positive integers or Zero;
if rec or arg is negative, it fails."
| firstLarge secondLarge firstLen secondLen shortLen shortLarge longLen longLarge result |
(interpreterProxy isIntegerObject: firstInteger)
ifTrue:
[(interpreterProxy integerValueOf: firstInteger)
< 0 ifTrue: [^ interpreterProxy primitiveFail].
"convert it to a not normalized LargeInteger"
self remapOop: secondInteger in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
ifFalse:
[(interpreterProxy fetchClassOf: firstInteger)
+ = interpreterProxy classLargePositiveInteger ifFalse: [^ interpreterProxy primitiveFail].
- = interpreterProxy classLargeNegativeInteger ifTrue: [^ interpreterProxy primitiveFail].
firstLarge := firstInteger].
(interpreterProxy isIntegerObject: secondInteger)
ifTrue:
[(interpreterProxy integerValueOf: secondInteger)
< 0 ifTrue: [^ interpreterProxy primitiveFail].
"convert it to a not normalized LargeInteger"
self remapOop: firstLarge in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
ifFalse:
[(interpreterProxy fetchClassOf: secondInteger)
+ = interpreterProxy classLargePositiveInteger ifFalse: [^ interpreterProxy primitiveFail].
- = interpreterProxy classLargeNegativeInteger ifTrue: [^ interpreterProxy primitiveFail].
secondLarge := secondInteger].
firstLen := self byteSizeOfLargeInt: firstLarge.
secondLen := self byteSizeOfLargeInt: secondLarge.
firstLen < secondLen
ifTrue:
[shortLen := firstLen.
shortLarge := firstLarge.
longLen := secondLen.
longLarge := secondLarge]
ifFalse:
[shortLen := secondLen.
shortLarge := secondLarge.
longLen := firstLen.
longLarge := firstLarge].
self remapOop: #(shortLarge longLarge ) in: [result := interpreterProxy instantiateClass: interpreterProxy classLargePositiveInteger indexableSize: longLen].
self
cDigitOp: opIx
short: (self pointerToFirstDigitOfLargeInt: shortLarge)
len: shortLen + 3 // 4
long: (self pointerToFirstDigitOfLargeInt: longLarge)
len: longLen + 3 // 4
into: (self pointerToFirstDigitOfLargeInt: result).
interpreterProxy failed ifTrue: [^ 0].
^ self normalizePositive: result!
Item was changed:
----- Method: LargeIntegersPlugin>>isNormalized: (in category 'oop functions') -----
+ isNormalized: aLargeInteger
+ | len |
- isNormalized: anInteger
- | len maxVal minVal sLen val class positive |
- <var: #val type: #'unsigned long'>
- <var: #minVal type: #'unsigned long'>
- (interpreterProxy isIntegerObject: anInteger)
- ifTrue: [^ true].
- class := interpreterProxy fetchClassOf: anInteger.
- (positive := class = interpreterProxy classLargePositiveInteger) ifFalse:
- [class = interpreterProxy classLargeNegativeInteger ifFalse:
- [interpreterProxy primitiveFailFor: PrimErrBadArgument.
- ^false]].
"Check for leading zero of LargeInteger"
+ len := self byteSizeOfLargeInt: aLargeInteger.
- len := self byteSizeOfLargeInt: anInteger.
len = 0 ifTrue:
[^ false].
+ (self unsafeByteOfLargeInt: aLargeInteger at: len) = 0 ifTrue:
- (self unsafeByteOfLargeInt: anInteger at: len) = 0 ifTrue:
[^ false].
+ ^true!
- "no leading zero, now check if anInteger is in SmallInteger range or not"
- sLen := interpreterProxy maxSmallInteger > 16r3FFFFFFF
- ifTrue: [8]
- ifFalse: [4].
- "maximal digitLength of aSmallInteger"
- len > sLen ifTrue:
- [^ true].
- len < sLen ifTrue:
- [^ false].
- "len = sLen"
- ^positive
- ifTrue: [maxVal := interpreterProxy maxSmallInteger. "SmallInteger maxVal"
- "all bytes of maxVal but the highest one are just FF's"
- (self digitOfCSI: anInteger at: sLen // 4)
- > (self digitOfCSI: maxVal at: sLen // 4)]
- ifFalse: [val := self unsafeDigitOfLargeInt: anInteger at: len // 4.
- sLen > 4 ifTrue: [val := val << 32 + (self unsafeDigitOfLargeInt: anInteger at: 1)].
- minVal := 0 - interpreterProxy minSmallInteger.
- val > minVal]!
Item was changed:
----- Method: LargeIntegersPlugin>>primAnyBitFrom:to: (in category 'Integer primitives') -----
primAnyBitFrom: from to: to
| integer large |
self debugCode: [self msg: 'primAnyBitFrom: from to: to'].
integer := self
primitive: 'primAnyBitFromTo'
+ parameters: #(#SmallInteger #SmallInteger ).
- parameters: #(#SmallInteger #SmallInteger )
- receiver: #Integer.
(interpreterProxy isIntegerObject: integer)
ifTrue: ["convert it to a not normalized LargeInteger"
large := self createLargeFromSmallInteger: integer]
+ ifFalse:
+ [(self isLargeIntegerOop: integer) ifFalse: [^interpreterProxy primitiveFail].
+ large := integer].
- ifFalse: [large := integer].
^ (self
anyBitOfLargeInt: large
from: from
to: to)
asOop: Boolean!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitAdd: (in category 'Integer primitives') -----
primDigitAdd: secondInteger
| firstLarge secondLarge firstInteger |
self debugCode: [self msg: 'primDigitAdd: secondInteger'].
+ firstInteger := self primitive: 'primDigitAdd'.
- firstInteger := self
- primitive: 'primDigitAdd'
- parameters: #(Integer )
- receiver: #Integer.
(interpreterProxy isIntegerObject: firstInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self remapOop: secondInteger in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ firstLarge := firstInteger].
- ifFalse: [firstLarge := firstInteger].
(interpreterProxy isIntegerObject: secondInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self remapOop: firstLarge in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].
+ secondLarge := secondInteger].
- ifFalse: [secondLarge := secondInteger].
^ self digitAddLarge: firstLarge with: secondLarge!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitBitAnd: (in category 'Integer primitives') -----
primDigitBitAnd: secondInteger
"Bit logic here is only implemented for positive integers or Zero; if rec
or arg is negative, it fails."
| firstInteger |
self debugCode: [self msg: 'primDigitBitAnd: secondInteger'].
+ firstInteger := self primitive: 'primDigitBitAnd'.
- firstInteger := self
- primitive: 'primDigitBitAnd'
- parameters: #(Integer )
- receiver: #Integer.
^ self
digitBitLogic: firstInteger
with: secondInteger
opIndex: andOpIndex!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitBitOr: (in category 'Integer primitives') -----
primDigitBitOr: secondInteger
"Bit logic here is only implemented for positive integers or Zero; if rec
or arg is negative, it fails."
| firstInteger |
self debugCode: [self msg: 'primDigitBitOr: secondInteger'].
+ firstInteger := self primitive: 'primDigitBitOr'.
- firstInteger := self
- primitive: 'primDigitBitOr'
- parameters: #(Integer )
- receiver: #Integer.
^ self
digitBitLogic: firstInteger
with: secondInteger
opIndex: orOpIndex!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitBitShiftMagnitude: (in category 'Integer primitives') -----
primDigitBitShiftMagnitude: shiftCount
| rShift aLarge anInteger |
self debugCode: [self msg: 'primDigitBitShiftMagnitude: shiftCount'].
anInteger := self
primitive: 'primDigitBitShiftMagnitude'
+ parameters: #(#SmallInteger ).
- parameters: #(#SmallInteger )
- receiver: #Integer.
(interpreterProxy isIntegerObject: anInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
aLarge := self createLargeFromSmallInteger: anInteger]
+ ifFalse:
+ [(self isLargeIntegerOop: anInteger) ifFalse: [^interpreterProxy primitiveFail].
+ aLarge := anInteger].
- ifFalse: [aLarge := anInteger].
shiftCount >= 0
ifTrue: [^ self digit: aLarge Lshift: shiftCount]
ifFalse:
[rShift := 0 - shiftCount.
^ self normalize: (self
digit: aLarge
Rshift: rShift
lookfirst: (self digitSizeOfLargeInt: aLarge))]!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitBitXor: (in category 'Integer primitives') -----
primDigitBitXor: secondInteger
"Bit logic here is only implemented for positive integers or Zero; if rec
or arg is negative, it fails."
| firstInteger |
self debugCode: [self msg: 'primDigitBitXor: secondInteger'].
+ firstInteger := self primitive: 'primDigitBitXor'.
- firstInteger := self
- primitive: 'primDigitBitXor'
- parameters: #(Integer )
- receiver: #Integer.
^ self
digitBitLogic: firstInteger
with: secondInteger
opIndex: xorOpIndex!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitCompare: (in category 'Integer primitives') -----
primDigitCompare: secondInteger
| firstVal secondVal firstInteger firstIsSmall secondIsSmall |
self debugCode: [self msg: 'primDigitCompare: secondInteger'].
firstInteger := self primitive: 'primDigitCompare'.
"shortcut: aSmallInteger has to be smaller in Magnitude as aLargeInteger"
firstIsSmall := interpreterProxy isIntegerObject: firstInteger.
secondIsSmall := interpreterProxy isIntegerObject: secondInteger.
+ firstIsSmall ifFalse: [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail]].
+ secondIsSmall ifFalse: [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail]].
- 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)
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]]!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitDiv:negative: (in category 'Integer primitives') -----
primDigitDiv: secondInteger negative: neg
"Answer the result of dividing firstInteger by secondInteger.
Fail if parameters are not integers, not normalized or secondInteger is
zero. "
| firstAsLargeInteger secondAsLargeInteger firstInteger |
self debugCode: [self msg: 'primDigitDiv: secondInteger negative: neg'].
firstInteger := self
primitive: 'primDigitDivNegative'
+ parameters: #(#Oop #Boolean ).
- parameters: #(#Integer #Boolean )
- receiver: #Integer.
- "Avoid crashes in case of getting unnormalized args."
- (self isNormalized: firstInteger)
- ifFalse: [self
- debugCode: [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
- self msg: '------> receiver *not* normalized!!'].
- ^ interpreterProxy primitiveFail].
- (self isNormalized: secondInteger)
- ifFalse: [self
- debugCode: [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
- self msg: '------> argument *not* normalized!!'].
- ^ interpreterProxy primitiveFail].
"Coerce SmallIntegers to corresponding (not normalized) large integers
and check for zerodivide."
(interpreterProxy isIntegerObject: firstInteger)
+ ifTrue:
+ ["convert to LargeInteger"
- ifTrue: ["convert to LargeInteger"
self
remapOop: secondInteger
in: [firstAsLargeInteger := self createLargeFromSmallInteger: firstInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ "Avoid crashes in case of getting unnormalized args."
+ (self isNormalized: firstInteger) ifFalse: [self
+ debugCode: [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
+ self msg: '------> receiver *not* normalized!!'].
+ ^ interpreterProxy primitiveFail].firstAsLargeInteger := firstInteger].
- ifFalse: [firstAsLargeInteger := firstInteger].
(interpreterProxy isIntegerObject: secondInteger)
+ ifTrue:
+ ["check for zerodivide and convert to LargeInteger"
+ (interpreterProxy integerValueOf: secondInteger) = 0
- ifTrue: ["check for zerodivide and convert to LargeInteger"
- (interpreterProxy integerValueOf: secondInteger)
- = 0
ifTrue: [^ interpreterProxy primitiveFail].
self
remapOop: firstAsLargeInteger
in: [secondAsLargeInteger := self createLargeFromSmallInteger: secondInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].
+ (self isNormalized: secondInteger) ifFalse: [self
+ debugCode: [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
+ self msg: '------> argument *not* normalized!!'].
+ ^ interpreterProxy primitiveFail].
+ secondAsLargeInteger := secondInteger].
- ifFalse: [secondAsLargeInteger := secondInteger].
^ self
digitDivLarge: firstAsLargeInteger
with: secondAsLargeInteger
negative: neg!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitMultiply:negative: (in category 'Integer primitives') -----
primDigitMultiply: secondInteger negative: neg
| firstLarge secondLarge firstInteger |
self debugCode: [self msg: 'primDigitMultiply: secondInteger negative: neg'].
firstInteger := self
primitive: 'primDigitMultiplyNegative'
+ parameters: #(#Oop #Boolean ).
- parameters: #(#Integer #Boolean )
- receiver: #Integer.
(interpreterProxy isIntegerObject: firstInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self
remapOop: secondInteger
in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ firstLarge := firstInteger].
- ifFalse: [firstLarge := firstInteger].
(interpreterProxy isIntegerObject: secondInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self
remapOop: firstLarge
in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].
+ secondLarge := secondInteger].
- ifFalse: [secondLarge := secondInteger].
^ self
digitMultiplyLarge: firstLarge
with: secondLarge
negative: neg!
Item was changed:
----- Method: LargeIntegersPlugin>>primDigitSubtract: (in category 'Integer primitives') -----
primDigitSubtract: secondInteger
| firstLarge secondLarge firstInteger |
self debugCode: [self msg: 'primDigitSubtract: secondInteger'].
+ firstInteger := self primitive: 'primDigitSubtract'.
- firstInteger := self
- primitive: 'primDigitSubtract'
- parameters: #(#Integer )
- receiver: #Integer.
(interpreterProxy isIntegerObject: firstInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self
remapOop: secondInteger
in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ firstLarge := firstInteger].
- ifFalse: [firstLarge := firstInteger].
(interpreterProxy isIntegerObject: secondInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self
remapOop: firstLarge
in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ secondLarge := secondInteger].
- ifFalse: [secondLarge := secondInteger].
^ self digitSubLarge: firstLarge with: secondLarge!
Item was changed:
----- Method: LargeIntegersPlugin>>primMontgomeryDigitLength (in category 'Integer primitives') -----
primMontgomeryDigitLength
self debugCode: [self msg: 'primMontgomeryDigitLength'].
+ self primitive: 'primMontgomeryDigitLength'.
- self
- primitive: 'primMontgomeryDigitLength'
- parameters: #()
- receiver: #Integer.
^interpreterProxy integerObjectOf: 32!
Item was changed:
----- Method: LargeIntegersPlugin>>primMontgomeryTimes:modulo:mInvModB: (in category 'Integer primitives') -----
primMontgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: mInverseInteger
| firstLarge secondLarge firstInteger thirdLarge mInv |
<var: #mInv type: #'unsigned int'>
self debugCode: [self msg: 'montgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: smallInverseInteger'].
+ firstInteger := self primitive: 'primMontgomeryTimesModulo'.
+ mInv := interpreterProxy positive32BitValueOf: mInverseInteger.
- firstInteger := self
- primitive: 'primMontgomeryTimesModulo'
- parameters: #(Integer Integer Integer )
- receiver: #Integer.
- mInv := interpreterProxy positive32BitValueOf: mInverseInteger.
(interpreterProxy isIntegerObject: firstInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self remapOop: #(secondOperandInteger thirdModuloInteger) in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].
+ firstLarge := firstInteger].
- ifFalse: [firstLarge := firstInteger].
(interpreterProxy isIntegerObject: secondOperandInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self remapOop: #(firstLarge thirdModuloInteger) in: [secondLarge := self createLargeFromSmallInteger: secondOperandInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: secondOperandInteger) ifFalse: [^interpreterProxy primitiveFail].
+ secondLarge := secondOperandInteger].
- ifFalse: [secondLarge := secondOperandInteger].
(interpreterProxy isIntegerObject: thirdModuloInteger)
+ ifTrue:
+ ["convert it to a not normalized LargeInteger"
- ifTrue: ["convert it to a not normalized LargeInteger"
self remapOop: #(firstLarge secondLarge) in: [thirdLarge := self createLargeFromSmallInteger: thirdModuloInteger]]
+ ifFalse:
+ [(self isLargeIntegerOop: thirdModuloInteger) ifFalse: [^interpreterProxy primitiveFail].
+ thirdLarge := thirdModuloInteger].
- ifFalse: [thirdLarge := thirdModuloInteger].
^ self digitMontgomery: firstLarge times: secondLarge modulo: thirdLarge mInvModB: mInv!
Item was changed:
----- Method: LargeIntegersPlugin>>primNormalizeNegative (in category 'Integer primitives') -----
primNormalizeNegative
| rcvr |
self debugCode: [self msg: 'primNormalizeNegative'].
+ rcvr := self primitive: 'primNormalizeNegative'.
+ (interpreterProxy fetchClassOf: rcvr) == interpreterProxy classLargeNegativeInteger ifFalse: [^interpreterProxy primitiveFail].
- rcvr := self
- primitive: 'primNormalizeNegative'
- parameters: #()
- receiver: #LargeNegativeInteger.
^ self normalizeNegative: rcvr!
Item was changed:
----- Method: LargeIntegersPlugin>>primNormalizePositive (in category 'Integer primitives') -----
primNormalizePositive
| rcvr |
self debugCode: [self msg: 'primNormalizePositive'].
+ rcvr := self primitive: 'primNormalizePositive'.
+ (interpreterProxy fetchClassOf: rcvr) == interpreterProxy classLargePositiveInteger ifFalse: [^interpreterProxy primitiveFail].
- rcvr := self
- primitive: 'primNormalizePositive'
- parameters: #()
- receiver: #LargePositiveInteger.
^ self normalizePositive: rcvr!
More information about the Vm-dev
mailing list