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)] + ! |
Free forum by Nabble | Edit this page |