| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Linux/PA-RISC Project (http://www.parisc-linux.org/) |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Floating-point emulation code |
|---|
| 5 | 6 | * Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org> |
|---|
| 6 | | - * |
|---|
| 7 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 8 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 9 | | - * the Free Software Foundation; either version 2, or (at your option) |
|---|
| 10 | | - * any later version. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 13 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 14 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 15 | | - * GNU General Public License for more details. |
|---|
| 16 | | - * |
|---|
| 17 | | - * You should have received a copy of the GNU General Public License |
|---|
| 18 | | - * along with this program; if not, write to the Free Software |
|---|
| 19 | | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 20 | 7 | */ |
|---|
| 21 | 8 | /* |
|---|
| 22 | 9 | * BEGIN_DESC |
|---|
| .. | .. |
|---|
| 323 | 310 | r1 &= ~3; |
|---|
| 324 | 311 | fpregs[t+3] = fpregs[r1+3]; |
|---|
| 325 | 312 | fpregs[t+2] = fpregs[r1+2]; |
|---|
| 313 | + fallthrough; |
|---|
| 326 | 314 | case 1: /* double */ |
|---|
| 327 | 315 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 316 | + fallthrough; |
|---|
| 328 | 317 | case 0: /* single */ |
|---|
| 329 | 318 | fpregs[t] = fpregs[r1]; |
|---|
| 330 | 319 | return(NOEXCEPTION); |
|---|
| 331 | 320 | } |
|---|
| 321 | + BUG(); |
|---|
| 332 | 322 | case 3: /* FABS */ |
|---|
| 333 | 323 | switch (fmt) { |
|---|
| 334 | 324 | case 2: /* illegal */ |
|---|
| .. | .. |
|---|
| 338 | 328 | r1 &= ~3; |
|---|
| 339 | 329 | fpregs[t+3] = fpregs[r1+3]; |
|---|
| 340 | 330 | fpregs[t+2] = fpregs[r1+2]; |
|---|
| 331 | + fallthrough; |
|---|
| 341 | 332 | case 1: /* double */ |
|---|
| 342 | 333 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 334 | + fallthrough; |
|---|
| 343 | 335 | case 0: /* single */ |
|---|
| 344 | 336 | /* copy and clear sign bit */ |
|---|
| 345 | 337 | fpregs[t] = fpregs[r1] & 0x7fffffff; |
|---|
| 346 | 338 | return(NOEXCEPTION); |
|---|
| 347 | 339 | } |
|---|
| 340 | + BUG(); |
|---|
| 348 | 341 | case 6: /* FNEG */ |
|---|
| 349 | 342 | switch (fmt) { |
|---|
| 350 | 343 | case 2: /* illegal */ |
|---|
| .. | .. |
|---|
| 354 | 347 | r1 &= ~3; |
|---|
| 355 | 348 | fpregs[t+3] = fpregs[r1+3]; |
|---|
| 356 | 349 | fpregs[t+2] = fpregs[r1+2]; |
|---|
| 350 | + fallthrough; |
|---|
| 357 | 351 | case 1: /* double */ |
|---|
| 358 | 352 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 353 | + fallthrough; |
|---|
| 359 | 354 | case 0: /* single */ |
|---|
| 360 | 355 | /* copy and invert sign bit */ |
|---|
| 361 | 356 | fpregs[t] = fpregs[r1] ^ 0x80000000; |
|---|
| 362 | 357 | return(NOEXCEPTION); |
|---|
| 363 | 358 | } |
|---|
| 359 | + BUG(); |
|---|
| 364 | 360 | case 7: /* FNEGABS */ |
|---|
| 365 | 361 | switch (fmt) { |
|---|
| 366 | 362 | case 2: /* illegal */ |
|---|
| .. | .. |
|---|
| 370 | 366 | r1 &= ~3; |
|---|
| 371 | 367 | fpregs[t+3] = fpregs[r1+3]; |
|---|
| 372 | 368 | fpregs[t+2] = fpregs[r1+2]; |
|---|
| 369 | + fallthrough; |
|---|
| 373 | 370 | case 1: /* double */ |
|---|
| 374 | 371 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 372 | + fallthrough; |
|---|
| 375 | 373 | case 0: /* single */ |
|---|
| 376 | 374 | /* copy and set sign bit */ |
|---|
| 377 | 375 | fpregs[t] = fpregs[r1] | 0x80000000; |
|---|
| 378 | 376 | return(NOEXCEPTION); |
|---|
| 379 | 377 | } |
|---|
| 378 | + BUG(); |
|---|
| 380 | 379 | case 4: /* FSQRT */ |
|---|
| 381 | 380 | switch (fmt) { |
|---|
| 382 | 381 | case 0: |
|---|
| .. | .. |
|---|
| 389 | 388 | case 3: /* quad not implemented */ |
|---|
| 390 | 389 | return(MAJOR_0C_EXCP); |
|---|
| 391 | 390 | } |
|---|
| 391 | + BUG(); |
|---|
| 392 | 392 | case 5: /* FRND */ |
|---|
| 393 | 393 | switch (fmt) { |
|---|
| 394 | 394 | case 0: |
|---|
| .. | .. |
|---|
| 402 | 402 | return(MAJOR_0C_EXCP); |
|---|
| 403 | 403 | } |
|---|
| 404 | 404 | } /* end of switch (subop) */ |
|---|
| 405 | | - |
|---|
| 405 | + BUG(); |
|---|
| 406 | 406 | case 1: /* class 1 */ |
|---|
| 407 | 407 | df = extru(ir,fpdfpos,2); /* get dest format */ |
|---|
| 408 | 408 | if ((df & 2) || (fmt & 2)) { |
|---|
| .. | .. |
|---|
| 432 | 432 | case 3: /* dbl/dbl */ |
|---|
| 433 | 433 | return(MAJOR_0C_EXCP); |
|---|
| 434 | 434 | } |
|---|
| 435 | + BUG(); |
|---|
| 435 | 436 | case 1: /* FCNVXF */ |
|---|
| 436 | 437 | switch(fmt) { |
|---|
| 437 | 438 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 447 | 448 | return(dbl_to_dbl_fcnvxf(&fpregs[r1],0, |
|---|
| 448 | 449 | &fpregs[t],status)); |
|---|
| 449 | 450 | } |
|---|
| 451 | + BUG(); |
|---|
| 450 | 452 | case 2: /* FCNVFX */ |
|---|
| 451 | 453 | switch(fmt) { |
|---|
| 452 | 454 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 462 | 464 | return(dbl_to_dbl_fcnvfx(&fpregs[r1],0, |
|---|
| 463 | 465 | &fpregs[t],status)); |
|---|
| 464 | 466 | } |
|---|
| 467 | + BUG(); |
|---|
| 465 | 468 | case 3: /* FCNVFXT */ |
|---|
| 466 | 469 | switch(fmt) { |
|---|
| 467 | 470 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 477 | 480 | return(dbl_to_dbl_fcnvfxt(&fpregs[r1],0, |
|---|
| 478 | 481 | &fpregs[t],status)); |
|---|
| 479 | 482 | } |
|---|
| 483 | + BUG(); |
|---|
| 480 | 484 | case 5: /* FCNVUF (PA2.0 only) */ |
|---|
| 481 | 485 | switch(fmt) { |
|---|
| 482 | 486 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 492 | 496 | return(dbl_to_dbl_fcnvuf(&fpregs[r1],0, |
|---|
| 493 | 497 | &fpregs[t],status)); |
|---|
| 494 | 498 | } |
|---|
| 499 | + BUG(); |
|---|
| 495 | 500 | case 6: /* FCNVFU (PA2.0 only) */ |
|---|
| 496 | 501 | switch(fmt) { |
|---|
| 497 | 502 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 507 | 512 | return(dbl_to_dbl_fcnvfu(&fpregs[r1],0, |
|---|
| 508 | 513 | &fpregs[t],status)); |
|---|
| 509 | 514 | } |
|---|
| 515 | + BUG(); |
|---|
| 510 | 516 | case 7: /* FCNVFUT (PA2.0 only) */ |
|---|
| 511 | 517 | switch(fmt) { |
|---|
| 512 | 518 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 522 | 528 | return(dbl_to_dbl_fcnvfut(&fpregs[r1],0, |
|---|
| 523 | 529 | &fpregs[t],status)); |
|---|
| 524 | 530 | } |
|---|
| 531 | + BUG(); |
|---|
| 525 | 532 | case 4: /* undefined */ |
|---|
| 526 | 533 | return(MAJOR_0C_EXCP); |
|---|
| 527 | 534 | } /* end of switch subop */ |
|---|
| 528 | | - |
|---|
| 535 | + BUG(); |
|---|
| 529 | 536 | case 2: /* class 2 */ |
|---|
| 530 | 537 | fpu_type_flags=fpregs[FPU_TYPE_FLAG_POS]; |
|---|
| 531 | 538 | r2 = extru(ir, fpr2pos, 5) * sizeof(double)/sizeof(u_int); |
|---|
| .. | .. |
|---|
| 603 | 610 | case 3: /* quad not implemented */ |
|---|
| 604 | 611 | return(MAJOR_0C_EXCP); |
|---|
| 605 | 612 | } |
|---|
| 613 | + BUG(); |
|---|
| 606 | 614 | case 1: /* FTEST */ |
|---|
| 607 | 615 | switch (fmt) { |
|---|
| 608 | 616 | case 0: |
|---|
| .. | .. |
|---|
| 622 | 630 | case 3: |
|---|
| 623 | 631 | return(MAJOR_0C_EXCP); |
|---|
| 624 | 632 | } |
|---|
| 633 | + BUG(); |
|---|
| 625 | 634 | } /* end of switch subop */ |
|---|
| 626 | 635 | } /* end of else for PA1.0 & PA1.1 */ |
|---|
| 636 | + BUG(); |
|---|
| 627 | 637 | case 3: /* class 3 */ |
|---|
| 628 | 638 | r2 = extru(ir,fpr2pos,5) * sizeof(double)/sizeof(u_int); |
|---|
| 629 | 639 | if (r2 == 0) |
|---|
| .. | .. |
|---|
| 646 | 656 | case 3: /* quad not implemented */ |
|---|
| 647 | 657 | return(MAJOR_0C_EXCP); |
|---|
| 648 | 658 | } |
|---|
| 659 | + BUG(); |
|---|
| 649 | 660 | case 1: /* FSUB */ |
|---|
| 650 | 661 | switch (fmt) { |
|---|
| 651 | 662 | case 0: |
|---|
| .. | .. |
|---|
| 658 | 669 | case 3: /* quad not implemented */ |
|---|
| 659 | 670 | return(MAJOR_0C_EXCP); |
|---|
| 660 | 671 | } |
|---|
| 672 | + BUG(); |
|---|
| 661 | 673 | case 2: /* FMPY */ |
|---|
| 662 | 674 | switch (fmt) { |
|---|
| 663 | 675 | case 0: |
|---|
| .. | .. |
|---|
| 670 | 682 | case 3: /* quad not implemented */ |
|---|
| 671 | 683 | return(MAJOR_0C_EXCP); |
|---|
| 672 | 684 | } |
|---|
| 685 | + BUG(); |
|---|
| 673 | 686 | case 3: /* FDIV */ |
|---|
| 674 | 687 | switch (fmt) { |
|---|
| 675 | 688 | case 0: |
|---|
| .. | .. |
|---|
| 682 | 695 | case 3: /* quad not implemented */ |
|---|
| 683 | 696 | return(MAJOR_0C_EXCP); |
|---|
| 684 | 697 | } |
|---|
| 698 | + BUG(); |
|---|
| 685 | 699 | case 4: /* FREM */ |
|---|
| 686 | 700 | switch (fmt) { |
|---|
| 687 | 701 | case 0: |
|---|
| .. | .. |
|---|
| 694 | 708 | case 3: /* quad not implemented */ |
|---|
| 695 | 709 | return(MAJOR_0C_EXCP); |
|---|
| 696 | 710 | } |
|---|
| 711 | + BUG(); |
|---|
| 697 | 712 | } /* end of class 3 switch */ |
|---|
| 698 | 713 | } /* end of switch(class) */ |
|---|
| 699 | 714 | |
|---|
| .. | .. |
|---|
| 749 | 764 | return(MAJOR_0E_EXCP); |
|---|
| 750 | 765 | case 1: /* double */ |
|---|
| 751 | 766 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 767 | + fallthrough; |
|---|
| 752 | 768 | case 0: /* single */ |
|---|
| 753 | 769 | fpregs[t] = fpregs[r1]; |
|---|
| 754 | 770 | return(NOEXCEPTION); |
|---|
| 755 | 771 | } |
|---|
| 772 | + BUG(); |
|---|
| 756 | 773 | case 3: /* FABS */ |
|---|
| 757 | 774 | switch (fmt) { |
|---|
| 758 | 775 | case 2: |
|---|
| .. | .. |
|---|
| 760 | 777 | return(MAJOR_0E_EXCP); |
|---|
| 761 | 778 | case 1: /* double */ |
|---|
| 762 | 779 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 780 | + fallthrough; |
|---|
| 763 | 781 | case 0: /* single */ |
|---|
| 764 | 782 | fpregs[t] = fpregs[r1] & 0x7fffffff; |
|---|
| 765 | 783 | return(NOEXCEPTION); |
|---|
| 766 | 784 | } |
|---|
| 785 | + BUG(); |
|---|
| 767 | 786 | case 6: /* FNEG */ |
|---|
| 768 | 787 | switch (fmt) { |
|---|
| 769 | 788 | case 2: |
|---|
| .. | .. |
|---|
| 771 | 790 | return(MAJOR_0E_EXCP); |
|---|
| 772 | 791 | case 1: /* double */ |
|---|
| 773 | 792 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 793 | + fallthrough; |
|---|
| 774 | 794 | case 0: /* single */ |
|---|
| 775 | 795 | fpregs[t] = fpregs[r1] ^ 0x80000000; |
|---|
| 776 | 796 | return(NOEXCEPTION); |
|---|
| 777 | 797 | } |
|---|
| 798 | + BUG(); |
|---|
| 778 | 799 | case 7: /* FNEGABS */ |
|---|
| 779 | 800 | switch (fmt) { |
|---|
| 780 | 801 | case 2: |
|---|
| .. | .. |
|---|
| 782 | 803 | return(MAJOR_0E_EXCP); |
|---|
| 783 | 804 | case 1: /* double */ |
|---|
| 784 | 805 | fpregs[t+1] = fpregs[r1+1]; |
|---|
| 806 | + fallthrough; |
|---|
| 785 | 807 | case 0: /* single */ |
|---|
| 786 | 808 | fpregs[t] = fpregs[r1] | 0x80000000; |
|---|
| 787 | 809 | return(NOEXCEPTION); |
|---|
| 788 | 810 | } |
|---|
| 811 | + BUG(); |
|---|
| 789 | 812 | case 4: /* FSQRT */ |
|---|
| 790 | 813 | switch (fmt) { |
|---|
| 791 | 814 | case 0: |
|---|
| .. | .. |
|---|
| 798 | 821 | case 3: |
|---|
| 799 | 822 | return(MAJOR_0E_EXCP); |
|---|
| 800 | 823 | } |
|---|
| 824 | + BUG(); |
|---|
| 801 | 825 | case 5: /* FRMD */ |
|---|
| 802 | 826 | switch (fmt) { |
|---|
| 803 | 827 | case 0: |
|---|
| .. | .. |
|---|
| 811 | 835 | return(MAJOR_0E_EXCP); |
|---|
| 812 | 836 | } |
|---|
| 813 | 837 | } /* end of switch (subop */ |
|---|
| 814 | | - |
|---|
| 838 | + BUG(); |
|---|
| 815 | 839 | case 1: /* class 1 */ |
|---|
| 816 | 840 | df = extru(ir,fpdfpos,2); /* get dest format */ |
|---|
| 817 | 841 | /* |
|---|
| .. | .. |
|---|
| 839 | 863 | case 3: /* dbl/dbl */ |
|---|
| 840 | 864 | return(MAJOR_0E_EXCP); |
|---|
| 841 | 865 | } |
|---|
| 866 | + BUG(); |
|---|
| 842 | 867 | case 1: /* FCNVXF */ |
|---|
| 843 | 868 | switch(fmt) { |
|---|
| 844 | 869 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 854 | 879 | return(dbl_to_dbl_fcnvxf(&fpregs[r1],0, |
|---|
| 855 | 880 | &fpregs[t],status)); |
|---|
| 856 | 881 | } |
|---|
| 882 | + BUG(); |
|---|
| 857 | 883 | case 2: /* FCNVFX */ |
|---|
| 858 | 884 | switch(fmt) { |
|---|
| 859 | 885 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 869 | 895 | return(dbl_to_dbl_fcnvfx(&fpregs[r1],0, |
|---|
| 870 | 896 | &fpregs[t],status)); |
|---|
| 871 | 897 | } |
|---|
| 898 | + BUG(); |
|---|
| 872 | 899 | case 3: /* FCNVFXT */ |
|---|
| 873 | 900 | switch(fmt) { |
|---|
| 874 | 901 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 884 | 911 | return(dbl_to_dbl_fcnvfxt(&fpregs[r1],0, |
|---|
| 885 | 912 | &fpregs[t],status)); |
|---|
| 886 | 913 | } |
|---|
| 914 | + BUG(); |
|---|
| 887 | 915 | case 5: /* FCNVUF (PA2.0 only) */ |
|---|
| 888 | 916 | switch(fmt) { |
|---|
| 889 | 917 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 899 | 927 | return(dbl_to_dbl_fcnvuf(&fpregs[r1],0, |
|---|
| 900 | 928 | &fpregs[t],status)); |
|---|
| 901 | 929 | } |
|---|
| 930 | + BUG(); |
|---|
| 902 | 931 | case 6: /* FCNVFU (PA2.0 only) */ |
|---|
| 903 | 932 | switch(fmt) { |
|---|
| 904 | 933 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 914 | 943 | return(dbl_to_dbl_fcnvfu(&fpregs[r1],0, |
|---|
| 915 | 944 | &fpregs[t],status)); |
|---|
| 916 | 945 | } |
|---|
| 946 | + BUG(); |
|---|
| 917 | 947 | case 7: /* FCNVFUT (PA2.0 only) */ |
|---|
| 918 | 948 | switch(fmt) { |
|---|
| 919 | 949 | case 0: /* sgl/sgl */ |
|---|
| .. | .. |
|---|
| 929 | 959 | return(dbl_to_dbl_fcnvfut(&fpregs[r1],0, |
|---|
| 930 | 960 | &fpregs[t],status)); |
|---|
| 931 | 961 | } |
|---|
| 962 | + BUG(); |
|---|
| 932 | 963 | case 4: /* undefined */ |
|---|
| 933 | 964 | return(MAJOR_0C_EXCP); |
|---|
| 934 | 965 | } /* end of switch subop */ |
|---|
| 966 | + BUG(); |
|---|
| 935 | 967 | case 2: /* class 2 */ |
|---|
| 936 | 968 | /* |
|---|
| 937 | 969 | * Be careful out there. |
|---|
| .. | .. |
|---|
| 1007 | 1039 | } |
|---|
| 1008 | 1040 | } /* end of switch subop */ |
|---|
| 1009 | 1041 | } /* end of else for PA1.0 & PA1.1 */ |
|---|
| 1042 | + BUG(); |
|---|
| 1010 | 1043 | case 3: /* class 3 */ |
|---|
| 1011 | 1044 | /* |
|---|
| 1012 | 1045 | * Be careful out there. |
|---|
| .. | .. |
|---|
| 1039 | 1072 | return(dbl_fadd(&fpregs[r1],&fpregs[r2], |
|---|
| 1040 | 1073 | &fpregs[t],status)); |
|---|
| 1041 | 1074 | } |
|---|
| 1075 | + BUG(); |
|---|
| 1042 | 1076 | case 1: /* FSUB */ |
|---|
| 1043 | 1077 | switch (fmt) { |
|---|
| 1044 | 1078 | case 0: |
|---|
| .. | .. |
|---|
| 1048 | 1082 | return(dbl_fsub(&fpregs[r1],&fpregs[r2], |
|---|
| 1049 | 1083 | &fpregs[t],status)); |
|---|
| 1050 | 1084 | } |
|---|
| 1085 | + BUG(); |
|---|
| 1051 | 1086 | case 2: /* FMPY or XMPYU */ |
|---|
| 1052 | 1087 | /* |
|---|
| 1053 | 1088 | * check for integer multiply (x bit set) |
|---|
| .. | .. |
|---|
| 1084 | 1119 | &fpregs[r2],&fpregs[t],status)); |
|---|
| 1085 | 1120 | } |
|---|
| 1086 | 1121 | } |
|---|
| 1122 | + BUG(); |
|---|
| 1087 | 1123 | case 3: /* FDIV */ |
|---|
| 1088 | 1124 | switch (fmt) { |
|---|
| 1089 | 1125 | case 0: |
|---|
| .. | .. |
|---|
| 1093 | 1129 | return(dbl_fdiv(&fpregs[r1],&fpregs[r2], |
|---|
| 1094 | 1130 | &fpregs[t],status)); |
|---|
| 1095 | 1131 | } |
|---|
| 1132 | + BUG(); |
|---|
| 1096 | 1133 | case 4: /* FREM */ |
|---|
| 1097 | 1134 | switch (fmt) { |
|---|
| 1098 | 1135 | case 0: |
|---|