change ternlogi to not have Rc field
[openpower-isa.git] / src / openpower / test / bitmanip / bitmanip_cases.py
1 from openpower.test.common import TestAccumulatorBase, skip_case
2 from openpower.endian import bigendian
3 from openpower.simulator.program import Program
4 from hashlib import sha256
5
6
7 def hash_256(v):
8 return int.from_bytes(
9 sha256(bytes(v, encoding='utf-8')).digest(),
10 byteorder='little'
11 )
12
13
14 class BitManipTestCase(TestAccumulatorBase):
15 def do_case_ternlogi(self, rt_v, ra_v, rb_v, imm):
16 po = 5
17 xo = 0
18 rt = 3
19 ra = 4
20 rb = 5
21 instr = po
22 instr = (instr << 5) | rt
23 instr = (instr << 5) | ra
24 instr = (instr << 5) | rb
25 instr = (instr << 8) | imm
26 instr = (instr << 3) | xo
27 asm = f"ternlogi {rt}, {ra}, {rb}, {imm}"
28 lst = [f".4byte {hex(instr)} # {asm}"]
29 initial_regs = [0] * 32
30 initial_regs[3] = rt_v % 2 ** 64
31 initial_regs[4] = ra_v % 2 ** 64
32 initial_regs[5] = rb_v % 2 ** 64
33 self.add_case(Program(lst, bigendian), initial_regs)
34
35 def case_ternlogi_0(self):
36 self.do_case_ternlogi(0x8000_0000_FFFF_0000,
37 0x8000_0000_FF00_FF00,
38 0x8000_0000_F0F0_F0F0, 0x80)
39
40 def case_ternlogi_FF(self):
41 self.do_case_ternlogi(0, 0, 0, 0xFF)
42
43 def case_ternlogi_random(self):
44 for i in range(100):
45 imm = hash_256(f"ternlogi imm {i}") & 0xFF
46 rt_v = hash_256(f"ternlogi rt {i}") % 2 ** 64
47 ra_v = hash_256(f"ternlogi ra {i}") % 2 ** 64
48 rb_v = hash_256(f"ternlogi rb {i}") % 2 ** 64
49 self.do_case_ternlogi(rt_v, ra_v, rb_v, imm)