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
14---
15definitions: []
16tests:
17  - file-name: divi
18    isa:
19      title: Two address integer division or modulo with immediate on accumulator
20      description: >
21        Perform two address integer division or modulo on accumulator and immediate and store result into accumulator.
22        Immediate is sign extended to operand size.
23      exceptions:
24        - x_arith
25    commands:
26      - file-name: op_imm_8_zero
27        isa:
28          instructions:
29            - sig: divi imm:i32
30              acc: inout:i32
31              format: [op_imm_8]
32        code-template: |
33          #
34              ldai 0
35              divi %s
36              movi v0, 0
37              jne v0, set_failure
38              ldai 0
39              return
40          set_failure:
41              ldai 1
42              return
43        check-type: none
44        description: Check `divi` with zero and various values.
45        cases:
46          - values: ["1"]
47          - values: ["-1"]
48          - values: ["0xF"]
49          - values: ["-0xF"]
50          - values: ["0x7F"]
51          - values: ["-0x7F"]
52          - values: ["0x80"]
53          - values: ["-0x80"]
54          - values: ["0xFF"]
55          - values: ["-0xFF"]
56
57
58      - file-name: op_imm_8_pone
59        isa:
60          instructions:
61            - sig: divi imm:i32
62              acc: inout:i32
63              format: [op_imm_8]
64        code-template: |
65          #
66              ldai 1
67              divi %s
68              movi v0, %s
69              jne v0, set_failure
70              ldai 0
71              return
72          set_failure:
73              ldai 1
74              return
75        check-type: none
76        description: Check `divi` with +1 and various values.
77        cases:
78          - values: ["1", "0x1"]
79          - values: ["-1", "0xFFFFFFFF"]
80          - values: ["0xF", "0x0"]
81          - values: ["-0xF", "0x0"]
82          - values: ["0x7F", "0x0"]
83          - values: ["-0x7F", "0x0"]
84          - values: ["0x80", "0x0"]
85          - values: ["-0x80", "0x0"]
86          - values: ["0xFF", "0xFFFFFFFF"]
87          - values: ["-0xFF", "0x1"]
88
89
90      - file-name: op_imm_8_none
91        isa:
92          instructions:
93            - sig: divi imm:i32
94              acc: inout:i32
95              format: [op_imm_8]
96        code-template: |
97          #
98              ldai -1
99              divi %s
100              movi v0, %s
101              jne v0, set_failure
102              ldai 0
103              return
104          set_failure:
105              ldai 1
106              return
107        check-type: none
108        description: Check `divi` with -1 and various values.
109        cases:
110          - values: ["1", "0xFFFFFFFF"]
111          - values: ["-1", "0x1"]
112          - values: ["0xF", "0x0"]
113          - values: ["-0xF", "0x0"]
114          - values: ["0x7F", "0x0"]
115          - values: ["-0x7F", "0x0"]
116          - values: ["0x80", "0x0"]
117          - values: ["-0x80", "0x0"]
118          - values: ["0xFF", "0x1"]
119          - values: ["-0xFF", "0xFFFFFFFF"]
120
121
122      - file-name: op_imm_8_pmax
123        isa:
124          instructions:
125            - sig: divi imm:i32
126              acc: inout:i32
127              format: [op_imm_8]
128        code-template: |
129          #
130              ldai 0x7FFFFFFF
131              divi %s
132              movi v0, %s
133              jne v0, set_failure
134              ldai 0
135              return
136          set_failure:
137              ldai 1
138              return
139        check-type: none
140        description: Check `divi` with +max and various values.
141        cases:
142          - values: ["1", "0x7FFFFFFF"]
143          - values: ["-1", "0x80000001"]
144          - values: ["0xF", "0x8888888"]
145          - values: ["-0xF", "0xF7777778"]
146          - values: ["0x7F", "0x1020408"]
147          - values: ["-0x7F", "0xFEFDFBF8"]
148          - values: ["0x80", "0xFF000001"]
149          - values: ["-0x80", "0xFF000001"]
150          - values: ["0xFF", "0x80000001"]
151          - values: ["-0xFF", "0x7FFFFFFF"]
152
153
154      - file-name: op_imm_8_nmax
155        isa:
156          instructions:
157            - sig: divi imm:i32
158              acc: inout:i32
159              format: [op_imm_8]
160        code-template: |
161          #
162              ldai -0x80000000
163              divi %s
164              movi v0, %s
165              jne v0, set_failure
166              ldai 0
167              return
168          set_failure:
169              ldai 1
170              return
171        check-type: none
172        description: Check `divi` with -max and various values.
173        cases:
174          - values: ["1", "0x80000000"]
175          - values: ["-1", "0x80000000"]
176          - values: ["0xF", "0xF7777778"]
177          - values: ["-0xF", "0x8888888"]
178          - values: ["0x7F", "0xFEFDFBF8"]
179          - values: ["-0x7F", "0x1020408"]
180          - values: ["0x80", "0x1000000"]
181          - values: ["-0x80", "0x1000000"]
182          - values: ["0xFF", "0x80000000"]
183          - values: ["-0xFF", "0x80000000"]
184
185
186      - file-name: op_imm_8_exception
187        isa:
188          instructions:
189            - sig: divi imm:i32
190              acc: inout:i32
191              format: [op_imm_8]
192        header-template: [ArithmeticException, main]
193        tags: ['irtoc_ignore']
194
195        code-template: |
196          #
197              ldai %s
198          begin:
199              divi %s
200          end:
201              ldai 1 # Should not reach this line
202              return
203
204          catch_AE:
205              ldai 0 # Expected panda.ArithmeticException
206              return
207
208          catch_all:
209              ldai 1 # Unexpected exception, test failed
210              return
211
212          .catch panda.ArithmeticException, begin, end, catch_AE
213          .catchall begin, end, catch_all
214        check-type: none
215        description: Check `divi` throws ArithmeticException when divides by zero.
216        cases:
217          - values: ["0", "0"]
218          - values: ["1", "0"]
219          - values: ["-1", "0"]
220          - values: ["0x7FFFFFFF", "0"]
221          - values: ["0x80000000", "0"]
222          - values: ["-0x7FFFFFFF", "0"]
223          - values: ["-0x80000000", "0"]
224          - values: ["0xFFFFFFFF", "0"]
225          - values: ["-0xFFFFFFFF", "0"]
226
227
228      - file-name: vals
229        isa:
230          instructions:
231            - sig: divi imm:i32
232              acc: inout:i32
233              format: [op_imm_8]
234        code-template: |
235          #
236              ldai %s
237              divi %s
238              movi v0, %s
239              jne v0, set_failure
240              ldai 0
241              return
242          set_failure:
243              ldai 1
244              return
245        check-type: none
246        description: Check `divi` with various values.
247        tags: ['tsan']
248        cases:
249          - values: ["0x881A7B01", "0x8C", "0x108996C"]
250          - values: ["0xB915B8BD", "0x02", "0xDC8ADC5F"]
251          - values: ["0x336458D6", "0x02", "0x19B22C6B"]
252          - values: ["0x91958F96", "0x0A", "0xF4F55B29"]
253          - values: ["0x239216BB", "0x39", "0x9FC185"]
254          - values: ["0x91E75821", "0x74", "0xFF0D0762"]
255          - values: ["0x46CC7483", "0x2A", "0x1AF88DE"]
256          - values: ["0xEFC0B1E8", "0xFE", "0x81FA70C"]
257          - values: ["0x83BF5338", "0x2F", "0xFD5B383E"]
258          - values: ["0x9D9E74AF", "0x1A", "0xFC375342"]
259          - values: ["0x80000000", "-1", "0x80000000"]
260          - values: ["-2147483648", "-1", "-2147483648"]
261
262
263      - file-name: type
264        isa:
265          verification:
266            - acc_type
267        tags: ['verifier']
268        runner-options: ['verifier-failure', 'verifier-config']
269        header-template: []
270        code-template: |
271          #
272          .record panda.Object <external>
273          .function i32 main() {
274              %s
275              divi 0
276        check-type: exit-positive
277        description: Check 'divi' with incorrect accumulator type.
278        cases:
279          - values: [ldai.64 0]
280          - values: [fldai 0]
281            bugid: ['7315']
282          - values: [fldai.64 0]
283          - values: [lda.null]
284          - values: [lda.type panda.Object]
285          - values: ['lda.type i32[]']
286          - values: [lda.str ""]
287          - values:
288            - |
289              #
290                  newobj v0, panda.Object
291                  lda.obj v0
292          - values:
293            - |
294              #
295                  movi v0, 10
296                  newarr v0, v0, i32[]
297                  lda.obj v0
298
299
300      - file-name: uninitialized_acc
301        isa:
302          instructions:
303            - sig: divi imm:i32
304              acc: inout:i32
305              format: [op_imm_8]
306        description: Check 'divi' with uninitialized accumulator.
307        tags: ['verifier']
308        runner-options: ['verifier-failure', 'verifier-config']
309        code-template: |
310          #
311              divi 1
312        check-type: exit-positive
313