Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.960.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.960 Author: eem Time: 1 December 2014, 4:11:42.232 pm UUID: 1b13b4c0-c9f8-4441-a0fa-08b7cd13a92a Ancestors: VMMaker.oscog-eem.959 Add some SmallFloat64 tests. Hence fix isSmallFloatValue: for simulation. =============== Diff against VMMaker.oscog-eem.959 =============== Item was changed: ----- Method: Spur64BitMemoryManager>>isSmallFloatValue: (in category 'interpreter access') ----- isSmallFloatValue: aFloat <inline: true> <var: #aFloat type: #double> | exponent | exponent := self cCode: [| rawFloat | rawFloat := (self cCoerce: (self addressOf: aFloat) to: 'sqLong *') at: 0. rawFloat >> 52 bitAnd: 16r7FF] + inSmalltalk: [self smallFloatExponentOffset + + (aFloat isFinite + ifTrue: + [aFloat = 0.0 + ifTrue: [0] + ifFalse: [aFloat exponent + 127]] + ifFalse: "Float nan & Float infinity exponent = -1, so mask to make > 0" + [aFloat exponent bitAnd: SmallInteger maxVal])]. + ^exponent + between: self smallFloatExponentOffset + and: 255 + self smallFloatExponentOffset! - inSmalltalk: [aFloat exponent]. - ^exponent between: -127 and: 127! Item was added: + ----- Method: StackInterpreterTests>>testImmediateFloats (in category 'tests') ----- + testImmediateFloats + "self new testImmediateFloats" + | vm smm smallFloatOop | + vm := StackInterpreterSimulator newWithOptions: #(ObjectMemory Spur64BitMemoryManager). + smm := vm objectMemory. + #(0.0 -0.0 1.0e38 -1.0e38 1.0e-38 -1.0e-38 2.0 -2.0) do: + [:f| | sfo | + vm initPrimCall. + self shouldnt: [sfo := smm smallFloatObjectOf: f] raise: Error. + self assert: (smm smallFloatValueOf: sfo) equals: f. + self assert: ((smm exponentOfSmallFloat: sfo) between: -126 and: 127)]. + {Float nan. Float infinity. Float negativeInfinity. 1.0e-39. 1.0e39 } do: + [:f| self deny: (smm isSmallFloatValue: f)]. + vm initPrimCall. + smallFloatOop := smm smallFloatTag + (1 << (smm smallFloatMantissaBits + smm numTagBits)). + self shouldnt: [smm floatValueOf: smallFloatOop] raise: Error. + self deny: vm failed. + self assert: (smm isSmallFloatValue: (smm floatValueOf: smallFloatOop)). + self assert: (smm floatObjectOf: (smm floatValueOf: smallFloatOop)) equals: smallFloatOop. + vm initPrimCall. + smallFloatOop := ((1 bitShift: 64) - 1 bitClear: (1 bitShift: smm numTagBits + 1) - 1) + smm smallFloatTag. + self shouldnt: [smm floatValueOf: smallFloatOop] raise: Error. + self deny: vm failed. + self assert: (smm isSmallFloatValue: (smm floatValueOf: smallFloatOop)). + self assert: (smm floatObjectOf: (smm floatValueOf: smallFloatOop)) equals: smallFloatOop! |
2014-12-02 1:12 GMT+01:00 <[hidden email]>:
Pointer aliasing usage apart, shouldn't it be usqLong * ? rawFloat >> 52 bitAnd: 16r7FF] |
Hi Nicolas,
Eliot (phone) |
2014-12-03 0:42 GMT+01:00 Eliot Miranda <[hidden email]>:
Ah sorry, I missread, you shift then mask, not the contrary, so all is OK.
|
Free forum by Nabble | Edit this page |