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: "xor"
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: xor v1:in:i32, v2:in:i32
28              acc: out:i32
29              prefix: bit
30              format: [pref_op_v1_4_v2_4]
31        code-template: |
32          #
33              movi v0, 0
34              movi v1, %s
35              mov v1, v0
36              xor v0, v1
37              mov v0, v1
38              jne v0, set_failure
39              ldai 0
40              jmp fall_through
41          set_failure:
42              ldai 1
43          fall_through:
44        description: Check xor with zero and various values.
45        cases:
46          - values:
47              - "0"
48          - values:
49              - "1"
50          - values:
51              - "-1"
52          - values:
53              - "0x7FFFFFFF"
54          - values:
55              - "0x80000000"
56          - values:
57              - "-0x7FFFFFFF"
58          - values:
59              - "-0x80000000"
60          - values:
61              - "0xFFFFFFFF"
62          - values:
63              - "-0xFFFFFFFF"
64
65      - file-name: "op_vs1_4_vs2_4_pone"
66        isa:
67          instructions:
68            - sig: xor v1:in:i32, v2:in:i32
69              acc: out:i32
70              prefix: bit
71              format: [pref_op_v1_4_v2_4]
72        code-template: |
73          #
74              movi v0, 1
75              movi v1, %s
76              xor v0, v1
77              movi v0, %s
78              jne v0, set_failure
79              ldai 0
80              jmp fall_through
81          set_failure:
82              ldai 1
83          fall_through:
84        description: Check xor with +1 and various values.
85        cases:
86          - values:
87              - "0"
88              - "1"
89          - values:
90              - "1"
91              - "0"
92          - values:
93              - "-1"
94              - "-2"
95          - values:
96              - "0x7FFFFFFF"
97              - "0x7FFFFFFE"
98          - values:
99              - "0x80000000"
100              - "0x80000001"
101          - values:
102              - "-0x7FFFFFFF"
103              - "0x80000000"
104          - values:
105              - "-0x80000000"
106              - "0x80000001"
107          - values:
108              - "0xFFFFFFFF"
109              - "0xFFFFFFFE"
110          - values:
111              - "-0xFFFFFFFF"
112              - "0"
113      - file-name: "op_vs1_4_vs2_4_none"
114        isa:
115          instructions:
116            - sig: xor v1:in:i32, v2:in:i32
117              acc: out:i32
118              prefix: bit
119              format: [pref_op_v1_4_v2_4]
120        code-template: |
121          #
122              movi v0, -1
123              movi v1, %s
124              xor v0, v1
125              movi v0, %s
126              jne v0, set_failure
127              ldai 0
128              jmp fall_through
129          set_failure:
130              ldai 1
131          fall_through:
132        description: Check xor with -1 and various values.
133        cases:
134          - values:
135              - "0"
136              - "0xFFFFFFFF"
137          - values:
138              - "1"
139              - "0xFFFFFFFE"
140          - values:
141              - "-1"
142              - "0"
143          - values:
144              - "0x7FFFFFFF"
145              - "0x80000000"
146          - values:
147              - "0x80000000"
148              - "0x7FFFFFFF"
149          - values:
150              - "-0x7FFFFFFF"
151              - "0x7FFFFFFE"
152          - values:
153              - "-0x80000000"
154              - "0x7FFFFFFF"
155          - values:
156              - "0xFFFFFFFF"
157              - "0"
158          - values:
159              - "-0xFFFFFFFF"
160              - "0xFFFFFFFE"
161
162      - file-name: "op_vs1_4_vs2_4_pmax"
163        isa:
164          instructions:
165            - sig: xor v1:in:i32, v2:in:i32
166              acc: out:i32
167              prefix: bit
168              format: [pref_op_v1_4_v2_4]
169        code-template: |
170          #
171              movi v0, 0x7FFFFFFF
172              movi v1, %s
173              xor v0, v1
174              movi v0, %s
175              jne v0, set_failure
176              ldai 0
177              jmp fall_through
178          set_failure:
179              ldai 1
180          fall_through:
181        description: Check xor with +max and various values.
182        cases:
183          - values:
184              - "0"
185              - "0x7FFFFFFF"
186          - values:
187              - "1"
188              - "0x7FFFFFFE"
189          - values:
190              - "-1"
191              - "0x80000000"
192          - values:
193              - "0x7FFFFFFF"
194              - "0"
195          - values:
196              - "0x80000000"
197              - "0xFFFFFFFF"
198          - values:
199              - "-0x7FFFFFFF"
200              - "0xFFFFFFFE"
201          - values:
202              - "-0x80000000"
203              - "0xFFFFFFFF"
204          - values:
205              - "0xFFFFFFFF"
206              - "0x80000000"
207          - values:
208              - "-0xFFFFFFFF"
209              - "0x7FFFFFFE"
210
211      - file-name: "op_vs1_4_vs2_4_nmax"
212        isa:
213          instructions:
214            - sig: xor v1:in:i32, v2:in:i32
215              acc: out:i32
216              prefix: bit
217              format: [pref_op_v1_4_v2_4]
218        code-template: |
219          #
220              movi v0, -0x80000000
221              movi v1, %s
222              xor v0, v1
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 xor with -max and various values.
231        cases:
232          - values:
233              - "0"
234              - "0x80000000"
235          - values:
236              - "1"
237              - "0x80000001"
238          - values:
239              - "-1"
240              - "0x7FFFFFFF"
241          - values:
242              - "0x7FFFFFFF"
243              - "0xFFFFFFFF"
244          - values:
245              - "0x80000000"
246              - "0"
247          - values:
248              - "-0x7FFFFFFF"
249              - "1"
250          - values:
251              - "-0x80000000"
252              - "0"
253          - values:
254              - "0xFFFFFFFF"
255              - "0x7FFFFFFF"
256          - values:
257              - "-0xFFFFFFFF"
258              - "0x80000001"
259
260      - file-name: "vals"
261        isa:
262          instructions:
263            - sig: xor v1:in:i32, v2:in:i32
264              acc: out:i32
265              prefix: bit
266              format: [pref_op_v1_4_v2_4]
267        code-template: |
268          #
269              movi v0, %s
270              movi v1, %s
271              xor v0, v1
272              movi v0, %s
273              jne v0, set_failure
274              ldai 0
275              jmp fall_through
276          set_failure:
277              ldai 1
278          fall_through:
279        description: Check xor with various values.
280        tags: ['tsan']
281        cases:
282          - values:
283              - "0xD5899254"
284              - "0x1A4A299A"
285              - "0xCFC3BBCE"
286          - values:
287              - "0xF4D6AAC6"
288              - "0x1EA9F134"
289              - "0xEA7F5BF2"
290          - values:
291              - "0xA54CE385"
292              - "0xE64C451A"
293              - "0x4300A69F"
294          - values:
295              - "0xCFD219"
296              - "0xDD412AC4"
297              - "0xDD8EF8DD"
298          - values:
299              - "0x5F803721"
300              - "0xA6D40762"
301              - "0xF9543043"
302          - values:
303              - "0xC05A503D"
304              - "0x4DBE3911"
305              - "0x8DE4692C"
306          - values:
307              - "0xB14B6559"
308              - "0xCC9B598A"
309              - "0x7DD03CD3"
310          - values:
311              - "0x6D781048"
312              - "0x93215EED"
313              - "0xFE594EA5"
314          - values:
315              - "0xE92EADFC"
316              - "0x7C4B8500"
317              - "0x956528FC"
318          - values:
319              - "0xF655FFB4"
320              - "0xCF684F7B"
321              - "0x393DB0CF"
322
323      - file-name: "vals_mod32_1"
324        bugid: ['1324', '2075']
325        tags: ['verifier']
326        runner-options: ['verifier-failure', 'verifier-config']
327        isa:
328          instructions:
329            - sig: xor v1:in:i32, v2:in:i32
330              acc: out:i32
331              prefix: bit
332              format: [pref_op_v1_4_v2_4]
333        code-template: |
334          #
335              movi.64 v0, %s
336              movi.64 v1, %s
337              xor v0, v1
338              movi.64 v0, %s
339              cmp.64 v0
340        description: Check xor with incorrect register types.
341        cases:
342          - values:
343              - "0x17FFFFFFF"
344              - "0x7FFFFFFF"
345              - "0"
346          - values:
347              - "0x77777777FFFFFFFF"
348              - "0x1111111180000000"
349              - "0x000000007FFFFFFF"
350          - values:
351              - "0x180000000"
352              - "0xF80000000"
353              - "0"
354
355      - file-name: "regs"
356        isa:
357          instructions:
358            - sig: xor v1:in:i32, v2:in:i32
359              acc: out:i32
360              prefix: bit
361              format: [pref_op_v1_4_v2_4]
362        runner-options: ['compile-only']
363        code-template: |
364          #
365              xor %s, %s
366        check-type: none
367        description: Check xor with various register numbers.
368        cases:
369          - values:
370              - v0
371              - v15
372          - values:
373              - v0
374              - v16
375            runner-options:
376              - compile-failure
377          - values:
378              - v15
379              - v0
380          - values:
381              - v16
382              - v0
383            runner-options:
384              - compile-failure
385
386      - file-name: type
387        isa:
388          verification:
389            - v1_type
390            - v2_type
391        tags: ['verifier']
392        runner-options: ['verifier-failure', 'verifier-config']
393        header-template: []
394        code-template: |
395          #
396          .record A {}
397          .record B {}
398          .record panda.String <external>
399          .record panda.Object <external>
400          .function i32 main() {
401              %s
402              *s
403              xor v0, v1
404        check-type: exit-positive
405        description: Check 'xor' with incorrect register types.
406        template-cases:
407          - values:
408              - movi v0, 0
409            exclude: [val]
410          - values:
411              - movi.64 v0, 0
412          - values:
413              - fmovi v0, 0
414            bugid: ['7315']
415          - values:
416              - fmovi.64 v0, 0
417          - values:
418              - |
419                #
420                    lda.type B
421                    sta.obj v0
422          - values:
423              - |
424                #
425                    lda.type B[]
426                    sta.obj v0
427          - values:
428              - |
429                #
430                    lda.type panda.String
431                    sta.obj v0
432          - values:
433              - |
434                #
435                    lda.type panda.Object
436                    sta.obj v0
437          - values:
438              - |
439                #
440                    movi v0, 10
441                    newarr v0, v0, i32[]
442          - values:
443              - mov.null v0
444        cases:
445          - values:
446              - movi v1, 0
447            id: val
448          - values:
449              - movi.64 v1, 0
450          - values:
451              - fmovi v1, 0
452            bugid: ['7315']
453          - values:
454              - fmovi.64 v1, 0
455          - values:
456              - |
457                #
458                    lda.type A
459                    sta.obj v1
460          - values:
461              - |
462                #
463                    lda.type A[]
464                    sta.obj v1
465
466          - values:
467              - |
468                #
469                    lda.type panda.String
470                    sta.obj v1
471          - values:
472              - |
473                #
474                    lda.type panda.Object
475                    sta.obj v1
476          - values:
477              - |
478                #
479                    movi v1, 10
480                    newarr v1, v1, f64[]
481          - values:
482              - mov.null v1
483
484
485      - file-name: uninitialized_regs
486        isa:
487          instructions:
488            - sig: xor v1:in:i32, v2:in:i32
489              acc: out:i32
490              format: [op_v1_4_v2_4]
491        description: Check 'xor' with uninitialized registers.
492        tags: ['verifier']
493        runner-options: ['verifier-failure', 'verifier-config']
494        code-template: |
495            #
496                %s
497                *s
498                xor %s, *s
499        check-type: exit-positive
500        template-cases:
501          - values:
502              - ''
503              - v0
504          - values:
505              - movi v0, 0
506              - v0
507            exclude: [init]
508          - values:
509              - ''
510              - v7
511          - values:
512              - ''
513              - v15
514          - values:
515              - 'movi v15, 0'
516              - v15
517            exclude: [init]
518        cases:
519          - values:
520              - ''
521              - v1
522          - values:
523              - movi v1, 0
524              - v1
525            id: init
526          - values:
527              - ''
528              - v8
529          - values:
530              - ''
531              - v14
532