1# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14definitions: []
15tests:
16  - file-name: "modu2.64"
17    isa:
18      title: Two address integer division and modulo on accumulator
19      description: >
20        Perform integer division or modulo on accumulator and register and store result into accumulator
21      exceptions:
22        - x_arith
23    commands:
24      - file-name: "op_vs_8_zero"
25        isa:
26          instructions:
27            - sig: modu2.64 v:in:u64
28              acc: inout:u64
29              prefix: unsigned
30              format: [pref_op_v_8]
31        tags: ['irtoc_ignore']
32        code-template: |
33          #
34              ldai.64 0
35              movi.64 v0, %s
36              modu2.64 v0
37              movi.64 v0, 0
38              ucmp.64 v0
39        description: Check modu2.64 with zero and various values.
40        cases:
41          - values:
42              - "0"
43            runner-options: ['run-failure']
44            description: Division by zero causes to exception.
45          - values:
46              - "1"
47          - values:
48              - "-1"
49          - values:
50              - "0x7FFFFFFFFFFFFFFF"
51          - values:
52              - "0x8000000000000000"
53          - values:
54              - "-0x7FFFFFFFFFFFFFFF"
55          - values:
56              - "-0x8000000000000000"
57          - values:
58              - "0xFFFFFFFFFFFFFFFF"
59          - values:
60              - "-0xFFFFFFFFFFFFFFFF"
61
62      - file-name: "op_vs_8_pone"
63        isa:
64          instructions:
65            - sig: modu2.64 v:in:u64
66              acc: inout:u64
67              prefix: unsigned
68              format: [pref_op_v_8]
69        tags: ['irtoc_ignore']
70        code-template: |
71          #
72              ldai.64 1
73              movi.64 v0, %s
74              modu2.64 v0
75              movi.64 v0, %s
76              ucmp.64 v0
77        description: Check modu2.64 with +1 and various values.
78        cases:
79          - values:
80              - "0"
81              - "0"
82            runner-options: ['run-failure']
83            description: Division by zero causes to exception.
84          - values:
85              - "1"
86              - "0"
87          - values:
88              - "-1"
89              - "1"
90          - values:
91              - "0x7FFFFFFFFFFFFFFF"
92              - "1"
93          - values:
94              - "0x8000000000000000"
95              - "1"
96          - values:
97              - "-0x7FFFFFFFFFFFFFFF"
98              - "1"
99          - values:
100              - "-0x8000000000000000"
101              - "1"
102          - values:
103              - "0xFFFFFFFFFFFFFFFF"
104              - "1"
105          - values:
106              - "-0xFFFFFFFFFFFFFFFF"
107              - "0"
108
109      - file-name: "op_vs_8_none"
110        isa:
111          instructions:
112            - sig: modu2.64 v:in:u64
113              acc: inout:u64
114              prefix: unsigned
115              format: [pref_op_v_8]
116        tags: ['irtoc_ignore']
117        code-template: |
118          #
119              ldai.64 -1
120              movi.64 v0, %s
121              modu2.64 v0
122              movi.64 v0, %s
123              ucmp.64 v0
124        description: Check modu2.64 with -1 and various values.
125        cases:
126          - values:
127              - "0"
128              - "0"
129            runner-options: ['run-failure']
130            description: Division by zero causes to exception.
131          - values:
132              - "1"
133              - "0"
134          - values:
135              - "-1"
136              - "0"
137          - values:
138              - "0x7FFFFFFFFFFFFFFF"
139              - "1"
140          - values:
141              - "0x8000000000000000"
142              - "0x7FFFFFFFFFFFFFFF"
143          - values:
144              - "-0x7FFFFFFFFFFFFFFF"
145              - "0x7FFFFFFFFFFFFFFE"
146          - values:
147              - "-0x8000000000000000"
148              - "0x7FFFFFFFFFFFFFFF"
149          - values:
150              - "0xFFFFFFFFFFFFFFFF"
151              - "0"
152          - values:
153              - "-0xFFFFFFFFFFFFFFFF"
154              - "0"
155
156      - file-name: "op_vs_8_pmax"
157        isa:
158          instructions:
159            - sig: modu2.64 v:in:u64
160              acc: inout:u64
161              prefix: unsigned
162              format: [pref_op_v_8]
163        tags: ['irtoc_ignore']
164        code-template: |
165          #
166              ldai.64 0x7FFFFFFFFFFFFFFF
167              movi.64 v0, %s
168              modu2.64 v0
169              movi.64 v0, %s
170              ucmp.64 v0
171        description: Check modu2.64 with +max and various values.
172        cases:
173          - values:
174              - "0"
175              - "0"
176            runner-options: ['run-failure']
177            description: Division by zero causes to exception.
178          - values:
179              - "1"
180              - "0"
181          - values:
182              - "-1"
183              - "0x7FFFFFFFFFFFFFFF"
184          - values:
185              - "0x7FFFFFFFFFFFFFFF"
186              - "0"
187          - values:
188              - "0x8000000000000000"
189              - "0x7FFFFFFFFFFFFFFF"
190          - values:
191              - "-0x7FFFFFFFFFFFFFFF"
192              - "0x7FFFFFFFFFFFFFFF"
193          - values:
194              - "-0x8000000000000000"
195              - "0x7FFFFFFFFFFFFFFF"
196          - values:
197              - "0xFFFFFFFFFFFFFFFF"
198              - "0x7FFFFFFFFFFFFFFF"
199          - values:
200              - "-0xFFFFFFFFFFFFFFFF"
201              - "0"
202
203      - file-name: "op_vs_8_nmax"
204        isa:
205          instructions:
206            - sig: modu2.64 v:in:u64
207              acc: inout:u64
208              prefix: unsigned
209              format: [pref_op_v_8]
210        tags: ['irtoc_ignore']
211        code-template: |
212          #
213              ldai.64 -0x8000000000000000
214              movi.64 v0, %s
215              modu2.64 v0
216              movi.64 v0, %s
217              ucmp.64 v0
218        description: Check modu2.64 with -max and various values.
219        cases:
220          - values:
221              - "0"
222              - "0x0"
223            runner-options: ['run-failure']
224            description: Division by zero causes to exception.
225          - values:
226              - "1"
227              - "0"
228          - values:
229              - "-1"
230              - "0x8000000000000000"
231          - values:
232              - "0x7FFFFFFFFFFFFFFF"
233              - "1"
234          - values:
235              - "0x8000000000000000"
236              - "0"
237          - values:
238              - "-0x7FFFFFFFFFFFFFFF"
239              - "0x8000000000000000"
240          - values:
241              - "-0x8000000000000000"
242              - "0"
243          - values:
244              - "0xFFFFFFFFFFFFFFFF"
245              - "0x8000000000000000"
246          - values:
247              - "-0xFFFFFFFFFFFFFFFF"
248              - "0"
249
250      - file-name: "vals"
251        isa:
252          instructions:
253            - sig: modu2.64 v:in:u64
254              acc: inout:u64
255              prefix: unsigned
256              format: [pref_op_v_8]
257        code-template: |
258          #
259              ldai.64 %s
260              movi.64 v0, %s
261              modu2.64 v0
262              movi.64 v0, %s
263              ucmp.64 v0
264        description: Check modu2.64 with various values.
265        tags: ['tsan']
266        cases:
267          - values:
268              - "0x1213CCFFB4406DDF"
269              - "0xD6A27FEE4"
270              - "0x3BC7EE533"
271          - values:
272              - "0x21550287DC927049"
273              - "0xA5AFC7DEF"
274              - "0x331A7C60"
275          - values:
276              - "0x59BD31BAE32D2792"
277              - "0xE52C66A1B"
278              - "0x9687A5816"
279          - values:
280              - "0x165CBF524AADA63"
281              - "0xFD6519C36"
282              - "0xA7CB07E7"
283          - values:
284              - "0x9DBBD916509AEA83"
285              - "0x25D0724C8"
286              - "0x2304D13AB"
287          - values:
288              - "0xC230F9B763DA2444"
289              - "0x33986D9FB"
290              - "0x318A3501A"
291          - values:
292              - "0x973164C134871573"
293              - "0x905851462"
294              - "0x47D41C843"
295          - values:
296              - "0x5A0AA5BD67CFBC3C"
297              - "0x3A33CFCD0"
298              - "0x2DCFCC2C"
299          - values:
300              - "0x9E96E63C41A2EC6B"
301              - "0x80B21D9B0"
302              - "0x29A605FAB"
303          - values:
304              - "0x47B214A1354D2806"
305              - "0x965F36821"
306              - "0x557F2C6A4"
307
308      - file-name: "op_v_8_exception"
309        isa:
310          instructions:
311            - sig: modu2.64 v:in:u64
312              acc: inout:u64
313              prefix: unsigned
314              format: [pref_op_v_8]
315        header-template: [ArithmeticException, main]
316        tags: ['irtoc_ignore']
317        code-template: |
318            #
319                ldai.64 %s
320                movi.64 v0, 0
321            begin:
322                modu2.64 v0
323            end:
324                ldai 1 # Should not reach this line
325                return
326
327            catch_AE:
328                ldai 0 # Expected panda.ArithmeticException
329                return
330
331            catch_all:
332                ldai 1 # Unexpected exception, test failed
333                return
334
335            .catch panda.ArithmeticException, begin, end, catch_AE
336            .catchall begin, end, catch_all
337        check-type: none
338        description: Check `modu2.64` throws ArithmeticException when divides by zero.
339        cases:
340          - values: ["0"]
341          - values: ["1"]
342          - values: ["0x7FFFFFFF"]
343          - values: ["0x80000000"]
344          - values: ["0xFFFFFFFF"]
345          - values: ["0x100000000"]
346          - values: ["0x7FFFFFFFFFFFFFFF"]
347          - values: ["0x8000000000000000"]
348          - values: ["0xFFFFFFFFFFFFFFFF"]
349          - values: ["-1"]
350          - values: ["-0x7FFFFFFF"]
351          - values: ["-0x80000000"]
352          - values: ["-0xFFFFFFFF"]
353          - values: ["-0x100000000"]
354          - values: ["-0x7FFFFFFFFFFFFFFF"]
355          - values: ["-0x8000000000000000"]
356          - values: ["-0xFFFFFFFFFFFFFFFF"]
357
358      - file-name: "regs"
359        isa:
360          instructions:
361            - sig: modu2.64 v:in:u64
362              acc: inout:u64
363              prefix: unsigned
364              format: [pref_op_v_8]
365        runner-options: ['compile-only']
366        code-template: |
367          #
368              modu2.64 %s
369        check-type: none
370        description: Check modu2.64 with various register numbers.
371        cases:
372          - values:
373              - "v255"
374          - values:
375              - "v256"
376            runner-options: ['compile-failure']
377
378      - file-name: "type"
379        tags: ["verifier"]
380        isa:
381          verification:
382            - acc_type
383            - v1_type
384        runner-options: ['verifier-failure', 'verifier-config']
385        header-template: []
386        code-template: |
387          .record T {}
388          .function i32 main() {
389              %s
390              *s
391              modu2.64 v0
392        check-type: exit-positive
393        description: Check 'modu2.64' with incorrect accumulator and/or register types.
394        cases:
395          - values:
396            - ldai 0
397          - values:
398            - ldai.64 0
399            id: acc_ok
400          - values:
401            - fldai 0
402          - values:
403            - fldai.64 0
404          - values:
405            - lda.null
406          - values:
407            - |
408              #
409                  movi v1, 0
410                  newarr v1, v1, i32[]
411                  lda.obj v1
412          - values:
413            - lda.str "0"
414          - values:
415            - lda.type T
416          - values:
417            - |
418              #
419                  newobj v1, T
420                  lda.obj v1
421        template-cases:
422          - values:
423            - movi v0, 1
424          - values:
425            - movi.64 v0, 1
426            exclude: [acc_ok]
427          - values:
428            - fmovi v0, 1
429          - values:
430            - fmovi.64 v0, 1
431          - values:
432            - mov.null v0
433          - values:
434            - |
435              #
436                  movi v0, 0
437                  newarr v0, v0, i32[]
438          - values:
439            - |
440              #
441                  lda.str "0"
442                  sta.obj v0
443          - values:
444            - |
445              #
446                  lda.type T
447                  sta.obj v0
448          - values:
449            - newobj v0, T
450
451
452      - file-name: uninitialized_regs
453        isa:
454          instructions:
455            - sig: modu2.64 v:in:u64
456              acc: inout:u64
457              prefix: unsigned
458              format: [pref_op_v_8]
459        description: Check 'modu2.64' with uninitialized registers.
460        tags: ["verifier"]
461        runner-options: ['verifier-failure', 'verifier-config']
462        code-template: |
463          #
464              %s
465              *s
466              modu2.64 *s
467        check-type: exit-positive
468        template-cases:
469          - values:
470              - ""
471          - values:
472              - ldai.64 0
473            exclude: [init]
474        cases:
475          - values:
476              - ""
477              - v0
478          - values:
479              - movi.64 v1, 0
480              - v1
481            id: init
482          - values:
483              - ""
484              - v8
485          - values:
486              - ""
487              - v15
488          - values:
489              - movi.64 v15, 0
490              - v15
491            id: init
492