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