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: "mul2"
17    isa:
18      title: Two address binary operation on accumulator
19      description: >
20        Perform specified binary operation on accumulator and register and store result into accumulator
21      exceptions:
22        - x_none
23    commands:
24      - file-name: "op_vs_8_zero"
25        isa:
26          instructions:
27            - sig: mul2 v:in:i32
28              acc: inout:i32
29              format: [op_v_8]
30        code-template: |
31          #
32              ldai 0
33              movi v0, %s
34              mul2 v0
35              movi v0, 0
36              jne v0, set_failure
37              ldai 0
38              jmp fall_through
39          set_failure:
40              ldai 1
41          fall_through:
42        description: Check mul2 with zero and various values.
43        cases:
44          - values:
45              - "0"
46          - values:
47              - "1"
48          - values:
49              - "-1"
50          - values:
51              - "0x7FFFFFFF"
52          - values:
53              - "0x80000000"
54          - values:
55              - "-0x7FFFFFFF"
56          - values:
57              - "-0x80000000"
58          - values:
59              - "0xFFFFFFFF"
60          - values:
61              - "-0xFFFFFFFF"
62
63      - file-name: "op_vs_8_pone"
64        isa:
65          instructions:
66            - sig: mul2 v:in:i32
67              acc: inout:i32
68              format: [op_v_8]
69        code-template: |
70          #
71              ldai 1
72              movi v0, %s
73              mul2 v0
74              movi v0, %s
75              jne v0, set_failure
76              ldai 0
77              jmp fall_through
78          set_failure:
79              ldai 1
80          fall_through:
81        description: Check mul2 with +1 and various values.
82        cases:
83          - values:
84              - "0"
85              - "0"
86          - values:
87              - "1"
88              - "1"
89          - values:
90              - "-1"
91              - "-1"
92          - values:
93              - "0x7FFFFFFF"
94              - "0x7FFFFFFF"
95          - values:
96              - "0x80000000"
97              - "0x80000000"
98          - values:
99              - "-0x7FFFFFFF"
100              - "-0x7FFFFFFF"
101          - values:
102              - "-0x80000000"
103              - "-0x80000000"
104          - values:
105              - "0xFFFFFFFF"
106              - "0xFFFFFFFF"
107          - values:
108              - "-0xFFFFFFFF"
109              - "-0xFFFFFFFF"
110      - file-name: "op_vs_8_none"
111        isa:
112          instructions:
113            - sig: mul2 v:in:i32
114              acc: inout:i32
115              format: [op_v_8]
116        code-template: |
117          #
118              ldai -1
119              movi v0, %s
120              mul2 v0
121              movi v0, %s
122              jne v0, set_failure
123              ldai 0
124              jmp fall_through
125          set_failure:
126              ldai 1
127          fall_through:
128        description: Check mul2 with -1 and various values.
129        cases:
130          - values:
131              - "0"
132              - "0"
133          - values:
134              - "1"
135              - "-1"
136          - values:
137              - "-1"
138              - "1"
139          - values:
140              - "0x7FFFFFFF"
141              - "-0x7FFFFFFF"
142          - values:
143              - "0x80000000"
144              - "0x80000000"
145            bugid: ['966']
146          - values:
147              - "-0x7FFFFFFF"
148              - "0x7FFFFFFF"
149          - values:
150              - "-0x80000000"
151              - "0x80000000"
152            bugid: ['966']
153          - values:
154              - "0xFFFFFFFF"
155              - "1"
156          - values:
157              - "-0xFFFFFFFF"
158              - "-1"
159      - file-name: "op_vs_8_pmax"
160        isa:
161          instructions:
162            - sig: mul2 v:in:i32
163              acc: inout:i32
164              format: [op_v_8]
165        code-template: |
166          #
167              ldai 0x7FFFFFFF
168              movi v0, %s
169              mul2 v0
170              movi v0, %s
171              jne v0, set_failure
172              ldai 0
173              jmp fall_through
174          set_failure:
175              ldai 1
176          fall_through:
177        description: Check mul2 with +max and various values.
178        cases:
179          - values:
180              - "0"
181              - "0"
182          - values:
183              - "1"
184              - "0x7FFFFFFF"
185          - values:
186              - "-1"
187              - "0x80000001"
188          - values:
189              - "0x7FFFFFFF"
190              - "1"
191            bugid: ['966']
192          - values:
193              - "-0x7FFFFFFF"
194              - "-1"
195            bugid: ['966']
196          - values:
197              - "0x80000000"
198              - "0x80000000"
199            bugid: ['966']
200          - values:
201              - "-0x80000000"
202              - "0x80000000"
203            bugid: ['966']
204          - values:
205              - "0xFFFFFFFF"
206              - "0x80000001"
207          - values:
208              - "-0xFFFFFFFF"
209              - "0x7FFFFFFF"
210
211      - file-name: "op_vs_8_nmax"
212        bugid: ['966']
213        isa:
214          instructions:
215            - sig: mul2 v:in:i32
216              acc: inout:i32
217              format: [op_v_8]
218        code-template: |
219          #
220              ldai -0x80000000
221              movi v0, %s
222              mul2 v0
223              movi v0, %s
224              jne v0, set_failure
225              ldai 0
226              jmp fall_through
227          set_failure:
228              ldai 1
229          fall_through:
230        description: Check mul2 with -max and various values.
231        cases:
232          - values:
233              - "0"
234              - "0"
235          - values:
236              - "1"
237              - "0x80000000"
238          - values:
239              - "-1"
240              - "0x80000000"
241          - values:
242              - "0x7FFFFFFF"
243              - "0x80000000"
244          - values:
245              - "-0x7FFFFFFF"
246              - "0x80000000"
247          - values:
248              - "0x80000000"
249              - "0x0"
250          - values:
251              - "-0x80000000"
252              - "0x0"
253          - values:
254              - "0xFFFFFFFF"
255              - "0x80000000"
256          - values:
257              - "-0xFFFFFFFF"
258              - "0x80000000"
259
260      - file-name: "vals"
261        isa:
262          instructions:
263            - sig: mul2 v:in:i32
264              acc: inout:i32
265              format: [op_v_8]
266        code-template: |
267          #
268              ldai %s
269              movi v0, %s
270              mul2 v0
271              movi v0, %s
272              jne v0, set_failure
273              ldai 0
274              jmp fall_through
275          set_failure:
276              ldai 1
277          fall_through:
278        tags: ['tsan']
279        bugid: ['966']
280        description: Check mul2 with various values.
281        cases:
282          - values:
283              - "0x7A2CE254"
284              - "0xFB676533"
285              - "0x78083ABC"
286          - values:
287              - "0x6F7788C3"
288              - "0x65EB9775"
289              - "0xED4D861F"
290          - values:
291              - "0x801EF150"
292              - "0x29F1C73"
293              - "0x70FB26F0"
294          - values:
295              - "0xA6AB8140"
296              - "0x1D900575"
297              - "0x79E85240"
298          - values:
299              - "0x46689505"
300              - "0xADE64802"
301              - "0x3A38920A"
302          - values:
303              - "0x62C511AC"
304              - "0xD933351D"
305              - "0x4E3F9C7C"
306          - values:
307              - "0x59BB5F3E"
308              - "0x8E8C2463"
309              - "0x86C28CFA"
310          - values:
311              - "0x55255365"
312              - "0x98E808C3"
313              - "0x9191ADEF"
314          - values:
315              - "0x9664221"
316              - "0xF7F5AC4D"
317              - "0xA8C50FED"
318          - values:
319              - "0xC37EF875"
320              - "0xB09DAC86"
321              - "0x7325A93E"
322
323      - file-name: "vals_mod32_1"
324        isa:
325          instructions:
326            - sig: mul2 v:in:i32
327              acc: inout:i32
328              format: [op_v_8]
329        code-template: |
330          #
331              ldai %s
332              movi v0, %s
333              mul2 v0
334              movi.64 v0, %s
335              cmp.64 v0
336        tags: ["verifier"]
337        bugid: ['966', '1324', '2072']
338        runner-options: ['verifier-failure', 'verifier-config']
339        description: Check mul2 with incorrect accumulator ang register type.
340        cases:
341          - values:
342              - "0x7FFFFFFF"
343              - "2"
344              - "0xFFFFFFFFFFFFFFFE"
345          - values:
346              - "0x7FFFFFFF"
347              - "-2"
348              - "2"
349          - values:
350              - "0x80000000"
351              - "2"
352              - "0"
353
354      - file-name: "vals_mod32_2"
355        tags: ["verifier"]
356        bugid: ['1324', '966']
357        runner-options: ['verifier-failure', 'verifier-config']
358        isa:
359          instructions:
360            - sig: mul2 v:in:i32
361              acc: inout:i32
362              format: [op_v_8]
363        code-template: |
364            #
365                ldai.64 %s
366                movi.64 v0, %s
367                mul2 v0
368                movi.64 v0, %s
369                cmp.64 v0
370        description: Check mul2 with incorrect accumulator ang register type.
371        cases:
372            - values:
373                - "0x17FFFFFFF"
374                - "0x100000002"
375                - "0xFFFFFFFFFFFFFFFE"
376            - values:
377                - "0x777777777FFFFFFF"
378                - "-2"
379                - "2"
380            - values:
381                - "0x7654321080000000"
382                - "2"
383                - "0"
384
385      - file-name: "regs"
386        isa:
387          instructions:
388            - sig: mul2 v:in:i32
389              acc: inout:i32
390              format: [op_v_8]
391        runner-options: ['compile-only']
392        code-template: |
393          #
394              mul2 %s
395        check-type: none
396        description: Check mul2 with various register numbers.
397        cases:
398          - values:
399              - "v255"
400          - values:
401              - "v256"
402            runner-options: ['compile-failure']
403
404      - file-name: "type"
405        bugid: ["964", "966"]
406        tags: ["verifier"]
407        isa:
408          verification:
409            - acc_type
410            - v1_type
411        runner-options: ['verifier-failure', 'verifier-config']
412        header-template: []
413        code-template: |
414          .record T {}
415          .function i32 main() {
416              %s
417              *s
418              mul2 v0
419        check-type: exit-positive
420        description: Check 'mul2' with incorrect accumulator and/or register types.
421        cases:
422          - values:
423            - ldai 0
424            id: acc_ok
425          - values:
426            - ldai.64 0
427          - values:
428            - fldai 0
429            bugid: ['7315']
430          - values:
431            - fldai.64 0
432          - values:
433            - lda.null
434          - values:
435            - |
436              #
437                  movi v1, 0
438                  newarr v1, v1, i32[]
439                  lda.obj v1
440          - values:
441            - lda.str "0"
442          - values:
443            - lda.type T
444          - values:
445            - |
446              #
447                  newobj v1, T
448                  lda.obj v1
449        template-cases:
450          - values:
451            - movi v0, 0
452            exclude: [acc_ok]
453          - values:
454            - movi.64 v0, 0
455          - values:
456            - fmovi v0, 0
457            bugid: ['7315']
458          - values:
459            - fmovi.64 v0, 0
460          - values:
461            - mov.null v0
462          - values:
463            - |
464              #
465                  movi v0, 0
466                  newarr v0, v0, i32[]
467          - values:
468            - |
469              #
470                  lda.str "0"
471                  sta.obj v0
472          - values:
473            - |
474              #
475                  lda.type T
476                  sta.obj v0
477          - values:
478            - newobj v0, T
479
480
481      - file-name: uninitialized_regs
482        isa:
483          instructions:
484            - sig: mul2 v:in:i32
485              acc: inout:i32
486              format: [op_v_8]
487        description: Check 'mul2' with uninitialized registers.
488        tags: ['verifier']
489        runner-options: ['verifier-failure', 'verifier-config']
490        code-template: |
491          #
492              %s
493              *s
494              mul2 *s
495        check-type: exit-positive
496        template-cases:
497          - values:
498              - ''
499          - values:
500              - ldai 0
501            exclude: [init]
502        cases:
503          - values:
504              - ''
505              - v0
506          - values:
507              - movi v1, 0
508              - v1
509            id: init
510          - values:
511              - ''
512              - v8
513          - values:
514              - ''
515              - v15
516          - values:
517              - movi v15, 0
518              - v15
519            id: init
520