VM Maker: VMMaker-dtl.287.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker-dtl.287.mcz

commits-2
 
David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.287.mcz

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

Name: VMMaker-dtl.287
Author: dtl
Time: 2 September 2012, 10:33:04.159 am
UUID: 486209ad-7082-4e05-84a9-f37c4c6ba622
Ancestors: VMMaker-dtl.286

VMMaker 4.10.2

Remove unnecessary type declarations added in the last update (4.10.1).

Rationale: Do not declare oop as usqInt unless there is a need to do so. Arguably, all oop values should be unsigned throughout the VM, and this should be declared as a specific oop data type independent of sqInt and usqInt. But this is a more general issue throughout the VM, meanwhile the explicit declarations of oop values as usqInt have no practical effect.

Remove some unneeded <inline: false> declarations.

=============== Diff against VMMaker-dtl.286 ===============

Item was changed:
  ----- Method: InterpreterPrimitives>>isNegativeIntegerValueOf: (in category 'primitive support') -----
  isNegativeIntegerValueOf: oop
+ "Answer true if integer object is negative.
- "Answer 1 if integer object is negative, 0 otherwise.
  Fail if object pointed by oop i not an integer."
  | ok smallInt |
+
- <inline: false>
- <returnTypeC: #usqInt>
- <var: #smallInt type: #sqInt>
-
  (objectMemory isIntegerObject: oop)
  ifTrue:
  [smallInt := objectMemory integerValueOf: oop.
  ^smallInt < 0].
 
  ok := objectMemory isClassOfNonImm: oop
  equalTo: (objectMemory splObj: ClassLargePositiveInteger)
  compactClassIndex: ClassLargePositiveIntegerCompactIndex.
  ok ifTrue: [^false].
 
  ok := objectMemory isClassOfNonImm: oop
  equalTo: (objectMemory splObj: ClassLargeNegativeInteger)
  compactClassIndex: ClassLargeNegativeIntegerCompactIndex.
  ok ifTrue: [^true].
  self primitiveFail.
  ^false!

Item was changed:
  ----- Method: InterpreterPrimitives>>magnitude64BitIntegerFor:neg: (in category 'primitive support') -----
  magnitude64BitIntegerFor: magnitude neg: isNegative
  "Return a Large Integer object for the given integer magnitude and sign"
  | newLargeInteger largeClass intValue highWord sz isSmall smallVal |
- <inline: false>
  <var: 'magnitude' type: 'usqLong'>
- <var: 'isNegative' type: 'usqInt'>
  <var: 'highWord' type: 'usqInt'>
- <var: 'isSmall' type: 'usqInt'>
- <var: 'smallVal' type: 'sqInt'>
 
  isSmall := isNegative
  ifTrue: [magnitude <= 16r40000000]
  ifFalse: [magnitude < 16r40000000].
  isSmall
  ifTrue:
  [smallVal := self cCoerce: magnitude to: #sqInt.
  isNegative ifTrue: [smallVal := 0 - smallVal].
  ^self integerObjectOf: smallVal].
  isNegative
  ifTrue:[ largeClass := self classLargeNegativeInteger]
  ifFalse:[ largeClass := self classLargePositiveInteger].
  highWord := self cCode: 'magnitude >> 32'. "shift is coerced to usqInt otherwise"
  highWord = 0
  ifTrue: [sz := 4]
  ifFalse:[
  sz := 5.
  (highWord := highWord >> 8) = 0 ifFalse:[sz := sz + 1].
  (highWord := highWord >> 8) = 0 ifFalse:[sz := sz + 1].
  (highWord := highWord >> 8) = 0 ifFalse:[sz := sz + 1].
  ].
  newLargeInteger := self instantiateClass: largeClass indexableSize:  sz.
  0 to: sz-1 do: [:i |
  intValue := self cCode: '(magnitude >> (i * 8)) & 255'.
  self storeByte: i ofObject: newLargeInteger withValue: intValue].
  ^ newLargeInteger!

Item was changed:
  ----- Method: InterpreterPrimitives>>magnitude64BitValueOf: (in category 'primitive support') -----
  magnitude64BitValueOf: oop
  "Convert the given object into an integer value.
  The object may be either a positive SmallInteger or a eight-byte LargeInteger."
  | sz value ok smallIntValue |
- <inline: false>
  <returnTypeC: #usqLong>
  <var: #value type: #usqLong>
+
- <var: #smallIntValue type: #sqInt>
  (objectMemory isIntegerObject: oop) ifTrue:
  [smallIntValue := (objectMemory integerValueOf: oop).
  smallIntValue < 0 ifTrue: [smallIntValue := 0 - smallIntValue].
  ^self cCoerce: smallIntValue to: #usqLong].
 
  ok := objectMemory isClassOfNonImm: oop
  equalTo: (objectMemory splObj: ClassLargePositiveInteger)
  compactClassIndex: ClassLargePositiveIntegerCompactIndex.
  ok
  ifFalse:
  [ok := objectMemory isClassOfNonImm: oop
  equalTo: (objectMemory splObj: ClassLargeNegativeInteger)
  compactClassIndex: ClassLargeNegativeIntegerCompactIndex.
  ok ifFalse: [^self primitiveFail]].
  sz := objectMemory lengthOf: oop.
  sz > (self sizeof: #sqLong asSymbol) ifTrue:
  [^self primitiveFail].
 
  value := 0.
  0 to: sz - 1 do: [:i |
  value := value + ((self cCoerce: (objectMemory fetchByte: i ofObject: oop) to: #sqLong) <<  (i*8))].
  ^value!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveAddLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveAddLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | a b result oopResult aIsNegative bIsNegative resultIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
- <var: 'resultIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  self successful ifFalse:[^nil].
  (aIsNegative = bIsNegative)
  ifTrue:
  ["Protect against overflow"
  a > (16rFFFFFFFFFFFFFFFF - b) ifTrue: [self primitiveFail. ^nil].
  result := a + b.
  resultIsNegative := aIsNegative]
  ifFalse:
  [(a >= b)
  ifTrue:
  [result := a - b.
  resultIsNegative := aIsNegative]
  ifFalse:
  [result := b - a.
  resultIsNegative := bIsNegative]].
  oopResult := self magnitude64BitIntegerFor: result neg: resultIsNegative.
  self successful ifTrue:[self pop: 2 thenPush: oopResult].!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveBitShiftLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveBitShiftLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | a shift result oopResult aIsNegative oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
- <var: 'shift' type: 'sqInt'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
 
  shift := self stackIntegerValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  a := self magnitude64BitValueOf: oopRcvr.
  self successful ifFalse:[^nil].
  (shift >= 0)
  ifTrue:
  ["Protect against overflow"
  result := 16rFFFFFFFFFFFFFFFF. "This is to avoid undue (usqInt) cast"
  (shift >= 64 or: [a > (result >> shift)]) ifTrue: [self primitiveFail. ^nil].
  result := a << shift]
  ifFalse:
  [shift := 0 - shift.
  shift >= 64
  ifTrue: [result := 0]
  ifFalse: [result := a >> shift].
  "Fake 2 complement for negative values"
  (aIsNegative and: [result << shift ~= a]) ifTrue: [result := result + 1]].
  oopResult := self magnitude64BitIntegerFor: result neg: aIsNegative.
  self successful ifTrue:[self pop: 2 thenPush: oopResult].!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveDivLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveDivLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | result oopResult a aIsNegative b bIsNegative oopArg oopRcvr rem |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
  <var: 'rem' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  b = 0 ifTrue:[self primitiveFail].
  self successful ifFalse:[^nil].
 
  result := a // b.
 
  a = 0
  ifFalse: [bIsNegative = aIsNegative
  ifFalse:
  ["Round toward negative infinity"
  rem := a \\ b.
  rem = 0 ifFalse:
  ["This can not overflow, because b > 1, otherwise rem = 0"
  result := result + 1]]].
 
  oopResult := self magnitude64BitIntegerFor: result neg: bIsNegative ~= aIsNegative.
  self successful ifTrue: [self pop: 2 thenPush: oopResult].!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveDivideLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveDivideLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | a b result oopResult aIsNegative bIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  self successful ifFalse:[^nil].
 
  "check for exact division"
  (b ~= 0 and:[a \\ b = 0]) ifFalse:[self primitiveFail. ^nil].
 
  result := a // b.
  oopResult := self magnitude64BitIntegerFor: result neg: aIsNegative ~= bIsNegative.
 
  self successful ifTrue:[self pop: 2 thenPush: oopResult].
  !

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveModLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveModLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | result oopResult a aIsNegative b bIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  b = 0 ifTrue:[self primitiveFail].
  self successful ifFalse:[^nil].
 
  result := a \\ b.
 
  "Handle remainder of same sign as argument"
  result = 0
  ifFalse: [bIsNegative = aIsNegative
  ifFalse: [result := b - result]].
 
  oopResult := self magnitude64BitIntegerFor: result neg: bIsNegative.
  self successful ifTrue: [self pop: 2 thenPush: oopResult].
  !

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveMultiplyLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveMultiplyLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | a b result oopResult aIsNegative bIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  self successful ifFalse:[^nil].
 
  "check for overflow"
  (a > 1 and: [b > 1 and: [a > (16rFFFFFFFFFFFFFFFF / b)]])
  ifTrue: [self primitiveFail. ^nil].
 
  result := a * b.
  oopResult := self magnitude64BitIntegerFor: result neg: aIsNegative ~= bIsNegative.
 
  self successful ifTrue:[self pop: 2 thenPush: oopResult].
  !

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveQuoLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveQuoLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | result oopResult a aIsNegative b bIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  b = 0 ifTrue:[self primitiveFail].
  self successful ifFalse:[^nil].
 
  result := a // b.
 
  oopResult := self magnitude64BitIntegerFor: result neg: bIsNegative ~= aIsNegative.
  self successful ifTrue: [self pop: 2 thenPush: oopResult].!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveRemLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveRemLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | result oopResult a aIsNegative b bIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  b = 0 ifTrue:[self primitiveFail].
  self successful ifFalse:[^nil].
 
  result := a \\ b.
 
  oopResult := self magnitude64BitIntegerFor: result neg: aIsNegative ~= bIsNegative.
  self successful ifTrue: [self pop: 2 thenPush: oopResult].!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveSubtractLargeIntegers (in category 'arithmetic largeint primitives') -----
  primitiveSubtractLargeIntegers
  "Primitive arithmetic operations for large integers in 64 bit range"
  | a b result oopResult aIsNegative bIsNegative resultIsNegative oopArg oopRcvr |
  <export: true>
  <var: 'a' type: 'usqLong'>
  <var: 'b' type: 'usqLong'>
  <var: 'result' type: 'usqLong'>
- <var: 'oopArg' type: 'usqInt'>
- <var: 'oopRcvr' type: 'usqInt'>
- <var: 'oopResult' type: 'usqInt'>
- <var: 'aIsNegative' type: 'usqInt'>
- <var: 'bIsNegative' type: 'usqInt'>
- <var: 'resultIsNegative' type: 'usqInt'>
 
  oopArg := self stackValue: 0.
  oopRcvr := self stackValue: 1.
  aIsNegative := self isNegativeIntegerValueOf: oopRcvr.
  bIsNegative := self isNegativeIntegerValueOf: oopArg.
  a := self magnitude64BitValueOf: oopRcvr.
  b := self magnitude64BitValueOf: oopArg.
  self successful ifFalse:[^nil].
  (aIsNegative ~= bIsNegative)
  ifTrue:
  ["Protect against overflow"
  a > (16rFFFFFFFFFFFFFFFF - b) ifTrue: [self primitiveFail. ^nil].
  result := a + b.
  resultIsNegative := aIsNegative]
  ifFalse:
  [(a >= b)
  ifTrue:
  [result := a - b.
  resultIsNegative := aIsNegative]
  ifFalse:
  [result := b - a.
  resultIsNegative := aIsNegative not]].
  oopResult := self magnitude64BitIntegerFor: result neg: resultIsNegative.
  self successful ifTrue:[self pop: 2 thenPush: oopResult].
  !

Item was changed:
  ----- Method: VMMaker class>>versionString (in category 'version testing') -----
  versionString
 
  "VMMaker versionString"
 
+ ^'4.10.2'!
- ^'4.10.1'!