found the 3 modes sof sif sbf including masked
[libreriscv.git] / openpower / sv / bmask.py
1 def bmask(mode, RA, RB=None, zero=False):
2 RT = RA if RB is not None and not zero else 0
3 mask = RB if RB is not None else 0xffffffffffffffff
4 RA = RA & mask
5 a1 = RA if mode&1 else ~RA
6 mode2 = (mode >> 1) & 0b11
7 if mode2 == 0:
8 a2 = -RA
9 if mode2 == 1:
10 a2 = RA-1
11 if mode2 == 2:
12 a2 = RA+1
13 if mode2 == 3:
14 a2 = ~(RA+1)
15 a1 = a1 & mask
16 a2 = a2 & mask
17 mode3 = (mode >> 3) & 0b11
18 if mode3 == 0:
19 RT = a1 | a2
20 if mode3 == 1:
21 RT = a1 & a2
22 if mode3 == 2:
23 RT = a1 ^ a2
24 return RT & mask
25
26 SBF = 0b01010
27 SOF = 0b01001
28 SIF = 0b10000 # 10011 also works no idea why yet
29
30 if __name__ == '__main__':
31 for SBF in range(32):
32 print("mode", bin(SBF))
33 m = 0b11000011
34 v3 = 0b10010100 # vmsbf.m v2, v3
35 v2 = 0b01000011 # v2
36 RT = bmask(SBF, v3, m, zero=True)
37 print(bin(v3), bin(v2), bin(RT))
38 v3 = 0b10010100 # vmsbf.m v2, v3
39 v2 = 0b00000011 # v2 contents
40 RT = bmask(SBF, v3)
41 print(bin(v3), bin(v2), bin(RT))
42 v3 = 0b10010101 # vmsbf.m v2, v3
43 v2 = 0b00000000 # v2
44 RT = bmask(SBF, v3)
45 print(bin(v3), bin(v2), bin(RT))
46 v3 = 0b00000000 # vmsbf.m v2, v3
47 v2 = 0b11111111 # v2
48 RT = bmask(SBF, v3)
49 print(bin(v3), bin(v2), bin(RT))
50 print()