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