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

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

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

Name: VMMaker.oscog-eem.2296
Author: eem
Time: 20 December 2017, 12:36:23.101265 am
UUID: e510f7d2-9ec9-4fa5-bee1-db1f59227058
Ancestors: VMMaker.oscog-eem.2295

Fix bugs in DoubleWordArray>>[unsigned]long64At:
 which failed to exclude extraneous bytes in the upper word of unaligned accesses.  These along with the fix to hackBits: in Graphics-eem.389 fix simulating 64-bit images in 64-bits, ensuring that the display is visible.

Add tests for hackBits: and signed access answering neghative values.  Fix a comment typo.

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

Item was changed:
  ----- Method: DoubleWordArray>>long64At: (in category '*VMMaker-JITSimulation') -----
  long64At: byteIndex
  | lowBits wordIndex value high low |
  wordIndex := byteIndex - 1 // 8 + 1.
  (lowBits := byteIndex - 1 \\ 8) = 0
  ifTrue:
  [value := self at: wordIndex]
  ifFalse:
+ [high := ((self at: wordIndex + 1) bitAnd: (1 bitShift: lowBits * 8) - 1) bitShift: 8 - lowBits * 8.
- [high := (self at: wordIndex + 1) bitShift: 8 - lowBits * 8.
  low := (self at: wordIndex) bitShift: lowBits * -8.
  high = 0 ifTrue:
  [^low].
  value := high + low].
  ^(value bitShift: -56) <= 127
  ifTrue: [value]
  ifFalse: [value - 16r10000000000000000]!

Item was changed:
  ----- Method: DoubleWordArray>>unsignedLong64At: (in category '*VMMaker-JITSimulation') -----
  unsignedLong64At: byteIndex
  "Compatiblity with the ByteArray & Alien methods of the same name."
  | wordIndex lowBits high low |
  wordIndex := byteIndex - 1 // 8 + 1.
  (lowBits := byteIndex - 1 bitAnd: 7) = 0 ifTrue:
  [^self at: wordIndex].
+ high := ((self at: wordIndex + 1) bitAnd: (1 bitShift: lowBits * 8) - 1) bitShift: 8 - lowBits * 8.
- high := (self at: wordIndex + 1) bitShift: 8 - lowBits * 8.
  low := (self at: wordIndex) bitShift: lowBits * -8.
  ^high = 0 ifTrue: [low] ifFalse: [high + low]!

Item was changed:
  ----- Method: MemoryTests>>testLittleEndian32BitLongAccessFor: (in category 'test support') -----
  testLittleEndian32BitLongAccessFor: aClass
  "Test that ByteArray provides big-endian access for 32-bit accessors"
  "memory copy changeClassTo: ByteArray"
  | memory |
  memory := aClass new: 64 / (aClass new: 0) bytesPerElement.
  "signed access"
  0 to: 30 do:
  [:shift|
  #(-1 1) do:
  [:initial| | value |
  value := initial bitShift: shift.
  memory longAt: 1 put: value.
  self assert: value equals: (memory longAt: 1).
  "aligned store"
  memory
  longAt: 5 put: 16r55550000;
  longAt: 9 put: 16r00005555.
  self assert: 16r55555555 equals: (memory longAt: 7).
  memory longAt: 7 put: value.
  self assert: value equals: (memory longAt: 7).
  "check bytes either side have not been changed"
  5 to: 6 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  11 to: 15 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  "unaligned store"
  memory
  longAt: 6 put: 16r55550000;
  longAt: 10 put: 16r00005555.
  self assert: 16r55555555 equals: (memory longAt: 8).
  memory longAt: 8 put: value.
  self assert: value equals: (memory longAt: 8).
  "check bytes either side have not been changed"
  5 to: 7 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  12 to: 15 do:
  [:i| self assert: 0 equals: (memory byteAt: i)]]].
+ memory
+ unsignedLongAt: 49 put: 16rAAAAAAAA;
+ unsignedLongAt: 53 put: 16rAAAAAAAA.
+ 49 to: 52 do:
+ [:i|
+ self assert: -1431655766 equals: (memory longAt: i)].
  "unsigned access"
  0 to: 31 do:
  [:shift| | value |
  value := 1 bitShift: shift.
  memory unsignedLongAt: 1 put: value.
  self assert: value equals: (memory unsignedLongAt: 1).
  "aligned store"
  memory
  longAt: 5 put: 16r55550000;
  longAt: 9 put: 16r00005555.
  self assert: 16r55555555 equals: (memory unsignedLongAt: 7).
  memory unsignedLongAt: 7 put: value.
  self assert: value equals: (memory unsignedLongAt: 7).
  "check bytes either side have not been changed"
  5 to: 6 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  11 to: 15 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  "unaligned store"
  memory
  longAt: 6 put: 16r55550000;
  longAt: 10 put: 16r00005555.
  self assert: 16r55555555 equals: (memory unsignedLongAt: 8).
  memory unsignedLongAt: 8 put: value.
  self assert: value equals: (memory unsignedLongAt: 8).
  "check bytes either side have not been changed"
  5 to: 7 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  12 to: 15 do:
  [:i| self assert: 0 equals: (memory byteAt: i)]]!

Item was changed:
  ----- Method: MemoryTests>>testLittleEndian64BitLongAccessFor: (in category 'test support') -----
  testLittleEndian64BitLongAccessFor: aClass
  "Test that the given class provides little-endian access for 64-bit accessors"
  "memory copy changeClassTo: ByteArray"
  | memory |
  memory := aClass new: 64 / (aClass new: 0) bytesPerElement.
  "signed access"
  0 to: 62 do:
  [:shift|
  #(-1 1) do:
  [:initial| | value |
  value := initial bitShift: shift.
  memory long64At: 1 put: value.
  self assert: value equals: (memory long64At: 1).
  "aligned store"
  memory
  long64At: 9 put: 16r5555550000000000;
  long64At: 17 put: 16r0000005555555555.
  self assert: 16r5555555555555555 equals: (memory long64At: 14).
  memory long64At: 14 put: value.
  self assert: value equals: (memory long64At: 14).
  "check bytes either side have not been changed"
  9 to: 13 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  22 to: 31 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  "unaligned store"
  memory
  long64At: 10 put: 16r5555550000000000;
  long64At: 18 put: 16r0000005555555555.
  self assert: 16r5555555555555555 equals: (memory long64At: 15).
  memory long64At: 15 put: value.
  self assert: value equals: (memory long64At: 15).
  "check bytes either side have not been changed"
  9 to: 14 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  23 to: 31 do:
  [:i| self assert: 0 equals: (memory byteAt: i)]]].
+ memory
+ unsignedLong64At: 49 put: 16rAAAAAAAAAAAAAAAA;
+ unsignedLong64At: 57 put: 16rAAAAAAAAAAAAAAAA.
+ 49 to: 56 do:
+ [:i|
+ self assert: -6148914691236517206 equals: (memory long64At: i)].
  "unsigned access"
  0 to: 63 do:
  [:shift| | value |
  value := 1 bitShift: shift.
  memory unsignedLong64At: 1 put: value.
  self assert: value equals: (memory unsignedLong64At: 1).
  "aligned store"
  memory
  unsignedLong64At: 9 put: 16r5555550000000000;
  unsignedLong64At: 17 put: 16r0000005555555555.
  self assert: 16r5555555555555555 equals: (memory unsignedLong64At: 14).
  memory unsignedLong64At: 14 put: value.
  self assert: value equals: (memory unsignedLong64At: 14).
  "check bytes either side have not been changed"
  9 to: 13 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  22 to: 31 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  "unaligned store"
  memory
  unsignedLong64At: 10 put: 16r5555550000000000;
  unsignedLong64At: 18 put: 16r0000005555555555.
  self assert: 16r5555555555555555 equals: (memory unsignedLong64At: 15).
  memory unsignedLong64At: 15 put: value.
  self assert: value equals: (memory unsignedLong64At: 15).
  "check bytes either side have not been changed"
  9 to: 14 do:
  [:i| self assert: 0 equals: (memory byteAt: i)].
  23 to: 31 do:
  [:i| self assert: 0 equals: (memory byteAt: i)]]!

Item was changed:
  ----- Method: Spur64BitMMLESimulatorFor64Bits>>long64At: (in category 'memory access') -----
  long64At: byteAddress
+ "memory is a DoubleWordArray, a 64-bit indexable array of bits"
- "memory is a DobleWordArray, a 64-bit indexable array of bits"
  byteAddress \\ 8 ~= 0 ifTrue: [self unalignedAccessError].
  ^memory at: byteAddress // 8 + 1!

Item was added:
+ ----- Method: StackInterpreterSimulatorTests>>testHackBits (in category 'tests') -----
+ testHackBits
+ "Test that the hackBits plumbing, used for display update in the
+ simulated ioShow:D:i:s:p:l:a:y:, works for the underlying memory classes."
+ | mem32 mem64 disp32 disp64 hack32 hack64 |
+ mem32 := LittleEndianBitmap new: 65536 / 4.
+ mem64 := DoubleWordArray new: 65536 / 8.
+ 1 to: 65536 by: 8 do:
+ [:i|
+ mem32
+ unsignedLong64At: i
+ put: ((i // 8) even
+ ifTrue: [16r5555555555555555]
+ ifFalse: [16rAAAAAAAAAAAAAAAA]).
+ mem64
+ unsignedLong64At: i
+ put: ((i // 8) even
+ ifTrue: [16r5555555555555555]
+ ifFalse: [16rAAAAAAAAAAAAAAAA])].
+ self assert: (mem32 copy changeClassTo: ByteArray) = (mem64 copy changeClassTo: ByteArray).
+ hack32 := Form new hackBits: mem32.
+ hack64 := Form new hackBits: mem64.
+ disp32 := Form new hackBits: (ByteArray new: 65536).
+ disp64 := Form new hackBits: (ByteArray new: 65536).
+ disp32
+ copy: (0 @ 0 extent: 4 @ (65536 / 4))
+ from: 0 @ 0
+ in: hack32
+ rule: Form over.
+ disp64
+ copy: (0 @ 0 extent: 4 @ (65536 / 4))
+ from: 0 @ 0
+ in: hack64
+ rule: Form over.
+ 1 to: 65536 by: 8 do:
+ [:i|
+ self assert: ((i // 8) even
+ ifTrue: [16r5555555555555555]
+ ifFalse: [16rAAAAAAAAAAAAAAAA])
+ equals: (disp32 bits unsignedLong64At: i).
+ self assert: ((i // 8) even
+ ifTrue: [16r5555555555555555]
+ ifFalse: [16rAAAAAAAAAAAAAAAA])
+ equals: (disp64 bits unsignedLong64At: i)]
+ !