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      .record R {}
19      .record E <panda.extends=R> {}
20      .record A <panda.annotation, panda.annotation.type=runtime> {}
21      .record panda.String <external>
22      .record panda.Class <external>
23      .record panda.Object <external>
24  - name: pandasm
25    template: |
26      .record R {}
27      .record panda.String <external>
28      .record panda.Class <external>
29      .record panda.Object <external>
30
31tests:
32  - file-name: "newobj"
33    isa:
34      title: Create new object
35      description: |
36        Resolve class type from type_id, allocate memory for an object, initialize its fields with their
37        default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
38        object into register. The object should be initialized by calling initialization method before
39        further usage.
40      instructions:
41        - sig: newobj v:out:ref, type_id
42          acc: none
43          format: [op_v_8_id_16]
44    commands:
45
46
47      - file-name: "invalid_reg"
48        isa:
49          instructions:
50            - sig: newobj v:out:ref, type_id
51              acc: none
52              format: [op_v_8_id_16]
53        runner-options: [compile-failure]
54        description: Check 'newobj' instruction with invalid register.
55        header-template: []
56        code-template: |
57          .record A {}
58
59          .function i32 main() {
60              newobj %s
61        check-type: exit-positive
62        cases:
63          - values: ['v255, A']
64            runner-options: ['compile-only']
65          - values: ['']
66          - values: ['A']
67          - values: ['v256, A']
68          - values: ['v65535, A']
69          - values: ['v32767, A']
70          - values: ['a0, A']
71          - values: ['V0, A']
72          - values: ['A, A']
73          - values: ['}, A']
74          - values: ['v0, v0']
75
76
77      - file-name: "invalid_type"
78        isa:
79          verification:
80            - type_id_object
81        runner-options: [compile-failure]
82        description: Check 'newobj' instruction with invalid type id.
83        header-template: []
84        code-template: |
85          .record A {
86            i32   f32
87            A     fA
88            i32[] f32Array
89            A[]   fAArray
90          }
91          .function void aFunc(A a0) {
92            return.void
93          }
94          .function void bFunc() <static> {
95            return.void
96          }
97          .function i32 main() {
98          begin:
99              newobj v0, %s
100          end:
101        check-type: exit-positive
102        cases:
103          - values:
104              - ""
105          - values:
106              - "label:"
107          - values:
108              - "begin"
109          - values:
110              - "{}"
111          - values:
112              - "}"
113          - values:
114              - "# comment"
115          - values:
116              - "null"
117          - values:
118              - "0"
119          - values:
120              - "v0"
121          - values:
122              - "i32"
123          - values:
124              - '"A"'
125          - values:
126              - "A.f32"
127          - values:
128              - "A.fA"
129          - values:
130              - "A.f32Array"
131          - values:
132              - "A.fAArray"
133          - values:
134              - "panda.Object[]"
135          - values:
136              - "aFunc"
137          - values:
138              - "A.aFunc"
139          - values:
140              - "bFunc"
141          - values:
142              - "main"
143          - values:
144              - "panda"
145          - values:
146              - "Object"
147
148      - file-name: "valid_type_p"
149        isa:
150          verification:
151            - type_id_object
152        runner-options: ['verifier-only', 'verifier-config']
153        tags: [verifier]
154        description: Check 'newobj' instruction with valid type id in PandaAssembly context.
155        header-template: [pandasm, main]
156        code-template: |
157          #
158              newobj v0, %s
159        check-type: exit-positive
160        cases:
161          - values:
162              - R
163          - values:
164              - panda.Class
165          - values:
166              - panda.Object
167          - values:
168              - panda.String
169            tags: ["tsan"]
170
171      - file-name: "valid_type_j"
172        isa:
173          verification:
174            - type_id_object
175        runner-options: [verifier-only, use-pa, verifier-config]
176        tags: [verifier, pa-verifier]
177        description: Check 'newobj' instruction with valid type id in PandaAssembly context.
178        header-template: [PandaAssembly, main]
179        bugid: ["3574"]
180        code-template: |
181          #
182              newobj v0, %s
183        check-type: exit-positive
184        cases:
185          - values:
186              - R
187          - values:
188              - E
189          - values:
190              - A
191          - values:
192              - panda.Object
193          - values:
194              - panda.String
195
196      - file-name: "valid_instance_p"
197        isa:
198          description: |
199            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
200            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
201            object into register.
202        description: Check type of object created by 'newobj' instruction with valid type in PandaAssembly context.
203        header-template: [pandasm, main]
204        code-template: |
205          #
206              lda.null
207              newobj v1, %s
208              lda.obj v1
209              isinstance %s
210              jeqz set_failure
211              lda.obj v1
212              isinstance panda.Object
213              jeqz set_failure
214              ldai 0
215              return
216          set_failure:
217              ldai 1
218              return
219        check-type: none
220        cases:
221          - values:
222              - R
223              - R
224          - values:
225              - panda.String
226              - panda.String
227          - values:
228              - panda.Class
229              - panda.Class
230            bugid: ["3540"]
231            ignore: true
232          - values:
233              - panda.Object
234              - panda.Object
235            tags: ["tsan"]
236
237      - file-name: "valid_instance_j"
238        isa:
239          description: |
240            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
241            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
242            object into register.
243        description: Check type of object created by 'newobj' instruction with valid type in PandaAssembly context.
244        runner-options: [use-pa]
245        header-template: [PandaAssembly, main]
246        code-template: |
247          #
248              lda.null
249              newobj v1, %s
250              lda.obj v1
251              isinstance %s
252              jeqz set_failure
253              lda.obj v1
254              isinstance panda.Object
255              jeqz set_failure
256              ldai 0
257              return
258          set_failure:
259              ldai 1
260              return
261        check-type: none
262        cases:
263          - values:
264              - R
265              - R
266          - values:
267              - E
268              - E
269          - values:
270              - A
271              - A
272          - values:
273              - panda.String
274              - panda.String
275            tags: ["tsan"]
276          - values:
277              - panda.Object
278              - panda.Object
279
280      - file-name: "obj_ne_p"
281        isa:
282          description: |
283            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
284            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
285            object into register.
286        description: Check that two objects created by 'newobj' instructions are different in PandaAssembly context.
287        header-template: [pandasm, main]
288        code-template: |
289          #
290              newobj v1, %s
291              lda.null
292              newobj v0, %s
293              lda.obj v0
294              jne.obj v1, ok
295              ldai 1
296              return
297          ok:
298        check-type: exit-positive
299        cases:
300          - values:
301              - R
302              - R
303          - values:
304              - R
305              - panda.Object
306          - values:
307              - R
308              - panda.String
309          - values:
310              - R
311              - panda.Class
312            bugid: ["3540"]
313            ignore: true
314          - values:
315              - panda.Object
316              - panda.Object
317            tags: ["tsan"]
318          - values:
319              - panda.Object
320              - panda.String
321            tags: ["tsan"]
322          - values:
323              - panda.Object
324              - panda.Class
325            bugid: ["3540"]
326            ignore: true
327          - values:
328              - panda.String
329              - panda.String
330          - values:
331              - panda.String
332              - panda.Class
333            bugid: ["3540"]
334            ignore: true
335          - values:
336              - panda.Class
337              - panda.Class
338            bugid: ["3540"]
339            ignore: true
340
341      - file-name: "obj_ne_j"
342        isa:
343          description: |
344            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
345            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
346            object into register.
347        description: Check that two objects created by 'newobj' instructions are different in PandaAssembly context.
348        header-template: [PandaAssembly, main]
349        runner-options: [use-pa]
350        code-template: |
351          #
352              newobj v1, %s
353              lda.null
354              newobj v0, %s
355              lda.obj v0
356              jne.obj v1, ok
357              ldai 1
358              return
359          ok:
360        check-type: exit-positive
361        cases:
362          - values:
363              - R
364              - R
365          - values:
366              - R
367              - E
368          - values:
369              - R
370              - A
371          - values:
372              - R
373              - panda.Object
374          - values:
375              - R
376              - panda.String
377          - values:
378              - E
379              - E
380          - values:
381              - E
382              - A
383          - values:
384              - E
385              - panda.Object
386          - values:
387              - E
388              - panda.String
389          - values:
390              - A
391              - A
392          - values:
393              - A
394              - panda.Object
395          - values:
396              - A
397              - panda.String
398          - values:
399              - panda.Object
400              - panda.Object
401            tags: ["tsan"]
402          - values:
403              - panda.Object
404              - panda.String
405          - values:
406              - panda.String
407              - panda.String
408
409      - file-name: "init_p"
410        isa:
411          description: |
412            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
413            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
414            object into register.
415        description: Check that objects fields are properly initialized in PandaAssembly context.
416        header-template: [pandasm]
417        tags: ['tsan', 'irtoc_ignore']
418        code-template: |
419          .record Z {
420            u1                  fu1
421            u8                  fu8
422            i8                  fi8
423            u16                 fu16
424            i16                 fi16
425            u32                 fu32
426            i32                 fi32
427            u64                 fu64
428            i64                 fi64
429            f32                 ff32
430            f64                 ff64
431
432            u1[]                fu1a
433            u8[]                fu8a
434            i8[]                fi8a
435            u16[]               fu16a
436            i16[]               fi16a
437            u32[]               fu32a
438            i32[]               fi32a
439            u64[]               fu64a
440            i64[]               fi64a
441            f32[]               ff32a
442            f64[]               ff64a
443
444            u1[][]              fu1aa
445            u8[][]              fu8aa
446            i8[][]              fi8aa
447            u16[][]             fu16aa
448            i16[][]             fi16aa
449            u32[][]             fu32aa
450            i32[][]             fi32aa
451            u64[][]             fu64aa
452            i64[][]             fi64aa
453            f32[][]             ff32aa
454            f64[][]             ff64aa
455
456            R                   fR
457            R[]                 fRa
458            R[][]               fRaa
459
460            panda.Object        fO
461            panda.Object[]      fOa
462            panda.Object[][]    fOaa
463
464            panda.String        fS
465            panda.String[]      fSa
466            panda.String[][]    fSaa
467
468            panda.Class         fC
469            panda.Class[]       fCa
470            panda.Class[][]     fCaa
471          }
472
473          .function i32 main() {
474              newobj v1, Z
475          label_u1:
476              ldai 111
477              ldobj v1, Z.fu1
478              jeqz label_u8
479              ldai 1
480              return
481          label_u8:
482              ldai 111
483              ldobj v1, Z.fu8
484              jeqz label_i8
485              ldai 2
486              return
487          label_i8:
488              ldai 111
489              ldobj v1, Z.fi8
490              jeqz label_u16
491              ldai 3
492              return
493          label_u16:
494              ldai 111
495              ldobj v1, Z.fu16
496              jeqz label_i16
497              ldai 4
498              return
499          label_i16:
500              ldai 111
501              ldobj v1, Z.fi16
502              jeqz label_u32
503              ldai 5
504              return
505          label_u32:
506              ldai 111
507              ldobj v1, Z.fu32
508              jeqz label_i32
509              ldai 6
510              return
511          label_i32:
512              ldai 111
513              ldobj v1, Z.fi32
514              jeqz label_u64
515              ldai 7
516              return
517          label_u64:
518              ldai 111
519              ldobj.64 v1, Z.fu64
520              movi.64 v2, 0
521              ucmp.64 v2
522              jeqz label_i64
523              ldai 8
524              return
525          label_i64:
526              ldai 111
527              ldobj.64 v1, Z.fi64
528              movi.64 v2, 0
529              cmp.64 v2
530              jeqz label_f32
531              ldai 9
532              return
533          label_f32:
534              ldai 111
535              ldobj v1, Z.ff32
536              fmovi v2, 0.0
537              fcmpg v2
538              jeqz label_f64
539              ldai 10
540              return
541          label_f64:
542              ldai 111
543              ldobj.64 v1, Z.ff64
544              fmovi.64 v2, 0.0
545              fcmpg.64 v2
546              jeqz label_R
547              ldai 11
548              return
549          label_R:
550              ldai 111
551              ldobj.obj v1, Z.fR
552              jeqz.obj label_Ra
553              ldai 12
554              return
555          label_Ra:
556              ldai 111
557              ldobj.obj v1, Z.fRa
558              jeqz.obj label_Raa
559              ldai 13
560              return
561          label_Raa:
562              ldai 111
563              ldobj.obj v1, Z.fRaa
564              jeqz.obj label_O
565              ldai 14
566              return
567          label_O:
568              ldai 111
569              ldobj.obj v1, Z.fO
570              jeqz.obj label_Oa
571              ldai 15
572              return
573          label_Oa:
574              ldai 111
575              ldobj.obj v1, Z.fOa
576              jeqz.obj label_Oaa
577              ldai 16
578              return
579          label_Oaa:
580              ldai 111
581              ldobj.obj v1, Z.fOaa
582              jeqz.obj label_S
583              ldai 17
584              return
585          label_S:
586              ldai 111
587              ldobj.obj v1, Z.fS
588              jeqz.obj label_Sa
589              ldai 18
590              return
591          label_Sa:
592              ldai 111
593              ldobj.obj v1, Z.fSa
594              jeqz.obj label_Saa
595              ldai 19
596              return
597          label_Saa:
598              ldai 111
599              ldobj.obj v1, Z.fSaa
600              jeqz.obj label_C
601              ldai 20
602              return
603          label_C:
604              ldai 111
605              ldobj.obj v1, Z.fC
606              jeqz.obj label_Ca
607              ldai 21
608              return
609          label_Ca:
610              ldai 111
611              ldobj.obj v1, Z.fCa
612              jeqz.obj label_Caa
613              ldai 22
614              return
615          label_Caa:
616              ldai 111
617              ldobj.obj v1, Z.fCaa
618              jeqz.obj label_u1a
619              ldai 23
620              return
621          label_u1a:
622              ldai 111
623              ldobj.obj v1, Z.fu1a
624              jeqz.obj label_u8a
625              ldai 24
626              return
627          label_u8a:
628              ldai 111
629              ldobj.obj v1, Z.fu8a
630              jeqz.obj label_i8a
631              ldai 25
632              return
633          label_i8a:
634              ldai 111
635              ldobj.obj v1, Z.fi8a
636              jeqz.obj label_u16a
637              ldai 26
638              return
639          label_u16a:
640              ldai 111
641              ldobj.obj v1, Z.fu16a
642              jeqz.obj label_i16a
643              ldai 27
644              return
645          label_i16a:
646              ldai 111
647              ldobj.obj v1, Z.fi16a
648              jeqz.obj label_u32a
649              ldai 28
650              return
651          label_u32a:
652              ldai 111
653              ldobj.obj v1, Z.fu32a
654              jeqz.obj label_i32a
655              ldai 29
656              return
657          label_i32a:
658              ldai 111
659              ldobj.obj v1, Z.fi32a
660              jeqz.obj label_u64a
661              ldai 30
662              return
663          label_u64a:
664              ldai 111
665              ldobj.obj v1, Z.fu64a
666              jeqz.obj label_i64a
667              ldai 31
668              return
669          label_i64a:
670              ldai 111
671              ldobj.obj v1, Z.fi64a
672              jeqz.obj label_f32a
673              ldai 32
674              return
675          label_f32a:
676              ldai 111
677              ldobj.obj v1, Z.ff32a
678              jeqz.obj label_f64a
679              ldai 33
680              return
681          label_f64a:
682              ldai 111
683              ldobj.obj v1, Z.ff64a
684              jeqz.obj label_u1aa
685              ldai 34
686              return
687          label_u1aa:
688              ldai 111
689              ldobj.obj v1, Z.fu1aa
690              jeqz.obj label_u8aa
691              ldai 35
692              return
693          label_u8aa:
694              ldai 111
695              ldobj.obj v1, Z.fu8aa
696              jeqz.obj label_i8aa
697              ldai 36
698              return
699          label_i8aa:
700              ldai 111
701              ldobj.obj v1, Z.fi8aa
702              jeqz.obj label_u16aa
703              ldai 37
704              return
705          label_u16aa:
706              ldai 111
707              ldobj.obj v1, Z.fu16aa
708              jeqz.obj label_i16aa
709              ldai 38
710              return
711          label_i16aa:
712              ldai 111
713              ldobj.obj v1, Z.fi16aa
714              jeqz.obj label_u32aa
715              ldai 39
716              return
717          label_u32aa:
718              ldai 111
719              ldobj.obj v1, Z.fu32aa
720              jeqz.obj label_i32aa
721              ldai 40
722              return
723          label_i32aa:
724              ldai 111
725              ldobj.obj v1, Z.fi32aa
726              jeqz.obj label_u64aa
727              ldai 41
728              return
729          label_u64aa:
730              ldai 111
731              ldobj.obj v1, Z.fu64aa
732              jeqz.obj label_i64aa
733              ldai 42
734              return
735          label_i64aa:
736              ldai 111
737              ldobj.obj v1, Z.fi64aa
738              jeqz.obj label_f32aa
739              ldai 43
740              return
741          label_f32aa:
742              ldai 111
743              ldobj.obj v1, Z.ff32aa
744              jeqz.obj label_f64aa
745              ldai 44
746              return
747          label_f64aa:
748              ldai 111
749              ldobj.obj v1, Z.ff64aa
750              jeqz.obj ok
751              ldai 45
752              return
753          ok:
754        check-type: exit-positive
755
756      - file-name: "init_j"
757        isa:
758          description: |
759            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
760            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
761            object into register.
762        description: Check that objects fields are properly initialized in PandaAssembly context.
763        runner-options: [use-pa]
764        tags: ['tsan', 'irtoc_ignore']
765        header-template: [PandaAssembly]
766        code-template: |
767          .record Z {
768            u1                  fu1
769            i8                  fi8
770            u16                 fu16
771            i16                 fi16
772            i32                 fi32
773            i64                 fi64
774            f32                 ff32
775            f64                 ff64
776
777            u1[]                fu1a
778            i8[]                fi8a
779            u16[]               fu16a
780            i16[]               fi16a
781            i32[]               fi32a
782            i64[]               fi64a
783            f32[]               ff32a
784            f64[]               ff64a
785
786            u1[][]              fu1aa
787            i8[][]              fi8aa
788            u16[][]             fu16aa
789            i16[][]             fi16aa
790            i32[][]             fi32aa
791            i64[][]             fi64aa
792            f32[][]             ff32aa
793            f64[][]             ff64aa
794
795            R                       fR
796            R[]                     fRa
797            R[][]                   fRaa
798
799            panda.Object        fO
800            panda.Object[]      fOa
801            panda.Object[][]    fOaa
802
803            panda.String        fS
804            panda.String[]      fSa
805            panda.String[][]    fSaa
806
807            panda.Class         fC
808            panda.Class[]       fCa
809            panda.Class[][]     fCaa
810          }
811
812          .function i32 main() {
813              newobj v1, Z
814          label_u1:
815              ldai 111
816              ldobj v1, Z.fu1
817              jeqz label_i8
818              ldai 1
819              return
820          label_i8:
821              ldai 111
822              ldobj v1, Z.fi8
823              jeqz label_u16
824              ldai 3
825              return
826          label_u16:
827              ldai 111
828              ldobj v1, Z.fu16
829              jeqz label_i16
830              ldai 4
831              return
832          label_i16:
833              ldai 111
834              ldobj v1, Z.fi16
835              jeqz label_i32
836              ldai 5
837              return
838          label_i32:
839              ldai 111
840              ldobj v1, Z.fi32
841              jeqz label_i64
842              ldai 7
843              return
844          label_i64:
845              ldai 111
846              ldobj.64 v1, Z.fi64
847              movi.64 v2, 0
848              cmp.64 v2
849              jeqz label_f32
850              ldai 9
851              return
852          label_f32:
853              ldai 111
854              ldobj v1, Z.ff32
855              fmovi v2, 0.0
856              fcmpg v2
857              jeqz label_f64
858              ldai 10
859              return
860          label_f64:
861              ldai 111
862              ldobj.64 v1, Z.ff64
863              fmovi.64 v2, 0.0
864              fcmpg.64 v2
865              jeqz label_R
866              ldai 11
867              return
868          label_R:
869              ldai 111
870              ldobj.obj v1, Z.fR
871              jeqz.obj label_Ra
872              ldai 12
873              return
874          label_Ra:
875              ldai 111
876              ldobj.obj v1, Z.fRa
877              jeqz.obj label_Raa
878              ldai 13
879              return
880          label_Raa:
881              ldai 111
882              ldobj.obj v1, Z.fRaa
883              jeqz.obj label_O
884              ldai 14
885              return
886          label_O:
887              ldai 111
888              ldobj.obj v1, Z.fO
889              jeqz.obj label_Oa
890              ldai 15
891              return
892          label_Oa:
893              ldai 111
894              ldobj.obj v1, Z.fOa
895              jeqz.obj label_Oaa
896              ldai 16
897              return
898          label_Oaa:
899              ldai 111
900              ldobj.obj v1, Z.fOaa
901              jeqz.obj label_S
902              ldai 17
903              return
904          label_S:
905              ldai 111
906              ldobj.obj v1, Z.fS
907              jeqz.obj label_Sa
908              ldai 18
909              return
910          label_Sa:
911              ldai 111
912              ldobj.obj v1, Z.fSa
913              jeqz.obj label_Saa
914              ldai 19
915              return
916          label_Saa:
917              ldai 111
918              ldobj.obj v1, Z.fSaa
919              jeqz.obj label_C
920              ldai 20
921              return
922          label_C:
923              ldai 111
924              ldobj.obj v1, Z.fC
925              jeqz.obj label_Ca
926              ldai 21
927              return
928          label_Ca:
929              ldai 111
930              ldobj.obj v1, Z.fCa
931              jeqz.obj label_Caa
932              ldai 22
933              return
934          label_Caa:
935              ldai 111
936              ldobj.obj v1, Z.fCaa
937              jeqz.obj label_u1a
938              ldai 23
939              return
940          label_u1a:
941              ldai 111
942              ldobj.obj v1, Z.fu1a
943              jeqz.obj label_i8a
944              ldai 24
945              return
946          label_i8a:
947              ldai 111
948              ldobj.obj v1, Z.fi8a
949              jeqz.obj label_u16a
950              ldai 26
951              return
952          label_u16a:
953              ldai 111
954              ldobj.obj v1, Z.fu16a
955              jeqz.obj label_i16a
956              ldai 27
957              return
958          label_i16a:
959              ldai 111
960              ldobj.obj v1, Z.fi16a
961              jeqz.obj label_i32a
962              ldai 28
963              return
964          label_i32a:
965              ldai 111
966              ldobj.obj v1, Z.fi32a
967              jeqz.obj label_i64a
968              ldai 30
969              return
970          label_i64a:
971              ldai 111
972              ldobj.obj v1, Z.fi64a
973              jeqz.obj label_f32a
974              ldai 32
975              return
976          label_f32a:
977              ldai 111
978              ldobj.obj v1, Z.ff32a
979              jeqz.obj label_f64a
980              ldai 33
981              return
982          label_f64a:
983              ldai 111
984              ldobj.obj v1, Z.ff64a
985              jeqz.obj label_u1aa
986              ldai 34
987              return
988          label_u1aa:
989              ldai 111
990              ldobj.obj v1, Z.fu1aa
991              jeqz.obj label_i8aa
992              ldai 35
993              return
994          label_i8aa:
995              ldai 111
996              ldobj.obj v1, Z.fi8aa
997              jeqz.obj label_u16aa
998              ldai 37
999              return
1000          label_u16aa:
1001              ldai 111
1002              ldobj.obj v1, Z.fu16aa
1003              jeqz.obj label_i16aa
1004              ldai 38
1005              return
1006          label_i16aa:
1007              ldai 111
1008              ldobj.obj v1, Z.fi16aa
1009              jeqz.obj label_i32aa
1010              ldai 39
1011              return
1012          label_i32aa:
1013              ldai 111
1014              ldobj.obj v1, Z.fi32aa
1015              jeqz.obj label_i64aa
1016              ldai 41
1017              return
1018          label_i64aa:
1019              ldai 111
1020              ldobj.obj v1, Z.fi64aa
1021              jeqz.obj label_f32aa
1022              ldai 43
1023              return
1024          label_f32aa:
1025              ldai 111
1026              ldobj.obj v1, Z.ff32aa
1027              jeqz.obj label_f64aa
1028              ldai 44
1029              return
1030          label_f64aa:
1031              ldai 111
1032              ldobj.obj v1, Z.ff64aa
1033              jeqz.obj ok
1034              ldai 45
1035              return
1036          ok:
1037        check-type: exit-positive
1038
1039      - file-name: "oome_p"
1040        isa:
1041          exceptions:
1042            - x_oom
1043        description: Create objects with newobj instruction until OutOfMemoryError in PandaAssembly context
1044        header-template: []
1045        tags: ['irtoc_ignore']
1046        panda-options: "--heap-size-limit=67108864"
1047        bugid: ["3578", "4170", "4171"]
1048        code-template: |
1049          .record panda.OutOfMemoryError <external>
1050          .record Z {
1051          %s
1052          }
1053          .function i32 main() {
1054              movi v7, 50000   # array size
1055              newarr v6, v7, Z[]       # array ref
1056              movi v1, 0       # index
1057          begin:
1058              newobj v0, Z
1059              lda.obj v0
1060              starr.obj v6, v1
1061              inci v1, 1
1062              lda v1
1063              jlt v7, begin
1064          end:
1065              ldai 1 # Should not reach this line
1066              return
1067
1068          catch_OOME:
1069              ldai 0 # Expected panda.OutOfMemoryError
1070              return
1071
1072          catch_all:
1073              ldai 2 # Unexpected exception, test failed
1074              return
1075
1076          .catch panda.OutOfMemoryError, begin, end, catch_OOME
1077          .catchall begin, end, catch_all
1078        check-type: none
1079        cases:
1080          - values:
1081              - "#{[*1..500].map do |i| \"    f64   f#{i}\\n\" end .join}"
1082            tags: ["tsan"]
1083
1084      - file-name: "oome_j"
1085        isa:
1086          exceptions:
1087            - x_oom
1088        description: Create objects with newobj instruction until OutOfMemoryError in PandaAssembly context
1089        header-template: []
1090        tags: ['irtoc_ignore']
1091        panda-options: "--heap-size-limit=67108864"
1092        bugid: ['3578', '4171', '6147']
1093        runner-options: [use-pa]
1094        code-template: |
1095          .language PandaAssembly
1096          .record panda.OutOfMemoryError <external>
1097          .record Z {
1098          %s
1099          }
1100          .function i32 main() {
1101              movi v7, 50000   # array size
1102              newarr v6, v7, Z[]       # array ref
1103              movi v1, 0       # index
1104          begin:
1105              newobj v0, Z
1106              lda.obj v0
1107              starr.obj v6, v1
1108              inci v1, 1
1109              lda v1
1110              jlt v7, begin
1111          end:
1112              ldai 1 # Should not reach this line
1113              return
1114
1115          catch_OOME:
1116              ldai 0 # Expected panda.OutOfMemoryError
1117              return
1118
1119          catch_all:
1120              ldai 2 # Unexpected exception, test failed
1121              return
1122
1123          .catch panda.OutOfMemoryError, begin, end, catch_OOME
1124          .catchall begin, end, catch_all
1125        check-type: none
1126        cases:
1127          - values:
1128              - "#{[*1..500].map do |i| \"    f64   f#{i}\\n\" end .join}"
1129
1130      - file-name: "ctor_p"
1131        isa:
1132          description: |
1133            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
1134            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
1135            object into register. The object should be initialized by calling initialization method before
1136            further usage.
1137        description: Check that ctor is not called in PandaAssembly context.
1138        header-template: []
1139        tags: ["tsan"]
1140        code-template: |
1141          .record Z {}
1142          .function void Z.ctor(Z a0) <ctor> {
1143              ldai 42
1144              ststatic Y.ctor_called
1145              return.void
1146          }
1147          .function void Z.cctor() <cctor> {
1148              ldai 42
1149              ststatic Y.cctor_called
1150              return.void
1151          }
1152          .record Y {
1153              i32        ctor_called  <static>
1154              i32        cctor_called <static>
1155          }
1156          .function i32 main() {
1157              movi v1, 42
1158              ldstatic Y.cctor_called
1159              jnez exit_failure     # Z.cctor must not be called yet
1160              ldstatic Y.ctor_called
1161              jnez exit_failure     # Z.ctor must not be called
1162              newobj v0, Z
1163              ldstatic Y.cctor_called
1164              jne v1, exit_failure  # Z.cctor must be called
1165              ldstatic Y.ctor_called
1166              jnez exit_failure     # Z.ctor must not be called
1167              ldai 0
1168              return
1169          exit_failure:
1170              ldai 1
1171              return
1172        check-type: none
1173
1174      - file-name: "ctor_j"
1175        isa:
1176          description: |
1177            Resolve class type from type_id, allocate memory for an object, initialize its fields with their
1178            default values (i.e. 0 for primitives and null for objects) and put a reference to the newly created
1179            object into register. The object should be initialized by calling initialization method before
1180            further usage.
1181        description: Check that ctor is not called in PandaAssembly context.
1182        header-template: []
1183        runner-options: [use-pa]
1184        tags: ['tsan']
1185        code-template: |
1186          .language PandaAssembly
1187          .record Z {}
1188          .function void Z.ctor(Z a0) <ctor> {
1189              ldai 42
1190              ststatic Y.ctor_called
1191              return.void
1192          }
1193          .function void Z.cctor() <cctor> {
1194              ldai 42
1195              ststatic Y.cctor_called
1196              return.void
1197          }
1198          .record Y {
1199              i32        ctor_called  <static>
1200              i32        cctor_called <static>
1201          }
1202          .function i32 main() {
1203              movi v1, 42
1204              ldstatic Y.cctor_called
1205              jnez exit_failure     # Z.cctor must not be called yet
1206              ldstatic Y.ctor_called
1207              jnez exit_failure     # Z.ctor must not be called
1208              newobj v0, Z
1209              ldstatic Y.cctor_called
1210              jne v1, exit_failure  # Z.cctor must be called
1211              ldstatic Y.ctor_called
1212              jnez exit_failure     # Z.ctor must not be called
1213              ldai 0
1214              return
1215          exit_failure:
1216              ldai 1
1217              return
1218        check-type: none
1219