Begin adding helper functions for PPC pseudocode compiler
[soc.git] / src / soc / decoder / helpers.py
1 import unittest
2 def exts(value, bits):
3 sign = 1 << (bits - 1)
4 return (value * (sign - 1)) - (value * sign)
5
6 def EXTS64(value):
7 return exts(value, 64) & ((1<<64)-1)
8
9 def ROTL64(value, bits):
10 mask = (1 << 64) - 1
11 bits = bits & 63
12 return ((value << bits) | (value >> (64-bits))) & mask
13
14 def mask(x, y):
15 if x < y:
16 x = 64-x
17 y = 63-y
18 mask_a = ((1<<x) - 1) & ((1<<64) - 1)
19 mask_b = ((1<<y) - 1) & ((1<<64) - 1)
20 else:
21 x = 64-x
22 y = 63-y
23 mask_a = ((1<<x) - 1) & ((1<<64) - 1)
24 mask_b = (~((1<<y) - 1)) & ((1<<64) - 1)
25 return mask_a ^ mask_b
26
27
28 class HelperTests(unittest.TestCase):
29 def test_mask(self):
30 # Verified using rlwinm, rldicl, rldicr in qemu
31 # rlwinm reg, 0, 5, 15
32 self.assertHex(mask(5+32, 15+32), 0x7ff0000)
33 # rlwinm reg, 0, 15, 5
34 self.assertHex(mask(15+32, 5+32), 0xfffffffffc01ffff)
35 self.assertHex(mask(30+32, 2+32), 0xffffffffe0000003)
36 # rldicl reg, 0, 37
37 self.assertHex(mask(37, 63), 0x7ffffff)
38 self.assertHex(mask(10, 63), 0x3fffffffffffff)
39 self.assertHex(mask(58, 63), 0x3f)
40 # rldicr reg, 0, 37
41 self.assertHex(mask(0, 37), 0xfffffffffc000000)
42 self.assertHex(mask(0, 10), 0xffe0000000000000)
43 self.assertHex(mask(0, 58), 0xffffffffffffffe0)
44 def assertHex(self, a, b):
45 msg = "{:x} != {:x}".format(a, b)
46 return self.assertEqual(a, b, msg)
47
48 if __name__ == '__main__':
49 unittest.main()