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_absdu(self
):
225 lst
= ["absdu 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_absdu(self
):
238 lst
= ["absdu 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_2_absdu(self
):
251 lst
= ["absdu 3, 1, 2"]
252 lst
= list(SVP64Asm(lst
, bigendian
))
254 initial_regs
= [0] * 32
255 initial_regs
[1] = 0x2
256 initial_regs
[2] = 0xffffffffffffffff
257 e
= ExpectedState(pc
=4)
259 e
.intregs
[2] = 0xffffffffffffffff
261 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
263 def case_0_absaddu(self
):
264 lst
= ["absaddu 3, 1, 2",
267 lst
= list(SVP64Asm(lst
, bigendian
))
269 initial_regs
= [0] * 32
270 initial_regs
[1] = 0x2
271 initial_regs
[2] = 0x1
272 initial_regs
[4] = 0x9
273 initial_regs
[5] = 0x3
274 e
= ExpectedState(pc
=8)
280 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
282 def case_1_absaddu(self
):
283 lst
= ["absaddu 3, 1, 2",
286 lst
= list(SVP64Asm(lst
, bigendian
))
288 initial_regs
= [0] * 32
289 initial_regs
[1] = 0x1
290 initial_regs
[2] = 0x2
291 initial_regs
[4] = 0x9
292 initial_regs
[5] = 0x3
293 e
= ExpectedState(pc
=8)
299 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
301 def case_2_absaddu(self
):
302 """weird case where there's a negative number
303 * -1 is greater than 2 (as an unsigned number)
304 therefore difference is (-1)-(2) which is -3
308 * 9 is greater than 3
309 therefore differences is (9)-(3) which is 6
315 lst
= ["absaddu 3, 1, 2",
318 lst
= list(SVP64Asm(lst
, bigendian
))
320 initial_regs
= [0] * 32
321 initial_regs
[1] = 0x2
322 initial_regs
[2] = 0xffffffffffffffff
323 initial_regs
[4] = 0x9
324 initial_regs
[5] = 0x3
325 e
= ExpectedState(pc
=8)
327 e
.intregs
[2] = 0xffffffffffffffff
328 e
.intregs
[3] = 0x3 # ((-1)-(2)) + ((9)-(3))
331 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
333 def case_0_absadds(self
):
334 lst
= ["absadds 3, 1, 2",
337 lst
= list(SVP64Asm(lst
, bigendian
))
339 initial_regs
= [0] * 32
340 initial_regs
[1] = 0x2
341 initial_regs
[2] = 0x1
342 initial_regs
[4] = 0x9
343 initial_regs
[5] = 0x3
344 e
= ExpectedState(pc
=8)
350 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)
352 def case_2_absadds(self
):
353 """unlike the absaddu weird case, the 0xfff is treated as signed
354 so (2) < (-1) and the difference is (2--1)=3. next instruction
355 adds 6 more. answer: 9
357 lst
= ["absadds 3, 1, 2",
360 lst
= list(SVP64Asm(lst
, bigendian
))
362 initial_regs
= [0] * 32
363 initial_regs
[1] = 0x2
364 initial_regs
[2] = 0xffffffffffffffff
365 initial_regs
[4] = 0x9
366 initial_regs
[5] = 0x3
367 e
= ExpectedState(pc
=8)
369 e
.intregs
[2] = 0xffffffffffffffff
373 self
.add_case(Program(lst
, bigendian
), initial_regs
, expected
=e
)