(no commit message)
[libreriscv.git] / openpower / sv / grevlut_v2.py
1
2 def andor(imm, a, b, ainv, binv):
3 inbits = [a, b, ainv, binv]
4 res = 0
5 for i in range(4):
6 if ((imm >> i) & 0b1) & inbits[i]:
7 res = 1
8 return res
9
10 def dorow(imm8, step_i, chunk_size):
11 step_o = 0
12 for j in range(64):
13 if (j&chunk_size) == 0:
14 imm = (imm8 & 0b1111)
15 else:
16 imm = (imm8>>4)
17 a = (step_i>>j)&1
18 b = (step_i>>(j ^ chunk_size))&1
19 res = andor(imm, a, b, ~a, ~b)
20 #print(j, bin(imm), a, b, res)
21 step_o |= (res<<j)
22 #print (" ", chunk_size, bin(step_o))
23 return step_o
24
25 def grevlut64(RA, RB, imm, iv):
26 x = 0
27 if RA is None: # RA=0
28 x = 0x5555555555555555
29 else:
30 x = RA
31 if (iv): x = ~x;
32 shamt = RB & 63;
33 #print (bin(shamt), bin(63))
34 for i in range(6):
35 step = 1<<i
36 if shamt & step:
37 x = dorow(imm, x, step)
38 return x & ((1<<64)-1)
39
40
41 if __name__ == '__main__':
42 imm = 0b0110
43 a = 1
44 b = 0
45 print (andor(imm, a, b, ~a, ~b))
46
47 # answer: 8888888...
48 RB = 0b0000
49 imm = 0b1100_0110
50 x = grevlut64(None, RB, imm, 1)
51 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
52
53 # answer: 8888888...
54 RB = 0b000001
55 imm = 0b10001000
56 x = grevlut64(None, RB, imm, 1)
57 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
58
59 exit(0)
60
61 # answer: 80808080...
62 RB = 0b00110
63 imm = 0b11000110
64 x = grevlut64(None, RB, imm, 1)
65 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
66
67 # answer: 80008000...
68 RB = 0b01110
69 imm = 0b11000110
70 x = grevlut64(None, RB, imm, 1)
71 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
72 print()
73
74 # answer: 01010101...
75 RB = 0b00110
76 imm = 0b01101100
77 x = grevlut64(None, RB, imm, 0)
78 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
79
80 # answer: 00010001...
81 RB = 0b01110
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 = 0b11000110
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 = 0b01101100
95 x = grevlut64(None, RB, imm, 0)
96 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
97 print()
98
99 for RB in range(64):
100 imm = 0b10011010
101 x = grevlut64(None, RB, imm, 1)
102 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
103 print()
104
105 for RB in range(64):
106 imm = 0b01011010
107 x = grevlut64(None, RB, imm, 1)
108 print ("grevlut", bin(RB), bin(imm), hex(x), "\n", bin(x))
109 print()
110