• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021 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: "div"
17    isa:
18      title: Three address integer division or modulo
19      description: Perform integer division or modulo on two registers and store result into accumulator
20    commands:
21      - file-name: "op_v1_4_v2_4_zero"
22        isa:
23          instructions:
24            - sig: div v1:in:i32, v2:in:i32
25              acc: out:i32
26              format: [op_v1_4_v2_4]
27        code-template: |
28          #
29              movi v0, 0
30              movi v1, %s
31              div v0, v1
32              movi v0, 0
33              jne v0, set_failure
34              ldai 0
35              jmp fall_through
36          set_failure:
37              ldai 1
38          fall_through:
39        description: Check div with zero and various values.
40        cases:
41          - values: ["1"]
42          - values: ["-1"]
43          - values: ["0x7FFFFFFF"]
44          - values: ["0x80000000"]
45          - values: ["-0x7FFFFFFF"]
46          - values: ["-0x80000000"]
47          - values: ["0xFFFFFFFF"]
48          - values: ["-0xFFFFFFFF"]
49
50      - file-name: "op_vs_8_pone"
51        isa:
52          instructions:
53            - sig: div v1:in:i32, v2:in:i32
54              acc: out:i32
55              format: [op_v1_4_v2_4]
56        code-template: |
57          #
58              movi v0, 1
59              movi v1, %s
60              div v0, v1
61              movi v0, %s
62              jne v0, set_failure
63              ldai 0
64              jmp fall_through
65          set_failure:
66              ldai 1
67          fall_through:
68        description: Check div with +1 and various values.
69        cases:
70          - values: ["1", "0x1"]
71          - values: ["-1", "0xFFFFFFFF"]
72          - values: ["0x7FFFFFFF", "0x0"]
73          - values: ["0x80000000", "0x0"]
74          - values: ["-0x7FFFFFFF", "0x0"]
75          - values: ["-0x80000000", "0x0"]
76          - values: ["0xFFFFFFFF", "0xFFFFFFFF"]
77          - values: ["-0xFFFFFFFF", "0x1"]
78
79      - file-name: "op_vs_8_none"
80        isa:
81          instructions:
82            - sig: div v1:in:i32, v2:in:i32
83              acc: out:i32
84              format: [op_v1_4_v2_4]
85        code-template: |
86          #
87              movi v0, -1
88              movi v1, %s
89              div v0, v1
90              movi v0, %s
91              jne v0, set_failure
92              ldai 0
93              jmp fall_through
94          set_failure:
95              ldai 1
96          fall_through:
97        description: Check div with -1 and various values.
98        cases:
99          - values: ["1", "0xFFFFFFFF"]
100          - values: ["-1", "0x1"]
101          - values: ["0x7FFFFFFF", "0x0"]
102          - values: ["0x80000000", "0x0"]
103          - values: ["-0x7FFFFFFF", "0x0"]
104          - values: ["-0x80000000", "0x0"]
105          - values: ["0xFFFFFFFF", "0x1"]
106          - values: ["-0xFFFFFFFF", "0xFFFFFFFF"]
107
108      - file-name: "op_vs_8_pmax"
109        isa:
110          instructions:
111            - sig: div v1:in:i32, v2:in:i32
112              acc: out:i32
113              format: [op_v1_4_v2_4]
114        code-template: |
115          #
116              movi v0, 0x7FFFFFFF
117              movi v1, %s
118              div v0, v1
119              movi v0, %s
120              jne v0, set_failure
121              ldai 0
122              jmp fall_through
123          set_failure:
124              ldai 1
125          fall_through:
126        description: Check div with +max and various values.
127        cases:
128          - values: ["1", "0x7FFFFFFF"]
129          - values: ["-1", "0x80000001"]
130          - values: ["0x7FFFFFFF", "0x1"]
131          - values: ["0x80000000", "0x0"]
132          - values: ["-0x7FFFFFFF", "0xFFFFFFFF"]
133          - values: ["-0x80000000", "0x0"]
134          - values: ["0xFFFFFFFF", "0x80000001"]
135          - values: ["-0xFFFFFFFF", "0x7FFFFFFF"]
136
137      - file-name: "op_vs_8_nmax"
138        isa:
139          instructions:
140            - sig: div v1:in:i32, v2:in:i32
141              acc: out:i32
142              format: [op_v1_4_v2_4]
143        code-template: |
144          #
145              movi v0, -0x80000000
146              movi v1, %s
147              div v0, v1
148              movi v0, %s
149              jne v0, set_failure
150              ldai 0
151              jmp fall_through
152          set_failure:
153              ldai 1
154          fall_through:
155        description: Check div with -max and various values.
156        cases:
157          - values: ["1", "0x80000000"]
158          - values: ["-1", "0x80000000"]
159          - values: ["0x7FFFFFFF", "0xFFFFFFFF"]
160          - values: ["0x80000000", "0x1"]
161          - values: ["-0x7FFFFFFF", "0x1"]
162          - values: ["-0x80000000", "0x1"]
163          - values: ["0xFFFFFFFF", "0x80000000"]
164          - values: ["-0xFFFFFFFF", "0x80000000"]
165
166      - file-name: "vals"
167        isa:
168          instructions:
169            - sig: div v1:in:i32, v2:in:i32
170              acc: out:i32
171              format: [op_v1_4_v2_4]
172        code-template: |
173          #
174              movi v0, %s
175              movi v1, %s
176              div v0, v1
177              movi v0, %s
178              jne v0, set_failure
179              ldai 0
180              jmp fall_through
181          set_failure:
182              ldai 1
183          fall_through:
184        description: Check div with various values.
185        tags: ['tsan']
186        cases:
187          - values: ["0x5A2A7A20", "0x92C42", "0x9D4"]
188          - values: ["0x723F999F", "0x6C589", "0x10DF"]
189          - values: ["0x5B39A21C", "0xDFD2A", "0x685"]
190          - values: ["0xEC29B76A", "0x6126B", "0xFFFFFCBC"]
191          - values: ["0x9617582D", "0x2BD45", "0xFFFFD957"]
192          - values: ["0x9B35145B", "0x9014F", "0xFFFFF4CF"]
193          - values: ["0xA9D5C5AB", "0xA2323", "0xFFFFF781"]
194          - values: ["0xD90A7511", "0x64F85", "0xFFFFF9D4"]
195          - values: ["0x97C40EB3", "0x7670F", "0xFFFFF1EC"]
196          - values: ["0x3D0C14FE", "0x89837", "0x71A"]
197          - values: ["0x80000000", "-1", "0x80000000"]
198          - values: ["-2147483648", "-1", "-2147483648"]
199
200      - file-name: "op_v1_4_v2_4_exception"
201        isa:
202          instructions:
203            - sig: div v1:in:i32, v2:in:i32
204              acc: out:i32
205              format: [op_v1_4_v2_4]
206          exceptions:
207            - x_arith
208        header-template: [ArithmeticException, main]
209        code-template: |
210            #
211                movi v0, %s
212                movi v1, 0
213            begin:
214                div v0, v1
215            end:
216                ldai 1 # Should not reach this line
217                return
218
219            catch_AE:
220                ldai 0 # Expected panda.ArithmeticException
221                return
222
223            catch_all:
224                ldai 1 # Unexpected exception, test failed
225                return
226
227            .catch panda.ArithmeticException, begin, end, catch_AE
228            .catchall begin, end, catch_all
229        check-type: none
230        description: Check `div` throws ArithmeticException when divides by zero.
231        cases:
232          - values: ["0"]
233          - values: ["1"]
234          - values: ["0x7FFFFFFF"]
235          - values: ["0x80000000"]
236          - values: ["0xFFFFFFFF"]
237          - values: ["-1"]
238          - values: ["-0x7FFFFFFF"]
239          - values: ["-0x80000000"]
240          - values: ["-0xFFFFFFFF"]
241
242      - file-name: "regs"
243        isa:
244          instructions:
245            - sig: div v1:in:i32, v2:in:i32
246              acc: out:i32
247              format: [op_v1_4_v2_4]
248        runner-options: ['compile-only']
249        code-template: |
250          #
251              div %s, %s
252        check-type: none
253        description: Check div with various register numbers.
254        cases:
255          - values: ["v15", "v15"]
256          - values: ["v0", "v15"]
257          - values: ["v15", "v0"]
258          - values: ["v15", "v16"]
259            runner-options: ['compile-failure']
260          - values: ["v16", "v15"]
261            runner-options: ['compile-failure']
262          - values: ["v16", "v16"]
263            runner-options: ['compile-failure']
264
265      - file-name: type_v2
266        # These tests will be removed due to verifier tests cover these cases.
267        bugid: ["964", "966"]
268        tags: ["verifier"]
269        isa:
270          instructions:
271            - sig: div v1:in:i32, v2:in:i32
272              acc: out:i32
273              format: [op_v1_4_v2_4]
274          verification:
275            - v2_type
276        runner-options: ['verifier-failure', 'verifier-debug-config']
277        code-template: |
278          #
279              movi v0, 1
280              %s
281              sta v1
282              div v0, v1
283              ldai 0
284              return
285        check-type: no-check
286        description: Check div with incorrect second register type.
287        cases:
288          - values: [lda.str ""]
289          - values: [lda.str "some string"]
290          - values: [lda.null]
291          - values: [fldai.64 0.0]
292          - values: [fldai.64 -0.0]
293          - values: [fldai.64 1.0]
294          - values: [fldai.64 -1.0]
295          - values: [fldai.64 0x7FF8000000000000]
296          - values: [fldai.64 0xFFFFFFFFFFFFFFFF]
297          - values: [fldai.64 0x7FF0000000000000]
298          - values: [fldai.64 0xFFF0000000000000]
299          - values: [fldai.64 0xFFEFFFFFFFFFFFFF]
300          - values: [fldai.64 0x7FEFFFFFFFFFFFFF]
301          - values: [fldai.64 0x0000000000000001]
302          - values: [fldai.64 0x8000000000000001]
303          - values: [fldai.64 3.14159265358979323846]
304          - values: [ldai.64 0]
305          - values: [ldai.64 1]
306          - values: [ldai.64 -1]
307          - values: [ldai.64 0x0000000100000000]
308          - values: [ldai.64 0x0000000080000000]
309          - values: [ldai.64 0x8000000000000000]
310          - values: [ldai.64 0xFFFFFFFF00000000]
311          - values: [ldai.64 0xFFFFFFFFFFFFFFFF]
312
313      - file-name: type_v1
314        # These tests will be removed due to verifier tests cover these cases.
315        bugid: ["964", "966"]
316        tags: ["verifier"]
317        isa:
318          instructions:
319            - sig: div v1:in:i32, v2:in:i32
320              acc: out:i32
321              format: [op_v1_4_v2_4]
322          verification:
323            - v1_type
324        runner-options: ['verifier-failure', 'verifier-debug-config']
325        code-template: |
326          #
327              %s
328              sta v0
329              movi v1, 1
330              div v0, v1
331              ldai 0
332              return
333        check-type: no-check
334        description: Check div with incorrect first register type.
335        cases:
336          - values: [lda.str ""]
337          - values: [lda.str "some string"]
338          - values: [lda.null]
339          - values: [fldai.64 0.0]
340          - values: [fldai.64 -0.0]
341          - values: [fldai.64 1.0]
342          - values: [fldai.64 -1.0]
343          - values: [fldai.64 0x7FF8000000000000]
344          - values: [fldai.64 0xFFFFFFFFFFFFFFFF]
345          - values: [fldai.64 0x7FF0000000000000]
346          - values: [fldai.64 0xFFF0000000000000]
347          - values: [fldai.64 0xFFEFFFFFFFFFFFFF]
348          - values: [fldai.64 0x7FEFFFFFFFFFFFFF]
349          - values: [fldai.64 0x0000000000000001]
350          - values: [fldai.64 0x8000000000000001]
351          - values: [fldai.64 3.14159265358979323846]
352          - values: [ldai.64 0]
353          - values: [ldai.64 1]
354          - values: [ldai.64 -1]
355          - values: [ldai.64 0x0000000100000000]
356          - values: [ldai.64 0x0000000080000000]
357          - values: [ldai.64 0x8000000000000000]
358          - values: [ldai.64 0xFFFFFFFF00000000]
359          - values: [ldai.64 0xFFFFFFFFFFFFFFFF]
360
361      - file-name: type_obj_v1
362        bugid: ["964", "966"]
363        tags: ["verifier"]
364        isa:
365          instructions:
366            - sig: div v1:in:i32, v2:in:i32
367              acc: out:i32
368              format: [op_v1_4_v2_4]
369          verification:
370            - v1_type
371        runner-options: ['verifier-failure', 'verifier-debug-config']
372        description: Check div with incorrect first register type.
373        code-template: |
374          #
375          .record Object {}
376          .function i32 main() {
377              %s
378              movi v1, 1
379              div v0, v1
380              ldai 0
381              return
382        check-type: none
383        header-template: []
384        cases:
385          - values:
386            - |
387              lda.type Object
388              sta.obj v0
389          - values:
390            - newobj v0, Object
391
392      - file-name: type_obj_v2
393        bugid: ["964", "966"]
394        tags: ["verifier"]
395        isa:
396          instructions:
397            - sig: div v1:in:i32, v2:in:i32
398              acc: out:i32
399              format: [op_v1_4_v2_4]
400          verification:
401            - v2_type
402        runner-options: ['verifier-failure', 'verifier-debug-config']
403        description: Check div with incorrect second register type.
404        code-template: |
405          #
406          .record Object {}
407          .function i32 main() {
408              movi v0, 1
409              %s
410              div v0, v1
411              ldai 0
412              return
413        check-type: none
414        header-template: []
415        cases:
416          - values:
417            - |
418              lda.type Object
419              sta.obj v1
420          - values:
421            - newobj v1, Object
422