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: [] 15tests: 16 - file-name: "fmul2" 17 isa: 18 title: Two address floating-point binary operation on accumulator 19 description: > 20 Perform specified floating-point binary operation on accumulator and register and store result into accumulator. 21 The results of instructions correspond IEEE-754 arithmetic rules. 22 exceptions: 23 - x_none 24 commands: 25 - file-name: "op_vs_8_nan" 26 isa: 27 instructions: 28 - sig: fmul2 v:in:f32 29 acc: inout:f32 30 format: [op_v_8] 31 description: Any operation with NaN results to NaN value. 32 check-type: check-acc-nan-f32 33 tags: ['irtoc_ignore'] 34 code-template: | 35 # 36 fldai %s 37 fmovi v0, *s 38 fmul2 v0 39 description: > 40 Check fmul2 results in NaN when acc or v0 is NaN 41 template-cases: 42 - values: 43 # NaN 44 - "0x7ff80000" 45 - values: 46 # NaN representation 47 - "0xFFFFFFFF" 48 - values: 49 - "0" 50 exclude: [hasval] 51 - values: 52 # -0.0d 53 - "0x80000000" 54 exclude: [hasval] 55 - values: 56 - "1" 57 exclude: [hasval] 58 - values: 59 - "-1" 60 exclude: [hasval] 61 - values: 62 # +Inf 63 - "0x7f800000" 64 exclude: [hasval] 65 - values: 66 # -Inf 67 - "0xff800000" 68 exclude: [hasval] 69 - values: 70 # +max 71 - "0x7f7fffff" 72 exclude: [hasval] 73 - values: 74 # -max 75 - "0xff7fffff" 76 exclude: [hasval] 77 - values: 78 # +min 79 - "0x00000001" 80 exclude: [hasval] 81 - values: 82 # -min 83 - "0x80000001" 84 exclude: [hasval] 85 - values: 86 - "3.1415927" 87 exclude: [hasval] 88 - values: 89 - "1234567890" 90 exclude: [hasval] 91 cases: 92 - values: 93 # NaN 94 - "0x7ff80000" 95 - values: 96 # NaN 97 - "0xFFFFFFFF" 98 - values: 99 - "0" 100 id: hasval 101 - values: 102 # -0.0d 103 - "0x80000000" 104 id: hasval 105 - values: 106 - "1" 107 id: hasval 108 - values: 109 - "-1" 110 id: hasval 111 - values: 112 # +Inf 113 - "0x7f800000" 114 id: hasval 115 - values: 116 # -Inf 117 - "0xff800000" 118 id: hasval 119 - values: 120 # +max 121 - "0x7f7fffff" 122 id: hasval 123 - values: 124 # -max 125 - "0xff7fffff" 126 id: hasval 127 - values: 128 # +min 129 - "0x00000001" 130 id: hasval 131 - values: 132 # -min 133 - "0x80000001" 134 id: hasval 135 - values: 136 - "3.1415927" 137 id: hasval 138 - values: 139 - "1234567890" 140 id: hasval 141 142 - file-name: "op_vs_8_pinf" 143 isa: 144 instructions: 145 - sig: fmul2 v:in:f32 146 acc: inout:f32 147 format: [op_v_8] 148 description: Multiplication is infinity if any non zero value is multiplied by infinity. 149 check-type: check-positive 150 tags: ['irtoc_ignore'] 151 code-template: | 152 # 153 fldai 0x7f800000 # +Inf 154 fmovi v0, %s 155 # Mult of +Inf and value 156 fmul2 v0 157 fmovi v1, %s 158 fcmpg v1 159 description: Check fmul2 with +Inf and various values (NaN, Inf, min, max, numbers). 160 cases: 161 - values: 162 - "1" 163 # Inf 164 - "0x7f800000" 165 - values: 166 - "-1" 167 # -Inf 168 - "0xFF800000" 169 - values: 170 # +Inf 171 - "0x7f800000" 172 # Inf 173 - "0x7f800000" 174 - values: 175 # -Inf 176 - "0xff800000" 177 # -Inf 178 - "0xFF800000" 179 - values: 180 # +max 181 - "0x7f7fffff" 182 # Inf 183 - "0x7F800000" 184 - values: 185 # -max 186 - "0xff7fffff" 187 # -Inf 188 - "0xFF800000" 189 - values: 190 # +min 191 - "0x00000001" 192 # Inf 193 - "0x7F800000" 194 - values: 195 # -min 196 - "0x80000001" 197 # -Inf 198 - "0xFF800000" 199 - values: 200 - "3.1415927" 201 # Inf 202 - "0x7F800000" 203 - values: 204 - "1234567890" 205 # Inf 206 - "0x7F800000" 207 208 - file-name: "op_vs_8_ninf" 209 isa: 210 instructions: 211 - sig: fmul2 v:in:f32 212 acc: inout:f32 213 format: [op_v_8] 214 description: Multiplication is infinity if any non zero value is multiplied by infinity. 215 tags: ['irtoc_ignore'] 216 check-type: check-positive 217 code-template: | 218 # 219 fldai 0xff800000 # -Inf 220 fmovi v0, %s 221 # Mult of -Inf and value 222 fmul2 v0 223 fmovi v1, %s 224 fcmpg v1 225 description: Check fmul2 with -Inf and various values (NaN, Inf, min, max, numbers). 226 cases: 227 - values: 228 - "1" 229 # -Inf 230 - "0xff800000" 231 - values: 232 - "-1" 233 # +Inf 234 - "0x7F800000" 235 - values: 236 # +Inf 237 - "0x7f800000" 238 # -Inf 239 - "0xff800000" 240 - values: 241 # -Inf 242 - "0xff800000" 243 # +Inf 244 - "0x7F800000" 245 - values: 246 # +max 247 - "0x7f7fffff" 248 # -Inf 249 - "0xff800000" 250 - values: 251 # -max 252 - "0xff7fffff" 253 # +Inf 254 - "0x7F800000" 255 - values: 256 # +min 257 - "0x00000001" 258 # -Inf 259 - "0xff800000" 260 - values: 261 # -min 262 - "0x80000001" 263 # +Inf 264 - "0x7F800000" 265 - values: 266 - "3.1415927" 267 # -Inf 268 - "0xff800000" 269 - values: 270 - "1234567890" 271 # -Inf 272 - "0xff800000" 273 274 - file-name: "op_vs_8_pzero" 275 isa: 276 instructions: 277 - sig: fmul2 v:in:f32 278 acc: inout:f32 279 format: [op_v_8] 280 description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign. 281 check-type: check-positive 282 tags: ['irtoc_ignore'] 283 code-template: | 284 # 285 fldai 0.0 # 286 fmovi v0, %s 287 # Mult of +0.0 and value 288 fmul2 v0 289 fmovi v1, %s 290 fcmpg v1 291 description: Check fmul2 with +0 and various values (NaN, Inf, min, max, numbers). 292 cases: 293 - values: 294 - "0" 295 - "0" 296 - values: 297 - "-0.0" 298 - "-0.0" 299 - values: 300 - "1" 301 - "0" 302 - values: 303 - "-1" 304 - "-0.0" 305 - values: 306 # +max 307 - "0x7f7fffff" 308 - "0" 309 - values: 310 # -max 311 - "0xff7fffff" 312 - "-0.0" 313 - values: 314 # +min 315 - "0x00000001" 316 - "0" 317 - values: 318 # -min 319 - "0x80000001" 320 - "-0.0" 321 - values: 322 - "3.1415927" 323 - "0" 324 325 - file-name: "op_vs_8_nzero" 326 isa: 327 instructions: 328 - sig: fmul2 v:in:f32 329 acc: inout:f32 330 format: [op_v_8] 331 description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign. 332 check-type: check-positive 333 tags: ['irtoc_ignore'] 334 code-template: | 335 # 336 fldai -0.0 # 337 fmovi v0, %s 338 # Mult of -0.0 and value 339 fmul2 v0 340 fmovi v1, %s 341 fcmpg v1 342 description: Check fmul2 with -0 and various values (NaN, Inf, min, max, numbers). 343 cases: 344 - values: 345 - "0" 346 - "0" 347 - values: 348 - "-0.0" 349 - "0" 350 - values: 351 - "1" 352 - "-0.0" 353 - values: 354 - "-1" 355 - "0" 356 - values: 357 # +max 358 - "0x7f7fffff" 359 - "-0.0" 360 - values: 361 # -max 362 - "0xff7fffff" 363 - "0" 364 - values: 365 # +min 366 - "0x00000001" 367 - "-0.0" 368 - values: 369 # -min 370 - "0x80000001" 371 - "0" 372 - values: 373 - "3.1415927" 374 - "-0.0" 375 - values: 376 - "-3.1415927" 377 - "0" 378 379 - file-name: "op_vs_8_zero_inf" 380 isa: 381 instructions: 382 - sig: fmul2 v:in:f32 383 acc: inout:f32 384 format: [op_v_8] 385 description: > 386 Multiplication is NaN if zero is multiplied by infinity. 387 tags: ['irtoc_ignore'] 388 check-type: check-acc-nan-f32 389 code-template: | 390 # 391 fldai %s 392 fmovi v0, *s 393 # Mult 0 by Inf 394 fmul2 v0 395 description: > 396 Check fmul2 of 0 and Inf is NaN. 397 template-cases: 398 - values: 399 - "0x7f800000" 400 exclude: [inf] 401 - values: 402 - "0xff800000" 403 exclude: [inf] 404 - values: 405 - "0" 406 exclude: [zero] 407 - values: 408 # Negative Zero 409 - "0x80000000" 410 exclude: [zero] 411 cases: 412 - values: 413 - "0x7f800000" 414 id: inf 415 - values: 416 - "0xff800000" 417 id: inf 418 - values: 419 - "0" 420 id: zero 421 - values: 422 # Negative Zero 423 - "0x80000000" 424 id: zero 425 426 - file-name: "op_vs_8_pone" 427 isa: 428 instructions: 429 - sig: fmul2 v:in:f32 430 acc: inout:f32 431 format: [op_v_8] 432 check-type: check-positive 433 tags: ['irtoc_ignore'] 434 code-template: | 435 # 436 fldai 1.0 # 437 fmovi v0, %s 438 # Mult of 1.0 and value 439 fmul2 v0 440 fmovi v1, %s 441 fcmpg v1 442 description: Check fmul2 with +1 and various values (NaN, Inf, min, max, numbers). 443 cases: 444 - values: 445 # +0.0d 446 - "0" 447 - "0" 448 - values: 449 - "-0.0" 450 - "-0.0" 451 - values: 452 - "1" 453 - "1" 454 - values: 455 - "-1" 456 - "-1" 457 - values: 458 # +Inf 459 - "0x7f800000" 460 # +Inf 461 - "0x7F800000" 462 - values: 463 # -Inf 464 - "0xff800000" 465 # -Inf 466 - "0xFF800000" 467 - values: 468 # +max 469 - "0x7f7fffff" 470 # +max 471 - "0x7F7FFFFF" 472 - values: 473 # -max 474 - "0xFF7FFFFF" 475 # -max 476 - "0xFF7FFFFF" 477 - values: 478 # +min 479 - "0x00000001" 480 - "0x00000001" 481 - values: 482 # -min 483 - "0x80000001" 484 - "0x80000001" 485 - values: 486 - "3.1415927" 487 - "3.1415927" 488 - values: 489 - "-3.1415927" 490 - "-3.1415927" 491 - values: 492 - "1234.9876" 493 - "1234.9876" 494 495 - file-name: "op_vs_8_none" 496 isa: 497 instructions: 498 - sig: fmul2 v:in:f32 499 acc: inout:f32 500 format: [op_v_8] 501 check-type: check-positive 502 tags: ['irtoc_ignore'] 503 code-template: | 504 # 505 fldai -1.0 # 506 fmovi v0, %s 507 # Mult of -1.0 and value 508 fmul2 v0 509 fmovi v1, %s 510 fcmpg v1 511 description: Check fmul2 with -1 and various values (NaN, Inf, min, max, numbers). 512 cases: 513 - values: 514 - "0" 515 - "-0.0" 516 - values: 517 - "-0.0" 518 - "0" 519 - values: 520 - "1" 521 - "-1" 522 - values: 523 - "-1" 524 - "1" 525 - values: 526 # +Inf 527 - "0x7f800000" 528 # -Inf 529 - "0xFF800000" 530 - values: 531 # -Inf 532 - "0xff800000" 533 # +Inf 534 - "0x7F800000" 535 - values: 536 # +max 537 - "0x7f7fffff" 538 - "0xFF7FFFFF" 539 - values: 540 # -max 541 - "0xFF7FFFFF" 542 - "0x7F7FFFFF" 543 - values: 544 # +min 545 - "0x00000001" 546 - "0x80000001" 547 - values: 548 # -min 549 - "0x80000001" 550 - "0x00000001" 551 - values: 552 - "3.1415927" 553 - "-3.1415927" 554 - values: 555 - "-3.1415927" 556 - "3.1415927" 557 - values: 558 - "1234.9876" 559 - "-1234.9876" 560 561 - file-name: "op_vs_8" 562 isa: 563 instructions: 564 - sig: fmul2 v:in:f32 565 acc: inout:f32 566 format: [op_v_8] 567 description: The sign of division or multiplication result is positive if both values have the same sign, negative if the values have different sign. 568 check-type: check-positive 569 tags: ['irtoc_ignore'] 570 code-template: | 571 # 572 fldai %s # 573 fmovi v0, %s 574 # Mult of -1.0 and value 575 fmul2 v0 576 fmovi v1, %s 577 fcmpg v1 578 description: Check fmul2 with various values (zeroes, Infs, min, max, numbers). 579 cases: 580 - values: 581 - "0.0" 582 - "0.0" 583 - "0.0" 584 - values: 585 - "0.0" 586 - "-0.0" 587 - "-0.0" 588 - values: 589 - "-0.0" 590 - "0.0" 591 - "-0.0" 592 - values: 593 - "-0.0" 594 - "-0.0" 595 - "0.0" 596 - values: 597 - "1.0" 598 - "-1.0" 599 - "-1.0" 600 - values: 601 - "1.0" 602 - "1.0" 603 - "1.0" 604 - values: 605 - "-1.0" 606 - "1.0" 607 - "-1.0" 608 - values: 609 - "1.0e10" 610 - "1.0e10" 611 - "1.0e20" 612 - values: 613 - "1.0e10" 614 - "-1.0e10" 615 - "-1.0e20" 616 - values: 617 - "1.0e+10" 618 - "1.0e-10" 619 - "1.0" 620 - values: 621 - "-1.0e10" 622 - "1.0e10" 623 - "-1.0e20" 624 - values: 625 - "-1.0e-10" 626 - "1.0e-10" 627 - "0x9e3ce509" 628 - values: 629 - "-1.0e+10" 630 - "-1.0e-10" 631 - "1.0" 632 - values: 633 - "3.1415927" 634 - "-3.1415927" 635 - "-9.869605" 636 - values: 637 - "3.1415927e10" 638 - "-3.1415927e10" 639 - "-9.869605e20" 640# - values: 641# # TODO add test cases for maximal and minimal FP value in decimal scientific literal 642 - file-name: "op_vs_8_max" 643 isa: 644 instructions: 645 - sig: fmul2 v:in:f32 646 acc: inout:f32 647 format: [op_v_8] 648 check-type: check-positive 649 tags: ['irtoc_ignore'] 650 code-template: | 651 # 652 fldai %s 653 fmovi v0, %s 654 # Mult of two values 655 fmul2 v0 656 fmovi v1, %s 657 fcmpg v1 658 description: Check fmul2 with various max values. 659 cases: 660 - values: 661 # +max 662 - "0x7f7fffff" 663 # +max 664 - "0x7f7fffff" 665 # +Inf 666 - "0x7f800000" 667 - values: 668 # -max 669 - "0xFF7FFFFF" 670 # -max 671 - "0xFF7FFFFF" 672 # +Inf 673 - "0x7f800000" 674 - values: 675 # +max 676 - "0x7f7fffff" 677 # -max 678 - "0xFF7FFFFF" 679 # -Inf 680 - "0xff800000" 681 - values: 682 # +max 683 - "0x7f7fffff" 684 # 1d 685 - "0x3ff00000" 686 # +max 687 - "0x7f800000" 688 - values: 689 # +max 690 - "0x7f7fffff" 691 - "-1" 692 # -max 693 - "0xFF7FFFFF" 694 - values: 695 # -max 696 - "0xFF7FFFFF" 697 - "1" 698 # -max 699 - "0xFF7FFFFF" 700 - values: 701 # -max 702 - "0xFF7FFFFF" 703 - "-1" 704 # +max 705 - "0x7f7fffff" 706 707 - file-name: "incorrect_reg" 708 isa: 709 instructions: 710 - sig: fmul2 v:in:f32 711 acc: inout:f32 712 format: [op_v_8] 713 check-type: none 714 runner-options: [compile-failure] 715 description: Check fmul2 with incorrect register numbers. 716 code-template: | 717 # 718 fmul2 %s 719 cases: 720 - values: [v256] 721 - values: [v65535] 722 - values: [a0] 723 - values: [a255] 724 - values: ['null'] 725 - values: [0] 726 - values: [1.1] 727 - values: ['2.2'] 728 729 - file-name: "reg_number" 730 isa: 731 instructions: 732 - sig: fmul2 v:in:f32 733 acc: inout:f32 734 format: [op_v_8] 735 check-type: none 736 runner-options: [compile-only] 737 description: Check fmul2 with correct register numbers. 738 code-template: | 739 # 740 fmul2 %s 741 cases: 742 - values: [v0] 743 - values: [v16] 744 - values: [v128] 745 - values: [v255] 746 747 - file-name: "calc" 748 isa: 749 instructions: 750 - sig: fmul2 v:in:f32 751 acc: inout:f32 752 format: [op_v_8] 753 check-type: check-positive 754 code-template: | 755 # 756 fldai %s # 757 fmovi v0, %s 758 fmul2 v0 759 fmovi v1, %s 760 fcmpg v1 761 description: Check fmul2 with various values. 762 tags: ['tsan', 'irtoc_ignore'] 763 cases: 764 - values: 765 - "-0.9312987" 766 - "-0.5269885" 767 - "0.4907837" 768 - values: 769 - "-0.7473367" 770 - "0.5438369" 771 - "-0.40642926" 772 - values: 773 - "0.3164795" 774 - "-0.5745936" 775 - "-0.1818471" 776 - values: 777 - "-0.2103265" 778 - "0.3927316" 779 - "-0.08260186" 780 - values: 781 - "0.1012084" 782 - "0.8246991" 783 - "0.08346648" 784 - values: 785 - "-0.4343271" 786 - "0.7903281" 787 - "-0.3432609" 788 - values: 789 - "-0.206641" 790 - "0.3493545" 791 - "-0.07219096" 792 - values: 793 - "0.1333693" 794 - "0.3799164" 795 - "0.050669182" 796 - values: 797 - "0.5937602" 798 - "0.1781606" 799 - "0.10578467" 800 - values: 801 - "-0.8800125" 802 - "0.8179463" 803 - "-0.719803" 804 - values: 805 - "0.3629221" 806 - "-0.685815" 807 - "-0.24889742" 808 - file-name: "type" 809 isa: 810 instructions: 811 - sig: fmul2 v:in:f32 812 acc: inout:f32 813 format: [op_v_8] 814 verification: 815 - acc_type 816 - v1_type 817 tags: ['verifier'] 818 runner-options: ['verifier-failure', 'verifier-config'] 819 header-template: [] 820 code-template: | 821 # 822 .record A {} 823 .record B {} 824 .record panda.String <external> 825 .record panda.Object <external> 826 .function i32 main() { 827 %s 828 *s 829 fmul2 v0 830 check-type: exit-positive 831 description: Check 'fmul2' with incorrect register and accumulator type. 832 template-cases: 833 - values: 834 - movi v0, 0 835 - values: 836 - movi.64 v0, 0 837 - values: 838 - fmovi v0, 0 839 exclude: [val] 840 - values: 841 - fmovi.64 v0, 0 842 - values: 843 - | 844 # 845 lda.type B 846 sta.obj v0 847 - values: 848 - | 849 # 850 lda.type B[] 851 sta.obj v0 852 - values: 853 - | 854 # 855 lda.type panda.String 856 sta.obj v0 857 - values: 858 - | 859 # 860 lda.str "string" 861 sta.obj v0 862 - values: 863 - | 864 # 865 movi v0, 10 866 newarr v0, v0, i32[] 867 - values: 868 - mov.null v0 869 870 cases: 871 - values: 872 - ldai 0 873 - values: 874 - ldai.64 0 875 - values: 876 - fldai 0 877 id: val 878 - values: 879 - fldai.64 0 880 - values: 881 - | 882 # 883 lda.type A 884 - values: 885 - | 886 # 887 lda.type A[] 888 - values: 889 - | 890 # 891 lda.type panda.String 892 - values: 893 - | 894 # 895 lda.str "string" 896 - values: 897 - | 898 # 899 movi v1, 10 900 newarr v1, v1, f32[] 901 lda.obj v1 902 - values: 903 - lda.null 904 905 - file-name: uninitialized_regs 906 isa: 907 instructions: 908 - sig: fmul2 v:in:f32 909 acc: inout:f32 910 format: [op_v_8] 911 description: Check 'fmul2' with uninitialized register and accumulator. 912 tags: ['verifier'] 913 runner-options: ['verifier-failure', 'verifier-config'] 914 code-template: | 915 # 916 %s 917 *s 918 fmul2 %s 919 check-type: exit-positive 920 template-cases: 921 - values: 922 - '' 923 - v0 924 - values: 925 - fmovi v0, 0 926 - v0 927 exclude: [init] 928 - values: 929 - '' 930 - v7 931 - values: 932 - '' 933 - v15 934 - values: 935 - fmovi v15, 0 936 - v15 937 exclude: [init] 938 - values: 939 - '' 940 - v128 941 - values: 942 - fmovi v128, 0 943 - v128 944 exclude: [init] 945 - values: 946 - '' 947 - v255 948 - values: 949 - fmovi v255, 0 950 - v255 951 exclude: [init] 952 cases: 953 - values: 954 - '' 955 - values: 956 - fldai 0 957 id: init 958