• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021 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
14---
15definitions:
16  - name: java
17    template: >
18      .language Java
19
20tests:
21  - file-name: call
22    isa:
23      title: Static call
24      description: >
25        Call indicated static method, i.e. create new frame, pass values of arguments and
26        continue execution from the first instruction of a method.
27        Callee should treat accumulator value as undefined and cannot use it until accumulator
28        definition in the new frame.
29        Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details).
30        Method, its class and the number of argument is resolved by given method_id in
31        runtime constant-pool.
32        Arguments are passed in source registers in the same order as in method signature.
33        Non-range instructions can be used to pass up to 4 arguments (unused register slot values will
34        be discarded and corresponding registers will not be passed to the callee).
35        For methods with more arguments range kind of instruction is to be used, which takes the needed number
36        of arguments starting from 'vs' register.
37      exceptions:
38        - x_none
39      verification:
40        - method_id_static
41        - compatible_arguments
42    commands:
43      - file-name: op_v1_4_v2_4_v3_4_v4_4_id_16
44        isa:
45          instructions:
46            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
47              acc: out:top
48              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
49        header-template: []
50        description: Check that 'call' supports up to 4 arguments.
51        tags: ['tsan']
52        code-template: |
53          .function void f1(%s) {
54              return.void
55          }
56          .function i32 main() {
57          %s
58              call f1%s
59        check-type: exit-positive
60        cases:
61          - values:
62            - ''
63            - ''
64            - ''
65          - values:
66            - 'i32 a0'
67            - 'movi v0, 0'
68            - ', v0'
69          - values:
70            - 'i32 a0, i32 a1'
71            - 'movi v0, 0'
72            - ', v0, v0'
73          - values:
74            - 'i32 a0, i32 a1'
75            - |
76              #
77                  movi v0, 0
78                  movi v1, 0
79            - ', v0, v1'
80          - values:
81            - 'i32 a0, i32 a1'
82            - |
83              #
84                  movi v0, 0
85                  movi v1, 0
86            - ', v1, v0'
87          - values:
88            - 'i64 a0, f64 a1'
89            - |
90              #
91                  movi.64 v0, 0
92                  fmovi.64 v1, 0
93            - ', v0, v1'
94          - values:
95              - 'i32 a0, i32 a1, i32 a2'
96              - 'movi v0, 0'
97              - ', v0, v0, v0'
98          - values:
99              - 'i32 a0, i32 a1, i32 a2, i32 a3'
100              - 'movi v0, 0'
101              - ', v0, v0, v0, v0'
102          - values:
103              - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4'
104              - |
105                #
106                    movi v0, 0
107                    movi v1, 0
108                    movi v2, 0
109                    movi v3, 0
110              - ', v0, v1, v2, v3'
111            runner-options: [compile-failure]
112          - values:
113              - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4'
114              - |
115                #
116                    movi v0, 0
117                    movi v1, 0
118                    movi v2, 0
119                    movi v3, 0
120                    movi v4, 0
121              - ', v0, v1, v2, v3, v4'
122            runner-options: [compile-failure]
123
124      - file-name: str_arg
125        isa:
126          instructions:
127            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
128              acc: out:top
129              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
130        header-template: [panda_string]
131        description: Check that 'call' works with String object.
132        code-template: |
133          .function void f1(panda.String a0) {
134              return.void
135          }
136          .function i32 main() {
137          %s
138              call f1%s
139        check-type: exit-positive
140        cases:
141          - values:
142            - ''
143            - ''
144            runner-options: [compile-failure]
145          - values:
146            - |
147              #
148                  lda.str "some string"
149                  sta.obj v0
150            - ', v0'
151          - values:
152            - '    mov.null v0'
153            - ', v0'
154          - values:
155            - ''
156            - ', "some string"'
157            runner-options: [compile-failure]
158
159      - file-name: uninitialized_values
160        bugid: ['1324']
161        tags: ['verifier']
162        runner-options: ['verifier-failure', 'verifier-debug-config']
163        isa:
164          instructions:
165            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
166              acc: out:top
167              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
168        description: Verifier should check usage of uninitialized arguments passed to function.
169        header-template: []
170        code-template: |
171          .function void f1(%s) {
172              %s
173              return.void
174          }
175          .function i32 main() {
176              %s
177              call f1%s
178        check-type: exit-positive
179
180        # Template parameters:
181        #            1st argument is function arguments
182        #            2nd - usage of acc or reg
183        #            3rd - possible initialization of registers
184        #            4th - call parameters
185        cases:
186          - values: ['i32 a0',          '',          '',    ', v0']
187          - values: ['i32 a0, i32 a1, i32 a2, i32 a3',  '',          '',    ', v0, v0, v0, v0']
188          - values: ['i32 a0, f64 a1, i64 a2, i32 a3',  '',          '',    ', v0, v1, v2, v3']
189          - values: ['i32 a0, i32 a1',  '',          'movi v0, 0',    ', v0, v1']
190            description: Check if several registers in 'call' is uninitialized.
191          - values: ['i32 a0, f64 a1, i64 a2, i32 a3',  '',          'movi v0, 0',    ', v0, v1, v2, v3']
192            description: Check if several registers in 'call' is uninitialized.
193          - values:
194            - ''
195            - |
196              #
197                  lda a3
198                  lda a4
199            - ''
200            - ''
201            description: Check usage of undefined parameter.
202            runner-options: [compile-failure]
203
204      - file-name: uninitialized_reg_no_arg
205        bugid: ['1324']
206        tags: ['verifier']
207        runner-options: ['verifier-failure', 'verifier-debug-config']
208        isa:
209          instructions:
210            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
211              acc: out:top
212              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
213        description: Verifier should check usage of uninitialized registers in function.
214        header-template: []
215        code-template: |
216          .function void f1() {
217              %s
218              return.void
219          }
220          .function i32 main() {
221              %s
222              call f1
223        check-type: exit-positive
224        cases:
225          - values:
226            - lda v0
227            - movi v0, 123
228          - values:
229            - lda v1
230            - movi v1, 123
231          - values:
232            - lda.64 v0
233            - movi.64 v0, 0xFFFFFFFFFFFFFFFF
234          - values:
235            - lda.64 v1
236            - movi.64 v1, 0xFFFFFFFFFFFFFFFF
237          - values:
238            - lda.64 v0
239            - fmovi.64 v0, 3.1415926535
240          - values:
241            - lda.64 v1
242            - movi.64 v1, 0xFFFFFFFFFFFFFFFF
243          - values:
244            - lda.obj v0
245            - |
246              #
247                  lda.str "some string"
248                  sta.obj v0
249          - values:
250            - lda.obj v1
251            - |
252              #
253                  lda.str "some string"
254                  sta.obj v1
255
256      - file-name: args_count_mismatch
257        runner-options: [compile-only]
258        isa:
259          instructions:
260            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
261              acc: out:top
262              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
263        description: Check 'call' when arguments of function and instuction parameters mismatch.
264        header-template: []
265        code-template: |
266          .function void f1(%s) {
267              return.void
268          }
269          .function i32 main() {
270              %s
271              call f1%s
272        check-type: exit-positive
273
274        # Template parameters:
275        #            1st - function arguments
276        #            2nd - possible initialization of registers
277        #            3rd - call parameters
278        cases:
279          - values: ['',                '',            ', v0']
280            description: Check uninitialized register is ignored when its value is not used.
281          - values: ['',                '',            ', v0, v0, v0, v0']
282            description: Check uninitialized register is ignored when its value is not used.
283          - values: ['i32 a0',          '',            '']
284            runner-options: [compile-failure]
285            description: Mismatch function parameters.
286          - values: ['i32 a0, i32 a1, i32 a2, i32 a3',  'movi v0, 0',  ', v0, v0, v0']
287            runner-options: [compile-failure]
288            description: Mismatch function parameters.
289          - values: ['i32 a0, i32 a1, i32 a2, i32 a3',  'movi v0, 0',  ', v0']
290            runner-options: [compile-failure]
291            description: Mismatch function parameters.
292          - values: ['',                'movi v0, 0',  ', v0']
293            description: Check initialized register is ignored when its value is not used.
294          - values: ['i32 a0',                'movi v0, 0',  ', v0, v0, v0, v0']
295            description: Check initialized register is ignored when its value is not used.
296          - values: ['i32 a0, i32 a1, i32 a2',                'movi v0, 0',  ', v0, v0, v0, v0']
297            description: Check initialized register is ignored when its value is not used.
298
299      - file-name: args_type_mismatch
300        bugid: ['1324']
301        tags: ['verifier']
302        runner-options: ['verifier-failure', 'verifier-debug-config']
303        isa:
304          instructions:
305            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
306              acc: out:top
307              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
308        description: Check 'call' when argument type of function and instuction mismatch.
309        header-template: []
310        code-template: |
311          %s
312          .function void f1(%s) {
313              return.void
314          }
315          .function i32 main() {
316              %s
317              call f1, v0
318        check-type: exit-positive
319
320        # Template parameters:
321        #            1 - type definitions
322        #            2 - function arguments
323        #            3 - possible initialization of registers
324        #            4 - call parameters
325        cases:
326            - values: ['',                'i32 a0',      'mov.null v0']
327            - values: ['',                'i64 a0',      'mov.null v0']
328            - values: ['',                'f64 a0',      'mov.null v0']
329            - values: ['',                'i32 a0',      'movi.64 v0, 0']
330            - values: ['',                'f64 a0',      'movi.64 v0, 0']
331            - values: ['.record Obj {}',  'Obj a0',      'movi.64 v0, 0']
332            - values: ['',                'i64 a0',      'movi v0, 0']
333            - values: ['',                'f64 a0',      'movi v0, 0']
334            - values: ['.record Obj {}',  'Obj a0',      'movi v0, 0']
335            - values:
336              - |
337                #
338                .record Obj {}
339
340                .function void Obj.ctor(Obj a0) <ctor> {
341                    return.void
342                }
343              - i32 a0
344              - |
345                #
346                    initobj.short Obj.ctor
347                    sta v0
348
349            - values:
350                - |
351                  #
352                  .record Obj {}
353
354                  .function void Obj.ctor(Obj a0) <ctor> {
355                      return.void
356                  }
357                - i64 a0
358                - |
359                  #
360                      initobj.short Obj.ctor
361                      sta v0
362
363      - file-name: reg
364        runner-options: [compile-only]
365        isa:
366          instructions:
367            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
368              acc: out:top
369              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
370        description: Check 'call' register number width.
371        header-template: []
372        code-template: |
373          .function void f1(i32 a0) {
374              return.void
375          }
376          .function i32 main() {
377              movi %s, 0
378              call f1, %s
379        check-type: exit-positive
380        cases:
381          - values: ['v0', 'v0']
382          - values: ['v7', 'v7']
383          - values: ['v8', 'v8']
384          - values: ['v15', 'v15']
385          - values: ['v16', 'v16']
386            runner-options: [compile-failure]
387          - values: ['v127', 'v127']
388            runner-options: [compile-failure]
389          - values: ['v0', '1']
390            runner-options: [compile-failure]
391          - values: ['v0', '1.1']
392            runner-options: [compile-failure]
393          - values: ['v0', '0xFFFFFFFFFFFFFFFF']
394            runner-options: [compile-failure]
395          - values: ['v0', '"some string"']
396            runner-options: [compile-failure]
397
398      - file-name: reg2
399        runner-options: [compile-only]
400        isa:
401          instructions:
402            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
403              acc: out:top
404              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
405        description: Check 'call' register number width.
406        header-template: []
407        code-template: |
408          .function void f1(i32 a0, i32 a1, i32 a2, i32 a3) {
409              return.void
410          }
411          .function i32 main() {
412              movi %s, 0
413              movi %s, 1
414              movi %s, 2
415              movi %s, 3
416              call f1, %s, %s, %s, %s
417        check-type: exit-positive
418        cases:
419          - values: ['v0', 'v1', 'v2', 'v3', 'v0', 'v1', 'v2', 'v3']
420          - values: ['v12', 'v13', 'v14', 'v15', 'v13', 'v13', 'v14', 'v15']
421          - values: ['v15', 'v15', 'v15', 'v15', 'v15', 'v15', 'v15', 'v15']
422          - values: ['v15', 'v16', 'v15', 'v16', 'v15', 'v16', 'v15', 'v16']
423            runner-options: [compile-failure]
424          - values: ['v16', 'v15', 'v16', 'v15', 'v16', 'v15', 'v16', 'v15']
425            runner-options: [compile-failure]
426          - values: ['v16', 'v16', 'v16', 'v16', 'v16', 'v16', 'v16', 'v16']
427            runner-options: [compile-failure]
428          - values: ['v127', 'v127', 'v127', 'v127', 'v127', 'v127', 'v127', 'v127']
429            runner-options: [compile-failure]
430
431      - file-name: arg_1_i32_acc
432        isa:
433          instructions:
434            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
435              acc: out:top
436              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
437        description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments.
438        tags: ['tsan']
439        header-template: []
440        code-template: |
441          .function i32 f1(i32 a0) {
442              lda a0
443              movi v1, %s
444              jne v1, exit_failure
445              ldai 0
446              return
447          exit_failure:
448              ldai 1
449              return
450          }
451          .function i32 main() {
452              movi v0, %s
453              call f1, v0
454
455        check-type: no-check
456        cases:
457          - values: ["0", "0"]
458          - values: ["1", "1"]
459          - values: ["1234567", "1234567"]
460          - values: ["0x7FFFFFFF", "0x7FFFFFFF"]
461          - values: ["0x80000000", "0x80000000"]
462          - values: ["0x9ABCDEF0", "0x9ABCDEF0"]
463          - values: ["0xFFFFFFFF", "0xFFFFFFFF"]
464
465      - file-name: arg_1_f64_acc
466        isa:
467          instructions:
468            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
469              acc: out:top
470              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
471        description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments.
472        header-template: []
473        code-template: |
474          .function i32 f1(f64 a0) {
475              lda.64 a0
476              fmovi.64 v1, %s
477              fcmpg.64 v1
478              return
479          }
480          .function i32 main() {
481              fmovi.64 v0, %s
482              call f1, v0
483        check-type: no-check
484        cases:
485          - values: ["0", "0"]
486          - values: ["1.1", "1.1"]
487          - values: ["0x7ff0000000000000", "0x7ff0000000000000"]
488          - values: ["0xfff0000000000000", "0xfff0000000000000"]
489          - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"]
490          - values: ["0xffefffffffffffff", "0xffefffffffffffff"]
491          - values: ["100e100", "100e100"]
492
493      - file-name: arg_1_i32_reg
494        isa:
495          instructions:
496            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
497              acc: out:top
498              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
499        description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments.
500        header-template: []
501        code-template: |
502          .function i32 f1(i32 a0) {
503              mov v1, a0
504              ldai %s
505              jne v1, exit_failure
506              ldai 0
507              return
508          exit_failure:
509              ldai 1
510              return
511          }
512          .function i32 main() {
513              movi v0, %s
514              call f1, v0
515        check-type: no-check
516        cases:
517          - values: ["0", "0"]
518          - values: ["1", "1"]
519          - values: ["1234567", "1234567"]
520          - values: ["0x7FFFFFFF", "0x7FFFFFFF"]
521          - values: ["0x80000000", "0x80000000"]
522          - values: ["0x9ABCDEF0", "0x9ABCDEF0"]
523          - values: ["0xFFFFFFFF", "0xFFFFFFFF"]
524
525      - file-name: arg_1_f64_reg
526        isa:
527          instructions:
528            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
529              acc: out:top
530              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
531        description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments.
532        header-template: []
533        code-template: |
534          .function i32 f1(f64 a0) {
535              mov.64 v1, a0
536              fldai.64 %s
537              fcmpg.64 v1
538              return
539          }
540          .function i32 main() {
541              fmovi.64 v0, %s
542              call f1, v0
543        check-type: no-check
544        cases:
545          - values: ["0", "0"]
546          - values: ["1.1", "1.1"]
547          - values: ["0x7ff0000000000000", "0x7ff0000000000000"]
548          - values: ["0xfff0000000000000", "0xfff0000000000000"]
549          - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"]
550          - values: ["0xffefffffffffffff", "0xffefffffffffffff"]
551          - values: ["100e100", "100e100"]
552
553      - file-name: arg_2_i32_acc
554        isa:
555          instructions:
556            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
557              acc: out:top
558              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
559        description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments.
560        header-template: []
561        code-template: |
562          .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) {
563              lda a0
564              movi v1, %s
565              jeq v1, f1_check1
566          # 1st arg does not match, exit
567              ldai 1
568              return
569          f1_check1:
570              lda a1
571              movi v1, %s
572              jeq v1, f1_check2
573              ldai 1
574              return
575          f1_check2:
576              lda a2
577              movi v1, %s
578              jeq v1, f1_check3
579              ldai 1
580              return
581          f1_check3:
582              lda a3
583              movi v1, %s
584              jne v1, exit_failure
585              ldai 0
586              return
587          exit_failure:
588              ldai 1
589              return
590          }
591          .function i32 main() {
592              movi v0, %s
593              movi v1, %s
594              movi v2, %s
595              movi v3, %s
596              call f1, v0, v1, v2, v3
597
598        check-type: no-check
599        cases:
600          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
601          - values: ["0", "1", "2", "3", "0", "1", "2", "3"]
602          - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"]
603          - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"]
604          - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"]
605          - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"]
606          - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"]
607          - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"]
608          - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"]
609          - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"]
610          - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"]
611          - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"]
612
613      - file-name: arg_2_i32_reg
614        isa:
615          instructions:
616            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
617              acc: out:top
618              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
619        description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments.
620        header-template: []
621        code-template: |
622          .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) {
623              mov v1, a0
624              ldai %s
625              jeq v1, f1_check1
626          # 1st arg does not match, exit
627              ldai 1
628              return
629          f1_check1:
630              mov v1, a1
631              ldai %s
632              jeq v1, f1_check2
633          # 1st arg does not match, exit
634              ldai 1
635              return
636          f1_check2:
637              mov v1, a2
638              ldai %s
639              jeq v1, f1_check3
640          # 1st arg does not match, exit
641              ldai 1
642              return
643          f1_check3:
644              mov v1, a3
645              ldai %s
646              jne v1, exit_failure
647              ldai 0
648              return
649          exit_failure:
650              ldai 1
651              return
652          }
653          .function i32 main() {
654              movi v0, %s
655              movi v1, %s
656              movi v2, %s
657              movi v3, %s
658              call f1, v0, v1, v2, v3
659        check-type: no-check
660        cases:
661          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
662          - values: ["0", "1", "2", "3", "0", "1", "2", "3"]
663          - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"]
664          - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"]
665          - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"]
666          - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"]
667          - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"]
668          - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"]
669          - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"]
670          - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"]
671          - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"]
672          - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"]
673
674      - file-name: arg_2_f64_acc
675        isa:
676          instructions:
677            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
678              acc: out:top
679              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
680        description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments.
681        header-template: []
682        code-template: |
683          .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) {
684              lda.64 a0
685              fmovi.64 v1, %s
686              fcmpg.64 v1
687              jeqz f1_check1
688          # 1st arg does not match, exit
689              ldai 1
690              return
691          f1_check1:
692              lda.64 a1
693              fmovi.64 v1, %s
694              fcmpg.64 v1
695              jeqz f1_check2
696              ldai 1
697              return
698          f1_check2:
699              lda.64 a2
700              fmovi.64 v1, %s
701              fcmpg.64 v1
702              jeqz f1_check3
703              ldai 1
704              return
705          f1_check3:
706              lda.64 a3
707              fmovi.64 v1, %s
708              fcmpg.64 v1
709              return
710          }
711          .function i32 main() {
712              fmovi.64 v0, %s
713              fmovi.64 v1, %s
714              fmovi.64 v2, %s
715              fmovi.64 v3, %s
716              call f1, v0, v1, v2, v3
717
718        check-type: no-check
719        cases:
720          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
721          - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"]
722          - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"]
723          - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"]
724          - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"]
725
726      - file-name: arg_2_f64_reg
727        isa:
728          instructions:
729            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
730              acc: out:top
731              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
732        description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments.
733        tags: ['tsan']
734        header-template: []
735        code-template: |
736          .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) {
737              mov.64 v1, a0
738              fldai.64 %s
739              fcmpg.64 v1
740              jeqz f1_check1
741          # 1st arg does not match, exit
742              ldai 1
743              return
744          f1_check1:
745              mov.64 v1, a1
746              fldai.64 %s
747              fcmpg.64 v1
748              jeqz f1_check2
749          # 1st arg does not match, exit
750              ldai 1
751              return
752          f1_check2:
753              mov.64 v1, a2
754              fldai.64 %s
755              fcmpg.64 v1
756              jeqz f1_check3
757          # 1st arg does not match, exit
758              ldai 1
759              return
760          f1_check3:
761              mov.64 v1, a3
762              fldai.64 %s
763              fcmpg.64 v1
764              return
765          }
766          .function i32 main() {
767              fmovi.64 v0, %s
768              fmovi.64 v1, %s
769              fmovi.64 v2, %s
770              fmovi.64 v3, %s
771              call f1, v0, v1, v2, v3
772        check-type: no-check
773        cases:
774          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
775          - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"]
776          - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"]
777          - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"]
778          - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"]
779
780      - file-name: arg_1_i64_acc
781        isa:
782          instructions:
783            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
784              acc: out:top
785              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
786        description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments.
787        header-template: []
788        code-template: |
789          .function i32 f1(i64 a0) {
790              lda.64 a0
791              movi.64 v1, %s
792              cmp.64 v1
793              return
794          }
795          .function i32 main() {
796              movi.64 v0, %s
797              call f1, v0
798
799        check-type: no-check
800        cases:
801          - values: ["0", "0"]
802          - values: ["1", "1"]
803          - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"]
804          - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"]
805          - values: ["0x8000000000000000", "0x8000000000000000"]
806          - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"]
807          - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"]
808
809      - file-name: arg_1_i64_reg
810        isa:
811          instructions:
812            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
813              acc: out:top
814              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
815        description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments.
816        header-template: []
817        code-template: |
818          .function i32 f1(i64 a0) {
819              mov.64 v1, a0
820              ldai.64 %s
821              cmp.64 v1
822              return
823          }
824          .function i32 main() {
825              movi.64 v0, %s
826              call f1, v0
827
828        check-type: no-check
829        cases:
830          - values: ["0", "0"]
831          - values: ["1", "1"]
832          - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"]
833          - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"]
834          - values: ["0x8000000000000000", "0x8000000000000000"]
835          - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"]
836          - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"]
837
838      - file-name: arg_2_i64_acc
839        isa:
840          instructions:
841            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
842              acc: out:top
843              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
844        description: Check correctness of passed arguments. Load parameter to accumulator.
845        header-template: []
846        code-template: |
847          .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) {
848              lda.64 a0
849              movi.64 v1, %s
850              cmp.64 v1
851              jeqz f1_check1
852          # 1st arg does not match, exit
853              ldai 1
854              return
855          f1_check1:
856              lda.64 a1
857              movi.64 v1, %s
858              cmp.64 v1
859              jeqz f1_check2
860          # 1st arg does not match, exit
861              ldai 1
862              return
863          f1_check2:
864              lda.64 a2
865              movi.64 v1, %s
866              cmp.64 v1
867              jeqz f1_check3
868          # 1st arg does not match, exit
869              ldai 1
870              return
871          f1_check3:
872              lda.64 a3
873              movi.64 v1, %s
874              cmp.64 v1
875              return
876          }
877          .function i32 main() {
878              movi.64 v0, %s
879              movi.64 v1, %s
880              movi.64 v2, %s
881              movi.64 v3, %s
882              call f1, v0, v1, v2, v3
883
884        check-type: no-check
885        cases:
886          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
887          - values: ["0", "1", "0", "1", "0", "1", "0", "1"]
888          - values: ["1", "0", "1", "0", "1", "0", "1", "0"]
889          - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"]
890          - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"]
891          - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"]
892          - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"]
893
894      - file-name: arg_2_i64_reg
895        isa:
896          instructions:
897            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
898              acc: out:top
899              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
900        description: Check correctness of passed arguments. Load parameter to register. Check i64 type of arguments.
901        header-template: []
902        code-template: |
903          .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) {
904              mov.64 v1, a0
905              ldai.64 %s
906              cmp.64 v1
907              jeqz f1_check1
908          # 1st arg does not match, exit
909              ldai 1
910              return
911          f1_check1:
912              mov.64 v1, a1
913              ldai.64 %s
914              cmp.64 v1
915              jeqz f1_check2
916          # 1st arg does not match, exit
917              ldai 1
918              return
919          f1_check2:
920              mov.64 v1, a2
921              ldai.64 %s
922              cmp.64 v1
923              jeqz f1_check3
924          # 1st arg does not match, exit
925              ldai 1
926              return
927          f1_check3:
928
929              mov.64 v1, a3
930              ldai.64 %s
931              cmp.64 v1
932              return
933          }
934          .function i32 main() {
935              movi.64 v0, %s
936              movi.64 v1, %s
937              movi.64 v2, %s
938              movi.64 v3, %s
939              call f1, v0, v1, v2, v3
940
941        check-type: no-check
942        cases:
943          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
944          - values: ["0", "1", "0", "1", "0", "1", "0", "1"]
945          - values: ["1", "0", "1", "0", "1", "0", "1", "0"]
946          - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"]
947          - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"]
948          - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"]
949          - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"]
950
951      - file-name: arg_1_obj_acc
952        isa:
953          instructions:
954            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
955              acc: out:top
956              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
957        description: Check correctness of passed arguments. Load parameter to accumulator. Check object type of arguments.
958        header-template: [obj_ctor]
959        code-template: |
960          .function Obj fnc(Obj a0) {
961              lda.obj a0
962              return.obj
963          }
964
965          .function i32 main() {
966              %s
967              sta.obj v0
968              ldai 0 # acc is i32
969              call fnc, v0 # acc contains returned Obj
970              jne.obj v0, return_ne_num
971              ldai 0
972              return
973          return_ne_num:
974              ldai 1
975              return
976
977        check-type: no-check
978        cases:
979          - values:
980            - "lda.null"
981          - values:
982            - "initobj Obj.ctor"
983
984      - file-name: arg_2_obj_acc
985        isa:
986          instructions:
987            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
988              acc: out:top
989              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
990        description: Check correctness of passed arguments. Load parameter to accumulator. Check object type.
991        tags: ['tsan']
992        header-template: [obj_ctor]
993        code-template: |
994          .record ObjTuple {
995              Obj o0
996              Obj o1
997              Obj o2
998              Obj o3
999          }
1000
1001          .function void ObjTuple.ctor(ObjTuple a0, Obj a1, Obj a2, Obj a3, Obj a4) <ctor> {
1002              lda.obj a1
1003              stobj.obj a0, ObjTuple.o0
1004              lda.obj a2
1005              stobj.obj a0, ObjTuple.o1
1006              lda.obj a3
1007              stobj.obj a0, ObjTuple.o2
1008              lda.obj a4
1009              stobj.obj a0, ObjTuple.o3
1010              return.void
1011          }
1012
1013          .function ObjTuple getObjTuple(Obj a0, Obj a1, Obj a2, Obj a3) {
1014              mov.obj v0, a0
1015              mov.obj v1, a1
1016              mov.obj v2, a2
1017              mov.obj v3, a3
1018              initobj ObjTuple.ctor, v0, v1, v2, v3
1019              return.obj
1020          }
1021
1022          .function i32 main() {
1023              %s
1024              call getObjTuple, v0, v1, v2, v3
1025              sta.obj v4
1026
1027              # check ObjTuple.o0 contains correct value (v0)
1028              ldobj.obj v4, ObjTuple.o0
1029              jeq.obj v0, tuple_2_check_1
1030              ldai 1
1031              return
1032          tuple_2_check_1:
1033              # check ObjTuple.o1 contains correct value (v1)
1034              ldobj.obj v4, ObjTuple.o1
1035              jeq.obj v1, tuple_2_check_2
1036              ldai 1
1037              return
1038          tuple_2_check_2:
1039              # check ObjTuple.o2 contains correct value (v2)
1040              ldobj.obj v4, ObjTuple.o2
1041              jeq.obj v2, tuple_2_check_3
1042              ldai 1
1043              return
1044          tuple_2_check_3:
1045              # check ObjTuple.o3 contains correct value (v3)
1046              ldobj.obj v4, ObjTuple.o3
1047              jne.obj v3, return_ne_num
1048              ldai 0
1049              return
1050          return_ne_num:
1051              ldai 1
1052              return
1053
1054        check-type: no-check
1055        cases:
1056          - values:
1057              - |
1058                #
1059                    mov.null v0
1060                    mov.null v1
1061                    mov.null v2
1062                    mov.null v3
1063          - values:
1064              - |
1065                #
1066                    initobj.short Obj.ctor
1067                    sta.obj v0
1068                    initobj.short Obj.ctor
1069                    sta.obj v1
1070                    initobj.short Obj.ctor
1071                    sta.obj v2
1072                    initobj.short Obj.ctor
1073                    sta.obj v3
1074          - values:
1075              - |
1076                #
1077                    mov.null v0
1078                    initobj.short Obj.ctor
1079                    sta.obj v1
1080                    initobj.short Obj.ctor
1081                    sta.obj v2
1082                    initobj.short Obj.ctor
1083                    sta.obj v3
1084          - values:
1085              - |
1086                #
1087                    initobj.short Obj.ctor
1088                    sta.obj v0
1089                    mov.null v1
1090                    initobj.short Obj.ctor
1091                    sta.obj v2
1092                    initobj.short Obj.ctor
1093                    sta.obj v3
1094          - values:
1095              - |
1096                #
1097                    initobj.short Obj.ctor
1098                    sta.obj v0
1099                    initobj.short Obj.ctor
1100                    sta.obj v1
1101                    mov.null v2
1102                    initobj.short Obj.ctor
1103                    sta.obj v3
1104          - values:
1105              - |
1106                #
1107                    initobj.short Obj.ctor
1108                    sta.obj v0
1109                    initobj.short Obj.ctor
1110                    sta.obj v1
1111                    initobj.short Obj.ctor
1112                    sta.obj v2
1113                    mov.null v3
1114
1115      - file-name: arg_2_str_acc
1116        isa:
1117          instructions:
1118              - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
1119                acc: out:top
1120                format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
1121        description: Check correctness of passed arguments. Load parameter to accumulator. Check String type.
1122        header-template: [panda_string]
1123        code-template: |
1124          .record ObjTuple {
1125              panda.String o1
1126              panda.String o2
1127          }
1128
1129          .function void ObjTuple.ctor(ObjTuple a0, panda.String a1, panda.String a2) <ctor> {
1130              lda.obj a1
1131              stobj.obj a0, ObjTuple.o1
1132              lda.obj a2
1133              stobj.obj a0, ObjTuple.o2
1134              return.void
1135          }
1136
1137          .function ObjTuple getObjTuple(panda.String a0, panda.String a1) {
1138              mov.obj v0, a0
1139              mov.obj v1, a1
1140              initobj.short ObjTuple.ctor, v0, v1
1141              return.obj
1142          }
1143
1144          .function i32 main() {
1145              %s
1146              call getObjTuple, v0, v1
1147              sta.obj v2
1148
1149              # check ObjTuple.o1 contains correct value (v0)
1150              ldobj.obj v2, ObjTuple.o1
1151              jeq.obj v0, tuple_2_check
1152              ldai 1
1153              return
1154          tuple_2_check:
1155              # check ObjTuple.o2 contains correct value (v1)
1156              ldobj.obj v2, ObjTuple.o2
1157              jeq.obj v1, tuple_2_check_passed
1158              ldai 1
1159              return
1160          tuple_2_check_passed:
1161              ldai 0
1162
1163        check-type: no-check
1164        cases:
1165          - values:
1166              - |
1167                #
1168                    mov.null v0
1169                    mov.null v1
1170          - values:
1171              - |
1172                #
1173                    lda.str "some string 1"
1174                    sta.obj v0
1175                    lda.str "some string 2"
1176                    sta.obj v1
1177          - values:
1178              - |
1179                #
1180                    mov.null v0
1181                    lda.str "some string 2"
1182                    sta.obj v1
1183          - values:
1184              - |
1185                #
1186                    lda.str "some string 1"
1187                    sta.obj v0
1188                    mov.null v1
1189
1190
1191      - file-name: method_id_not_static_p
1192        tags: ['verifier']
1193        bugid: ['3247']
1194        runner-options: ['verifier-failure', 'verifier-debug-config']
1195        isa:
1196          instructions:
1197            - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
1198              acc: out:top
1199              format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
1200          verification:
1201            - method_id_static
1202            - method_id_non_abstract
1203        description: Method_id must resolve to a static method in Panda Assembly context. Not static methods should be rejected by verifier.
1204        header-template: []
1205        code-template: |
1206            .record A {}
1207
1208            .function void A.ctor(A a0) <ctor> {
1209                return.void
1210            }
1211
1212            .function i32 A.foo(A a0%s) *s
1213
1214            .function i32 main() {
1215                initobj A.ctor
1216                sta.obj v0
1217                %s
1218                call A.foo, v0%s
1219        check-type: exit-positive
1220        cases:
1221            - values:
1222              - |
1223                {
1224                    ldai 0
1225                    return
1226                }
1227              ignore: true
1228            - values: ['<noimpl>']
1229              ignore: true
1230            - values:
1231              - |
1232                <static> {
1233                    ldai 0
1234                    return
1235                }
1236              runner-options: ['verifier-only', 'verifier-debug-config']
1237        template-cases:
1238          - values: ['', '##-', '']
1239          - values: [', A a1', 'mov.obj v1, v0', ', v1']
1240
1241      - file-name: amount_of_args
1242        isa:
1243          instructions:
1244              - sig: call method_id, v1:in:top, v2:in:top, v3:in:top, v4:in:top
1245                acc: out:top
1246                format: [op_v1_4_v2_4_v3_4_v4_4_id_16]
1247        header-template: []
1248        description: Compiler should check amount of `call.short` argument and function parameters.
1249        code-template: |
1250            .function void f1(i32 a0%s) {
1251                return.void
1252            }
1253            .function i32 main() {
1254                call f1%s
1255        check-type: none
1256        runner-options: [compile-failure]
1257        cases:
1258            - values: ['', '']
1259            - values: [', i32 a1', '']
1260            - values: [', i32 a1', ', v0']
1261            - values: [', i32 a1, i32 a2', '']
1262            - values: [', i32 a1, i32 a2', ', v0']
1263            - values: [', i32 a1, i32 a2', ', v0, v0']
1264            - values: [', i32 a1, i32 a2, i32 a3', '']
1265            - values: [', i32 a1, i32 a2, i32 a3', ', v0']
1266            - values: [', i32 a1, i32 a2, i32 a3', ', v0, v0']
1267            - values: [', i32 a1, i32 a2, i32 a3', ', v0, v0, v0']
1268            - values: [', i32 a1, i32 a2, i32 a3, i32 a4', '']
1269            - values: [', i32 a1, i32 a2, i32 a3, i32 a4', ', v0']
1270            - values: [', i32 a1, i32 a2, i32 a3, i32 a4', ', v0, v0, v0, v0']
1271
1272      - file-name: unused_regs
1273        isa:
1274          description: >
1275            Non-range instructions can be used to pass up to 4 arguments (unused register slot values will
1276            be discarded and corresponding registers will not be passed to the callee).
1277        header-template: []
1278        description: Verifier should ignore unused register slots.
1279        code-template: |
1280            .function i32 foo(%s) {
1281                ldai 0
1282                return
1283            }
1284            .function i32 main() {
1285                %s
1286                call foo%s
1287        check-type: no-check
1288        cases:
1289          - values:
1290            - ""
1291            - ""
1292            - ", v5, v4, v3, v2"
1293          - values:
1294            - "i32 a0"
1295            - |
1296              #
1297                  movi v5, 123
1298            - ", v5, v4, v3"
1299          - values:
1300            - "i64 a0, i32 a1"
1301            - |
1302              #
1303                  movi v2, 1
1304                  movi.64 v6, 123456789
1305            - ", v6, v2, v0"
1306          - values:
1307            - "f64 a0, i64 a1, i32 a2"
1308            - |
1309              #
1310                  movi v7, 1
1311                  movi.64 v0, 123456789
1312                  fmovi.64 v8, 1.1
1313            - ", v8, v0, v7, v9"
1314