1 from openpower
.sv
.trans
.svp64
import SVP64Asm
3 from openpower
.test
.common
import TestAccumulatorBase
4 from openpower
.endian
import bigendian
5 from openpower
.simulator
.program
import Program
6 from openpower
.decoder
.selectable_int
import SelectableInt
7 from openpower
.decoder
.power_enums
import XER_bits
8 from openpower
.decoder
.isa
.caller
import special_sprs
9 from openpower
.decoder
.helpers
import exts
10 from openpower
.test
.state
import ExpectedState
14 class AVTestCase(TestAccumulatorBase
):
16 def case_0_maxs(self
):
17 lst
= ["maxs 3, 1, 2"]
18 lst
= list(SVP64Asm(lst
, bigendian
))
20 initial_regs
= [0] * 32
21 initial_regs
[1] = 0xc523e996a8ff6215
22 initial_regs
[2] = 0xe1e5b9cc9864c4a8
23 e
= ExpectedState(pc
=4)
24 e
.intregs
[1] = 0xc523e996a8ff6215
25 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
26 e
.intregs
[3] = 0xe1e5b9cc9864c4a8
27 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
29 def case_1_maxs(self
):
30 lst
= ["maxs 3, 1, 2"]
31 lst
= list(SVP64Asm(lst
, bigendian
))
33 initial_regs
= [0] * 32
34 initial_regs
[1] = 0xe1e5b9cc9864c4a8
35 initial_regs
[2] = 0xc523e996a8ff6215
36 e
= ExpectedState(pc
=4)
37 e
.intregs
[1] = 0xe1e5b9cc9864c4a8
38 e
.intregs
[2] = 0xc523e996a8ff6215
39 e
.intregs
[3] = 0xe1e5b9cc9864c4a8
40 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
42 def case_2_maxs_(self
):
43 lst
= [f
"maxs. 3, 1, 2"]
44 lst
= list(SVP64Asm(lst
, bigendian
))
46 initial_regs
= [0] * 32
47 initial_regs
[1] = 0xc523e996a8ff6215
48 initial_regs
[2] = 0xe1e5b9cc9864c4a8
49 e
= ExpectedState(pc
=4)
50 e
.intregs
[1] = 0xc523e996a8ff6215
51 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
52 e
.intregs
[3] = 0xe1e5b9cc9864c4a8
54 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
56 def case_3_maxs_(self
):
57 lst
= [f
"maxs. 3, 1, 2"]
58 lst
= list(SVP64Asm(lst
, bigendian
))
60 initial_regs
= [0] * 32
61 initial_regs
[1] = 0xc523e996a8ff6215
63 e
= ExpectedState(pc
=4)
64 e
.intregs
[1] = 0xc523e996a8ff6215
67 e
.crregs
[0] = 0x2 # RT is zero
68 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
70 def case_4_maxs_(self
):
71 lst
= [f
"maxs. 3, 1, 2"]
72 lst
= list(SVP64Asm(lst
, bigendian
))
74 initial_regs
= [0] * 32
77 e
= ExpectedState(pc
=4)
81 e
.crregs
[0] = 0x4 # RT is +ve
82 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
84 def case_5_maxs_(self
):
85 """max negative number compared against +ve number
87 lst
= [f
"maxs. 3, 1, 2"]
88 lst
= list(SVP64Asm(lst
, bigendian
))
90 initial_regs
= [0] * 32
92 initial_regs
[2] = 0x8000_0000_0000_0000
93 e
= ExpectedState(pc
=4)
95 e
.intregs
[2] = 0x8000_0000_0000_0000
97 e
.crregs
[0] = 0x4 # RT is +ve
98 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
100 def case_0_mins(self
):
101 lst
= ["mins 3, 1, 2"]
102 lst
= list(SVP64Asm(lst
, bigendian
))
104 initial_regs
= [0] * 32
105 initial_regs
[1] = 0xc523e996a8ff6215
106 initial_regs
[2] = 0xe1e5b9cc9864c4a8
107 e
= ExpectedState(pc
=4)
108 e
.intregs
[1] = 0xc523e996a8ff6215
109 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
110 e
.intregs
[3] = 0xc523e996a8ff6215
111 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
113 def case_2_mins_(self
):
114 lst
= [f
"mins. 3, 1, 2"]
115 lst
= list(SVP64Asm(lst
, bigendian
))
117 initial_regs
= [0] * 32
118 initial_regs
[1] = 0xc523e996a8ff6215
119 initial_regs
[2] = 0xe1e5b9cc9864c4a8
120 e
= ExpectedState(pc
=4)
121 e
.intregs
[1] = 0xc523e996a8ff6215
122 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
123 e
.intregs
[3] = 0xc523e996a8ff6215
125 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
127 def case_5_mins_(self
):
128 """min negative number compared against +ve number
130 lst
= [f
"mins. 3, 1, 2"]
131 lst
= list(SVP64Asm(lst
, bigendian
))
133 initial_regs
= [0] * 32
135 initial_regs
[2] = 0x8000_0000_0000_0000
136 e
= ExpectedState(pc
=4)
138 e
.intregs
[2] = 0x8000_0000_0000_0000
139 e
.intregs
[3] = 0x8000_0000_0000_0000
140 e
.crregs
[0] = 0x8 # RT is -ve
141 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
143 def case_0_maxu(self
):
144 lst
= ["maxu 3, 1, 2"]
145 lst
= list(SVP64Asm(lst
, bigendian
))
147 initial_regs
= [0] * 32
148 initial_regs
[1] = 0xc523e996a8ff6215
149 initial_regs
[2] = 0xe1e5b9cc9864c4a8
150 e
= ExpectedState(pc
=4)
151 e
.intregs
[1] = 0xc523e996a8ff6215
152 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
153 e
.intregs
[3] = 0xe1e5b9cc9864c4a8
154 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
156 def case_5_minu_(self
):
159 lst
= [f
"minu. 3, 1, 2"]
160 lst
= list(SVP64Asm(lst
, bigendian
))
162 initial_regs
= [0] * 32
164 initial_regs
[2] = 0x8000_0000_0000_0000
165 e
= ExpectedState(pc
=4)
167 e
.intregs
[2] = 0x8000_0000_0000_0000
168 e
.intregs
[3] = min(e
.intregs
[1], e
.intregs
[2])
170 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
172 def case_0_avgadd(self
):
173 lst
= ["avgadd 3, 1, 2"]
174 lst
= list(SVP64Asm(lst
, bigendian
))
176 initial_regs
= [0] * 32
177 initial_regs
[1] = 0xc523e996a8ff6215
178 initial_regs
[2] = 0xe1e5b9cc9864c4a8
179 e
= ExpectedState(pc
=4)
180 e
.intregs
[1] = 0xc523e996a8ff6215
181 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
182 e
.intregs
[3] = 0xd384d1b1a0b2135f
183 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
185 def case_1_avgadd(self
):
186 lst
= ["avgadd 3, 1, 2"]
187 lst
= list(SVP64Asm(lst
, bigendian
))
189 initial_regs
= [0] * 32
190 initial_regs
[1] = 0xc523e996a8ff6214
191 initial_regs
[2] = 0xe1e5b9cc9864c4a8
192 e
= ExpectedState(pc
=4)
193 e
.intregs
[1] = 0xc523e996a8ff6214
194 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
195 e
.intregs
[3] = 0xd384d1b1a0b2135e
196 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
198 def case_2_avgadd(self
):
199 lst
= ["avgadd 3, 1, 2"]
200 lst
= list(SVP64Asm(lst
, bigendian
))
202 initial_regs
= [0] * 32
203 initial_regs
[1] = 0xc523e996a8ff6213
204 initial_regs
[2] = 0xe1e5b9cc9864c4a8
205 e
= ExpectedState(pc
=4)
206 e
.intregs
[1] = 0xc523e996a8ff6213
207 e
.intregs
[2] = 0xe1e5b9cc9864c4a8
208 e
.intregs
[3] = 0xd384d1b1a0b2135e
209 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
211 def case_3_avgadd(self
):
212 lst
= ["avgadd 3, 1, 2"]
213 lst
= list(SVP64Asm(lst
, bigendian
))
215 initial_regs
= [0] * 32
216 initial_regs
[1] = 0xffffffffffffffff
217 initial_regs
[2] = 0xffffffffffffffff
218 e
= ExpectedState(pc
=4)
219 e
.intregs
[1] = 0xffffffffffffffff
220 e
.intregs
[2] = 0xffffffffffffffff
221 e
.intregs
[3] = 0xffffffffffffffff
222 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
224 def case_0_absds(self
):
225 lst
= ["absds 3, 1, 2"]
226 lst
= list(SVP64Asm(lst
, bigendian
))
228 initial_regs
= [0] * 32
229 initial_regs
[1] = 0x1
230 initial_regs
[2] = 0x2
231 e
= ExpectedState(pc
=4)
235 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
237 def case_1_absds(self
):
238 lst
= ["absds 3, 1, 2"]
239 lst
= list(SVP64Asm(lst
, bigendian
))
241 initial_regs
= [0] * 32
242 initial_regs
[1] = 0xffffffffffffffff
243 initial_regs
[2] = 0x2
244 e
= ExpectedState(pc
=4)
245 e
.intregs
[1] = 0xffffffffffffffff
248 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
250 def case_0_absdu(self
):
251 lst
= ["absdu 3, 1, 2"]
252 lst
= list(SVP64Asm(lst
, bigendian
))
254 initial_regs
= [0] * 32
255 initial_regs
[1] = 0x1
256 initial_regs
[2] = 0x2
257 e
= ExpectedState(pc
=4)
261 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
263 def case_1_absdu(self
):
264 lst
= ["absdu 3, 1, 2"]
265 lst
= list(SVP64Asm(lst
, bigendian
))
267 initial_regs
= [0] * 32
268 initial_regs
[1] = 0xffffffffffffffff
269 initial_regs
[2] = 0x2
270 e
= ExpectedState(pc
=4)
271 e
.intregs
[1] = 0xffffffffffffffff
273 e
.intregs
[3] = 0xfffffffffffffffd
274 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
276 def case_2_absdu(self
):
277 lst
= ["absdu 3, 1, 2"]
278 lst
= list(SVP64Asm(lst
, bigendian
))
280 initial_regs
= [0] * 32
281 initial_regs
[1] = 0x2
282 initial_regs
[2] = 0xffffffffffffffff
283 e
= ExpectedState(pc
=4)
285 e
.intregs
[2] = 0xffffffffffffffff
286 e
.intregs
[3] = 0xfffffffffffffffd
287 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
289 def case_0_absdacu(self
):
290 lst
= ["absdacu 3, 1, 2",
293 lst
= list(SVP64Asm(lst
, bigendian
))
295 initial_regs
= [0] * 32
296 initial_regs
[1] = 0x2
297 initial_regs
[2] = 0x1
298 initial_regs
[4] = 0x9
299 initial_regs
[5] = 0x3
300 e
= ExpectedState(pc
=8)
306 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
308 def case_1_absdacu(self
):
309 lst
= ["absdacu 3, 1, 2",
312 lst
= list(SVP64Asm(lst
, bigendian
))
314 initial_regs
= [0] * 32
315 initial_regs
[1] = 0x1
316 initial_regs
[2] = 0x2
317 initial_regs
[4] = 0x9
318 initial_regs
[5] = 0x3
319 e
= ExpectedState(pc
=8)
325 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
327 def case_2_absdacu(self
):
328 """weird case where there's a negative number
329 * -1 is greater than 2 (as an unsigned number)
330 therefore difference is (-1)-(2) which is -3
334 * 9 is greater than 3
335 therefore differences is (9)-(3) which is 6
341 lst
= ["absdacu 3, 1, 2",
344 lst
= list(SVP64Asm(lst
, bigendian
))
346 initial_regs
= [0] * 32
347 initial_regs
[1] = 0x2
348 initial_regs
[2] = 0xffffffffffffffff
349 initial_regs
[4] = 0x9
350 initial_regs
[5] = 0x3
351 e
= ExpectedState(pc
=8)
353 e
.intregs
[2] = 0xffffffffffffffff
354 e
.intregs
[3] = 0x3 # ((-1)-(2)) + ((9)-(3))
357 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
359 def case_0_absdacs(self
):
360 lst
= ["absdacs 3, 1, 2",
363 lst
= list(SVP64Asm(lst
, bigendian
))
365 initial_regs
= [0] * 32
366 initial_regs
[1] = 0x2
367 initial_regs
[2] = 0x1
368 initial_regs
[4] = 0x9
369 initial_regs
[5] = 0x3
370 e
= ExpectedState(pc
=8)
376 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
378 def case_2_absdacs(self
):
379 """unlike the absdacu weird case, the 0xfff is treated as signed
380 so (2) < (-1) and the difference is (2--1)=3. next instruction
381 adds 6 more. answer: 9
383 lst
= ["absdacs 3, 1, 2",
386 lst
= list(SVP64Asm(lst
, bigendian
))
388 initial_regs
= [0] * 32
389 initial_regs
[1] = 0x2
390 initial_regs
[2] = 0xffffffffffffffff
391 initial_regs
[4] = 0x9
392 initial_regs
[5] = 0x3
393 e
= ExpectedState(pc
=8)
395 e
.intregs
[2] = 0xffffffffffffffff
399 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
401 def case_0_cprop(self
):
402 lst
= ["cprop 3, 1, 2" ]
403 lst
= list(SVP64Asm(lst
, bigendian
))
409 initial_regs
= [0] * 32
410 initial_regs
[1] = reg_a
411 initial_regs
[2] = reg_b
412 e
= ExpectedState(pc
=last_pc
)
416 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
418 def case_1_cprop(self
):
419 lst
= ["cprop 3, 1, 2" ]
420 lst
= list(SVP64Asm(lst
, bigendian
))
426 initial_regs
= [0] * 32
427 initial_regs
[1] = reg_a
428 initial_regs
[2] = reg_b
429 e
= ExpectedState(pc
=last_pc
)
433 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
435 def case_2_cprop(self
):
436 lst
= ["cprop 3, 1, 2" ]
437 lst
= list(SVP64Asm(lst
, bigendian
))
443 initial_regs
= [0] * 32
444 initial_regs
[1] = reg_a
445 initial_regs
[2] = reg_b
446 e
= ExpectedState(pc
=last_pc
)
450 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
452 def case_0_bmask(self
):
454 https://git.libre-soc.org/?p=libreriscv.git;a=blob;f=openpower/sv/bmask.py
455 https://git.libre-soc.org/?p=libreriscv.git;a=blob;f=openpower/sv/test_bmask.py
456 https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=openpower/isa/av.mdwn;hb=HEAD
457 SBF = 0b01010 # set before first
458 SOF = 0b01001 # set only first
459 SIF = 0b10000 # set including first 10011 also works no idea why yet
461 lst
= ["bmask 3, 1, 2, 10, 0" ]
462 lst
= list(SVP64Asm(lst
, bigendian
))
468 initial_regs
= [0] * 32
469 initial_regs
[1] = reg_a
470 initial_regs
[2] = reg_b
471 e
= ExpectedState(pc
=last_pc
)
475 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)