• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2022 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13---
14definitions:
15  - name: PandaAssembly
16    template: >
17      .language PandaAssembly
18  - name: R_xorshift32
19    template: |
20      #
21      # Next random number
22      # x = R.currentValue
23      # x ^= x << 13;
24      # x ^= x >> 17;
25      # x ^= x << 5;
26      # R.currentValue = x
27      # return x
28      .function i32 R.nextRand(R a0) {
29          ldobj a0, R.currentValue
30          sta v0
31          sta v1
32          movi v2, 0xd
33          shl v1, v2
34          sta v1
35          xor v0, v1
36          sta v0
37          sta v1
38          movi v2, 0x11
39          ashr v1, v2
40          sta v1
41          xor v0, v1
42          sta v0
43          sta v1
44          movi v2, 0x5
45          shl v1, v2
46          sta v1
47          xor v0, v1
48          stobj a0, R.currentValue
49          return
50      }
51tests:
52  - file-name: call.virt.range
53    isa:
54      instructions:
55        - sig: call.virt.range method_id, v:in:top
56          acc: out:top
57          format: [op_v_8_id_16]
58      title: Object calls
59      description: >
60        Call indicated object method, i.e. create new frame, pass values of arguments and
61        continue execution from the first instruction of a method.
62        Callee should treat accumulator value as undefined and cannot use it until accumulator
63        definition in the new frame.
64        Result (if any) is returned in accumulator (see 'Calling sequence' chapter for more details).
65        Method, its class and the number of argument is resolved by given method_id in runtime
66        constant-pool based on object reference using language-specific semantics (currently only PandaAssembly
67        virtual methods are supported, further extensions are TBD).
68        Object reference is passed in the first source register, arguments are passed starting from
69        the second source register in the same order as in method signature.
70        Non-range instructions can be used to pass up to 4 arguments (including object reference).
71        Unused register slot values will be discarded and corresponding registers will not be
72        passed to the callee).
73        For methods with more arguments range kinds of instruction are to be used, which takes
74        the needed number of arguments starting from 'vs' register (including object reference).
75      verification:
76        - method_id_non_static
77        - compatible_arguments
78        - method_id_accessible
79      exceptions:
80        - x_null
81        - x_abstract
82    commands:
83      - file-name: incorrect_type
84        isa:
85          instructions:
86            - sig: call.virt.range method_id, v:in:top
87              acc: out:top
88              format: [op_v_8_id_16]
89          description: >
90            Call indicated object method, i.e. create new frame, pass values of arguments and
91            continue execution from the first instruction of a method.
92        header-template: []
93        description: >
94          Compiler test for call.virt.range that check virtual or static method with incorrect type of object in register.
95        code-template: |
96          %s
97
98          .record A {}
99
100          .function void A.constructor(A a0) <ctor> {
101              return.void
102          }
103
104          *s
105          .function void A.foo(A a0*s) %s {
106              return.void
107          }
108
109          .function i32 main() {
110              initobj.short A.constructor
111              *s
112              call.virt.range A.foo*s
113        check-type: none
114        runner-options: [compile-only]
115        template-cases:
116          - values: ['', '']
117            exclude: ['jobj']
118          - values: ['', '<static>']
119            exclude: ['jstr']
120          - values: ['.language PandaAssembly', '']
121            exclude: ['pobj']
122          - values: ['.language PandaAssembly', '<static>']
123            exclude: ['pstr']
124
125        cases:
126          - values:
127            - ''
128            - ', i32 a1'
129            - movi v0, 0
130            - ', v0'
131          - values: ['','','','']
132            runner-options: [compile-failure]
133          - values:
134            - ''
135            - ', f64 a1'
136            - fmovi.64 v0, 0
137            - ', v0'
138          - values:
139            - ''
140            - ', i64 a1'
141            - movi.64 v0, 0
142            - ', v0'
143          - values:
144            - '.record panda.Object <external>'
145            - ', panda.Object a1'
146            - |
147              #
148                  newobj v0, panda.Object
149            - ', v0'
150            id: jobj
151          - values:
152            - '.record panda.String <external>'
153            - ', panda.String a1'
154            - 'lda.str "some string"'
155            - ', v0'
156            id: jstr
157          - values:
158            - '.record panda.Object <external>'
159            - ', panda.Object a1'
160            - |
161              #
162                  newobj v0, panda.Object
163            - ', v0'
164            id: pobj
165          - values:
166            - '.record panda.String <external>'
167            - ', panda.String a1'
168            - 'lda.str "some string"'
169            - ', v0'
170            id: pstr
171
172      - file-name: p_method_call_args_many
173        isa:
174          instructions:
175            - sig: call.virt.range method_id, v:in:top
176              acc: out:top
177              format: [op_v_8_id_16]
178        header-template: [R_xorshift32]
179        description: >
180            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.
181            Use PandaAssembly language context.
182        tags: ['tsan', 'irtoc_ignore']
183        code-template: |
184            ##- Object definition
185            .record R {
186                i32            currentValue
187            %s
188            }
189
190            .function void R.constructor(R a0) <ctor> {
191                return.void
192            }
193
194            ##- Template of function that get several arguments and stores to Object
195            .function void R.storeValues(R a0, %s) {
196                %s
197                return.void
198            }
199
200            .function u32 R.test(R a0) {
201                ##- Test - generate pseudo-random values, store to registers as primitive/objects and invoke R.storeValue
202                %s
203            }
204
205            .function u32 main() {
206                # Create R object
207                initobj.short R.constructor
208                # Keep it in v0
209                sta.obj v0
210                # Iterations
211                movi v1, 10
212                ##- First value of pseudorandom generator - store to R.currentValue
213                ldai *s
214                stobj v0, R.currentValue
215            loop:
216                call.virt.range R.test, v0
217                jnez exit_err
218                inci v1, -1
219                lda v1
220                jnez loop
221                ldai 0
222                return
223            exit_err:
224                ldai 1
225                return
226        check-type: none
227        template-cases:
228            - values:
229              - |
230                #
231                    i32 f1
232                    i32 f2
233                    i32 f3
234              - i32 a1, i32 a2, i32 a3
235              - |
236                #
237                    lda a1
238                    stobj a0, R.f1
239                    lda a2
240                    stobj a0, R.f2
241                    lda a3
242                    stobj a0, R.f3
243              - |
244                # Get next random number
245                    mov.obj v0, a0
246                    call.virt.range R.nextRand, v0
247                    sta v0
248                    mov v4, v0
249                    mov.obj v0, a0
250                    call.virt.range R.nextRand, v0
251                    sta v0
252                    mov v5, v0
253                    mov.obj v0, a0
254                    call.virt.range R.nextRand, v0
255                    sta v0
256                    mov v6, v0
257                    mov.obj v0, a0
258                    mov v1, v4
259                    mov v2, v5
260                    mov v3, v6
261                    call.virt.range R.storeValues, v0
262                    mov v0, v4
263                    mov.obj v1, a0
264                    ldobj v1, R.f1
265                    sta v1
266                    lda v0
267                    jeq v1, jump_label_0
268                    movi v0, 0x1
269                    lda v0
270                    return
271                    jump_label_0: mov v0, v5
272                    mov.obj v1, a0
273                    ldobj v1, R.f2
274                    sta v1
275                    lda v0
276                    jeq v1, jump_label_1
277                    movi v0, 0x1
278                    lda v0
279                    return
280                    jump_label_1: mov v0, v6
281                    mov.obj v1, a0
282                    ldobj v1, R.f3
283                    sta v1
284                    lda v0
285                    jeq v1, jump_label_2
286                    movi v0, 0x1
287                    lda v0
288                    return
289                    jump_label_2: movi v0, 0x0
290                    lda v0
291                    return
292            - values:
293              - |
294                #
295                    i32 f1
296                    i32 f2
297                    i32[] f3
298                    f64[] f4
299                    i32[] f5
300                    f64 f6
301                    f64[] f7
302              - i32 a1, i32 a2, i32[] a3, f64[] a4, i32[] a5, f64 a6, f64[] a7
303              - |
304                #
305                   lda a1
306                   stobj a0, R.f1
307                   lda a2
308                   stobj a0, R.f2
309                   lda.obj a3
310                   stobj.obj a0, R.f3
311                   lda.obj a4
312                   stobj.obj a0, R.f4
313                   lda.obj a5
314                   stobj.obj a0, R.f5
315                   lda.64 a6
316                   stobj.64 a0, R.f6
317                   lda.obj a7
318                   stobj.obj a0, R.f7
319              - |
320                # Get next random number
321                    mov.obj v0, a0
322                    call.virt.range R.nextRand, a0
323                    sta v0
324                    mov v9, v0
325                    mov.obj v0, a0
326                    call.virt.range R.nextRand, a0
327                    sta v0
328                    mov v10, v0
329                    mov.obj v0, a0
330                    call.virt.range R.nextRand, a0
331                    sta v0
332                    movi v1, 0xff
333                    and v1, v0
334                    sta v0
335                    newarr v0, v0, i32[]
336                    mov.obj v11, v0
337                    mov.obj v0, a0
338                    call.virt.range R.nextRand, a0
339                    sta v0
340                    movi v1, 0xff
341                    and v1, v0
342                    sta v0
343                    newarr v0, v0, f64[]
344                    mov.obj v12, v0
345                    mov.obj v0, a0
346                    call.virt.range R.nextRand, a0
347                    sta v0
348                    movi v1, 0xff
349                    and v1, v0
350                    sta v0
351                    newarr v0, v0, i32[]
352                    mov.obj v13, v0
353                    mov.obj v0, a0
354                    call.virt.range R.nextRand, a0
355                    sta v0
356                    lda v0
357                    i32tof64
358                    sta.64 v0
359                    sta.64 v1
360                    mov.64 v14, v0
361                    mov.obj v0, a0
362                    call.virt.range R.nextRand, a0
363                    sta v0
364                    movi v1, 0xff
365                    and v1, v0
366                    sta v0
367                    newarr v0, v0, f64[]
368                    mov.obj v16, v0
369                    mov.obj v0, a0
370                    mov v1, v9
371                    mov v2, v10
372                    mov.obj v3, v11
373                    mov.obj v4, v12
374                    mov.obj v5, v13
375                    mov.64 v6, v14
376                    mov.64 v7, v14
377                    mov.obj v8, v16
378                    mov.obj v7, v8
379                    call.virt.range R.storeValues, v0
380                    mov v0, v9
381                    mov.obj v1, a0
382                    ldobj v1, R.f1
383                    sta v1
384                    lda v0
385                    jeq v1, jump_label_0
386                    ldai 1
387                    return
388                jump_label_0:
389                    mov v0, v10
390                    mov.obj v1, a0
391                    ldobj v1, R.f2
392                    sta v1
393                    lda v0
394                    jeq v1, jump_label_1
395                    ldai 1
396                    return
397                jump_label_1:
398                    mov.obj v0, v11
399                    mov.obj v1, a0
400                    ldobj.obj v1, R.f3
401                    sta.obj v1
402                    lda.obj v0
403                    jeq.obj v1, jump_label_2
404                    ldai 1
405                    return
406                jump_label_2:
407                    mov.obj v0, v12
408                    mov.obj v1, a0
409                    ldobj.obj v1, R.f4
410                    sta.obj v1
411                    lda.obj v0
412                    jeq.obj v1, jump_label_3
413                    ldai 1
414                    return
415                jump_label_3:
416                    mov.obj v0, v13
417                    mov.obj v1, a0
418                    ldobj.obj v1, R.f5
419                    sta.obj v1
420                    lda.obj v0
421                    jeq.obj v1, jump_label_4
422                    ldai 1
423                    return
424                jump_label_4:
425                    mov.64 v0, v14
426                    mov.64 v1, v14
427                    mov.obj v2, a0
428                    ldobj.64 v2, R.f6
429                    sta.64 v2
430                    mov.64 v3, v2
431                    lda.64 v0
432                    fcmpl.64 v2
433                    sta v0
434                    lda v0
435                    jeqz jump_label_5
436                    ldai 1
437                    return
438                jump_label_5:
439                    mov.obj v0, v16
440                    mov.obj v1, a0
441                    ldobj.obj v1, R.f7
442                    sta.obj v1
443                    lda.obj v0
444                    jeq.obj v1, jump_label_6
445                    ldai 1
446                    return
447                jump_label_6:
448                    ldai 0
449                    return
450            - values:
451                - |
452                  #
453                      f64 f1
454                      f64 f2
455                      i64 f3
456                      f64 f4
457                      f64 f5
458                      i64 f6
459                      f64 f7
460                      f64 f8
461                      i64 f9
462                - f64 a1, f64 a2, i64 a3, f64 a4, f64 a5, i64 a6, f64 a7, f64 a8, i64 a9
463                - |
464                  #
465                      mov.obj v0, a0
466                      mov.64 v1, a1
467                      lda.64 v1
468                      stobj.64 v0, R.f1
469                      mov.obj v0, a0
470                      mov.64 v1, a2
471                      mov.64 v2, a2
472                      lda.64 v1
473                      stobj.64 v0, R.f2
474                      mov.obj v0, a0
475                      mov.64 v1, a3
476                      mov.64 v2, a3
477                      lda.64 v1
478                      stobj.64 v0, R.f3
479                      mov.obj v0, a0
480                      mov.64 v1, a4
481                      lda.64 v1
482                      stobj.64 v0, R.f4
483                      mov.obj v0, a0
484                      mov.64 v1, a5
485                      mov.64 v2, a5
486                      lda.64 v1
487                      stobj.64 v0, R.f5
488                      mov.obj v0, a0
489                      mov.64 v1, a6
490                      mov.64 v2, a6
491                      lda.64 v1
492                      stobj.64 v0, R.f6
493                      mov.obj v0, a0
494                      mov.64 v1, a7
495                      lda.64 v1
496                      stobj.64 v0, R.f7
497                      mov.obj v0, a0
498                      mov.64 v1, a8
499                      mov.64 v2, a8
500                      lda.64 v1
501                      stobj.64 v0, R.f8
502                      mov.obj v0, a0
503                      mov.64 v1, a9
504                      mov.64 v2, a9
505                      lda.64 v1
506                      stobj.64 v0, R.f9
507
508                - |
509                  #
510                      mov.obj v0, a0
511                      call.virt.range R.nextRand, v0
512                      sta v0
513                      lda v0
514                      i32tof64
515                      sta.64 v0
516                      sta.64 v1
517                      mov.64 v19, v0
518                      mov.obj v0, a0
519                      call.virt.range R.nextRand, v0
520                      sta v0
521                      lda v0
522                      i32tof64
523                      sta.64 v0
524                      sta.64 v1
525                      mov.64 v21, v0
526                      mov.obj v0, a0
527                      call.virt.range R.nextRand, v0
528                      sta v0
529                      lda v0
530                      i32toi64
531                      sta.64 v0
532                      sta.64 v1
533                      mov.64 v23, v0
534                      mov.obj v0, a0
535                      call.virt.range R.nextRand, v0
536                      sta v0
537                      lda v0
538                      i32tof64
539                      sta.64 v0
540                      sta.64 v1
541                      mov.64 v25, v0
542                      mov.obj v0, a0
543                      call.virt.range R.nextRand, v0
544                      sta v0
545                      lda v0
546                      i32tof64
547                      sta.64 v0
548                      sta.64 v1
549                      mov.64 v27, v0
550                      mov.obj v0, a0
551                      call.virt.range R.nextRand, v0
552                      sta v0
553                      lda v0
554                      i32toi64
555                      sta.64 v0
556                      sta.64 v1
557                      mov.64 v29, v0
558                      mov.obj v0, a0
559                      call.virt.range R.nextRand, v0
560                      sta v0
561                      lda v0
562                      i32tof64
563                      sta.64 v0
564                      sta.64 v1
565                      mov.64 v31, v0
566                      mov.obj v0, a0
567                      call.virt.range R.nextRand, v0
568                      sta v0
569                      lda v0
570                      i32tof64
571                      sta.64 v0
572                      sta.64 v1
573                      mov.64 v33, v0
574                      mov.obj v0, a0
575                      call.virt.range R.nextRand, v0
576                      sta v0
577                      lda v0
578                      i32toi64
579                      sta.64 v0
580                      sta.64 v1
581                      mov.64 v35, v0
582                      mov.obj v0, a0
583                  # Don't panic, this is c2p + pandadisasm generated sources
584                      mov.64 v1, v19
585                      mov.64 v2, v19
586                      mov.64 v3, v21
587                      mov.64 v4, v21
588                      mov.64 v5, v23
589                      mov.64 v6, v23
590                      mov.64 v7, v25
591                      mov.64 v8, v25
592                      mov.64 v9, v27
593                      mov.64 v10, v27
594                      mov.64 v11, v29
595                      mov.64 v12, v29
596                      mov.64 v13, v31
597                      mov.64 v14, v31
598                      mov.64 v15, v33
599                      mov.64 v16, v33
600                      mov.64 v17, v35
601                      mov.64 v18, v35
602                      mov.64 v2, v3
603                      mov.64 v3, v4
604                      mov.64 v4, v5
605                      mov.64 v5, v6
606                      mov.64 v6, v7
607                      mov.64 v7, v8
608                      mov.64 v8, v9
609                      mov.64 v9, v10
610                      mov.64 v10, v11
611                      mov.64 v11, v12
612                      mov.64 v12, v13
613                      mov.64 v13, v14
614                      mov.64 v14, v15
615                      mov.64 v15, v16
616                      mov.64 v16, v17
617                      mov.64 v17, v18
618                      mov.64 v3, v4
619                      mov.64 v4, v5
620                      mov.64 v5, v6
621                      mov.64 v6, v7
622                      mov.64 v7, v8
623                      mov.64 v8, v9
624                      mov.64 v9, v10
625                      mov.64 v10, v11
626                      mov.64 v11, v12
627                      mov.64 v12, v13
628                      mov.64 v13, v14
629                      mov.64 v14, v15
630                      mov.64 v15, v16
631                      mov.64 v16, v17
632                      mov.64 v4, v5
633                      mov.64 v5, v6
634                      mov.64 v6, v7
635                      mov.64 v7, v8
636                      mov.64 v8, v9
637                      mov.64 v9, v10
638                      mov.64 v10, v11
639                      mov.64 v11, v12
640                      mov.64 v12, v13
641                      mov.64 v13, v14
642                      mov.64 v14, v15
643                      mov.64 v15, v16
644                      mov.64 v5, v6
645                      mov.64 v6, v7
646                      mov.64 v7, v8
647                      mov.64 v8, v9
648                      mov.64 v9, v10
649                      mov.64 v10, v11
650                      mov.64 v11, v12
651                      mov.64 v12, v13
652                      mov.64 v13, v14
653                      mov.64 v14, v15
654                      mov.64 v6, v7
655                      mov.64 v7, v8
656                      mov.64 v8, v9
657                      mov.64 v9, v10
658                      mov.64 v10, v11
659                      mov.64 v11, v12
660                      mov.64 v12, v13
661                      mov.64 v13, v14
662                      mov.64 v7, v8
663                      mov.64 v8, v9
664                      mov.64 v9, v10
665                      mov.64 v10, v11
666                      mov.64 v11, v12
667                      mov.64 v12, v13
668                      mov.64 v8, v9
669                      mov.64 v9, v10
670                      mov.64 v10, v11
671                      mov.64 v11, v12
672                      mov.64 v9, v10
673                      mov.64 v10, v11
674                      call.virt.range R.storeValues, v0
675                      mov.64 v0, v19
676                      mov.64 v1, v19
677                      mov.obj v2, a0
678                      ldobj.64 v2, R.f1
679                      sta.64 v2
680                      mov.64 v3, v2
681                      lda.64 v0
682                      fcmpl.64 v2
683                      sta v0
684                      lda v0
685                      jeqz jump_label_0
686                      movi v0, 0x1
687                      lda v0
688                      return
689                      jump_label_0: mov.64 v0, v21
690                      mov.64 v1, v21
691                      mov.obj v2, a0
692                      ldobj.64 v2, R.f2
693                      sta.64 v2
694                      mov.64 v3, v2
695                      lda.64 v0
696                      fcmpl.64 v2
697                      sta v0
698                      lda v0
699                      jeqz jump_label_1
700                      movi v0, 0x1
701                      lda v0
702                      return
703                      jump_label_1: mov.64 v0, v23
704                      mov.64 v1, v23
705                      mov.obj v2, a0
706                      ldobj.64 v2, R.f3
707                      sta.64 v2
708                      mov.64 v3, v2
709                      lda.64 v0
710                      cmp.64 v3
711                      sta v0
712                      lda v0
713                      jeqz jump_label_2
714                      movi v0, 0x1
715                      lda v0
716                      return
717                      jump_label_2: mov.64 v0, v25
718                      mov.64 v1, v25
719                      mov.obj v2, a0
720                      ldobj.64 v2, R.f4
721                      sta.64 v2
722                      mov.64 v3, v2
723                      lda.64 v0
724                      fcmpl.64 v2
725                      sta v0
726                      lda v0
727                      jeqz jump_label_3
728                      movi v0, 0x1
729                      lda v0
730                      return
731                      jump_label_3: mov.64 v0, v27
732                      mov.64 v1, v27
733                      mov.obj v2, a0
734                      ldobj.64 v2, R.f5
735                      sta.64 v2
736                      mov.64 v3, v2
737                      lda.64 v0
738                      fcmpl.64 v2
739                      sta v0
740                      lda v0
741                      jeqz jump_label_4
742                      movi v0, 0x1
743                      lda v0
744                      return
745                      jump_label_4: mov.64 v0, v29
746                      mov.64 v1, v29
747                      mov.obj v2, a0
748                      ldobj.64 v2, R.f6
749                      sta.64 v2
750                      mov.64 v3, v2
751                      lda.64 v0
752                      cmp.64 v3
753                      sta v0
754                      lda v0
755                      jeqz jump_label_5
756                      movi v0, 0x1
757                      lda v0
758                      return
759                      jump_label_5: mov.64 v0, v31
760                      mov.64 v1, v31
761                      mov.obj v2, a0
762                      ldobj.64 v2, R.f7
763                      sta.64 v2
764                      mov.64 v3, v2
765                      lda.64 v0
766                      fcmpl.64 v2
767                      sta v0
768                      lda v0
769                      jeqz jump_label_6
770                      movi v0, 0x1
771                      lda v0
772                      return
773                      jump_label_6: mov.64 v0, v33
774                      mov.64 v1, v33
775                      mov.obj v2, a0
776                      ldobj.64 v2, R.f8
777                      sta.64 v2
778                      mov.64 v3, v2
779                      lda.64 v0
780                      fcmpl.64 v2
781                      sta v0
782                      lda v0
783                      jeqz jump_label_7
784                      movi v0, 0x1
785                      lda v0
786                      return
787                      jump_label_7: mov.64 v0, v35
788                      mov.64 v1, v35
789                      mov.obj v2, a0
790                      ldobj.64 v2, R.f9
791                      sta.64 v2
792                      mov.64 v3, v2
793                      lda.64 v0
794                      cmp.64 v3
795                      sta v0
796                      lda v0
797                      jeqz jump_label_8
798                      movi v0, 0x1
799                      lda v0
800                      return
801                      jump_label_8: movi v0, 0x0
802                      lda v0
803                      return
804        cases:
805          - values:
806              - "0xBADC0FFE"
807          - values:
808              - "0x12345678"
809          - values:
810              - "0xFEDCBA98"
811          - values:
812              - "1"
813          - values:
814              - "0xFFFFFFFF"
815          - values:
816              - "0x80000000"
817          - values:
818              - "0x7FFFFFFF"
819
820      - file-name: j_method_call_args
821        isa:
822            instructions:
823              - sig: call.virt.range method_id, v:in:top
824                acc: out:top
825                format: [op_v_8_id_16]
826        header-template: [PandaAssembly, R_xorshift32]
827        description: >
828            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.
829            Use PandaAssembly language context.
830        tags: ['tsan', 'irtoc_ignore']
831        runner-options: [use-pa]
832        code-template: |
833            ##- Object definition
834
835            .record R {
836                i32            currentValue
837                %s
838            }
839
840            .record S<panda.extends=R> {}
841
842            .function void R.constructor(R a0) <ctor> {
843                return.void
844            }
845
846            .function void S.constructor(S a0) <ctor> {
847                return.void
848            }
849
850            .function void R.storeValues(R a0, %s) <noimpl>
851
852            ##- Template of function that get several arguments and stores to Object
853            .function void S.storeValues(S a0, %s) {
854                %s
855                return.void
856            }
857
858            .function i32 R.test(R a0) <noimpl>
859
860            .function i32 S.test(S a0) {
861                ##- Test - generate pseudo-random values, store to registers as primitive/objects and invoke R.storeValue
862                %s
863            }
864
865            .function i32 main() {
866                # Create S object
867                initobj.short S.constructor
868                # Keep it in v0
869                sta.obj v0
870                # Iterations
871                movi v1, 10
872                ##- First value of pseudorandom generator - store to R.currentValue
873                ldai *s
874                stobj v0, R.currentValue
875            loop:
876                call.virt.range *s.test, v0
877                jnez exit_err
878                inci v1, -1
879                lda v1
880                jnez loop
881                ldai 0
882                return
883            exit_err:
884                ldai 1
885                return
886
887        check-type: none
888
889        template-cases:
890            - values:
891                - |
892                  #
893                      i32 f1
894                      i32 f2
895                      i32 f3
896                - i32 a1, i32 a2, i32 a3
897                - i32 a1, i32 a2, i32 a3
898                - |
899                  #
900                      lda a1
901                      stobj a0, R.f1
902                      lda a2
903                      stobj a0, R.f2
904                      lda a3
905                      stobj a0, R.f3
906                - |
907                  # Get next random number
908                      mov.obj v0, a0
909                      call.virt.range R.nextRand, v0
910                      sta v0
911                      mov v4, v0
912                      mov.obj v0, a0
913                      call.virt.range R.nextRand, v0
914                      sta v0
915                      mov v5, v0
916                      mov.obj v0, a0
917                      call.virt.range R.nextRand, v0
918                      sta v0
919                      mov v6, v0
920                      mov.obj v0, a0
921                      mov v1, v4
922                      mov v2, v5
923                      mov v3, v6
924                      call.virt.range %s.storeValues, v0
925                      mov v0, v4
926                      mov.obj v1, a0
927                      ldobj v1, R.f1
928                      sta v1
929                      lda v0
930                      jeq v1, jump_label_0
931                      movi v0, 0x1
932                      lda v0
933                      return
934                      jump_label_0: mov v0, v5
935                      mov.obj v1, a0
936                      ldobj v1, R.f2
937                      sta v1
938                      lda v0
939                      jeq v1, jump_label_1
940                      movi v0, 0x1
941                      lda v0
942                      return
943                      jump_label_1: mov v0, v6
944                      mov.obj v1, a0
945                      ldobj v1, R.f3
946                      sta v1
947                      lda v0
948                      jeq v1, jump_label_2
949                      movi v0, 0x1
950                      lda v0
951                      return
952                      jump_label_2: movi v0, 0x0
953                      lda v0
954                      return
955            - values:
956                - |
957                  #
958                      i32 f1
959                      i32 f2
960                      i32[] f3
961                      f64[] f4
962                      i32[] f5
963                      f64 f6
964                      f64[] f7
965                - i32 a1, i32 a2, i32[] a3, f64[] a4, i32[] a5, f64 a6, f64[] a7
966                - i32 a1, i32 a2, i32[] a3, f64[] a4, i32[] a5, f64 a6, f64[] a7
967                - |
968                  #
969                     lda a1
970                     stobj a0, R.f1
971                     lda a2
972                     stobj a0, R.f2
973                     lda.obj a3
974                     stobj.obj a0, R.f3
975                     lda.obj a4
976                     stobj.obj a0, R.f4
977                     lda.obj a5
978                     stobj.obj a0, R.f5
979                     lda.64 a6
980                     stobj.64 a0, R.f6
981                     lda.obj a7
982                     stobj.obj a0, R.f7
983                - |
984                  # Get next random number
985                      mov.obj v0, a0
986                      call.virt.range R.nextRand, a0
987                      sta v0
988                      mov v9, v0
989                      mov.obj v0, a0
990                      call.virt.range R.nextRand, a0
991                      sta v0
992                      mov v10, v0
993                      mov.obj v0, a0
994                      call.virt.range R.nextRand, a0
995                      sta v0
996                      movi v1, 0xff
997                      and v1, v0
998                      sta v0
999                      newarr v0, v0, i32[]
1000                      mov.obj v11, v0
1001                      mov.obj v0, a0
1002                      call.virt.range R.nextRand, a0
1003                      sta v0
1004                      movi v1, 0xff
1005                      and v1, v0
1006                      sta v0
1007                      newarr v0, v0, f64[]
1008                      mov.obj v12, v0
1009                      mov.obj v0, a0
1010                      call.virt.range R.nextRand, a0
1011                      sta v0
1012                      movi v1, 0xff
1013                      and v1, v0
1014                      sta v0
1015                      newarr v0, v0, i32[]
1016                      mov.obj v13, v0
1017                      mov.obj v0, a0
1018                      call.virt.range R.nextRand, a0
1019                      sta v0
1020                      lda v0
1021                      i32tof64
1022                      sta.64 v0
1023                      sta.64 v1
1024                      mov.64 v14, v0
1025                      mov.obj v0, a0
1026                      call.virt.range R.nextRand, a0
1027                      sta v0
1028                      movi v1, 0xff
1029                      and v1, v0
1030                      sta v0
1031                      newarr v0, v0, f64[]
1032                      mov.obj v16, v0
1033                      mov.obj v0, a0
1034                      mov v1, v9
1035                      mov v2, v10
1036                      mov.obj v3, v11
1037                      mov.obj v4, v12
1038                      mov.obj v5, v13
1039                      mov.64 v6, v14
1040                      mov.64 v7, v14
1041                      mov.obj v8, v16
1042                      mov.obj v7, v8
1043                      call.virt.range %s.storeValues, v0
1044                      mov v0, v9
1045                      mov.obj v1, a0
1046                      ldobj v1, R.f1
1047                      sta v1
1048                      lda v0
1049                      jeq v1, jump_label_0
1050                      ldai 1
1051                      return
1052                  jump_label_0:
1053                      mov v0, v10
1054                      mov.obj v1, a0
1055                      ldobj v1, R.f2
1056                      sta v1
1057                      lda v0
1058                      jeq v1, jump_label_1
1059                      ldai 1
1060                      return
1061                  jump_label_1:
1062                      mov.obj v0, v11
1063                      mov.obj v1, a0
1064                      ldobj.obj v1, R.f3
1065                      sta.obj v1
1066                      lda.obj v0
1067                      jeq.obj v1, jump_label_2
1068                      ldai 1
1069                      return
1070                  jump_label_2:
1071                      mov.obj v0, v12
1072                      mov.obj v1, a0
1073                      ldobj.obj v1, R.f4
1074                      sta.obj v1
1075                      lda.obj v0
1076                      jeq.obj v1, jump_label_3
1077                      ldai 1
1078                      return
1079                  jump_label_3:
1080                      mov.obj v0, v13
1081                      mov.obj v1, a0
1082                      ldobj.obj v1, R.f5
1083                      sta.obj v1
1084                      lda.obj v0
1085                      jeq.obj v1, jump_label_4
1086                      ldai 1
1087                      return
1088                  jump_label_4:
1089                      mov.64 v0, v14
1090                      mov.64 v1, v14
1091                      mov.obj v2, a0
1092                      ldobj.64 v2, R.f6
1093                      sta.64 v2
1094                      mov.64 v3, v2
1095                      lda.64 v0
1096                      fcmpl.64 v2
1097                      sta v0
1098                      lda v0
1099                      jeqz jump_label_5
1100                      ldai 1
1101                      return
1102                  jump_label_5:
1103                      mov.obj v0, v16
1104                      mov.obj v1, a0
1105                      ldobj.obj v1, R.f7
1106                      sta.obj v1
1107                      lda.obj v0
1108                      jeq.obj v1, jump_label_6
1109                      ldai 1
1110                      return
1111                  jump_label_6:
1112                      ldai 0
1113                      return
1114            - values:
1115                - |
1116                  #
1117                      f64 f1
1118                      f64 f2
1119                      i64 f3
1120                      f64 f4
1121                      f64 f5
1122                      i64 f6
1123                      f64 f7
1124                      f64 f8
1125                      i64 f9
1126                - f64 a1, f64 a2, i64 a3, f64 a4, f64 a5, i64 a6, f64 a7, f64 a8, i64 a9
1127                - f64 a1, f64 a2, i64 a3, f64 a4, f64 a5, i64 a6, f64 a7, f64 a8, i64 a9
1128                - |
1129                  #
1130                      mov.obj v0, a0
1131                      mov.64 v1, a1
1132                      lda.64 v1
1133                      stobj.64 v0, R.f1
1134                      mov.obj v0, a0
1135                      mov.64 v1, a2
1136                      mov.64 v2, a2
1137                      lda.64 v1
1138                      stobj.64 v0, R.f2
1139                      mov.obj v0, a0
1140                      mov.64 v1, a3
1141                      mov.64 v2, a3
1142                      lda.64 v1
1143                      stobj.64 v0, R.f3
1144                      mov.obj v0, a0
1145                      mov.64 v1, a4
1146                      lda.64 v1
1147                      stobj.64 v0, R.f4
1148                      mov.obj v0, a0
1149                      mov.64 v1, a5
1150                      mov.64 v2, a5
1151                      lda.64 v1
1152                      stobj.64 v0, R.f5
1153                      mov.obj v0, a0
1154                      mov.64 v1, a6
1155                      mov.64 v2, a6
1156                      lda.64 v1
1157                      stobj.64 v0, R.f6
1158                      mov.obj v0, a0
1159                      mov.64 v1, a7
1160                      lda.64 v1
1161                      stobj.64 v0, R.f7
1162                      mov.obj v0, a0
1163                      mov.64 v1, a8
1164                      mov.64 v2, a8
1165                      lda.64 v1
1166                      stobj.64 v0, R.f8
1167                      mov.obj v0, a0
1168                      mov.64 v1, a9
1169                      mov.64 v2, a9
1170                      lda.64 v1
1171                      stobj.64 v0, R.f9
1172
1173                - |
1174                  #
1175                      mov.obj v0, a0
1176                      call.virt.range R.nextRand, v0
1177                      sta v0
1178                      lda v0
1179                      i32tof64
1180                      sta.64 v0
1181                      sta.64 v1
1182                      mov.64 v19, v0
1183                      mov.obj v0, a0
1184                      call.virt.range R.nextRand, v0
1185                      sta v0
1186                      lda v0
1187                      i32tof64
1188                      sta.64 v0
1189                      sta.64 v1
1190                      mov.64 v21, v0
1191                      mov.obj v0, a0
1192                      call.virt.range R.nextRand, v0
1193                      sta v0
1194                      lda v0
1195                      i32toi64
1196                      sta.64 v0
1197                      sta.64 v1
1198                      mov.64 v23, v0
1199                      mov.obj v0, a0
1200                      call.virt.range R.nextRand, v0
1201                      sta v0
1202                      lda v0
1203                      i32tof64
1204                      sta.64 v0
1205                      sta.64 v1
1206                      mov.64 v25, v0
1207                      mov.obj v0, a0
1208                      call.virt.range R.nextRand, v0
1209                      sta v0
1210                      lda v0
1211                      i32tof64
1212                      sta.64 v0
1213                      sta.64 v1
1214                      mov.64 v27, v0
1215                      mov.obj v0, a0
1216                      call.virt.range R.nextRand, v0
1217                      sta v0
1218                      lda v0
1219                      i32toi64
1220                      sta.64 v0
1221                      sta.64 v1
1222                      mov.64 v29, v0
1223                      mov.obj v0, a0
1224                      call.virt.range R.nextRand, v0
1225                      sta v0
1226                      lda v0
1227                      i32tof64
1228                      sta.64 v0
1229                      sta.64 v1
1230                      mov.64 v31, v0
1231                      mov.obj v0, a0
1232                      call.virt.range R.nextRand, v0
1233                      sta v0
1234                      lda v0
1235                      i32tof64
1236                      sta.64 v0
1237                      sta.64 v1
1238                      mov.64 v33, v0
1239                      mov.obj v0, a0
1240                      call.virt.range R.nextRand, v0
1241                      sta v0
1242                      lda v0
1243                      i32toi64
1244                      sta.64 v0
1245                      sta.64 v1
1246                      mov.64 v35, v0
1247                      mov.obj v0, a0
1248                  # Don't panic, this is c2p + pandadisasm generated sources
1249                      mov.64 v1, v19
1250                      mov.64 v2, v19
1251                      mov.64 v3, v21
1252                      mov.64 v4, v21
1253                      mov.64 v5, v23
1254                      mov.64 v6, v23
1255                      mov.64 v7, v25
1256                      mov.64 v8, v25
1257                      mov.64 v9, v27
1258                      mov.64 v10, v27
1259                      mov.64 v11, v29
1260                      mov.64 v12, v29
1261                      mov.64 v13, v31
1262                      mov.64 v14, v31
1263                      mov.64 v15, v33
1264                      mov.64 v16, v33
1265                      mov.64 v17, v35
1266                      mov.64 v18, v35
1267                      mov.64 v2, v3
1268                      mov.64 v3, v4
1269                      mov.64 v4, v5
1270                      mov.64 v5, v6
1271                      mov.64 v6, v7
1272                      mov.64 v7, v8
1273                      mov.64 v8, v9
1274                      mov.64 v9, v10
1275                      mov.64 v10, v11
1276                      mov.64 v11, v12
1277                      mov.64 v12, v13
1278                      mov.64 v13, v14
1279                      mov.64 v14, v15
1280                      mov.64 v15, v16
1281                      mov.64 v16, v17
1282                      mov.64 v17, v18
1283                      mov.64 v3, v4
1284                      mov.64 v4, v5
1285                      mov.64 v5, v6
1286                      mov.64 v6, v7
1287                      mov.64 v7, v8
1288                      mov.64 v8, v9
1289                      mov.64 v9, v10
1290                      mov.64 v10, v11
1291                      mov.64 v11, v12
1292                      mov.64 v12, v13
1293                      mov.64 v13, v14
1294                      mov.64 v14, v15
1295                      mov.64 v15, v16
1296                      mov.64 v16, v17
1297                      mov.64 v4, v5
1298                      mov.64 v5, v6
1299                      mov.64 v6, v7
1300                      mov.64 v7, v8
1301                      mov.64 v8, v9
1302                      mov.64 v9, v10
1303                      mov.64 v10, v11
1304                      mov.64 v11, v12
1305                      mov.64 v12, v13
1306                      mov.64 v13, v14
1307                      mov.64 v14, v15
1308                      mov.64 v15, v16
1309                      mov.64 v5, v6
1310                      mov.64 v6, v7
1311                      mov.64 v7, v8
1312                      mov.64 v8, v9
1313                      mov.64 v9, v10
1314                      mov.64 v10, v11
1315                      mov.64 v11, v12
1316                      mov.64 v12, v13
1317                      mov.64 v13, v14
1318                      mov.64 v14, v15
1319                      mov.64 v6, v7
1320                      mov.64 v7, v8
1321                      mov.64 v8, v9
1322                      mov.64 v9, v10
1323                      mov.64 v10, v11
1324                      mov.64 v11, v12
1325                      mov.64 v12, v13
1326                      mov.64 v13, v14
1327                      mov.64 v7, v8
1328                      mov.64 v8, v9
1329                      mov.64 v9, v10
1330                      mov.64 v10, v11
1331                      mov.64 v11, v12
1332                      mov.64 v12, v13
1333                      mov.64 v8, v9
1334                      mov.64 v9, v10
1335                      mov.64 v10, v11
1336                      mov.64 v11, v12
1337                      mov.64 v9, v10
1338                      mov.64 v10, v11
1339                      call.virt.range %s.storeValues, v0
1340                      mov.64 v0, v19
1341                      mov.64 v1, v19
1342                      mov.obj v2, a0
1343                      ldobj.64 v2, R.f1
1344                      sta.64 v2
1345                      mov.64 v3, v2
1346                      lda.64 v0
1347                      fcmpl.64 v2
1348                      sta v0
1349                      lda v0
1350                      jeqz jump_label_0
1351                      movi v0, 0x1
1352                      lda v0
1353                      return
1354                      jump_label_0: mov.64 v0, v21
1355                      mov.64 v1, v21
1356                      mov.obj v2, a0
1357                      ldobj.64 v2, R.f2
1358                      sta.64 v2
1359                      mov.64 v3, v2
1360                      lda.64 v0
1361                      fcmpl.64 v2
1362                      sta v0
1363                      lda v0
1364                      jeqz jump_label_1
1365                      movi v0, 0x1
1366                      lda v0
1367                      return
1368                      jump_label_1: mov.64 v0, v23
1369                      mov.64 v1, v23
1370                      mov.obj v2, a0
1371                      ldobj.64 v2, R.f3
1372                      sta.64 v2
1373                      mov.64 v3, v2
1374                      lda.64 v0
1375                      cmp.64 v3
1376                      sta v0
1377                      lda v0
1378                      jeqz jump_label_2
1379                      movi v0, 0x1
1380                      lda v0
1381                      return
1382                      jump_label_2: mov.64 v0, v25
1383                      mov.64 v1, v25
1384                      mov.obj v2, a0
1385                      ldobj.64 v2, R.f4
1386                      sta.64 v2
1387                      mov.64 v3, v2
1388                      lda.64 v0
1389                      fcmpl.64 v2
1390                      sta v0
1391                      lda v0
1392                      jeqz jump_label_3
1393                      movi v0, 0x1
1394                      lda v0
1395                      return
1396                      jump_label_3: mov.64 v0, v27
1397                      mov.64 v1, v27
1398                      mov.obj v2, a0
1399                      ldobj.64 v2, R.f5
1400                      sta.64 v2
1401                      mov.64 v3, v2
1402                      lda.64 v0
1403                      fcmpl.64 v2
1404                      sta v0
1405                      lda v0
1406                      jeqz jump_label_4
1407                      movi v0, 0x1
1408                      lda v0
1409                      return
1410                      jump_label_4: mov.64 v0, v29
1411                      mov.64 v1, v29
1412                      mov.obj v2, a0
1413                      ldobj.64 v2, R.f6
1414                      sta.64 v2
1415                      mov.64 v3, v2
1416                      lda.64 v0
1417                      cmp.64 v3
1418                      sta v0
1419                      lda v0
1420                      jeqz jump_label_5
1421                      movi v0, 0x1
1422                      lda v0
1423                      return
1424                      jump_label_5: mov.64 v0, v31
1425                      mov.64 v1, v31
1426                      mov.obj v2, a0
1427                      ldobj.64 v2, R.f7
1428                      sta.64 v2
1429                      mov.64 v3, v2
1430                      lda.64 v0
1431                      fcmpl.64 v2
1432                      sta v0
1433                      lda v0
1434                      jeqz jump_label_6
1435                      movi v0, 0x1
1436                      lda v0
1437                      return
1438                      jump_label_6: mov.64 v0, v33
1439                      mov.64 v1, v33
1440                      mov.obj v2, a0
1441                      ldobj.64 v2, R.f8
1442                      sta.64 v2
1443                      mov.64 v3, v2
1444                      lda.64 v0
1445                      fcmpl.64 v2
1446                      sta v0
1447                      lda v0
1448                      jeqz jump_label_7
1449                      movi v0, 0x1
1450                      lda v0
1451                      return
1452                      jump_label_7: mov.64 v0, v35
1453                      mov.64 v1, v35
1454                      mov.obj v2, a0
1455                      ldobj.64 v2, R.f9
1456                      sta.64 v2
1457                      mov.64 v3, v2
1458                      lda.64 v0
1459                      cmp.64 v3
1460                      sta v0
1461                      lda v0
1462                      jeqz jump_label_8
1463                      movi v0, 0x1
1464                      lda v0
1465                      return
1466                      jump_label_8: movi v0, 0x0
1467                      lda v0
1468                      return
1469        cases:
1470            - values:
1471                - "R"
1472                - "0xBADC0FFE"
1473                - "R"
1474            - values:
1475                - "S"
1476                - "0xBADC0FFE"
1477                - "R"
1478            - values:
1479                - "R"
1480                - "0xBADC0FFE"
1481                - "S"
1482            - values:
1483                - "S"
1484                - "0xBADC0FFE"
1485                - "S"
1486
1487            - values:
1488                - "R"
1489                - "0x12345678"
1490                - "R"
1491            - values:
1492                - "S"
1493                - "0x12345678"
1494                - "R"
1495            - values:
1496                - "R"
1497                - "0x12345678"
1498                - "S"
1499            - values:
1500                - "S"
1501                - "0x12345678"
1502                - "S"
1503
1504            - values:
1505                - "R"
1506                - "0xFEDCBA98"
1507                - "R"
1508            - values:
1509                - "S"
1510                - "0xFEDCBA98"
1511                - "R"
1512            - values:
1513                - "R"
1514                - "0xFEDCBA98"
1515                - "S"
1516            - values:
1517                - "S"
1518                - "0xFEDCBA98"
1519                - "S"
1520
1521            - values:
1522                - "R"
1523                - "1"
1524                - "R"
1525            - values:
1526                - "S"
1527                - "1"
1528                - "R"
1529            - values:
1530                - "R"
1531                - "1"
1532                - "S"
1533            - values:
1534                - "S"
1535                - "1"
1536                - "S"
1537
1538            - values:
1539                - "R"
1540                - "0xFFFFFFFF"
1541                - "R"
1542            - values:
1543                - "S"
1544                - "0xFFFFFFFF"
1545                - "R"
1546            - values:
1547                - "R"
1548                - "0xFFFFFFFF"
1549                - "S"
1550            - values:
1551                - "S"
1552                - "0xFFFFFFFF"
1553                - "S"
1554
1555            - values:
1556                - "R"
1557                - "0x80000000"
1558                - "R"
1559            - values:
1560                - "S"
1561                - "0x80000000"
1562                - "R"
1563            - values:
1564                - "R"
1565                - "0x80000000"
1566                - "S"
1567            - values:
1568                - "S"
1569                - "0x80000000"
1570                - "S"
1571
1572            - values:
1573                - "R"
1574                - "0x7FFFFFFF"
1575                - "R"
1576            - values:
1577                - "S"
1578                - "0x7FFFFFFF"
1579                - "R"
1580            - values:
1581                - "R"
1582                - "0x7FFFFFFF"
1583                - "S"
1584            - values:
1585                - "S"
1586                - "0x7FFFFFFF"
1587                - "S"
1588