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: muli
18    isa:
19      title: Two address binary operation with immediate on accumulator
20      description: >
21        Perform specified binary operation on accumulator and immediate and store result into accumulator.
22        Immediate is sign extended to operand size.
23      exceptions:
24        - x_none
25    commands:
26      - file-name: op_imm_8_zero
27        isa:
28          instructions:
29            - sig: muli imm:i32
30              acc: inout:i32
31              format: [op_imm_8]
32        code-template: |
33          #
34              ldai 0
35              muli %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 `muli` with zero and various values.
45        tags: ['tsan']
46        cases:
47          - values: ["0"]
48          - values: ["1"]
49          - values: ["-1"]
50          - values: ["0xF"]
51          - values: ["-0xF"]
52          - values: ["0x7F"]
53          - values: ["-0x7F"]
54          - values: ["0x80"]
55          - values: ["-0x80"]
56          - values: ["0xFF"]
57          - values: ["-0xFF"]
58
59
60      - file-name: op_imm_8_pone
61        isa:
62          instructions:
63            - sig: muli imm:i32
64              acc: inout:i32
65              format: [op_imm_8]
66        code-template: |
67          #
68              ldai 1
69              muli %s
70              movi v0, %s
71              jne v0, set_failure
72              ldai 0
73              return
74          set_failure:
75              ldai 1
76              return
77        check-type: none
78        description: Check `muli` with +1 and various values.
79        cases:
80          - values: ["0", "0x0"]
81          - values: ["1", "0x1"]
82          - values: ["-1", "0xFFFFFFFF"]
83          - values: ["0xF", "0xF"]
84          - values: ["-0xF", "0xFFFFFFF1"]
85          - values: ["0x7F", "0x7F"]
86          - values: ["-0x7F", "0xFFFFFF81"]
87          - values: ["0x80", "0xFFFFFF80"]
88          - values: ["-0x80", "0xFFFFFF80"]
89          - values: ["0xFF", "0xFFFFFFFF"]
90          - values: ["-0xFF", "0x1"]
91
92
93      - file-name: op_imm_8_none
94        isa:
95          instructions:
96            - sig: muli imm:i32
97              acc: inout:i32
98              format: [op_imm_8]
99        code-template: |
100          #
101              ldai -1
102              muli %s
103              movi v0, %s
104              jne v0, set_failure
105              ldai 0
106              return
107          set_failure:
108              ldai 1
109              return
110        check-type: none
111        description: Check `muli` with -1 and various values.
112        cases:
113          - values: ["0", "0x0"]
114          - values: ["1", "0xFFFFFFFF"]
115          - values: ["-1", "0x1"]
116          - values: ["0xF", "0xFFFFFFF1"]
117          - values: ["-0xF", "0xF"]
118          - values: ["0x7F", "0xFFFFFF81"]
119          - values: ["-0x7F", "0x7F"]
120          - values: ["0x80", "0x80"]
121          - values: ["-0x80", "0x80"]
122          - values: ["0xFF", "0x1"]
123          - values: ["-0xFF", "0xFFFFFFFF"]
124
125
126      - file-name: op_imm_8_pmax
127        isa:
128          instructions:
129            - sig: muli imm:i32
130              acc: inout:i32
131              format: [op_imm_8]
132        code-template: |
133          #
134              ldai 0x7FFFFFFF
135              muli %s
136              movi v0, %s
137              jne v0, set_failure
138              ldai 0
139              return
140          set_failure:
141              ldai 1
142              return
143        check-type: none
144        description: Check `muli` with +max and various values.
145        cases:
146          - values: ["0", "0x0"]
147          - values: ["1", "0x7FFFFFFF"]
148          - values: ["-1", "0x80000001"]
149          - values: ["0xF", "0x7FFFFFF1"]
150          - values: ["-0xF", "0x8000000F"]
151          - values: ["0x7F", "0x7FFFFF81"]
152          - values: ["-0x7F", "0x8000007F"]
153          - values: ["0x80", "0x80"]
154          - values: ["-0x80", "0x80"]
155          - values: ["0xFF", "0x80000001"]
156          - values: ["-0xFF", "0x7FFFFFFF"]
157
158
159      - file-name: op_imm_8_nmax
160        isa:
161          instructions:
162            - sig: muli imm:i32
163              acc: inout:i32
164              format: [op_imm_8]
165        code-template: |
166          #
167              ldai -0x80000000
168              muli %s
169              movi v0, %s
170              jne v0, set_failure
171              ldai 0
172              return
173          set_failure:
174              ldai 1
175              return
176        check-type: none
177        description: Check `muli` with -max and various values.
178        cases:
179          - values: ["0", "0x0"]
180          - values: ["1", "0x80000000"]
181          - values: ["-1", "0x80000000"]
182          - values: ["0xF", "0x80000000"]
183          - values: ["-0xF", "0x80000000"]
184          - values: ["0x7F", "0x80000000"]
185          - values: ["-0x7F", "0x80000000"]
186          - values: ["0x80", "0x0"]
187          - values: ["-0x80", "0x0"]
188          - values: ["0xFF", "0x80000000"]
189          - values: ["-0xFF", "0x80000000"]
190
191
192      - file-name: vals
193        isa:
194          instructions:
195            - sig: muli imm:i32
196              acc: inout:i32
197              format: [op_imm_8]
198        code-template: |
199          #
200              ldai %s
201              muli %s
202              movi v0, %s
203              jne v0, set_failure
204              ldai 0
205              return
206          set_failure:
207              ldai 1
208              return
209        check-type: none
210        description: Check `muli` with various values.
211        cases:
212          - values: ["0xD6FE0B32", "0x88", "0x38EAC090"]
213          - values: ["0x13484A42", "0x9A", "0x513269B4"]
214          - values: ["0x7D62F544", "0xDE", "0x58DB6CF8"]
215          - values: ["0xAEBE9BAC", "0x3B", "0x45EDE0A4"]
216          - values: ["0xBE2A4011", "0x46", "0xFF8D84A6"]
217          - values: ["0x1853EB07", "0x3E", "0xE452EBB2"]
218          - values: ["0x756756C8", "0x1F", "0x37838238"]
219          - values: ["0x84F26D1", "0x8A", "0x2B841BAA"]
220          - values: ["0x87224E03", "0x94", "0xFD8716BC"]
221          - values: ["0x379F75A8", "0x10", "0x79F75A80"]
222
223
224      - file-name: type
225        isa:
226          verification:
227            - acc_type
228        tags: ['verifier']
229        runner-options: ['verifier-failure', 'verifier-config']
230        header-template: []
231        code-template: |
232          #
233          .record panda.Object <external>
234          .function i32 main() {
235              %s
236              muli 0
237        check-type: exit-positive
238        description: Check 'muli' with incorrect acc type.
239        cases:
240          - values: [ldai.64 0]
241          - values: [fldai 0]
242            bugid: ['7315']
243          - values: [fldai.64 0]
244          - values: [lda.null]
245          - values: [lda.type panda.Object]
246          - values: ['lda.type i32[]']
247          - values: [lda.str ""]
248          - values:
249            - |
250              #
251                  newobj v0, panda.Object
252                  lda.obj v0
253          - values:
254            - |
255              #
256                  movi v0, 10
257                  newarr v0, v0, i32[]
258                  lda.obj v0
259
260
261      - file-name: uninitialized_acc
262        isa:
263          instructions:
264            - sig: muli imm:i32
265              acc: inout:i32
266              format: [op_imm_8]
267        description: Check 'muli' with uninitialized accumulator.
268        tags: ['verifier']
269        runner-options: ['verifier-failure', 'verifier-config']
270        code-template: |
271            #
272                muli 0
273        check-type: exit-positive
274