2 from soc
.decoder
.selectable_int
import SelectableInt
7 return (value
& (sign
- 1)) - (value
& sign
)
11 if isinstance(value
, SelectableInt
):
13 return SelectableInt(exts(value
, 32) & ((1 << 64)-1), 64)
17 if isinstance(value
, SelectableInt
):
19 return SelectableInt(value
& ((1<<32)-1), 64)
21 def rotl(value
, bits
, wordlen
):
22 mask
= (1 << wordlen
) - 1
23 bits
= bits
& (wordlen
- 1)
24 return ((value
<< bits
) |
(value
>> (wordlen
-bits
))) & mask
27 def ROTL64(value
, bits
):
28 return rotl(value
, bits
, 64)
31 def ROTL32(value
, bits
):
32 return rotl(value
, bits
, 32)
39 mask_a
= ((1 << x
) - 1) & ((1 << 64) - 1)
40 mask_b
= ((1 << y
) - 1) & ((1 << 64) - 1)
44 mask_a
= ((1 << x
) - 1) & ((1 << 64) - 1)
45 mask_b
= (~
((1 << y
) - 1)) & ((1 << 64) - 1)
46 return mask_a ^ mask_b
49 # For these tests I tried to find power instructions that would let me
50 # isolate each of these helper operations. So for instance, when I was
51 # testing the MASK() function, I chose rlwinm and rldicl because if I
52 # set the shift equal to 0 and passed in a value of all ones, the
53 # result I got would be exactly the same as the output of MASK()
55 class HelperTests(unittest
.TestCase
):
57 # Verified using rlwinm, rldicl, rldicr in qemu
59 # rlwinm reg, 1, 0, 5, 15
60 self
.assertHex(MASK(5+32, 15+32), 0x7ff0000)
61 # rlwinm reg, 1, 0, 15, 5
62 self
.assertHex(MASK(15+32, 5+32), 0xfffffffffc01ffff)
63 self
.assertHex(MASK(30+32, 2+32), 0xffffffffe0000003)
64 # rldicl reg, 1, 0, 37
65 self
.assertHex(MASK(37, 63), 0x7ffffff)
66 self
.assertHex(MASK(10, 63), 0x3fffffffffffff)
67 self
.assertHex(MASK(58, 63), 0x3f)
68 # rldicr reg, 1, 0, 37
69 self
.assertHex(MASK(0, 37), 0xfffffffffc000000)
70 self
.assertHex(MASK(0, 10), 0xffe0000000000000)
71 self
.assertHex(MASK(0, 58), 0xffffffffffffffe0)
73 def test_ROTL64(self
):
74 # r1 = 0xdeadbeef12345678
75 value
= 0xdeadbeef12345678
77 # rldicl reg, 1, 10, 0
78 self
.assertHex(ROTL64(value
, 10), 0xb6fbbc48d159e37a)
79 # rldicl reg, 1, 35, 0
80 self
.assertHex(ROTL64(value
, 35), 0x91a2b3c6f56df778)
81 self
.assertHex(ROTL64(value
, 58), 0xe37ab6fbbc48d159)
82 self
.assertHex(ROTL64(value
, 22), 0xbbc48d159e37ab6f)
84 def test_ROTL32(self
):
88 # rlwinm reg, 1, 10, 0, 31
89 self
.assertHex(ROTL32(value
, 10), 0xb6fbbf7a)
90 # rlwinm reg, 1, 17, 0, 31
91 self
.assertHex(ROTL32(value
, 17), 0x7ddfbd5b)
92 self
.assertHex(ROTL32(value
, 25), 0xdfbd5b7d)
93 self
.assertHex(ROTL32(value
, 30), 0xf7ab6fbb)
95 def test_EXTS64(self
):
96 value_a
= 0xdeadbeef # r1
97 value_b
= 0x73123456 # r2
98 value_c
= 0x80000000 # r3
101 self
.assertHex(EXTS64(value_a
), 0xffffffffdeadbeef)
103 self
.assertHex(EXTS64(value_b
), value_b
)
105 self
.assertHex(EXTS64(value_c
), 0xffffffff80000000)
107 def assertHex(self
, a
, b
):
108 msg
= "{:x} != {:x}".format(a
, b
)
109 return self
.assertEqual(a
, b
, msg
)
112 if __name__
== '__main__':