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: 'inci'
17    isa:
18      title: Increment register with immediate
19      description: >
20        Increment virtual register by specified immediate. Immediate is sign extended to operand size.
21      exceptions:
22        - x_none
23    commands:
24      - file-name: 'op_v_4_imm_4_zero'
25        isa:
26          instructions:
27            - sig: inci v:inout:i32, imm:i32
28              acc: none
29              format: [op_v_4_imm_4]
30        code-template: |
31          #
32              movi v0, 0
33              inci v0, %s
34              ldai %s
35              jne v0, set_failure
36              ldai 0
37              return
38          set_failure:
39              ldai 1
40              return
41        check-type: none
42        description: Check 'inci' with various values.
43        cases:
44          - values: ['0', '0x0']
45          - values: ['1', '0x1']
46          - values: ['-1', '0xFFFFFFFF']
47          - values: ['0x7', '0x7']
48          - values: ['-0x7', '0xFFFFFFF9']
49          - values: ['0x8', '0xFFFFFFF8']
50          - values: ['-0x8', '0xFFFFFFF8']
51          - values: ['0xF', '0xFFFFFFFF']
52          - values: ['-0xF', '0x1']
53
54      - file-name: 'op_v_4_imm_4_pone'
55        isa:
56          instructions:
57            - sig: inci v:inout:i32, imm:i32
58              acc: none
59              format: [op_v_4_imm_4]
60        code-template: |
61          #
62              movi v0, 1
63              inci v0, %s
64              ldai %s
65              jne v0, set_failure
66              ldai 0
67              return
68          set_failure:
69              ldai 1
70              return
71        check-type: none
72        description: Check 'inci' with various values.
73        cases:
74          - values: ['0', '0x1']
75          - values: ['1', '0x2']
76          - values: ['-1', '0']
77          - values: ['0x7', '0x8']
78          - values: ['-0x7', '0xFFFFFFFA']
79          - values: ['0x8', '0xFFFFFFF9']
80          - values: ['-0x8', '0xFFFFFFF9']
81          - values: ['0xF', '0']
82          - values: ['-0xF', '0x2']
83
84      - file-name: 'op_v_4_imm_4_none'
85        isa:
86          instructions:
87            - sig: inci v:inout:i32, imm:i32
88              acc: none
89              format: [op_v_4_imm_4]
90        code-template: |
91          #
92              movi v0, -1
93              inci v0, %s
94              ldai %s
95              jne v0, set_failure
96              ldai 0
97              return
98          set_failure:
99              ldai 1
100              return
101        check-type: none
102        description: Check 'inci' with various values.
103        cases:
104          - values: ['0', '0xFFFFFFFF']
105          - values: ['1', '0']
106          - values: ['-1', '0xFFFFFFFE']
107          - values: ['0x7', '0x6']
108          - values: ['-0x7', '0xFFFFFFF8']
109          - values: ['0x8', '0xFFFFFFF7']
110          - values: ['-0x8', '0xFFFFFFF7']
111          - values: ['0xF', '0xFFFFFFFE']
112          - values: ['-0xF', '0']
113
114      - file-name: 'op_v_4_imm_4_pmax'
115        isa:
116          instructions:
117            - sig: inci v:inout:i32, imm:i32
118              acc: none
119              format: [op_v_4_imm_4]
120        code-template: |
121          #
122              movi v0, 0x7FFFFFFF
123              inci v0, %s
124              ldai %s
125              jne v0, set_failure
126              ldai 0
127              return
128          set_failure:
129              ldai 1
130              return
131        check-type: none
132        description: Check `inci` with various values.
133        cases:
134          - values: ["0", "0x7FFFFFFF"]
135          - values: ["1", "0x80000000"]
136            tags: [sanitizer-fail]
137          - values: ["-1", "0x7FFFFFFE"]
138          - values: ["0x7", "0x80000006"]
139            tags: [sanitizer-fail]
140          - values: ["-0x7", "0x7FFFFFF8"]
141          - values: ["0x8", "0x7FFFFFF7"]
142          - values: ["-0x8", "0x7FFFFFF7"]
143          - values: ["0xF", "0x7FFFFFFE"]
144          - values: ["-0xF", "0x80000000"]
145            tags: [sanitizer-fail]
146
147      - file-name: 'op_v_4_imm_4_nmax'
148        isa:
149          instructions:
150            - sig: inci v:inout:i32, imm:i32
151              acc: none
152              format: [op_v_4_imm_4]
153        code-template: |
154          #
155              movi v0, 0x80000000
156              inci v0, %s
157              ldai %s
158              jne v0, set_failure
159              ldai 0
160              return
161          set_failure:
162              ldai 1
163              return
164        check-type: none
165        description: Check `inci` with various values.
166        cases:
167          - values: ["0", "0x80000000"]
168          - values: ["1", "0x80000001"]
169          - values: ["-1", "0x7FFFFFFF"]
170            tags: [sanitizer-fail]
171          - values: ["0x7", "0x80000007"]
172          - values: ["-0x7", "0x7FFFFFF9"]
173            tags: [sanitizer-fail]
174          - values: ["0x8", "0x7FFFFFF8"]
175            tags: [sanitizer-fail]
176          - values: ["-0x8", "0x7FFFFFF8"]
177            tags: [sanitizer-fail]
178          - values: ["0xF", "0x7FFFFFFF"]
179            tags: [sanitizer-fail]
180          - values: ["-0xF", "0x80000001"]
181
182      - file-name: 'values'
183        isa:
184          instructions:
185            - sig: inci v:inout:i32, imm:i32
186              acc: none
187              format: [op_v_4_imm_4]
188        code-template: |
189          #
190              movi v0, %s
191              inci v0, %s
192              movi v1, %s
193              lda v0
194              jne v0, set_failure
195              ldai 0
196              return
197          set_failure:
198              ldai 1
199              return
200        check-type: none
201        description: Check 'inci' with various values.
202        tags: ['tsan']
203        cases:
204          - values: ['0x527DF0C9', '0x7', '0x527DF0D0']
205          - values: ['0xF4D85C6B', '0x0', '0xF4D85C6B']
206          - values: ['0xE1A513C2', '0x5', '0xE1A513C7']
207          - values: ['0x22587543', '0xF', '0x22587542']
208          - values: ['0xAC2F0564', '0x0', '0xAC2F0564']
209          - values: ['0x789DD1C7', '0xD', '0x789DD1C4']
210          - values: ['0xF2945867', '0xA', '0xF2945861']
211          - values: ['0xCAF110C4', '0x5', '0xCAF110C9']
212          - values: ['0x36A6B239', '0x4', '0x36A6B23D']
213          - values: ['0xA9C7A3F1', '0x4', '0xA9C7A3F5']
214          - values: ['0x76A8E402', '0xE', '0x76A8E400']
215          - values: ['0xB7BFCE38', '0xF', '0xB7BFCE37']
216          - values: ['0x78E8FD86', '0xC', '0x78E8FD82']
217          - values: ['0xAC15926', '0x0', '0xAC15926']
218          - values: ['0x49CC307D', '0x7', '0x49CC3084']
219          - values: ['0xAB00FCF5', '0x6', '0xAB00FCFB']
220          - values: ['0x36863547', '0x3', '0x3686354A']
221          - values: ['0x6AFD4EF', '0xC', '0x6AFD4EB']
222          - values: ['0x41941827', '0x4', '0x4194182B']
223          - values: ['0x2FFB422A', '0xA', '0x2FFB4224']
224
225      - file-name: 'regs'
226        isa:
227          instructions:
228            - sig: inci v:inout:i32, imm:i32
229              acc: none
230              format: [op_v_4_imm_4]
231        runner-options: ['compile-only']
232        code-template: |
233          #
234              inci %s, 0
235        check-type: none
236        description: Check 'inci' with various register numbers.
237        cases:
238          - values: ['v0']
239          - values: ['v1']
240          - values: ['v15']
241          - values: ['v16']
242            runner-options: ['compile-failure']
243
244      - file-name: 'type'
245        isa:
246          verification:
247            - v1_i32
248        bugid: ['964', '1653']
249        tags: ['verifier']
250        description: |
251          Check 'inci' with incorrect register type.
252          Load different values (objects, strings, types, 64-bit floating point values, 64-bit integer values) in register and invoke 'inci'.
253        header-template: []
254        code-template: |
255          .record panda.Object <external>
256          .record B {}
257          .function i32 main() {
258              %s
259              inci v0, 1
260        check-type: exit-positive
261        runner-options: ['verifier-failure', 'verifier-config']
262        cases:
263          - values:
264              - movi.64 v0, 0
265          - values:
266              - fmovi v0, 0
267          - values:
268              - fmovi.64 v0, 0
269          - values:
270              - newobj v0, B
271          - values:
272              - |
273                #
274                    lda.type B
275                    sta.obj v0
276          - values:
277              - |
278                #
279                    lda.type B[]
280                    sta.obj v0
281          - values:
282              - |
283                #
284                    lda.type panda.Object
285                    sta.obj v0
286          - values:
287              - |
288                #
289                    movi v0, 10
290                    newarr v0, v0, i32[]
291          - values:
292              - mov.null v0
293
294      - file-name: uninitialized_reg
295        isa:
296          instructions:
297            - sig: inci v:inout:i32, imm:i32
298              acc: none
299              format: [op_v_4_imm_4]
300        description: Check 'inci' with uninitialized register.
301        tags: ['verifier']
302        runner-options: ['verifier-failure', 'verifier-config']
303        code-template: |
304          #
305              inci v0, 2
306        check-type: exit-positive
307