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: "mov"
17    isa:
18        title: Move register-to-register
19        description: Move values between registers.
20        exceptions:
21          - x_none
22    commands:
23      - file-name: "op_vs_4_vs_4"
24        isa:
25          instructions:
26            - sig: mov v1:out:b32, v2:in:b32
27              acc: none
28              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
29        code-template: |
30          #
31              movi %s, 0x12345678
32              mov %s, %s
33              ldai 0x12345678
34              jne %s, set_failure
35              ldai 0
36              jmp fall_through
37          set_failure:
38              ldai 1
39          fall_through:
40        description: Check mov instruction with different register numbers (4 bit).
41        cases:
42          - values: [v0, v0, v0, v0]
43          - values: [v0, v1, v0, v1]
44          - values: [v0, v2, v0, v2]
45          - values: [v0, v4, v0, v4]
46          - values: [v0, v7, v0, v7]
47          - values: [v1, v1, v1, v1]
48          - values: [v1, v2, v1, v2]
49          - values: [v1, v4, v1, v4]
50          - values: [v1, v7, v1, v7]
51          - values: [v2, v2, v2, v2]
52          - values: [v2, v4, v2, v4]
53          - values: [v2, v7, v2, v7]
54          - values: [v4, v4, v4, v4]
55          - values: [v4, v7, v4, v7]
56          - values: [v7, v7, v7, v7]
57
58      - file-name: "op_vs_8_vs_8"
59        isa:
60          instructions:
61            - sig: mov v1:out:b32, v2:in:b32
62              acc: none
63              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
64        code-template: |
65          #
66              movi %s, 0x12345678
67              mov %s, %s
68              ldai 0x12345678
69              jne %s, set_failure
70              ldai 0
71              jmp fall_through
72          set_failure:
73              ldai 1
74          fall_through:
75        description: Check mov instruction with different register numbers (8 bit).
76        cases:
77          - values: [v0, v8, v0, v8]
78          - values: [v0, v64, v0, v64]
79          - values: [v0, v128, v0, v128]
80          - values: [v0, v255, v0, v255]
81          - values: [v8,   v0, v8, v0]
82          - values: [v64,  v0, v64, v0]
83          - values: [v128, v0, v128, v0]
84          - values: [v255, v0, v255, v0]
85          - values: [v8, v8, v8, v8]
86          - values: [v8, v64, v8, v64]
87          - values: [v8, v128, v8, v128]
88          - values: [v8, v255, v8, v255]
89          - values: [v64, v64, v64, v64]
90          - values: [v64, v128, v64, v128]
91          - values: [v64, v255, v64, v255]
92          - values: [v128, v128, v128, v128]
93          - values: [v128, v255, v128, v255]
94          - values: [v255, v255, v255, v255]
95
96      - file-name: "op_vs_16_vs_16"
97        isa:
98          instructions:
99            - sig: mov v1:out:b32, v2:in:b32
100              acc: none
101              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
102        code-template: |
103          #
104              movi v0, 0x12345678
105              mov %s, v0
106              mov %s, %s
107              mov v1, %s
108              ldai 0x12345678
109              jne v1, set_failure
110              ldai 0
111              jmp fall_through
112          set_failure:
113              ldai 1
114          fall_through:
115        description: Check mov instruction with different register numbers (16 bit).
116        tags: ['tsan']
117        cases:
118          - values: [v256, v256, v256, v256]
119          - values: [v256, v1024, v256, v1024]
120          - values: [v256, v32768, v256, v32768]
121          - values: [v256, v65535, v256, v65535]
122          - values: [v1024, v1024, v1024, v1024]
123          - values: [v1024, v32768, v1024, v32768]
124          - values: [v1024, v65535, v1024, v65535]
125          - values: [v32768, v32768, v32768, v32768]
126          - values: [v32768, v65535, v32768, v65535]
127          - values: [v65535, v65535, v65535, v65535]
128
129      - file-name: "err"
130        isa:
131          instructions:
132            - sig: mov v1:out:b32, v2:in:b32
133              acc: none
134              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
135        code-template: |
136          #
137              mov %s, %s
138        check-type: none
139        runner-options: [compile-failure]
140        description: Test erroneous code with mov instruction.
141        cases:
142          - values: [v0, v65536]
143            description: Check when register number is out of range.
144          - values: [v65536, v65536]
145            description: Check when register number is out of range.
146          - values: [v65536, v0]
147            description: Check when register number is out of range.
148          - values: [v65536, a0]
149            description: Check when register number is out of range and incorrect register name.
150          - values: [a0, v65536]
151            description: Check when register number is out of range and incorrect register name.
152          - values: [a0, a0]
153            description: Check when register number is out of range and incorrect register name.
154          - values: [1, v65536]
155            description: Check with incorrect destination and register number out of range.
156
157      - file-name: "type_1"
158        isa:
159          instructions:
160            - sig: mov v1:out:b32, v2:in:b32
161              acc: none
162              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
163        code-template: |
164          #
165              %s
166              mov v1, v0
167              %s
168              %s
169        bugid: ['1324']
170        tags: ['verifier']
171        runner-options: ['verifier-failure', 'verifier-config']
172        description: |
173          Check mov with different type of source register - i64 (failure) values,
174          f64 (failure) values, Object (failure).
175        cases:
176          - values: ["movi.64 v0, 0", "ldai.64 0", "cmp.64 v1"]
177          - values: ["movi.64 v0, 0x12345678", "ldai.64 0x12345678", "cmp.64 v1"]
178          - values: ["movi.64 v0, 0x123456789", "ldai.64 0x123456789", "fcmpg.64 v1"]
179          - values: ["fmovi.64 v0, 0", "fldai.64 0", "fcmpg.64 v1"]
180          - values: ["fmovi.64 v0, 1", "fldai.64 1", "fcmpg.64 v1"]
181          - values: ["fmovi.64 v0, 0x1", "fldai.64 0x1", "fcmpg.64 v1"]
182          - values: ["fmovi.64 v0, 0x12345678", "fldai.64 0x12345678 ", "fcmpg.64 v1"]
183          - values: ["fmovi.64 v0, 0x123456789", "fldai.64 0x123456789", "fcmpg.64 v1"]
184          - values:
185            - mov.null v0
186            - lda.null
187            - |
188              #
189                  jne.obj v1, return_ne_num
190                  ldai 0
191                  return
192              return_ne_num:
193                  ldai 1
194                  return
195
196      - file-name: "vals_pos"
197        isa:
198          instructions:
199            - sig: mov v1:out:b32, v2:in:b32
200              acc: none
201              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
202        code-template: |
203          #
204              movi v0, %s
205              mov v1, v0
206              lda v0
207              jne v1, set_failure
208              ldai 0
209              return
210          set_failure:
211              ldai 1
212              return
213        check-type: no-check
214        description: Check mov instruction moves i32 value from register to register.
215        cases:
216          - values: ['0']
217          - values: ['1']
218          - values: ['0x80']
219          - values: ['0xff']
220          - values: ['0x8000']
221          - values: ['0xffff']
222          - values: ['0x80000000']
223          - values: ['0xffffffff']
224          - values: ['0x12345678']
225          - values: ['0x87654321']
226
227      - file-name: "vals_pos_f32"
228        isa:
229          instructions:
230            - sig: mov v1:out:b32, v2:in:b32
231              acc: none
232              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
233        code-template: |
234          #
235              fmovi v0, %s
236              mov v1, v0
237              lda v0
238              fcmpg v1
239              jnez set_failure
240              ldai 0
241              return
242          set_failure:
243              ldai 1
244              return
245        check-type: no-check
246        description: Check mov instruction moves f32 value from register to register.
247        cases:
248          - values: ['1e1']
249          - values: ['0.000314']
250
251      - file-name: "vals_neg"
252        isa:
253          instructions:
254            - sig: mov v1:out:b32, v2:in:b32
255              acc: none
256              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
257        code-template: |
258          #
259              movi v0, %s
260              mov v1, v0
261              lda v0
262              jne v1, set_failure
263              ldai 0
264              return
265          set_failure:
266              ldai 1
267              return
268        check-type: no-check
269        description: Check mov instruction moves i32 values from register to register
270        cases:
271          - values: ['-1']
272          - values: ['-0x80']
273          - values: ['-0xff']
274          - values: ['-0x8000']
275          - values: ['-0xffff']
276          - values: ['-0x80000000']
277          - values: ['-0xffffffff']
278          - values: ['-0x12345678']
279          - values: ['-0x87654321']
280
281      - file-name: "vals_neg_f32"
282        isa:
283          instructions:
284            - sig: mov v1:out:b32, v2:in:b32
285              acc: none
286              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
287        code-template: |
288          #
289              fmovi v0, %s
290              mov v1, v0
291              lda v0
292              fcmpg v1
293              jnez set_failure
294              ldai 0
295              return
296          set_failure:
297              ldai 1
298              return
299        check-type: no-check
300        description: Check mov instruction moves f32 values from register to register
301        cases:
302          - values: ['-0.01789']
303          - values: ['-0.2e-2']
304
305      - file-name: "type"
306        tags: ['verifier']
307        isa:
308          instructions:
309            - sig: mov v1:out:b32, v2:in:b32
310              acc: none
311              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
312          verification:
313            - v2_type
314        runner-options: ['verifier-failure', 'verifier-config']
315        header-template: []
316        code-template: |
317            #
318            .record A {}
319            .record B {}
320            .record panda.String <external>
321            .record panda.Object <external>
322            .function i32 main() {
323                %s
324                *s
325                mov v0, v1
326                ldai 0
327        check-type: no-check
328        description: Check mov with incorrect source register type. Destination type is not checked.
329        template-cases:
330          - values:
331              - |
332                #
333                    lda.type B
334                    sta.obj v0
335          - values:
336              - |
337                #
338                    lda.type B[]
339                    sta.obj v0
340          - values:
341              - |
342                #
343                    lda.type panda.String
344                    sta.obj v0
345          - values:
346              - |
347                #
348                    lda.type panda.Object
349                    sta.obj v0
350          - values:
351              - |
352                #
353                    movi v0, 10
354                    newarr v0, v0, i32[]
355          - values:
356              - mov.null v0
357          - values:
358              - movi v0, 0
359          - values:
360              - movi.64 v0, 0
361          - values:
362              - fmovi.64 v0, 0
363        cases:
364          - values:
365              - movi.64 v1, 0
366          - values:
367              - fmovi.64 v1, 0
368          - values:
369              - |
370                #
371                    lda.type A
372                    sta.obj v1
373          - values:
374              - |
375                #
376                    lda.type A[]
377                    sta.obj v1
378          - values:
379              - |
380                #
381                    lda.type panda.String
382                    sta.obj v1
383          - values:
384              - |
385                #
386                    lda.str "string"
387                    sta.obj v1
388          - values:
389              - |
390                #
391                    lda.type panda.Object
392                    sta.obj v1
393          - values:
394              - |
395                #
396                    movi v1, 10
397                    newarr v1, v1, f64[]
398          - values:
399              - mov.null v1
400
401      - file-name: uninitialized_regs
402        isa:
403          instructions:
404            - sig: mov v1:out:b32, v2:in:b32
405              acc: none
406              format: [op_v1_4_v2_4, op_v1_8_v2_8, op_v1_16_v2_16]
407        description: Check mov with uninitialized registers.
408        tags: ['verifier']
409        runner-options: ['verifier-failure', 'verifier-config']
410        header-template: []
411        code-template: |
412          #
413          .function u32 main() {
414              %s
415              *s
416              mov %s, *s
417              ldai 0
418        check-type: no-check
419        template-cases:
420          - values: ['', 'v0']
421          - values: ['', 'v256']
422          - values: ['', 'v65535']
423          - values:
424              - movi.64 v2, 0
425              - v2
426          - values:
427              - |
428                #
429                    fmovi.64 v1, 0
430                    mov.64 v65534, v1
431              - v65534
432          - values:
433              - |
434                #
435                    fmovi.64 v1, 0
436                    mov.64 v257, v1
437              - v257
438        cases:
439          - values:
440              - ''
441              - v0
442          - values:
443              - ''
444              - v8
445          - values:
446              - ''
447              - v15
448          - values:
449              - ''
450              - v256
451          - values:
452              - ''
453              - v65535
454