1 from nmutil
.sim_util
import hash_256
2 from openpower
.test
.state
import ExpectedState
3 from openpower
.simulator
.program
import Program
4 from openpower
.endian
import bigendian
5 from openpower
.insndb
.asm
import SVP64Asm
6 from openpower
.test
.common
import TestAccumulatorBase
, skip_case
10 class LogicalTestCase(TestAccumulatorBase
):
11 def case_complement(self
):
12 insns
= ["andc", "orc", "nand", "nor"]
14 choice
= random
.choice(insns
)
15 lst
= [f
"{choice} 3, 1, 2"]
16 initial_regs
= [0] * 32
17 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
18 initial_regs
[2] = random
.randint(0, (1 << 64)-1)
19 self
.add_case(Program(lst
, bigendian
), initial_regs
)
22 insns
= ["and", "or", "xor", "eqv"]
24 choice
= random
.choice(insns
)
25 lst
= [f
"{choice} 3, 1, 2"]
26 initial_regs
= [0] * 32
27 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
28 initial_regs
[2] = random
.randint(0, (1 << 64)-1)
29 self
.add_case(Program(lst
, bigendian
), initial_regs
)
32 insns
= ["and.", "or.", "xor.", "eqv.", "andc.",
33 "orc.", "nand.", "nor."]
34 for XER
in [0, 0xe00c0000]:
36 choice
= random
.choice(insns
)
37 lst
= [f
"{choice} 3, 1, 2"]
38 initial_regs
= [0] * 32
39 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
40 initial_regs
[2] = random
.randint(0, (1 << 64)-1)
41 self
.add_case(Program(lst
, bigendian
), initial_regs
,
42 initial_sprs
={'XER': XER
})
44 def case_rand_imm_so(self
):
45 insns
= ["andi.", "andis."]
47 choice
= random
.choice(insns
)
48 imm
= random
.randint(0, (1 << 16)-1)
49 lst
= [f
"{choice} 3, 1, {imm}"]
51 initial_regs
= [0] * 32
52 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
53 initial_sprs
= {'XER': 0xe00c0000}
55 self
.add_case(Program(lst
, bigendian
), initial_regs
,
56 initial_sprs
=initial_sprs
)
58 def case_rand_imm_logical(self
):
59 insns
= ["andi.", "andis.", "ori", "oris", "xori", "xoris"]
61 choice
= random
.choice(insns
)
62 imm
= random
.randint(0, (1 << 16)-1)
63 lst
= [f
"{choice} 3, 1, {imm}"]
65 initial_regs
= [0] * 32
66 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
67 self
.add_case(Program(lst
, bigendian
), initial_regs
)
70 insns
= ["cntlzd", "cnttzd", "cntlzw", "cnttzw"]
72 choice
= random
.choice(insns
)
73 lst
= [f
"{choice} 3, 1"]
75 initial_regs
= [0] * 32
76 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
77 self
.add_case(Program(lst
, bigendian
), initial_regs
)
79 def case_parity(self
):
80 insns
= ["prtyw", "prtyd"]
82 choice
= random
.choice(insns
)
83 lst
= [f
"{choice} 3, 1"]
85 initial_regs
= [0] * 32
86 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
87 self
.add_case(Program(lst
, bigendian
), initial_regs
)
89 def case_popcnt(self
):
90 insns
= ["popcntb", "popcntw", "popcntd"]
92 choice
= random
.choice(insns
)
93 lst
= [f
"{choice} 3, 1"]
95 initial_regs
= [0] * 32
96 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
97 self
.add_case(Program(lst
, bigendian
), initial_regs
)
99 def case_popcnt_edge(self
):
100 insns
= ["popcntb", "popcntw", "popcntd"]
102 lst
= [f
"{choice} 3, 1"]
103 initial_regs
= [0] * 32
105 self
.add_case(Program(lst
, bigendian
), initial_regs
)
108 lst
= ["cmpb 3, 1, 2"]
109 initial_regs
= [0] * 32
110 initial_regs
[1] = 0xdeadbeefcafec0de
111 initial_regs
[2] = 0xd0adb0000afec1de
112 self
.add_case(Program(lst
, bigendian
), initial_regs
)
114 def case_bpermd(self
):
115 lst
= ["bpermd 3, 1, 2"]
117 initial_regs
= [0] * 32
118 initial_regs
[1] = 1 << random
.randint(0, 63)
119 initial_regs
[2] = 0xdeadbeefcafec0de
120 self
.add_case(Program(lst
, bigendian
), initial_regs
)
122 def case_bpermd_morerandom(self
):
123 lst
= ["bpermd 3, 1, 2"]
125 initial_regs
= [0] * 32
126 initial_regs
[1] = random
.randint(0, (1 << 64)-1)
127 initial_regs
[2] = random
.randint(0, (1 << 64)-1)
128 self
.add_case(Program(lst
, bigendian
), initial_regs
)
130 def case_cfuged(self
):
131 prog
= Program(list(SVP64Asm(["cfuged 3,4,5"])), bigendian
)
132 for case_idx
in range(200):
134 gprs
[4] = hash_256(f
"cfuged {case_idx} r4") % 2**64
135 gprs
[5] = hash_256(f
"cfuged {case_idx} r5") % 2**64
136 e
= ExpectedState(pc
=4, int_regs
=gprs
)
142 ones
.append(bool(gprs
[4] & bit
))
144 zeros
.append(bool(gprs
[4] & bit
))
147 for i
, v
in enumerate(bits
):
148 e
.intregs
[3] |
= v
<< i
150 case_idx
=case_idx
, RS_in
=hex(gprs
[4]),
151 RB_in
=hex(gprs
[5]), expected_RA
=hex(e
.intregs
[3])):
152 self
.add_case(prog
, gprs
, expected
=e
)
154 def case_cntlzdm(self
):
155 prog
= Program(list(SVP64Asm(["cntlzdm 3,4,5"])), bigendian
)
156 for case_idx
in range(200):
158 gprs
[4] = hash_256(f
"cntlzdm {case_idx} r4") % 2**64
159 gprs
[5] = hash_256(f
"cntlzdm {case_idx} r5") % 2**64
160 e
= ExpectedState(pc
=4, int_regs
=gprs
)
162 for i
in reversed(range(64)):
170 case_idx
=case_idx
, RS_in
=hex(gprs
[4]),
171 RB_in
=hex(gprs
[5]), expected_RA
=hex(e
.intregs
[3])):
172 self
.add_case(prog
, gprs
, expected
=e
)
174 def case_cnttzdm(self
):
175 prog
= Program(list(SVP64Asm(["cnttzdm 3,4,5"])), bigendian
)
176 for case_idx
in range(200):
178 gprs
[4] = hash_256(f
"cnttzdm {case_idx} r4") % 2**64
179 gprs
[5] = hash_256(f
"cnttzdm {case_idx} r5") % 2**64
180 e
= ExpectedState(pc
=4, int_regs
=gprs
)
190 case_idx
=case_idx
, RS_in
=hex(gprs
[4]),
191 RB_in
=hex(gprs
[5]), expected_RA
=hex(e
.intregs
[3])):
192 self
.add_case(prog
, gprs
, expected
=e
)
194 def case_pdepd(self
):
195 prog
= Program(list(SVP64Asm(["pdepd 3,4,5"])), bigendian
)
196 for case_idx
in range(200):
198 gprs
[4] = hash_256(f
"pdepd {case_idx} r4") % 2**64
199 gprs
[5] = hash_256(f
"pdepd {case_idx} r5") % 2**64
200 e
= ExpectedState(pc
=4, int_regs
=gprs
)
206 if gprs
[4] & (1 << j
):
210 case_idx
=case_idx
, RS_in
=hex(gprs
[4]),
211 RB_in
=hex(gprs
[5]), expected_RA
=hex(e
.intregs
[3])):
212 self
.add_case(prog
, gprs
, expected
=e
)
214 def case_pextd(self
):
215 prog
= Program(list(SVP64Asm(["pextd 3,4,5"])), bigendian
)
216 for case_idx
in range(200):
218 gprs
[4] = hash_256(f
"pextd {case_idx} r4") % 2**64
219 gprs
[5] = hash_256(f
"pextd {case_idx} r5") % 2**64
220 e
= ExpectedState(pc
=4, int_regs
=gprs
)
227 e
.intregs
[3] |
= 1 << j
230 case_idx
=case_idx
, RS_in
=hex(gprs
[4]),
231 RB_in
=hex(gprs
[5]), expected_RA
=hex(e
.intregs
[3])):
232 self
.add_case(prog
, gprs
, expected
=e
)