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: "sub"
17    isa:
18      title: Three address binary operation
19      description: Perform specified binary operation on two registers and store result
20          into accumulator
21      exceptions:
22          - x_none
23    commands:
24      - file-name: "op_vs1_4_vs2_4_zero"
25        isa:
26          instructions:
27            - sig: sub v1:in:i32, v2:in:i32
28              acc: out:i32
29              format: [op_v1_4_v2_4]
30        code-template: |
31          #
32              movi v0, 0
33              movi v1, %s
34              sub v0, v1
35              movi v0, %s
36              jne v0, set_failure
37              ldai 0
38              jmp fall_through
39          set_failure:
40              ldai 1
41          fall_through:
42        description: Check sub with zero and various values.
43        cases:
44          - values:
45              - "0"
46              - "0"
47          - values:
48              - "1"
49              - "0xffffffff"
50          - values:
51              - "-1"
52              - "1"
53          - values:
54              - "0x7fffffff"
55              - "0x80000001"
56          - values:
57              - "-0x7fffffff"
58              - "0x7fffffff"
59          - values:
60              - "0x80000000"
61              - "0x80000000"
62            bugid: ['966']
63          - values:
64              - "-0x80000000"
65              - "0x80000000"
66            bugid: ['966']
67          - values:
68              - "0xFFFFFFFF"
69              - "1"
70          - values:
71              - "-0xFFFFFFFF"
72              - "0xFFFFFFFF"
73
74      - file-name: "op_vs1_4_vs2_4_pone"
75        isa:
76          instructions:
77            - sig: sub v1:in:i32, v2:in:i32
78              acc: out:i32
79              format: [op_v1_4_v2_4]
80        code-template: |
81          #
82              movi v0, 1
83              movi v1, %s
84              sub v0, v1
85              movi v0, %s
86              jne v0, set_failure
87              ldai 0
88              jmp fall_through
89          set_failure:
90              ldai 1
91          fall_through:
92        description: Check sub with +1 and various values.
93        cases:
94          - values:
95              - "0"
96              - "1"
97          - values:
98              - "1"
99              - "0"
100          - values:
101              - "-1"
102              - "2"
103          - values:
104              - "0x7FFFFFFF"
105              - "0x80000002"
106          - values:
107              - "-0x7FFFFFFF"
108              - "0x80000000"
109            bugid: ['966']
110          - values:
111              - "0x80000000"
112              - "0x80000001"
113            bugid: ['966']
114          - values:
115              - "-0x80000000"
116              - "0x80000001"
117            bugid: ['966']
118          - values:
119              - "0xFFFFFFFF"
120              - "2"
121          - values:
122              - "-0xFFFFFFFF"
123              - "0"
124      - file-name: "op_vs1_4_vs2_4_none"
125        isa:
126          instructions:
127            - sig: sub v1:in:i32, v2:in:i32
128              acc: out:i32
129              format: [op_v1_4_v2_4]
130        code-template: |
131          #
132              movi v0, -1
133              movi v1, %s
134              sub v0, v1
135              movi v0, %s
136              jne v0, set_failure
137              ldai 0
138              jmp fall_through
139          set_failure:
140              ldai 1
141          fall_through:
142        description: Check sub with -1 and various values.
143        cases:
144          - values:
145              - "0"
146              - "-1"
147          - values:
148              - "1"
149              - "-2"
150          - values:
151              - "-1"
152              - "0"
153          - values:
154              - "0x7FFFFFFF"
155              - "0x80000000"
156          - values:
157              - "-0x7FFFFFFF"
158              - "0x7FFFFFFE"
159          - values:
160              - "0x80000000"
161              - "0x7FFFFFFF"
162          - values:
163              - "-0x80000000"
164              - "0x7FFFFFFF"
165          - values:
166              - "0xFFFFFFFF"
167              - "0"
168          - values:
169              - "-0xFFFFFFFF"
170              - "0xFFFFFFFE"
171      - file-name: "op_vs1_4_vs2_4_pmax"
172        isa:
173          instructions:
174            - sig: sub v1:in:i32, v2:in:i32
175              acc: out:i32
176              format: [op_v1_4_v2_4]
177        code-template: |
178          #
179              movi v0, 0x7FFFFFFF
180              movi v1, %s
181              sub v0, v1
182              movi v0, %s
183              jne v0, set_failure
184              ldai 0
185              jmp fall_through
186          set_failure:
187              ldai 1
188          fall_through:
189        description: Check sub with -max and various values.
190        cases:
191          - values:
192              - "0"
193              - "0x7fffffff"
194          - values:
195              - "1"
196              - "0x7ffffffe"
197          - values:
198              - "-1"
199              - "0x80000000"
200            bugid: ['966']
201          - values:
202              - "0x7fffffff"
203              - "0"
204          - values:
205              - "-0x7fffffff"
206              - "0xfffffffe"
207            bugid: ['966']
208          - values:
209              - "0x80000000"
210              - "0xffffffff"
211            bugid: ['966']
212          - values:
213              - "-0x80000000"
214              - "0xffffffff"
215            bugid: ['966']
216          - values:
217              - "0xffffffff"
218              - "0x80000000"
219            bugid: ['966']
220          - values:
221              - "-0xffffffff"
222              - "0x7ffffffe"
223
224      - file-name: "op_vs1_4_vs2_4_nmax"
225        isa:
226          instructions:
227            - sig: sub v1:in:i32, v2:in:i32
228              acc: out:i32
229              format: [op_v1_4_v2_4]
230        code-template: |
231          #
232              movi v0, -0x80000000
233              movi v1, %s
234              sub v0, v1
235              movi v0, %s
236              jne v0, set_failure
237              ldai 0
238              jmp fall_through
239          set_failure:
240              ldai 1
241          fall_through:
242        description: Check sub with -max and various values.
243        cases:
244          - values:
245              - "0"
246              - "0x80000000"
247          - values:
248              - "1"
249              - "0x7fffffff"
250            bugid: ['966']
251          - values:
252              - "-1"
253              - "0x80000001"
254          - values:
255              - "0x7fffffff"
256              - "1"
257            bugid: ['966']
258          - values:
259              - "-0x7fffffff"
260              - "0xffffffff"
261          - values:
262              - "0x80000000"
263              - "0"
264          - values:
265              - "-0x80000000"
266              - "0"
267          - values:
268              - "0xffffffff"
269              - "0x80000001"
270          - values:
271              - "-0xffffffff"
272              - "0x7fffffff"
273            bugid: ['966']
274
275      - file-name: "vals"
276        isa:
277          instructions:
278            - sig: sub v1:in:i32, v2:in:i32
279              acc: out:i32
280              format: [op_v1_4_v2_4]
281        code-template: |
282          #
283              movi v0, %s
284              movi v1, %s
285              sub v0, v1
286              movi v0, %s
287              jne v0, set_failure
288              ldai 0
289              jmp fall_through
290          set_failure:
291              ldai 1
292          fall_through:
293        description: Check sub with various values.
294        tags: ['tsan']
295        cases:
296          - values:
297              - "0x41c75e07"
298              - "0x42e816eb"
299              - "0xfedf471c"
300          - values:
301              - "0x45624f8b"
302              - "0xfc29cfb6"
303              - "0x49387fd5"
304          - values:
305              - "0x5811aa60"
306              - "0xf22cf148"
307              - "0x65e4b918"
308          - values:
309              - "0x5aac44d7"
310              - "0xbe450a68"
311              - "0x9c673a6f"
312            bugid: ['966']
313          - values:
314              - "0xa9a2ee6d"
315              - "0x6e000ede"
316              - "0x3ba2df8f"
317            bugid: ['966']
318          - values:
319              - "0xd9ec934b"
320              - "0xe4a6266a"
321              - "0xf5466ce1"
322          - values:
323              - "0xc5c7ee89"
324              - "0x600e6f58"
325              - "0x65b97f31"
326            bugid: ['966']
327          - values:
328              - "0x76016f79"
329              - "0x589dee2d"
330              - "0x1d63814c"
331          - values:
332              - "0xec966b67"
333              - "0xf366e464"
334              - "0xf92f8703"
335          - values:
336              - "0x82250785"
337              - "0xac94f78"
338              - "0x775bb80d"
339            bugid: ['966']
340
341      - file-name: "vals_mod32_1"
342        bugid: ['1324', '2072']
343        tags: ['verifier']
344        runner-options: ['verifier-failure', 'verifier-config']
345        isa:
346          instructions:
347            - sig: sub v1:in:i32, v2:in:i32
348              acc: out:i32
349              format: [op_v1_4_v2_4]
350        code-template: |
351          #
352              movi v0, %s
353              movi v1, %s
354              sub v0, v1
355              movi.64 v0, %s
356              cmp.64 v0
357        description: Check sub with incorrect register types.
358        cases:
359          - values:
360              - "0"
361              - "0x80000000"
362              - "0xFFFFFFFF80000000"
363            bugid: ['966']
364          - values:
365              - "0x80000000"
366              - "1"
367              - "0x7FFFFFFF"
368            bugid: ['966']
369          - values:
370              - "0x80000000"
371              - "-0x80000000"
372              - "0"
373
374      - file-name: "vals_mod32_2"
375        bugid: ['1324']
376        tags: ['verifier']
377        runner-options: ['verifier-failure', 'verifier-config']
378        isa:
379          instructions:
380            - sig: sub v1:in:i32, v2:in:i32
381              acc: out:i32
382              format: [op_v1_4_v2_4]
383        code-template: |
384            #
385                movi.64 v0, %s
386                movi.64 v1, %s
387                sub v0, v1
388                movi.64 v0, %s
389                cmp.64 v0
390        description: Check sub with incorrect register types.
391        cases:
392            - values:
393                - "0"
394                - "0x180000000"
395                - "0xFFFFFFFF80000000"
396              bugid: ['966']
397            - values:
398                - "0x1234567680000000"
399                - "1"
400                - "0x7FFFFFFF"
401              bugid: ['966']
402            - values:
403                - "0x7654321080000000"
404                - "-0x1234567680000000"
405                - "0"
406
407      - file-name: "regs"
408        isa:
409          instructions:
410            - sig: sub v1:in:i32, v2:in:i32
411              acc: out:i32
412              format: [op_v1_4_v2_4]
413        runner-options: ['compile-only']
414        code-template: |
415          #
416              sub %s, %s
417        check-type: none
418        description: Check sub with various register numbers.
419        cases:
420          - values:
421              - v0
422              - v15
423          - values:
424              - v0
425              - v16
426            runner-options:
427              - compile-failure
428          - values:
429              - v15
430              - v0
431          - values:
432              - v16
433              - v0
434            runner-options:
435              - compile-failure
436
437      - file-name: type
438        isa:
439          verification:
440            - v1_type
441            - v2_type
442        tags: ['verifier']
443        runner-options: ['verifier-failure', 'verifier-config']
444        header-template: []
445        code-template: |
446          #
447          .record A {}
448          .record B {}
449          .record panda.String <external>
450          .record panda.Object <external>
451          .function i32 main() {
452              %s
453              *s
454              sub v0, v1
455        check-type: exit-positive
456        description: Check 'sub' with incorrect register types.
457        template-cases:
458          - values:
459              - movi v0, 0
460            exclude: [val]
461          - values:
462              - movi.64 v0, 0
463          - values:
464              - fmovi v0, 0
465          - values:
466              - fmovi.64 v0, 0
467          - values:
468              - |
469                #
470                    lda.type B
471                    sta.obj v0
472          - values:
473              - |
474                #
475                    lda.type B[]
476                    sta.obj v0
477          - values:
478              - |
479                #
480                    lda.type panda.String
481                    sta.obj v0
482          - values:
483              - |
484                #
485                    lda.type panda.Object
486                    sta.obj v0
487          - values:
488              - |
489                #
490                    movi v0, 10
491                    newarr v0, v0, i32[]
492          - values:
493              - mov.null v0
494        cases:
495          - values:
496              - movi v1, 0
497            id: val
498          - values:
499              - movi.64 v1, 0
500          - values:
501              - fmovi v1, 0
502          - values:
503              - fmovi.64 v1, 0
504          - values:
505              - |
506                #
507                    lda.type A
508                    sta.obj v1
509          - values:
510              - |
511                #
512                    lda.type A[]
513                    sta.obj v1
514
515          - values:
516              - |
517                #
518                    lda.type panda.String
519                    sta.obj v1
520          - values:
521              - |
522                #
523                    lda.type panda.Object
524                    sta.obj v1
525          - values:
526              - |
527                #
528                    movi v1, 10
529                    newarr v1, v1, f64[]
530          - values:
531              - mov.null v1
532
533
534      - file-name: uninitialized_regs
535        isa:
536          instructions:
537            - sig: sub v1:in:i32, v2:in:i32
538              acc: out:i32
539              format: [op_v1_4_v2_4]
540        description: Check 'sub' with uninitialized registers.
541        tags: ['verifier']
542        runner-options: ['verifier-failure', 'verifier-config']
543        code-template: |
544            #
545                %s
546                *s
547                sub %s, *s
548        check-type: exit-positive
549        template-cases:
550          - values:
551              - ''
552              - v0
553          - values:
554              - movi v0, 0
555              - v0
556            exclude: [init]
557          - values:
558              - ''
559              - v7
560          - values:
561              - ''
562              - v15
563          - values:
564              - 'movi v15, 0'
565              - v15
566            exclude: [init]
567        cases:
568          - values:
569              - ''
570              - v1
571          - values:
572              - movi v1, 0
573              - v1
574            id: init
575          - values:
576              - ''
577              - v8
578          - values:
579              - ''
580              - v14
581