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: "mod2.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: mod2.64 v:in:i64
28              acc: inout:i64
29              format: [op_v_8]
30        tags: ['irtoc_ignore']
31        code-template: |
32          #
33              ldai.64 0
34              movi.64 v0, %s
35              mod2.64 v0
36              movi.64 v0, 0
37              cmp.64 v0
38        description: Check mod2.64 with zero and various values.
39        cases:
40          - values:
41              - "0"
42            runner-options: ['run-failure']
43            description: Division by zero causes to exception.
44          - values:
45              - "1"
46          - values:
47              - "-1"
48          - values:
49              - "0x7FFFFFFFFFFFFFFF"
50          - values:
51              - "0x8000000000000000"
52          - values:
53              - "-0x7FFFFFFFFFFFFFFF"
54          - values:
55              - "-0x8000000000000000"
56          - values:
57              - "0xFFFFFFFFFFFFFFFF"
58          - values:
59              - "-0xFFFFFFFFFFFFFFFF"
60
61      - file-name: "op_vs_8_pone"
62        isa:
63          instructions:
64            - sig: mod2.64 v:in:i64
65              acc: inout:i64
66              format: [op_v_8]
67        tags: ['irtoc_ignore']
68        code-template: |
69          #
70              ldai.64 1
71              movi.64 v0, %s
72              mod2.64 v0
73              movi.64 v0, %s
74              cmp.64 v0
75        description: Check mod2.64 with +1 and various values.
76        cases:
77          - values:
78              - "0"
79              - "0x0"
80            runner-options: ['run-failure']
81            description: Division by zero causes to exception.
82          - values:
83              - "1"
84              - "0"
85          - values:
86              - "-1"
87              - "0"
88          - values:
89              - "0x7FFFFFFFFFFFFFFF"
90              - "1"
91          - values:
92              - "0x8000000000000000"
93              - "1"
94          - values:
95              - "-0x7FFFFFFFFFFFFFFF"
96              - "1"
97          - values:
98              - "-0x8000000000000000"
99              - "1"
100          - values:
101              - "0xFFFFFFFFFFFFFFFF"
102              - "0"
103          - values:
104              - "-0xFFFFFFFFFFFFFFFF"
105              - "0"
106
107      - file-name: "op_vs_8_none"
108        isa:
109          instructions:
110            - sig: mod2.64 v:in:i64
111              acc: inout:i64
112              format: [op_v_8]
113        tags: ['irtoc_ignore']
114        code-template: |
115          #
116              ldai.64 -1
117              movi.64 v0, %s
118              mod2.64 v0
119              movi.64 v0, %s
120              cmp.64 v0
121        description: Check mod2.64 with -1 and various values.
122        cases:
123          - values:
124              - "0"
125              - "0x0"
126            runner-options: ['run-failure']
127            description: Division by zero causes to exception.
128          - values:
129              - "1"
130              - "0"
131          - values:
132              - "-1"
133              - "0"
134          - values:
135              - "0x7FFFFFFFFFFFFFFF"
136              - "-1"
137          - values:
138              - "0x8000000000000000"
139              - "-1"
140          - values:
141              - "-0x7FFFFFFFFFFFFFFF"
142              - "-1"
143          - values:
144              - "-0x8000000000000000"
145              - "-1"
146          - values:
147              - "0xFFFFFFFFFFFFFFFF"
148              - "0"
149          - values:
150              - "-0xFFFFFFFFFFFFFFFF"
151              - "0"
152
153      - file-name: "op_vs_8_pmax"
154        isa:
155          instructions:
156            - sig: mod2.64 v:in:i64
157              acc: inout:i64
158              format: [op_v_8]
159        tags: ['irtoc_ignore']
160        code-template: |
161          #
162              ldai.64 0x7FFFFFFFFFFFFFFF
163              movi.64 v0, %s
164              mod2.64 v0
165              movi.64 v0, %s
166              cmp.64 v0
167        description: Check mod2.64 with +max and various values.
168        cases:
169          - values:
170              - "0"
171              - "0x0"
172            runner-options: ['run-failure']
173            description: Division by zero causes to exception.
174          - values:
175              - "1"
176              - "0"
177          - values:
178              - "-1"
179              - "0"
180          - values:
181              - "0x7FFFFFFFFFFFFFFF"
182              - "0"
183          - values:
184              - "0x8000000000000000"
185              - "0x7FFFFFFFFFFFFFFF"
186          - values:
187              - "-0x7FFFFFFFFFFFFFFF"
188              - "0"
189          - values:
190              - "-0x8000000000000000"
191              - "0x7FFFFFFFFFFFFFFF"
192          - values:
193              - "0xFFFFFFFFFFFFFFFF"
194              - "0"
195          - values:
196              - "-0xFFFFFFFFFFFFFFFF"
197              - "0"
198
199      - file-name: "op_vs_8_nmax"
200        isa:
201          instructions:
202            - sig: mod2.64 v:in:i64
203              acc: inout:i64
204              format: [op_v_8]
205        tags: ['irtoc_ignore']
206        code-template: |
207          #
208              ldai.64 -0x8000000000000000
209              movi.64 v0, %s
210              mod2.64 v0
211              movi.64 v0, %s
212              cmp.64 v0
213        description: Check mod2.64 with -max and various values.
214        cases:
215          - values:
216              - "0"
217              - "0x0"
218            runner-options: ['run-failure']
219            description: Division by zero causes to exception.
220          - values:
221              - "1"
222              - "0"
223          - values:
224              - "-1"
225              - "0"
226          - values:
227              - "0x7FFFFFFFFFFFFFFF"
228              - "-1"
229          - values:
230              - "0x8000000000000000"
231              - "0"
232          - values:
233              - "-0x7FFFFFFFFFFFFFFF"
234              - "-1"
235          - values:
236              - "-0x8000000000000000"
237              - "0"
238          - values:
239              - "0xFFFFFFFFFFFFFFFF"
240              - "0"
241          - values:
242              - "-0xFFFFFFFFFFFFFFFF"
243              - "0"
244
245      - file-name: "vals"
246        isa:
247          instructions:
248            - sig: mod2.64 v:in:i64
249              acc: inout:i64
250              format: [op_v_8]
251        code-template: |
252          #
253              ldai.64 %s
254              movi.64 v0, %s
255              mod2.64 v0
256              movi.64 v0, %s
257              cmp.64 v0
258        description: Check mod2.64 with various values.
259        tags: ['tsan']
260        cases:
261          - values:
262              - "0xD43883A022BBA8A1"
263              - "0xAAF23F449"
264              - "0xFFFFFFF635171663"
265          - values:
266              - "0x9AA3DE04AC281F64"
267              - "0xD39CC8359"
268              - "0xFFFFFFFBD6EE97AA"
269          - values:
270              - "0x2B522F1A7030A1C6"
271              - "0x511EAB1D9"
272              - "0x2D39C657F"
273          - values:
274              - "0xAB958C2AA68F8936"
275              - "0x9677D90DB"
276              - "0xFFFFFFFFD4F86B78"
277          - values:
278              - "0xE1D1D9EF8A718155"
279              - "0x3836657CA"
280              - "0xFFFFFFFE66F0D1EB"
281          - values:
282              - "0xB31108FC26286696"
283              - "0x6EF88B052"
284              - "0xFFFFFFFE71F24134"
285              - "0x7FABC476F1977825"
286              - "0x593EF9524"
287              - "0x17BB86D21"
288          - values:
289              - "0x2F7F50068624F26A"
290              - "0x8104CA4B5"
291              - "0x715DAF714"
292          - values:
293              - "0x8FA87DA4F72ECFD8"
294              - "0x47505818D"
295              - "0xFFFFFFFEDF09E6A2"
296          - values:
297              - "0x6DBA05387BF8987D"
298              - "0x38E6E285E"
299              - "0x202BD818F"
300          - values: ["0x8000000000000000", "-1", "0"]
301          - values: ["-9223372036854775808", "-1", "0"]
302
303      - file-name: "op_v_8_exception"
304        isa:
305          instructions:
306            - sig: mod2.64 v:in:i64
307              acc: inout:i64
308              format: [op_v_8]
309        tags: ['irtoc_ignore']
310        header-template: [ArithmeticException, main]
311        code-template: |
312            #
313                ldai.64 %s
314                movi.64 v0, 0
315            begin:
316                mod2.64 v0
317            end:
318                ldai 1 # Should not reach this line
319                return
320
321            catch_AE:
322                ldai 0 # Expected panda.ArithmeticException
323                return
324
325            catch_all:
326                ldai 1 # Unexpected exception, test failed
327                return
328
329            .catch panda.ArithmeticException, begin, end, catch_AE
330            .catchall begin, end, catch_all
331        check-type: none
332        description: Check `mod2.64` throws ArithmeticException when divides by zero.
333        cases:
334          - values: ["0"]
335          - values: ["1"]
336          - values: ["0x7FFFFFFF"]
337          - values: ["0x80000000"]
338          - values: ["0xFFFFFFFF"]
339          - values: ["0x100000000"]
340          - values: ["0x7FFFFFFFFFFFFFFF"]
341          - values: ["0x8000000000000000"]
342          - values: ["0xFFFFFFFFFFFFFFFF"]
343          - values: ["-1"]
344          - values: ["-0x7FFFFFFF"]
345          - values: ["-0x80000000"]
346          - values: ["-0xFFFFFFFF"]
347          - values: ["-0x100000000"]
348          - values: ["-0x7FFFFFFFFFFFFFFF"]
349          - values: ["-0x8000000000000000"]
350          - values: ["-0xFFFFFFFFFFFFFFFF"]
351
352
353      - file-name: "regs"
354        isa:
355          instructions:
356            - sig: mod2.64 v:in:i64
357              acc: inout:i64
358              format: [op_v_8]
359        runner-options: ['compile-only']
360        code-template: |
361          #
362              mod2.64 %s
363        check-type: none
364        description: Check mod2.64 with various register numbers.
365        cases:
366          - values:
367              - "v255"
368          - values:
369              - "v256"
370            runner-options: ['compile-failure']
371
372      - file-name: "type"
373        tags: ["verifier"]
374        isa:
375          verification:
376            - acc_type
377            - v1_type
378        runner-options: ['verifier-failure', 'verifier-config']
379        header-template: []
380        code-template: |
381          .record T {}
382          .function i32 main() {
383              %s
384              *s
385              mod2.64 v0
386        check-type: exit-positive
387        description: Check 'mod2.64' with incorrect accumulator and/or register types.
388        cases:
389          - values:
390            - ldai 0
391          - values:
392            - ldai.64 0
393            id: acc_ok
394          - values:
395            - fldai 0
396          - values:
397            - fldai.64 0
398          - values:
399            - lda.null
400          - values:
401            - |
402              #
403                  movi v1, 0
404                  newarr v1, v1, i32[]
405                  lda.obj v1
406          - values:
407            - lda.str "0"
408          - values:
409            - lda.type T
410          - values:
411            - |
412              #
413                  newobj v1, T
414                  lda.obj v1
415        template-cases:
416          - values:
417            - movi v0, 1
418          - values:
419            - movi.64 v0, 1
420            exclude: [acc_ok]
421          - values:
422            - fmovi v0, 1
423          - values:
424            - fmovi.64 v0, 1
425          - values:
426            - mov.null v0
427          - values:
428            - |
429              #
430                  movi v0, 0
431                  newarr v0, v0, i32[]
432          - values:
433            - |
434              #
435                  lda.str "0"
436                  sta.obj v0
437          - values:
438            - |
439              #
440                  lda.type T
441                  sta.obj v0
442          - values:
443            - newobj v0, T
444
445
446      - file-name: uninitialized_regs
447        isa:
448          instructions:
449            - sig: mod2.64 v:in:i64
450              acc: inout:i64
451              format: [op_v_8]
452        description: Check mod2.64 with uninitialized registers.
453        tags: ["verifier"]
454        runner-options: ['verifier-failure', 'verifier-config']
455        code-template: |
456          #
457              %s
458              *s
459              mod2.64 *s
460        check-type: exit-positive
461        template-cases:
462          - values:
463              - ""
464          - values:
465              - ldai.64 0
466            exclude: [init]
467        cases:
468          - values:
469              - ""
470              - v0
471          - values:
472              - movi.64 v1, 0
473              - v1
474            id: init
475          - values:
476              - ""
477              - v8
478          - values:
479              - ""
480              - v15
481          - values:
482              - movi.64 v15, 0
483              - v15
484            id: init
485