VM Maker: VMMaker.oscog-eem.622.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.oscog-eem.622.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.622.mcz

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

Name: VMMaker.oscog-eem.622
Author: eem
Time: 26 February 2014, 11:53:23.432 am
UUID: 7a33af68-b347-4a24-b960-e8755f7c49f3
Ancestors: VMMaker.oscog-eem.621

Improve spread in Spur's identity hash from 64% to 75%.
Make primitiveSizeInBytesOfInstance accept 2 args in Newspeak for
VMMirror.
Try and fix initialization of ProcessorClass in Cogit.

=============== Diff against VMMaker.oscog-eem.621 ===============

Item was changed:
  ----- Method: Cogit class>>ancilliaryClasses: (in category 'translation') -----
  ancilliaryClasses: options
+ ProcessorClass ifNil:
+ [Cogit initializeMiscConstants].
- ProcessorClass ifNil: [thisContext methodClass theNonMetaClass initialize].
  ^{ CogMethodZone.
  CogAbstractInstruction.
  ProcessorClass basicNew abstractInstructionCompilerClass.
  CogBlockStart.
  CogBytecodeDescriptor.
  CogBytecodeFixup.
  CogInstructionAnnotation.
  CogPrimitiveDescriptor.
  CogBlockMethod.
  CogMethod },
  ((options at: #NewspeakVM ifAbsent: [false])
  ifTrue: [{NewspeakCogMethod}]
  ifFalse: [#()])!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveSizeInBytesOfInstance (in category 'memory space primitives') -----
  primitiveSizeInBytesOfInstance
+ "Answer the byte size of an instance of the receiver.  If num args > 0
+ then the last argument is a variable size and the size answered is the
+ size of an instance of the receiver with that many indexable elements."
  <option: #SpurObjectMemory>
  | byteSizeOrErr |
+ self cppIf: NewspeakVM
+ ifTrue: "Support VMMirror>>byteSizeOfInstanceOf:WithIndexableVariables:"
+ [argumentCount > 2 ifTrue:
+ [^self primitiveFailFor: PrimErrBadNumArgs]]
+ ifFalse:
+ [argumentCount > 1 ifTrue:
+ [^self primitiveFailFor: PrimErrBadNumArgs]].
+ argumentCount >= 1 ifTrue:
- argumentCount > 1 ifTrue:
- [^self primitiveFailFor: PrimErrBadNumArgs].
- argumentCount = 1 ifTrue:
  [(objectMemory isIntegerObject: self stackTop) ifFalse:
  [^self primitiveFailFor: PrimErrBadArgument].
  byteSizeOrErr := objectMemory
  byteSizeOfInstanceOf: (self stackValue: 1)
  withIndexableSlots: (objectMemory integerValueOf: self stackTop).
  byteSizeOrErr < 0 ifTrue:
  [^self primitiveFailFor: byteSizeOrErr negated].
+ ^self pop: argumentCount + 1 thenPushInteger: byteSizeOrErr].
+ byteSizeOrErr := objectMemory byteSizeOfInstanceOf: (self stackValue: 0).
- ^self pop: 2 thenPushInteger: byteSizeOrErr].
- byteSizeOrErr := objectMemory byteSizeOfInstanceOf: (self stackValue: 1).
  byteSizeOrErr < 0 ifTrue:
  [^self primitiveFailFor: byteSizeOrErr negated].
  self pop: 1 thenPushInteger: byteSizeOrErr!

Item was changed:
  ----- Method: SpurMemoryManager>>newObjectHash (in category 'accessing') -----
  newObjectHash
  "Use a slight variation on D.H. Lehmer's linear congruential generator from 1951.
  See e.g. http://en.wikipedia.org/wiki/Linear_congruential_generator."
+ | hash |
+ [lastHash := self cCode: [lastHash * 16807] "7 raisedTo: 5"
- lastHash := self cCode: [lastHash * 16807] "7 raisedTo: 5"
  inSmalltalk: [lastHash := lastHash * 16807 bitAnd: 16rFFFFFFFF].
+ hash := lastHash + (lastHash >> 4). "adding the top bits gives much better spread.  See below:"
+ (hash bitAnd: self identityHashHalfWordMask) = 0] whileTrue.
+ ^hash
- self assert: lastHash ~= 0.
- ^lastHash + (lastHash >> 8) "adding the top bits gives much better spread.  See below:"
 
+ "the standard algorithm doesn't vary well in the least significant bits:"
  "| r s n |
  r := 1.
  n := 256 * 256 * 256.
  s := Set new: n * 2.
  n timesRepeat:
+ [s add: (r bitAnd: n - 1).
- [s add: (r + (r bitShift: -8) bitAnd: n - 1).
  r := r * 16807 bitAnd: 16rFFFFFFFF].
  { s size. s size / n asFloat. s includes: 0. r hex }
+ => #(2097152 0.125 false '16r38000001')"
- => #(10702109 0.637895405292511 false '16r38000001')"
 
+ "this can be improved by adding in shifted upper bits"
  "| r s n |
  r := 1.
  n := 256 * 256 * 256.
  s := Set new: n * 2.
  n timesRepeat:
+ [s add: (r + (r bitShift: -8) bitAnd: n - 1).
- [s add: (r bitAnd: n - 1).
  r := r * 16807 bitAnd: 16rFFFFFFFF].
  { s size. s size / n asFloat. s includes: 0. r hex }
+ => #(10702109 0.637895405292511 false '16r38000001')"
+
+
+ "but which shift is best?  Looks like -4:"
+ "(-2 to: -15 by: -1) do:
+ [:shift|
+ | r s n |
+ r := 1.
+ n := 256 * 256 * 256.
+ s := Set new: n * 2.
+ n timesRepeat:
+ [s add: (r + (r bitShift: shift) bitAnd: n - 1).
+ r := r * 16807 bitAnd: 16rFFFFFFFF].
+ Transcript cr; print: { shift. s size. s size / n asFloat. s includes: 0. r hex }; flush]
+
+ #(-2 8388608 0.5 true '16r38000001')
+ #(-3 8388608 0.5 false '16r38000001')
+ #(-4 12582503 0.749975621700287 true '16r38000001')
+ #(-5 11468379 0.6835686564445495 false '16r38000001')
+ #(-6 11013442 0.656452298164368 true '16r38000001')
+ #(-7 10804094 0.643974184989929 true '16r38000001')
+ #(-8 10702109 0.637895405292511 false '16r38000001')
+ #(-9 10703730 0.637992024421692 false '16r38000001')
+ #(-10 7865201 0.468802511692047 false '16r38000001')
+ #(-11 8444092 0.503307104110718 false '16r38000001')
+ #(-12 10703317 0.6379674077034 true '16r38000001')
+ #(-13 10701116 0.637836217880249 true '16r38000001')
+ #(-14 10689443 0.637140452861786 true '16r38000001')
+ #(-15 7853923 0.4681302905082702 true '16r38000001')"!
- => #(2097152 0.125 false '16r38000001')"!