(no commit message)
[libreriscv.git] / openpower / sv / grevlut.py
1 def lut2(imm, a, b):
2 idx = b << 1 | a
3 return (imm>>idx) & 1
4
5 def dorow(imm8, step_i, chunk_size):
6 step_o = 0
7 for j in range(64):
8 if (j&chunk_size) == 0:
9 imm = (imm8 & 0b1111)
10 else:
11 imm = (imm8>>4)
12 a = (step_i>>j)&1
13 b = (step_i>>(j ^ chunk_size))&1
14 res = lut2(imm, a, b)
15 #print(j, bin(imm), a, b, res)
16 step_o |= (res<<j)
17 #print (" ", chunk_size, bin(step_o))
18 return step_o
19
20 def grevlut64(RA, RB, imm, iv):
21 x = 0
22 if RA is None: # RA=0
23 x = 0x5555555555555555
24 else:
25 x = RA
26 if (iv): x = ~x;
27 shamt = RB & 63;
28 #print (bin(shamt), bin(63))
29 for i in range(6):
30 step = 1<<i
31 if (shamt & step):
32 x = dorow(imm, x, step)
33 return x & ((1<<64)-1)
34
35
36 if __name__ == '__main__':
37 # answer: 8888888...
38 RB = 0b0000
39 imm = 0b11000110
40 x = grevlut64(None, RB, imm, 1)
41 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
42
43 # answer: 8888888...
44 RB = 0b0010
45 imm = 0b11000110
46 x = grevlut64(None, RB, imm, 1)
47 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
48
49 # answer: 80808080...
50 RB = 0b00110
51 imm = 0b11000110
52 x = grevlut64(None, RB, imm, 1)
53 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
54
55 # answer: 80008000...
56 RB = 0b01110
57 imm = 0b11000110
58 x = grevlut64(None, RB, imm, 1)
59 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
60 print()
61
62 # answer: 01010101...
63 RB = 0b00110
64 imm = 0b01101100
65 x = grevlut64(None, RB, imm, 0)
66 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
67
68 # answer: 00010001...
69 RB = 0b01110
70 imm = 0b01101100
71 x = grevlut64(None, RB, imm, 0)
72 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
73 print()
74
75 for RB in range(64):
76 imm = 0b11000110
77 x = grevlut64(None, RB, imm, 1)
78 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
79 print()
80
81 for RB in range(64):
82 imm = 0b01101100
83 x = grevlut64(None, RB, imm, 0)
84 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
85 print()
86
87 for RB in range(64):
88 imm = 0b10011010
89 x = grevlut64(None, RB, imm, 1)
90 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
91 print()
92
93 for RB in range(64):
94 imm = 0b01011010
95 x = grevlut64(None, RB, imm, 1)
96 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
97 print()
98