.. | .. |
---|
| 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: |
---|