• 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---
14definitions:
15  - name: java
16    template: >
17      .language Java
18
19tests:
20  - file-name: call.range
21    isa:
22      title: Static call
23      description: >
24        Call indicated static method, i.e. create new frame, pass values of arguments and
25        continue execution from the first instruction of a method.
26        Callee should treat accumulator value as undefined and cannot use it until accumulator
27        definition in the new frame.
28        Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details).
29        Method, its class and the number of argument is resolved by given method_id in
30        runtime constant-pool.
31        Arguments are passed in source registers in the same order as in method signature.
32        Non-range instructions can be used to pass up to 4 arguments (unused register slot values will
33        be discarded and corresponding registers will not be passed to the callee).
34        For methods with more arguments range kind of instruction is to be used, which takes the needed number
35        of arguments starting from 'vs' register.
36      exceptions:
37        - x_none
38      verification:
39        - method_id_static
40        - compatible_arguments
41
42    commands:
43      - file-name: op_v_8_id_32_args
44        isa:
45          instructions:
46            - sig: call.range method_id, v:in:top
47              acc: out:top
48              format: [op_v_8_id_16]
49        header-template: []
50        description: Check that 'call.range' invokes function with different amount of args.
51        tags: ['tsan']
52        code-template: |
53          .function void f1(%s) {
54              return.void
55          }
56          .function i32 main() {
57              %s
58              call.range f1, v0
59        check-type: exit-positive
60        cases:
61          - values: ['', '']
62          - values:
63            - 'i32 a0'
64            - 'movi v0, 0'
65          - values:
66            - 'i32 a0, i32 a1'
67            - |
68              #
69                  movi v0, 0
70                  movi v1, 0
71
72          - values:
73            - 'i32 a0, i32 a1, i32 a2, i32 a3'
74            - |
75              #
76                  movi v0, 0
77                  movi v1, 0
78                  movi v2, 0
79                  movi v3, 0
80          - values:
81              - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255'
82              - ''
83            runner-options: [compile-only]
84          - values:
85              - 'i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255, i32 a256'
86              - ''
87            runner-options: [compile-only]
88
89      - file-name: str_args
90        isa:
91          instructions:
92            - sig: call.range method_id, v:in:top
93              acc: out:top
94              format: [op_v_8_id_16]
95        header-template: [panda_string]
96        description: Check that 'call.range' works with String object.
97        tags: ['tsan']
98        code-template: |
99          .function void f1(panda.String a0) {
100              return.void
101          }
102          .function i32 main() {
103          %s
104              call.range f1%s
105        check-type: exit-positive
106        cases:
107          - values:
108            - ''
109            - ''
110            runner-options: [compile-failure]
111          - values:
112            - |
113              #
114                  lda.str "some string"
115                  sta.obj v0
116            - ', v0'
117          - values:
118            - '    mov.null v0'
119            - ', v0'
120          - values:
121            - ''
122            - ', "some string"'
123            runner-options: [compile-failure]
124
125      - file-name: reg
126        isa:
127          instructions:
128            - sig: call.range method_id, v:in:top
129              acc: out:top
130              format: [op_v_8_id_16]
131        header-template: []
132        description: Check 'call.range' available register number width.
133        code-template: |
134          .function void f1() {
135              return.void
136          }
137          .function i32 main() {
138              call.range f1, %s
139        check-type: exit-positive
140        cases:
141          - values:
142            - 'v0'
143          - values:
144            - 'v1'
145          - values:
146            - 'v127'
147          - values:
148            - 'v255'
149          - values:
150            - 'v256'
151            runner-options: [compile-failure]
152          - values:
153            - '0'
154            runner-options: [compile-failure]
155          - values:
156            - '0x7fffffff'
157            runner-options: [compile-failure]
158          - values:
159            - '1.1'
160            runner-options: [compile-failure]
161          - values:
162            - '"some string"'
163            runner-options: [compile-failure]
164          - case-template: |
165              .function void f1(i32 a0, i32 a1, i32 a2, i32 a3, i32 a4, i32 a5, i32 a6, i32 a7, i32 a8, i32 a9, i32 a10, i32 a11, i32 a12, i32 a13, i32 a14, i32 a15, i32 a16, i32 a17, i32 a18, i32 a19, i32 a20, i32 a21, i32 a22, i32 a23, i32 a24, i32 a25, i32 a26, i32 a27, i32 a28, i32 a29, i32 a30, i32 a31, i32 a32, i32 a33, i32 a34, i32 a35, i32 a36, i32 a37, i32 a38, i32 a39, i32 a40, i32 a41, i32 a42, i32 a43, i32 a44, i32 a45, i32 a46, i32 a47, i32 a48, i32 a49, i32 a50, i32 a51, i32 a52, i32 a53, i32 a54, i32 a55, i32 a56, i32 a57, i32 a58, i32 a59, i32 a60, i32 a61, i32 a62, i32 a63, i32 a64, i32 a65, i32 a66, i32 a67, i32 a68, i32 a69, i32 a70, i32 a71, i32 a72, i32 a73, i32 a74, i32 a75, i32 a76, i32 a77, i32 a78, i32 a79, i32 a80, i32 a81, i32 a82, i32 a83, i32 a84, i32 a85, i32 a86, i32 a87, i32 a88, i32 a89, i32 a90, i32 a91, i32 a92, i32 a93, i32 a94, i32 a95, i32 a96, i32 a97, i32 a98, i32 a99, i32 a100, i32 a101, i32 a102, i32 a103, i32 a104, i32 a105, i32 a106, i32 a107, i32 a108, i32 a109, i32 a110, i32 a111, i32 a112, i32 a113, i32 a114, i32 a115, i32 a116, i32 a117, i32 a118, i32 a119, i32 a120, i32 a121, i32 a122, i32 a123, i32 a124, i32 a125, i32 a126, i32 a127, i32 a128, i32 a129, i32 a130, i32 a131, i32 a132, i32 a133, i32 a134, i32 a135, i32 a136, i32 a137, i32 a138, i32 a139, i32 a140, i32 a141, i32 a142, i32 a143, i32 a144, i32 a145, i32 a146, i32 a147, i32 a148, i32 a149, i32 a150, i32 a151, i32 a152, i32 a153, i32 a154, i32 a155, i32 a156, i32 a157, i32 a158, i32 a159, i32 a160, i32 a161, i32 a162, i32 a163, i32 a164, i32 a165, i32 a166, i32 a167, i32 a168, i32 a169, i32 a170, i32 a171, i32 a172, i32 a173, i32 a174, i32 a175, i32 a176, i32 a177, i32 a178, i32 a179, i32 a180, i32 a181, i32 a182, i32 a183, i32 a184, i32 a185, i32 a186, i32 a187, i32 a188, i32 a189, i32 a190, i32 a191, i32 a192, i32 a193, i32 a194, i32 a195, i32 a196, i32 a197, i32 a198, i32 a199, i32 a200, i32 a201, i32 a202, i32 a203, i32 a204, i32 a205, i32 a206, i32 a207, i32 a208, i32 a209, i32 a210, i32 a211, i32 a212, i32 a213, i32 a214, i32 a215, i32 a216, i32 a217, i32 a218, i32 a219, i32 a220, i32 a221, i32 a222, i32 a223, i32 a224, i32 a225, i32 a226, i32 a227, i32 a228, i32 a229, i32 a230, i32 a231, i32 a232, i32 a233, i32 a234, i32 a235, i32 a236, i32 a237, i32 a238, i32 a239, i32 a240, i32 a241, i32 a242, i32 a243, i32 a244, i32 a245, i32 a246, i32 a247, i32 a248, i32 a249, i32 a250, i32 a251, i32 a252, i32 a253, i32 a254, i32 a255, i32 a256) {
166                  return.void
167              }
168              .function i32 main() {
169                  call.range f1, v255
170            runner-options: [compile-only]
171
172      - file-name: uninitialized_values
173        bugid: ['1324']
174        tags: ['verifier']
175        runner-options: ['verifier-failure', 'verifier-debug-config']
176        isa:
177          instructions:
178            - sig: call.range method_id, v:in:top
179              acc: out:top
180              format: [op_v_8_id_16]
181        description: Verifier should check usage of uninitialized arguments passed to function.
182        header-template: []
183        code-template: |
184          .function void f1(%s) {
185              %s
186              return.void
187          }
188          .function i32 main() {
189              %s
190              call.range f1%s
191        check-type: exit-positive
192
193        # Template parameters:
194        #            1st argument is function arguments
195        #            2nd - usage of acc or reg
196        #            3rd - possible initialization of registers
197        #            4th - call parameters
198        cases:
199          - values: ['i32 a0',          '',          '',    ', v0']
200          - values: ['i32 a0, i32 a1, i32 a2, i32 a3',  '',          '',    ', v0']
201          - values: ['i32 a0, f64 a1, i64 a2, i32 a3',  '',          '',    ', v0']
202          - values: ['i32 a0, i32 a1',  '',          'movi v0, 0',    ', v0']
203            description: Check if several registers in 'call.range' is uninitialized.
204          - values: ['i32 a0, f64 a1, i64 a2, i32 a3',  '',          'movi v0, 0',    ', v0']
205            description: Check if several registers in 'call.range' is uninitialized.
206          - values:
207            - ''
208            - |
209              #
210                  lda a3
211                  lda a4
212            - ''
213            - ''
214            description: Check usage of undefined parameter.
215            runner-options: [compile-failure]
216
217      - file-name: uninitialized_reg_no_arg
218        bugid: ['1324']
219        tags: ['verifier']
220        runner-options: ['verifier-failure', 'verifier-debug-config']
221        isa:
222          instructions:
223            - sig: call.range method_id, v:in:top
224              acc: out:top
225              format: [op_v_8_id_16]
226        description: Verifier should check usage of uninitialized registers in function.
227        header-template: []
228        code-template: |
229          .function void f1() {
230              %s
231              return.void
232          }
233          .function i32 main() {
234              %s
235              movi v2, 0
236              call.range f1, v2
237        check-type: exit-positive
238        cases:
239          - values:
240            - lda v0
241            - movi v0, 123
242          - values:
243            - lda v1
244            - movi v1, 123
245          - values:
246            - lda.64 v0
247            - movi.64 v0, 0xFFFFFFFFFFFFFFFF
248          - values:
249            - lda.64 v1
250            - movi.64 v1, 0xFFFFFFFFFFFFFFFF
251          - values:
252            - lda.64 v0
253            - fmovi.64 v0, 3.1415926535
254          - values:
255            - lda.64 v1
256            - movi.64 v1, 0xFFFFFFFFFFFFFFFF
257          - values:
258            - lda.obj v0
259            - |
260              #
261                  lda.str "some string"
262                  sta.obj v0
263          - values:
264            - lda.obj v1
265            - |
266              #
267                  lda.str "some string"
268                  sta.obj v1
269
270      - file-name: args_type_mismatch
271        bugid: ['1324']
272        tags: ['verifier']
273        runner-options: ['verifier-failure', 'verifier-debug-config']
274        isa:
275          instructions:
276            - sig: call.range method_id, v:in:top
277              acc: out:top
278              format: [op_v_8_id_16]
279        description: Check 'call.range' when argument type of function and instuction mismatch.
280        header-template: []
281        code-template: |
282          %s
283          .function void f1(%s) {
284              return.void
285          }
286          .function i32 main() {
287              %s
288              call.range f1, v0
289        check-type: exit-positive
290
291        # Template parameters:
292        #            1 - type definitions
293        #            2 - function arguments
294        #            3 - possible initialization of registers
295        cases:
296            - values: ['',                'i32 a0',      'mov.null v0']
297            - values: ['',                'i64 a0',      'mov.null v0']
298            - values: ['',                'f64 a0',      'mov.null v0']
299            - values: ['',                'i32 a0',      'movi.64 v0, 0']
300            - values: ['',                'f64 a0',      'movi.64 v0, 0']
301            - values: ['.record Obj {}',  'Obj a0',      'movi.64 v0, 0']
302            - values: ['',                'i64 a0',      'movi v0, 0']
303            - values: ['',                'f64 a0',      'movi v0, 0']
304            - values: ['.record Obj {}',  'Obj a0',      'movi v0, 0']
305            - values:
306              - |
307                #
308                .record Obj {}
309
310                .function void Obj.ctor(Obj a0) <ctor> {
311                    return.void
312                }
313              - i32 a0
314              - |
315                #
316                    initobj.short Obj.ctor
317                    sta.obj v0
318
319            - values:
320                - |
321                  #
322                  .record Obj {}
323
324                  .function void Obj.ctor(Obj a0) <ctor> {
325                      return.void
326                  }
327                - i64 a0
328                - |
329                  #
330                      initobj.short Obj.ctor
331                      sta.obj v0
332
333      - file-name: reg_err
334        runner-options: [compile-failure]
335        isa:
336          instructions:
337            - sig: call.range method_id, v:in:top
338              acc: out:top
339              format: [op_v_8_id_16]
340        description: Check 'call.range' register number width.
341        header-template: []
342        code-template: |
343          .function void f1(i32 a0) {
344              return.void
345          }
346          .function i32 main() {
347              call.range f1, %s
348        check-type: exit-positive
349        cases:
350          - values: ['1']
351          - values: ['1.1']
352          - values: ['0xFFFFFFFFFFFFFFFF']
353          - values: ['"some string"']
354
355      - file-name: arg_1_i32_acc
356        isa:
357          instructions:
358            - sig: call.range method_id, v:in:top
359              acc: out:top
360              format: [op_v_8_id_16]
361        description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments.
362        header-template: []
363        code-template: |
364          .function i32 f1(i32 a0) {
365              lda a0
366              movi v1, %s
367              jne v1, exit_failure
368              ldai 0
369              return
370          exit_failure:
371              ldai 1
372              return
373          }
374          .function i32 main() {
375              movi v0, %s
376              call.range f1, v0
377
378        check-type: no-check
379        cases:
380          - values: ["0", "0"]
381          - values: ["1", "1"]
382          - values: ["1234567", "1234567"]
383          - values: ["0x7FFFFFFF", "0x7FFFFFFF"]
384          - values: ["0x80000000", "0x80000000"]
385          - values: ["0x9ABCDEF0", "0x9ABCDEF0"]
386          - values: ["0xFFFFFFFF", "0xFFFFFFFF"]
387
388      - file-name: arg_1_f64_acc
389        isa:
390          instructions:
391            - sig: call.range method_id, v:in:top
392              acc: out:top
393              format: [op_v_8_id_16]
394        description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments.
395        header-template: []
396        code-template: |
397          .function i32 f1(f64 a0) {
398              lda.64 a0
399              fmovi.64 v1, %s
400              fcmpg.64 v1
401              return
402          }
403          .function i32 main() {
404              fmovi.64 v0, %s
405              call.range f1, v0
406        check-type: no-check
407        cases:
408          - values: ["0", "0"]
409          - values: ["1.1", "1.1"]
410          - values: ["0x7ff0000000000000", "0x7ff0000000000000"]
411          - values: ["0xfff0000000000000", "0xfff0000000000000"]
412          - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"]
413          - values: ["0xffefffffffffffff", "0xffefffffffffffff"]
414          - values: ["100e100", "100e100"]
415
416      - file-name: arg_1_i32_reg
417        isa:
418          instructions:
419            - sig: call.range method_id, v:in:top
420              acc: out:top
421              format: [op_v_8_id_16]
422        description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments.
423        header-template: []
424        code-template: |
425          .function i32 f1(i32 a0) {
426              mov v1, a0
427              ldai %s
428              jne v1, exit_failure
429              ldai 0
430              return
431          exit_failure:
432              ldai 1
433              return
434          }
435          .function i32 main() {
436              movi v0, %s
437              call.range f1, v0
438        check-type: no-check
439        cases:
440          - values: ["0", "0"]
441          - values: ["1", "1"]
442          - values: ["1234567", "1234567"]
443          - values: ["0x7FFFFFFF", "0x7FFFFFFF"]
444          - values: ["0x80000000", "0x80000000"]
445          - values: ["0x9ABCDEF0", "0x9ABCDEF0"]
446          - values: ["0xFFFFFFFF", "0xFFFFFFFF"]
447
448      - file-name: arg_1_f64_reg
449        isa:
450          instructions:
451            - sig: call.range method_id, v:in:top
452              acc: out:top
453              format: [op_v_8_id_16]
454        description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments.
455        header-template: []
456        code-template: |
457          .function i32 f1(f64 a0) {
458              mov.64 v1, a0
459              fldai.64 %s
460              fcmpg.64 v1
461              return
462          }
463          .function i32 main() {
464              fmovi.64 v0, %s
465              call.range f1, v0
466        check-type: no-check
467        cases:
468          - values: ["0", "0"]
469          - values: ["1.1", "1.1"]
470          - values: ["0x7ff0000000000000", "0x7ff0000000000000"]
471          - values: ["0xfff0000000000000", "0xfff0000000000000"]
472          - values: ["0x7fefffffffffffff", "0x7fefffffffffffff"]
473          - values: ["0xffefffffffffffff", "0xffefffffffffffff"]
474          - values: ["100e100", "100e100"]
475
476      - file-name: arg_2_i32_acc
477        isa:
478          instructions:
479            - sig: call.range method_id, v:in:top
480              acc: out:top
481              format: [op_v_8_id_16]
482        description: Check correctness of passed arguments. Load parameter to accumulator. Check i32 type of arguments.
483        header-template: []
484        code-template: |
485          .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) {
486              lda a0
487              movi v1, %s
488              jeq v1, f1_check1
489          # 1st arg does not match, exit
490              ldai 1
491              return
492          f1_check1:
493              lda a1
494              movi v1, %s
495              jeq v1, f1_check2
496              ldai 1
497              return
498          f1_check2:
499              lda a2
500              movi v1, %s
501              jeq v1, f1_check3
502              ldai 1
503              return
504          f1_check3:
505              lda a3
506              movi v1, %s
507              jne v1, exit_failure
508              ldai 0
509              return
510          exit_failure:
511              ldai 1
512              return
513          }
514          .function i32 main() {
515              movi v0, %s
516              movi v1, %s
517              movi v2, %s
518              movi v3, %s
519              call.range f1, v0
520
521        check-type: no-check
522        cases:
523          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
524          - values: ["0", "1", "2", "3", "0", "1", "2", "3"]
525          - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"]
526          - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"]
527          - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"]
528          - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"]
529          - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"]
530          - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"]
531          - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"]
532          - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"]
533          - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"]
534          - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"]
535
536      - file-name: arg_2_i32_reg
537        isa:
538          instructions:
539            - sig: call.range method_id, v:in:top
540              acc: out:top
541              format: [op_v_8_id_16]
542        description: Check correctness of passed arguments. Load parameter to register. Check i32 type of arguments.
543        header-template: []
544        code-template: |
545          .function i32 f1(i32 a0, i32 a1, i32 a2, i32 a3) {
546              mov v1, a0
547              ldai %s
548              jeq v1, f1_check1
549          # 1st arg does not match, exit
550              ldai 1
551              return
552          f1_check1:
553              mov v1, a1
554              ldai %s
555              jeq v1, f1_check2
556          # 1st arg does not match, exit
557              ldai 1
558              return
559          f1_check2:
560              mov v1, a2
561              ldai %s
562              jeq v1, f1_check3
563          # 1st arg does not match, exit
564              ldai 1
565              return
566          f1_check3:
567              mov v1, a3
568              ldai %s
569              jne v1, exit_failure
570              ldai 0
571              return
572          exit_failure:
573              ldai 1
574              return
575          }
576          .function i32 main() {
577              movi v0, %s
578              movi v1, %s
579              movi v2, %s
580              movi v3, %s
581              call.range f1, v0
582        check-type: no-check
583        cases:
584          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
585          - values: ["0", "1", "2", "3", "0", "1", "2", "3"]
586          - values: ["-3", "-2", "-1", "0", "-3", "-2", "-1", "0"]
587          - values: ["0", "1234567", "89101112", "13141516", "0", "1234567", "89101112", "13141516"]
588          - values: ["0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF", "0x7FFFFFFF"]
589          - values: ["0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000"]
590          - values: ["0x80000000", "0", "0x80000000", "0", "0x80000000", "0", "0x80000000", "0"]
591          - values: ["0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000", "0x80000000"]
592          - values: ["0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678", "0x9ABCDEF0", "0xFEDCBA09", "0x87654321", "0x12345678"]
593          - values: ["0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF"]
594          - values: ["0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0", "0xFFFFFFFF", "0"]
595          - values: ["0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF", "0xFFFFFFFF"]
596
597      - file-name: arg_2_f64_acc
598        isa:
599          instructions:
600            - sig: call.range method_id, v:in:top
601              acc: out:top
602              format: [op_v_8_id_16]
603        description: Check correctness of passed arguments. Load parameter to accumulator. Check f64 type of arguments.
604        header-template: []
605        code-template: |
606          .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) {
607              lda.64 a0
608              fmovi.64 v1, %s
609              fcmpg.64 v1
610              jeqz f1_check1
611          # 1st arg does not match, exit
612              ldai 1
613              return
614          f1_check1:
615              lda.64 a1
616              fmovi.64 v1, %s
617              fcmpg.64 v1
618              jeqz f1_check2
619              ldai 1
620              return
621          f1_check2:
622              lda.64 a2
623              fmovi.64 v1, %s
624              fcmpg.64 v1
625              jeqz f1_check3
626              ldai 1
627              return
628          f1_check3:
629              lda.64 a3
630              fmovi.64 v1, %s
631              fcmpg.64 v1
632              return
633          }
634          .function i32 main() {
635              fmovi.64 v0, %s
636              fmovi.64 v1, %s
637              fmovi.64 v2, %s
638              fmovi.64 v3, %s
639              call.range f1, v0
640        check-type: no-check
641        cases:
642          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
643          - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"]
644          - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"]
645          - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"]
646          - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"]
647
648      - file-name: arg_2_f64_reg
649        isa:
650          instructions:
651            - sig: call.range method_id, v:in:top
652              acc: out:top
653              format: [op_v_8_id_16]
654        description: Check correctness of passed arguments. Load parameter to register. Check f64 type of arguments.
655        tags: ['tsan']
656        header-template: []
657        code-template: |
658          .function i32 f1(f64 a0, f64 a1, f64 a2, f64 a3) {
659              mov.64 v1, a0
660              fldai.64 %s
661              fcmpg.64 v1
662              jeqz f1_check1
663          # 1st arg does not match, exit
664              ldai 1
665              return
666          f1_check1:
667              mov.64 v1, a1
668              fldai.64 %s
669              fcmpg.64 v1
670              jeqz f1_check2
671          # 1st arg does not match, exit
672              ldai 1
673              return
674          f1_check2:
675              mov.64 v1, a2
676              fldai.64 %s
677              fcmpg.64 v1
678              jeqz f1_check3
679          # 1st arg does not match, exit
680              ldai 1
681              return
682          f1_check3:
683              mov.64 v1, a3
684              fldai.64 %s
685              fcmpg.64 v1
686              return
687          }
688          .function i32 main() {
689              fmovi.64 v0, %s
690              fmovi.64 v1, %s
691              fmovi.64 v2, %s
692              fmovi.64 v3, %s
693              call.range f1, v0
694        check-type: no-check
695        cases:
696          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
697          - values: ["1.2", "1.1", "1.3", "1.4", "1.2", "1.1", "1.3", "1.4"]
698          - values: ["0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001", "0x7ff0000000000000", "0xfff0000000000000", "0x0000000000000001", "0x8000000000000001"]
699          - values: ["0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89", "0xffefffffffffffff", "0x7fefffffffffffff", "3.1415926535", "3.1415926535e89"]
700          - values: ["100e100", "200e200", "-50e-50", "123e123", "100e100", "200e200", "-50e-50", "123e123"]
701
702      - file-name: arg_1_i64_acc
703        isa:
704          instructions:
705            - sig: call.range method_id, v:in:top
706              acc: out:top
707              format: [op_v_8_id_16]
708        description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments.
709        header-template: []
710        code-template: |
711          .function i32 f1(i64 a0) {
712              lda.64 a0
713              movi.64 v1, %s
714              cmp.64 v1
715              return
716          }
717          .function i32 main() {
718              movi.64 v0, %s
719              call.range f1, v0
720
721        check-type: no-check
722        cases:
723          - values: ["0", "0"]
724          - values: ["1", "1"]
725          - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"]
726          - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"]
727          - values: ["0x8000000000000000", "0x8000000000000000"]
728          - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"]
729          - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"]
730
731      - file-name: arg_1_i64_reg
732        isa:
733          instructions:
734            - sig: call.range method_id, v:in:top
735              acc: out:top
736              format: [op_v_8_id_16]
737        description: Check correctness of passed arguments. Load parameter to accumulator. Check i64 type of arguments.
738        header-template: []
739        code-template: |
740          .function i32 f1(i64 a0) {
741              mov.64 v1, a0
742              ldai.64 %s
743              cmp.64 v1
744              return
745          }
746          .function i32 main() {
747              movi.64 v0, %s
748              call.range f1, v0
749
750        check-type: no-check
751        cases:
752          - values: ["0", "0"]
753          - values: ["1", "1"]
754          - values: ["0x1234567890ABCDEF", "0x1234567890ABCDEF"]
755          - values: ["0x7FFFFFFFFFFFFFFF", "0x7FFFFFFFFFFFFFFF"]
756          - values: ["0x8000000000000000", "0x8000000000000000"]
757          - values: ["0xFEDCBA0987654321", "0xFEDCBA0987654321"]
758          - values: ["0xFFFFFFFFFFFFFFFF", "0xFFFFFFFFFFFFFFFF"]
759
760      - file-name: arg_2_i64_acc
761        isa:
762          instructions:
763            - sig: call.range method_id, v:in:top
764              acc: out:top
765              format: [op_v_8_id_16]
766        description: Check correctness of passed arguments. Load parameter to accumulator.
767        header-template: []
768        code-template: |
769          .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) {
770              lda.64 a0
771              movi.64 v1, %s
772              cmp.64 v1
773              jeqz f1_check1
774          # 1st arg does not match, exit
775              ldai 1
776              return
777          f1_check1:
778              lda.64 a1
779              movi.64 v1, %s
780              cmp.64 v1
781              jeqz f1_check2
782          # 1st arg does not match, exit
783              ldai 1
784              return
785          f1_check2:
786              lda.64 a2
787              movi.64 v1, %s
788              cmp.64 v1
789              jeqz f1_check3
790          # 1st arg does not match, exit
791              ldai 1
792              return
793          f1_check3:
794              lda.64 a3
795              movi.64 v1, %s
796              cmp.64 v1
797              return
798          }
799          .function i32 main() {
800              movi.64 v0, %s
801              movi.64 v1, %s
802              movi.64 v2, %s
803              movi.64 v3, %s
804              call.range f1, v0
805
806        check-type: no-check
807        cases:
808          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
809          - values: ["0", "1", "0", "1", "0", "1", "0", "1"]
810          - values: ["1", "0", "1", "0", "1", "0", "1", "0"]
811          - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"]
812          - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"]
813          - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"]
814          - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"]
815
816      - file-name: arg_2_i64_reg
817        isa:
818          instructions:
819            - sig: call.range method_id, v:in:top
820              acc: out:top
821              format: [op_v_8_id_16]
822        description: Check correctness of passed arguments. Load parameter to register. Check i64 type of arguments.
823        tags: ['tsan']
824        header-template: []
825        code-template: |
826          .function i32 f1(i64 a0, i64 a1, i64 a2, i64 a3) {
827              mov.64 v1, a0
828              ldai.64 %s
829              cmp.64 v1
830              jeqz f1_check1
831          # 1st arg does not match, exit
832              ldai 1
833              return
834          f1_check1:
835              mov.64 v1, a1
836              ldai.64 %s
837              cmp.64 v1
838              jeqz f1_check2
839          # 1st arg does not match, exit
840              ldai 1
841              return
842          f1_check2:
843              mov.64 v1, a2
844              ldai.64 %s
845              cmp.64 v1
846              jeqz f1_check3
847          # 1st arg does not match, exit
848              ldai 1
849              return
850          f1_check3:
851
852              mov.64 v1, a3
853              ldai.64 %s
854              cmp.64 v1
855              return
856          }
857          .function i32 main() {
858              movi.64 v0, %s
859              movi.64 v1, %s
860              movi.64 v2, %s
861              movi.64 v3, %s
862              call.range f1, v0
863
864        check-type: no-check
865        cases:
866          - values: ["0", "0", "0", "0", "0", "0", "0", "0"]
867          - values: ["0", "1", "0", "1", "0", "1", "0", "1"]
868          - values: ["1", "0", "1", "0", "1", "0", "1", "0"]
869          - values: ["0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123", "0x1234567890ABCDEF", "0x234567890ABCDEF1", "0x34567890ABCDEF12", "0x4567890ABCDEF123"]
870          - values: ["0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0", "0x7FFFFFFFFFFFFFFF", "0"]
871          - values: ["0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000", "0x8000000000000000"]
872          - values: ["0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED", "0xFEDCBA0987654321", "0xEDCBA0987654321F", "0xDCBA0987654321FE", "0xCBA0987654321FED"]
873
874      - file-name: arg_1_obj_acc
875        isa:
876          instructions:
877            - sig: call.range method_id, v:in:top
878              acc: out:top
879              format: [op_v_8_id_16]
880        description: Check correctness of passed arguments. Load parameter to accumulator. Check object type of arguments.
881        tags: ['tsan']
882        header-template: [obj_ctor]
883        code-template: |
884          .function Obj fnc(Obj a0) {
885              lda.obj a0
886              return.obj
887          }
888
889          .function i32 main() {
890              %s
891              sta.obj v0
892              ldai 0 # acc is i32
893              call.range fnc, v0 # acc contains returned Obj
894              jne.obj v0, return_ne_num
895              ldai 0
896              return
897          return_ne_num:
898              ldai 1
899              return
900
901        check-type: no-check
902        cases:
903          - values:
904            - "lda.null"
905          - values:
906            - "initobj Obj.ctor"
907
908      - file-name: arg_2_obj_acc
909        isa:
910          instructions:
911            - sig: call.range method_id, v:in:top
912              acc: out:top
913              format: [op_v_8_id_16]
914        description: Check correctness of passed arguments. Load parameter to accumulator. Check object type.
915        header-template: [obj_ctor]
916        code-template: |
917          .record ObjTuple {
918              Obj o0
919              Obj o1
920              Obj o2
921              Obj o3
922          }
923
924          .function void ObjTuple.ctor(ObjTuple a0, Obj a1, Obj a2, Obj a3, Obj a4) <ctor> {
925              lda.obj a1
926              stobj.obj a0, ObjTuple.o0
927              lda.obj a2
928              stobj.obj a0, ObjTuple.o1
929              lda.obj a3
930              stobj.obj a0, ObjTuple.o2
931              lda.obj a4
932              stobj.obj a0, ObjTuple.o3
933              return.void
934          }
935
936          .function ObjTuple getObjTuple(Obj a0, Obj a1, Obj a2, Obj a3) {
937              mov.obj v0, a0
938              mov.obj v1, a1
939              mov.obj v2, a2
940              mov.obj v3, a3
941              initobj ObjTuple.ctor, v0, v1, v2, v3
942              return.obj
943          }
944
945          .function i32 main() {
946              %s
947              call.range getObjTuple, v0
948              sta.obj v4
949
950              # check ObjTuple.o0 contains correct value (v0)
951              ldobj.obj v4, ObjTuple.o0
952              jeq.obj v0, tuple_2_check_1
953              ldai 1
954              return
955          tuple_2_check_1:
956              # check ObjTuple.o1 contains correct value (v1)
957              ldobj.obj v4, ObjTuple.o1
958              jeq.obj v1, tuple_2_check_2
959              ldai 1
960              return
961          tuple_2_check_2:
962              # check ObjTuple.o2 contains correct value (v2)
963              ldobj.obj v4, ObjTuple.o2
964              jeq.obj v2, tuple_2_check_3
965              ldai 1
966              return
967          tuple_2_check_3:
968              # check ObjTuple.o3 contains correct value (v3)
969              ldobj.obj v4, ObjTuple.o3
970              jne.obj v3, 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              - |
981                #
982                    mov.null v0
983                    mov.null v1
984                    mov.null v2
985                    mov.null v3
986          - values:
987              - |
988                #
989                    initobj.short Obj.ctor
990                    sta.obj v0
991                    initobj.short Obj.ctor
992                    sta.obj v1
993                    initobj.short Obj.ctor
994                    sta.obj v2
995                    initobj.short Obj.ctor
996                    sta.obj v3
997          - values:
998              - |
999                #
1000                    mov.null v0
1001                    initobj.short Obj.ctor
1002                    sta.obj v1
1003                    initobj.short Obj.ctor
1004                    sta.obj v2
1005                    initobj.short Obj.ctor
1006                    sta.obj v3
1007          - values:
1008              - |
1009                #
1010                    initobj.short Obj.ctor
1011                    sta.obj v0
1012                    mov.null v1
1013                    initobj.short Obj.ctor
1014                    sta.obj v2
1015                    initobj.short Obj.ctor
1016                    sta.obj v3
1017          - values:
1018              - |
1019                #
1020                    initobj.short Obj.ctor
1021                    sta.obj v0
1022                    initobj.short Obj.ctor
1023                    sta.obj v1
1024                    mov.null v2
1025                    initobj.short Obj.ctor
1026                    sta.obj v3
1027          - values:
1028              - |
1029                #
1030                    initobj.short Obj.ctor
1031                    sta.obj v0
1032                    initobj.short Obj.ctor
1033                    sta.obj v1
1034                    initobj.short Obj.ctor
1035                    sta.obj v2
1036                    mov.null v3
1037
1038      - file-name: arg_2_str_acc
1039        isa:
1040          instructions:
1041            - sig: call.range method_id, v:in:top
1042              acc: out:top
1043              format: [op_v_8_id_16]
1044        description: Check correctness of passed arguments. Load parameter to accumulator. Check String type.
1045        tags: ['tsan']
1046        header-template: [panda_string]
1047        code-template: |
1048          .record ObjTuple {
1049              panda.String o0
1050              panda.String o1
1051              panda.String o2
1052              panda.String o3
1053          }
1054
1055          .function void ObjTuple.ctor(ObjTuple a0, panda.String a1, panda.String a2, panda.String a3, panda.String a4) <ctor> {
1056              lda.obj a1
1057              stobj.obj a0, ObjTuple.o0
1058              lda.obj a2
1059              stobj.obj a0, ObjTuple.o1
1060              lda.obj a3
1061              stobj.obj a0, ObjTuple.o2
1062              lda.obj a4
1063              stobj.obj a0, ObjTuple.o3
1064              return.void
1065          }
1066
1067          .function ObjTuple getObjTuple(panda.String a0, panda.String a1, panda.String a2, panda.String a3) {
1068              mov.obj v0, a0
1069              mov.obj v1, a1
1070              mov.obj v2, a2
1071              mov.obj v3, a3
1072              initobj ObjTuple.ctor, v0, v1, v2, v3
1073              return.obj
1074          }
1075
1076          .function i32 main() {
1077              %s
1078              call.range getObjTuple, v0
1079              sta.obj v4
1080
1081              # check ObjTuple.o0 contains correct value (v0)
1082              ldobj.obj v4, ObjTuple.o0
1083              jeq.obj v0, tuple_2_check_1
1084              ldai 1
1085              return
1086          tuple_2_check_1:
1087              # check ObjTuple.o1 contains correct value (v1)
1088              ldobj.obj v4, ObjTuple.o1
1089              jeq.obj v1, tuple_2_check_2
1090              ldai 1
1091              return
1092          tuple_2_check_2:
1093              # check ObjTuple.o2 contains correct value (v2)
1094              ldobj.obj v4, ObjTuple.o2
1095              jeq.obj v2, tuple_2_check_3
1096              ldai 1
1097              return
1098          tuple_2_check_3:
1099              # check ObjTuple.o3 contains correct value (v3)
1100              ldobj.obj v4, ObjTuple.o3
1101              jne.obj v3, return_ne_num
1102              ldai 0
1103              return
1104          return_ne_num:
1105              ldai 1
1106              return
1107
1108        check-type: no-check
1109        cases:
1110          - values:
1111              - |
1112                #
1113                    mov.null v0
1114                    mov.null v1
1115                    mov.null v2
1116                    mov.null v3
1117          - values:
1118              - |
1119                #
1120                    lda.str "some string 1"
1121                    sta.obj v0
1122                    lda.str "some string 2"
1123                    sta.obj v1
1124                    lda.str "some string 3"
1125                    sta.obj v2
1126                    lda.str "some string 4"
1127                    sta.obj v3
1128          - values:
1129              - |
1130                #
1131                    mov.null v0
1132                    lda.str "some string 2"
1133                    sta.obj v1
1134                    lda.str "some string 3"
1135                    sta.obj v2
1136                    lda.str "some string 4"
1137                    sta.obj v3
1138          - values:
1139              - |
1140                #
1141                    lda.str "some string 1"
1142                    sta.obj v0
1143                    mov.null v1
1144                    lda.str "some string 3"
1145                    sta.obj v2
1146                    lda.str "some string 4"
1147                    sta.obj v3
1148          - values:
1149              - |
1150                #
1151                    lda.str "some string 1"
1152                    sta.obj v0
1153                    lda.str "some string 2"
1154                    sta.obj v1
1155                    mov.null v2
1156                    lda.str "some string 4"
1157                    sta.obj v3
1158          - values:
1159              - |
1160                #
1161                    lda.str "some string 1"
1162                    sta.obj v0
1163                    lda.str "some string 2"
1164                    sta.obj v1
1165                    lda.str "some string 3"
1166                    sta.obj v2
1167                    mov.null v3
1168
1169      - file-name: method_id_not_static_p
1170        tags: ['verifier']
1171        bugid: ['3247']
1172        runner-options: ['verifier-failure', 'verifier-debug-config']
1173        isa:
1174            instructions:
1175              - sig: call.range method_id, v:in:top
1176                acc: out:top
1177                format: [op_v_8_id_16]
1178            verification:
1179              - method_id_static
1180              - method_id_non_abstract
1181        description: Method_id must resolve to a static method in Panda Assembly context. Not static methods should be rejected by verifier.
1182        header-template: []
1183        code-template: |
1184            .record A {}
1185
1186            .function void A.ctor(A a0) <ctor> {
1187                return.void
1188            }
1189
1190            .function i32 A.foo(A a0%s) *s
1191
1192            .function i32 main() {
1193                initobj A.ctor
1194                sta.obj v0
1195                %s
1196                call.range A.foo, v0
1197        check-type: exit-positive
1198        cases:
1199            - values:
1200              - |
1201                {
1202                    ldai 0
1203                    return
1204                }
1205              ignore: true
1206            - values: ['<noimpl>']
1207              ignore: true
1208            - values:
1209              - |
1210                <static> {
1211                    ldai 0
1212                    return
1213                }
1214              runner-options: ['verifier-only', 'verifier-debug-config']
1215        template-cases:
1216          - values: ['', '##-']
1217          - values: [', A a1', 'mov.obj v1, v0']
1218
1219