• 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  - name: r_A
19    template: |
20      .record A {}
21
22      .function void A.constructor(A a0) <ctor> {
23          return.void
24      }
25  - name: NPE
26    template: |
27      .record panda.NullPointerException <external>
28  - name: j_NPE
29    template: |
30      .record java.lang.NullPointerException <external>
31  - name: AME
32    template: |
33      .record panda.AbstractMethodError <external>
34      .record panda.Class <external>
35  - name: j_AME
36    template: |
37      .record java.lang.AbstractMethodError <external>
38      .record java.lang.Class <external>
39tests:
40  - file-name: call.virt.range_base
41    isa:
42      instructions:
43        - sig: call.virt.range method_id, v:in:top
44          acc: out:top
45          format: [op_v_8_id_16]
46      title: Object calls
47      description: >
48        Call indicated object method, i.e. create new frame, pass values of arguments and
49        continue execution from the first instruction of a method.
50        Callee should treat accumulator value as undefined and cannot use it until accumulator
51        definition in the new frame.
52        Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details).
53        Method, its class and the number of argument is resolved by given method_id in runtime
54        constant-pool based on object reference using language-specific semantics (currently only Java
55        virtual methods are supported, further extensions are TBD).
56        Object reference is passed in the first source register, arguments are passed starting from
57        the second source register in the same order as in method signature.
58        Non-range instructions can be used to pass up to 4 arguments (including object reference).
59        Unused register slot values will be discarded and corresponding registers will not be
60        passed to the callee).
61        For methods with more arguments range kinds of instruction are to be used, which takes
62        the needed number of arguments starting from 'vs' register (including object reference).
63      verification:
64        - method_id_non_static
65        - compatible_arguments
66        - method_id_accessible
67      exceptions:
68        - x_null
69        - x_abstract
70    commands:
71      - file-name: method_call
72        isa:
73          instructions:
74            - sig: call.virt.range method_id, v:in:top
75              acc: out:top
76              format: [op_v_8_id_16]
77        header-template: [r_A]
78        description: >
79          Invoke virtual method with different amount (0, 1, 2 or 3) and type of argument. Primitives and reference types are used as second argument.
80          Check return value.
81        tags: ['tsan']
82        code-template: |
83          *s
84          .function %s A.foo(A a0*s) {
85              %s
86          }
87
88          .function i32 main() {
89              initobj.short A.constructor
90              sta.obj v0
91              *s
92              call.virt.range A.foo, v0
93              %s
94        template-cases:
95            - values:
96              - i32
97              - |
98                #
99                    ldai 123456789
100                    return
101              - |
102                #
103                    movi v0, 123456789
104                    jne v0, set_failure
105                    ldai 0
106                    jmp fall_through
107                set_failure:
108                    ldai 1
109                fall_through:
110            - values:
111              - i64
112              - |
113                #
114                    ldai.64 123456789
115                    return.64
116              - |
117                #
118                    movi.64 v0, 123456789
119                    cmp.64 v0
120            - values:
121              - f64
122              - |
123                #
124                    fldai.64 1234567.89
125                    return.64
126              - |
127                #
128                    fmovi.64 v0, 1234567.89
129                    fcmpg.64 v0
130        check-type: check-positive
131        cases:
132          - values:
133            - ''
134            - ''
135            - ''
136          - values:
137            - ''
138            - ', i32 a1'
139            - 'movi v1, 123'
140          - values:
141            - ''
142            - ',i64 a1'
143            - 'movi.64 v1, 123'
144          - values:
145            - ''
146            - ',i64[] a1'
147            - |
148              #
149                  movi v1, 123
150                  newarr v1, v1, i64[]
151          - values:
152            - ''
153            - ',A a1'
154            - |
155              #
156                  initobj.short A.constructor
157                  sta.obj v1
158          - values:
159            - ''
160            - ', i32[] a1, i64 a2'
161            - |
162              #
163                  movi v1, 123
164                  newarr v1, v1, i32[]
165                  movi.64 v2, 0x100000000
166          - values:
167            - ''
168            - ', i64[] a1, A a2'
169            - |
170              #
171                  movi v1, 123
172                  newarr v1, v1, i64[]
173                  initobj.short A.constructor
174                  sta.obj v2
175          - values:
176            - ''
177            - ',A[] a1, f64 a2'
178            - |
179              #
180                  movi v1, 123
181                  newarr v1, v1, A[]
182                  fmovi.64 v2, 123.321
183          - values:
184            - '.record panda.String <external>'
185            - ', f64[] a1, panda.String a2'
186            - |
187              #
188                  movi v1, 123
189                  newarr v1, v1, f64[]
190                  lda.str "some string"
191                  sta.obj v2
192          - values:
193            - |
194              .record panda.String <external>
195              .record panda.Object <external>
196            - ', panda.String[] a1, panda.Object[] a2'
197            - |
198              #
199                  movi v1, 123
200                  newarr v1, v1, panda.String[]
201                  movi v2, 321
202                  newarr v2, v2, panda.Object[]
203          - values:
204            - '.record panda.Object <external>'
205            - ', panda.Object[] a1, panda.Object a2'
206            - |
207              #
208                  movi v1, 123
209                  newarr v1, v1, panda.Object[]
210                  mov.null v2
211          - values:
212            - '.record panda.Object <external>'
213            - ', i32[] a1, i64 a2, panda.Object[] a3'
214            - |
215              #
216                  movi v1, 123
217                  newarr v1, v1, i32[]
218                  movi.64 v2, 0x100000000
219                  movi v3, 333
220                  newarr v3, v3, panda.Object[]
221          - values:
222            - '.record panda.String <external>'
223            - ', i64[] a1, A a2, panda.String a3'
224            - |
225              #
226                  movi v1, 123
227                  newarr v1, v1, i64[]
228                  initobj.short A.constructor
229                  sta.obj v2
230                  lda.str "some string"
231                  sta.obj v3
232          - values:
233            - '.record panda.Object <external>'
234            - ',A[] a1, f64 a2, panda.Object a3'
235            - |
236              #
237                  movi v1, 123
238                  newarr v1, v1, A[]
239                  fmovi.64 v2, 123.321
240                  mov.null v3
241          - values:
242            - '.record panda.String <external>'
243            - ', f64[] a1, panda.String a2, panda.String[] a3'
244            - |
245              #
246                  movi v1, 123
247                  newarr v1, v1, f64[]
248                  lda.str "some string"
249                  sta.obj v2
250                  movi v3, 123
251                  newarr v3, v3, panda.String[]
252          - values:
253            - |
254              .record panda.String <external>
255              .record panda.Object <external>
256            - ', panda.String[] a1, panda.Object[] a2, panda.String[] a3'
257            - |
258              #
259                  movi v1, 123
260                  newarr v1, v1, panda.String[]
261                  movi v2, 321
262                  newarr v2, v2, panda.Object[]
263                  movi v3, 333
264                  newarr v3, v3, panda.String[]
265          - values:
266            - '.record panda.Object <external>'
267            - ', panda.Object[] a1, panda.Object a2, f64[] a3'
268            - |
269              #
270                  movi v1, 123
271                  newarr v1, v1, panda.Object[]
272                  mov.null v2
273                  movi v3, 321
274                  newarr v3, v3, f64[]
275
276      - file-name: p_method_call_args
277        isa:
278          instructions:
279            - sig: call.virt.range method_id, v:in:top
280              acc: out:top
281              format: [op_v_8_id_16]
282        header-template: [xorshift32]
283        description: >
284            Invoke virtual method with different pseudo-random values and check if correct value is stored in object field. Check i32, i64, f64 and reference types.
285            Use PandaAssembly language context.
286        tags: ['tsan']
287        code-template: |
288            %s
289
290            .function void R.constructor(R a0) <ctor> {
291                return.void
292            }
293
294            .function void R.storeValue(R a0, %s) {
295                %s
296                return.void
297            }
298
299            .function i32 main() {
300                # Create R object
301                initobj.short R.constructor
302                # Keep them in v0
303                sta.obj v0
304                # Iterations
305                movi v2, 10
306                # Start value
307                movi v3, *s
308            loop:
309                %s
310                inci v2, -1
311                lda v2
312                jnez loop
313                ldai 0
314                return
315            exit_err:
316                ldai 1
317                return
318
319        check-type: none
320
321        template-cases:
322            - values:
323              - |
324                .record R {
325                    i32            f1
326                    i32            f2
327                    i32            f3
328                }
329              - i32 a1, i32 a2, i32 a3
330              - |
331                #
332                    lda a1
333                    stobj a0, R.f1
334                    lda a2
335                    stobj a0, R.f2
336                    lda a3
337                    stobj a0, R.f3
338              - |
339                # Get next random number
340                    call.short nextRand, v3
341                    sta v5
342                    call.short nextRand, v5
343                    sta v6
344                    call.short nextRand, v6
345                    sta v7
346                    sta v3
347                # Store in object
348                    mov.obj v4, v0
349                    call.virt.range R.storeValue, v4
350                # Check record R content
351                    ldobj v0, R.f1
352                    jne v5, exit_err
353                    ldobj v0, R.f2
354                    jne v6, exit_err
355                    ldobj v0, R.f3
356                    jne v7, exit_err
357            - values:
358              - |
359                .record R {
360                    i32[]          f1
361                    i32            f2
362                    i32[]          f3
363                }
364              - i32[] a1, i32 a2, i32[] a3
365              - |
366                #
367                    lda.obj a1
368                    stobj.obj a0, R.f1
369                    lda a2
370                    stobj a0, R.f2
371                    lda.obj a3
372                    stobj.obj a0, R.f3
373              - |
374                # Get next random number
375                    call.short nextRand, v3
376                    sta v5
377                    andi 0x7f
378                    sta v6
379                    newarr v6, v6, i32[]
380                    call.short nextRand, v5
381                    sta v7
382                    call.short nextRand, v7
383                    sta v8
384                    andi 0x7f
385                    sta v9
386                    newarr v8, v9, i32[]
387                # Store in object
388                    mov.obj v5, v0
389                    call.virt.range R.storeValue, v5
390                # Check R content
391                    ldobj.obj v0, R.f1
392                    jne.obj v6, exit_err
393                    ldobj v0, R.f2
394                    jne v7, exit_err
395                    ldobj.obj v0, R.f3
396                    jne.obj v8, exit_err
397            - values:
398              - |
399                .record R {
400                    i64[]          f1
401                    i32            f2
402                    f64[]          f3
403                }
404              - i64[] a1, i32 a2, f64[] a3
405              - |
406                #
407                    lda.obj a1
408                    stobj.obj a0, R.f1
409                    lda a2
410                    stobj a0, R.f2
411                    lda.obj a3
412                    stobj.obj a0, R.f3
413              - |
414                # Get next random number
415                    call.short nextRand, v3
416                    sta v5
417                    andi 0x7f
418                    sta v6
419                    newarr v6, v6, i64[]
420                    call.short nextRand, v5
421                    sta v7
422                    call.short nextRand, v7
423                    sta v8
424                    andi 0x7f
425                    sta v9
426                    newarr v8, v9, f64[]
427                    mov.obj v5, v0
428                # Store in object
429                    call.virt.range R.storeValue, v5
430                # Check R content
431                    ldobj.obj v0, R.f1
432                    jne.obj v6, exit_err
433                    ldobj v0, R.f2
434                    jne v7, exit_err
435                    ldobj.obj v0, R.f3
436                    jne.obj v8, exit_err
437
438            - values:
439              - |
440                .record R {
441                    i64          f1
442                    i32          f2
443                    f64          f3
444                }
445              - i64 a1, i32 a2, f64 a3
446              - |
447                #
448                    lda.64 a1
449                    stobj.64 a0, R.f1
450                    lda a2
451                    stobj a0, R.f2
452                    lda.64 a3
453                    stobj.64 a0, R.f3
454              - |
455                # Get next random number
456                    call.short nextRand, v3
457                    sta v3
458                    u32toi64
459                    movi.64 v4, 32
460                    shl2.64 v4
461                    sta.64 v4
462                    call.short nextRand, v3
463                    sta v3
464                    u32toi64
465                    or2.64 v4
466                    sta.64 v4
467
468                    call.short nextRand, v3
469                    sta v3
470                    sta v5
471                    call.short nextRand, v3
472                    sta v3
473                    u32toi64
474                    movi.64 v6, 32
475                    shl2.64 v6
476                    sta.64 v6
477                    call.short nextRand, v3
478                    sta v3
479                    u32toi64
480                    or2.64 v6
481                    i64tof64
482                    sta.64 v6
483                    mov.obj v7, v0
484                    mov.64 v8, v4
485                    mov v9, v5
486                    mov.64 v10, v6
487                    call.virt.range R.storeValue, v7
488                # Check R content
489                    ldobj.64 v0, R.f1
490                    cmp.64 v8
491                    jnez exit_err
492                    ldobj v0, R.f2
493                    jne v9, exit_err
494                    ldobj.64 v0, R.f3
495                    fcmpg.64 v10
496                    jnez exit_err
497
498            - values:
499              - |
500                .record R {
501                    f64[]        f1
502                    R[]          f2
503                    R            f3
504                }
505              - f64[] a1, R[] a2, R a3
506              - |
507                #
508                    lda.obj a1
509                    stobj.obj a0, R.f1
510                    lda.obj a2
511                    stobj.obj a0, R.f2
512                    lda.obj a3
513                    stobj.obj a0, R.f3
514              - |
515                # Get next random number
516                    call.short nextRand, v3
517                    sta v3
518                    andi 0x7f
519                    sta v4
520                    newarr v4, v4, f64[]
521                    call.short nextRand, v3
522                    sta v3
523                    andi 0x7f
524                    sta v5
525                    newarr v5, v5, R[]
526                    mov.null v6
527                # Store in object
528                    mov.obj v7, v0
529                    mov.obj v8, v4
530                    mov.obj v9, v5
531                    mov.obj v10, v6
532                    call.virt.range R.storeValue, v7
533                # Check R content
534                    ldobj.obj v0, R.f1
535                    jne.obj v8, exit_err
536                    ldobj.obj v0, R.f2
537                    jne.obj v9, exit_err
538                    ldobj.obj v0, R.f3
539                    jne.obj v10, exit_err
540        cases:
541          - values:
542              - "0xBADC0FFE"
543          - values:
544              - "0x12345678"
545          - values:
546              - "0xFEDCBA98"
547          - values:
548              - "1"
549          - values:
550              - "0xFFFFFFFF"
551          - values:
552              - "0x80000000"
553          - values:
554              - "0x7FFFFFFF"
555
556      - file-name: restore_register
557        isa:
558          instructions:
559            - sig: call.virt.range method_id, v:in:top
560              acc: out:top
561              format: [op_v_8_id_16]
562        header-template: [r_A]
563        description: >
564          Invoke virtual method and check if registers after calling is restored.
565        code-template: |
566          .function void A.foo(A a0) {
567              %s
568              lda.null
569              sta.obj v0
570              mov.obj v256, v0
571              return.void
572          }
573
574          .function i32 main() {
575              initobj.short A.constructor
576              sta.obj v0
577              %s
578              mov%s v256, %s
579              call.virt.range A.foo, v0
580              mov%s v100, v256
581              lda%s v100
582              %s
583        check-type: check-positive
584        cases:
585          - values:
586            - 'movi v1, 123'
587            - 'movi v1, 321'
588            - ''
589            - 'v1'
590            - ''
591            - ''
592            - |
593              #
594                  jne v1, set_failure
595                  ldai 0
596                  jmp fall_through
597              set_failure:
598                  ldai 1
599              fall_through:
600          - values:
601            - 'movi.64 v8, 123'
602            - 'movi v8, 321'
603            - ''
604            - 'v8'
605            - ''
606            - ''
607            - |
608              #
609                  jne v8, set_failure
610                  ldai 0
611                  jmp fall_through
612              set_failure:
613                  ldai 1
614              fall_through:
615          - values:
616            - 'fmovi.64 v16, 123'
617            - 'movi v16, 321'
618            - ''
619            - 'v16'
620            - ''
621            - ''
622            - |
623              #
624                  jne v16, set_failure
625                  ldai 0
626                  jmp fall_through
627              set_failure:
628                  ldai 1
629              fall_through:
630          - values:
631            - 'mov.null v128'
632            - 'movi v128, 321'
633            - ''
634            - 'v128'
635            - ''
636            - ''
637            - |
638              #
639                  jne v128, set_failure
640                  ldai 0
641                  jmp fall_through
642              set_failure:
643                  ldai 1
644              fall_through:
645          - values:
646            - |
647              #
648                  lda.str "123"
649                  sta.obj v255
650            - 'movi v255, 321'
651            - ''
652            - 'v255'
653            - ''
654            - ''
655            - |
656              #
657                  jne v255, set_failure
658                  ldai 0
659                  jmp fall_through
660              set_failure:
661                  ldai 1
662              fall_through:
663          - values: ['movi v1, 123',   'movi.64 v1, 321', '.64', 'v1', '.64', '.64', 'cmp.64 v1']
664          - values: ['movi.64 v8, 123',   'movi.64 v8, 321', '.64', 'v8', '.64', '.64', 'cmp.64 v8']
665          - values: ['fmovi.64 v16, 123',  'movi.64 v16, 321', '.64', 'v16', '.64', '.64', 'cmp.64 v16']
666          - values: ['mov.null v128', 'movi.64 v128, 321', '.64', 'v128', '.64', '.64', 'cmp.64 v128']
667          - values:
668              - |
669                #
670                    lda.str "123"
671                    sta.obj v255
672              - 'movi.64 v255, 321'
673              - '.64'
674              - 'v255'
675              - '.64'
676              - '.64'
677              - 'cmp.64 v255'
678          - values: ['movi v1, 123',   'fmovi.64 v1, 321', '.64', 'v1', '.64', '.64', 'fcmpg.64 v1']
679          - values: ['movi.64 v8, 123',   'fmovi.64 v8, 321', '.64', 'v8', '.64', '.64', 'fcmpg.64 v8']
680          - values: ['fmovi.64 v16, 123',  'fmovi.64 v16, 321', '.64', 'v16', '.64', '.64', 'fcmpg.64 v16']
681          - values: ['mov.null v128', 'fmovi.64 v128, 321', '.64', 'v128', '.64', '.64', 'fcmpg.64 v128']
682          - values:
683              - |
684                #
685                    lda.str "123"
686                    sta.obj v255
687              - 'fmovi.64 v255, 321'
688              - '.64'
689              - 'v255'
690              - '.64'
691              - '.64'
692              - 'fcmpg.64 v255'
693
694      - file-name: regs
695        isa:
696          instructions:
697            - sig: call.virt.range method_id, v:in:top
698              acc: out:top
699              format: [op_v_8_id_16]
700        header-template: [r_A]
701        description: >
702          Check available registers number and registers width.
703        code-template: |
704            .function void A.foo(A a0%s) {
705                return.void
706            }
707
708            .function i32 main() {
709                call.virt.range A.foo, %s
710            }
711        check-type: empty
712        runner-options: [compile-only]
713        cases:
714          - values: ['', 'v255']
715          - values: ['', 'v256']
716            runner-options: [compile-failure]
717          - values: ['', '0']
718            runner-options: [compile-failure]
719          - values: [',i32 a1', 'v255']
720          - values: [',i32 a1', 'v256']
721            runner-options: [compile-failure]
722          - values: [',i32 a1', 'v0, 0']
723            runner-options: [compile-failure]
724          - values: [',i32 a1', 'v256, v15']
725            runner-options: [compile-failure]
726          - values: [',i32 a1', 'v256, 0']
727            runner-options: [compile-failure]
728          - values: [',i32 a1', 'v255, 0']
729            runner-options: [compile-failure]
730          - values: [',i32 a1', '0, 0']
731            runner-options: [compile-failure]
732          - values: ['', 'v0, v255']
733            runner-options: [compile-failure]
734          - values: ['', 'v0, v256']
735            runner-options: [compile-failure]
736          - values: ['', 'v256, v255']
737            runner-options: [compile-failure]
738          - values: ['', 'v256, v256']
739            runner-options: [compile-failure]
740          - values: ['', 'v0, v0, v255']
741            runner-options: [compile-failure]
742          - values: ['', 'v0, v0, v256']
743            runner-options: [compile-failure]
744
745
746      - file-name: panda_npe
747        isa:
748          instructions:
749            - sig: call.virt.range method_id, v:in:top
750              acc: out:top
751              format: [op_v_8_id_16]
752          exceptions:
753            - x_null
754        header-template: [NPE]
755        description: >
756              Check incorrect usage of `call.virt.range` instruction.
757              Null reference usage causes to panda.NullPointerException. Method_id points to virtual method of base class. Use PandaAssembly language context.
758        tags: ['tsan']
759        code-template: |
760          %s
761          .record B {}
762
763          .function void B.constructor(B a0) <ctor> {
764              return.void
765          }
766
767          .function i32 B.func(B a0%s) <noimpl>
768
769          .function i32 main() {
770              mov.null v0
771              %s
772          begin:
773              call.virt.range B.func, v0
774          end:
775              ldai 1
776              return
777
778          catch_NPE:
779              ldai 0 # Expected panda.NullPointerException
780              return
781
782          catch_all:
783              ldai 2 # Unexpected exception, test failed
784              return
785
786          .catch panda.NullPointerException, begin, end, catch_NPE
787          .catchall begin, end, catch_all
788
789        check-type: none
790        cases:
791          - values:
792            - ''
793            - ''
794            - ''
795          - values:
796            - ''
797            - ', i32 a1'
798            - 'movi v1, 0'
799          - values:
800            - ''
801            - ', i64 a1'
802            - 'movi.64 v1, 0'
803          - values:
804            - ''
805            - ', f64 a1'
806            - 'fmovi.64 v1, 0'
807          - values:
808            - ''
809            - ', B a1'
810            - |
811              initobj B.constructor
812                  sta.obj v1
813          - values:
814            - '.record panda.String <external>'
815            - ', panda.String a1'
816            - |
817              lda.str "some string"
818                  sta.obj v1
819
820          - values:
821              - '.record panda.Class <external>'
822              - ', panda.Class a1'
823              - |
824                #
825                    lda.type B
826                    sta.obj v1
827          - values:
828            - ''
829            - ', i32 a1, f64 a2, i64 a3'
830            - |
831              #
832                  movi v1, 1
833                  fmovi.64 v2, 123.456
834                  movi.64 v3, 0x100000000
835          - values:
836            - ''
837            - ', i64 a1, i64[] a2, i64[] a3'
838            - |
839              #
840                  movi.64 v1, 1
841                  mov.null v2
842                  mov.null v3
843          - values:
844            - ''
845            - ', f64[] a1, i64[] a2, i32[] a3'
846            - |
847              #
848                  mov.null v1
849                  mov.null v2
850                  mov.null v3
851
852      - file-name: panda_ame
853        isa:
854          instructions:
855            - sig: call.virt.range method_id, v:in:top
856              acc: out:top
857              format: [op_v_8_id_16]
858          exceptions:
859            - x_abstract
860        header-template: [AME]
861        description: >
862          Check incorrect usage of `call.virt.range` instruction. Call of abstract method, check if panda.AbstractMethodError is thrown.
863          Use PandaAssembly language context.
864        tags: ['tsan']
865        code-template: |
866          %s
867          .record B {}
868
869            .function void B.constructor(B a0) <ctor> {
870                return.void
871            }
872
873            .function i32 B.func(B a0%s) <noimpl>
874
875          .function i32 main() {
876              initobj.short B.constructor
877              sta.obj v0
878              %s
879          begin:
880              call.virt.range B.func, v0
881          end:
882              ldai 1
883              return
884
885          catch_AME:
886              ldai 0 # Expected panda.AbstractMethodError
887              return
888
889          catch_all:
890              ldai 2 # Unexpected exception, test failed
891              return
892
893          .catch panda.AbstractMethodError, begin, end, catch_AME
894          .catchall begin, end, catch_all
895
896        check-type: none
897        cases:
898          - values:
899            - ''
900            - ''
901            - ''
902          - values:
903            - ''
904            - ', i32 a1'
905            - 'movi v1, 0'
906          - values:
907            - ''
908            - ', i64 a1'
909            - 'movi.64 v1, 0'
910          - values:
911            - ''
912            - ', f64 a1'
913            - 'fmovi.64 v1, 0'
914          - values:
915            - ''
916            - ', B a1'
917            - |
918              initobj.short B.constructor
919                  sta.obj v1
920          - values:
921            - '.record panda.String <external>'
922            - ', panda.String a1'
923            - |
924              lda.str "some string"
925                  sta.obj v1
926          - values:
927              - ''
928              - ', panda.Class a1'
929              - |
930                #
931                    lda.type B
932                    sta.obj v1
933          - values:
934            - ''
935            - ', i32 a1, f64 a2, i64 a3'
936            - |
937              #
938                  movi v1, 1
939                  fmovi.64 v2, 123.456
940                  movi.64 v3, 0x100000000
941          - values:
942            - ''
943            - ', i64 a1, i64[] a2, i64[] a3'
944            - |
945              #
946                  movi.64 v1, 1
947                  mov.null v2
948                  mov.null v3
949          - values:
950            - ''
951            - ', f64[] a1, i64[] a2, i32[] a3'
952            - |
953              #
954                  mov.null v1
955                  mov.null v2
956                  mov.null v3
957
958