Lines Matching +full:ctrl +full:- +full:b
3 M68000 Hi-Performance Microprocessor Division
5 Production Release P1.00 -- October 10, 1994
276 set LV, -LOCAL_SIZE # stack offset
285 set EXC_AREGS, -68 # offset of all address regs
286 set EXC_DREGS, -100 # offset of all data regs
287 set EXC_FPREGS, -36 # offset of all fp regs
503 set rn_mode, 0x0 # round-to-nearest
504 set rz_mode, 0x1 # round-to-zero
505 set rm_mode, 0x2 # round-tp-minus-infinity
506 set rp_mode, 0x3 # round-to-plus-infinity
528 set mda7_flg, 0x08 # flag bit: -(a7) <ea>
539 # TRANSCENDENTAL "LAST-OP" FLAGS #
563 link %a6,&-LOCAL_SIZE
565 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
566 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
578 mov.b %d0,STAG(%a6)
579 mov.b %d0,%d1
584 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
586 tst.b %d1
587 bne.b _L0_2s
589 bra.b _L0_6s
591 cmpi.b %d1,&ZERO # is operand a ZERO?
592 bne.b _L0_3s # no
594 bra.b _L0_6s
596 cmpi.b %d1,&INF # is operand an INF?
597 bne.b _L0_4s # no
599 bra.b _L0_6s
601 cmpi.b %d1,&QNAN # is operand a QNAN?
602 bne.b _L0_5s # no
604 bra.b _L0_6s
612 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
613 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
620 link %a6,&-LOCAL_SIZE
622 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
623 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
635 mov.b %d0,STAG(%a6)
636 mov.b %d0,%d1
641 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
643 mov.b %d1,STAG(%a6)
644 tst.b %d1
645 bne.b _L0_2d
647 bra.b _L0_6d
649 cmpi.b %d1,&ZERO # is operand a ZERO?
650 bne.b _L0_3d # no
652 bra.b _L0_6d
654 cmpi.b %d1,&INF # is operand an INF?
655 bne.b _L0_4d # no
657 bra.b _L0_6d
659 cmpi.b %d1,&QNAN # is operand a QNAN?
660 bne.b _L0_5d # no
662 bra.b _L0_6d
670 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
671 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
678 link %a6,&-LOCAL_SIZE
680 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
681 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
694 mov.b %d0,STAG(%a6)
695 mov.b %d0,%d1
700 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
702 tst.b %d1
703 bne.b _L0_2x
705 bra.b _L0_6x
707 cmpi.b %d1,&ZERO # is operand a ZERO?
708 bne.b _L0_3x # no
710 bra.b _L0_6x
712 cmpi.b %d1,&INF # is operand an INF?
713 bne.b _L0_4x # no
715 bra.b _L0_6x
717 cmpi.b %d1,&QNAN # is operand a QNAN?
718 bne.b _L0_5x # no
720 bra.b _L0_6x
728 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
729 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
740 link %a6,&-LOCAL_SIZE
742 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
743 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
755 mov.b %d0,STAG(%a6)
756 mov.b %d0,%d1
761 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
763 tst.b %d1
764 bne.b _L1_2s
766 bra.b _L1_6s
768 cmpi.b %d1,&ZERO # is operand a ZERO?
769 bne.b _L1_3s # no
771 bra.b _L1_6s
773 cmpi.b %d1,&INF # is operand an INF?
774 bne.b _L1_4s # no
776 bra.b _L1_6s
778 cmpi.b %d1,&QNAN # is operand a QNAN?
779 bne.b _L1_5s # no
781 bra.b _L1_6s
789 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
790 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
797 link %a6,&-LOCAL_SIZE
799 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
800 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
812 mov.b %d0,STAG(%a6)
813 mov.b %d0,%d1
818 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
820 mov.b %d1,STAG(%a6)
821 tst.b %d1
822 bne.b _L1_2d
824 bra.b _L1_6d
826 cmpi.b %d1,&ZERO # is operand a ZERO?
827 bne.b _L1_3d # no
829 bra.b _L1_6d
831 cmpi.b %d1,&INF # is operand an INF?
832 bne.b _L1_4d # no
834 bra.b _L1_6d
836 cmpi.b %d1,&QNAN # is operand a QNAN?
837 bne.b _L1_5d # no
839 bra.b _L1_6d
847 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
848 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
855 link %a6,&-LOCAL_SIZE
857 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
858 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
871 mov.b %d0,STAG(%a6)
872 mov.b %d0,%d1
877 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
879 tst.b %d1
880 bne.b _L1_2x
882 bra.b _L1_6x
884 cmpi.b %d1,&ZERO # is operand a ZERO?
885 bne.b _L1_3x # no
887 bra.b _L1_6x
889 cmpi.b %d1,&INF # is operand an INF?
890 bne.b _L1_4x # no
892 bra.b _L1_6x
894 cmpi.b %d1,&QNAN # is operand a QNAN?
895 bne.b _L1_5x # no
897 bra.b _L1_6x
905 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
906 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
917 link %a6,&-LOCAL_SIZE
919 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
920 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
932 mov.b %d0,STAG(%a6)
933 mov.b %d0,%d1
938 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
940 tst.b %d1
941 bne.b _L2_2s
943 bra.b _L2_6s
945 cmpi.b %d1,&ZERO # is operand a ZERO?
946 bne.b _L2_3s # no
948 bra.b _L2_6s
950 cmpi.b %d1,&INF # is operand an INF?
951 bne.b _L2_4s # no
953 bra.b _L2_6s
955 cmpi.b %d1,&QNAN # is operand a QNAN?
956 bne.b _L2_5s # no
958 bra.b _L2_6s
966 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
967 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
974 link %a6,&-LOCAL_SIZE
976 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
977 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
989 mov.b %d0,STAG(%a6)
990 mov.b %d0,%d1
995 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
997 mov.b %d1,STAG(%a6)
998 tst.b %d1
999 bne.b _L2_2d
1001 bra.b _L2_6d
1003 cmpi.b %d1,&ZERO # is operand a ZERO?
1004 bne.b _L2_3d # no
1006 bra.b _L2_6d
1008 cmpi.b %d1,&INF # is operand an INF?
1009 bne.b _L2_4d # no
1011 bra.b _L2_6d
1013 cmpi.b %d1,&QNAN # is operand a QNAN?
1014 bne.b _L2_5d # no
1016 bra.b _L2_6d
1024 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1025 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1032 link %a6,&-LOCAL_SIZE
1034 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1035 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1048 mov.b %d0,STAG(%a6)
1049 mov.b %d0,%d1
1054 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1056 tst.b %d1
1057 bne.b _L2_2x
1059 bra.b _L2_6x
1061 cmpi.b %d1,&ZERO # is operand a ZERO?
1062 bne.b _L2_3x # no
1064 bra.b _L2_6x
1066 cmpi.b %d1,&INF # is operand an INF?
1067 bne.b _L2_4x # no
1069 bra.b _L2_6x
1071 cmpi.b %d1,&QNAN # is operand a QNAN?
1072 bne.b _L2_5x # no
1074 bra.b _L2_6x
1082 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1083 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1094 link %a6,&-LOCAL_SIZE
1096 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1097 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1109 mov.b %d0,STAG(%a6)
1110 mov.b %d0,%d1
1115 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1117 tst.b %d1
1118 bne.b _L3_2s
1120 bra.b _L3_6s
1122 cmpi.b %d1,&ZERO # is operand a ZERO?
1123 bne.b _L3_3s # no
1125 bra.b _L3_6s
1127 cmpi.b %d1,&INF # is operand an INF?
1128 bne.b _L3_4s # no
1130 bra.b _L3_6s
1132 cmpi.b %d1,&QNAN # is operand a QNAN?
1133 bne.b _L3_5s # no
1135 bra.b _L3_6s
1143 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1144 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1151 link %a6,&-LOCAL_SIZE
1153 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1154 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1166 mov.b %d0,STAG(%a6)
1167 mov.b %d0,%d1
1172 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1174 mov.b %d1,STAG(%a6)
1175 tst.b %d1
1176 bne.b _L3_2d
1178 bra.b _L3_6d
1180 cmpi.b %d1,&ZERO # is operand a ZERO?
1181 bne.b _L3_3d # no
1183 bra.b _L3_6d
1185 cmpi.b %d1,&INF # is operand an INF?
1186 bne.b _L3_4d # no
1188 bra.b _L3_6d
1190 cmpi.b %d1,&QNAN # is operand a QNAN?
1191 bne.b _L3_5d # no
1193 bra.b _L3_6d
1201 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1202 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1209 link %a6,&-LOCAL_SIZE
1211 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1212 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1225 mov.b %d0,STAG(%a6)
1226 mov.b %d0,%d1
1231 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1233 tst.b %d1
1234 bne.b _L3_2x
1236 bra.b _L3_6x
1238 cmpi.b %d1,&ZERO # is operand a ZERO?
1239 bne.b _L3_3x # no
1241 bra.b _L3_6x
1243 cmpi.b %d1,&INF # is operand an INF?
1244 bne.b _L3_4x # no
1246 bra.b _L3_6x
1248 cmpi.b %d1,&QNAN # is operand a QNAN?
1249 bne.b _L3_5x # no
1251 bra.b _L3_6x
1259 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1260 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1271 link %a6,&-LOCAL_SIZE
1273 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1274 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1286 mov.b %d0,STAG(%a6)
1287 mov.b %d0,%d1
1292 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1294 tst.b %d1
1295 bne.b _L4_2s
1297 bra.b _L4_6s
1299 cmpi.b %d1,&ZERO # is operand a ZERO?
1300 bne.b _L4_3s # no
1302 bra.b _L4_6s
1304 cmpi.b %d1,&INF # is operand an INF?
1305 bne.b _L4_4s # no
1307 bra.b _L4_6s
1309 cmpi.b %d1,&QNAN # is operand a QNAN?
1310 bne.b _L4_5s # no
1312 bra.b _L4_6s
1320 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1321 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1328 link %a6,&-LOCAL_SIZE
1330 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1331 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1343 mov.b %d0,STAG(%a6)
1344 mov.b %d0,%d1
1349 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1351 mov.b %d1,STAG(%a6)
1352 tst.b %d1
1353 bne.b _L4_2d
1355 bra.b _L4_6d
1357 cmpi.b %d1,&ZERO # is operand a ZERO?
1358 bne.b _L4_3d # no
1360 bra.b _L4_6d
1362 cmpi.b %d1,&INF # is operand an INF?
1363 bne.b _L4_4d # no
1365 bra.b _L4_6d
1367 cmpi.b %d1,&QNAN # is operand a QNAN?
1368 bne.b _L4_5d # no
1370 bra.b _L4_6d
1378 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1379 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1386 link %a6,&-LOCAL_SIZE
1388 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1389 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1402 mov.b %d0,STAG(%a6)
1403 mov.b %d0,%d1
1408 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1410 tst.b %d1
1411 bne.b _L4_2x
1413 bra.b _L4_6x
1415 cmpi.b %d1,&ZERO # is operand a ZERO?
1416 bne.b _L4_3x # no
1418 bra.b _L4_6x
1420 cmpi.b %d1,&INF # is operand an INF?
1421 bne.b _L4_4x # no
1423 bra.b _L4_6x
1425 cmpi.b %d1,&QNAN # is operand a QNAN?
1426 bne.b _L4_5x # no
1428 bra.b _L4_6x
1436 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1437 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1448 link %a6,&-LOCAL_SIZE
1450 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1451 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1463 mov.b %d0,STAG(%a6)
1464 mov.b %d0,%d1
1469 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1471 tst.b %d1
1472 bne.b _L5_2s
1474 bra.b _L5_6s
1476 cmpi.b %d1,&ZERO # is operand a ZERO?
1477 bne.b _L5_3s # no
1479 bra.b _L5_6s
1481 cmpi.b %d1,&INF # is operand an INF?
1482 bne.b _L5_4s # no
1484 bra.b _L5_6s
1486 cmpi.b %d1,&QNAN # is operand a QNAN?
1487 bne.b _L5_5s # no
1489 bra.b _L5_6s
1497 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1498 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1505 link %a6,&-LOCAL_SIZE
1507 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1508 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1520 mov.b %d0,STAG(%a6)
1521 mov.b %d0,%d1
1526 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1528 mov.b %d1,STAG(%a6)
1529 tst.b %d1
1530 bne.b _L5_2d
1532 bra.b _L5_6d
1534 cmpi.b %d1,&ZERO # is operand a ZERO?
1535 bne.b _L5_3d # no
1537 bra.b _L5_6d
1539 cmpi.b %d1,&INF # is operand an INF?
1540 bne.b _L5_4d # no
1542 bra.b _L5_6d
1544 cmpi.b %d1,&QNAN # is operand a QNAN?
1545 bne.b _L5_5d # no
1547 bra.b _L5_6d
1555 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1556 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1563 link %a6,&-LOCAL_SIZE
1565 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1566 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1579 mov.b %d0,STAG(%a6)
1580 mov.b %d0,%d1
1585 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1587 tst.b %d1
1588 bne.b _L5_2x
1590 bra.b _L5_6x
1592 cmpi.b %d1,&ZERO # is operand a ZERO?
1593 bne.b _L5_3x # no
1595 bra.b _L5_6x
1597 cmpi.b %d1,&INF # is operand an INF?
1598 bne.b _L5_4x # no
1600 bra.b _L5_6x
1602 cmpi.b %d1,&QNAN # is operand a QNAN?
1603 bne.b _L5_5x # no
1605 bra.b _L5_6x
1613 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1614 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1625 link %a6,&-LOCAL_SIZE
1627 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1628 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1640 mov.b %d0,STAG(%a6)
1641 mov.b %d0,%d1
1646 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1648 tst.b %d1
1649 bne.b _L6_2s
1651 bra.b _L6_6s
1653 cmpi.b %d1,&ZERO # is operand a ZERO?
1654 bne.b _L6_3s # no
1656 bra.b _L6_6s
1658 cmpi.b %d1,&INF # is operand an INF?
1659 bne.b _L6_4s # no
1661 bra.b _L6_6s
1663 cmpi.b %d1,&QNAN # is operand a QNAN?
1664 bne.b _L6_5s # no
1666 bra.b _L6_6s
1674 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1675 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1682 link %a6,&-LOCAL_SIZE
1684 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1685 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1697 mov.b %d0,STAG(%a6)
1698 mov.b %d0,%d1
1703 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1705 mov.b %d1,STAG(%a6)
1706 tst.b %d1
1707 bne.b _L6_2d
1709 bra.b _L6_6d
1711 cmpi.b %d1,&ZERO # is operand a ZERO?
1712 bne.b _L6_3d # no
1714 bra.b _L6_6d
1716 cmpi.b %d1,&INF # is operand an INF?
1717 bne.b _L6_4d # no
1719 bra.b _L6_6d
1721 cmpi.b %d1,&QNAN # is operand a QNAN?
1722 bne.b _L6_5d # no
1724 bra.b _L6_6d
1732 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1733 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1740 link %a6,&-LOCAL_SIZE
1742 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1743 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1756 mov.b %d0,STAG(%a6)
1757 mov.b %d0,%d1
1762 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1764 tst.b %d1
1765 bne.b _L6_2x
1767 bra.b _L6_6x
1769 cmpi.b %d1,&ZERO # is operand a ZERO?
1770 bne.b _L6_3x # no
1772 bra.b _L6_6x
1774 cmpi.b %d1,&INF # is operand an INF?
1775 bne.b _L6_4x # no
1777 bra.b _L6_6x
1779 cmpi.b %d1,&QNAN # is operand a QNAN?
1780 bne.b _L6_5x # no
1782 bra.b _L6_6x
1790 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1791 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1802 link %a6,&-LOCAL_SIZE
1804 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1805 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1817 mov.b %d0,STAG(%a6)
1818 mov.b %d0,%d1
1823 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1825 tst.b %d1
1826 bne.b _L7_2s
1828 bra.b _L7_6s
1830 cmpi.b %d1,&ZERO # is operand a ZERO?
1831 bne.b _L7_3s # no
1833 bra.b _L7_6s
1835 cmpi.b %d1,&INF # is operand an INF?
1836 bne.b _L7_4s # no
1838 bra.b _L7_6s
1840 cmpi.b %d1,&QNAN # is operand a QNAN?
1841 bne.b _L7_5s # no
1843 bra.b _L7_6s
1851 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1852 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1859 link %a6,&-LOCAL_SIZE
1861 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1862 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1874 mov.b %d0,STAG(%a6)
1875 mov.b %d0,%d1
1880 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1882 mov.b %d1,STAG(%a6)
1883 tst.b %d1
1884 bne.b _L7_2d
1886 bra.b _L7_6d
1888 cmpi.b %d1,&ZERO # is operand a ZERO?
1889 bne.b _L7_3d # no
1891 bra.b _L7_6d
1893 cmpi.b %d1,&INF # is operand an INF?
1894 bne.b _L7_4d # no
1896 bra.b _L7_6d
1898 cmpi.b %d1,&QNAN # is operand a QNAN?
1899 bne.b _L7_5d # no
1901 bra.b _L7_6d
1909 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1910 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1917 link %a6,&-LOCAL_SIZE
1919 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1920 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1933 mov.b %d0,STAG(%a6)
1934 mov.b %d0,%d1
1939 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
1941 tst.b %d1
1942 bne.b _L7_2x
1944 bra.b _L7_6x
1946 cmpi.b %d1,&ZERO # is operand a ZERO?
1947 bne.b _L7_3x # no
1949 bra.b _L7_6x
1951 cmpi.b %d1,&INF # is operand an INF?
1952 bne.b _L7_4x # no
1954 bra.b _L7_6x
1956 cmpi.b %d1,&QNAN # is operand a QNAN?
1957 bne.b _L7_5x # no
1959 bra.b _L7_6x
1967 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
1968 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
1979 link %a6,&-LOCAL_SIZE
1981 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
1982 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
1994 mov.b %d0,STAG(%a6)
1995 mov.b %d0,%d1
2000 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2002 tst.b %d1
2003 bne.b _L8_2s
2005 bra.b _L8_6s
2007 cmpi.b %d1,&ZERO # is operand a ZERO?
2008 bne.b _L8_3s # no
2010 bra.b _L8_6s
2012 cmpi.b %d1,&INF # is operand an INF?
2013 bne.b _L8_4s # no
2015 bra.b _L8_6s
2017 cmpi.b %d1,&QNAN # is operand a QNAN?
2018 bne.b _L8_5s # no
2020 bra.b _L8_6s
2028 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2029 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2036 link %a6,&-LOCAL_SIZE
2038 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2039 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2051 mov.b %d0,STAG(%a6)
2052 mov.b %d0,%d1
2057 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2059 mov.b %d1,STAG(%a6)
2060 tst.b %d1
2061 bne.b _L8_2d
2063 bra.b _L8_6d
2065 cmpi.b %d1,&ZERO # is operand a ZERO?
2066 bne.b _L8_3d # no
2068 bra.b _L8_6d
2070 cmpi.b %d1,&INF # is operand an INF?
2071 bne.b _L8_4d # no
2073 bra.b _L8_6d
2075 cmpi.b %d1,&QNAN # is operand a QNAN?
2076 bne.b _L8_5d # no
2078 bra.b _L8_6d
2086 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2087 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2094 link %a6,&-LOCAL_SIZE
2096 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2097 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2110 mov.b %d0,STAG(%a6)
2111 mov.b %d0,%d1
2116 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2118 tst.b %d1
2119 bne.b _L8_2x
2121 bra.b _L8_6x
2123 cmpi.b %d1,&ZERO # is operand a ZERO?
2124 bne.b _L8_3x # no
2126 bra.b _L8_6x
2128 cmpi.b %d1,&INF # is operand an INF?
2129 bne.b _L8_4x # no
2131 bra.b _L8_6x
2133 cmpi.b %d1,&QNAN # is operand a QNAN?
2134 bne.b _L8_5x # no
2136 bra.b _L8_6x
2144 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2145 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2156 link %a6,&-LOCAL_SIZE
2158 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2159 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2171 mov.b %d0,STAG(%a6)
2172 mov.b %d0,%d1
2177 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2179 tst.b %d1
2180 bne.b _L9_2s
2182 bra.b _L9_6s
2184 cmpi.b %d1,&ZERO # is operand a ZERO?
2185 bne.b _L9_3s # no
2187 bra.b _L9_6s
2189 cmpi.b %d1,&INF # is operand an INF?
2190 bne.b _L9_4s # no
2192 bra.b _L9_6s
2194 cmpi.b %d1,&QNAN # is operand a QNAN?
2195 bne.b _L9_5s # no
2197 bra.b _L9_6s
2205 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2206 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2213 link %a6,&-LOCAL_SIZE
2215 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2216 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2228 mov.b %d0,STAG(%a6)
2229 mov.b %d0,%d1
2234 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2236 mov.b %d1,STAG(%a6)
2237 tst.b %d1
2238 bne.b _L9_2d
2240 bra.b _L9_6d
2242 cmpi.b %d1,&ZERO # is operand a ZERO?
2243 bne.b _L9_3d # no
2245 bra.b _L9_6d
2247 cmpi.b %d1,&INF # is operand an INF?
2248 bne.b _L9_4d # no
2250 bra.b _L9_6d
2252 cmpi.b %d1,&QNAN # is operand a QNAN?
2253 bne.b _L9_5d # no
2255 bra.b _L9_6d
2263 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2264 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2271 link %a6,&-LOCAL_SIZE
2273 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2274 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2287 mov.b %d0,STAG(%a6)
2288 mov.b %d0,%d1
2293 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2295 tst.b %d1
2296 bne.b _L9_2x
2298 bra.b _L9_6x
2300 cmpi.b %d1,&ZERO # is operand a ZERO?
2301 bne.b _L9_3x # no
2303 bra.b _L9_6x
2305 cmpi.b %d1,&INF # is operand an INF?
2306 bne.b _L9_4x # no
2308 bra.b _L9_6x
2310 cmpi.b %d1,&QNAN # is operand a QNAN?
2311 bne.b _L9_5x # no
2313 bra.b _L9_6x
2321 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2322 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2333 link %a6,&-LOCAL_SIZE
2335 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2336 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2348 mov.b %d0,STAG(%a6)
2349 mov.b %d0,%d1
2354 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2356 tst.b %d1
2357 bne.b _L10_2s
2359 bra.b _L10_6s
2361 cmpi.b %d1,&ZERO # is operand a ZERO?
2362 bne.b _L10_3s # no
2364 bra.b _L10_6s
2366 cmpi.b %d1,&INF # is operand an INF?
2367 bne.b _L10_4s # no
2369 bra.b _L10_6s
2371 cmpi.b %d1,&QNAN # is operand a QNAN?
2372 bne.b _L10_5s # no
2374 bra.b _L10_6s
2382 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2383 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2390 link %a6,&-LOCAL_SIZE
2392 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2393 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2405 mov.b %d0,STAG(%a6)
2406 mov.b %d0,%d1
2411 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2413 mov.b %d1,STAG(%a6)
2414 tst.b %d1
2415 bne.b _L10_2d
2417 bra.b _L10_6d
2419 cmpi.b %d1,&ZERO # is operand a ZERO?
2420 bne.b _L10_3d # no
2422 bra.b _L10_6d
2424 cmpi.b %d1,&INF # is operand an INF?
2425 bne.b _L10_4d # no
2427 bra.b _L10_6d
2429 cmpi.b %d1,&QNAN # is operand a QNAN?
2430 bne.b _L10_5d # no
2432 bra.b _L10_6d
2440 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2441 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2448 link %a6,&-LOCAL_SIZE
2450 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2451 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2464 mov.b %d0,STAG(%a6)
2465 mov.b %d0,%d1
2470 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2472 tst.b %d1
2473 bne.b _L10_2x
2475 bra.b _L10_6x
2477 cmpi.b %d1,&ZERO # is operand a ZERO?
2478 bne.b _L10_3x # no
2480 bra.b _L10_6x
2482 cmpi.b %d1,&INF # is operand an INF?
2483 bne.b _L10_4x # no
2485 bra.b _L10_6x
2487 cmpi.b %d1,&QNAN # is operand a QNAN?
2488 bne.b _L10_5x # no
2490 bra.b _L10_6x
2498 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2499 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2510 link %a6,&-LOCAL_SIZE
2512 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2513 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2525 mov.b %d0,STAG(%a6)
2526 mov.b %d0,%d1
2531 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2533 tst.b %d1
2534 bne.b _L11_2s
2536 bra.b _L11_6s
2538 cmpi.b %d1,&ZERO # is operand a ZERO?
2539 bne.b _L11_3s # no
2541 bra.b _L11_6s
2543 cmpi.b %d1,&INF # is operand an INF?
2544 bne.b _L11_4s # no
2546 bra.b _L11_6s
2548 cmpi.b %d1,&QNAN # is operand a QNAN?
2549 bne.b _L11_5s # no
2551 bra.b _L11_6s
2559 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2560 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2567 link %a6,&-LOCAL_SIZE
2569 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2570 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2582 mov.b %d0,STAG(%a6)
2583 mov.b %d0,%d1
2588 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2590 mov.b %d1,STAG(%a6)
2591 tst.b %d1
2592 bne.b _L11_2d
2594 bra.b _L11_6d
2596 cmpi.b %d1,&ZERO # is operand a ZERO?
2597 bne.b _L11_3d # no
2599 bra.b _L11_6d
2601 cmpi.b %d1,&INF # is operand an INF?
2602 bne.b _L11_4d # no
2604 bra.b _L11_6d
2606 cmpi.b %d1,&QNAN # is operand a QNAN?
2607 bne.b _L11_5d # no
2609 bra.b _L11_6d
2617 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2618 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2625 link %a6,&-LOCAL_SIZE
2627 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2628 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2641 mov.b %d0,STAG(%a6)
2642 mov.b %d0,%d1
2647 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2649 tst.b %d1
2650 bne.b _L11_2x
2652 bra.b _L11_6x
2654 cmpi.b %d1,&ZERO # is operand a ZERO?
2655 bne.b _L11_3x # no
2657 bra.b _L11_6x
2659 cmpi.b %d1,&INF # is operand an INF?
2660 bne.b _L11_4x # no
2662 bra.b _L11_6x
2664 cmpi.b %d1,&QNAN # is operand a QNAN?
2665 bne.b _L11_5x # no
2667 bra.b _L11_6x
2675 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2676 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2687 link %a6,&-LOCAL_SIZE
2689 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2690 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2702 mov.b %d0,STAG(%a6)
2703 mov.b %d0,%d1
2708 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2710 tst.b %d1
2711 bne.b _L12_2s
2713 bra.b _L12_6s
2715 cmpi.b %d1,&ZERO # is operand a ZERO?
2716 bne.b _L12_3s # no
2718 bra.b _L12_6s
2720 cmpi.b %d1,&INF # is operand an INF?
2721 bne.b _L12_4s # no
2723 bra.b _L12_6s
2725 cmpi.b %d1,&QNAN # is operand a QNAN?
2726 bne.b _L12_5s # no
2728 bra.b _L12_6s
2736 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2737 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2744 link %a6,&-LOCAL_SIZE
2746 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2747 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2759 mov.b %d0,STAG(%a6)
2760 mov.b %d0,%d1
2765 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2767 mov.b %d1,STAG(%a6)
2768 tst.b %d1
2769 bne.b _L12_2d
2771 bra.b _L12_6d
2773 cmpi.b %d1,&ZERO # is operand a ZERO?
2774 bne.b _L12_3d # no
2776 bra.b _L12_6d
2778 cmpi.b %d1,&INF # is operand an INF?
2779 bne.b _L12_4d # no
2781 bra.b _L12_6d
2783 cmpi.b %d1,&QNAN # is operand a QNAN?
2784 bne.b _L12_5d # no
2786 bra.b _L12_6d
2794 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2795 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2802 link %a6,&-LOCAL_SIZE
2804 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2805 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2818 mov.b %d0,STAG(%a6)
2819 mov.b %d0,%d1
2824 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2826 tst.b %d1
2827 bne.b _L12_2x
2829 bra.b _L12_6x
2831 cmpi.b %d1,&ZERO # is operand a ZERO?
2832 bne.b _L12_3x # no
2834 bra.b _L12_6x
2836 cmpi.b %d1,&INF # is operand an INF?
2837 bne.b _L12_4x # no
2839 bra.b _L12_6x
2841 cmpi.b %d1,&QNAN # is operand a QNAN?
2842 bne.b _L12_5x # no
2844 bra.b _L12_6x
2852 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2853 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2864 link %a6,&-LOCAL_SIZE
2866 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2867 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2879 mov.b %d0,STAG(%a6)
2880 mov.b %d0,%d1
2885 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2887 tst.b %d1
2888 bne.b _L13_2s
2890 bra.b _L13_6s
2892 cmpi.b %d1,&ZERO # is operand a ZERO?
2893 bne.b _L13_3s # no
2895 bra.b _L13_6s
2897 cmpi.b %d1,&INF # is operand an INF?
2898 bne.b _L13_4s # no
2900 bra.b _L13_6s
2902 cmpi.b %d1,&QNAN # is operand a QNAN?
2903 bne.b _L13_5s # no
2905 bra.b _L13_6s
2913 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2914 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2921 link %a6,&-LOCAL_SIZE
2923 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2924 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2936 mov.b %d0,STAG(%a6)
2937 mov.b %d0,%d1
2942 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
2944 mov.b %d1,STAG(%a6)
2945 tst.b %d1
2946 bne.b _L13_2d
2948 bra.b _L13_6d
2950 cmpi.b %d1,&ZERO # is operand a ZERO?
2951 bne.b _L13_3d # no
2953 bra.b _L13_6d
2955 cmpi.b %d1,&INF # is operand an INF?
2956 bne.b _L13_4d # no
2958 bra.b _L13_6d
2960 cmpi.b %d1,&QNAN # is operand a QNAN?
2961 bne.b _L13_5d # no
2963 bra.b _L13_6d
2971 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
2972 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
2979 link %a6,&-LOCAL_SIZE
2981 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
2982 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
2995 mov.b %d0,STAG(%a6)
2996 mov.b %d0,%d1
3001 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3003 tst.b %d1
3004 bne.b _L13_2x
3006 bra.b _L13_6x
3008 cmpi.b %d1,&ZERO # is operand a ZERO?
3009 bne.b _L13_3x # no
3011 bra.b _L13_6x
3013 cmpi.b %d1,&INF # is operand an INF?
3014 bne.b _L13_4x # no
3016 bra.b _L13_6x
3018 cmpi.b %d1,&QNAN # is operand a QNAN?
3019 bne.b _L13_5x # no
3021 bra.b _L13_6x
3029 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3030 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3041 link %a6,&-LOCAL_SIZE
3043 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3044 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3056 mov.b %d0,STAG(%a6)
3057 mov.b %d0,%d1
3062 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3064 tst.b %d1
3065 bne.b _L14_2s
3067 bra.b _L14_6s
3069 cmpi.b %d1,&ZERO # is operand a ZERO?
3070 bne.b _L14_3s # no
3072 bra.b _L14_6s
3074 cmpi.b %d1,&INF # is operand an INF?
3075 bne.b _L14_4s # no
3077 bra.b _L14_6s
3079 cmpi.b %d1,&QNAN # is operand a QNAN?
3080 bne.b _L14_5s # no
3082 bra.b _L14_6s
3090 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3091 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3098 link %a6,&-LOCAL_SIZE
3100 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3101 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3113 mov.b %d0,STAG(%a6)
3114 mov.b %d0,%d1
3119 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3121 mov.b %d1,STAG(%a6)
3122 tst.b %d1
3123 bne.b _L14_2d
3125 bra.b _L14_6d
3127 cmpi.b %d1,&ZERO # is operand a ZERO?
3128 bne.b _L14_3d # no
3130 bra.b _L14_6d
3132 cmpi.b %d1,&INF # is operand an INF?
3133 bne.b _L14_4d # no
3135 bra.b _L14_6d
3137 cmpi.b %d1,&QNAN # is operand a QNAN?
3138 bne.b _L14_5d # no
3140 bra.b _L14_6d
3148 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3149 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3156 link %a6,&-LOCAL_SIZE
3158 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3159 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3172 mov.b %d0,STAG(%a6)
3173 mov.b %d0,%d1
3178 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3180 tst.b %d1
3181 bne.b _L14_2x
3183 bra.b _L14_6x
3185 cmpi.b %d1,&ZERO # is operand a ZERO?
3186 bne.b _L14_3x # no
3188 bra.b _L14_6x
3190 cmpi.b %d1,&INF # is operand an INF?
3191 bne.b _L14_4x # no
3193 bra.b _L14_6x
3195 cmpi.b %d1,&QNAN # is operand a QNAN?
3196 bne.b _L14_5x # no
3198 bra.b _L14_6x
3206 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3207 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3218 link %a6,&-LOCAL_SIZE
3220 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3221 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3233 mov.b %d0,STAG(%a6)
3234 mov.b %d0,%d1
3239 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3241 tst.b %d1
3242 bne.b _L15_2s
3244 bra.b _L15_6s
3246 cmpi.b %d1,&ZERO # is operand a ZERO?
3247 bne.b _L15_3s # no
3249 bra.b _L15_6s
3251 cmpi.b %d1,&INF # is operand an INF?
3252 bne.b _L15_4s # no
3254 bra.b _L15_6s
3256 cmpi.b %d1,&QNAN # is operand a QNAN?
3257 bne.b _L15_5s # no
3259 bra.b _L15_6s
3267 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3268 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3275 link %a6,&-LOCAL_SIZE
3277 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3278 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3290 mov.b %d0,STAG(%a6)
3291 mov.b %d0,%d1
3296 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3298 mov.b %d1,STAG(%a6)
3299 tst.b %d1
3300 bne.b _L15_2d
3302 bra.b _L15_6d
3304 cmpi.b %d1,&ZERO # is operand a ZERO?
3305 bne.b _L15_3d # no
3307 bra.b _L15_6d
3309 cmpi.b %d1,&INF # is operand an INF?
3310 bne.b _L15_4d # no
3312 bra.b _L15_6d
3314 cmpi.b %d1,&QNAN # is operand a QNAN?
3315 bne.b _L15_5d # no
3317 bra.b _L15_6d
3325 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3326 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3333 link %a6,&-LOCAL_SIZE
3335 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3336 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3349 mov.b %d0,STAG(%a6)
3350 mov.b %d0,%d1
3355 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3357 tst.b %d1
3358 bne.b _L15_2x
3360 bra.b _L15_6x
3362 cmpi.b %d1,&ZERO # is operand a ZERO?
3363 bne.b _L15_3x # no
3365 bra.b _L15_6x
3367 cmpi.b %d1,&INF # is operand an INF?
3368 bne.b _L15_4x # no
3370 bra.b _L15_6x
3372 cmpi.b %d1,&QNAN # is operand a QNAN?
3373 bne.b _L15_5x # no
3375 bra.b _L15_6x
3383 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3384 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3395 link %a6,&-LOCAL_SIZE
3397 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3398 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3410 mov.b %d0,STAG(%a6)
3411 mov.b %d0,%d1
3416 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3418 tst.b %d1
3419 bne.b _L16_2s
3421 bra.b _L16_6s
3423 cmpi.b %d1,&ZERO # is operand a ZERO?
3424 bne.b _L16_3s # no
3426 bra.b _L16_6s
3428 cmpi.b %d1,&INF # is operand an INF?
3429 bne.b _L16_4s # no
3431 bra.b _L16_6s
3433 cmpi.b %d1,&QNAN # is operand a QNAN?
3434 bne.b _L16_5s # no
3436 bra.b _L16_6s
3444 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3445 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3452 link %a6,&-LOCAL_SIZE
3454 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3455 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3467 mov.b %d0,STAG(%a6)
3468 mov.b %d0,%d1
3473 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3475 mov.b %d1,STAG(%a6)
3476 tst.b %d1
3477 bne.b _L16_2d
3479 bra.b _L16_6d
3481 cmpi.b %d1,&ZERO # is operand a ZERO?
3482 bne.b _L16_3d # no
3484 bra.b _L16_6d
3486 cmpi.b %d1,&INF # is operand an INF?
3487 bne.b _L16_4d # no
3489 bra.b _L16_6d
3491 cmpi.b %d1,&QNAN # is operand a QNAN?
3492 bne.b _L16_5d # no
3494 bra.b _L16_6d
3502 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3503 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3510 link %a6,&-LOCAL_SIZE
3512 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3513 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3526 mov.b %d0,STAG(%a6)
3527 mov.b %d0,%d1
3532 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3534 tst.b %d1
3535 bne.b _L16_2x
3537 bra.b _L16_6x
3539 cmpi.b %d1,&ZERO # is operand a ZERO?
3540 bne.b _L16_3x # no
3542 bra.b _L16_6x
3544 cmpi.b %d1,&INF # is operand an INF?
3545 bne.b _L16_4x # no
3547 bra.b _L16_6x
3549 cmpi.b %d1,&QNAN # is operand a QNAN?
3550 bne.b _L16_5x # no
3552 bra.b _L16_6x
3560 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3561 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3572 link %a6,&-LOCAL_SIZE
3574 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3575 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3587 mov.b %d0,STAG(%a6)
3588 mov.b %d0,%d1
3593 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3595 tst.b %d1
3596 bne.b _L17_2s
3598 bra.b _L17_6s
3600 cmpi.b %d1,&ZERO # is operand a ZERO?
3601 bne.b _L17_3s # no
3603 bra.b _L17_6s
3605 cmpi.b %d1,&INF # is operand an INF?
3606 bne.b _L17_4s # no
3608 bra.b _L17_6s
3610 cmpi.b %d1,&QNAN # is operand a QNAN?
3611 bne.b _L17_5s # no
3613 bra.b _L17_6s
3621 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3622 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3629 link %a6,&-LOCAL_SIZE
3631 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3632 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3644 mov.b %d0,STAG(%a6)
3645 mov.b %d0,%d1
3650 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3652 mov.b %d1,STAG(%a6)
3653 tst.b %d1
3654 bne.b _L17_2d
3656 bra.b _L17_6d
3658 cmpi.b %d1,&ZERO # is operand a ZERO?
3659 bne.b _L17_3d # no
3661 bra.b _L17_6d
3663 cmpi.b %d1,&INF # is operand an INF?
3664 bne.b _L17_4d # no
3666 bra.b _L17_6d
3668 cmpi.b %d1,&QNAN # is operand a QNAN?
3669 bne.b _L17_5d # no
3671 bra.b _L17_6d
3679 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3680 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3687 link %a6,&-LOCAL_SIZE
3689 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3690 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3703 mov.b %d0,STAG(%a6)
3704 mov.b %d0,%d1
3709 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3711 tst.b %d1
3712 bne.b _L17_2x
3714 bra.b _L17_6x
3716 cmpi.b %d1,&ZERO # is operand a ZERO?
3717 bne.b _L17_3x # no
3719 bra.b _L17_6x
3721 cmpi.b %d1,&INF # is operand an INF?
3722 bne.b _L17_4x # no
3724 bra.b _L17_6x
3726 cmpi.b %d1,&QNAN # is operand a QNAN?
3727 bne.b _L17_5x # no
3729 bra.b _L17_6x
3737 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3738 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3749 link %a6,&-LOCAL_SIZE
3751 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3752 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3764 mov.b %d0,STAG(%a6)
3765 mov.b %d0,%d1
3770 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3772 tst.b %d1
3773 bne.b _L18_2s
3775 bra.b _L18_6s
3777 cmpi.b %d1,&ZERO # is operand a ZERO?
3778 bne.b _L18_3s # no
3780 bra.b _L18_6s
3782 cmpi.b %d1,&INF # is operand an INF?
3783 bne.b _L18_4s # no
3785 bra.b _L18_6s
3787 cmpi.b %d1,&QNAN # is operand a QNAN?
3788 bne.b _L18_5s # no
3790 bra.b _L18_6s
3798 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3799 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3806 link %a6,&-LOCAL_SIZE
3808 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3809 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3821 mov.b %d0,STAG(%a6)
3822 mov.b %d0,%d1
3827 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3829 mov.b %d1,STAG(%a6)
3830 tst.b %d1
3831 bne.b _L18_2d
3833 bra.b _L18_6d
3835 cmpi.b %d1,&ZERO # is operand a ZERO?
3836 bne.b _L18_3d # no
3838 bra.b _L18_6d
3840 cmpi.b %d1,&INF # is operand an INF?
3841 bne.b _L18_4d # no
3843 bra.b _L18_6d
3845 cmpi.b %d1,&QNAN # is operand a QNAN?
3846 bne.b _L18_5d # no
3848 bra.b _L18_6d
3856 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3857 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3864 link %a6,&-LOCAL_SIZE
3866 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3867 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3880 mov.b %d0,STAG(%a6)
3881 mov.b %d0,%d1
3886 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3888 tst.b %d1
3889 bne.b _L18_2x
3891 bra.b _L18_6x
3893 cmpi.b %d1,&ZERO # is operand a ZERO?
3894 bne.b _L18_3x # no
3896 bra.b _L18_6x
3898 cmpi.b %d1,&INF # is operand an INF?
3899 bne.b _L18_4x # no
3901 bra.b _L18_6x
3903 cmpi.b %d1,&QNAN # is operand a QNAN?
3904 bne.b _L18_5x # no
3906 bra.b _L18_6x
3914 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3915 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3926 link %a6,&-LOCAL_SIZE
3928 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3929 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3941 mov.b %d0,STAG(%a6)
3942 mov.b %d0,%d1
3947 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
3949 tst.b %d1
3950 bne.b _L19_2s
3952 bra.b _L19_6s
3954 cmpi.b %d1,&ZERO # is operand a ZERO?
3955 bne.b _L19_3s # no
3957 bra.b _L19_6s
3959 cmpi.b %d1,&INF # is operand an INF?
3960 bne.b _L19_4s # no
3962 bra.b _L19_6s
3964 cmpi.b %d1,&QNAN # is operand a QNAN?
3965 bne.b _L19_5s # no
3967 bra.b _L19_6s
3975 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
3976 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
3983 link %a6,&-LOCAL_SIZE
3985 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
3986 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
3998 mov.b %d0,STAG(%a6)
3999 mov.b %d0,%d1
4004 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4006 mov.b %d1,STAG(%a6)
4007 tst.b %d1
4008 bne.b _L19_2d
4010 bra.b _L19_6d
4012 cmpi.b %d1,&ZERO # is operand a ZERO?
4013 bne.b _L19_3d # no
4015 bra.b _L19_6d
4017 cmpi.b %d1,&INF # is operand an INF?
4018 bne.b _L19_4d # no
4020 bra.b _L19_6d
4022 cmpi.b %d1,&QNAN # is operand a QNAN?
4023 bne.b _L19_5d # no
4025 bra.b _L19_6d
4033 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4034 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4041 link %a6,&-LOCAL_SIZE
4043 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4044 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4057 mov.b %d0,STAG(%a6)
4058 mov.b %d0,%d1
4063 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4065 tst.b %d1
4066 bne.b _L19_2x
4068 bra.b _L19_6x
4070 cmpi.b %d1,&ZERO # is operand a ZERO?
4071 bne.b _L19_3x # no
4073 bra.b _L19_6x
4075 cmpi.b %d1,&INF # is operand an INF?
4076 bne.b _L19_4x # no
4078 bra.b _L19_6x
4080 cmpi.b %d1,&QNAN # is operand a QNAN?
4081 bne.b _L19_5x # no
4083 bra.b _L19_6x
4091 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4092 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4103 link %a6,&-LOCAL_SIZE
4105 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4106 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4118 mov.b %d0,STAG(%a6)
4119 mov.b %d0,%d1
4124 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4126 tst.b %d1
4127 bne.b _L20_2s
4129 bra.b _L20_6s
4131 cmpi.b %d1,&ZERO # is operand a ZERO?
4132 bne.b _L20_3s # no
4134 bra.b _L20_6s
4136 cmpi.b %d1,&INF # is operand an INF?
4137 bne.b _L20_4s # no
4139 bra.b _L20_6s
4141 cmpi.b %d1,&QNAN # is operand a QNAN?
4142 bne.b _L20_5s # no
4144 bra.b _L20_6s
4152 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4153 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4154 fmovm.x &0x03,-(%sp) # store off fp0/fp1
4162 link %a6,&-LOCAL_SIZE
4164 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4165 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4177 mov.b %d0,STAG(%a6)
4178 mov.b %d0,%d1
4183 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4185 mov.b %d1,STAG(%a6)
4186 tst.b %d1
4187 bne.b _L20_2d
4189 bra.b _L20_6d
4191 cmpi.b %d1,&ZERO # is operand a ZERO?
4192 bne.b _L20_3d # no
4194 bra.b _L20_6d
4196 cmpi.b %d1,&INF # is operand an INF?
4197 bne.b _L20_4d # no
4199 bra.b _L20_6d
4201 cmpi.b %d1,&QNAN # is operand a QNAN?
4202 bne.b _L20_5d # no
4204 bra.b _L20_6d
4212 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4213 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4214 fmovm.x &0x03,-(%sp) # store off fp0/fp1
4222 link %a6,&-LOCAL_SIZE
4224 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4225 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4238 mov.b %d0,STAG(%a6)
4239 mov.b %d0,%d1
4244 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4246 tst.b %d1
4247 bne.b _L20_2x
4249 bra.b _L20_6x
4251 cmpi.b %d1,&ZERO # is operand a ZERO?
4252 bne.b _L20_3x # no
4254 bra.b _L20_6x
4256 cmpi.b %d1,&INF # is operand an INF?
4257 bne.b _L20_4x # no
4259 bra.b _L20_6x
4261 cmpi.b %d1,&QNAN # is operand a QNAN?
4262 bne.b _L20_5x # no
4264 bra.b _L20_6x
4272 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4273 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4274 fmovm.x &0x03,-(%sp) # store off fp0/fp1
4286 link %a6,&-LOCAL_SIZE
4288 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4289 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4301 mov.b %d0,DTAG(%a6)
4307 mov.b %d0,STAG(%a6)
4313 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4318 tst.b %d1
4319 bne.b _L21_2s
4321 bra.b _L21_6s
4323 cmpi.b %d1,&ZERO # is operand a ZERO?
4324 bne.b _L21_3s # no
4326 bra.b _L21_6s
4328 cmpi.b %d1,&INF # is operand an INF?
4329 bne.b _L21_4s # no
4331 bra.b _L21_6s
4333 cmpi.b %d1,&QNAN # is operand a QNAN?
4334 bne.b _L21_5s # no
4336 bra.b _L21_6s
4344 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4345 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4352 link %a6,&-LOCAL_SIZE
4354 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4355 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4367 mov.b %d0,DTAG(%a6)
4373 mov.b %d0,STAG(%a6)
4379 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4384 tst.b %d1
4385 bne.b _L21_2d
4387 bra.b _L21_6d
4389 cmpi.b %d1,&ZERO # is operand a ZERO?
4390 bne.b _L21_3d # no
4392 bra.b _L21_6d
4394 cmpi.b %d1,&INF # is operand an INF?
4395 bne.b _L21_4d # no
4397 bra.b _L21_6d
4399 cmpi.b %d1,&QNAN # is operand a QNAN?
4400 bne.b _L21_5d # no
4402 bra.b _L21_6d
4410 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4411 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4418 link %a6,&-LOCAL_SIZE
4420 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4421 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4434 mov.b %d0,DTAG(%a6)
4441 mov.b %d0,STAG(%a6)
4447 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4452 tst.b %d1
4453 bne.b _L21_2x
4455 bra.b _L21_6x
4457 cmpi.b %d1,&ZERO # is operand a ZERO?
4458 bne.b _L21_3x # no
4460 bra.b _L21_6x
4462 cmpi.b %d1,&INF # is operand an INF?
4463 bne.b _L21_4x # no
4465 bra.b _L21_6x
4467 cmpi.b %d1,&QNAN # is operand a QNAN?
4468 bne.b _L21_5x # no
4470 bra.b _L21_6x
4478 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4479 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4490 link %a6,&-LOCAL_SIZE
4492 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4493 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4505 mov.b %d0,DTAG(%a6)
4511 mov.b %d0,STAG(%a6)
4517 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4522 tst.b %d1
4523 bne.b _L22_2s
4525 bra.b _L22_6s
4527 cmpi.b %d1,&ZERO # is operand a ZERO?
4528 bne.b _L22_3s # no
4530 bra.b _L22_6s
4532 cmpi.b %d1,&INF # is operand an INF?
4533 bne.b _L22_4s # no
4535 bra.b _L22_6s
4537 cmpi.b %d1,&QNAN # is operand a QNAN?
4538 bne.b _L22_5s # no
4540 bra.b _L22_6s
4548 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4549 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4556 link %a6,&-LOCAL_SIZE
4558 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4559 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4571 mov.b %d0,DTAG(%a6)
4577 mov.b %d0,STAG(%a6)
4583 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4588 tst.b %d1
4589 bne.b _L22_2d
4591 bra.b _L22_6d
4593 cmpi.b %d1,&ZERO # is operand a ZERO?
4594 bne.b _L22_3d # no
4596 bra.b _L22_6d
4598 cmpi.b %d1,&INF # is operand an INF?
4599 bne.b _L22_4d # no
4601 bra.b _L22_6d
4603 cmpi.b %d1,&QNAN # is operand a QNAN?
4604 bne.b _L22_5d # no
4606 bra.b _L22_6d
4614 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4615 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4622 link %a6,&-LOCAL_SIZE
4624 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4625 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4638 mov.b %d0,DTAG(%a6)
4645 mov.b %d0,STAG(%a6)
4651 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4656 tst.b %d1
4657 bne.b _L22_2x
4659 bra.b _L22_6x
4661 cmpi.b %d1,&ZERO # is operand a ZERO?
4662 bne.b _L22_3x # no
4664 bra.b _L22_6x
4666 cmpi.b %d1,&INF # is operand an INF?
4667 bne.b _L22_4x # no
4669 bra.b _L22_6x
4671 cmpi.b %d1,&QNAN # is operand a QNAN?
4672 bne.b _L22_5x # no
4674 bra.b _L22_6x
4682 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4683 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4694 link %a6,&-LOCAL_SIZE
4696 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4697 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4709 mov.b %d0,DTAG(%a6)
4715 mov.b %d0,STAG(%a6)
4721 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4726 tst.b %d1
4727 bne.b _L23_2s
4729 bra.b _L23_6s
4731 cmpi.b %d1,&ZERO # is operand a ZERO?
4732 bne.b _L23_3s # no
4734 bra.b _L23_6s
4736 cmpi.b %d1,&INF # is operand an INF?
4737 bne.b _L23_4s # no
4739 bra.b _L23_6s
4741 cmpi.b %d1,&QNAN # is operand a QNAN?
4742 bne.b _L23_5s # no
4744 bra.b _L23_6s
4752 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4753 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4760 link %a6,&-LOCAL_SIZE
4762 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4763 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4775 mov.b %d0,DTAG(%a6)
4781 mov.b %d0,STAG(%a6)
4787 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4792 tst.b %d1
4793 bne.b _L23_2d
4795 bra.b _L23_6d
4797 cmpi.b %d1,&ZERO # is operand a ZERO?
4798 bne.b _L23_3d # no
4800 bra.b _L23_6d
4802 cmpi.b %d1,&INF # is operand an INF?
4803 bne.b _L23_4d # no
4805 bra.b _L23_6d
4807 cmpi.b %d1,&QNAN # is operand a QNAN?
4808 bne.b _L23_5d # no
4810 bra.b _L23_6d
4818 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4819 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4826 link %a6,&-LOCAL_SIZE
4828 movm.l &0x0303,EXC_DREGS(%a6) # save d0-d1/a0-a1
4829 fmovm.l %fpcr,%fpsr,USER_FPCR(%a6) # save ctrl regs
4842 mov.b %d0,DTAG(%a6)
4849 mov.b %d0,STAG(%a6)
4855 mov.b FPCR_MODE(%a6),%d0 # pass rnd mode,prec
4860 tst.b %d1
4861 bne.b _L23_2x
4863 bra.b _L23_6x
4865 cmpi.b %d1,&ZERO # is operand a ZERO?
4866 bne.b _L23_3x # no
4868 bra.b _L23_6x
4870 cmpi.b %d1,&INF # is operand an INF?
4871 bne.b _L23_4x # no
4873 bra.b _L23_6x
4875 cmpi.b %d1,&QNAN # is operand a QNAN?
4876 bne.b _L23_5x # no
4878 bra.b _L23_6x
4886 movm.l EXC_DREGS(%a6),&0x0303 # restore d0-d1/a0-a1
4887 fmovm.l USER_FPCR(%a6),%fpcr,%fpsr # restore ctrl regs
4923 # 2. If |X| >= 15Pi or |X| < 2**(-40), go to 7. #
4931 # 5. (k is odd) Set j := (k-1)/2, sgn := (-1)**j. #
4937 # 6. (k is even) Set j := k/2, sgn := (-1)**j. Return sgn*sin(r) #
4944 # 8. (|X|<2**(-40)) If SIN is invoked, return X; #
4951 # 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6. #
4958 # 4. (k is odd) Set j1 := (k-1)/2, j2 := j1 (EOR) (k mod 2), ie. #
4959 # j1 exclusive or with the l.s.b. of k. #
4960 # sgn1 := (-1)**j1, sgn2 := (-1)**j2. #
4965 # 5. (k is even) Set j1 := k/2, sgn1 := (-1)**j1. #
4972 # 7. (|X|<2**(-40)) SIN(X) = X and COS(X) = 1. Exit. #
5017 bra.b SINBGN
5026 #--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL OR LARGE
5036 cmpi.l %d1,&0x3FD78000 # is |X| >= 2**(-40)?
5037 bge.b SOK1 # no
5042 blt.b SINMAIN # no
5045 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5046 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5051 lea PITBL+0x200(%pc),%a1 # TABLE OF N*PI/2, N = -32,...,32
5061 fsub.x (%a1)+,%fp0 # X-Y1
5062 fsub.s (%a1),%fp0 # fp0 = R = (X-Y1)-Y2
5065 #--continuation from REDUCEX
5067 #--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS NEEDED
5074 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
5075 #--THEN WE RETURN SGN*SIN(R). SGN*SIN(R) IS COMPUTED BY
5076 #--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... + SA7)))), WHERE
5077 #--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN AS
5078 #--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T(A4+TA6))])
5079 #--WHERE T=S*S.
5080 #--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUBLE PRECISION
5081 #--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FORMAT.
5083 fmovm.x &0x0c,-(%sp) # save fp2/fp3
5119 fmul.x %fp1,%fp0 # SIN(R')-R'
5124 fadd.x X(%a6),%fp0 # last inst - possible exception set
5127 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
5128 #--THEN WE RETURN SGN*COS(R). SGN*COS(R) IS COMPUTED BY
5129 #--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... + SB8)))), WHERE
5130 #--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN AS
5131 #--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B4+T(B6+TB8)))])
5132 #--WHERE T=S*S.
5133 #--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUBLE PRECISION
5134 #--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FORMAT, B1 IS -1/2
5135 #--AND IS THEREFORE STORED AS SINGLE PRECISION.
5137 fmovm.x &0x0c,-(%sp) # save fp2/fp3
5186 fadd.s POSNEG1(%a6),%fp0 # last inst - possible exception set
5192 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
5193 #--IF |X| < 2**(-40), RETURN X OR 1.
5201 bgt.b COSTINY
5209 mov.b &FMOV_OP,%d1 # last inst is MOVE
5210 fmov.x X(%a6),%fp0 # last inst - possible exception set
5216 fadd.s &0x80800000,%fp0 # last inst - possible exception set
5221 #--SIN(X) = X FOR DENORMALIZED X
5227 #--COS(X) = 1 FOR DENORMALIZED X
5236 #--SET ADJN TO 4
5246 cmp.l %d1,&0x3FD78000 # |X| >= 2**(-40)?
5247 bge.b SCOK1
5252 blt.b SCMAIN
5256 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5257 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5263 lea PITBL+0x200(%pc),%a1 # TABLE OF N*PI/2, N = -32,...,32
5271 fsub.x (%a1)+,%fp0 # X-Y1
5272 fsub.s (%a1),%fp0 # FP0 IS R = (X-Y1)-Y2
5275 #--continuation point from REDUCEX
5283 #--REGISTERS SAVED SO FAR: D0, A0, FP2.
5284 fmovm.x &0x04,-(%sp) # save fp2
5293 mov.l %d2,-(%sp)
5357 #--REGISTERS SAVED SO FAR: FP2.
5358 fmovm.x &0x04,-(%sp) # save fp2
5445 mov.b &FMOV_OP,%d1 # last inst is MOVE
5452 #--SIN AND COS OF X FOR DENORMALIZED X
5454 mov.l %d0,-(%sp) # save d0
5462 #--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
5463 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
5464 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
5466 fmovm.x &0x3c,-(%sp) # save {fp2-fp5}
5467 mov.l %d2,-(%sp) # save d2
5470 #--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
5471 #--there is a danger of unwanted overflow in first LOOP iteration. In this
5472 #--case, reduce argument by one remainder step to make subsequent reduction
5473 #--safe.
5475 bne.b SLOOP # no
5490 or.b &0x80,FP_SCR0_EX(%a6) # positive arg
5491 or.b &0x80,FP_SCR1_EX(%a6)
5499 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
5500 #--integer quotient will be stored in N
5501 #--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
5503 fmov.x %fp0,INARG(%a6) # +-2**K * F, 1 <= F < 2
5509 ble.b SLASTLOOP
5511 sub.l &27,%d1 # d0 = L := K-27
5512 mov.b &0,ENDFLAG(%a6)
5513 bra.b SWORK
5516 mov.b &1,ENDFLAG(%a6)
5519 #--FIND THE REMAINDER OF (R,r) W.R.T. 2**L * (PI/2). L IS SO CHOSEN
5520 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
5522 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
5523 #--2**L * (PIby2_1), 2**L * (PIby2_2)
5526 sub.l %d1,%d2 # BIASED EXP OF 2**(-L)*(2/PI)
5530 mov.w %d2,FP_SCR0_EX(%a6) # FP_SCR0 = 2**(-L)*(2/PI)
5533 fmul.x FP_SCR0(%a6),%fp2 # fp2 = X * 2**(-L)*(2/PI)
5535 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
5536 #--FLOATING POINT FORMAT, THE TWO FMOVE'S FMOVE.L FP <--> N
5537 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
5538 #--(SIGN(INARG)*2**63 + FP2) - SIGN(INARG)*2**63 WILL GIVE
5539 #--US THE DESIRED VALUE IN FLOATING POINT.
5549 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2
5562 mov.b ENDFLAG(%a6),%d1
5564 #--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
5565 #--P2 = 2**(L) * Piby2_2
5572 #--we want P+p = W+w but |p| <= half ulp of P
5573 #--Then, we need to compute A := R-P and a := r-p
5575 fsub.x %fp3,%fp4 # fp4 = W-P
5577 fsub.x %fp3,%fp0 # fp0 = A := R - P
5578 fadd.x %fp5,%fp4 # fp4 = p = (W-P)+w
5581 fsub.x %fp4,%fp1 # fp1 = a := r - p
5583 #--Now we need to normalize (A,a) to "new (R,r)" where R+r = A+a but
5584 #--|r| <= half ulp of R.
5586 #--No need to calculate r if this is the last loop
5587 cmp.b %d1,&0
5590 #--Need to calculate r
5591 fsub.x %fp0,%fp3 # fp3 = A-R
5592 fadd.x %fp3,%fp1 # fp1 = r := (A-R)+a
5598 fmovm.x (%sp)+,&0x3c # restore {fp2-fp5}
5625 # 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6. #
5638 # 4. (k is odd) Tan(X) = -cot(r). Since tan(r) is approximated by #
5642 # -Cot(r) = -V/U. Exit. #
5646 # 7. (|X|<2**(-40)) Tan(X) = X. Exit. #
5681 #--N*PI/2, -32 <= N <= 32, IN A LEADING TERM IN EXT. AND TRAILING
5682 #--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, THUS N*PI/2 IS AT
5683 #--MOST 69 BITS LONG.
5766 cmp.l %d1,&0x3FD78000 # |X| >= 2**(-40)?
5767 bge.b TANOK1
5771 blt.b TANMAIN
5775 #--THIS IS THE USUAL CASE, |X| <= 15 PI.
5776 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
5780 lea.l PITBL+0x200(%pc),%a1 # TABLE OF N*PI/2, N = -32,...,32
5787 fsub.x (%a1)+,%fp0 # X-Y1
5789 fsub.s (%a1),%fp0 # FP0 IS R = (X-Y1)-Y2
5795 fmovm.x &0x0c,-(%sp) # save fp2,fp3
5833 fdiv.x %fp1,%fp0 # last inst - possible exception set
5868 fmov.x %fp1,-(%sp)
5872 fdiv.x (%sp)+,%fp0 # last inst - possible exception set
5876 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
5877 #--IF |X| < 2**(-40), RETURN X OR 1.
5879 bgt.b REDUCEX
5882 fmov.x %fp0,-(%sp)
5884 mov.b &FMOV_OP,%d1 # last inst is MOVE
5885 fmov.x (%sp)+,%fp0 # last inst - posibble exception set
5889 #--TAN(X) = X FOR DENORMALIZED X
5893 #--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
5894 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
5895 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
5897 fmovm.x &0x3c,-(%sp) # save {fp2-fp5}
5898 mov.l %d2,-(%sp) # save d2
5901 #--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
5902 #--there is a danger of unwanted overflow in first LOOP iteration. In this
5903 #--case, reduce argument by one remainder step to make subsequent reduction
5904 #--safe.
5906 bne.b LOOP # no
5921 or.b &0x80,FP_SCR0_EX(%a6) # positive arg
5922 or.b &0x80,FP_SCR1_EX(%a6)
5930 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
5931 #--integer quotient will be stored in N
5932 #--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
5934 fmov.x %fp0,INARG(%a6) # +-2**K * F, 1 <= F < 2
5940 ble.b LASTLOOP
5942 sub.l &27,%d1 # d0 = L := K-27
5943 mov.b &0,ENDFLAG(%a6)
5944 bra.b WORK
5947 mov.b &1,ENDFLAG(%a6)
5950 #--FIND THE REMAINDER OF (R,r) W.R.T. 2**L * (PI/2). L IS SO CHOSEN
5951 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
5953 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
5954 #--2**L * (PIby2_1), 2**L * (PIby2_2)
5957 sub.l %d1,%d2 # BIASED EXP OF 2**(-L)*(2/PI)
5961 mov.w %d2,FP_SCR0_EX(%a6) # FP_SCR0 = 2**(-L)*(2/PI)
5964 fmul.x FP_SCR0(%a6),%fp2 # fp2 = X * 2**(-L)*(2/PI)
5966 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
5967 #--FLOATING POINT FORMAT, THE TWO FMOVE'S FMOVE.L FP <--> N
5968 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
5969 #--(SIGN(INARG)*2**63 + FP2) - SIGN(INARG)*2**63 WILL GIVE
5970 #--US THE DESIRED VALUE IN FLOATING POINT.
5980 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2
5993 mov.b ENDFLAG(%a6),%d1
5995 #--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
5996 #--P2 = 2**(L) * Piby2_2
6003 #--we want P+p = W+w but |p| <= half ulp of P
6004 #--Then, we need to compute A := R-P and a := r-p
6006 fsub.x %fp3,%fp4 # fp4 = W-P
6008 fsub.x %fp3,%fp0 # fp0 = A := R - P
6009 fadd.x %fp5,%fp4 # fp4 = p = (W-P)+w
6012 fsub.x %fp4,%fp1 # fp1 = a := r - p
6014 #--Now we need to normalize (A,a) to "new (R,r)" where R+r = A+a but
6015 #--|r| <= half ulp of R.
6017 #--No need to calculate r if this is the last loop
6018 cmp.b %d1,&0
6021 #--Need to calculate r
6022 fsub.x %fp0,%fp3 # fp3 = A-R
6023 fadd.x %fp3,%fp1 # fp1 = r := (A-R)+a
6029 fmovm.x (%sp)+,&0x3c # restore {fp2-fp5}
6057 # Note that k = -4, -3,..., or 3. #
6059 # significant bits of X with a bit-1 attached at the 6-th #
6060 # bit position. Define u to be u = (X-F) / (1 + X*F). #
6071 # Step 7. Define X' = -1/X. Approximate arctan(X') by an odd #
6240 #--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
6250 bge.b ATANOK1
6255 ble.b ATANMAIN
6258 #--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
6259 #--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
6260 #--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
6261 #--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
6262 #--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
6263 #--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
6264 #--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
6265 #--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
6266 #--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
6267 #--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
6268 #--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
6269 #--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
6270 #--WILL INVOLVE A VERY LONG POLYNOMIAL.
6272 #--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
6273 #--WE CHOSE F TO BE +-2^K * 1.BBBB1
6274 #--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
6275 #--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, ..., 3, THERE
6276 #--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS
6277 #-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
6282 or.l &0x04000000,XFRAC(%a6) # SET 6-TH BIT TO 1
6287 fsub.x X(%a6),%fp0 # FP0 IS X-F
6289 fdiv.x %fp1,%fp0 # FP0 IS U = (X-F)/(1+X*F)
6291 #--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
6292 #--CREATE ATAN(F) AND STORE IT IN ATANF, AND
6293 #--SAVE REGISTERS FP2.
6295 mov.l %d2,-(%sp) # SAVE d2 TEMPORARILY
6313 #--THAT'S ALL I HAVE TO DO FOR NOW,
6314 #--BUT ALAS, THE DIVIDE IS STILL CRANKING!
6316 #--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
6317 #--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
6318 #--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
6319 #--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
6320 #--WHAT WE HAVE HERE IS MERELY A1 = A3, A2 = A1/A3, A3 = A2/A3.
6321 #--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
6322 #--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
6324 fmovm.x &0x04,-(%sp) # save fp2
6344 #--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
6345 #--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
6350 #--|X| <= 1/16
6351 #--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
6352 #--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
6353 #--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
6354 #--WHERE Y = X*X, AND Z = Y*Y.
6359 #--COMPUTE POLYNOMIAL
6360 fmovm.x &0x0c,-(%sp) # save fp2/fp3
6396 #--|X| < 2^(-40), ATAN(X) = X
6399 mov.b &FMOV_OP,%d1 # last inst is MOVE
6400 fmov.x X(%a6),%fp0 # last inst - possible exception set
6405 #--IF |X| > 2^(100), RETURN SIGN(X)*(PI/2 - TINY). OTHERWISE,
6406 #--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
6410 #--APPROXIMATE ATAN(-1/X) BY
6411 #--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X'
6412 #--THIS CAN BE RE-WRITTEN AS
6413 #--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y.
6415 fmovm.x &0x0c,-(%sp) # save fp2/fp3
6417 fmov.s &0xBF800000,%fp1 # LOAD -1
6418 fdiv.x %fp0,%fp1 # FP1 IS -1/X
6420 #--DIVIDE IS STILL CRANKING
6453 tst.b (%a0)
6454 bpl.b pos_big
6465 #--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
6466 tst.b (%a0)
6467 bpl.b pos_huge
6482 #--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
6509 # z := sqrt( [1-X][1+X] ) #
6530 bge.b ASINBIG
6540 #--THIS IS THE USUAL CASE, |X| < 1
6541 #--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
6545 fsub.x %fp0,%fp1 # 1-X
6546 fmovm.x &0x4,-(%sp) # {fp2}
6549 fmul.x %fp2,%fp1 # (1+X)(1-X)
6551 fsqrt.x %fp1 # SQRT([1-X][1+X])
6552 fdiv.x %fp1,%fp0 # X/SQRT([1-X][1+X])
6553 fmovm.x &0x01,-(%sp) # save X/SQRT(...)
6564 #--|X| = 1, ASIN(X) = +- PI/2.
6569 or.l &0x3F800000,%d1 # +-1 IN SGL FORMAT
6570 mov.l %d1,-(%sp) # push SIGN(X) IN SGL-FMT
6575 #--|X| < 2^(-40), ATAN(X) = X
6578 mov.b &FMOV_OP,%d1 # last inst is MOVE
6579 fmov.x (%a0),%fp0 # last inst - possible exception
6583 #--ASIN(X) = X FOR DENORMALIZED X
6610 # z := (1-X) / (1+X) #
6631 bge.b ACOSBIG
6633 #--THIS IS THE USUAL CASE, |X| < 1
6634 #--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) )
6639 fneg.x %fp0 # -X
6640 fadd.s &0x3F800000,%fp0 # 1-X
6641 fdiv.x %fp1,%fp0 # (1-X)/(1+X)
6642 fsqrt.x %fp0 # SQRT((1-X)/(1+X))
6643 mov.l %d0,-(%sp) # save original users fpcr
6645 fmovm.x &0x01,-(%sp) # save SQRT(...) to stack
6647 bsr satan # ATAN(SQRT([1-X]/[1+X]))
6659 #--|X| = 1, ACOS(X) = 0 OR PI
6660 tst.b (%a0) # is X positive or negative?
6661 bpl.b ACOSP1
6663 #--X = -1
6675 #--ACOS(X) = PI/2 FOR DENORMALIZED X
6692 # fp0 = exp(X) or exp(X)-1 #
6703 # ------ #
6706 # Step 2. Return ans := ans + sign(X)*2^(-126). Exit. #
6707 # Notes: This will always generate one exception -- inexact. #
6711 # ----- #
6714 # 1.1 If |X| >= 2^(-65), go to Step 1.3. #
6718 # Notes: The usual case should take the branches 1.1 -> 1.3 -> 2.#
6719 # To avoid the use of floating-point comparisons, a #
6721 # 32-bit integer, the upper (more significant) 16 bits #
6733 # Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ). #
6734 # 2.1 Set AdjFlag := 0 (indicates the branch 1.3 -> 2 #
6736 # 2.2 N := round-to-nearest-integer( X * 64/log2 ). #
6739 # 2.4 Calculate M = (N - J)/64; so N = 64M + J. #
6745 # N := round-to-nearest-integer(Z) #
6747 # constant := single-precision( 64/log 2 ). #
6749 # Using a single-precision constant avoids memory #
6750 # access. Another effect of using a single-precision #
6753 # Z = X*(64/log2)*(1+eps), |eps| <= 2^(-24). #
6757 # Step 3. Calculate X - N*log2/64. #
6759 # where L1 := single-precision(-log2/64). #
6761 # L2 := extended-precision(-log2/64 - L1).#
6763 # approximate the value -log2/64 to 88 bits of accuracy. #
6764 # b) N*L1 is exact because N is no longer than 22 bits #
6772 # N = rnd-to-int( X*64/log2 (1+eps) ), |eps|<=2^(-24) #
6774 # X*64/log2 - N = f - eps*X 64/log2 #
6775 # X - N*log2/64 = f*log2/64 - eps*X #
6780 # |X - N*log2/64| <= (0.5 + 16446/2^(18))*log2/64 #
6784 # Step 4. Approximate exp(R)-1 by a polynomial #
6790 # b) Even with the restrictions above, #
6791 # |p - (exp(R)-1)| < 2^(-68.8) for all |R| <= 0.0062. #
6806 # zero. The reason for such a special form is that T-1, #
6807 # T-2, and T-8 will all be exact --- a property that will #
6835 # Notes: For non-zero X, the inexact exception will always be #
6846 # (mimic 2.2 - 2.6) #
6847 # 8.2 N := round-to-integer( X * 64/log2 ) #
6849 # 8.4 K := (N-J)/64, M1 := truncate(K/2), M = K-M1, #
6855 # Notes: Refer to notes for 2.2 - 2.6. #
6865 # extended-precision numbers whose square over/underflow #
6870 # -------- #
6879 # ------- #
6886 # Notes: The usual case should take the branches 1.1 -> 1.3 -> 2.#
6888 # because EXPM1 is intended to evaluate exp(X)-1 #
6892 # Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ). #
6893 # 2.1 N := round-to-nearest-integer( X * 64/log2 ). #
6896 # 2.3 Calculate M = (N - J)/64; so N = 64M + J. #
6900 # OnebySc := -2^(-M). #
6903 # Step 3. Calculate X - N*log2/64. #
6905 # where L1 := single-precision(-log2/64). #
6907 # L2 := extended-precision(-log2/64 - L1).#
6912 # Step 4. Approximate exp(R)-1 by a polynomial #
6918 # b) Even with the restriction above, #
6919 # |p - (exp(R)-1)| < |R| * 2^(-72.7) #
6934 # zero. The reason for such a special form is that T-1, #
6935 # T-2, and T-8 will all be exact --- a property that will #
6937 # in p is no bigger than 2^(-67.7) compared to the final #
6940 # Step 6. Reconstruction of exp(X)-1 #
6941 # exp(X)-1 = 2^M * ( 2^(J/64) + p - 2^(-M) ). #
6944 # 6.3 If M >= -3, go to 6.5. #
6952 # Step 7. exp(X)-1 for |X| < 1/4. #
6953 # 7.1 If |X| >= 2^(-65), go to Step 9. #
6956 # Step 8. Calculate exp(X)-1, |X| < 2^(-65). #
6957 # 8.1 If |X| < 2^(-16312), goto 8.3 #
6958 # 8.2 Restore FPCR; return ans := X - 2^(-16382). #
6961 # 8.4 Restore FPCR; ans := ans - 2^(-16382). #
6963 # Notes: The idea is to return "X - tiny" under the user #
6966 # the best we can. For |X| >= 2^(-16312), the #
6970 # Step 9. Calculate exp(X)-1, |X| < 1/4, by a polynomial #
6976 # b) Even with the restriction above, #
6977 # |p - (exp(X)-1)| < |X| 2^(-70.6) #
6989 # Step 10. Calculate exp(X)-1 for |X| >= 70 log 2. #
6990 # 10.1 If X >= 70log2 , exp(X) - 1 = exp(X) for all #
6992 # 10.2 If X <= -70log2, exp(X) - 1 = -1 for all practical #
6994 # ans := -1 #
6996 # Return ans := ans + 2^(-126). Exit. #
6997 # Notes: 10.2 will always create an inexact and return -1 + tiny #
7102 #--entry point for EXP(X), here X is finite, non-zero, and not NaN's
7104 #--Step 1.
7107 cmp.l %d1,&0x3FBE0000 # 2^(-65)
7108 bge.b EXPC1 # normal case
7112 #--The case |X| >= 2^(-65)
7115 blt.b EXPMAIN # normal case
7119 #--Step 2.
7120 #--This is the normal branch: 2^(-65) <= |X| < 16380 log2.
7125 fmovm.x &0xc,-(%sp) # save fp2 {%fp2/%fp3}
7129 fmov.l %d1,%fp0 # convert to floating-format
7141 #--Step 3.
7142 #--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
7143 #--a0 points to 2^(J/64), D0 is biased expo. of 2^(M)
7145 fmul.s &0xBC317218,%fp0 # N * L1, L1 = lead(-log2/64)
7146 fmul.x L2(%pc),%fp2 # N * L2, L1+L2 = -log2/64
7150 #--Step 4.
7151 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
7152 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A5))))
7153 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
7154 #--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))]
7182 fadd.x %fp2,%fp0 # fp0 is EXP(R) - 1
7184 #--Step 5
7185 #--final reconstruction process
7186 #--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(R)-1) )
7188 fmul.x %fp1,%fp0 # 2^(J/64)*(Exp(R)-1)
7195 #--Step 6
7197 beq.b NORMAL
7202 mov.b &FMUL_OP,%d1 # last inst is MUL
7207 #--Step 7
7214 #--Step 8
7216 bgt.b EXP2BIG
7217 #--Steps 8.2 -- 8.6
7222 fmovm.x &0xc,-(%sp) # save fp2 {%fp2/%fp3}
7226 fmov.l %d1,%fp0 # convert to floating-format
7245 #--Step 9
7246 tst.b (%a0) # is X positive or negative?
7252 #--entry point for EXP(X), X is denormalized
7253 mov.l (%a0),-(%sp)
7255 ori.l &0x00800000,(%sp) # sign(X)*2^(-126)
7265 #--entry point for EXPM1(X), here X is finite, non-zero, non-NaN
7267 #--Step 1.
7268 #--Step 1.1
7272 bge.b EM1CON1 # |X| >= 1/4
7276 #--Step 1.3
7277 #--The case |X| >= 1/4
7280 ble.b EM1MAIN # 1/4 <= |X| <= 70log2
7284 #--Step 2.
7285 #--This is the case: 1/4 <= |X| <= 70 log2.
7290 fmovm.x &0xc,-(%sp) # save fp2 {%fp2/%fp3}
7293 fmov.l %d1,%fp0 # convert to floating-format
7303 #--Step 3.
7304 #--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
7305 #--a0 points to 2^(J/64), D0 and a1 both contain M
7307 fmul.s &0xBC317218,%fp0 # N * L1, L1 = lead(-log2/64)
7308 fmul.x L2(%pc),%fp2 # N * L2, L1+L2 = -log2/64
7313 #--Step 4.
7314 #--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
7315 #-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*(A5 + R*A6)))))
7316 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
7317 #--[R*S*(A2+S*(A4+S*A6))] + [R+S*(A1+S*(A3+S*A5))]
7336 neg.w %d1 # D0 is -M
7338 add.w &0x3FFF,%d1 # biased expo. of 2^(-M)
7343 or.w &0x8000,%d1 # signed/expo. of -2^(-M)
7344 mov.w %d1,ONEBYSC(%a6) # OnebySc is -2^(-M)
7352 fadd.x %fp2,%fp0 # fp0 IS EXP(R)-1
7356 #--Step 5
7357 #--Compute 2^(J/64)*p
7359 fmul.x (%a1),%fp0 # 2^(J/64)*(Exp(R)-1)
7361 #--Step 6
7362 #--Step 6.1
7365 ble.b MLE63
7366 #--Step 6.2 M >= 64
7373 #--Step 6.3 M <= 63
7374 cmp.l %d1,&-3
7375 bge.b MGEN3
7377 #--Step 6.4 M <= -4
7383 #--Step 6.5 -3 <= M <= 63
7390 #--Step 6.6
7396 #--Step 7 |X| < 1/4.
7397 cmp.l %d1,&0x3FBE0000 # 2^(-65)
7398 bge.b EM1POLY
7401 #--Step 8 |X| < 2^(-65)
7402 cmp.l %d1,&0x00330000 # 2^(-16312)
7403 blt.b EM12TINY
7404 #--Step 8.2
7405 mov.l &0x80010000,SC(%a6) # SC is -2^(-16382)
7410 mov.b &FADD_OP,%d1 # last inst is ADD
7415 #--Step 8.3
7423 mov.b &FMUL_OP,%d1 # last inst is MUL
7428 #--Step 9 exp(X)-1 by a simple polynomial
7431 fmovm.x &0xc,-(%sp) # save fp2 {%fp2/%fp3}
7479 #--Step 10 |X| > 70 log2
7483 #--Step 10.2
7484 fmov.s &0xBF800000,%fp0 # fp0 is -1
7486 fadd.s &0x00800000,%fp0 # -1 + 2^(-126)
7491 #--entry point for EXPM1(X), here X is denormalized
7492 #--Step 0.
7504 # the result is [1.0 - 2.0). #
7521 blt.b sgetexpn # it's negative
7525 mov.b &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7531 neg.w %d0 # new exp = -(shft amt)
7534 mov.b &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7541 bclr &0xe,%d0 # make it the new exp +-3fff
7548 bmi.b sgetmann # it's negative
7552 mov.b &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
7556 # For denormalized numbers, shift the mantissa until the j-bit = 1,
7562 bra.b sgetman
7599 # Y' := Y - 16381 log2 #
7621 bgt.b COSHBIG
7623 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2
7624 #--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
7628 mov.l %d0,-(%sp)
7630 fmovm.x &0x01,-(%sp) # save |X| to stack
7641 mov.b &FADD_OP,%d1 # last inst is ADD
7647 bgt.b COSHHUGE
7650 fsub.d T1(%pc),%fp0 # (|X|-16381LOG2_LEAD)
7651 fsub.d T2(%pc),%fp0 # |X| - 16381 LOG2, ACCURATE
7653 mov.l %d0,-(%sp)
7655 fmovm.x &0x01,-(%sp) # save fp0 to stack
7662 mov.b &FMUL_OP,%d1 # last inst is MUL
7670 #--COSH(X) = 1 FOR DENORMALIZED X
7714 # Y' := Y - 16381 log2 #
7734 bgt.b SINHBIG
7736 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2
7737 #--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) )
7741 movm.l &0x8040,-(%sp) # {a1/d0}
7742 fmovm.x &0x01,-(%sp) # save Y on stack
7752 fmov.x %fp0,-(%sp)
7758 mov.l %d1,-(%sp)
7761 mov.b &FMUL_OP,%d1 # last inst is MUL
7762 fmul.s (%sp)+,%fp0 # last fp inst - possible exceptions set
7769 fsub.d T1(%pc),%fp0 # (|X|-16381LOG2_LEAD)
7770 mov.l &0,-(%sp)
7771 mov.l &0x80000000,-(%sp)
7775 mov.l %d1,-(%sp) # EXTENDED FMT
7776 fsub.d T2(%pc),%fp0 # |X| - 16381 LOG2, ACCURATE
7778 mov.l %d0,-(%sp)
7780 fmovm.x &0x01,-(%sp) # save fp0 on stack
7787 mov.b &FMUL_OP,%d1 # last inst is MUL
7792 #--SINH(X) = X FOR DENORMALIZED X
7816 # 1. If |X| >= (5/2) log2 or |X| <= 2**(-40), go to 3. #
7818 # 2. (2**(-40) < |X| < (5/2) log2) Calculate tanh(X) by #
7823 # 3. (|X| <= 2**(-40) or |X| >= (5/2) log2). If |X| < 1, #
7830 # tanh(X) = sgn - [ sgn*2/(1+z) ]. #
7833 # 6. (|X| >= 50 log2) Tanh(X) = +-1 (round to nearest). Thus, we #
7835 # sgn := sign(X), Tiny := 2**(-126), #
7836 # tanh(X) := sgn - sgn*Tiny. #
7839 # 7. (|X| < 2**(-40)). Tanh(X) = X. Exit. #
7859 cmp.l %d1, &0x3fd78000 # is |X| < 2^(-40)?
7864 #--THIS IS THE USUAL CASE
7865 #--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) * Z / (Z+2).
7875 mov.l %d0,-(%sp)
7877 fmovm.x &0x1,-(%sp) # save Y on stack
7900 #-- (5/2) LOG2 < |X| < 50 LOG2,
7901 #--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X|, SGN = SIGN(X),
7902 #--TANH(X) = SGN - SGN*2/[EXP(Y)+1].
7913 mov.l %d0,-(%sp)
7915 fmovm.x &0x01,-(%sp) # save Y on stack
7923 eor.l &0xC0000000,%d1 # -SIGN(X)*2
7924 fmov.s %d1,%fp1 # -SIGN(X)*2 IN SGL FMT
7925 fdiv.x %fp0,%fp1 # -SIGN(X)2 / [EXP(Y)+1 ]
7932 mov.b &FADD_OP,%d1 # last inst is ADD
7938 mov.b &FMOV_OP,%d1 # last inst is MOVE
7939 fmov.x X(%a6),%fp0 # last inst - possible exception set
7942 #---RETURN SGN(X) - SGN(X)EPS
7949 eor.l &0x80800000,%d1 # -SIGN(X)*EPS
7956 #--TANH(X) = X FOR DENORMALIZED X
7981 # Step 1. If |X-1| < 1/16, approximate log(X) by an odd #
7982 # polynomial in u, where u = 2(X-1)/(X+1). Otherwise, #
7986 # seven significant bits of Y plus 2**(-7), i.e. #
7988 # of Y. Note that |Y-F| <= 2**(-7). #
7990 # Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a #
8006 # approximates log(1+u), u = (Y-F)/F. #
8011 # 1/F are also tabulated so that the division in (Y-F)/F #
8015 # the value Y-F has to be calculated carefully when #
8212 #--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
8218 #--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
8219 #--A FINITE, NON-ZERO, NORMALIZED NUMBER.
8232 blt.b LOGMAIN # YES
8237 #--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
8239 #--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
8240 #--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
8241 #--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
8242 #-- = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
8243 #--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
8244 #--LOG(1+U) CAN BE VERY EFFICIENT.
8245 #--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
8246 #--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
8248 #--GET K, Y, F, AND ADDRESS OF 1/F.
8254 fmov.l %d1,%fp1 # CONVERT K TO FLOATING-POINT FORMAT
8256 #--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
8257 mov.l &0x3FFF0000,X(%a6) # X IS NOW Y, I.E. 2^(-K)*X
8271 fsub.x F(%a6),%fp0 # Y-F
8272 fmovm.x &0xc,-(%sp) # SAVE FP2-3 WHILE FP0 IS NOT READY
8273 #--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
8274 #--REGISTERS SAVED: FPCR, FP1, FP2
8277 #--AN RE-ENTRY POINT FOR LOGNP1
8278 fmul.x (%a0),%fp0 # FP0 IS U = (Y-F)/F
8284 #--LOG(1+U) IS APPROXIMATED BY
8285 #--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
8286 #--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A4+V*A6))]
8311 fmovm.x (%sp)+,&0x30 # RESTORE FP2-3
8324 fcmp.b %fp0,&0x1 # is it equal to one?
8327 #--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
8329 fsub.s one(%pc),%fp1 # FP1 IS X-1
8331 fadd.x %fp1,%fp1 # FP1 IS 2(X-1)
8332 #--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
8333 #--IN U, U = 2(X-1)/(X+1) = FP1/FP0
8336 #--THIS IS AN RE-ENTRY POINT FOR LOGNP1
8338 fmovm.x &0xc,-(%sp) # SAVE FP2-3
8339 #--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
8340 #--LET V=U*U, W=V*V, CALCULATE
8341 #--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
8342 #--U + U*V*( [B1 + W*(B3 + W*B5)] + [V*(B2 + W*B4)] )
8366 fmovm.x (%sp)+,&0x30 # FP2-3 RESTORED
8374 #--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
8380 #--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
8382 mov.l &-100,ADJK(%a6) # INPUT = 2^(ADJK) * FP0
8384 #----normalize the input value by left shifting k bits (k to be determined
8385 #----below), adjusting exponent and storing -k to ADJK
8386 #----the value TWOTO100 is no longer needed.
8387 #----Note that this code assumes the denormalized input is NON-ZERO.
8389 movm.l &0x3f00,-(%sp) # save some registers {d2-d7}
8396 bne.b Hi_not0
8413 movm.l (%sp)+,&0xfc # restore registers {d2-d7}
8435 movm.l (%sp)+,&0xfc # restore registers {d2-d7}
8440 #--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
8447 mov.b &FMOV_OP,%d1 # last inst is MOVE
8460 ble.w LP1NEG0 # LOG OF ZERO OR -VE
8465 #--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
8466 #--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
8467 #--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
8470 #--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
8477 #--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
8478 #--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
8481 #--U = FP1/FP0
8485 #--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
8486 #--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
8487 #--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
8488 #--THERE ARE ONLY TWO CASES.
8489 #--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
8490 #--CASE 2: 1+Z > 1, THEN K = 0 AND Y-F = (1-F) + Z
8491 #--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
8492 #--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
8498 bge.b KISZERO
8504 fsub.x F(%a6),%fp0 # 2-F
8511 fmovm.x &0xc,-(%sp) # SAVE FP2 {%fp2/%fp3}
8512 fadd.x %fp1,%fp0 # FP0 IS Y-F = (2-F)+2Z
8515 fmov.s negone(%pc),%fp1 # FP1 IS K = -1
8522 fsub.x F(%a6),%fp0 # 1-F
8528 fadd.x %fp1,%fp0 # FP0 IS Y-F
8529 fmovm.x &0xc,-(%sp) # FP2 SAVED {%fp2/%fp3}
8536 #--FPCR SAVED. D0 IS X IN COMPACT FORM.
8538 blt.b LP1NEG
8552 #--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
8582 # z := 2y/(1-y) #
8589 # divide-by-zero by #
8605 bge.b ATANHBIG
8607 #--THIS IS THE USUAL CASE, |X| < 1
8608 #--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
8612 fneg.x %fp1 # -Y
8614 fadd.s &0x3F800000,%fp1 # 1-Y
8615 fdiv.x %fp1,%fp0 # 2Y/(1-Y)
8619 mov.l %d1,-(%sp)
8621 mov.l %d0,-(%sp) # save rnd prec,mode
8623 fmovm.x &0x01,-(%sp) # save Z on stack
8630 mov.b &FMUL_OP,%d1 # last inst is MUL
8641 #--ATANH(X) = X FOR DENORMALIZED X
8646 # slog10(): computes the base-10 logarithm of a normalized input #
8647 # slog10d(): computes the base-10 logarithm of a denormalized input #
8648 # slog2(): computes the base-2 logarithm of a normalized input #
8649 # slog2d(): computes the base-2 logarithm of a denormalized input #
8670 # Notes: Default means round-to-nearest mode, no floating-point #
8684 # Notes: Default means round-to-nearest mode, no floating-point #
8697 # Notes: Default means round-to-nearest mode, no floating-point #
8711 # Notes: Default means round-to-nearest mode, no floating-point #
8720 # 2.3 Return ans := convert-to-double-extended(k). #
8737 #--entry point for Log10(X), X is normalized
8739 fmov.b &0x1,%fp0
8745 mov.l %d0,-(%sp)
8753 #--entry point for Log10(X), X is denormalized
8757 mov.l %d0,-(%sp)
8765 #--entry point for Log2(X), X is normalized
8771 bne.b continue # X is not 2^k
8775 bne.b continue
8777 #--X = 2^k.
8787 mov.l %d0,-(%sp)
8798 #--entry point for Log2(X), X is denormalized
8802 mov.l %d0,-(%sp)
8833 # 2. If |X| < 2**(-70), go to ExpSm. #
8846 # 2. If |X| < 2**(-70), go to ExpSm. #
8849 # N := round-to-int(y). Decompose N as #
8853 # r := ((X - N*L1)-N*L2) * L10 #
8984 #--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
8993 cmp.l %d1,&0x3FB98000 # |X| >= 2**(-70)?
8994 bge.b TWOOK1
8999 ble.b TWOMAIN
9003 #--USUAL CASE, 2^(-70) <= |X| <= 16480
9007 fmov.l %fp1,INT(%a6) # N = ROUND-TO-INT(64 X)
9008 mov.l %d2,-(%sp)
9010 fmov.l INT(%a6),%fp1 # N --> FLOATING FMT
9022 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
9023 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
9024 #--ADJFACT = 2^(M').
9025 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
9027 fmovm.x &0x0c,-(%sp) # save fp2/fp3
9035 fsub.x %fp1,%fp0 # X - (1/64)*INT(64 X)
9047 #--FPCR, D0 SAVED
9049 bgt.b TEXPBIG
9051 #--|X| IS SMALL, RETURN 1 + X
9058 #--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
9059 #--REGISTERS SAVE SO FAR ARE FPCR AND D0
9062 blt.b EXPNEG
9071 #--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
9081 #--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
9090 cmp.l %d1,&0x3FB98000 # |X| >= 2**(-70)?
9091 bge.b TENOK1
9096 ble.b TENMAIN
9100 #--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
9105 mov.l %d2,-(%sp)
9107 fmov.l INT(%a6),%fp1 # N --> FLOATING FMT
9119 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
9120 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
9121 #--ADJFACT = 2^(M').
9122 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
9123 fmovm.x &0x0c,-(%sp) # save fp2/fp3
9134 fsub.x %fp1,%fp0 # X - N L_LEAD
9137 fsub.x %fp2,%fp0 # X - N L_TRAIL
9148 #--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
9149 #--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
9150 #--FP0 IS R. THE FOLLOWING CODE COMPUTES
9151 #-- 2**(M'+M) * 2**(J/64) * EXP(R)
9173 fadd.x %fp2,%fp0 # FP0 IS EXP(R) - 1
9177 #--FINAL RECONSTRUCTION PROCESS
9178 #--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0)
9189 mov.b &FMUL_OP,%d1 # last inst is MUL
9195 #--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
9210 # a0 = pointer to double-extended source operand X #
9211 # a1 = pointer to double-extended destination operand Y #
9222 mov.l %d0,-(%sp) # store off ctrl bits for now
9225 smi.b SIGN(%a6) # use SIGN to hold dst sign
9245 tst.b DST_HI(%a1) # is dst denormalized?
9246 bmi.b sok_norm
9251 mov.l %d0,-(%sp) # save src for now
9264 cmpi.w %d0,&-0x3fff # is the shft amt really low?
9265 bge.b sok_norm2 # thank goodness no
9275 subi.l &-0x3fff,%d0 # how many should we shift?
9277 cmpi.b %d0,&0x20 # is it > 32?
9278 bge.b sok_dnrm_32 # yes
9280 clr.l -(%sp) # insert zero low mantissa
9281 mov.l %d1,-(%sp) # insert new high mantissa
9282 clr.l -(%sp) # make zero exponent
9283 bra.b sok_norm_cont
9285 subi.b &0x20,%d0 # get shift count
9287 mov.l %d1,-(%sp) # insert new low mantissa
9288 clr.l -(%sp) # insert zero high mantissa
9289 clr.l -(%sp) # make zero exponent
9290 bra.b sok_norm_cont
9301 clr.l -(%sp) # insert new exponent
9302 mov.l &0x80000000,-(%sp) # insert new high mantissa
9303 mov.l %d0,-(%sp) # insert new lo mantissa
9307 mov.b &FMUL_OP,%d1 # last inst is MUL
9316 mov.l (%sp)+,%d0 # restore ctrl bits
9318 tst.b SRC_EX(%a1) # is src negative?
9327 tst.b DST_HI(%a1) # is dst denormalized?
9328 bpl.b ssmall_done # yes
9332 mov.b &FMOV_OP,%d1 # last inst is MOVE
9362 # Step 2. Set L := expo(X)-expo(Y), k := 0, Q := 0. #
9366 # R := 2^(-L)X, j := L. #
9371 # 3.2 If R > Y, then { R := R - Y, Q := Q + 1} #
9373 # 3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to #
9376 # Step 4. At this point, R = X - QY = MOD(X,Y). Set #
9386 # then { Q := Q + 1, signX := -signX }. #
9390 # Step 7. If Last_Subtract = true, R := R - Y. #
9394 # Step 9. At this point, R = 2^(-j)*X - Q Y = Y. Thus, #
9420 clr.b FPSR_QBYTE(%a6)
9421 mov.l %d0,-(%sp) # save ctrl bits
9422 clr.b Mod_Flag(%a6)
9423 bra.b Mod_Rem
9427 clr.b FPSR_QBYTE(%a6)
9428 mov.l %d0,-(%sp) # save ctrl bits
9429 mov.b &0x1,Mod_Flag(%a6)
9433 movm.l &0x3f00,-(%sp) # save data registers
9443 bne.b Y_Normal
9447 bne.b HiY_not0
9458 bra.b Chk_X
9472 bra.b Chk_X
9489 bne.b X_Normal
9492 bne.b HiX_not0
9503 bra.b Init
9517 bra.b Init
9526 mov.l %d0,-(%sp) # save biased exp(X)
9527 sub.l %d3,%d0 # L := expo(X)-expo(Y)
9529 clr.l %d6 # D6 := carry <- 0
9535 bge.b Mod_Loop_pre
9544 #..At this point R = 2^(-L)X; Q = 0; k = 0; and k+j = L
9547 bgt.b R_GT_Y
9551 bne.b R_NE_Y
9553 bne.b R_NE_Y
9560 bcs.b R_LT_Y # borrow is set iff R < Y
9564 #..and Y < (D1,D2) < 2Y. Either way, perform R - Y
9565 sub.l %d5,%d2 # lo(R) - lo(Y)
9566 subx.l %d4,%d1 # hi(R) - hi(Y)
9571 #..At this point, Carry=0, R < Y. R = 2^(k-L)X - QY; k+j = L; j >= 0.
9573 beq.b PostLoop
9580 subq.l &1,%d0 # j := j - 1
9581 #..At this point, R=(Carry,D1,D2) = 2^(k-L)X - QY, j+k=L, j >= 0, R < 2Y.
9583 bra.b Mod_Loop
9586 #..k = L, j = 0, Carry = 0, R = (D1,D2) = X - QY, R < Y.
9591 bne.b HiR_not0
9602 bra.b Get_Mod
9607 bmi.b Get_Mod # already normalized
9620 bge.b No_Scale
9630 mov.b &1,Sc_Flag(%a6)
9631 bra.b ModOrRem
9644 clr.b Sc_Flag(%a6)
9648 tst.b Mod_Flag(%a6)
9649 beq.b Fix_Sign
9654 blt.b Fix_Sign
9655 bgt.b Last_Sub
9658 bne.b Not_EQ
9660 bne.b Not_EQ
9664 bcs.b Fix_Sign
9675 bge.b Get_Q
9692 mov.b %d3,FPSR_QBYTE(%a6) # put Q in fpsr
9696 movm.l (%sp)+,&0xfc # {%d2-%d7}
9699 tst.b Sc_Flag(%a6)
9700 beq.b Finish
9701 mov.b &FMUL_OP,%d1 # last inst is MUL
9712 mov.b &FMOV_OP,%d1 # last inst is MOVE
9717 #..R = 2^(-j)X - Q Y = Y, thus R = 0 and quotient = 2^j (Q+1)
9720 bge.b Q_Big
9723 bra.b Set_R_0
9730 clr.b Sc_Flag(%a6)
9740 #..Q is odd, Q := Q + 1, signX := -signX
9764 # Simply test the exponent, j-bit, and mantissa values to #
9776 beq.b inf_or_nan_x
9779 beq.b not_norm_x
9781 mov.b &NORM, %d0
9785 bne.b is_unnorm_x
9788 bne.b is_denorm_x
9790 bne.b is_denorm_x
9792 mov.b &ZERO, %d0
9795 mov.b &DENORM, %d0
9801 mov.b &UNNORM, %d0
9805 bne.b is_nan_x
9808 bne.b is_nan_x
9810 mov.b &INF, %d0
9813 mov.b &QNAN, %d0
9848 tst.b SRC_EX(%a0) # check sign for neg or pos
9849 bpl.b dz_pinf # branch if pos sign
9856 bne.b dz_minf_ena
9858 # dz is disabled. return a -INF.
9859 fmov.s &0xff800000,%fp0 # return -INF
9867 fmov.s &0xbf800000,%fp1 # load -1
9868 fdiv.s &0x00000000,%fp1 # -1 / 0
9875 bne.b dz_pinf_ena
9920 bne.b operr_ena
9931 fmovm.x &0x04,-(%sp) # save fp2
9973 tst.b SRC_EX(%a0)
9974 bpl.b unf_pos
9986 mov.b %d0,FPSR_CC(%a6)
9997 mov.b %d0,FPSR_CC(%a6)
10033 mov.b %d0,%d1 # fetch rnd prec,mode
10034 andi.b &0xc0,%d1 # extract prec
10044 movm.l &0xc080,-(%sp) # save d0-d1/a0
10046 movm.l (%sp)+,&0x0103 # restore d0-d1/a0
10048 cmpi.b %d1,&0x40 # is precision sgl?
10049 bne.b ovfl_sc_dbl # no; dbl
10052 bne.b ovfl_sc_inx # yes
10053 tst.b 3+LOCAL_HI(%a0) # is lo byte of hi lw set?
10054 bne.b ovfl_sc_inx # yes
10062 bra.b ovfl_work # continue
10068 tst.b SRC_EX(%a0)
10069 bpl.b ovfl_p
10077 ori.b &neg_mask,%d0
10078 mov.b %d0,FPSR_CC(%a6)
10087 mov.b %d0,FPSR_CC(%a6)
10099 mov.b %d0,FPSR_CC(%a6)
10132 bra.b inx2_work
10143 # t_minx2(): Handle inexact 060FPLSP exception for "-" results. #
10172 bra.b inx2_work
10180 bne.b inx2_work_ena # yes
10189 mov.b &z_bmask,FPSR_CC(%a6)
10248 # dst_qnan --- force result when destination is a NaN
10253 tst.b DST_EX(%a1)
10254 bmi.b dst_qnan_m
10256 mov.b &nan_bmask,FPSR_CC(%a6)
10259 mov.b &nan_bmask+neg_bmask,FPSR_CC(%a6)
10263 # src_qnan --- force result when source is a NaN
10268 tst.b SRC_EX(%a0)
10269 bmi.b src_qnan_m
10271 mov.b &nan_bmask,FPSR_CC(%a6)
10274 mov.b &nan_bmask+neg_bmask,FPSR_CC(%a6)
10288 fmov.l %fpcr,-(%sp) # save fpcr
10297 fmov.l %fpcr,-(%sp) # save fpcr
10312 fmov.l %fpcr,-(%sp) # save fpcr
10321 fmov.l %fpcr,-(%sp) # save fpcr
10336 fmov.l %fpcr,-(%sp) # save fpcr
10345 fmov.l %fpcr,-(%sp) # save fpcr
10360 fmov.l %fpcr,-(%sp) # save fpcr
10369 fmov.l %fpcr,-(%sp) # save fpcr
10464 tst.b SRC_EX(%a0) # get sign of src operand
10465 bmi.b ld_mzero # if neg, load neg zero
10473 mov.b &z_bmask,FPSR_CC(%a6) # set 'Z' ccode bit
10479 fmov.s &0x80000000,%fp0 # load -0
10480 mov.b &neg_bmask+z_bmask,FPSR_CC(%a6) # set 'N','Z' ccode bits
10488 tst.b DST_EX(%a1) # get sign of dst operand
10489 bmi.b ld_mzero # if neg, load neg zero
10490 bra.b ld_pzero # load positive zero
10497 tst.b SRC_EX(%a0) # get sign of src operand
10498 bmi.b ld_minf # if negative branch
10506 mov.b &inf_bmask,FPSR_CC(%a6) # set 'INF' ccode bit
10514 fmov.s &0xff800000,%fp0 # load -INF
10515 mov.b &neg_bmask+inf_bmask,FPSR_CC(%a6) # set 'N','I' ccode bits
10523 tst.b DST_EX(%a1) # get sign of dst operand
10524 bmi.b ld_minf # if negative branch
10525 bra.b ld_pinf
10534 tst.b SRC_EX(%a0) # check sign of source
10535 bmi.b ld_pzero
10536 bra.b ld_pinf
10545 tst.b SRC_EX(%a0) # check sign of source
10547 bra.b ld_pinf
10556 tst.b SRC_EX(%a0) # check sign of source
10557 bmi.b ld_mone
10558 bra.b ld_pinf
10565 tst.b SRC_EX(%a0) # check sign of source
10566 bmi.b ld_mone
10574 clr.b FPSR_CC(%a6)
10582 fmov.s &0xbf800000,%fp0 # load -1
10583 mov.b &neg_bmask,FPSR_CC(%a6) # set 'N' ccode bit
10594 tst.b SRC_EX(%a0) # check sign of source
10595 bmi.b ld_mpi2
10612 fmov.x mpiby2(%pc),%fp0 # load -pi/2
10627 tst.b SRC_EX(%a0) # test sign
10628 bpl.b sincoszp
10630 mov.b &z_bmask+neg_bmask,FPSR_CC(%a6)
10634 mov.b &z_bmask,FPSR_CC(%a6)
10662 mov.b DTAG(%a6),%d1
10664 cmpi.b %d1,&ZERO
10666 cmpi.b %d1,&INF
10668 cmpi.b %d1,&DENORM
10674 mov.b DTAG(%a6),%d1
10676 cmpi.b %d1,&ZERO
10678 cmpi.b %d1,&INF
10680 cmpi.b %d1,&DENORM
10686 mov.b DTAG(%a6),%d1
10688 cmpi.b %d1,&ZERO
10690 cmpi.b %d1,&INF
10692 cmpi.b %d1,&DENORM
10698 mov.b SRC_EX(%a0),%d1 # get src sign
10699 mov.b DST_EX(%a1),%d0 # get dst sign
10700 eor.b %d0,%d1 # get qbyte sign
10701 andi.b &0x80,%d1
10702 mov.b %d1,FPSR_QBYTE(%a6)
10703 tst.b %d0
10709 clr.b FPSR_QBYTE(%a6)
10710 mov.l %d0,-(%sp)
10711 mov.b SRC_EX(%a0),%d1 # get src sign
10712 mov.b DST_EX(%a1),%d0 # get dst sign
10713 eor.b %d0,%d1 # get qbyte sign
10714 andi.b &0x80,%d1
10715 mov.b %d1,FPSR_QBYTE(%a6)
10716 cmpi.b DTAG(%a6),&DENORM
10717 bne.b smod_nrm
10724 tst.b DST_EX(%a1)
10725 bmi.b smod_nrm_neg
10729 mov.b &neg_bmask,FPSR_CC(%a6) # set 'N' code
10737 mov.b DTAG(%a6),%d1
10739 cmpi.b %d1,&ZERO
10741 cmpi.b %d1,&INF
10743 cmpi.b %d1,&DENORM
10749 mov.b DTAG(%a6),%d1
10751 cmpi.b %d1,&ZERO
10753 cmpi.b %d1,&INF
10755 cmpi.b %d1,&DENORM
10761 mov.b DTAG(%a6),%d1
10763 cmpi.b %d1,&ZERO
10765 cmpi.b %d1,&INF
10767 cmpi.b %d1,&DENORM
10777 mov.b DTAG(%a6),%d1
10779 cmpi.b %d1,&ZERO
10781 cmpi.b %d1,&INF
10783 cmpi.b %d1,&DENORM
10789 mov.b DTAG(%a6),%d1
10791 cmpi.b %d1,&ZERO
10793 cmpi.b %d1,&INF
10795 cmpi.b %d1,&DENORM
10801 mov.b DTAG(%a6),%d1
10803 cmpi.b %d1,&QNAN
10811 mov.b DTAG(%a6),%d1
10812 cmpi.b %d1,&QNAN
10837 mov.l %d2, -(%sp) # create some temp regs
10838 mov.l %d3, -(%sp)
10844 beq.b norm_lo # hi(man) is all zeroes!
10879 # unnorm_fix(): - changes an UNNORM to one of NORM, DENORM, or ZERO #
10880 # - returns corresponding optype tag #
10886 # norm() - normalize the mantissa #
10892 # d0 = optype tag - is corrected to one of NORM, DENORM, or ZERO #
10901 bne.b unnorm_shift # hi(man) is not all zeroes
10921 bgt.b unnorm_nrm_zero # yes; denorm only until exp = 0
10934 mov.b &NORM, %d0 # return new optype tag
10941 cmp.b %d1, &32 # is exp <= 32?
10942 bgt.b unnorm_nrm_zero_lrg # no; go handle large exponent
10953 mov.b &DENORM, %d0 # return new optype tag
10970 mov.b &DENORM, %d0 # return new optype tag
10979 mov.b &ZERO, %d0 # fix optype tag