1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GR 3 M68000 Hi-Performance Microprocessor Division 4 M68060 Software Package 5 Production Release P1.00 -- October 10, 1994 6 7 M68060 Software Package Copyright © 1993, 199 8 9 THE SOFTWARE is provided on an "AS IS" basis a 10 To the maximum extent permitted by applicable 11 MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPR 12 INCLUDING IMPLIED WARRANTIES OF MERCHANTABILIT 13 and any warranty against infringement with reg 14 (INCLUDING ANY MODIFIED VERSIONS THEREOF) and 15 16 To the maximum extent permitted by applicable 17 IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY D 18 (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOS 19 BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORM 20 ARISING OF THE USE OR INABILITY TO USE THE SOF 21 Motorola assumes no responsibility for the mai 22 23 You are hereby granted a copyright license to 24 so long as this entire notice is retained with 25 redistributed versions, and that such modified 26 No licenses are granted by implication, estopp 27 or trademarks of Motorola, Inc. 28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29 # 30 # lfptop.s: 31 # This file is appended to the top of th 32 # and contains the entry points into the packa 33 # effect, branches to one of the branch table 34 # 35 36 bra.l _facoss_ 37 short 0x0000 38 bra.l _facosd_ 39 short 0x0000 40 bra.l _facosx_ 41 short 0x0000 42 43 bra.l _fasins_ 44 short 0x0000 45 bra.l _fasind_ 46 short 0x0000 47 bra.l _fasinx_ 48 short 0x0000 49 50 bra.l _fatans_ 51 short 0x0000 52 bra.l _fatand_ 53 short 0x0000 54 bra.l _fatanx_ 55 short 0x0000 56 57 bra.l _fatanhs_ 58 short 0x0000 59 bra.l _fatanhd_ 60 short 0x0000 61 bra.l _fatanhx_ 62 short 0x0000 63 64 bra.l _fcoss_ 65 short 0x0000 66 bra.l _fcosd_ 67 short 0x0000 68 bra.l _fcosx_ 69 short 0x0000 70 71 bra.l _fcoshs_ 72 short 0x0000 73 bra.l _fcoshd_ 74 short 0x0000 75 bra.l _fcoshx_ 76 short 0x0000 77 78 bra.l _fetoxs_ 79 short 0x0000 80 bra.l _fetoxd_ 81 short 0x0000 82 bra.l _fetoxx_ 83 short 0x0000 84 85 bra.l _fetoxm1s_ 86 short 0x0000 87 bra.l _fetoxm1d_ 88 short 0x0000 89 bra.l _fetoxm1x_ 90 short 0x0000 91 92 bra.l _fgetexps_ 93 short 0x0000 94 bra.l _fgetexpd_ 95 short 0x0000 96 bra.l _fgetexpx_ 97 short 0x0000 98 99 bra.l _fgetmans_ 100 short 0x0000 101 bra.l _fgetmand_ 102 short 0x0000 103 bra.l _fgetmanx_ 104 short 0x0000 105 106 bra.l _flog10s_ 107 short 0x0000 108 bra.l _flog10d_ 109 short 0x0000 110 bra.l _flog10x_ 111 short 0x0000 112 113 bra.l _flog2s_ 114 short 0x0000 115 bra.l _flog2d_ 116 short 0x0000 117 bra.l _flog2x_ 118 short 0x0000 119 120 bra.l _flogns_ 121 short 0x0000 122 bra.l _flognd_ 123 short 0x0000 124 bra.l _flognx_ 125 short 0x0000 126 127 bra.l _flognp1s_ 128 short 0x0000 129 bra.l _flognp1d_ 130 short 0x0000 131 bra.l _flognp1x_ 132 short 0x0000 133 134 bra.l _fmods_ 135 short 0x0000 136 bra.l _fmodd_ 137 short 0x0000 138 bra.l _fmodx_ 139 short 0x0000 140 141 bra.l _frems_ 142 short 0x0000 143 bra.l _fremd_ 144 short 0x0000 145 bra.l _fremx_ 146 short 0x0000 147 148 bra.l _fscales_ 149 short 0x0000 150 bra.l _fscaled_ 151 short 0x0000 152 bra.l _fscalex_ 153 short 0x0000 154 155 bra.l _fsins_ 156 short 0x0000 157 bra.l _fsind_ 158 short 0x0000 159 bra.l _fsinx_ 160 short 0x0000 161 162 bra.l _fsincoss_ 163 short 0x0000 164 bra.l _fsincosd_ 165 short 0x0000 166 bra.l _fsincosx_ 167 short 0x0000 168 169 bra.l _fsinhs_ 170 short 0x0000 171 bra.l _fsinhd_ 172 short 0x0000 173 bra.l _fsinhx_ 174 short 0x0000 175 176 bra.l _ftans_ 177 short 0x0000 178 bra.l _ftand_ 179 short 0x0000 180 bra.l _ftanx_ 181 short 0x0000 182 183 bra.l _ftanhs_ 184 short 0x0000 185 bra.l _ftanhd_ 186 short 0x0000 187 bra.l _ftanhx_ 188 short 0x0000 189 190 bra.l _ftentoxs_ 191 short 0x0000 192 bra.l _ftentoxd_ 193 short 0x0000 194 bra.l _ftentoxx_ 195 short 0x0000 196 197 bra.l _ftwotoxs_ 198 short 0x0000 199 bra.l _ftwotoxd_ 200 short 0x0000 201 bra.l _ftwotoxx_ 202 short 0x0000 203 204 bra.l _fabss_ 205 short 0x0000 206 bra.l _fabsd_ 207 short 0x0000 208 bra.l _fabsx_ 209 short 0x0000 210 211 bra.l _fadds_ 212 short 0x0000 213 bra.l _faddd_ 214 short 0x0000 215 bra.l _faddx_ 216 short 0x0000 217 218 bra.l _fdivs_ 219 short 0x0000 220 bra.l _fdivd_ 221 short 0x0000 222 bra.l _fdivx_ 223 short 0x0000 224 225 bra.l _fints_ 226 short 0x0000 227 bra.l _fintd_ 228 short 0x0000 229 bra.l _fintx_ 230 short 0x0000 231 232 bra.l _fintrzs_ 233 short 0x0000 234 bra.l _fintrzd_ 235 short 0x0000 236 bra.l _fintrzx_ 237 short 0x0000 238 239 bra.l _fmuls_ 240 short 0x0000 241 bra.l _fmuld_ 242 short 0x0000 243 bra.l _fmulx_ 244 short 0x0000 245 246 bra.l _fnegs_ 247 short 0x0000 248 bra.l _fnegd_ 249 short 0x0000 250 bra.l _fnegx_ 251 short 0x0000 252 253 bra.l _fsqrts_ 254 short 0x0000 255 bra.l _fsqrtd_ 256 short 0x0000 257 bra.l _fsqrtx_ 258 short 0x0000 259 260 bra.l _fsubs_ 261 short 0x0000 262 bra.l _fsubd_ 263 short 0x0000 264 bra.l _fsubx_ 265 short 0x0000 266 267 # leave room for future possible additions 268 align 0x400 269 270 # 271 # This file contains a set of define statement 272 # in order to promote readability within the c 273 # 274 275 set LOCAL_SIZE, 192 276 set LV, -LOCAL_SIZE 277 278 set EXC_SR, 0x4 279 set EXC_PC, 0x6 280 set EXC_VOFF, 0xa 281 set EXC_EA, 0xc 282 283 set EXC_FP, 0x0 284 285 set EXC_AREGS, -68 286 set EXC_DREGS, -100 287 set EXC_FPREGS, -36 288 289 set EXC_A7, EXC_AREGS+(7*4) 290 set OLD_A7, EXC_AREGS+(6*4) 291 set EXC_A6, EXC_AREGS+(6*4) 292 set EXC_A5, EXC_AREGS+(5*4) 293 set EXC_A4, EXC_AREGS+(4*4) 294 set EXC_A3, EXC_AREGS+(3*4) 295 set EXC_A2, EXC_AREGS+(2*4) 296 set EXC_A1, EXC_AREGS+(1*4) 297 set EXC_A0, EXC_AREGS+(0*4) 298 set EXC_D7, EXC_DREGS+(7*4) 299 set EXC_D6, EXC_DREGS+(6*4) 300 set EXC_D5, EXC_DREGS+(5*4) 301 set EXC_D4, EXC_DREGS+(4*4) 302 set EXC_D3, EXC_DREGS+(3*4) 303 set EXC_D2, EXC_DREGS+(2*4) 304 set EXC_D1, EXC_DREGS+(1*4) 305 set EXC_D0, EXC_DREGS+(0*4) 306 307 set EXC_FP0, EXC_FPREGS+(0*12) 308 set EXC_FP1, EXC_FPREGS+(1*12) 309 set EXC_FP2, EXC_FPREGS+(2*12) 310 311 set FP_SCR1, LV+80 312 set FP_SCR1_EX, FP_SCR1+0 313 set FP_SCR1_SGN, FP_SCR1+2 314 set FP_SCR1_HI, FP_SCR1+4 315 set FP_SCR1_LO, FP_SCR1+8 316 317 set FP_SCR0, LV+68 318 set FP_SCR0_EX, FP_SCR0+0 319 set FP_SCR0_SGN, FP_SCR0+2 320 set FP_SCR0_HI, FP_SCR0+4 321 set FP_SCR0_LO, FP_SCR0+8 322 323 set FP_DST, LV+56 324 set FP_DST_EX, FP_DST+0 325 set FP_DST_SGN, FP_DST+2 326 set FP_DST_HI, FP_DST+4 327 set FP_DST_LO, FP_DST+8 328 329 set FP_SRC, LV+44 330 set FP_SRC_EX, FP_SRC+0 331 set FP_SRC_SGN, FP_SRC+2 332 set FP_SRC_HI, FP_SRC+4 333 set FP_SRC_LO, FP_SRC+8 334 335 set USER_FPIAR, LV+40 336 337 set USER_FPSR, LV+36 338 set FPSR_CC, USER_FPSR+0 339 set FPSR_QBYTE, USER_FPSR+1 340 set FPSR_EXCEPT, USER_FPSR+2 341 set FPSR_AEXCEPT, USER_FPSR+3 342 343 set USER_FPCR, LV+32 344 set FPCR_ENABLE, USER_FPCR+2 345 set FPCR_MODE, USER_FPCR+3 346 347 set L_SCR3, LV+28 348 set L_SCR2, LV+24 349 set L_SCR1, LV+20 350 351 set STORE_FLG, LV+19 352 353 set EXC_TEMP2, LV+24 354 set EXC_TEMP, LV+16 355 356 set DTAG, LV+15 357 set STAG, LV+14 358 359 set SPCOND_FLG, LV+10 360 361 set EXC_CC, LV+8 362 set EXC_EXTWPTR, LV+4 363 set EXC_EXTWORD, LV+2 364 set EXC_CMDREG, LV+2 365 set EXC_OPWORD, LV+0 366 367 ################################ 368 369 # Helpful macros 370 371 set FTEMP, 0 372 set FTEMP_EX, 0 373 set FTEMP_SGN, 2 374 set FTEMP_HI, 4 375 set FTEMP_LO, 8 376 set FTEMP_GRS, 12 377 378 set LOCAL, 0 379 set LOCAL_EX, 0 380 set LOCAL_SGN, 2 381 set LOCAL_HI, 4 382 set LOCAL_LO, 8 383 set LOCAL_GRS, 12 384 385 set DST, 0 386 set DST_EX, 0 387 set DST_HI, 4 388 set DST_LO, 8 389 390 set SRC, 0 391 set SRC_EX, 0 392 set SRC_HI, 4 393 set SRC_LO, 8 394 395 set SGL_LO, 0x3f81 396 set SGL_HI, 0x407e 397 set DBL_LO, 0x3c01 398 set DBL_HI, 0x43fe 399 set EXT_LO, 0x0 400 set EXT_HI, 0x7ffe 401 402 set EXT_BIAS, 0x3fff 403 set SGL_BIAS, 0x007f 404 set DBL_BIAS, 0x03ff 405 406 set NORM, 0x00 407 set ZERO, 0x01 408 set INF, 0x02 409 set QNAN, 0x03 410 set DENORM, 0x04 411 set SNAN, 0x05 412 set UNNORM, 0x06 413 414 ################## 415 # FPSR/FPCR bits # 416 ################## 417 set neg_bit, 0x3 418 set z_bit, 0x2 419 set inf_bit, 0x1 420 set nan_bit, 0x0 421 422 set q_sn_bit, 0x7 423 424 set bsun_bit, 7 425 set snan_bit, 6 426 set operr_bit, 5 427 set ovfl_bit, 4 428 set unfl_bit, 3 429 set dz_bit, 2 430 set inex2_bit, 1 431 set inex1_bit, 0 432 433 set aiop_bit, 7 434 set aovfl_bit, 6 435 set aunfl_bit, 5 436 set adz_bit, 4 437 set ainex_bit, 3 438 439 ############################# 440 # FPSR individual bit masks # 441 ############################# 442 set neg_mask, 0x08000000 443 set inf_mask, 0x02000000 444 set z_mask, 0x04000000 445 set nan_mask, 0x01000000 446 447 set neg_bmask, 0x08 448 set inf_bmask, 0x02 449 set z_bmask, 0x04 450 set nan_bmask, 0x01 451 452 set bsun_mask, 0x00008000 453 set snan_mask, 0x00004000 454 set operr_mask, 0x00002000 455 set ovfl_mask, 0x00001000 456 set unfl_mask, 0x00000800 457 set dz_mask, 0x00000400 458 set inex2_mask, 0x00000200 459 set inex1_mask, 0x00000100 460 461 set aiop_mask, 0x00000080 462 set aovfl_mask, 0x00000040 463 set aunfl_mask, 0x00000020 464 set adz_mask, 0x00000010 465 set ainex_mask, 0x00000008 466 467 ###################################### 468 # FPSR combinations used in the FPSP # 469 ###################################### 470 set dzinf_mask, inf_mask+dz_mask+adz_m 471 set opnan_mask, nan_mask+operr_mask+ai 472 set nzi_mask, 0x01ffffff 473 set unfinx_mask, unfl_mask+inex2_mask+a 474 set unf2inx_mask, unfl_mask+inex2_mask+a 475 set ovfinx_mask, ovfl_mask+inex2_mask+a 476 set inx1a_mask, inex1_mask+ainex_mask 477 set inx2a_mask, inex2_mask+ainex_mask 478 set snaniop_mask, nan_mask+snan_mask+aio 479 set snaniop2_mask, snan_mask+aiop_mask 480 set naniop_mask, nan_mask+aiop_mask 481 set neginf_mask, neg_mask+inf_mask 482 set infaiop_mask, inf_mask+aiop_mask 483 set negz_mask, neg_mask+z_mask 484 set opaop_mask, operr_mask+aiop_mask 485 set unfl_inx_mask, unfl_mask+aunfl_mask+a 486 set ovfl_inx_mask, ovfl_mask+aovfl_mask+a 487 488 ######### 489 # misc. # 490 ######### 491 set rnd_stky_bit, 29 492 493 set sign_bit, 0x7 494 set signan_bit, 0x6 495 496 set sgl_thresh, 0x3f81 497 set dbl_thresh, 0x3c01 498 499 set x_mode, 0x0 500 set s_mode, 0x4 501 set d_mode, 0x8 502 503 set rn_mode, 0x0 504 set rz_mode, 0x1 505 set rm_mode, 0x2 506 set rp_mode, 0x3 507 508 set mantissalen, 64 509 510 set BYTE, 1 511 set WORD, 2 512 set LONG, 4 513 514 set BSUN_VEC, 0xc0 515 set INEX_VEC, 0xc4 516 set DZ_VEC, 0xc8 517 set UNFL_VEC, 0xcc 518 set OPERR_VEC, 0xd0 519 set OVFL_VEC, 0xd4 520 set SNAN_VEC, 0xd8 521 522 ########################### 523 # SPecial CONDition FLaGs # 524 ########################### 525 set ftrapcc_flg, 0x01 526 set fbsun_flg, 0x02 527 set mia7_flg, 0x04 528 set mda7_flg, 0x08 529 set fmovm_flg, 0x40 530 set immed_flg, 0x80 531 532 set ftrapcc_bit, 0x0 533 set fbsun_bit, 0x1 534 set mia7_bit, 0x2 535 set mda7_bit, 0x3 536 set immed_bit, 0x7 537 538 ################################## 539 # TRANSCENDENTAL "LAST-OP" FLAGS # 540 ################################## 541 set FMUL_OP, 0x0 542 set FDIV_OP, 0x1 543 set FADD_OP, 0x2 544 set FMOV_OP, 0x3 545 546 ############# 547 # CONSTANTS # 548 ############# 549 T1: long 0x40C62D38,0xD3D64634 550 T2: long 0x3D6F90AE,0xB1E75CC7 551 552 PI: long 0x40000000,0xC90FDAA2, 553 PIBY2: long 0x3FFF0000,0xC90FDAA2, 554 555 TWOBYPI: 556 long 0x3FE45F30,0x6DC9C883 557 558 ############################################## 559 # MONADIC TEMPLATE 560 ############################################## 561 global _fsins_ 562 _fsins_: 563 link %a6,&-LOCAL_SIZE 564 565 movm.l &0x0303,EXC_DREGS(%a6) 566 fmovm.l %fpcr,%fpsr,USER_FPCR( 567 fmovm.x &0xc0,EXC_FP0(%a6) 568 569 fmov.l &0x0,%fpcr 570 571 # 572 # copy, convert, and tag input argument 573 # 574 fmov.s 0x8(%a6),%fp0 575 fmov.x %fp0,FP_SRC(%a6) 576 lea FP_SRC(%a6),%a0 577 bsr.l tag 578 mov.b %d0,STAG(%a6) 579 mov.b %d0,%d1 580 581 andi.l &0x00ff00ff,USER_FPSR( 582 583 clr.l %d0 584 mov.b FPCR_MODE(%a6),%d0 585 586 tst.b %d1 587 bne.b _L0_2s 588 bsr.l ssin 589 bra.b _L0_6s 590 _L0_2s: 591 cmpi.b %d1,&ZERO 592 bne.b _L0_3s 593 bsr.l src_zero 594 bra.b _L0_6s 595 _L0_3s: 596 cmpi.b %d1,&INF 597 bne.b _L0_4s 598 bsr.l t_operr 599 bra.b _L0_6s 600 _L0_4s: 601 cmpi.b %d1,&QNAN 602 bne.b _L0_5s 603 bsr.l src_qnan 604 bra.b _L0_6s 605 _L0_5s: 606 bsr.l ssind 607 _L0_6s: 608 609 # 610 # Result is now in FP0 611 # 612 movm.l EXC_DREGS(%a6),&0x0303 613 fmovm.l USER_FPCR(%a6),%fpcr,% 614 fmovm.x EXC_FP1(%a6),&0x40 615 unlk %a6 616 rts 617 618 global _fsind_ 619 _fsind_: 620 link %a6,&-LOCAL_SIZE 621 622 movm.l &0x0303,EXC_DREGS(%a6) 623 fmovm.l %fpcr,%fpsr,USER_FPCR( 624 fmovm.x &0xc0,EXC_FP0(%a6) 625 626 fmov.l &0x0,%fpcr 627 628 # 629 # copy, convert, and tag input argument 630 # 631 fmov.d 0x8(%a6),%fp0 632 fmov.x %fp0,FP_SRC(%a6) 633 lea FP_SRC(%a6),%a0 634 bsr.l tag 635 mov.b %d0,STAG(%a6) 636 mov.b %d0,%d1 637 638 andi.l &0x00ff00ff,USER_FPSR( 639 640 clr.l %d0 641 mov.b FPCR_MODE(%a6),%d0 642 643 mov.b %d1,STAG(%a6) 644 tst.b %d1 645 bne.b _L0_2d 646 bsr.l ssin 647 bra.b _L0_6d 648 _L0_2d: 649 cmpi.b %d1,&ZERO 650 bne.b _L0_3d 651 bsr.l src_zero 652 bra.b _L0_6d 653 _L0_3d: 654 cmpi.b %d1,&INF 655 bne.b _L0_4d 656 bsr.l t_operr 657 bra.b _L0_6d 658 _L0_4d: 659 cmpi.b %d1,&QNAN 660 bne.b _L0_5d 661 bsr.l src_qnan 662 bra.b _L0_6d 663 _L0_5d: 664 bsr.l ssind 665 _L0_6d: 666 667 # 668 # Result is now in FP0 669 # 670 movm.l EXC_DREGS(%a6),&0x0303 671 fmovm.l USER_FPCR(%a6),%fpcr,% 672 fmovm.x EXC_FP1(%a6),&0x40 673 unlk %a6 674 rts 675 676 global _fsinx_ 677 _fsinx_: 678 link %a6,&-LOCAL_SIZE 679 680 movm.l &0x0303,EXC_DREGS(%a6) 681 fmovm.l %fpcr,%fpsr,USER_FPCR( 682 fmovm.x &0xc0,EXC_FP0(%a6) 683 684 fmov.l &0x0,%fpcr 685 686 # 687 # copy, convert, and tag input argument 688 # 689 lea FP_SRC(%a6),%a0 690 mov.l 0x8+0x0(%a6),0x0(%a0) 691 mov.l 0x8+0x4(%a6),0x4(%a0) 692 mov.l 0x8+0x8(%a6),0x8(%a0) 693 bsr.l tag 694 mov.b %d0,STAG(%a6) 695 mov.b %d0,%d1 696 697 andi.l &0x00ff00ff,USER_FPSR( 698 699 clr.l %d0 700 mov.b FPCR_MODE(%a6),%d0 701 702 tst.b %d1 703 bne.b _L0_2x 704 bsr.l ssin 705 bra.b _L0_6x 706 _L0_2x: 707 cmpi.b %d1,&ZERO 708 bne.b _L0_3x 709 bsr.l src_zero 710 bra.b _L0_6x 711 _L0_3x: 712 cmpi.b %d1,&INF 713 bne.b _L0_4x 714 bsr.l t_operr 715 bra.b _L0_6x 716 _L0_4x: 717 cmpi.b %d1,&QNAN 718 bne.b _L0_5x 719 bsr.l src_qnan 720 bra.b _L0_6x 721 _L0_5x: 722 bsr.l ssind 723 _L0_6x: 724 725 # 726 # Result is now in FP0 727 # 728 movm.l EXC_DREGS(%a6),&0x0303 729 fmovm.l USER_FPCR(%a6),%fpcr,% 730 fmovm.x EXC_FP1(%a6),&0x40 731 unlk %a6 732 rts 733 734 735 ############################################## 736 # MONADIC TEMPLATE 737 ############################################## 738 global _fcoss_ 739 _fcoss_: 740 link %a6,&-LOCAL_SIZE 741 742 movm.l &0x0303,EXC_DREGS(%a6) 743 fmovm.l %fpcr,%fpsr,USER_FPCR( 744 fmovm.x &0xc0,EXC_FP0(%a6) 745 746 fmov.l &0x0,%fpcr 747 748 # 749 # copy, convert, and tag input argument 750 # 751 fmov.s 0x8(%a6),%fp0 752 fmov.x %fp0,FP_SRC(%a6) 753 lea FP_SRC(%a6),%a0 754 bsr.l tag 755 mov.b %d0,STAG(%a6) 756 mov.b %d0,%d1 757 758 andi.l &0x00ff00ff,USER_FPSR( 759 760 clr.l %d0 761 mov.b FPCR_MODE(%a6),%d0 762 763 tst.b %d1 764 bne.b _L1_2s 765 bsr.l scos 766 bra.b _L1_6s 767 _L1_2s: 768 cmpi.b %d1,&ZERO 769 bne.b _L1_3s 770 bsr.l ld_pone 771 bra.b _L1_6s 772 _L1_3s: 773 cmpi.b %d1,&INF 774 bne.b _L1_4s 775 bsr.l t_operr 776 bra.b _L1_6s 777 _L1_4s: 778 cmpi.b %d1,&QNAN 779 bne.b _L1_5s 780 bsr.l src_qnan 781 bra.b _L1_6s 782 _L1_5s: 783 bsr.l scosd 784 _L1_6s: 785 786 # 787 # Result is now in FP0 788 # 789 movm.l EXC_DREGS(%a6),&0x0303 790 fmovm.l USER_FPCR(%a6),%fpcr,% 791 fmovm.x EXC_FP1(%a6),&0x40 792 unlk %a6 793 rts 794 795 global _fcosd_ 796 _fcosd_: 797 link %a6,&-LOCAL_SIZE 798 799 movm.l &0x0303,EXC_DREGS(%a6) 800 fmovm.l %fpcr,%fpsr,USER_FPCR( 801 fmovm.x &0xc0,EXC_FP0(%a6) 802 803 fmov.l &0x0,%fpcr 804 805 # 806 # copy, convert, and tag input argument 807 # 808 fmov.d 0x8(%a6),%fp0 809 fmov.x %fp0,FP_SRC(%a6) 810 lea FP_SRC(%a6),%a0 811 bsr.l tag 812 mov.b %d0,STAG(%a6) 813 mov.b %d0,%d1 814 815 andi.l &0x00ff00ff,USER_FPSR( 816 817 clr.l %d0 818 mov.b FPCR_MODE(%a6),%d0 819 820 mov.b %d1,STAG(%a6) 821 tst.b %d1 822 bne.b _L1_2d 823 bsr.l scos 824 bra.b _L1_6d 825 _L1_2d: 826 cmpi.b %d1,&ZERO 827 bne.b _L1_3d 828 bsr.l ld_pone 829 bra.b _L1_6d 830 _L1_3d: 831 cmpi.b %d1,&INF 832 bne.b _L1_4d 833 bsr.l t_operr 834 bra.b _L1_6d 835 _L1_4d: 836 cmpi.b %d1,&QNAN 837 bne.b _L1_5d 838 bsr.l src_qnan 839 bra.b _L1_6d 840 _L1_5d: 841 bsr.l scosd 842 _L1_6d: 843 844 # 845 # Result is now in FP0 846 # 847 movm.l EXC_DREGS(%a6),&0x0303 848 fmovm.l USER_FPCR(%a6),%fpcr,% 849 fmovm.x EXC_FP1(%a6),&0x40 850 unlk %a6 851 rts 852 853 global _fcosx_ 854 _fcosx_: 855 link %a6,&-LOCAL_SIZE 856 857 movm.l &0x0303,EXC_DREGS(%a6) 858 fmovm.l %fpcr,%fpsr,USER_FPCR( 859 fmovm.x &0xc0,EXC_FP0(%a6) 860 861 fmov.l &0x0,%fpcr 862 863 # 864 # copy, convert, and tag input argument 865 # 866 lea FP_SRC(%a6),%a0 867 mov.l 0x8+0x0(%a6),0x0(%a0) 868 mov.l 0x8+0x4(%a6),0x4(%a0) 869 mov.l 0x8+0x8(%a6),0x8(%a0) 870 bsr.l tag 871 mov.b %d0,STAG(%a6) 872 mov.b %d0,%d1 873 874 andi.l &0x00ff00ff,USER_FPSR( 875 876 clr.l %d0 877 mov.b FPCR_MODE(%a6),%d0 878 879 tst.b %d1 880 bne.b _L1_2x 881 bsr.l scos 882 bra.b _L1_6x 883 _L1_2x: 884 cmpi.b %d1,&ZERO 885 bne.b _L1_3x 886 bsr.l ld_pone 887 bra.b _L1_6x 888 _L1_3x: 889 cmpi.b %d1,&INF 890 bne.b _L1_4x 891 bsr.l t_operr 892 bra.b _L1_6x 893 _L1_4x: 894 cmpi.b %d1,&QNAN 895 bne.b _L1_5x 896 bsr.l src_qnan 897 bra.b _L1_6x 898 _L1_5x: 899 bsr.l scosd 900 _L1_6x: 901 902 # 903 # Result is now in FP0 904 # 905 movm.l EXC_DREGS(%a6),&0x0303 906 fmovm.l USER_FPCR(%a6),%fpcr,% 907 fmovm.x EXC_FP1(%a6),&0x40 908 unlk %a6 909 rts 910 911 912 ############################################## 913 # MONADIC TEMPLATE 914 ############################################## 915 global _fsinhs_ 916 _fsinhs_: 917 link %a6,&-LOCAL_SIZE 918 919 movm.l &0x0303,EXC_DREGS(%a6) 920 fmovm.l %fpcr,%fpsr,USER_FPCR( 921 fmovm.x &0xc0,EXC_FP0(%a6) 922 923 fmov.l &0x0,%fpcr 924 925 # 926 # copy, convert, and tag input argument 927 # 928 fmov.s 0x8(%a6),%fp0 929 fmov.x %fp0,FP_SRC(%a6) 930 lea FP_SRC(%a6),%a0 931 bsr.l tag 932 mov.b %d0,STAG(%a6) 933 mov.b %d0,%d1 934 935 andi.l &0x00ff00ff,USER_FPSR( 936 937 clr.l %d0 938 mov.b FPCR_MODE(%a6),%d0 939 940 tst.b %d1 941 bne.b _L2_2s 942 bsr.l ssinh 943 bra.b _L2_6s 944 _L2_2s: 945 cmpi.b %d1,&ZERO 946 bne.b _L2_3s 947 bsr.l src_zero 948 bra.b _L2_6s 949 _L2_3s: 950 cmpi.b %d1,&INF 951 bne.b _L2_4s 952 bsr.l src_inf 953 bra.b _L2_6s 954 _L2_4s: 955 cmpi.b %d1,&QNAN 956 bne.b _L2_5s 957 bsr.l src_qnan 958 bra.b _L2_6s 959 _L2_5s: 960 bsr.l ssinhd 961 _L2_6s: 962 963 # 964 # Result is now in FP0 965 # 966 movm.l EXC_DREGS(%a6),&0x0303 967 fmovm.l USER_FPCR(%a6),%fpcr,% 968 fmovm.x EXC_FP1(%a6),&0x40 969 unlk %a6 970 rts 971 972 global _fsinhd_ 973 _fsinhd_: 974 link %a6,&-LOCAL_SIZE 975 976 movm.l &0x0303,EXC_DREGS(%a6) 977 fmovm.l %fpcr,%fpsr,USER_FPCR( 978 fmovm.x &0xc0,EXC_FP0(%a6) 979 980 fmov.l &0x0,%fpcr 981 982 # 983 # copy, convert, and tag input argument 984 # 985 fmov.d 0x8(%a6),%fp0 986 fmov.x %fp0,FP_SRC(%a6) 987 lea FP_SRC(%a6),%a0 988 bsr.l tag 989 mov.b %d0,STAG(%a6) 990 mov.b %d0,%d1 991 992 andi.l &0x00ff00ff,USER_FPSR( 993 994 clr.l %d0 995 mov.b FPCR_MODE(%a6),%d0 996 997 mov.b %d1,STAG(%a6) 998 tst.b %d1 999 bne.b _L2_2d 1000 bsr.l ssinh 1001 bra.b _L2_6d 1002 _L2_2d: 1003 cmpi.b %d1,&ZERO 1004 bne.b _L2_3d 1005 bsr.l src_zero 1006 bra.b _L2_6d 1007 _L2_3d: 1008 cmpi.b %d1,&INF 1009 bne.b _L2_4d 1010 bsr.l src_inf 1011 bra.b _L2_6d 1012 _L2_4d: 1013 cmpi.b %d1,&QNAN 1014 bne.b _L2_5d 1015 bsr.l src_qnan 1016 bra.b _L2_6d 1017 _L2_5d: 1018 bsr.l ssinhd 1019 _L2_6d: 1020 1021 # 1022 # Result is now in FP0 1023 # 1024 movm.l EXC_DREGS(%a6),&0x030 1025 fmovm.l USER_FPCR(%a6),%fpcr, 1026 fmovm.x EXC_FP1(%a6),&0x40 1027 unlk %a6 1028 rts 1029 1030 global _fsinhx_ 1031 _fsinhx_: 1032 link %a6,&-LOCAL_SIZE 1033 1034 movm.l &0x0303,EXC_DREGS(%a6 1035 fmovm.l %fpcr,%fpsr,USER_FPCR 1036 fmovm.x &0xc0,EXC_FP0(%a6) 1037 1038 fmov.l &0x0,%fpcr 1039 1040 # 1041 # copy, convert, and tag input argument 1042 # 1043 lea FP_SRC(%a6),%a0 1044 mov.l 0x8+0x0(%a6),0x0(%a0) 1045 mov.l 0x8+0x4(%a6),0x4(%a0) 1046 mov.l 0x8+0x8(%a6),0x8(%a0) 1047 bsr.l tag 1048 mov.b %d0,STAG(%a6) 1049 mov.b %d0,%d1 1050 1051 andi.l &0x00ff00ff,USER_FPSR 1052 1053 clr.l %d0 1054 mov.b FPCR_MODE(%a6),%d0 1055 1056 tst.b %d1 1057 bne.b _L2_2x 1058 bsr.l ssinh 1059 bra.b _L2_6x 1060 _L2_2x: 1061 cmpi.b %d1,&ZERO 1062 bne.b _L2_3x 1063 bsr.l src_zero 1064 bra.b _L2_6x 1065 _L2_3x: 1066 cmpi.b %d1,&INF 1067 bne.b _L2_4x 1068 bsr.l src_inf 1069 bra.b _L2_6x 1070 _L2_4x: 1071 cmpi.b %d1,&QNAN 1072 bne.b _L2_5x 1073 bsr.l src_qnan 1074 bra.b _L2_6x 1075 _L2_5x: 1076 bsr.l ssinhd 1077 _L2_6x: 1078 1079 # 1080 # Result is now in FP0 1081 # 1082 movm.l EXC_DREGS(%a6),&0x030 1083 fmovm.l USER_FPCR(%a6),%fpcr, 1084 fmovm.x EXC_FP1(%a6),&0x40 1085 unlk %a6 1086 rts 1087 1088 1089 ############################################# 1090 # MONADIC TEMPLATE 1091 ############################################# 1092 global _flognp1s_ 1093 _flognp1s_: 1094 link %a6,&-LOCAL_SIZE 1095 1096 movm.l &0x0303,EXC_DREGS(%a6 1097 fmovm.l %fpcr,%fpsr,USER_FPCR 1098 fmovm.x &0xc0,EXC_FP0(%a6) 1099 1100 fmov.l &0x0,%fpcr 1101 1102 # 1103 # copy, convert, and tag input argument 1104 # 1105 fmov.s 0x8(%a6),%fp0 1106 fmov.x %fp0,FP_SRC(%a6) 1107 lea FP_SRC(%a6),%a0 1108 bsr.l tag 1109 mov.b %d0,STAG(%a6) 1110 mov.b %d0,%d1 1111 1112 andi.l &0x00ff00ff,USER_FPSR 1113 1114 clr.l %d0 1115 mov.b FPCR_MODE(%a6),%d0 1116 1117 tst.b %d1 1118 bne.b _L3_2s 1119 bsr.l slognp1 1120 bra.b _L3_6s 1121 _L3_2s: 1122 cmpi.b %d1,&ZERO 1123 bne.b _L3_3s 1124 bsr.l src_zero 1125 bra.b _L3_6s 1126 _L3_3s: 1127 cmpi.b %d1,&INF 1128 bne.b _L3_4s 1129 bsr.l sopr_inf 1130 bra.b _L3_6s 1131 _L3_4s: 1132 cmpi.b %d1,&QNAN 1133 bne.b _L3_5s 1134 bsr.l src_qnan 1135 bra.b _L3_6s 1136 _L3_5s: 1137 bsr.l slognp1d 1138 _L3_6s: 1139 1140 # 1141 # Result is now in FP0 1142 # 1143 movm.l EXC_DREGS(%a6),&0x030 1144 fmovm.l USER_FPCR(%a6),%fpcr, 1145 fmovm.x EXC_FP1(%a6),&0x40 1146 unlk %a6 1147 rts 1148 1149 global _flognp1d_ 1150 _flognp1d_: 1151 link %a6,&-LOCAL_SIZE 1152 1153 movm.l &0x0303,EXC_DREGS(%a6 1154 fmovm.l %fpcr,%fpsr,USER_FPCR 1155 fmovm.x &0xc0,EXC_FP0(%a6) 1156 1157 fmov.l &0x0,%fpcr 1158 1159 # 1160 # copy, convert, and tag input argument 1161 # 1162 fmov.d 0x8(%a6),%fp0 1163 fmov.x %fp0,FP_SRC(%a6) 1164 lea FP_SRC(%a6),%a0 1165 bsr.l tag 1166 mov.b %d0,STAG(%a6) 1167 mov.b %d0,%d1 1168 1169 andi.l &0x00ff00ff,USER_FPSR 1170 1171 clr.l %d0 1172 mov.b FPCR_MODE(%a6),%d0 1173 1174 mov.b %d1,STAG(%a6) 1175 tst.b %d1 1176 bne.b _L3_2d 1177 bsr.l slognp1 1178 bra.b _L3_6d 1179 _L3_2d: 1180 cmpi.b %d1,&ZERO 1181 bne.b _L3_3d 1182 bsr.l src_zero 1183 bra.b _L3_6d 1184 _L3_3d: 1185 cmpi.b %d1,&INF 1186 bne.b _L3_4d 1187 bsr.l sopr_inf 1188 bra.b _L3_6d 1189 _L3_4d: 1190 cmpi.b %d1,&QNAN 1191 bne.b _L3_5d 1192 bsr.l src_qnan 1193 bra.b _L3_6d 1194 _L3_5d: 1195 bsr.l slognp1d 1196 _L3_6d: 1197 1198 # 1199 # Result is now in FP0 1200 # 1201 movm.l EXC_DREGS(%a6),&0x030 1202 fmovm.l USER_FPCR(%a6),%fpcr, 1203 fmovm.x EXC_FP1(%a6),&0x40 1204 unlk %a6 1205 rts 1206 1207 global _flognp1x_ 1208 _flognp1x_: 1209 link %a6,&-LOCAL_SIZE 1210 1211 movm.l &0x0303,EXC_DREGS(%a6 1212 fmovm.l %fpcr,%fpsr,USER_FPCR 1213 fmovm.x &0xc0,EXC_FP0(%a6) 1214 1215 fmov.l &0x0,%fpcr 1216 1217 # 1218 # copy, convert, and tag input argument 1219 # 1220 lea FP_SRC(%a6),%a0 1221 mov.l 0x8+0x0(%a6),0x0(%a0) 1222 mov.l 0x8+0x4(%a6),0x4(%a0) 1223 mov.l 0x8+0x8(%a6),0x8(%a0) 1224 bsr.l tag 1225 mov.b %d0,STAG(%a6) 1226 mov.b %d0,%d1 1227 1228 andi.l &0x00ff00ff,USER_FPSR 1229 1230 clr.l %d0 1231 mov.b FPCR_MODE(%a6),%d0 1232 1233 tst.b %d1 1234 bne.b _L3_2x 1235 bsr.l slognp1 1236 bra.b _L3_6x 1237 _L3_2x: 1238 cmpi.b %d1,&ZERO 1239 bne.b _L3_3x 1240 bsr.l src_zero 1241 bra.b _L3_6x 1242 _L3_3x: 1243 cmpi.b %d1,&INF 1244 bne.b _L3_4x 1245 bsr.l sopr_inf 1246 bra.b _L3_6x 1247 _L3_4x: 1248 cmpi.b %d1,&QNAN 1249 bne.b _L3_5x 1250 bsr.l src_qnan 1251 bra.b _L3_6x 1252 _L3_5x: 1253 bsr.l slognp1d 1254 _L3_6x: 1255 1256 # 1257 # Result is now in FP0 1258 # 1259 movm.l EXC_DREGS(%a6),&0x030 1260 fmovm.l USER_FPCR(%a6),%fpcr, 1261 fmovm.x EXC_FP1(%a6),&0x40 1262 unlk %a6 1263 rts 1264 1265 1266 ############################################# 1267 # MONADIC TEMPLATE 1268 ############################################# 1269 global _fetoxm1s_ 1270 _fetoxm1s_: 1271 link %a6,&-LOCAL_SIZE 1272 1273 movm.l &0x0303,EXC_DREGS(%a6 1274 fmovm.l %fpcr,%fpsr,USER_FPCR 1275 fmovm.x &0xc0,EXC_FP0(%a6) 1276 1277 fmov.l &0x0,%fpcr 1278 1279 # 1280 # copy, convert, and tag input argument 1281 # 1282 fmov.s 0x8(%a6),%fp0 1283 fmov.x %fp0,FP_SRC(%a6) 1284 lea FP_SRC(%a6),%a0 1285 bsr.l tag 1286 mov.b %d0,STAG(%a6) 1287 mov.b %d0,%d1 1288 1289 andi.l &0x00ff00ff,USER_FPSR 1290 1291 clr.l %d0 1292 mov.b FPCR_MODE(%a6),%d0 1293 1294 tst.b %d1 1295 bne.b _L4_2s 1296 bsr.l setoxm1 1297 bra.b _L4_6s 1298 _L4_2s: 1299 cmpi.b %d1,&ZERO 1300 bne.b _L4_3s 1301 bsr.l src_zero 1302 bra.b _L4_6s 1303 _L4_3s: 1304 cmpi.b %d1,&INF 1305 bne.b _L4_4s 1306 bsr.l setoxm1i 1307 bra.b _L4_6s 1308 _L4_4s: 1309 cmpi.b %d1,&QNAN 1310 bne.b _L4_5s 1311 bsr.l src_qnan 1312 bra.b _L4_6s 1313 _L4_5s: 1314 bsr.l setoxm1d 1315 _L4_6s: 1316 1317 # 1318 # Result is now in FP0 1319 # 1320 movm.l EXC_DREGS(%a6),&0x030 1321 fmovm.l USER_FPCR(%a6),%fpcr, 1322 fmovm.x EXC_FP1(%a6),&0x40 1323 unlk %a6 1324 rts 1325 1326 global _fetoxm1d_ 1327 _fetoxm1d_: 1328 link %a6,&-LOCAL_SIZE 1329 1330 movm.l &0x0303,EXC_DREGS(%a6 1331 fmovm.l %fpcr,%fpsr,USER_FPCR 1332 fmovm.x &0xc0,EXC_FP0(%a6) 1333 1334 fmov.l &0x0,%fpcr 1335 1336 # 1337 # copy, convert, and tag input argument 1338 # 1339 fmov.d 0x8(%a6),%fp0 1340 fmov.x %fp0,FP_SRC(%a6) 1341 lea FP_SRC(%a6),%a0 1342 bsr.l tag 1343 mov.b %d0,STAG(%a6) 1344 mov.b %d0,%d1 1345 1346 andi.l &0x00ff00ff,USER_FPSR 1347 1348 clr.l %d0 1349 mov.b FPCR_MODE(%a6),%d0 1350 1351 mov.b %d1,STAG(%a6) 1352 tst.b %d1 1353 bne.b _L4_2d 1354 bsr.l setoxm1 1355 bra.b _L4_6d 1356 _L4_2d: 1357 cmpi.b %d1,&ZERO 1358 bne.b _L4_3d 1359 bsr.l src_zero 1360 bra.b _L4_6d 1361 _L4_3d: 1362 cmpi.b %d1,&INF 1363 bne.b _L4_4d 1364 bsr.l setoxm1i 1365 bra.b _L4_6d 1366 _L4_4d: 1367 cmpi.b %d1,&QNAN 1368 bne.b _L4_5d 1369 bsr.l src_qnan 1370 bra.b _L4_6d 1371 _L4_5d: 1372 bsr.l setoxm1d 1373 _L4_6d: 1374 1375 # 1376 # Result is now in FP0 1377 # 1378 movm.l EXC_DREGS(%a6),&0x030 1379 fmovm.l USER_FPCR(%a6),%fpcr, 1380 fmovm.x EXC_FP1(%a6),&0x40 1381 unlk %a6 1382 rts 1383 1384 global _fetoxm1x_ 1385 _fetoxm1x_: 1386 link %a6,&-LOCAL_SIZE 1387 1388 movm.l &0x0303,EXC_DREGS(%a6 1389 fmovm.l %fpcr,%fpsr,USER_FPCR 1390 fmovm.x &0xc0,EXC_FP0(%a6) 1391 1392 fmov.l &0x0,%fpcr 1393 1394 # 1395 # copy, convert, and tag input argument 1396 # 1397 lea FP_SRC(%a6),%a0 1398 mov.l 0x8+0x0(%a6),0x0(%a0) 1399 mov.l 0x8+0x4(%a6),0x4(%a0) 1400 mov.l 0x8+0x8(%a6),0x8(%a0) 1401 bsr.l tag 1402 mov.b %d0,STAG(%a6) 1403 mov.b %d0,%d1 1404 1405 andi.l &0x00ff00ff,USER_FPSR 1406 1407 clr.l %d0 1408 mov.b FPCR_MODE(%a6),%d0 1409 1410 tst.b %d1 1411 bne.b _L4_2x 1412 bsr.l setoxm1 1413 bra.b _L4_6x 1414 _L4_2x: 1415 cmpi.b %d1,&ZERO 1416 bne.b _L4_3x 1417 bsr.l src_zero 1418 bra.b _L4_6x 1419 _L4_3x: 1420 cmpi.b %d1,&INF 1421 bne.b _L4_4x 1422 bsr.l setoxm1i 1423 bra.b _L4_6x 1424 _L4_4x: 1425 cmpi.b %d1,&QNAN 1426 bne.b _L4_5x 1427 bsr.l src_qnan 1428 bra.b _L4_6x 1429 _L4_5x: 1430 bsr.l setoxm1d 1431 _L4_6x: 1432 1433 # 1434 # Result is now in FP0 1435 # 1436 movm.l EXC_DREGS(%a6),&0x030 1437 fmovm.l USER_FPCR(%a6),%fpcr, 1438 fmovm.x EXC_FP1(%a6),&0x40 1439 unlk %a6 1440 rts 1441 1442 1443 ############################################# 1444 # MONADIC TEMPLATE 1445 ############################################# 1446 global _ftanhs_ 1447 _ftanhs_: 1448 link %a6,&-LOCAL_SIZE 1449 1450 movm.l &0x0303,EXC_DREGS(%a6 1451 fmovm.l %fpcr,%fpsr,USER_FPCR 1452 fmovm.x &0xc0,EXC_FP0(%a6) 1453 1454 fmov.l &0x0,%fpcr 1455 1456 # 1457 # copy, convert, and tag input argument 1458 # 1459 fmov.s 0x8(%a6),%fp0 1460 fmov.x %fp0,FP_SRC(%a6) 1461 lea FP_SRC(%a6),%a0 1462 bsr.l tag 1463 mov.b %d0,STAG(%a6) 1464 mov.b %d0,%d1 1465 1466 andi.l &0x00ff00ff,USER_FPSR 1467 1468 clr.l %d0 1469 mov.b FPCR_MODE(%a6),%d0 1470 1471 tst.b %d1 1472 bne.b _L5_2s 1473 bsr.l stanh 1474 bra.b _L5_6s 1475 _L5_2s: 1476 cmpi.b %d1,&ZERO 1477 bne.b _L5_3s 1478 bsr.l src_zero 1479 bra.b _L5_6s 1480 _L5_3s: 1481 cmpi.b %d1,&INF 1482 bne.b _L5_4s 1483 bsr.l src_one 1484 bra.b _L5_6s 1485 _L5_4s: 1486 cmpi.b %d1,&QNAN 1487 bne.b _L5_5s 1488 bsr.l src_qnan 1489 bra.b _L5_6s 1490 _L5_5s: 1491 bsr.l stanhd 1492 _L5_6s: 1493 1494 # 1495 # Result is now in FP0 1496 # 1497 movm.l EXC_DREGS(%a6),&0x030 1498 fmovm.l USER_FPCR(%a6),%fpcr, 1499 fmovm.x EXC_FP1(%a6),&0x40 1500 unlk %a6 1501 rts 1502 1503 global _ftanhd_ 1504 _ftanhd_: 1505 link %a6,&-LOCAL_SIZE 1506 1507 movm.l &0x0303,EXC_DREGS(%a6 1508 fmovm.l %fpcr,%fpsr,USER_FPCR 1509 fmovm.x &0xc0,EXC_FP0(%a6) 1510 1511 fmov.l &0x0,%fpcr 1512 1513 # 1514 # copy, convert, and tag input argument 1515 # 1516 fmov.d 0x8(%a6),%fp0 1517 fmov.x %fp0,FP_SRC(%a6) 1518 lea FP_SRC(%a6),%a0 1519 bsr.l tag 1520 mov.b %d0,STAG(%a6) 1521 mov.b %d0,%d1 1522 1523 andi.l &0x00ff00ff,USER_FPSR 1524 1525 clr.l %d0 1526 mov.b FPCR_MODE(%a6),%d0 1527 1528 mov.b %d1,STAG(%a6) 1529 tst.b %d1 1530 bne.b _L5_2d 1531 bsr.l stanh 1532 bra.b _L5_6d 1533 _L5_2d: 1534 cmpi.b %d1,&ZERO 1535 bne.b _L5_3d 1536 bsr.l src_zero 1537 bra.b _L5_6d 1538 _L5_3d: 1539 cmpi.b %d1,&INF 1540 bne.b _L5_4d 1541 bsr.l src_one 1542 bra.b _L5_6d 1543 _L5_4d: 1544 cmpi.b %d1,&QNAN 1545 bne.b _L5_5d 1546 bsr.l src_qnan 1547 bra.b _L5_6d 1548 _L5_5d: 1549 bsr.l stanhd 1550 _L5_6d: 1551 1552 # 1553 # Result is now in FP0 1554 # 1555 movm.l EXC_DREGS(%a6),&0x030 1556 fmovm.l USER_FPCR(%a6),%fpcr, 1557 fmovm.x EXC_FP1(%a6),&0x40 1558 unlk %a6 1559 rts 1560 1561 global _ftanhx_ 1562 _ftanhx_: 1563 link %a6,&-LOCAL_SIZE 1564 1565 movm.l &0x0303,EXC_DREGS(%a6 1566 fmovm.l %fpcr,%fpsr,USER_FPCR 1567 fmovm.x &0xc0,EXC_FP0(%a6) 1568 1569 fmov.l &0x0,%fpcr 1570 1571 # 1572 # copy, convert, and tag input argument 1573 # 1574 lea FP_SRC(%a6),%a0 1575 mov.l 0x8+0x0(%a6),0x0(%a0) 1576 mov.l 0x8+0x4(%a6),0x4(%a0) 1577 mov.l 0x8+0x8(%a6),0x8(%a0) 1578 bsr.l tag 1579 mov.b %d0,STAG(%a6) 1580 mov.b %d0,%d1 1581 1582 andi.l &0x00ff00ff,USER_FPSR 1583 1584 clr.l %d0 1585 mov.b FPCR_MODE(%a6),%d0 1586 1587 tst.b %d1 1588 bne.b _L5_2x 1589 bsr.l stanh 1590 bra.b _L5_6x 1591 _L5_2x: 1592 cmpi.b %d1,&ZERO 1593 bne.b _L5_3x 1594 bsr.l src_zero 1595 bra.b _L5_6x 1596 _L5_3x: 1597 cmpi.b %d1,&INF 1598 bne.b _L5_4x 1599 bsr.l src_one 1600 bra.b _L5_6x 1601 _L5_4x: 1602 cmpi.b %d1,&QNAN 1603 bne.b _L5_5x 1604 bsr.l src_qnan 1605 bra.b _L5_6x 1606 _L5_5x: 1607 bsr.l stanhd 1608 _L5_6x: 1609 1610 # 1611 # Result is now in FP0 1612 # 1613 movm.l EXC_DREGS(%a6),&0x030 1614 fmovm.l USER_FPCR(%a6),%fpcr, 1615 fmovm.x EXC_FP1(%a6),&0x40 1616 unlk %a6 1617 rts 1618 1619 1620 ############################################# 1621 # MONADIC TEMPLATE 1622 ############################################# 1623 global _fatans_ 1624 _fatans_: 1625 link %a6,&-LOCAL_SIZE 1626 1627 movm.l &0x0303,EXC_DREGS(%a6 1628 fmovm.l %fpcr,%fpsr,USER_FPCR 1629 fmovm.x &0xc0,EXC_FP0(%a6) 1630 1631 fmov.l &0x0,%fpcr 1632 1633 # 1634 # copy, convert, and tag input argument 1635 # 1636 fmov.s 0x8(%a6),%fp0 1637 fmov.x %fp0,FP_SRC(%a6) 1638 lea FP_SRC(%a6),%a0 1639 bsr.l tag 1640 mov.b %d0,STAG(%a6) 1641 mov.b %d0,%d1 1642 1643 andi.l &0x00ff00ff,USER_FPSR 1644 1645 clr.l %d0 1646 mov.b FPCR_MODE(%a6),%d0 1647 1648 tst.b %d1 1649 bne.b _L6_2s 1650 bsr.l satan 1651 bra.b _L6_6s 1652 _L6_2s: 1653 cmpi.b %d1,&ZERO 1654 bne.b _L6_3s 1655 bsr.l src_zero 1656 bra.b _L6_6s 1657 _L6_3s: 1658 cmpi.b %d1,&INF 1659 bne.b _L6_4s 1660 bsr.l spi_2 1661 bra.b _L6_6s 1662 _L6_4s: 1663 cmpi.b %d1,&QNAN 1664 bne.b _L6_5s 1665 bsr.l src_qnan 1666 bra.b _L6_6s 1667 _L6_5s: 1668 bsr.l satand 1669 _L6_6s: 1670 1671 # 1672 # Result is now in FP0 1673 # 1674 movm.l EXC_DREGS(%a6),&0x030 1675 fmovm.l USER_FPCR(%a6),%fpcr, 1676 fmovm.x EXC_FP1(%a6),&0x40 1677 unlk %a6 1678 rts 1679 1680 global _fatand_ 1681 _fatand_: 1682 link %a6,&-LOCAL_SIZE 1683 1684 movm.l &0x0303,EXC_DREGS(%a6 1685 fmovm.l %fpcr,%fpsr,USER_FPCR 1686 fmovm.x &0xc0,EXC_FP0(%a6) 1687 1688 fmov.l &0x0,%fpcr 1689 1690 # 1691 # copy, convert, and tag input argument 1692 # 1693 fmov.d 0x8(%a6),%fp0 1694 fmov.x %fp0,FP_SRC(%a6) 1695 lea FP_SRC(%a6),%a0 1696 bsr.l tag 1697 mov.b %d0,STAG(%a6) 1698 mov.b %d0,%d1 1699 1700 andi.l &0x00ff00ff,USER_FPSR 1701 1702 clr.l %d0 1703 mov.b FPCR_MODE(%a6),%d0 1704 1705 mov.b %d1,STAG(%a6) 1706 tst.b %d1 1707 bne.b _L6_2d 1708 bsr.l satan 1709 bra.b _L6_6d 1710 _L6_2d: 1711 cmpi.b %d1,&ZERO 1712 bne.b _L6_3d 1713 bsr.l src_zero 1714 bra.b _L6_6d 1715 _L6_3d: 1716 cmpi.b %d1,&INF 1717 bne.b _L6_4d 1718 bsr.l spi_2 1719 bra.b _L6_6d 1720 _L6_4d: 1721 cmpi.b %d1,&QNAN 1722 bne.b _L6_5d 1723 bsr.l src_qnan 1724 bra.b _L6_6d 1725 _L6_5d: 1726 bsr.l satand 1727 _L6_6d: 1728 1729 # 1730 # Result is now in FP0 1731 # 1732 movm.l EXC_DREGS(%a6),&0x030 1733 fmovm.l USER_FPCR(%a6),%fpcr, 1734 fmovm.x EXC_FP1(%a6),&0x40 1735 unlk %a6 1736 rts 1737 1738 global _fatanx_ 1739 _fatanx_: 1740 link %a6,&-LOCAL_SIZE 1741 1742 movm.l &0x0303,EXC_DREGS(%a6 1743 fmovm.l %fpcr,%fpsr,USER_FPCR 1744 fmovm.x &0xc0,EXC_FP0(%a6) 1745 1746 fmov.l &0x0,%fpcr 1747 1748 # 1749 # copy, convert, and tag input argument 1750 # 1751 lea FP_SRC(%a6),%a0 1752 mov.l 0x8+0x0(%a6),0x0(%a0) 1753 mov.l 0x8+0x4(%a6),0x4(%a0) 1754 mov.l 0x8+0x8(%a6),0x8(%a0) 1755 bsr.l tag 1756 mov.b %d0,STAG(%a6) 1757 mov.b %d0,%d1 1758 1759 andi.l &0x00ff00ff,USER_FPSR 1760 1761 clr.l %d0 1762 mov.b FPCR_MODE(%a6),%d0 1763 1764 tst.b %d1 1765 bne.b _L6_2x 1766 bsr.l satan 1767 bra.b _L6_6x 1768 _L6_2x: 1769 cmpi.b %d1,&ZERO 1770 bne.b _L6_3x 1771 bsr.l src_zero 1772 bra.b _L6_6x 1773 _L6_3x: 1774 cmpi.b %d1,&INF 1775 bne.b _L6_4x 1776 bsr.l spi_2 1777 bra.b _L6_6x 1778 _L6_4x: 1779 cmpi.b %d1,&QNAN 1780 bne.b _L6_5x 1781 bsr.l src_qnan 1782 bra.b _L6_6x 1783 _L6_5x: 1784 bsr.l satand 1785 _L6_6x: 1786 1787 # 1788 # Result is now in FP0 1789 # 1790 movm.l EXC_DREGS(%a6),&0x030 1791 fmovm.l USER_FPCR(%a6),%fpcr, 1792 fmovm.x EXC_FP1(%a6),&0x40 1793 unlk %a6 1794 rts 1795 1796 1797 ############################################# 1798 # MONADIC TEMPLATE 1799 ############################################# 1800 global _fasins_ 1801 _fasins_: 1802 link %a6,&-LOCAL_SIZE 1803 1804 movm.l &0x0303,EXC_DREGS(%a6 1805 fmovm.l %fpcr,%fpsr,USER_FPCR 1806 fmovm.x &0xc0,EXC_FP0(%a6) 1807 1808 fmov.l &0x0,%fpcr 1809 1810 # 1811 # copy, convert, and tag input argument 1812 # 1813 fmov.s 0x8(%a6),%fp0 1814 fmov.x %fp0,FP_SRC(%a6) 1815 lea FP_SRC(%a6),%a0 1816 bsr.l tag 1817 mov.b %d0,STAG(%a6) 1818 mov.b %d0,%d1 1819 1820 andi.l &0x00ff00ff,USER_FPSR 1821 1822 clr.l %d0 1823 mov.b FPCR_MODE(%a6),%d0 1824 1825 tst.b %d1 1826 bne.b _L7_2s 1827 bsr.l sasin 1828 bra.b _L7_6s 1829 _L7_2s: 1830 cmpi.b %d1,&ZERO 1831 bne.b _L7_3s 1832 bsr.l src_zero 1833 bra.b _L7_6s 1834 _L7_3s: 1835 cmpi.b %d1,&INF 1836 bne.b _L7_4s 1837 bsr.l t_operr 1838 bra.b _L7_6s 1839 _L7_4s: 1840 cmpi.b %d1,&QNAN 1841 bne.b _L7_5s 1842 bsr.l src_qnan 1843 bra.b _L7_6s 1844 _L7_5s: 1845 bsr.l sasind 1846 _L7_6s: 1847 1848 # 1849 # Result is now in FP0 1850 # 1851 movm.l EXC_DREGS(%a6),&0x030 1852 fmovm.l USER_FPCR(%a6),%fpcr, 1853 fmovm.x EXC_FP1(%a6),&0x40 1854 unlk %a6 1855 rts 1856 1857 global _fasind_ 1858 _fasind_: 1859 link %a6,&-LOCAL_SIZE 1860 1861 movm.l &0x0303,EXC_DREGS(%a6 1862 fmovm.l %fpcr,%fpsr,USER_FPCR 1863 fmovm.x &0xc0,EXC_FP0(%a6) 1864 1865 fmov.l &0x0,%fpcr 1866 1867 # 1868 # copy, convert, and tag input argument 1869 # 1870 fmov.d 0x8(%a6),%fp0 1871 fmov.x %fp0,FP_SRC(%a6) 1872 lea FP_SRC(%a6),%a0 1873 bsr.l tag 1874 mov.b %d0,STAG(%a6) 1875 mov.b %d0,%d1 1876 1877 andi.l &0x00ff00ff,USER_FPSR 1878 1879 clr.l %d0 1880 mov.b FPCR_MODE(%a6),%d0 1881 1882 mov.b %d1,STAG(%a6) 1883 tst.b %d1 1884 bne.b _L7_2d 1885 bsr.l sasin 1886 bra.b _L7_6d 1887 _L7_2d: 1888 cmpi.b %d1,&ZERO 1889 bne.b _L7_3d 1890 bsr.l src_zero 1891 bra.b _L7_6d 1892 _L7_3d: 1893 cmpi.b %d1,&INF 1894 bne.b _L7_4d 1895 bsr.l t_operr 1896 bra.b _L7_6d 1897 _L7_4d: 1898 cmpi.b %d1,&QNAN 1899 bne.b _L7_5d 1900 bsr.l src_qnan 1901 bra.b _L7_6d 1902 _L7_5d: 1903 bsr.l sasind 1904 _L7_6d: 1905 1906 # 1907 # Result is now in FP0 1908 # 1909 movm.l EXC_DREGS(%a6),&0x030 1910 fmovm.l USER_FPCR(%a6),%fpcr, 1911 fmovm.x EXC_FP1(%a6),&0x40 1912 unlk %a6 1913 rts 1914 1915 global _fasinx_ 1916 _fasinx_: 1917 link %a6,&-LOCAL_SIZE 1918 1919 movm.l &0x0303,EXC_DREGS(%a6 1920 fmovm.l %fpcr,%fpsr,USER_FPCR 1921 fmovm.x &0xc0,EXC_FP0(%a6) 1922 1923 fmov.l &0x0,%fpcr 1924 1925 # 1926 # copy, convert, and tag input argument 1927 # 1928 lea FP_SRC(%a6),%a0 1929 mov.l 0x8+0x0(%a6),0x0(%a0) 1930 mov.l 0x8+0x4(%a6),0x4(%a0) 1931 mov.l 0x8+0x8(%a6),0x8(%a0) 1932 bsr.l tag 1933 mov.b %d0,STAG(%a6) 1934 mov.b %d0,%d1 1935 1936 andi.l &0x00ff00ff,USER_FPSR 1937 1938 clr.l %d0 1939 mov.b FPCR_MODE(%a6),%d0 1940 1941 tst.b %d1 1942 bne.b _L7_2x 1943 bsr.l sasin 1944 bra.b _L7_6x 1945 _L7_2x: 1946 cmpi.b %d1,&ZERO 1947 bne.b _L7_3x 1948 bsr.l src_zero 1949 bra.b _L7_6x 1950 _L7_3x: 1951 cmpi.b %d1,&INF 1952 bne.b _L7_4x 1953 bsr.l t_operr 1954 bra.b _L7_6x 1955 _L7_4x: 1956 cmpi.b %d1,&QNAN 1957 bne.b _L7_5x 1958 bsr.l src_qnan 1959 bra.b _L7_6x 1960 _L7_5x: 1961 bsr.l sasind 1962 _L7_6x: 1963 1964 # 1965 # Result is now in FP0 1966 # 1967 movm.l EXC_DREGS(%a6),&0x030 1968 fmovm.l USER_FPCR(%a6),%fpcr, 1969 fmovm.x EXC_FP1(%a6),&0x40 1970 unlk %a6 1971 rts 1972 1973 1974 ############################################# 1975 # MONADIC TEMPLATE 1976 ############################################# 1977 global _fatanhs_ 1978 _fatanhs_: 1979 link %a6,&-LOCAL_SIZE 1980 1981 movm.l &0x0303,EXC_DREGS(%a6 1982 fmovm.l %fpcr,%fpsr,USER_FPCR 1983 fmovm.x &0xc0,EXC_FP0(%a6) 1984 1985 fmov.l &0x0,%fpcr 1986 1987 # 1988 # copy, convert, and tag input argument 1989 # 1990 fmov.s 0x8(%a6),%fp0 1991 fmov.x %fp0,FP_SRC(%a6) 1992 lea FP_SRC(%a6),%a0 1993 bsr.l tag 1994 mov.b %d0,STAG(%a6) 1995 mov.b %d0,%d1 1996 1997 andi.l &0x00ff00ff,USER_FPSR 1998 1999 clr.l %d0 2000 mov.b FPCR_MODE(%a6),%d0 2001 2002 tst.b %d1 2003 bne.b _L8_2s 2004 bsr.l satanh 2005 bra.b _L8_6s 2006 _L8_2s: 2007 cmpi.b %d1,&ZERO 2008 bne.b _L8_3s 2009 bsr.l src_zero 2010 bra.b _L8_6s 2011 _L8_3s: 2012 cmpi.b %d1,&INF 2013 bne.b _L8_4s 2014 bsr.l t_operr 2015 bra.b _L8_6s 2016 _L8_4s: 2017 cmpi.b %d1,&QNAN 2018 bne.b _L8_5s 2019 bsr.l src_qnan 2020 bra.b _L8_6s 2021 _L8_5s: 2022 bsr.l satanhd 2023 _L8_6s: 2024 2025 # 2026 # Result is now in FP0 2027 # 2028 movm.l EXC_DREGS(%a6),&0x030 2029 fmovm.l USER_FPCR(%a6),%fpcr, 2030 fmovm.x EXC_FP1(%a6),&0x40 2031 unlk %a6 2032 rts 2033 2034 global _fatanhd_ 2035 _fatanhd_: 2036 link %a6,&-LOCAL_SIZE 2037 2038 movm.l &0x0303,EXC_DREGS(%a6 2039 fmovm.l %fpcr,%fpsr,USER_FPCR 2040 fmovm.x &0xc0,EXC_FP0(%a6) 2041 2042 fmov.l &0x0,%fpcr 2043 2044 # 2045 # copy, convert, and tag input argument 2046 # 2047 fmov.d 0x8(%a6),%fp0 2048 fmov.x %fp0,FP_SRC(%a6) 2049 lea FP_SRC(%a6),%a0 2050 bsr.l tag 2051 mov.b %d0,STAG(%a6) 2052 mov.b %d0,%d1 2053 2054 andi.l &0x00ff00ff,USER_FPSR 2055 2056 clr.l %d0 2057 mov.b FPCR_MODE(%a6),%d0 2058 2059 mov.b %d1,STAG(%a6) 2060 tst.b %d1 2061 bne.b _L8_2d 2062 bsr.l satanh 2063 bra.b _L8_6d 2064 _L8_2d: 2065 cmpi.b %d1,&ZERO 2066 bne.b _L8_3d 2067 bsr.l src_zero 2068 bra.b _L8_6d 2069 _L8_3d: 2070 cmpi.b %d1,&INF 2071 bne.b _L8_4d 2072 bsr.l t_operr 2073 bra.b _L8_6d 2074 _L8_4d: 2075 cmpi.b %d1,&QNAN 2076 bne.b _L8_5d 2077 bsr.l src_qnan 2078 bra.b _L8_6d 2079 _L8_5d: 2080 bsr.l satanhd 2081 _L8_6d: 2082 2083 # 2084 # Result is now in FP0 2085 # 2086 movm.l EXC_DREGS(%a6),&0x030 2087 fmovm.l USER_FPCR(%a6),%fpcr, 2088 fmovm.x EXC_FP1(%a6),&0x40 2089 unlk %a6 2090 rts 2091 2092 global _fatanhx_ 2093 _fatanhx_: 2094 link %a6,&-LOCAL_SIZE 2095 2096 movm.l &0x0303,EXC_DREGS(%a6 2097 fmovm.l %fpcr,%fpsr,USER_FPCR 2098 fmovm.x &0xc0,EXC_FP0(%a6) 2099 2100 fmov.l &0x0,%fpcr 2101 2102 # 2103 # copy, convert, and tag input argument 2104 # 2105 lea FP_SRC(%a6),%a0 2106 mov.l 0x8+0x0(%a6),0x0(%a0) 2107 mov.l 0x8+0x4(%a6),0x4(%a0) 2108 mov.l 0x8+0x8(%a6),0x8(%a0) 2109 bsr.l tag 2110 mov.b %d0,STAG(%a6) 2111 mov.b %d0,%d1 2112 2113 andi.l &0x00ff00ff,USER_FPSR 2114 2115 clr.l %d0 2116 mov.b FPCR_MODE(%a6),%d0 2117 2118 tst.b %d1 2119 bne.b _L8_2x 2120 bsr.l satanh 2121 bra.b _L8_6x 2122 _L8_2x: 2123 cmpi.b %d1,&ZERO 2124 bne.b _L8_3x 2125 bsr.l src_zero 2126 bra.b _L8_6x 2127 _L8_3x: 2128 cmpi.b %d1,&INF 2129 bne.b _L8_4x 2130 bsr.l t_operr 2131 bra.b _L8_6x 2132 _L8_4x: 2133 cmpi.b %d1,&QNAN 2134 bne.b _L8_5x 2135 bsr.l src_qnan 2136 bra.b _L8_6x 2137 _L8_5x: 2138 bsr.l satanhd 2139 _L8_6x: 2140 2141 # 2142 # Result is now in FP0 2143 # 2144 movm.l EXC_DREGS(%a6),&0x030 2145 fmovm.l USER_FPCR(%a6),%fpcr, 2146 fmovm.x EXC_FP1(%a6),&0x40 2147 unlk %a6 2148 rts 2149 2150 2151 ############################################# 2152 # MONADIC TEMPLATE 2153 ############################################# 2154 global _ftans_ 2155 _ftans_: 2156 link %a6,&-LOCAL_SIZE 2157 2158 movm.l &0x0303,EXC_DREGS(%a6 2159 fmovm.l %fpcr,%fpsr,USER_FPCR 2160 fmovm.x &0xc0,EXC_FP0(%a6) 2161 2162 fmov.l &0x0,%fpcr 2163 2164 # 2165 # copy, convert, and tag input argument 2166 # 2167 fmov.s 0x8(%a6),%fp0 2168 fmov.x %fp0,FP_SRC(%a6) 2169 lea FP_SRC(%a6),%a0 2170 bsr.l tag 2171 mov.b %d0,STAG(%a6) 2172 mov.b %d0,%d1 2173 2174 andi.l &0x00ff00ff,USER_FPSR 2175 2176 clr.l %d0 2177 mov.b FPCR_MODE(%a6),%d0 2178 2179 tst.b %d1 2180 bne.b _L9_2s 2181 bsr.l stan 2182 bra.b _L9_6s 2183 _L9_2s: 2184 cmpi.b %d1,&ZERO 2185 bne.b _L9_3s 2186 bsr.l src_zero 2187 bra.b _L9_6s 2188 _L9_3s: 2189 cmpi.b %d1,&INF 2190 bne.b _L9_4s 2191 bsr.l t_operr 2192 bra.b _L9_6s 2193 _L9_4s: 2194 cmpi.b %d1,&QNAN 2195 bne.b _L9_5s 2196 bsr.l src_qnan 2197 bra.b _L9_6s 2198 _L9_5s: 2199 bsr.l stand 2200 _L9_6s: 2201 2202 # 2203 # Result is now in FP0 2204 # 2205 movm.l EXC_DREGS(%a6),&0x030 2206 fmovm.l USER_FPCR(%a6),%fpcr, 2207 fmovm.x EXC_FP1(%a6),&0x40 2208 unlk %a6 2209 rts 2210 2211 global _ftand_ 2212 _ftand_: 2213 link %a6,&-LOCAL_SIZE 2214 2215 movm.l &0x0303,EXC_DREGS(%a6 2216 fmovm.l %fpcr,%fpsr,USER_FPCR 2217 fmovm.x &0xc0,EXC_FP0(%a6) 2218 2219 fmov.l &0x0,%fpcr 2220 2221 # 2222 # copy, convert, and tag input argument 2223 # 2224 fmov.d 0x8(%a6),%fp0 2225 fmov.x %fp0,FP_SRC(%a6) 2226 lea FP_SRC(%a6),%a0 2227 bsr.l tag 2228 mov.b %d0,STAG(%a6) 2229 mov.b %d0,%d1 2230 2231 andi.l &0x00ff00ff,USER_FPSR 2232 2233 clr.l %d0 2234 mov.b FPCR_MODE(%a6),%d0 2235 2236 mov.b %d1,STAG(%a6) 2237 tst.b %d1 2238 bne.b _L9_2d 2239 bsr.l stan 2240 bra.b _L9_6d 2241 _L9_2d: 2242 cmpi.b %d1,&ZERO 2243 bne.b _L9_3d 2244 bsr.l src_zero 2245 bra.b _L9_6d 2246 _L9_3d: 2247 cmpi.b %d1,&INF 2248 bne.b _L9_4d 2249 bsr.l t_operr 2250 bra.b _L9_6d 2251 _L9_4d: 2252 cmpi.b %d1,&QNAN 2253 bne.b _L9_5d 2254 bsr.l src_qnan 2255 bra.b _L9_6d 2256 _L9_5d: 2257 bsr.l stand 2258 _L9_6d: 2259 2260 # 2261 # Result is now in FP0 2262 # 2263 movm.l EXC_DREGS(%a6),&0x030 2264 fmovm.l USER_FPCR(%a6),%fpcr, 2265 fmovm.x EXC_FP1(%a6),&0x40 2266 unlk %a6 2267 rts 2268 2269 global _ftanx_ 2270 _ftanx_: 2271 link %a6,&-LOCAL_SIZE 2272 2273 movm.l &0x0303,EXC_DREGS(%a6 2274 fmovm.l %fpcr,%fpsr,USER_FPCR 2275 fmovm.x &0xc0,EXC_FP0(%a6) 2276 2277 fmov.l &0x0,%fpcr 2278 2279 # 2280 # copy, convert, and tag input argument 2281 # 2282 lea FP_SRC(%a6),%a0 2283 mov.l 0x8+0x0(%a6),0x0(%a0) 2284 mov.l 0x8+0x4(%a6),0x4(%a0) 2285 mov.l 0x8+0x8(%a6),0x8(%a0) 2286 bsr.l tag 2287 mov.b %d0,STAG(%a6) 2288 mov.b %d0,%d1 2289 2290 andi.l &0x00ff00ff,USER_FPSR 2291 2292 clr.l %d0 2293 mov.b FPCR_MODE(%a6),%d0 2294 2295 tst.b %d1 2296 bne.b _L9_2x 2297 bsr.l stan 2298 bra.b _L9_6x 2299 _L9_2x: 2300 cmpi.b %d1,&ZERO 2301 bne.b _L9_3x 2302 bsr.l src_zero 2303 bra.b _L9_6x 2304 _L9_3x: 2305 cmpi.b %d1,&INF 2306 bne.b _L9_4x 2307 bsr.l t_operr 2308 bra.b _L9_6x 2309 _L9_4x: 2310 cmpi.b %d1,&QNAN 2311 bne.b _L9_5x 2312 bsr.l src_qnan 2313 bra.b _L9_6x 2314 _L9_5x: 2315 bsr.l stand 2316 _L9_6x: 2317 2318 # 2319 # Result is now in FP0 2320 # 2321 movm.l EXC_DREGS(%a6),&0x030 2322 fmovm.l USER_FPCR(%a6),%fpcr, 2323 fmovm.x EXC_FP1(%a6),&0x40 2324 unlk %a6 2325 rts 2326 2327 2328 ############################################# 2329 # MONADIC TEMPLATE 2330 ############################################# 2331 global _fetoxs_ 2332 _fetoxs_: 2333 link %a6,&-LOCAL_SIZE 2334 2335 movm.l &0x0303,EXC_DREGS(%a6 2336 fmovm.l %fpcr,%fpsr,USER_FPCR 2337 fmovm.x &0xc0,EXC_FP0(%a6) 2338 2339 fmov.l &0x0,%fpcr 2340 2341 # 2342 # copy, convert, and tag input argument 2343 # 2344 fmov.s 0x8(%a6),%fp0 2345 fmov.x %fp0,FP_SRC(%a6) 2346 lea FP_SRC(%a6),%a0 2347 bsr.l tag 2348 mov.b %d0,STAG(%a6) 2349 mov.b %d0,%d1 2350 2351 andi.l &0x00ff00ff,USER_FPSR 2352 2353 clr.l %d0 2354 mov.b FPCR_MODE(%a6),%d0 2355 2356 tst.b %d1 2357 bne.b _L10_2s 2358 bsr.l setox 2359 bra.b _L10_6s 2360 _L10_2s: 2361 cmpi.b %d1,&ZERO 2362 bne.b _L10_3s 2363 bsr.l ld_pone 2364 bra.b _L10_6s 2365 _L10_3s: 2366 cmpi.b %d1,&INF 2367 bne.b _L10_4s 2368 bsr.l szr_inf 2369 bra.b _L10_6s 2370 _L10_4s: 2371 cmpi.b %d1,&QNAN 2372 bne.b _L10_5s 2373 bsr.l src_qnan 2374 bra.b _L10_6s 2375 _L10_5s: 2376 bsr.l setoxd 2377 _L10_6s: 2378 2379 # 2380 # Result is now in FP0 2381 # 2382 movm.l EXC_DREGS(%a6),&0x030 2383 fmovm.l USER_FPCR(%a6),%fpcr, 2384 fmovm.x EXC_FP1(%a6),&0x40 2385 unlk %a6 2386 rts 2387 2388 global _fetoxd_ 2389 _fetoxd_: 2390 link %a6,&-LOCAL_SIZE 2391 2392 movm.l &0x0303,EXC_DREGS(%a6 2393 fmovm.l %fpcr,%fpsr,USER_FPCR 2394 fmovm.x &0xc0,EXC_FP0(%a6) 2395 2396 fmov.l &0x0,%fpcr 2397 2398 # 2399 # copy, convert, and tag input argument 2400 # 2401 fmov.d 0x8(%a6),%fp0 2402 fmov.x %fp0,FP_SRC(%a6) 2403 lea FP_SRC(%a6),%a0 2404 bsr.l tag 2405 mov.b %d0,STAG(%a6) 2406 mov.b %d0,%d1 2407 2408 andi.l &0x00ff00ff,USER_FPSR 2409 2410 clr.l %d0 2411 mov.b FPCR_MODE(%a6),%d0 2412 2413 mov.b %d1,STAG(%a6) 2414 tst.b %d1 2415 bne.b _L10_2d 2416 bsr.l setox 2417 bra.b _L10_6d 2418 _L10_2d: 2419 cmpi.b %d1,&ZERO 2420 bne.b _L10_3d 2421 bsr.l ld_pone 2422 bra.b _L10_6d 2423 _L10_3d: 2424 cmpi.b %d1,&INF 2425 bne.b _L10_4d 2426 bsr.l szr_inf 2427 bra.b _L10_6d 2428 _L10_4d: 2429 cmpi.b %d1,&QNAN 2430 bne.b _L10_5d 2431 bsr.l src_qnan 2432 bra.b _L10_6d 2433 _L10_5d: 2434 bsr.l setoxd 2435 _L10_6d: 2436 2437 # 2438 # Result is now in FP0 2439 # 2440 movm.l EXC_DREGS(%a6),&0x030 2441 fmovm.l USER_FPCR(%a6),%fpcr, 2442 fmovm.x EXC_FP1(%a6),&0x40 2443 unlk %a6 2444 rts 2445 2446 global _fetoxx_ 2447 _fetoxx_: 2448 link %a6,&-LOCAL_SIZE 2449 2450 movm.l &0x0303,EXC_DREGS(%a6 2451 fmovm.l %fpcr,%fpsr,USER_FPCR 2452 fmovm.x &0xc0,EXC_FP0(%a6) 2453 2454 fmov.l &0x0,%fpcr 2455 2456 # 2457 # copy, convert, and tag input argument 2458 # 2459 lea FP_SRC(%a6),%a0 2460 mov.l 0x8+0x0(%a6),0x0(%a0) 2461 mov.l 0x8+0x4(%a6),0x4(%a0) 2462 mov.l 0x8+0x8(%a6),0x8(%a0) 2463 bsr.l tag 2464 mov.b %d0,STAG(%a6) 2465 mov.b %d0,%d1 2466 2467 andi.l &0x00ff00ff,USER_FPSR 2468 2469 clr.l %d0 2470 mov.b FPCR_MODE(%a6),%d0 2471 2472 tst.b %d1 2473 bne.b _L10_2x 2474 bsr.l setox 2475 bra.b _L10_6x 2476 _L10_2x: 2477 cmpi.b %d1,&ZERO 2478 bne.b _L10_3x 2479 bsr.l ld_pone 2480 bra.b _L10_6x 2481 _L10_3x: 2482 cmpi.b %d1,&INF 2483 bne.b _L10_4x 2484 bsr.l szr_inf 2485 bra.b _L10_6x 2486 _L10_4x: 2487 cmpi.b %d1,&QNAN 2488 bne.b _L10_5x 2489 bsr.l src_qnan 2490 bra.b _L10_6x 2491 _L10_5x: 2492 bsr.l setoxd 2493 _L10_6x: 2494 2495 # 2496 # Result is now in FP0 2497 # 2498 movm.l EXC_DREGS(%a6),&0x030 2499 fmovm.l USER_FPCR(%a6),%fpcr, 2500 fmovm.x EXC_FP1(%a6),&0x40 2501 unlk %a6 2502 rts 2503 2504 2505 ############################################# 2506 # MONADIC TEMPLATE 2507 ############################################# 2508 global _ftwotoxs_ 2509 _ftwotoxs_: 2510 link %a6,&-LOCAL_SIZE 2511 2512 movm.l &0x0303,EXC_DREGS(%a6 2513 fmovm.l %fpcr,%fpsr,USER_FPCR 2514 fmovm.x &0xc0,EXC_FP0(%a6) 2515 2516 fmov.l &0x0,%fpcr 2517 2518 # 2519 # copy, convert, and tag input argument 2520 # 2521 fmov.s 0x8(%a6),%fp0 2522 fmov.x %fp0,FP_SRC(%a6) 2523 lea FP_SRC(%a6),%a0 2524 bsr.l tag 2525 mov.b %d0,STAG(%a6) 2526 mov.b %d0,%d1 2527 2528 andi.l &0x00ff00ff,USER_FPSR 2529 2530 clr.l %d0 2531 mov.b FPCR_MODE(%a6),%d0 2532 2533 tst.b %d1 2534 bne.b _L11_2s 2535 bsr.l stwotox 2536 bra.b _L11_6s 2537 _L11_2s: 2538 cmpi.b %d1,&ZERO 2539 bne.b _L11_3s 2540 bsr.l ld_pone 2541 bra.b _L11_6s 2542 _L11_3s: 2543 cmpi.b %d1,&INF 2544 bne.b _L11_4s 2545 bsr.l szr_inf 2546 bra.b _L11_6s 2547 _L11_4s: 2548 cmpi.b %d1,&QNAN 2549 bne.b _L11_5s 2550 bsr.l src_qnan 2551 bra.b _L11_6s 2552 _L11_5s: 2553 bsr.l stwotoxd 2554 _L11_6s: 2555 2556 # 2557 # Result is now in FP0 2558 # 2559 movm.l EXC_DREGS(%a6),&0x030 2560 fmovm.l USER_FPCR(%a6),%fpcr, 2561 fmovm.x EXC_FP1(%a6),&0x40 2562 unlk %a6 2563 rts 2564 2565 global _ftwotoxd_ 2566 _ftwotoxd_: 2567 link %a6,&-LOCAL_SIZE 2568 2569 movm.l &0x0303,EXC_DREGS(%a6 2570 fmovm.l %fpcr,%fpsr,USER_FPCR 2571 fmovm.x &0xc0,EXC_FP0(%a6) 2572 2573 fmov.l &0x0,%fpcr 2574 2575 # 2576 # copy, convert, and tag input argument 2577 # 2578 fmov.d 0x8(%a6),%fp0 2579 fmov.x %fp0,FP_SRC(%a6) 2580 lea FP_SRC(%a6),%a0 2581 bsr.l tag 2582 mov.b %d0,STAG(%a6) 2583 mov.b %d0,%d1 2584 2585 andi.l &0x00ff00ff,USER_FPSR 2586 2587 clr.l %d0 2588 mov.b FPCR_MODE(%a6),%d0 2589 2590 mov.b %d1,STAG(%a6) 2591 tst.b %d1 2592 bne.b _L11_2d 2593 bsr.l stwotox 2594 bra.b _L11_6d 2595 _L11_2d: 2596 cmpi.b %d1,&ZERO 2597 bne.b _L11_3d 2598 bsr.l ld_pone 2599 bra.b _L11_6d 2600 _L11_3d: 2601 cmpi.b %d1,&INF 2602 bne.b _L11_4d 2603 bsr.l szr_inf 2604 bra.b _L11_6d 2605 _L11_4d: 2606 cmpi.b %d1,&QNAN 2607 bne.b _L11_5d 2608 bsr.l src_qnan 2609 bra.b _L11_6d 2610 _L11_5d: 2611 bsr.l stwotoxd 2612 _L11_6d: 2613 2614 # 2615 # Result is now in FP0 2616 # 2617 movm.l EXC_DREGS(%a6),&0x030 2618 fmovm.l USER_FPCR(%a6),%fpcr, 2619 fmovm.x EXC_FP1(%a6),&0x40 2620 unlk %a6 2621 rts 2622 2623 global _ftwotoxx_ 2624 _ftwotoxx_: 2625 link %a6,&-LOCAL_SIZE 2626 2627 movm.l &0x0303,EXC_DREGS(%a6 2628 fmovm.l %fpcr,%fpsr,USER_FPCR 2629 fmovm.x &0xc0,EXC_FP0(%a6) 2630 2631 fmov.l &0x0,%fpcr 2632 2633 # 2634 # copy, convert, and tag input argument 2635 # 2636 lea FP_SRC(%a6),%a0 2637 mov.l 0x8+0x0(%a6),0x0(%a0) 2638 mov.l 0x8+0x4(%a6),0x4(%a0) 2639 mov.l 0x8+0x8(%a6),0x8(%a0) 2640 bsr.l tag 2641 mov.b %d0,STAG(%a6) 2642 mov.b %d0,%d1 2643 2644 andi.l &0x00ff00ff,USER_FPSR 2645 2646 clr.l %d0 2647 mov.b FPCR_MODE(%a6),%d0 2648 2649 tst.b %d1 2650 bne.b _L11_2x 2651 bsr.l stwotox 2652 bra.b _L11_6x 2653 _L11_2x: 2654 cmpi.b %d1,&ZERO 2655 bne.b _L11_3x 2656 bsr.l ld_pone 2657 bra.b _L11_6x 2658 _L11_3x: 2659 cmpi.b %d1,&INF 2660 bne.b _L11_4x 2661 bsr.l szr_inf 2662 bra.b _L11_6x 2663 _L11_4x: 2664 cmpi.b %d1,&QNAN 2665 bne.b _L11_5x 2666 bsr.l src_qnan 2667 bra.b _L11_6x 2668 _L11_5x: 2669 bsr.l stwotoxd 2670 _L11_6x: 2671 2672 # 2673 # Result is now in FP0 2674 # 2675 movm.l EXC_DREGS(%a6),&0x030 2676 fmovm.l USER_FPCR(%a6),%fpcr, 2677 fmovm.x EXC_FP1(%a6),&0x40 2678 unlk %a6 2679 rts 2680 2681 2682 ############################################# 2683 # MONADIC TEMPLATE 2684 ############################################# 2685 global _ftentoxs_ 2686 _ftentoxs_: 2687 link %a6,&-LOCAL_SIZE 2688 2689 movm.l &0x0303,EXC_DREGS(%a6 2690 fmovm.l %fpcr,%fpsr,USER_FPCR 2691 fmovm.x &0xc0,EXC_FP0(%a6) 2692 2693 fmov.l &0x0,%fpcr 2694 2695 # 2696 # copy, convert, and tag input argument 2697 # 2698 fmov.s 0x8(%a6),%fp0 2699 fmov.x %fp0,FP_SRC(%a6) 2700 lea FP_SRC(%a6),%a0 2701 bsr.l tag 2702 mov.b %d0,STAG(%a6) 2703 mov.b %d0,%d1 2704 2705 andi.l &0x00ff00ff,USER_FPSR 2706 2707 clr.l %d0 2708 mov.b FPCR_MODE(%a6),%d0 2709 2710 tst.b %d1 2711 bne.b _L12_2s 2712 bsr.l stentox 2713 bra.b _L12_6s 2714 _L12_2s: 2715 cmpi.b %d1,&ZERO 2716 bne.b _L12_3s 2717 bsr.l ld_pone 2718 bra.b _L12_6s 2719 _L12_3s: 2720 cmpi.b %d1,&INF 2721 bne.b _L12_4s 2722 bsr.l szr_inf 2723 bra.b _L12_6s 2724 _L12_4s: 2725 cmpi.b %d1,&QNAN 2726 bne.b _L12_5s 2727 bsr.l src_qnan 2728 bra.b _L12_6s 2729 _L12_5s: 2730 bsr.l stentoxd 2731 _L12_6s: 2732 2733 # 2734 # Result is now in FP0 2735 # 2736 movm.l EXC_DREGS(%a6),&0x030 2737 fmovm.l USER_FPCR(%a6),%fpcr, 2738 fmovm.x EXC_FP1(%a6),&0x40 2739 unlk %a6 2740 rts 2741 2742 global _ftentoxd_ 2743 _ftentoxd_: 2744 link %a6,&-LOCAL_SIZE 2745 2746 movm.l &0x0303,EXC_DREGS(%a6 2747 fmovm.l %fpcr,%fpsr,USER_FPCR 2748 fmovm.x &0xc0,EXC_FP0(%a6) 2749 2750 fmov.l &0x0,%fpcr 2751 2752 # 2753 # copy, convert, and tag input argument 2754 # 2755 fmov.d 0x8(%a6),%fp0 2756 fmov.x %fp0,FP_SRC(%a6) 2757 lea FP_SRC(%a6),%a0 2758 bsr.l tag 2759 mov.b %d0,STAG(%a6) 2760 mov.b %d0,%d1 2761 2762 andi.l &0x00ff00ff,USER_FPSR 2763 2764 clr.l %d0 2765 mov.b FPCR_MODE(%a6),%d0 2766 2767 mov.b %d1,STAG(%a6) 2768 tst.b %d1 2769 bne.b _L12_2d 2770 bsr.l stentox 2771 bra.b _L12_6d 2772 _L12_2d: 2773 cmpi.b %d1,&ZERO 2774 bne.b _L12_3d 2775 bsr.l ld_pone 2776 bra.b _L12_6d 2777 _L12_3d: 2778 cmpi.b %d1,&INF 2779 bne.b _L12_4d 2780 bsr.l szr_inf 2781 bra.b _L12_6d 2782 _L12_4d: 2783 cmpi.b %d1,&QNAN 2784 bne.b _L12_5d 2785 bsr.l src_qnan 2786 bra.b _L12_6d 2787 _L12_5d: 2788 bsr.l stentoxd 2789 _L12_6d: 2790 2791 # 2792 # Result is now in FP0 2793 # 2794 movm.l EXC_DREGS(%a6),&0x030 2795 fmovm.l USER_FPCR(%a6),%fpcr, 2796 fmovm.x EXC_FP1(%a6),&0x40 2797 unlk %a6 2798 rts 2799 2800 global _ftentoxx_ 2801 _ftentoxx_: 2802 link %a6,&-LOCAL_SIZE 2803 2804 movm.l &0x0303,EXC_DREGS(%a6 2805 fmovm.l %fpcr,%fpsr,USER_FPCR 2806 fmovm.x &0xc0,EXC_FP0(%a6) 2807 2808 fmov.l &0x0,%fpcr 2809 2810 # 2811 # copy, convert, and tag input argument 2812 # 2813 lea FP_SRC(%a6),%a0 2814 mov.l 0x8+0x0(%a6),0x0(%a0) 2815 mov.l 0x8+0x4(%a6),0x4(%a0) 2816 mov.l 0x8+0x8(%a6),0x8(%a0) 2817 bsr.l tag 2818 mov.b %d0,STAG(%a6) 2819 mov.b %d0,%d1 2820 2821 andi.l &0x00ff00ff,USER_FPSR 2822 2823 clr.l %d0 2824 mov.b FPCR_MODE(%a6),%d0 2825 2826 tst.b %d1 2827 bne.b _L12_2x 2828 bsr.l stentox 2829 bra.b _L12_6x 2830 _L12_2x: 2831 cmpi.b %d1,&ZERO 2832 bne.b _L12_3x 2833 bsr.l ld_pone 2834 bra.b _L12_6x 2835 _L12_3x: 2836 cmpi.b %d1,&INF 2837 bne.b _L12_4x 2838 bsr.l szr_inf 2839 bra.b _L12_6x 2840 _L12_4x: 2841 cmpi.b %d1,&QNAN 2842 bne.b _L12_5x 2843 bsr.l src_qnan 2844 bra.b _L12_6x 2845 _L12_5x: 2846 bsr.l stentoxd 2847 _L12_6x: 2848 2849 # 2850 # Result is now in FP0 2851 # 2852 movm.l EXC_DREGS(%a6),&0x030 2853 fmovm.l USER_FPCR(%a6),%fpcr, 2854 fmovm.x EXC_FP1(%a6),&0x40 2855 unlk %a6 2856 rts 2857 2858 2859 ############################################# 2860 # MONADIC TEMPLATE 2861 ############################################# 2862 global _flogns_ 2863 _flogns_: 2864 link %a6,&-LOCAL_SIZE 2865 2866 movm.l &0x0303,EXC_DREGS(%a6 2867 fmovm.l %fpcr,%fpsr,USER_FPCR 2868 fmovm.x &0xc0,EXC_FP0(%a6) 2869 2870 fmov.l &0x0,%fpcr 2871 2872 # 2873 # copy, convert, and tag input argument 2874 # 2875 fmov.s 0x8(%a6),%fp0 2876 fmov.x %fp0,FP_SRC(%a6) 2877 lea FP_SRC(%a6),%a0 2878 bsr.l tag 2879 mov.b %d0,STAG(%a6) 2880 mov.b %d0,%d1 2881 2882 andi.l &0x00ff00ff,USER_FPSR 2883 2884 clr.l %d0 2885 mov.b FPCR_MODE(%a6),%d0 2886 2887 tst.b %d1 2888 bne.b _L13_2s 2889 bsr.l slogn 2890 bra.b _L13_6s 2891 _L13_2s: 2892 cmpi.b %d1,&ZERO 2893 bne.b _L13_3s 2894 bsr.l t_dz2 2895 bra.b _L13_6s 2896 _L13_3s: 2897 cmpi.b %d1,&INF 2898 bne.b _L13_4s 2899 bsr.l sopr_inf 2900 bra.b _L13_6s 2901 _L13_4s: 2902 cmpi.b %d1,&QNAN 2903 bne.b _L13_5s 2904 bsr.l src_qnan 2905 bra.b _L13_6s 2906 _L13_5s: 2907 bsr.l slognd 2908 _L13_6s: 2909 2910 # 2911 # Result is now in FP0 2912 # 2913 movm.l EXC_DREGS(%a6),&0x030 2914 fmovm.l USER_FPCR(%a6),%fpcr, 2915 fmovm.x EXC_FP1(%a6),&0x40 2916 unlk %a6 2917 rts 2918 2919 global _flognd_ 2920 _flognd_: 2921 link %a6,&-LOCAL_SIZE 2922 2923 movm.l &0x0303,EXC_DREGS(%a6 2924 fmovm.l %fpcr,%fpsr,USER_FPCR 2925 fmovm.x &0xc0,EXC_FP0(%a6) 2926 2927 fmov.l &0x0,%fpcr 2928 2929 # 2930 # copy, convert, and tag input argument 2931 # 2932 fmov.d 0x8(%a6),%fp0 2933 fmov.x %fp0,FP_SRC(%a6) 2934 lea FP_SRC(%a6),%a0 2935 bsr.l tag 2936 mov.b %d0,STAG(%a6) 2937 mov.b %d0,%d1 2938 2939 andi.l &0x00ff00ff,USER_FPSR 2940 2941 clr.l %d0 2942 mov.b FPCR_MODE(%a6),%d0 2943 2944 mov.b %d1,STAG(%a6) 2945 tst.b %d1 2946 bne.b _L13_2d 2947 bsr.l slogn 2948 bra.b _L13_6d 2949 _L13_2d: 2950 cmpi.b %d1,&ZERO 2951 bne.b _L13_3d 2952 bsr.l t_dz2 2953 bra.b _L13_6d 2954 _L13_3d: 2955 cmpi.b %d1,&INF 2956 bne.b _L13_4d 2957 bsr.l sopr_inf 2958 bra.b _L13_6d 2959 _L13_4d: 2960 cmpi.b %d1,&QNAN 2961 bne.b _L13_5d 2962 bsr.l src_qnan 2963 bra.b _L13_6d 2964 _L13_5d: 2965 bsr.l slognd 2966 _L13_6d: 2967 2968 # 2969 # Result is now in FP0 2970 # 2971 movm.l EXC_DREGS(%a6),&0x030 2972 fmovm.l USER_FPCR(%a6),%fpcr, 2973 fmovm.x EXC_FP1(%a6),&0x40 2974 unlk %a6 2975 rts 2976 2977 global _flognx_ 2978 _flognx_: 2979 link %a6,&-LOCAL_SIZE 2980 2981 movm.l &0x0303,EXC_DREGS(%a6 2982 fmovm.l %fpcr,%fpsr,USER_FPCR 2983 fmovm.x &0xc0,EXC_FP0(%a6) 2984 2985 fmov.l &0x0,%fpcr 2986 2987 # 2988 # copy, convert, and tag input argument 2989 # 2990 lea FP_SRC(%a6),%a0 2991 mov.l 0x8+0x0(%a6),0x0(%a0) 2992 mov.l 0x8+0x4(%a6),0x4(%a0) 2993 mov.l 0x8+0x8(%a6),0x8(%a0) 2994 bsr.l tag 2995 mov.b %d0,STAG(%a6) 2996 mov.b %d0,%d1 2997 2998 andi.l &0x00ff00ff,USER_FPSR 2999 3000 clr.l %d0 3001 mov.b FPCR_MODE(%a6),%d0 3002 3003 tst.b %d1 3004 bne.b _L13_2x 3005 bsr.l slogn 3006 bra.b _L13_6x 3007 _L13_2x: 3008 cmpi.b %d1,&ZERO 3009 bne.b _L13_3x 3010 bsr.l t_dz2 3011 bra.b _L13_6x 3012 _L13_3x: 3013 cmpi.b %d1,&INF 3014 bne.b _L13_4x 3015 bsr.l sopr_inf 3016 bra.b _L13_6x 3017 _L13_4x: 3018 cmpi.b %d1,&QNAN 3019 bne.b _L13_5x 3020 bsr.l src_qnan 3021 bra.b _L13_6x 3022 _L13_5x: 3023 bsr.l slognd 3024 _L13_6x: 3025 3026 # 3027 # Result is now in FP0 3028 # 3029 movm.l EXC_DREGS(%a6),&0x030 3030 fmovm.l USER_FPCR(%a6),%fpcr, 3031 fmovm.x EXC_FP1(%a6),&0x40 3032 unlk %a6 3033 rts 3034 3035 3036 ############################################# 3037 # MONADIC TEMPLATE 3038 ############################################# 3039 global _flog10s_ 3040 _flog10s_: 3041 link %a6,&-LOCAL_SIZE 3042 3043 movm.l &0x0303,EXC_DREGS(%a6 3044 fmovm.l %fpcr,%fpsr,USER_FPCR 3045 fmovm.x &0xc0,EXC_FP0(%a6) 3046 3047 fmov.l &0x0,%fpcr 3048 3049 # 3050 # copy, convert, and tag input argument 3051 # 3052 fmov.s 0x8(%a6),%fp0 3053 fmov.x %fp0,FP_SRC(%a6) 3054 lea FP_SRC(%a6),%a0 3055 bsr.l tag 3056 mov.b %d0,STAG(%a6) 3057 mov.b %d0,%d1 3058 3059 andi.l &0x00ff00ff,USER_FPSR 3060 3061 clr.l %d0 3062 mov.b FPCR_MODE(%a6),%d0 3063 3064 tst.b %d1 3065 bne.b _L14_2s 3066 bsr.l slog10 3067 bra.b _L14_6s 3068 _L14_2s: 3069 cmpi.b %d1,&ZERO 3070 bne.b _L14_3s 3071 bsr.l t_dz2 3072 bra.b _L14_6s 3073 _L14_3s: 3074 cmpi.b %d1,&INF 3075 bne.b _L14_4s 3076 bsr.l sopr_inf 3077 bra.b _L14_6s 3078 _L14_4s: 3079 cmpi.b %d1,&QNAN 3080 bne.b _L14_5s 3081 bsr.l src_qnan 3082 bra.b _L14_6s 3083 _L14_5s: 3084 bsr.l slog10d 3085 _L14_6s: 3086 3087 # 3088 # Result is now in FP0 3089 # 3090 movm.l EXC_DREGS(%a6),&0x030 3091 fmovm.l USER_FPCR(%a6),%fpcr, 3092 fmovm.x EXC_FP1(%a6),&0x40 3093 unlk %a6 3094 rts 3095 3096 global _flog10d_ 3097 _flog10d_: 3098 link %a6,&-LOCAL_SIZE 3099 3100 movm.l &0x0303,EXC_DREGS(%a6 3101 fmovm.l %fpcr,%fpsr,USER_FPCR 3102 fmovm.x &0xc0,EXC_FP0(%a6) 3103 3104 fmov.l &0x0,%fpcr 3105 3106 # 3107 # copy, convert, and tag input argument 3108 # 3109 fmov.d 0x8(%a6),%fp0 3110 fmov.x %fp0,FP_SRC(%a6) 3111 lea FP_SRC(%a6),%a0 3112 bsr.l tag 3113 mov.b %d0,STAG(%a6) 3114 mov.b %d0,%d1 3115 3116 andi.l &0x00ff00ff,USER_FPSR 3117 3118 clr.l %d0 3119 mov.b FPCR_MODE(%a6),%d0 3120 3121 mov.b %d1,STAG(%a6) 3122 tst.b %d1 3123 bne.b _L14_2d 3124 bsr.l slog10 3125 bra.b _L14_6d 3126 _L14_2d: 3127 cmpi.b %d1,&ZERO 3128 bne.b _L14_3d 3129 bsr.l t_dz2 3130 bra.b _L14_6d 3131 _L14_3d: 3132 cmpi.b %d1,&INF 3133 bne.b _L14_4d 3134 bsr.l sopr_inf 3135 bra.b _L14_6d 3136 _L14_4d: 3137 cmpi.b %d1,&QNAN 3138 bne.b _L14_5d 3139 bsr.l src_qnan 3140 bra.b _L14_6d 3141 _L14_5d: 3142 bsr.l slog10d 3143 _L14_6d: 3144 3145 # 3146 # Result is now in FP0 3147 # 3148 movm.l EXC_DREGS(%a6),&0x030 3149 fmovm.l USER_FPCR(%a6),%fpcr, 3150 fmovm.x EXC_FP1(%a6),&0x40 3151 unlk %a6 3152 rts 3153 3154 global _flog10x_ 3155 _flog10x_: 3156 link %a6,&-LOCAL_SIZE 3157 3158 movm.l &0x0303,EXC_DREGS(%a6 3159 fmovm.l %fpcr,%fpsr,USER_FPCR 3160 fmovm.x &0xc0,EXC_FP0(%a6) 3161 3162 fmov.l &0x0,%fpcr 3163 3164 # 3165 # copy, convert, and tag input argument 3166 # 3167 lea FP_SRC(%a6),%a0 3168 mov.l 0x8+0x0(%a6),0x0(%a0) 3169 mov.l 0x8+0x4(%a6),0x4(%a0) 3170 mov.l 0x8+0x8(%a6),0x8(%a0) 3171 bsr.l tag 3172 mov.b %d0,STAG(%a6) 3173 mov.b %d0,%d1 3174 3175 andi.l &0x00ff00ff,USER_FPSR 3176 3177 clr.l %d0 3178 mov.b FPCR_MODE(%a6),%d0 3179 3180 tst.b %d1 3181 bne.b _L14_2x 3182 bsr.l slog10 3183 bra.b _L14_6x 3184 _L14_2x: 3185 cmpi.b %d1,&ZERO 3186 bne.b _L14_3x 3187 bsr.l t_dz2 3188 bra.b _L14_6x 3189 _L14_3x: 3190 cmpi.b %d1,&INF 3191 bne.b _L14_4x 3192 bsr.l sopr_inf 3193 bra.b _L14_6x 3194 _L14_4x: 3195 cmpi.b %d1,&QNAN 3196 bne.b _L14_5x 3197 bsr.l src_qnan 3198 bra.b _L14_6x 3199 _L14_5x: 3200 bsr.l slog10d 3201 _L14_6x: 3202 3203 # 3204 # Result is now in FP0 3205 # 3206 movm.l EXC_DREGS(%a6),&0x030 3207 fmovm.l USER_FPCR(%a6),%fpcr, 3208 fmovm.x EXC_FP1(%a6),&0x40 3209 unlk %a6 3210 rts 3211 3212 3213 ############################################# 3214 # MONADIC TEMPLATE 3215 ############################################# 3216 global _flog2s_ 3217 _flog2s_: 3218 link %a6,&-LOCAL_SIZE 3219 3220 movm.l &0x0303,EXC_DREGS(%a6 3221 fmovm.l %fpcr,%fpsr,USER_FPCR 3222 fmovm.x &0xc0,EXC_FP0(%a6) 3223 3224 fmov.l &0x0,%fpcr 3225 3226 # 3227 # copy, convert, and tag input argument 3228 # 3229 fmov.s 0x8(%a6),%fp0 3230 fmov.x %fp0,FP_SRC(%a6) 3231 lea FP_SRC(%a6),%a0 3232 bsr.l tag 3233 mov.b %d0,STAG(%a6) 3234 mov.b %d0,%d1 3235 3236 andi.l &0x00ff00ff,USER_FPSR 3237 3238 clr.l %d0 3239 mov.b FPCR_MODE(%a6),%d0 3240 3241 tst.b %d1 3242 bne.b _L15_2s 3243 bsr.l slog2 3244 bra.b _L15_6s 3245 _L15_2s: 3246 cmpi.b %d1,&ZERO 3247 bne.b _L15_3s 3248 bsr.l t_dz2 3249 bra.b _L15_6s 3250 _L15_3s: 3251 cmpi.b %d1,&INF 3252 bne.b _L15_4s 3253 bsr.l sopr_inf 3254 bra.b _L15_6s 3255 _L15_4s: 3256 cmpi.b %d1,&QNAN 3257 bne.b _L15_5s 3258 bsr.l src_qnan 3259 bra.b _L15_6s 3260 _L15_5s: 3261 bsr.l slog2d 3262 _L15_6s: 3263 3264 # 3265 # Result is now in FP0 3266 # 3267 movm.l EXC_DREGS(%a6),&0x030 3268 fmovm.l USER_FPCR(%a6),%fpcr, 3269 fmovm.x EXC_FP1(%a6),&0x40 3270 unlk %a6 3271 rts 3272 3273 global _flog2d_ 3274 _flog2d_: 3275 link %a6,&-LOCAL_SIZE 3276 3277 movm.l &0x0303,EXC_DREGS(%a6 3278 fmovm.l %fpcr,%fpsr,USER_FPCR 3279 fmovm.x &0xc0,EXC_FP0(%a6) 3280 3281 fmov.l &0x0,%fpcr 3282 3283 # 3284 # copy, convert, and tag input argument 3285 # 3286 fmov.d 0x8(%a6),%fp0 3287 fmov.x %fp0,FP_SRC(%a6) 3288 lea FP_SRC(%a6),%a0 3289 bsr.l tag 3290 mov.b %d0,STAG(%a6) 3291 mov.b %d0,%d1 3292 3293 andi.l &0x00ff00ff,USER_FPSR 3294 3295 clr.l %d0 3296 mov.b FPCR_MODE(%a6),%d0 3297 3298 mov.b %d1,STAG(%a6) 3299 tst.b %d1 3300 bne.b _L15_2d 3301 bsr.l slog2 3302 bra.b _L15_6d 3303 _L15_2d: 3304 cmpi.b %d1,&ZERO 3305 bne.b _L15_3d 3306 bsr.l t_dz2 3307 bra.b _L15_6d 3308 _L15_3d: 3309 cmpi.b %d1,&INF 3310 bne.b _L15_4d 3311 bsr.l sopr_inf 3312 bra.b _L15_6d 3313 _L15_4d: 3314 cmpi.b %d1,&QNAN 3315 bne.b _L15_5d 3316 bsr.l src_qnan 3317 bra.b _L15_6d 3318 _L15_5d: 3319 bsr.l slog2d 3320 _L15_6d: 3321 3322 # 3323 # Result is now in FP0 3324 # 3325 movm.l EXC_DREGS(%a6),&0x030 3326 fmovm.l USER_FPCR(%a6),%fpcr, 3327 fmovm.x EXC_FP1(%a6),&0x40 3328 unlk %a6 3329 rts 3330 3331 global _flog2x_ 3332 _flog2x_: 3333 link %a6,&-LOCAL_SIZE 3334 3335 movm.l &0x0303,EXC_DREGS(%a6 3336 fmovm.l %fpcr,%fpsr,USER_FPCR 3337 fmovm.x &0xc0,EXC_FP0(%a6) 3338 3339 fmov.l &0x0,%fpcr 3340 3341 # 3342 # copy, convert, and tag input argument 3343 # 3344 lea FP_SRC(%a6),%a0 3345 mov.l 0x8+0x0(%a6),0x0(%a0) 3346 mov.l 0x8+0x4(%a6),0x4(%a0) 3347 mov.l 0x8+0x8(%a6),0x8(%a0) 3348 bsr.l tag 3349 mov.b %d0,STAG(%a6) 3350 mov.b %d0,%d1 3351 3352 andi.l &0x00ff00ff,USER_FPSR 3353 3354 clr.l %d0 3355 mov.b FPCR_MODE(%a6),%d0 3356 3357 tst.b %d1 3358 bne.b _L15_2x 3359 bsr.l slog2 3360 bra.b _L15_6x 3361 _L15_2x: 3362 cmpi.b %d1,&ZERO 3363 bne.b _L15_3x 3364 bsr.l t_dz2 3365 bra.b _L15_6x 3366 _L15_3x: 3367 cmpi.b %d1,&INF 3368 bne.b _L15_4x 3369 bsr.l sopr_inf 3370 bra.b _L15_6x 3371 _L15_4x: 3372 cmpi.b %d1,&QNAN 3373 bne.b _L15_5x 3374 bsr.l src_qnan 3375 bra.b _L15_6x 3376 _L15_5x: 3377 bsr.l slog2d 3378 _L15_6x: 3379 3380 # 3381 # Result is now in FP0 3382 # 3383 movm.l EXC_DREGS(%a6),&0x030 3384 fmovm.l USER_FPCR(%a6),%fpcr, 3385 fmovm.x EXC_FP1(%a6),&0x40 3386 unlk %a6 3387 rts 3388 3389 3390 ############################################# 3391 # MONADIC TEMPLATE 3392 ############################################# 3393 global _fcoshs_ 3394 _fcoshs_: 3395 link %a6,&-LOCAL_SIZE 3396 3397 movm.l &0x0303,EXC_DREGS(%a6 3398 fmovm.l %fpcr,%fpsr,USER_FPCR 3399 fmovm.x &0xc0,EXC_FP0(%a6) 3400 3401 fmov.l &0x0,%fpcr 3402 3403 # 3404 # copy, convert, and tag input argument 3405 # 3406 fmov.s 0x8(%a6),%fp0 3407 fmov.x %fp0,FP_SRC(%a6) 3408 lea FP_SRC(%a6),%a0 3409 bsr.l tag 3410 mov.b %d0,STAG(%a6) 3411 mov.b %d0,%d1 3412 3413 andi.l &0x00ff00ff,USER_FPSR 3414 3415 clr.l %d0 3416 mov.b FPCR_MODE(%a6),%d0 3417 3418 tst.b %d1 3419 bne.b _L16_2s 3420 bsr.l scosh 3421 bra.b _L16_6s 3422 _L16_2s: 3423 cmpi.b %d1,&ZERO 3424 bne.b _L16_3s 3425 bsr.l ld_pone 3426 bra.b _L16_6s 3427 _L16_3s: 3428 cmpi.b %d1,&INF 3429 bne.b _L16_4s 3430 bsr.l ld_pinf 3431 bra.b _L16_6s 3432 _L16_4s: 3433 cmpi.b %d1,&QNAN 3434 bne.b _L16_5s 3435 bsr.l src_qnan 3436 bra.b _L16_6s 3437 _L16_5s: 3438 bsr.l scoshd 3439 _L16_6s: 3440 3441 # 3442 # Result is now in FP0 3443 # 3444 movm.l EXC_DREGS(%a6),&0x030 3445 fmovm.l USER_FPCR(%a6),%fpcr, 3446 fmovm.x EXC_FP1(%a6),&0x40 3447 unlk %a6 3448 rts 3449 3450 global _fcoshd_ 3451 _fcoshd_: 3452 link %a6,&-LOCAL_SIZE 3453 3454 movm.l &0x0303,EXC_DREGS(%a6 3455 fmovm.l %fpcr,%fpsr,USER_FPCR 3456 fmovm.x &0xc0,EXC_FP0(%a6) 3457 3458 fmov.l &0x0,%fpcr 3459 3460 # 3461 # copy, convert, and tag input argument 3462 # 3463 fmov.d 0x8(%a6),%fp0 3464 fmov.x %fp0,FP_SRC(%a6) 3465 lea FP_SRC(%a6),%a0 3466 bsr.l tag 3467 mov.b %d0,STAG(%a6) 3468 mov.b %d0,%d1 3469 3470 andi.l &0x00ff00ff,USER_FPSR 3471 3472 clr.l %d0 3473 mov.b FPCR_MODE(%a6),%d0 3474 3475 mov.b %d1,STAG(%a6) 3476 tst.b %d1 3477 bne.b _L16_2d 3478 bsr.l scosh 3479 bra.b _L16_6d 3480 _L16_2d: 3481 cmpi.b %d1,&ZERO 3482 bne.b _L16_3d 3483 bsr.l ld_pone 3484 bra.b _L16_6d 3485 _L16_3d: 3486 cmpi.b %d1,&INF 3487 bne.b _L16_4d 3488 bsr.l ld_pinf 3489 bra.b _L16_6d 3490 _L16_4d: 3491 cmpi.b %d1,&QNAN 3492 bne.b _L16_5d 3493 bsr.l src_qnan 3494 bra.b _L16_6d 3495 _L16_5d: 3496 bsr.l scoshd 3497 _L16_6d: 3498 3499 # 3500 # Result is now in FP0 3501 # 3502 movm.l EXC_DREGS(%a6),&0x030 3503 fmovm.l USER_FPCR(%a6),%fpcr, 3504 fmovm.x EXC_FP1(%a6),&0x40 3505 unlk %a6 3506 rts 3507 3508 global _fcoshx_ 3509 _fcoshx_: 3510 link %a6,&-LOCAL_SIZE 3511 3512 movm.l &0x0303,EXC_DREGS(%a6 3513 fmovm.l %fpcr,%fpsr,USER_FPCR 3514 fmovm.x &0xc0,EXC_FP0(%a6) 3515 3516 fmov.l &0x0,%fpcr 3517 3518 # 3519 # copy, convert, and tag input argument 3520 # 3521 lea FP_SRC(%a6),%a0 3522 mov.l 0x8+0x0(%a6),0x0(%a0) 3523 mov.l 0x8+0x4(%a6),0x4(%a0) 3524 mov.l 0x8+0x8(%a6),0x8(%a0) 3525 bsr.l tag 3526 mov.b %d0,STAG(%a6) 3527 mov.b %d0,%d1 3528 3529 andi.l &0x00ff00ff,USER_FPSR 3530 3531 clr.l %d0 3532 mov.b FPCR_MODE(%a6),%d0 3533 3534 tst.b %d1 3535 bne.b _L16_2x 3536 bsr.l scosh 3537 bra.b _L16_6x 3538 _L16_2x: 3539 cmpi.b %d1,&ZERO 3540 bne.b _L16_3x 3541 bsr.l ld_pone 3542 bra.b _L16_6x 3543 _L16_3x: 3544 cmpi.b %d1,&INF 3545 bne.b _L16_4x 3546 bsr.l ld_pinf 3547 bra.b _L16_6x 3548 _L16_4x: 3549 cmpi.b %d1,&QNAN 3550 bne.b _L16_5x 3551 bsr.l src_qnan 3552 bra.b _L16_6x 3553 _L16_5x: 3554 bsr.l scoshd 3555 _L16_6x: 3556 3557 # 3558 # Result is now in FP0 3559 # 3560 movm.l EXC_DREGS(%a6),&0x030 3561 fmovm.l USER_FPCR(%a6),%fpcr, 3562 fmovm.x EXC_FP1(%a6),&0x40 3563 unlk %a6 3564 rts 3565 3566 3567 ############################################# 3568 # MONADIC TEMPLATE 3569 ############################################# 3570 global _facoss_ 3571 _facoss_: 3572 link %a6,&-LOCAL_SIZE 3573 3574 movm.l &0x0303,EXC_DREGS(%a6 3575 fmovm.l %fpcr,%fpsr,USER_FPCR 3576 fmovm.x &0xc0,EXC_FP0(%a6) 3577 3578 fmov.l &0x0,%fpcr 3579 3580 # 3581 # copy, convert, and tag input argument 3582 # 3583 fmov.s 0x8(%a6),%fp0 3584 fmov.x %fp0,FP_SRC(%a6) 3585 lea FP_SRC(%a6),%a0 3586 bsr.l tag 3587 mov.b %d0,STAG(%a6) 3588 mov.b %d0,%d1 3589 3590 andi.l &0x00ff00ff,USER_FPSR 3591 3592 clr.l %d0 3593 mov.b FPCR_MODE(%a6),%d0 3594 3595 tst.b %d1 3596 bne.b _L17_2s 3597 bsr.l sacos 3598 bra.b _L17_6s 3599 _L17_2s: 3600 cmpi.b %d1,&ZERO 3601 bne.b _L17_3s 3602 bsr.l ld_ppi2 3603 bra.b _L17_6s 3604 _L17_3s: 3605 cmpi.b %d1,&INF 3606 bne.b _L17_4s 3607 bsr.l t_operr 3608 bra.b _L17_6s 3609 _L17_4s: 3610 cmpi.b %d1,&QNAN 3611 bne.b _L17_5s 3612 bsr.l src_qnan 3613 bra.b _L17_6s 3614 _L17_5s: 3615 bsr.l sacosd 3616 _L17_6s: 3617 3618 # 3619 # Result is now in FP0 3620 # 3621 movm.l EXC_DREGS(%a6),&0x030 3622 fmovm.l USER_FPCR(%a6),%fpcr, 3623 fmovm.x EXC_FP1(%a6),&0x40 3624 unlk %a6 3625 rts 3626 3627 global _facosd_ 3628 _facosd_: 3629 link %a6,&-LOCAL_SIZE 3630 3631 movm.l &0x0303,EXC_DREGS(%a6 3632 fmovm.l %fpcr,%fpsr,USER_FPCR 3633 fmovm.x &0xc0,EXC_FP0(%a6) 3634 3635 fmov.l &0x0,%fpcr 3636 3637 # 3638 # copy, convert, and tag input argument 3639 # 3640 fmov.d 0x8(%a6),%fp0 3641 fmov.x %fp0,FP_SRC(%a6) 3642 lea FP_SRC(%a6),%a0 3643 bsr.l tag 3644 mov.b %d0,STAG(%a6) 3645 mov.b %d0,%d1 3646 3647 andi.l &0x00ff00ff,USER_FPSR 3648 3649 clr.l %d0 3650 mov.b FPCR_MODE(%a6),%d0 3651 3652 mov.b %d1,STAG(%a6) 3653 tst.b %d1 3654 bne.b _L17_2d 3655 bsr.l sacos 3656 bra.b _L17_6d 3657 _L17_2d: 3658 cmpi.b %d1,&ZERO 3659 bne.b _L17_3d 3660 bsr.l ld_ppi2 3661 bra.b _L17_6d 3662 _L17_3d: 3663 cmpi.b %d1,&INF 3664 bne.b _L17_4d 3665 bsr.l t_operr 3666 bra.b _L17_6d 3667 _L17_4d: 3668 cmpi.b %d1,&QNAN 3669 bne.b _L17_5d 3670 bsr.l src_qnan 3671 bra.b _L17_6d 3672 _L17_5d: 3673 bsr.l sacosd 3674 _L17_6d: 3675 3676 # 3677 # Result is now in FP0 3678 # 3679 movm.l EXC_DREGS(%a6),&0x030 3680 fmovm.l USER_FPCR(%a6),%fpcr, 3681 fmovm.x EXC_FP1(%a6),&0x40 3682 unlk %a6 3683 rts 3684 3685 global _facosx_ 3686 _facosx_: 3687 link %a6,&-LOCAL_SIZE 3688 3689 movm.l &0x0303,EXC_DREGS(%a6 3690 fmovm.l %fpcr,%fpsr,USER_FPCR 3691 fmovm.x &0xc0,EXC_FP0(%a6) 3692 3693 fmov.l &0x0,%fpcr 3694 3695 # 3696 # copy, convert, and tag input argument 3697 # 3698 lea FP_SRC(%a6),%a0 3699 mov.l 0x8+0x0(%a6),0x0(%a0) 3700 mov.l 0x8+0x4(%a6),0x4(%a0) 3701 mov.l 0x8+0x8(%a6),0x8(%a0) 3702 bsr.l tag 3703 mov.b %d0,STAG(%a6) 3704 mov.b %d0,%d1 3705 3706 andi.l &0x00ff00ff,USER_FPSR 3707 3708 clr.l %d0 3709 mov.b FPCR_MODE(%a6),%d0 3710 3711 tst.b %d1 3712 bne.b _L17_2x 3713 bsr.l sacos 3714 bra.b _L17_6x 3715 _L17_2x: 3716 cmpi.b %d1,&ZERO 3717 bne.b _L17_3x 3718 bsr.l ld_ppi2 3719 bra.b _L17_6x 3720 _L17_3x: 3721 cmpi.b %d1,&INF 3722 bne.b _L17_4x 3723 bsr.l t_operr 3724 bra.b _L17_6x 3725 _L17_4x: 3726 cmpi.b %d1,&QNAN 3727 bne.b _L17_5x 3728 bsr.l src_qnan 3729 bra.b _L17_6x 3730 _L17_5x: 3731 bsr.l sacosd 3732 _L17_6x: 3733 3734 # 3735 # Result is now in FP0 3736 # 3737 movm.l EXC_DREGS(%a6),&0x030 3738 fmovm.l USER_FPCR(%a6),%fpcr, 3739 fmovm.x EXC_FP1(%a6),&0x40 3740 unlk %a6 3741 rts 3742 3743 3744 ############################################# 3745 # MONADIC TEMPLATE 3746 ############################################# 3747 global _fgetexps_ 3748 _fgetexps_: 3749 link %a6,&-LOCAL_SIZE 3750 3751 movm.l &0x0303,EXC_DREGS(%a6 3752 fmovm.l %fpcr,%fpsr,USER_FPCR 3753 fmovm.x &0xc0,EXC_FP0(%a6) 3754 3755 fmov.l &0x0,%fpcr 3756 3757 # 3758 # copy, convert, and tag input argument 3759 # 3760 fmov.s 0x8(%a6),%fp0 3761 fmov.x %fp0,FP_SRC(%a6) 3762 lea FP_SRC(%a6),%a0 3763 bsr.l tag 3764 mov.b %d0,STAG(%a6) 3765 mov.b %d0,%d1 3766 3767 andi.l &0x00ff00ff,USER_FPSR 3768 3769 clr.l %d0 3770 mov.b FPCR_MODE(%a6),%d0 3771 3772 tst.b %d1 3773 bne.b _L18_2s 3774 bsr.l sgetexp 3775 bra.b _L18_6s 3776 _L18_2s: 3777 cmpi.b %d1,&ZERO 3778 bne.b _L18_3s 3779 bsr.l src_zero 3780 bra.b _L18_6s 3781 _L18_3s: 3782 cmpi.b %d1,&INF 3783 bne.b _L18_4s 3784 bsr.l t_operr 3785 bra.b _L18_6s 3786 _L18_4s: 3787 cmpi.b %d1,&QNAN 3788 bne.b _L18_5s 3789 bsr.l src_qnan 3790 bra.b _L18_6s 3791 _L18_5s: 3792 bsr.l sgetexpd 3793 _L18_6s: 3794 3795 # 3796 # Result is now in FP0 3797 # 3798 movm.l EXC_DREGS(%a6),&0x030 3799 fmovm.l USER_FPCR(%a6),%fpcr, 3800 fmovm.x EXC_FP1(%a6),&0x40 3801 unlk %a6 3802 rts 3803 3804 global _fgetexpd_ 3805 _fgetexpd_: 3806 link %a6,&-LOCAL_SIZE 3807 3808 movm.l &0x0303,EXC_DREGS(%a6 3809 fmovm.l %fpcr,%fpsr,USER_FPCR 3810 fmovm.x &0xc0,EXC_FP0(%a6) 3811 3812 fmov.l &0x0,%fpcr 3813 3814 # 3815 # copy, convert, and tag input argument 3816 # 3817 fmov.d 0x8(%a6),%fp0 3818 fmov.x %fp0,FP_SRC(%a6) 3819 lea FP_SRC(%a6),%a0 3820 bsr.l tag 3821 mov.b %d0,STAG(%a6) 3822 mov.b %d0,%d1 3823 3824 andi.l &0x00ff00ff,USER_FPSR 3825 3826 clr.l %d0 3827 mov.b FPCR_MODE(%a6),%d0 3828 3829 mov.b %d1,STAG(%a6) 3830 tst.b %d1 3831 bne.b _L18_2d 3832 bsr.l sgetexp 3833 bra.b _L18_6d 3834 _L18_2d: 3835 cmpi.b %d1,&ZERO 3836 bne.b _L18_3d 3837 bsr.l src_zero 3838 bra.b _L18_6d 3839 _L18_3d: 3840 cmpi.b %d1,&INF 3841 bne.b _L18_4d 3842 bsr.l t_operr 3843 bra.b _L18_6d 3844 _L18_4d: 3845 cmpi.b %d1,&QNAN 3846 bne.b _L18_5d 3847 bsr.l src_qnan 3848 bra.b _L18_6d 3849 _L18_5d: 3850 bsr.l sgetexpd 3851 _L18_6d: 3852 3853 # 3854 # Result is now in FP0 3855 # 3856 movm.l EXC_DREGS(%a6),&0x030 3857 fmovm.l USER_FPCR(%a6),%fpcr, 3858 fmovm.x EXC_FP1(%a6),&0x40 3859 unlk %a6 3860 rts 3861 3862 global _fgetexpx_ 3863 _fgetexpx_: 3864 link %a6,&-LOCAL_SIZE 3865 3866 movm.l &0x0303,EXC_DREGS(%a6 3867 fmovm.l %fpcr,%fpsr,USER_FPCR 3868 fmovm.x &0xc0,EXC_FP0(%a6) 3869 3870 fmov.l &0x0,%fpcr 3871 3872 # 3873 # copy, convert, and tag input argument 3874 # 3875 lea FP_SRC(%a6),%a0 3876 mov.l 0x8+0x0(%a6),0x0(%a0) 3877 mov.l 0x8+0x4(%a6),0x4(%a0) 3878 mov.l 0x8+0x8(%a6),0x8(%a0) 3879 bsr.l tag 3880 mov.b %d0,STAG(%a6) 3881 mov.b %d0,%d1 3882 3883 andi.l &0x00ff00ff,USER_FPSR 3884 3885 clr.l %d0 3886 mov.b FPCR_MODE(%a6),%d0 3887 3888 tst.b %d1 3889 bne.b _L18_2x 3890 bsr.l sgetexp 3891 bra.b _L18_6x 3892 _L18_2x: 3893 cmpi.b %d1,&ZERO 3894 bne.b _L18_3x 3895 bsr.l src_zero 3896 bra.b _L18_6x 3897 _L18_3x: 3898 cmpi.b %d1,&INF 3899 bne.b _L18_4x 3900 bsr.l t_operr 3901 bra.b _L18_6x 3902 _L18_4x: 3903 cmpi.b %d1,&QNAN 3904 bne.b _L18_5x 3905 bsr.l src_qnan 3906 bra.b _L18_6x 3907 _L18_5x: 3908 bsr.l sgetexpd 3909 _L18_6x: 3910 3911 # 3912 # Result is now in FP0 3913 # 3914 movm.l EXC_DREGS(%a6),&0x030 3915 fmovm.l USER_FPCR(%a6),%fpcr, 3916 fmovm.x EXC_FP1(%a6),&0x40 3917 unlk %a6 3918 rts 3919 3920 3921 ############################################# 3922 # MONADIC TEMPLATE 3923 ############################################# 3924 global _fgetmans_ 3925 _fgetmans_: 3926 link %a6,&-LOCAL_SIZE 3927 3928 movm.l &0x0303,EXC_DREGS(%a6 3929 fmovm.l %fpcr,%fpsr,USER_FPCR 3930 fmovm.x &0xc0,EXC_FP0(%a6) 3931 3932 fmov.l &0x0,%fpcr 3933 3934 # 3935 # copy, convert, and tag input argument 3936 # 3937 fmov.s 0x8(%a6),%fp0 3938 fmov.x %fp0,FP_SRC(%a6) 3939 lea FP_SRC(%a6),%a0 3940 bsr.l tag 3941 mov.b %d0,STAG(%a6) 3942 mov.b %d0,%d1 3943 3944 andi.l &0x00ff00ff,USER_FPSR 3945 3946 clr.l %d0 3947 mov.b FPCR_MODE(%a6),%d0 3948 3949 tst.b %d1 3950 bne.b _L19_2s 3951 bsr.l sgetman 3952 bra.b _L19_6s 3953 _L19_2s: 3954 cmpi.b %d1,&ZERO 3955 bne.b _L19_3s 3956 bsr.l src_zero 3957 bra.b _L19_6s 3958 _L19_3s: 3959 cmpi.b %d1,&INF 3960 bne.b _L19_4s 3961 bsr.l t_operr 3962 bra.b _L19_6s 3963 _L19_4s: 3964 cmpi.b %d1,&QNAN 3965 bne.b _L19_5s 3966 bsr.l src_qnan 3967 bra.b _L19_6s 3968 _L19_5s: 3969 bsr.l sgetmand 3970 _L19_6s: 3971 3972 # 3973 # Result is now in FP0 3974 # 3975 movm.l EXC_DREGS(%a6),&0x030 3976 fmovm.l USER_FPCR(%a6),%fpcr, 3977 fmovm.x EXC_FP1(%a6),&0x40 3978 unlk %a6 3979 rts 3980 3981 global _fgetmand_ 3982 _fgetmand_: 3983 link %a6,&-LOCAL_SIZE 3984 3985 movm.l &0x0303,EXC_DREGS(%a6 3986 fmovm.l %fpcr,%fpsr,USER_FPCR 3987 fmovm.x &0xc0,EXC_FP0(%a6) 3988 3989 fmov.l &0x0,%fpcr 3990 3991 # 3992 # copy, convert, and tag input argument 3993 # 3994 fmov.d 0x8(%a6),%fp0 3995 fmov.x %fp0,FP_SRC(%a6) 3996 lea FP_SRC(%a6),%a0 3997 bsr.l tag 3998 mov.b %d0,STAG(%a6) 3999 mov.b %d0,%d1 4000 4001 andi.l &0x00ff00ff,USER_FPSR 4002 4003 clr.l %d0 4004 mov.b FPCR_MODE(%a6),%d0 4005 4006 mov.b %d1,STAG(%a6) 4007 tst.b %d1 4008 bne.b _L19_2d 4009 bsr.l sgetman 4010 bra.b _L19_6d 4011 _L19_2d: 4012 cmpi.b %d1,&ZERO 4013 bne.b _L19_3d 4014 bsr.l src_zero 4015 bra.b _L19_6d 4016 _L19_3d: 4017 cmpi.b %d1,&INF 4018 bne.b _L19_4d 4019 bsr.l t_operr 4020 bra.b _L19_6d 4021 _L19_4d: 4022 cmpi.b %d1,&QNAN 4023 bne.b _L19_5d 4024 bsr.l src_qnan 4025 bra.b _L19_6d 4026 _L19_5d: 4027 bsr.l sgetmand 4028 _L19_6d: 4029 4030 # 4031 # Result is now in FP0 4032 # 4033 movm.l EXC_DREGS(%a6),&0x030 4034 fmovm.l USER_FPCR(%a6),%fpcr, 4035 fmovm.x EXC_FP1(%a6),&0x40 4036 unlk %a6 4037 rts 4038 4039 global _fgetmanx_ 4040 _fgetmanx_: 4041 link %a6,&-LOCAL_SIZE 4042 4043 movm.l &0x0303,EXC_DREGS(%a6 4044 fmovm.l %fpcr,%fpsr,USER_FPCR 4045 fmovm.x &0xc0,EXC_FP0(%a6) 4046 4047 fmov.l &0x0,%fpcr 4048 4049 # 4050 # copy, convert, and tag input argument 4051 # 4052 lea FP_SRC(%a6),%a0 4053 mov.l 0x8+0x0(%a6),0x0(%a0) 4054 mov.l 0x8+0x4(%a6),0x4(%a0) 4055 mov.l 0x8+0x8(%a6),0x8(%a0) 4056 bsr.l tag 4057 mov.b %d0,STAG(%a6) 4058 mov.b %d0,%d1 4059 4060 andi.l &0x00ff00ff,USER_FPSR 4061 4062 clr.l %d0 4063 mov.b FPCR_MODE(%a6),%d0 4064 4065 tst.b %d1 4066 bne.b _L19_2x 4067 bsr.l sgetman 4068 bra.b _L19_6x 4069 _L19_2x: 4070 cmpi.b %d1,&ZERO 4071 bne.b _L19_3x 4072 bsr.l src_zero 4073 bra.b _L19_6x 4074 _L19_3x: 4075 cmpi.b %d1,&INF 4076 bne.b _L19_4x 4077 bsr.l t_operr 4078 bra.b _L19_6x 4079 _L19_4x: 4080 cmpi.b %d1,&QNAN 4081 bne.b _L19_5x 4082 bsr.l src_qnan 4083 bra.b _L19_6x 4084 _L19_5x: 4085 bsr.l sgetmand 4086 _L19_6x: 4087 4088 # 4089 # Result is now in FP0 4090 # 4091 movm.l EXC_DREGS(%a6),&0x030 4092 fmovm.l USER_FPCR(%a6),%fpcr, 4093 fmovm.x EXC_FP1(%a6),&0x40 4094 unlk %a6 4095 rts 4096 4097 4098 ############################################# 4099 # MONADIC TEMPLATE 4100 ############################################# 4101 global _fsincoss_ 4102 _fsincoss_: 4103 link %a6,&-LOCAL_SIZE 4104 4105 movm.l &0x0303,EXC_DREGS(%a6 4106 fmovm.l %fpcr,%fpsr,USER_FPCR 4107 fmovm.x &0xc0,EXC_FP0(%a6) 4108 4109 fmov.l &0x0,%fpcr 4110 4111 # 4112 # copy, convert, and tag input argument 4113 # 4114 fmov.s 0x8(%a6),%fp0 4115 fmov.x %fp0,FP_SRC(%a6) 4116 lea FP_SRC(%a6),%a0 4117 bsr.l tag 4118 mov.b %d0,STAG(%a6) 4119 mov.b %d0,%d1 4120 4121 andi.l &0x00ff00ff,USER_FPSR 4122 4123 clr.l %d0 4124 mov.b FPCR_MODE(%a6),%d0 4125 4126 tst.b %d1 4127 bne.b _L20_2s 4128 bsr.l ssincos 4129 bra.b _L20_6s 4130 _L20_2s: 4131 cmpi.b %d1,&ZERO 4132 bne.b _L20_3s 4133 bsr.l ssincosz 4134 bra.b _L20_6s 4135 _L20_3s: 4136 cmpi.b %d1,&INF 4137 bne.b _L20_4s 4138 bsr.l ssincosi 4139 bra.b _L20_6s 4140 _L20_4s: 4141 cmpi.b %d1,&QNAN 4142 bne.b _L20_5s 4143 bsr.l ssincosqnan 4144 bra.b _L20_6s 4145 _L20_5s: 4146 bsr.l ssincosd 4147 _L20_6s: 4148 4149 # 4150 # Result is now in FP0 4151 # 4152 movm.l EXC_DREGS(%a6),&0x030 4153 fmovm.l USER_FPCR(%a6),%fpcr, 4154 fmovm.x &0x03,-(%sp) 4155 fmovm.x (%sp)+,&0x40 4156 fmovm.x (%sp)+,&0x80 4157 unlk %a6 4158 rts 4159 4160 global _fsincosd_ 4161 _fsincosd_: 4162 link %a6,&-LOCAL_SIZE 4163 4164 movm.l &0x0303,EXC_DREGS(%a6 4165 fmovm.l %fpcr,%fpsr,USER_FPCR 4166 fmovm.x &0xc0,EXC_FP0(%a6) 4167 4168 fmov.l &0x0,%fpcr 4169 4170 # 4171 # copy, convert, and tag input argument 4172 # 4173 fmov.d 0x8(%a6),%fp0 4174 fmov.x %fp0,FP_SRC(%a6) 4175 lea FP_SRC(%a6),%a0 4176 bsr.l tag 4177 mov.b %d0,STAG(%a6) 4178 mov.b %d0,%d1 4179 4180 andi.l &0x00ff00ff,USER_FPSR 4181 4182 clr.l %d0 4183 mov.b FPCR_MODE(%a6),%d0 4184 4185 mov.b %d1,STAG(%a6) 4186 tst.b %d1 4187 bne.b _L20_2d 4188 bsr.l ssincos 4189 bra.b _L20_6d 4190 _L20_2d: 4191 cmpi.b %d1,&ZERO 4192 bne.b _L20_3d 4193 bsr.l ssincosz 4194 bra.b _L20_6d 4195 _L20_3d: 4196 cmpi.b %d1,&INF 4197 bne.b _L20_4d 4198 bsr.l ssincosi 4199 bra.b _L20_6d 4200 _L20_4d: 4201 cmpi.b %d1,&QNAN 4202 bne.b _L20_5d 4203 bsr.l ssincosqnan 4204 bra.b _L20_6d 4205 _L20_5d: 4206 bsr.l ssincosd 4207 _L20_6d: 4208 4209 # 4210 # Result is now in FP0 4211 # 4212 movm.l EXC_DREGS(%a6),&0x030 4213 fmovm.l USER_FPCR(%a6),%fpcr, 4214 fmovm.x &0x03,-(%sp) 4215 fmovm.x (%sp)+,&0x40 4216 fmovm.x (%sp)+,&0x80 4217 unlk %a6 4218 rts 4219 4220 global _fsincosx_ 4221 _fsincosx_: 4222 link %a6,&-LOCAL_SIZE 4223 4224 movm.l &0x0303,EXC_DREGS(%a6 4225 fmovm.l %fpcr,%fpsr,USER_FPCR 4226 fmovm.x &0xc0,EXC_FP0(%a6) 4227 4228 fmov.l &0x0,%fpcr 4229 4230 # 4231 # copy, convert, and tag input argument 4232 # 4233 lea FP_SRC(%a6),%a0 4234 mov.l 0x8+0x0(%a6),0x0(%a0) 4235 mov.l 0x8+0x4(%a6),0x4(%a0) 4236 mov.l 0x8+0x8(%a6),0x8(%a0) 4237 bsr.l tag 4238 mov.b %d0,STAG(%a6) 4239 mov.b %d0,%d1 4240 4241 andi.l &0x00ff00ff,USER_FPSR 4242 4243 clr.l %d0 4244 mov.b FPCR_MODE(%a6),%d0 4245 4246 tst.b %d1 4247 bne.b _L20_2x 4248 bsr.l ssincos 4249 bra.b _L20_6x 4250 _L20_2x: 4251 cmpi.b %d1,&ZERO 4252 bne.b _L20_3x 4253 bsr.l ssincosz 4254 bra.b _L20_6x 4255 _L20_3x: 4256 cmpi.b %d1,&INF 4257 bne.b _L20_4x 4258 bsr.l ssincosi 4259 bra.b _L20_6x 4260 _L20_4x: 4261 cmpi.b %d1,&QNAN 4262 bne.b _L20_5x 4263 bsr.l ssincosqnan 4264 bra.b _L20_6x 4265 _L20_5x: 4266 bsr.l ssincosd 4267 _L20_6x: 4268 4269 # 4270 # Result is now in FP0 4271 # 4272 movm.l EXC_DREGS(%a6),&0x030 4273 fmovm.l USER_FPCR(%a6),%fpcr, 4274 fmovm.x &0x03,-(%sp) 4275 fmovm.x (%sp)+,&0x40 4276 fmovm.x (%sp)+,&0x80 4277 unlk %a6 4278 rts 4279 4280 4281 ############################################# 4282 # DYADIC TEMPLATE 4283 ############################################# 4284 global _frems_ 4285 _frems_: 4286 link %a6,&-LOCAL_SIZE 4287 4288 movm.l &0x0303,EXC_DREGS(%a6 4289 fmovm.l %fpcr,%fpsr,USER_FPCR 4290 fmovm.x &0xc0,EXC_FP0(%a6) 4291 4292 fmov.l &0x0,%fpcr 4293 4294 # 4295 # copy, convert, and tag input argument 4296 # 4297 fmov.s 0x8(%a6),%fp0 4298 fmov.x %fp0,FP_DST(%a6) 4299 lea FP_DST(%a6),%a0 4300 bsr.l tag 4301 mov.b %d0,DTAG(%a6) 4302 4303 fmov.s 0xc(%a6),%fp0 4304 fmov.x %fp0,FP_SRC(%a6) 4305 lea FP_SRC(%a6),%a0 4306 bsr.l tag 4307 mov.b %d0,STAG(%a6) 4308 mov.l %d0,%d1 4309 4310 andi.l &0x00ff00ff,USER_FPSR 4311 4312 clr.l %d0 4313 mov.b FPCR_MODE(%a6),%d0 4314 4315 lea FP_SRC(%a6),%a0 4316 lea FP_DST(%a6),%a1 4317 4318 tst.b %d1 4319 bne.b _L21_2s 4320 bsr.l srem_snorm 4321 bra.b _L21_6s 4322 _L21_2s: 4323 cmpi.b %d1,&ZERO 4324 bne.b _L21_3s 4325 bsr.l srem_szero 4326 bra.b _L21_6s 4327 _L21_3s: 4328 cmpi.b %d1,&INF 4329 bne.b _L21_4s 4330 bsr.l srem_sinf 4331 bra.b _L21_6s 4332 _L21_4s: 4333 cmpi.b %d1,&QNAN 4334 bne.b _L21_5s 4335 bsr.l sop_sqnan 4336 bra.b _L21_6s 4337 _L21_5s: 4338 bsr.l srem_sdnrm 4339 _L21_6s: 4340 4341 # 4342 # Result is now in FP0 4343 # 4344 movm.l EXC_DREGS(%a6),&0x030 4345 fmovm.l USER_FPCR(%a6),%fpcr, 4346 fmovm.x EXC_FP1(%a6),&0x40 4347 unlk %a6 4348 rts 4349 4350 global _fremd_ 4351 _fremd_: 4352 link %a6,&-LOCAL_SIZE 4353 4354 movm.l &0x0303,EXC_DREGS(%a6 4355 fmovm.l %fpcr,%fpsr,USER_FPCR 4356 fmovm.x &0xc0,EXC_FP0(%a6) 4357 4358 fmov.l &0x0,%fpcr 4359 4360 # 4361 # copy, convert, and tag input argument 4362 # 4363 fmov.d 0x8(%a6),%fp0 4364 fmov.x %fp0,FP_DST(%a6) 4365 lea FP_DST(%a6),%a0 4366 bsr.l tag 4367 mov.b %d0,DTAG(%a6) 4368 4369 fmov.d 0x10(%a6),%fp0 4370 fmov.x %fp0,FP_SRC(%a6) 4371 lea FP_SRC(%a6),%a0 4372 bsr.l tag 4373 mov.b %d0,STAG(%a6) 4374 mov.l %d0,%d1 4375 4376 andi.l &0x00ff00ff,USER_FPSR 4377 4378 clr.l %d0 4379 mov.b FPCR_MODE(%a6),%d0 4380 4381 lea FP_SRC(%a6),%a0 4382 lea FP_DST(%a6),%a1 4383 4384 tst.b %d1 4385 bne.b _L21_2d 4386 bsr.l srem_snorm 4387 bra.b _L21_6d 4388 _L21_2d: 4389 cmpi.b %d1,&ZERO 4390 bne.b _L21_3d 4391 bsr.l srem_szero 4392 bra.b _L21_6d 4393 _L21_3d: 4394 cmpi.b %d1,&INF 4395 bne.b _L21_4d 4396 bsr.l srem_sinf 4397 bra.b _L21_6d 4398 _L21_4d: 4399 cmpi.b %d1,&QNAN 4400 bne.b _L21_5d 4401 bsr.l sop_sqnan 4402 bra.b _L21_6d 4403 _L21_5d: 4404 bsr.l srem_sdnrm 4405 _L21_6d: 4406 4407 # 4408 # Result is now in FP0 4409 # 4410 movm.l EXC_DREGS(%a6),&0x030 4411 fmovm.l USER_FPCR(%a6),%fpcr, 4412 fmovm.x EXC_FP1(%a6),&0x40 4413 unlk %a6 4414 rts 4415 4416 global _fremx_ 4417 _fremx_: 4418 link %a6,&-LOCAL_SIZE 4419 4420 movm.l &0x0303,EXC_DREGS(%a6 4421 fmovm.l %fpcr,%fpsr,USER_FPCR 4422 fmovm.x &0xc0,EXC_FP0(%a6) 4423 4424 fmov.l &0x0,%fpcr 4425 4426 # 4427 # copy, convert, and tag input argument 4428 # 4429 lea FP_DST(%a6),%a0 4430 mov.l 0x8+0x0(%a6),0x0(%a0) 4431 mov.l 0x8+0x4(%a6),0x4(%a0) 4432 mov.l 0x8+0x8(%a6),0x8(%a0) 4433 bsr.l tag 4434 mov.b %d0,DTAG(%a6) 4435 4436 lea FP_SRC(%a6),%a0 4437 mov.l 0x14+0x0(%a6),0x0(%a0 4438 mov.l 0x14+0x4(%a6),0x4(%a0 4439 mov.l 0x14+0x8(%a6),0x8(%a0 4440 bsr.l tag 4441 mov.b %d0,STAG(%a6) 4442 mov.l %d0,%d1 4443 4444 andi.l &0x00ff00ff,USER_FPSR 4445 4446 clr.l %d0 4447 mov.b FPCR_MODE(%a6),%d0 4448 4449 lea FP_SRC(%a6),%a0 4450 lea FP_DST(%a6),%a1 4451 4452 tst.b %d1 4453 bne.b _L21_2x 4454 bsr.l srem_snorm 4455 bra.b _L21_6x 4456 _L21_2x: 4457 cmpi.b %d1,&ZERO 4458 bne.b _L21_3x 4459 bsr.l srem_szero 4460 bra.b _L21_6x 4461 _L21_3x: 4462 cmpi.b %d1,&INF 4463 bne.b _L21_4x 4464 bsr.l srem_sinf 4465 bra.b _L21_6x 4466 _L21_4x: 4467 cmpi.b %d1,&QNAN 4468 bne.b _L21_5x 4469 bsr.l sop_sqnan 4470 bra.b _L21_6x 4471 _L21_5x: 4472 bsr.l srem_sdnrm 4473 _L21_6x: 4474 4475 # 4476 # Result is now in FP0 4477 # 4478 movm.l EXC_DREGS(%a6),&0x030 4479 fmovm.l USER_FPCR(%a6),%fpcr, 4480 fmovm.x EXC_FP1(%a6),&0x40 4481 unlk %a6 4482 rts 4483 4484 4485 ############################################# 4486 # DYADIC TEMPLATE 4487 ############################################# 4488 global _fmods_ 4489 _fmods_: 4490 link %a6,&-LOCAL_SIZE 4491 4492 movm.l &0x0303,EXC_DREGS(%a6 4493 fmovm.l %fpcr,%fpsr,USER_FPCR 4494 fmovm.x &0xc0,EXC_FP0(%a6) 4495 4496 fmov.l &0x0,%fpcr 4497 4498 # 4499 # copy, convert, and tag input argument 4500 # 4501 fmov.s 0x8(%a6),%fp0 4502 fmov.x %fp0,FP_DST(%a6) 4503 lea FP_DST(%a6),%a0 4504 bsr.l tag 4505 mov.b %d0,DTAG(%a6) 4506 4507 fmov.s 0xc(%a6),%fp0 4508 fmov.x %fp0,FP_SRC(%a6) 4509 lea FP_SRC(%a6),%a0 4510 bsr.l tag 4511 mov.b %d0,STAG(%a6) 4512 mov.l %d0,%d1 4513 4514 andi.l &0x00ff00ff,USER_FPSR 4515 4516 clr.l %d0 4517 mov.b FPCR_MODE(%a6),%d0 4518 4519 lea FP_SRC(%a6),%a0 4520 lea FP_DST(%a6),%a1 4521 4522 tst.b %d1 4523 bne.b _L22_2s 4524 bsr.l smod_snorm 4525 bra.b _L22_6s 4526 _L22_2s: 4527 cmpi.b %d1,&ZERO 4528 bne.b _L22_3s 4529 bsr.l smod_szero 4530 bra.b _L22_6s 4531 _L22_3s: 4532 cmpi.b %d1,&INF 4533 bne.b _L22_4s 4534 bsr.l smod_sinf 4535 bra.b _L22_6s 4536 _L22_4s: 4537 cmpi.b %d1,&QNAN 4538 bne.b _L22_5s 4539 bsr.l sop_sqnan 4540 bra.b _L22_6s 4541 _L22_5s: 4542 bsr.l smod_sdnrm 4543 _L22_6s: 4544 4545 # 4546 # Result is now in FP0 4547 # 4548 movm.l EXC_DREGS(%a6),&0x030 4549 fmovm.l USER_FPCR(%a6),%fpcr, 4550 fmovm.x EXC_FP1(%a6),&0x40 4551 unlk %a6 4552 rts 4553 4554 global _fmodd_ 4555 _fmodd_: 4556 link %a6,&-LOCAL_SIZE 4557 4558 movm.l &0x0303,EXC_DREGS(%a6 4559 fmovm.l %fpcr,%fpsr,USER_FPCR 4560 fmovm.x &0xc0,EXC_FP0(%a6) 4561 4562 fmov.l &0x0,%fpcr 4563 4564 # 4565 # copy, convert, and tag input argument 4566 # 4567 fmov.d 0x8(%a6),%fp0 4568 fmov.x %fp0,FP_DST(%a6) 4569 lea FP_DST(%a6),%a0 4570 bsr.l tag 4571 mov.b %d0,DTAG(%a6) 4572 4573 fmov.d 0x10(%a6),%fp0 4574 fmov.x %fp0,FP_SRC(%a6) 4575 lea FP_SRC(%a6),%a0 4576 bsr.l tag 4577 mov.b %d0,STAG(%a6) 4578 mov.l %d0,%d1 4579 4580 andi.l &0x00ff00ff,USER_FPSR 4581 4582 clr.l %d0 4583 mov.b FPCR_MODE(%a6),%d0 4584 4585 lea FP_SRC(%a6),%a0 4586 lea FP_DST(%a6),%a1 4587 4588 tst.b %d1 4589 bne.b _L22_2d 4590 bsr.l smod_snorm 4591 bra.b _L22_6d 4592 _L22_2d: 4593 cmpi.b %d1,&ZERO 4594 bne.b _L22_3d 4595 bsr.l smod_szero 4596 bra.b _L22_6d 4597 _L22_3d: 4598 cmpi.b %d1,&INF 4599 bne.b _L22_4d 4600 bsr.l smod_sinf 4601 bra.b _L22_6d 4602 _L22_4d: 4603 cmpi.b %d1,&QNAN 4604 bne.b _L22_5d 4605 bsr.l sop_sqnan 4606 bra.b _L22_6d 4607 _L22_5d: 4608 bsr.l smod_sdnrm 4609 _L22_6d: 4610 4611 # 4612 # Result is now in FP0 4613 # 4614 movm.l EXC_DREGS(%a6),&0x030 4615 fmovm.l USER_FPCR(%a6),%fpcr, 4616 fmovm.x EXC_FP1(%a6),&0x40 4617 unlk %a6 4618 rts 4619 4620 global _fmodx_ 4621 _fmodx_: 4622 link %a6,&-LOCAL_SIZE 4623 4624 movm.l &0x0303,EXC_DREGS(%a6 4625 fmovm.l %fpcr,%fpsr,USER_FPCR 4626 fmovm.x &0xc0,EXC_FP0(%a6) 4627 4628 fmov.l &0x0,%fpcr 4629 4630 # 4631 # copy, convert, and tag input argument 4632 # 4633 lea FP_DST(%a6),%a0 4634 mov.l 0x8+0x0(%a6),0x0(%a0) 4635 mov.l 0x8+0x4(%a6),0x4(%a0) 4636 mov.l 0x8+0x8(%a6),0x8(%a0) 4637 bsr.l tag 4638 mov.b %d0,DTAG(%a6) 4639 4640 lea FP_SRC(%a6),%a0 4641 mov.l 0x14+0x0(%a6),0x0(%a0 4642 mov.l 0x14+0x4(%a6),0x4(%a0 4643 mov.l 0x14+0x8(%a6),0x8(%a0 4644 bsr.l tag 4645 mov.b %d0,STAG(%a6) 4646 mov.l %d0,%d1 4647 4648 andi.l &0x00ff00ff,USER_FPSR 4649 4650 clr.l %d0 4651 mov.b FPCR_MODE(%a6),%d0 4652 4653 lea FP_SRC(%a6),%a0 4654 lea FP_DST(%a6),%a1 4655 4656 tst.b %d1 4657 bne.b _L22_2x 4658 bsr.l smod_snorm 4659 bra.b _L22_6x 4660 _L22_2x: 4661 cmpi.b %d1,&ZERO 4662 bne.b _L22_3x 4663 bsr.l smod_szero 4664 bra.b _L22_6x 4665 _L22_3x: 4666 cmpi.b %d1,&INF 4667 bne.b _L22_4x 4668 bsr.l smod_sinf 4669 bra.b _L22_6x 4670 _L22_4x: 4671 cmpi.b %d1,&QNAN 4672 bne.b _L22_5x 4673 bsr.l sop_sqnan 4674 bra.b _L22_6x 4675 _L22_5x: 4676 bsr.l smod_sdnrm 4677 _L22_6x: 4678 4679 # 4680 # Result is now in FP0 4681 # 4682 movm.l EXC_DREGS(%a6),&0x030 4683 fmovm.l USER_FPCR(%a6),%fpcr, 4684 fmovm.x EXC_FP1(%a6),&0x40 4685 unlk %a6 4686 rts 4687 4688 4689 ############################################# 4690 # DYADIC TEMPLATE 4691 ############################################# 4692 global _fscales_ 4693 _fscales_: 4694 link %a6,&-LOCAL_SIZE 4695 4696 movm.l &0x0303,EXC_DREGS(%a6 4697 fmovm.l %fpcr,%fpsr,USER_FPCR 4698 fmovm.x &0xc0,EXC_FP0(%a6) 4699 4700 fmov.l &0x0,%fpcr 4701 4702 # 4703 # copy, convert, and tag input argument 4704 # 4705 fmov.s 0x8(%a6),%fp0 4706 fmov.x %fp0,FP_DST(%a6) 4707 lea FP_DST(%a6),%a0 4708 bsr.l tag 4709 mov.b %d0,DTAG(%a6) 4710 4711 fmov.s 0xc(%a6),%fp0 4712 fmov.x %fp0,FP_SRC(%a6) 4713 lea FP_SRC(%a6),%a0 4714 bsr.l tag 4715 mov.b %d0,STAG(%a6) 4716 mov.l %d0,%d1 4717 4718 andi.l &0x00ff00ff,USER_FPSR 4719 4720 clr.l %d0 4721 mov.b FPCR_MODE(%a6),%d0 4722 4723 lea FP_SRC(%a6),%a0 4724 lea FP_DST(%a6),%a1 4725 4726 tst.b %d1 4727 bne.b _L23_2s 4728 bsr.l sscale_snorm 4729 bra.b _L23_6s 4730 _L23_2s: 4731 cmpi.b %d1,&ZERO 4732 bne.b _L23_3s 4733 bsr.l sscale_szero 4734 bra.b _L23_6s 4735 _L23_3s: 4736 cmpi.b %d1,&INF 4737 bne.b _L23_4s 4738 bsr.l sscale_sinf 4739 bra.b _L23_6s 4740 _L23_4s: 4741 cmpi.b %d1,&QNAN 4742 bne.b _L23_5s 4743 bsr.l sop_sqnan 4744 bra.b _L23_6s 4745 _L23_5s: 4746 bsr.l sscale_sdnrm 4747 _L23_6s: 4748 4749 # 4750 # Result is now in FP0 4751 # 4752 movm.l EXC_DREGS(%a6),&0x030 4753 fmovm.l USER_FPCR(%a6),%fpcr, 4754 fmovm.x EXC_FP1(%a6),&0x40 4755 unlk %a6 4756 rts 4757 4758 global _fscaled_ 4759 _fscaled_: 4760 link %a6,&-LOCAL_SIZE 4761 4762 movm.l &0x0303,EXC_DREGS(%a6 4763 fmovm.l %fpcr,%fpsr,USER_FPCR 4764 fmovm.x &0xc0,EXC_FP0(%a6) 4765 4766 fmov.l &0x0,%fpcr 4767 4768 # 4769 # copy, convert, and tag input argument 4770 # 4771 fmov.d 0x8(%a6),%fp0 4772 fmov.x %fp0,FP_DST(%a6) 4773 lea FP_DST(%a6),%a0 4774 bsr.l tag 4775 mov.b %d0,DTAG(%a6) 4776 4777 fmov.d 0x10(%a6),%fp0 4778 fmov.x %fp0,FP_SRC(%a6) 4779 lea FP_SRC(%a6),%a0 4780 bsr.l tag 4781 mov.b %d0,STAG(%a6) 4782 mov.l %d0,%d1 4783 4784 andi.l &0x00ff00ff,USER_FPSR 4785 4786 clr.l %d0 4787 mov.b FPCR_MODE(%a6),%d0 4788 4789 lea FP_SRC(%a6),%a0 4790 lea FP_DST(%a6),%a1 4791 4792 tst.b %d1 4793 bne.b _L23_2d 4794 bsr.l sscale_snorm 4795 bra.b _L23_6d 4796 _L23_2d: 4797 cmpi.b %d1,&ZERO 4798 bne.b _L23_3d 4799 bsr.l sscale_szero 4800 bra.b _L23_6d 4801 _L23_3d: 4802 cmpi.b %d1,&INF 4803 bne.b _L23_4d 4804 bsr.l sscale_sinf 4805 bra.b _L23_6d 4806 _L23_4d: 4807 cmpi.b %d1,&QNAN 4808 bne.b _L23_5d 4809 bsr.l sop_sqnan 4810 bra.b _L23_6d 4811 _L23_5d: 4812 bsr.l sscale_sdnrm 4813 _L23_6d: 4814 4815 # 4816 # Result is now in FP0 4817 # 4818 movm.l EXC_DREGS(%a6),&0x030 4819 fmovm.l USER_FPCR(%a6),%fpcr, 4820 fmovm.x EXC_FP1(%a6),&0x40 4821 unlk %a6 4822 rts 4823 4824 global _fscalex_ 4825 _fscalex_: 4826 link %a6,&-LOCAL_SIZE 4827 4828 movm.l &0x0303,EXC_DREGS(%a6 4829 fmovm.l %fpcr,%fpsr,USER_FPCR 4830 fmovm.x &0xc0,EXC_FP0(%a6) 4831 4832 fmov.l &0x0,%fpcr 4833 4834 # 4835 # copy, convert, and tag input argument 4836 # 4837 lea FP_DST(%a6),%a0 4838 mov.l 0x8+0x0(%a6),0x0(%a0) 4839 mov.l 0x8+0x4(%a6),0x4(%a0) 4840 mov.l 0x8+0x8(%a6),0x8(%a0) 4841 bsr.l tag 4842 mov.b %d0,DTAG(%a6) 4843 4844 lea FP_SRC(%a6),%a0 4845 mov.l 0x14+0x0(%a6),0x0(%a0 4846 mov.l 0x14+0x4(%a6),0x4(%a0 4847 mov.l 0x14+0x8(%a6),0x8(%a0 4848 bsr.l tag 4849 mov.b %d0,STAG(%a6) 4850 mov.l %d0,%d1 4851 4852 andi.l &0x00ff00ff,USER_FPSR 4853 4854 clr.l %d0 4855 mov.b FPCR_MODE(%a6),%d0 4856 4857 lea FP_SRC(%a6),%a0 4858 lea FP_DST(%a6),%a1 4859 4860 tst.b %d1 4861 bne.b _L23_2x 4862 bsr.l sscale_snorm 4863 bra.b _L23_6x 4864 _L23_2x: 4865 cmpi.b %d1,&ZERO 4866 bne.b _L23_3x 4867 bsr.l sscale_szero 4868 bra.b _L23_6x 4869 _L23_3x: 4870 cmpi.b %d1,&INF 4871 bne.b _L23_4x 4872 bsr.l sscale_sinf 4873 bra.b _L23_6x 4874 _L23_4x: 4875 cmpi.b %d1,&QNAN 4876 bne.b _L23_5x 4877 bsr.l sop_sqnan 4878 bra.b _L23_6x 4879 _L23_5x: 4880 bsr.l sscale_sdnrm 4881 _L23_6x: 4882 4883 # 4884 # Result is now in FP0 4885 # 4886 movm.l EXC_DREGS(%a6),&0x030 4887 fmovm.l USER_FPCR(%a6),%fpcr, 4888 fmovm.x EXC_FP1(%a6),&0x40 4889 unlk %a6 4890 rts 4891 4892 4893 ############################################# 4894 # ssin(): computes the sine of a normaliz 4895 # ssind(): computes the sine of a denormal 4896 # scos(): computes the cosine of a normal 4897 # scosd(): computes the cosine of a denorm 4898 # ssincos(): computes the sine and cosine of 4899 # ssincosd(): computes the sine and cosine of 4900 # 4901 # INPUT ************************************* 4902 # a0 = pointer to extended precision in 4903 # d0 = round precision,mode 4904 # 4905 # OUTPUT ************************************ 4906 # fp0 = sin(X) or cos(X) 4907 # 4908 # For ssincos(X): 4909 # fp0 = sin(X) 4910 # fp1 = cos(X) 4911 # 4912 # ACCURACY and MONOTONICITY ***************** 4913 # The returned result is within 1 ulp i 4914 # within 0.5001 ulp to 53 bits if the r 4915 # rounded to double precision. The resu 4916 # in double precision. 4917 # 4918 # ALGORITHM ********************************* 4919 # 4920 # SIN and COS: 4921 # 1. If SIN is invoked, set AdjN := 0; 4922 # 4923 # 2. If |X| >= 15Pi or |X| < 2**(-40), 4924 # 4925 # 3. Decompose X as X = N(Pi/2) + r whe 4926 # k = N mod 4, so in particular 4927 # Overwrite k by k := k + AdjN. 4928 # 4929 # 4. If k is even, go to 6. 4930 # 4931 # 5. (k is odd) Set j := (k-1)/2, sgn : 4932 # Return sgn*cos(r) where cos(r 4933 # even polynomial in r, 1 + r*r 4934 # s = r*r. 4935 # Exit. 4936 # 4937 # 6. (k is even) Set j := k/2, sgn := ( 4938 # where sin(r) is approximated 4939 # r + r*s*(A1+s*(A2+ ... + s*A7 4940 # Exit. 4941 # 4942 # 7. If |X| > 1, go to 9. 4943 # 4944 # 8. (|X|<2**(-40)) If SIN is invoked, 4945 # otherwise return 1. 4946 # 4947 # 9. Overwrite X by X := X rem 2Pi. Now 4948 # go back to 3. 4949 # 4950 # SINCOS: 4951 # 1. If |X| >= 15Pi or |X| < 2**(-40), 4952 # 4953 # 2. Decompose X as X = N(Pi/2) + r whe 4954 # k = N mod 4, so in particular 4955 # 4956 # 3. If k is even, go to 5. 4957 # 4958 # 4. (k is odd) Set j1 := (k-1)/2, j2 : 4959 # j1 exclusive or with the l.s. 4960 # sgn1 := (-1)**j1, sgn2 := (-1 4961 # SIN(X) = sgn1 * cos(r) and CO 4962 # sin(r) and cos(r) are compute 4963 # polynomials in r, respectivel 4964 # 4965 # 5. (k is even) Set j1 := k/2, sgn1 := 4966 # SIN(X) = sgn1 * sin(r) and CO 4967 # sin(r) and cos(r) are compute 4968 # polynomials in r, respectivel 4969 # 4970 # 6. If |X| > 1, go to 8. 4971 # 4972 # 7. (|X|<2**(-40)) SIN(X) = X and COS( 4973 # 4974 # 8. Overwrite X by X := X rem 2Pi. Now 4975 # go back to 2. 4976 # 4977 ############################################# 4978 4979 SINA7: long 0xBD6AAA77,0xCCC994F5 4980 SINA6: long 0x3DE61209,0x7AAE8DA1 4981 SINA5: long 0xBE5AE645,0x2A118AE4 4982 SINA4: long 0x3EC71DE3,0xA5341531 4983 SINA3: long 0xBF2A01A0,0x1A018B59 4984 SINA2: long 0x3FF80000,0x88888888 4985 SINA1: long 0xBFFC0000,0xAAAAAAAA 4986 4987 COSB8: long 0x3D2AC4D0,0xD6011EE3 4988 COSB7: long 0xBDA9396F,0x9F45AC19 4989 COSB6: long 0x3E21EED9,0x0612C972 4990 COSB5: long 0xBE927E4F,0xB79D9FCF 4991 COSB4: long 0x3EFA01A0,0x1A01D423 4992 COSB3: long 0xBFF50000,0xB60B60B6 4993 COSB2: long 0x3FFA0000,0xAAAAAAAA 4994 COSB1: long 0xBF000000 4995 4996 set INARG,FP_SCR0 4997 4998 set X,FP_SCR0 4999 # set XDCARE,X+2 5000 set XFRAC,X+4 5001 5002 set RPRIME,FP_SCR0 5003 set SPRIME,FP_SCR1 5004 5005 set POSNEG1,L_SCR1 5006 set TWOTO63,L_SCR1 5007 5008 set ENDFLAG,L_SCR2 5009 set INT,L_SCR2 5010 5011 set ADJN,L_SCR3 5012 5013 ############################################ 5014 global ssin 5015 ssin: 5016 mov.l &0,ADJN(%a6) 5017 bra.b SINBGN 5018 5019 ############################################ 5020 global scos 5021 scos: 5022 mov.l &1,ADJN(%a6) 5023 5024 ############################################ 5025 SINBGN: 5026 #--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL 5027 5028 fmov.x (%a0),%fp0 5029 fmov.x %fp0,X(%a6) 5030 5031 # "COMPACTIFY" X 5032 mov.l (%a0),%d1 5033 mov.w 4(%a0),%d1 5034 and.l &0x7FFFFFFF,%d1 5035 5036 cmpi.l %d1,&0x3FD78000 5037 bge.b SOK1 5038 bra.w SINSM 5039 5040 SOK1: 5041 cmp.l %d1,&0x4004BC7E 5042 blt.b SINMAIN 5043 bra.w SREDUCEX 5044 5045 #--THIS IS THE USUAL CASE, |X| <= 15 PI. 5046 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO 5047 SINMAIN: 5048 fmov.x %fp0,%fp1 5049 fmul.d TWOBYPI(%pc),%fp1 5050 5051 lea PITBL+0x200(%pc),%a1 5052 5053 fmov.l %fp1,INT(%a6) 5054 5055 mov.l INT(%a6),%d1 5056 asl.l &4,%d1 5057 add.l %d1,%a1 5058 5059 # A1 IS THE ADDRESS OF N*PIBY2 5060 # ...WHICH IS IN TWO PIECES Y1 & Y2 5061 fsub.x (%a1)+,%fp0 5062 fsub.s (%a1),%fp0 5063 5064 SINCONT: 5065 #--continuation from REDUCEX 5066 5067 #--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS 5068 mov.l INT(%a6),%d1 5069 add.l ADJN(%a6),%d1 5070 ror.l &1,%d1 5071 cmp.l %d1,&0 5072 blt.w COSPOLY 5073 5074 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN 5075 #--THEN WE RETURN SGN*SIN(R). SGN*SIN(R 5076 #--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... + 5077 #--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN A 5078 #--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T 5079 #--WHERE T=S*S. 5080 #--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUB 5081 #--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FOR 5082 SINPOLY: 5083 fmovm.x &0x0c,-(%sp) 5084 5085 fmov.x %fp0,X(%a6) 5086 fmul.x %fp0,%fp0 5087 5088 fmov.d SINA7(%pc),%fp3 5089 fmov.d SINA6(%pc),%fp2 5090 5091 fmov.x %fp0,%fp1 5092 fmul.x %fp1,%fp1 5093 5094 ror.l &1,%d1 5095 and.l &0x80000000,%d1 5096 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION 5097 eor.l %d1,X(%a6) 5098 5099 fmul.x %fp1,%fp3 5100 fmul.x %fp1,%fp2 5101 5102 fadd.d SINA5(%pc),%fp3 5103 fadd.d SINA4(%pc),%fp2 5104 5105 fmul.x %fp1,%fp3 5106 fmul.x %fp1,%fp2 5107 5108 fadd.d SINA3(%pc),%fp3 5109 fadd.x SINA2(%pc),%fp2 5110 5111 fmul.x %fp3,%fp1 5112 5113 fmul.x %fp0,%fp2 5114 fadd.x SINA1(%pc),%fp1 5115 fmul.x X(%a6),%fp0 5116 5117 fadd.x %fp2,%fp1 5118 5119 fmul.x %fp1,%fp0 5120 5121 fmovm.x (%sp)+,&0x30 5122 5123 fmov.l %d0,%fpcr 5124 fadd.x X(%a6),%fp0 5125 bra t_inx2 5126 5127 #--LET J BE THE LEAST SIG. BIT OF D0, LET SGN 5128 #--THEN WE RETURN SGN*COS(R). SGN*COS(R 5129 #--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... + 5130 #--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN 5131 #--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B 5132 #--WHERE T=S*S. 5133 #--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUB 5134 #--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FOR 5135 #--AND IS THEREFORE STORED AS SINGLE PRECISIO 5136 COSPOLY: 5137 fmovm.x &0x0c,-(%sp) 5138 5139 fmul.x %fp0,%fp0 5140 5141 fmov.d COSB8(%pc),%fp2 5142 fmov.d COSB7(%pc),%fp3 5143 5144 fmov.x %fp0,%fp1 5145 fmul.x %fp1,%fp1 5146 5147 fmov.x %fp0,X(%a6) 5148 ror.l &1,%d1 5149 and.l &0x80000000,%d1 5150 # ...LEAST SIG. BIT OF D0 IN SIGN POSITION 5151 5152 fmul.x %fp1,%fp2 5153 5154 eor.l %d1,X(%a6) 5155 and.l &0x80000000,%d1 5156 5157 fmul.x %fp1,%fp3 5158 5159 or.l &0x3F800000,%d1 5160 mov.l %d1,POSNEG1(%a6) 5161 5162 fadd.d COSB6(%pc),%fp2 5163 fadd.d COSB5(%pc),%fp3 5164 5165 fmul.x %fp1,%fp2 5166 fmul.x %fp1,%fp3 5167 5168 fadd.d COSB4(%pc),%fp2 5169 fadd.x COSB3(%pc),%fp3 5170 5171 fmul.x %fp1,%fp2 5172 fmul.x %fp3,%fp1 5173 5174 fadd.x COSB2(%pc),%fp2 5175 fadd.s COSB1(%pc),%fp1 5176 5177 fmul.x %fp2,%fp0 5178 5179 fadd.x %fp1,%fp0 5180 5181 fmul.x X(%a6),%fp0 5182 5183 fmovm.x (%sp)+,&0x30 5184 5185 fmov.l %d0,%fpcr 5186 fadd.s POSNEG1(%a6),%fp0 5187 bra t_inx2 5188 5189 ############################################# 5190 5191 # SINe: Big OR Small? 5192 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT 5193 #--IF |X| < 2**(-40), RETURN X OR 1. 5194 SINBORS: 5195 cmp.l %d1,&0x3FFF8000 5196 bgt.l SREDUCEX 5197 5198 SINSM: 5199 mov.l ADJN(%a6),%d1 5200 cmp.l %d1,&0 5201 bgt.b COSTINY 5202 5203 # here, the operation may underflow iff the p 5204 # extended denorms are handled through anothe 5205 SINTINY: 5206 # mov.w &0x0000,XDCARE(%a6) 5207 5208 fmov.l %d0,%fpcr 5209 mov.b &FMOV_OP,%d1 5210 fmov.x X(%a6),%fp0 5211 bra t_catch 5212 5213 COSTINY: 5214 fmov.s &0x3F800000,%fp0 5215 fmov.l %d0,%fpcr 5216 fadd.s &0x80800000,%fp0 5217 bra t_pinx2 5218 5219 ############################################# 5220 global ssind 5221 #--SIN(X) = X FOR DENORMALIZED X 5222 ssind: 5223 bra t_extdnrm 5224 5225 ############################################ 5226 global scosd 5227 #--COS(X) = 1 FOR DENORMALIZED X 5228 scosd: 5229 fmov.s &0x3F800000,%fp0 5230 bra t_pinx2 5231 5232 ############################################# 5233 5234 global ssincos 5235 ssincos: 5236 #--SET ADJN TO 4 5237 mov.l &4,ADJN(%a6) 5238 5239 fmov.x (%a0),%fp0 5240 fmov.x %fp0,X(%a6) 5241 5242 mov.l (%a0),%d1 5243 mov.w 4(%a0),%d1 5244 and.l &0x7FFFFFFF,%d1 5245 5246 cmp.l %d1,&0x3FD78000 5247 bge.b SCOK1 5248 bra.w SCSM 5249 5250 SCOK1: 5251 cmp.l %d1,&0x4004BC7E 5252 blt.b SCMAIN 5253 bra.w SREDUCEX 5254 5255 5256 #--THIS IS THE USUAL CASE, |X| <= 15 PI. 5257 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO 5258 SCMAIN: 5259 fmov.x %fp0,%fp1 5260 5261 fmul.d TWOBYPI(%pc),%fp1 5262 5263 lea PITBL+0x200(%pc),%a1 5264 5265 fmov.l %fp1,INT(%a6) 5266 5267 mov.l INT(%a6),%d1 5268 asl.l &4,%d1 5269 add.l %d1,%a1 5270 5271 fsub.x (%a1)+,%fp0 5272 fsub.s (%a1),%fp0 5273 5274 SCCONT: 5275 #--continuation point from REDUCEX 5276 5277 mov.l INT(%a6),%d1 5278 ror.l &1,%d1 5279 cmp.l %d1,&0 5280 bge.w NEVEN 5281 5282 SNODD: 5283 #--REGISTERS SAVED SO FAR: D0, A0, FP2. 5284 fmovm.x &0x04,-(%sp) 5285 5286 fmov.x %fp0,RPRIME(%a6) 5287 fmul.x %fp0,%fp0 5288 fmov.d SINA7(%pc),%fp1 5289 fmov.d COSB8(%pc),%fp2 5290 fmul.x %fp0,%fp1 5291 fmul.x %fp0,%fp2 5292 5293 mov.l %d2,-(%sp) 5294 mov.l %d1,%d2 5295 ror.l &1,%d2 5296 and.l &0x80000000,%d2 5297 eor.l %d1,%d2 5298 and.l &0x80000000,%d2 5299 5300 fadd.d SINA6(%pc),%fp1 5301 fadd.d COSB7(%pc),%fp2 5302 5303 fmul.x %fp0,%fp1 5304 eor.l %d2,RPRIME(%a6) 5305 mov.l (%sp)+,%d2 5306 fmul.x %fp0,%fp2 5307 ror.l &1,%d1 5308 and.l &0x80000000,%d1 5309 mov.l &0x3F800000,POSNEG1(% 5310 eor.l %d1,POSNEG1(%a6) 5311 5312 fadd.d SINA5(%pc),%fp1 5313 fadd.d COSB6(%pc),%fp2 5314 5315 fmul.x %fp0,%fp1 5316 fmul.x %fp0,%fp2 5317 fmov.x %fp0,SPRIME(%a6) 5318 5319 fadd.d SINA4(%pc),%fp1 5320 eor.l %d1,SPRIME(%a6) 5321 fadd.d COSB5(%pc),%fp2 5322 5323 fmul.x %fp0,%fp1 5324 fmul.x %fp0,%fp2 5325 5326 fadd.d SINA3(%pc),%fp1 5327 fadd.d COSB4(%pc),%fp2 5328 5329 fmul.x %fp0,%fp1 5330 fmul.x %fp0,%fp2 5331 5332 fadd.x SINA2(%pc),%fp1 5333 fadd.x COSB3(%pc),%fp2 5334 5335 fmul.x %fp0,%fp1 5336 fmul.x %fp0,%fp2 5337 5338 fadd.x SINA1(%pc),%fp1 5339 fadd.x COSB2(%pc),%fp2 5340 5341 fmul.x %fp0,%fp1 5342 fmul.x %fp2,%fp0 5343 5344 fmul.x RPRIME(%a6),%fp1 5345 fadd.s COSB1(%pc),%fp0 5346 fmul.x SPRIME(%a6),%fp0 5347 5348 fmovm.x (%sp)+,&0x20 5349 5350 fmov.l %d0,%fpcr 5351 fadd.x RPRIME(%a6),%fp1 5352 bsr sto_cos 5353 fadd.s POSNEG1(%a6),%fp0 5354 bra t_inx2 5355 5356 NEVEN: 5357 #--REGISTERS SAVED SO FAR: FP2. 5358 fmovm.x &0x04,-(%sp) 5359 5360 fmov.x %fp0,RPRIME(%a6) 5361 fmul.x %fp0,%fp0 5362 5363 fmov.d COSB8(%pc),%fp1 5364 fmov.d SINA7(%pc),%fp2 5365 5366 fmul.x %fp0,%fp1 5367 fmov.x %fp0,SPRIME(%a6) 5368 fmul.x %fp0,%fp2 5369 5370 ror.l &1,%d1 5371 and.l &0x80000000,%d1 5372 5373 fadd.d COSB7(%pc),%fp1 5374 fadd.d SINA6(%pc),%fp2 5375 5376 eor.l %d1,RPRIME(%a6) 5377 eor.l %d1,SPRIME(%a6) 5378 5379 fmul.x %fp0,%fp1 5380 5381 or.l &0x3F800000,%d1 5382 mov.l %d1,POSNEG1(%a6) 5383 5384 fmul.x %fp0,%fp2 5385 5386 fadd.d COSB6(%pc),%fp1 5387 fadd.d SINA5(%pc),%fp2 5388 5389 fmul.x %fp0,%fp1 5390 fmul.x %fp0,%fp2 5391 5392 fadd.d COSB5(%pc),%fp1 5393 fadd.d SINA4(%pc),%fp2 5394 5395 fmul.x %fp0,%fp1 5396 fmul.x %fp0,%fp2 5397 5398 fadd.d COSB4(%pc),%fp1 5399 fadd.d SINA3(%pc),%fp2 5400 5401 fmul.x %fp0,%fp1 5402 fmul.x %fp0,%fp2 5403 5404 fadd.x COSB3(%pc),%fp1 5405 fadd.x SINA2(%pc),%fp2 5406 5407 fmul.x %fp0,%fp1 5408 fmul.x %fp0,%fp2 5409 5410 fadd.x COSB2(%pc),%fp1 5411 fadd.x SINA1(%pc),%fp2 5412 5413 fmul.x %fp0,%fp1 5414 fmul.x %fp2,%fp0 5415 5416 5417 fadd.s COSB1(%pc),%fp1 5418 fmul.x RPRIME(%a6),%fp0 5419 fmul.x SPRIME(%a6),%fp1 5420 5421 fmovm.x (%sp)+,&0x20 5422 5423 fmov.l %d0,%fpcr 5424 fadd.s POSNEG1(%a6),%fp1 5425 bsr sto_cos 5426 fadd.x RPRIME(%a6),%fp0 5427 bra t_inx2 5428 5429 ############################################# 5430 5431 SCBORS: 5432 cmp.l %d1,&0x3FFF8000 5433 bgt.w SREDUCEX 5434 5435 ############################################# 5436 5437 SCSM: 5438 # mov.w &0x0000,XDCARE(%a6) 5439 fmov.s &0x3F800000,%fp1 5440 5441 fmov.l %d0,%fpcr 5442 fsub.s &0x00800000,%fp1 5443 bsr sto_cos 5444 fmov.l %fpcr,%d0 5445 mov.b &FMOV_OP,%d1 5446 fmov.x X(%a6),%fp0 5447 bra t_catch 5448 5449 ############################################# 5450 5451 global ssincosd 5452 #--SIN AND COS OF X FOR DENORMALIZED X 5453 ssincosd: 5454 mov.l %d0,-(%sp) 5455 fmov.s &0x3F800000,%fp1 5456 bsr sto_cos 5457 mov.l (%sp)+,%d0 5458 bra t_extdnrm 5459 5460 ############################################ 5461 5462 #--WHEN REDUCEX IS USED, THE CODE WILL INEVIT 5463 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FA 5464 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN 5465 SREDUCEX: 5466 fmovm.x &0x3c,-(%sp) 5467 mov.l %d2,-(%sp) 5468 fmov.s &0x00000000,%fp1 5469 5470 #--If compact form of abs(arg) in d0=$7ffefff 5471 #--there is a danger of unwanted overflow in 5472 #--case, reduce argument by one remainder ste 5473 #--safe. 5474 cmp.l %d1,&0x7ffeffff 5475 bne.b SLOOP 5476 5477 # yes; create 2**16383*PI/2 5478 mov.w &0x7ffe,FP_SCR0_EX(%a 5479 mov.l &0xc90fdaa2,FP_SCR0_H 5480 clr.l FP_SCR0_LO(%a6) 5481 5482 # create low half of 2**16383*PI/2 at FP_SCR1 5483 mov.w &0x7fdc,FP_SCR1_EX(%a 5484 mov.l &0x85a308d3,FP_SCR1_H 5485 clr.l FP_SCR1_LO(%a6) 5486 5487 ftest.x %fp0 5488 fblt.w sred_neg 5489 5490 or.b &0x80,FP_SCR0_EX(%a6) 5491 or.b &0x80,FP_SCR1_EX(%a6) 5492 sred_neg: 5493 fadd.x FP_SCR0(%a6),%fp0 5494 fmov.x %fp0,%fp1 5495 fadd.x FP_SCR1(%a6),%fp0 5496 fsub.x %fp0,%fp1 5497 fadd.x FP_SCR1(%a6),%fp1 5498 5499 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X RE 5500 #--integer quotient will be stored in N 5501 #--Intermeditate remainder is 66-bit long; (R 5502 SLOOP: 5503 fmov.x %fp0,INARG(%a6) 5504 mov.w INARG(%a6),%d1 5505 mov.l %d1,%a1 5506 and.l &0x00007FFF,%d1 5507 sub.l &0x00003FFF,%d1 5508 cmp.l %d1,&28 5509 ble.b SLASTLOOP 5510 SCONTLOOP: 5511 sub.l &27,%d1 5512 mov.b &0,ENDFLAG(%a6) 5513 bra.b SWORK 5514 SLASTLOOP: 5515 clr.l %d1 5516 mov.b &1,ENDFLAG(%a6) 5517 5518 SWORK: 5519 #--FIND THE REMAINDER OF (R,r) W.R.T. 2**L 5520 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29. 5521 5522 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(6 5523 #--2**L * (PIby2_1), 2**L * (PIby2_2) 5524 5525 mov.l &0x00003FFE,%d2 5526 sub.l %d1,%d2 5527 5528 mov.l &0xA2F9836E,FP_SCR0_H 5529 mov.l &0x4E44152A,FP_SCR0_L 5530 mov.w %d2,FP_SCR0_EX(%a6) 5531 5532 fmov.x %fp0,%fp2 5533 fmul.x FP_SCR0(%a6),%fp2 5534 5535 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED T 5536 #--FLOATING POINT FORMAT, THE TWO FMOVE'S 5537 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT 5538 #--(SIGN(INARG)*2**63 + FP2) - SIGN(I 5539 #--US THE DESIRED VALUE IN FLOATING POINT. 5540 mov.l %a1,%d2 5541 swap %d2 5542 and.l &0x80000000,%d2 5543 or.l &0x5F000000,%d2 5544 mov.l %d2,TWOTO63(%a6) 5545 fadd.s TWOTO63(%a6),%fp2 5546 fsub.s TWOTO63(%a6),%fp2 5547 # fint.x %fp2 5548 5549 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2 5550 mov.l %d1,%d2 5551 5552 add.l &0x00003FFF,%d2 5553 mov.w %d2,FP_SCR0_EX(%a6) 5554 mov.l &0xC90FDAA2,FP_SCR0_H 5555 clr.l FP_SCR0_LO(%a6) 5556 5557 add.l &0x00003FDD,%d1 5558 mov.w %d1,FP_SCR1_EX(%a6) 5559 mov.l &0x85A308D3,FP_SCR1_H 5560 clr.l FP_SCR1_LO(%a6) 5561 5562 mov.b ENDFLAG(%a6),%d1 5563 5564 #--We are now ready to perform (R+r) - N*P1 - 5565 #--P2 = 2**(L) * Piby2_2 5566 fmov.x %fp2,%fp4 5567 fmul.x FP_SCR0(%a6),%fp4 5568 fmov.x %fp2,%fp5 5569 fmul.x FP_SCR1(%a6),%fp5 5570 fmov.x %fp4,%fp3 5571 5572 #--we want P+p = W+w but |p| <= half ulp of 5573 #--Then, we need to compute A := R-P and 5574 fadd.x %fp5,%fp3 5575 fsub.x %fp3,%fp4 5576 5577 fsub.x %fp3,%fp0 5578 fadd.x %fp5,%fp4 5579 5580 fmov.x %fp0,%fp3 5581 fsub.x %fp4,%fp1 5582 5583 #--Now we need to normalize (A,a) to "new (R 5584 #--|r| <= half ulp of R. 5585 fadd.x %fp1,%fp0 5586 #--No need to calculate r if this is the last 5587 cmp.b %d1,&0 5588 bgt.w SRESTORE 5589 5590 #--Need to calculate r 5591 fsub.x %fp0,%fp3 5592 fadd.x %fp3,%fp1 5593 bra.w SLOOP 5594 5595 SRESTORE: 5596 fmov.l %fp2,INT(%a6) 5597 mov.l (%sp)+,%d2 5598 fmovm.x (%sp)+,&0x3c 5599 5600 mov.l ADJN(%a6),%d1 5601 cmp.l %d1,&4 5602 5603 blt.w SINCONT 5604 bra.w SCCONT 5605 5606 ############################################# 5607 # stan(): computes the tangent of a normaliz 5608 # stand(): computes the tangent of a denormal 5609 # 5610 # INPUT ************************************* 5611 # a0 = pointer to extended precision in 5612 # d0 = round precision,mode 5613 # 5614 # OUTPUT ************************************ 5615 # fp0 = tan(X) 5616 # 5617 # ACCURACY and MONOTONICITY ***************** 5618 # The returned result is within 3 ulp i 5619 # within 0.5001 ulp to 53 bits if the r 5620 # rounded to double precision. The resu 5621 # in double precision. 5622 # 5623 # ALGORITHM ********************************* 5624 # 5625 # 1. If |X| >= 15Pi or |X| < 2**(-40), 5626 # 5627 # 2. Decompose X as X = N(Pi/2) + r whe 5628 # k = N mod 2, so in particular 5629 # 5630 # 3. If k is odd, go to 5. 5631 # 5632 # 4. (k is even) Tan(X) = tan(r) and ta 5633 # rational function U/V where 5634 # U = r + r*s*(P1 + s*(P2 + s*P 5635 # V = 1 + s*(Q1 + s*(Q2 + s*(Q3 5636 # Exit. 5637 # 5638 # 4. (k is odd) Tan(X) = -cot(r). Since 5639 # a rational function U/V where 5640 # U = r + r*s*(P1 + s*(P2 + s*P 5641 # V = 1 + s*(Q1 + s*(Q2 + s*(Q3 5642 # -Cot(r) = -V/U. Exit. 5643 # 5644 # 6. If |X| > 1, go to 8. 5645 # 5646 # 7. (|X|<2**(-40)) Tan(X) = X. Exit. 5647 # 5648 # 8. Overwrite X by X := X rem 2Pi. Now 5649 # to 2. 5650 # 5651 ############################################# 5652 5653 TANQ4: 5654 long 0x3EA0B759,0xF50F8688 5655 TANP3: 5656 long 0xBEF2BAA5,0xA8924F04 5657 5658 TANQ3: 5659 long 0xBF346F59,0xB39BA65F 5660 5661 TANP2: 5662 long 0x3FF60000,0xE073D3FC 5663 5664 TANQ2: 5665 long 0x3FF90000,0xD23CD684 5666 5667 TANP1: 5668 long 0xBFFC0000,0x8895A6C5 5669 5670 TANQ1: 5671 long 0xBFFD0000,0xEEF57E0D 5672 5673 INVTWOPI: 5674 long 0x3FFC0000,0xA2F9836E 5675 5676 TWOPI1: 5677 long 0x40010000,0xC90FDAA2 5678 TWOPI2: 5679 long 0x3FDF0000,0x85A308D4 5680 5681 #--N*PI/2, -32 <= N <= 32, IN A LEADING TERM 5682 #--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, 5683 #--MOST 69 BITS LONG. 5684 # global PITBL 5685 PITBL: 5686 long 0xC0040000,0xC90FDAA2 5687 long 0xC0040000,0xC2C75BCD 5688 long 0xC0040000,0xBC7EDCF7 5689 long 0xC0040000,0xB6365E22 5690 long 0xC0040000,0xAFEDDF4D 5691 long 0xC0040000,0xA9A56078 5692 long 0xC0040000,0xA35CE1A3 5693 long 0xC0040000,0x9D1462CE 5694 long 0xC0040000,0x96CBE3F9 5695 long 0xC0040000,0x90836524 5696 long 0xC0040000,0x8A3AE64F 5697 long 0xC0040000,0x83F2677A 5698 long 0xC0030000,0xFB53D14A 5699 long 0xC0030000,0xEEC2D3A0 5700 long 0xC0030000,0xE231D5F6 5701 long 0xC0030000,0xD5A0D84C 5702 long 0xC0030000,0xC90FDAA2 5703 long 0xC0030000,0xBC7EDCF7 5704 long 0xC0030000,0xAFEDDF4D 5705 long 0xC0030000,0xA35CE1A3 5706 long 0xC0030000,0x96CBE3F9 5707 long 0xC0030000,0x8A3AE64F 5708 long 0xC0020000,0xFB53D14A 5709 long 0xC0020000,0xE231D5F6 5710 long 0xC0020000,0xC90FDAA2 5711 long 0xC0020000,0xAFEDDF4D 5712 long 0xC0020000,0x96CBE3F9 5713 long 0xC0010000,0xFB53D14A 5714 long 0xC0010000,0xC90FDAA2 5715 long 0xC0010000,0x96CBE3F9 5716 long 0xC0000000,0xC90FDAA2 5717 long 0xBFFF0000,0xC90FDAA2 5718 long 0x00000000,0x00000000 5719 long 0x3FFF0000,0xC90FDAA2 5720 long 0x40000000,0xC90FDAA2 5721 long 0x40010000,0x96CBE3F9 5722 long 0x40010000,0xC90FDAA2 5723 long 0x40010000,0xFB53D14A 5724 long 0x40020000,0x96CBE3F9 5725 long 0x40020000,0xAFEDDF4D 5726 long 0x40020000,0xC90FDAA2 5727 long 0x40020000,0xE231D5F6 5728 long 0x40020000,0xFB53D14A 5729 long 0x40030000,0x8A3AE64F 5730 long 0x40030000,0x96CBE3F9 5731 long 0x40030000,0xA35CE1A3 5732 long 0x40030000,0xAFEDDF4D 5733 long 0x40030000,0xBC7EDCF7 5734 long 0x40030000,0xC90FDAA2 5735 long 0x40030000,0xD5A0D84C 5736 long 0x40030000,0xE231D5F6 5737 long 0x40030000,0xEEC2D3A0 5738 long 0x40030000,0xFB53D14A 5739 long 0x40040000,0x83F2677A 5740 long 0x40040000,0x8A3AE64F 5741 long 0x40040000,0x90836524 5742 long 0x40040000,0x96CBE3F9 5743 long 0x40040000,0x9D1462CE 5744 long 0x40040000,0xA35CE1A3 5745 long 0x40040000,0xA9A56078 5746 long 0x40040000,0xAFEDDF4D 5747 long 0x40040000,0xB6365E22 5748 long 0x40040000,0xBC7EDCF7 5749 long 0x40040000,0xC2C75BCD 5750 long 0x40040000,0xC90FDAA2 5751 5752 set INARG,FP_SCR0 5753 5754 set TWOTO63,L_SCR1 5755 set INT,L_SCR1 5756 set ENDFLAG,L_SCR2 5757 5758 global stan 5759 stan: 5760 fmov.x (%a0),%fp0 5761 5762 mov.l (%a0),%d1 5763 mov.w 4(%a0),%d1 5764 and.l &0x7FFFFFFF,%d1 5765 5766 cmp.l %d1,&0x3FD78000 5767 bge.b TANOK1 5768 bra.w TANSM 5769 TANOK1: 5770 cmp.l %d1,&0x4004BC7E 5771 blt.b TANMAIN 5772 bra.w REDUCEX 5773 5774 TANMAIN: 5775 #--THIS IS THE USUAL CASE, |X| <= 15 PI. 5776 #--THE ARGUMENT REDUCTION IS DONE BY TABLE LO 5777 fmov.x %fp0,%fp1 5778 fmul.d TWOBYPI(%pc),%fp1 5779 5780 lea.l PITBL+0x200(%pc),%a1 5781 5782 fmov.l %fp1,%d1 5783 5784 asl.l &4,%d1 5785 add.l %d1,%a1 5786 5787 fsub.x (%a1)+,%fp0 5788 5789 fsub.s (%a1),%fp0 5790 5791 ror.l &5,%d1 5792 and.l &0x80000000,%d1 5793 5794 TANCONT: 5795 fmovm.x &0x0c,-(%sp) 5796 5797 cmp.l %d1,&0 5798 blt.w NODD 5799 5800 fmov.x %fp0,%fp1 5801 fmul.x %fp1,%fp1 5802 5803 fmov.d TANQ4(%pc),%fp3 5804 fmov.d TANP3(%pc),%fp2 5805 5806 fmul.x %fp1,%fp3 5807 fmul.x %fp1,%fp2 5808 5809 fadd.d TANQ3(%pc),%fp3 5810 fadd.x TANP2(%pc),%fp2 5811 5812 fmul.x %fp1,%fp3 5813 fmul.x %fp1,%fp2 5814 5815 fadd.x TANQ2(%pc),%fp3 5816 fadd.x TANP1(%pc),%fp2 5817 5818 fmul.x %fp1,%fp3 5819 fmul.x %fp1,%fp2 5820 5821 fadd.x TANQ1(%pc),%fp3 5822 fmul.x %fp0,%fp2 5823 5824 fmul.x %fp3,%fp1 5825 5826 fadd.x %fp2,%fp0 5827 5828 fadd.s &0x3F800000,%fp1 5829 5830 fmovm.x (%sp)+,&0x30 5831 5832 fmov.l %d0,%fpcr 5833 fdiv.x %fp1,%fp0 5834 bra t_inx2 5835 5836 NODD: 5837 fmov.x %fp0,%fp1 5838 fmul.x %fp0,%fp0 5839 5840 fmov.d TANQ4(%pc),%fp3 5841 fmov.d TANP3(%pc),%fp2 5842 5843 fmul.x %fp0,%fp3 5844 fmul.x %fp0,%fp2 5845 5846 fadd.d TANQ3(%pc),%fp3 5847 fadd.x TANP2(%pc),%fp2 5848 5849 fmul.x %fp0,%fp3 5850 fmul.x %fp0,%fp2 5851 5852 fadd.x TANQ2(%pc),%fp3 5853 fadd.x TANP1(%pc),%fp2 5854 5855 fmul.x %fp0,%fp3 5856 fmul.x %fp0,%fp2 5857 5858 fadd.x TANQ1(%pc),%fp3 5859 fmul.x %fp1,%fp2 5860 5861 fmul.x %fp3,%fp0 5862 5863 fadd.x %fp2,%fp1 5864 fadd.s &0x3F800000,%fp0 5865 5866 fmovm.x (%sp)+,&0x30 5867 5868 fmov.x %fp1,-(%sp) 5869 eor.l &0x80000000,(%sp) 5870 5871 fmov.l %d0,%fpcr 5872 fdiv.x (%sp)+,%fp0 5873 bra t_inx2 5874 5875 TANBORS: 5876 #--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT 5877 #--IF |X| < 2**(-40), RETURN X OR 1. 5878 cmp.l %d1,&0x3FFF8000 5879 bgt.b REDUCEX 5880 5881 TANSM: 5882 fmov.x %fp0,-(%sp) 5883 fmov.l %d0,%fpcr 5884 mov.b &FMOV_OP,%d1 5885 fmov.x (%sp)+,%fp0 5886 bra t_catch 5887 5888 global stand 5889 #--TAN(X) = X FOR DENORMALIZED X 5890 stand: 5891 bra t_extdnrm 5892 5893 #--WHEN REDUCEX IS USED, THE CODE WILL INEVIT 5894 #--THIS REDUCTION METHOD, HOWEVER, IS MUCH FA 5895 #--THE REMAINDER INSTRUCTION WHICH IS NOW IN 5896 REDUCEX: 5897 fmovm.x &0x3c,-(%sp) 5898 mov.l %d2,-(%sp) 5899 fmov.s &0x00000000,%fp1 5900 5901 #--If compact form of abs(arg) in d0=$7ffefff 5902 #--there is a danger of unwanted overflow in 5903 #--case, reduce argument by one remainder ste 5904 #--safe. 5905 cmp.l %d1,&0x7ffeffff 5906 bne.b LOOP 5907 5908 # yes; create 2**16383*PI/2 5909 mov.w &0x7ffe,FP_SCR0_EX(%a 5910 mov.l &0xc90fdaa2,FP_SCR0_H 5911 clr.l FP_SCR0_LO(%a6) 5912 5913 # create low half of 2**16383*PI/2 at FP_SCR1 5914 mov.w &0x7fdc,FP_SCR1_EX(%a 5915 mov.l &0x85a308d3,FP_SCR1_H 5916 clr.l FP_SCR1_LO(%a6) 5917 5918 ftest.x %fp0 5919 fblt.w red_neg 5920 5921 or.b &0x80,FP_SCR0_EX(%a6) 5922 or.b &0x80,FP_SCR1_EX(%a6) 5923 red_neg: 5924 fadd.x FP_SCR0(%a6),%fp0 5925 fmov.x %fp0,%fp1 5926 fadd.x FP_SCR1(%a6),%fp0 5927 fsub.x %fp0,%fp1 5928 fadd.x FP_SCR1(%a6),%fp1 5929 5930 #--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X RE 5931 #--integer quotient will be stored in N 5932 #--Intermeditate remainder is 66-bit long; (R 5933 LOOP: 5934 fmov.x %fp0,INARG(%a6) 5935 mov.w INARG(%a6),%d1 5936 mov.l %d1,%a1 5937 and.l &0x00007FFF,%d1 5938 sub.l &0x00003FFF,%d1 5939 cmp.l %d1,&28 5940 ble.b LASTLOOP 5941 CONTLOOP: 5942 sub.l &27,%d1 5943 mov.b &0,ENDFLAG(%a6) 5944 bra.b WORK 5945 LASTLOOP: 5946 clr.l %d1 5947 mov.b &1,ENDFLAG(%a6) 5948 5949 WORK: 5950 #--FIND THE REMAINDER OF (R,r) W.R.T. 2**L 5951 #--THAT INT( X * (2/PI) / 2**(L) ) < 2**29. 5952 5953 #--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(6 5954 #--2**L * (PIby2_1), 2**L * (PIby2_2) 5955 5956 mov.l &0x00003FFE,%d2 5957 sub.l %d1,%d2 5958 5959 mov.l &0xA2F9836E,FP_SCR0_H 5960 mov.l &0x4E44152A,FP_SCR0_L 5961 mov.w %d2,FP_SCR0_EX(%a6) 5962 5963 fmov.x %fp0,%fp2 5964 fmul.x FP_SCR0(%a6),%fp2 5965 5966 #--WE MUST NOW FIND INT(FP2). SINCE WE NEED T 5967 #--FLOATING POINT FORMAT, THE TWO FMOVE'S 5968 #--WILL BE TOO INEFFICIENT. THE WAY AROUND IT 5969 #--(SIGN(INARG)*2**63 + FP2) - SIGN(I 5970 #--US THE DESIRED VALUE IN FLOATING POINT. 5971 mov.l %a1,%d2 5972 swap %d2 5973 and.l &0x80000000,%d2 5974 or.l &0x5F000000,%d2 5975 mov.l %d2,TWOTO63(%a6) 5976 fadd.s TWOTO63(%a6),%fp2 5977 fsub.s TWOTO63(%a6),%fp2 5978 # fintrz.x %fp2,%fp2 5979 5980 #--CREATING 2**(L)*Piby2_1 and 2**(L)*Piby2_2 5981 mov.l %d1,%d2 5982 5983 add.l &0x00003FFF,%d2 5984 mov.w %d2,FP_SCR0_EX(%a6) 5985 mov.l &0xC90FDAA2,FP_SCR0_H 5986 clr.l FP_SCR0_LO(%a6) 5987 5988 add.l &0x00003FDD,%d1 5989 mov.w %d1,FP_SCR1_EX(%a6) 5990 mov.l &0x85A308D3,FP_SCR1_H 5991 clr.l FP_SCR1_LO(%a6) 5992 5993 mov.b ENDFLAG(%a6),%d1 5994 5995 #--We are now ready to perform (R+r) - N*P1 - 5996 #--P2 = 2**(L) * Piby2_2 5997 fmov.x %fp2,%fp4 5998 fmul.x FP_SCR0(%a6),%fp4 5999 fmov.x %fp2,%fp5 6000 fmul.x FP_SCR1(%a6),%fp5 6001 fmov.x %fp4,%fp3 6002 6003 #--we want P+p = W+w but |p| <= half ulp of 6004 #--Then, we need to compute A := R-P and 6005 fadd.x %fp5,%fp3 6006 fsub.x %fp3,%fp4 6007 6008 fsub.x %fp3,%fp0 6009 fadd.x %fp5,%fp4 6010 6011 fmov.x %fp0,%fp3 6012 fsub.x %fp4,%fp1 6013 6014 #--Now we need to normalize (A,a) to "new (R 6015 #--|r| <= half ulp of R. 6016 fadd.x %fp1,%fp0 6017 #--No need to calculate r if this is the last 6018 cmp.b %d1,&0 6019 bgt.w RESTORE 6020 6021 #--Need to calculate r 6022 fsub.x %fp0,%fp3 6023 fadd.x %fp3,%fp1 6024 bra.w LOOP 6025 6026 RESTORE: 6027 fmov.l %fp2,INT(%a6) 6028 mov.l (%sp)+,%d2 6029 fmovm.x (%sp)+,&0x3c 6030 6031 mov.l INT(%a6),%d1 6032 ror.l &1,%d1 6033 6034 bra.w TANCONT 6035 6036 ############################################# 6037 # satan(): computes the arctangent of a norm 6038 # satand(): computes the arctangent of a deno 6039 # 6040 # INPUT ************************************* 6041 # a0 = pointer to extended precision in 6042 # d0 = round precision,mode 6043 # 6044 # OUTPUT ************************************ 6045 # fp0 = arctan(X) 6046 # 6047 # ACCURACY and MONOTONICITY ***************** 6048 # The returned result is within 2 ulps 6049 # i.e. within 0.5001 ulp to 53 bits if 6050 # rounded to double precision. The resu 6051 # in double precision. 6052 # 6053 # ALGORITHM ********************************* 6054 # Step 1. If |X| >= 16 or |X| < 1/16, g 6055 # 6056 # Step 2. Let X = sgn * 2**k * 1.xxxxxx 6057 # Note that k = -4, -3,..., or 6058 # Define F = sgn * 2**k * 1.xxx 6059 # significant bits of X with a 6060 # bit position. Define u to be 6061 # 6062 # Step 3. Approximate arctan(u) by a po 6063 # 6064 # Step 4. Return arctan(F) + poly, arct 6065 # table of values calculated be 6066 # 6067 # Step 5. If |X| >= 16, go to Step 7. 6068 # 6069 # Step 6. Approximate arctan(X) by an o 6070 # 6071 # Step 7. Define X' = -1/X. Approximate 6072 # polynomial in X'. 6073 # Arctan(X) = sign(X)*Pi/2 + ar 6074 # 6075 ############################################# 6076 6077 ATANA3: long 0xBFF6687E,0x314987D8 6078 ATANA2: long 0x4002AC69,0x34A26DB3 6079 ATANA1: long 0xBFC2476F,0x4E1DA28E 6080 6081 ATANB6: long 0x3FB34444,0x7F876989 6082 ATANB5: long 0xBFB744EE,0x7FAF45DB 6083 ATANB4: long 0x3FBC71C6,0x46940220 6084 ATANB3: long 0xBFC24924,0x921872F9 6085 ATANB2: long 0x3FC99999,0x99998FA9 6086 ATANB1: long 0xBFD55555,0x55555555 6087 6088 ATANC5: long 0xBFB70BF3,0x98539E6A 6089 ATANC4: long 0x3FBC7187,0x962D1D7D 6090 ATANC3: long 0xBFC24924,0x827107B8 6091 ATANC2: long 0x3FC99999,0x9996263E 6092 ATANC1: long 0xBFD55555,0x55555536 6093 6094 PPIBY2: long 0x3FFF0000,0xC90FDAA2 6095 NPIBY2: long 0xBFFF0000,0xC90FDAA2 6096 6097 PTINY: long 0x00010000,0x80000000 6098 NTINY: long 0x80010000,0x80000000 6099 6100 ATANTBL: 6101 long 0x3FFB0000,0x83D152C5 6102 long 0x3FFB0000,0x8BC85445 6103 long 0x3FFB0000,0x93BE4060 6104 long 0x3FFB0000,0x9BB3078D 6105 long 0x3FFB0000,0xA3A69A52 6106 long 0x3FFB0000,0xAB98E943 6107 long 0x3FFB0000,0xB389E502 6108 long 0x3FFB0000,0xBB797E43 6109 long 0x3FFB0000,0xC367A5C7 6110 long 0x3FFB0000,0xCB544C61 6111 long 0x3FFB0000,0xD33F62F8 6112 long 0x3FFB0000,0xDB28DA81 6113 long 0x3FFB0000,0xE310A407 6114 long 0x3FFB0000,0xEAF6B0A8 6115 long 0x3FFB0000,0xF2DAF194 6116 long 0x3FFB0000,0xFABD5813 6117 long 0x3FFC0000,0x8346AC21 6118 long 0x3FFC0000,0x8B232A08 6119 long 0x3FFC0000,0x92FB70B8 6120 long 0x3FFC0000,0x9ACF476F 6121 long 0x3FFC0000,0xA29E7630 6122 long 0x3FFC0000,0xAA68C5D0 6123 long 0x3FFC0000,0xB22DFFFD 6124 long 0x3FFC0000,0xB9EDEF45 6125 long 0x3FFC0000,0xC1A85F1C 6126 long 0x3FFC0000,0xC95D1BE8 6127 long 0x3FFC0000,0xD10BF300 6128 long 0x3FFC0000,0xD8B4B2BA 6129 long 0x3FFC0000,0xE0572A6B 6130 long 0x3FFC0000,0xE7F32A70 6131 long 0x3FFC0000,0xEF888432 6132 long 0x3FFC0000,0xF7170A28 6133 long 0x3FFD0000,0x812FD288 6134 long 0x3FFD0000,0x88A8D1B1 6135 long 0x3FFD0000,0x9012AB3F 6136 long 0x3FFD0000,0x976CC3D4 6137 long 0x3FFD0000,0x9EB68949 6138 long 0x3FFD0000,0xA5EF72C3 6139 long 0x3FFD0000,0xAD1700BA 6140 long 0x3FFD0000,0xB42CBCFA 6141 long 0x3FFD0000,0xBB303A94 6142 long 0x3FFD0000,0xC22115C6 6143 long 0x3FFD0000,0xC8FEF3E6 6144 long 0x3FFD0000,0xCFC98330 6145 long 0x3FFD0000,0xD6807AA1 6146 long 0x3FFD0000,0xDD2399BC 6147 long 0x3FFD0000,0xE3B2A855 6148 long 0x3FFD0000,0xEA2D764F 6149 long 0x3FFD0000,0xF3BF5BF8 6150 long 0x3FFE0000,0x801CE39E 6151 long 0x3FFE0000,0x8630A2DA 6152 long 0x3FFE0000,0x8C1AD445 6153 long 0x3FFE0000,0x91DB8F16 6154 long 0x3FFE0000,0x97731420 6155 long 0x3FFE0000,0x9CE1C8E6 6156 long 0x3FFE0000,0xA22832DB 6157 long 0x3FFE0000,0xA746F2DD 6158 long 0x3FFE0000,0xAC3EC0FB 6159 long 0x3FFE0000,0xB110688A 6160 long 0x3FFE0000,0xB5BCC490 6161 long 0x3FFE0000,0xBA44BC7D 6162 long 0x3FFE0000,0xBEA94144 6163 long 0x3FFE0000,0xC2EB4ABB 6164 long 0x3FFE0000,0xC70BD54C 6165 long 0x3FFE0000,0xCD000549 6166 long 0x3FFE0000,0xD48457D2 6167 long 0x3FFE0000,0xDB948DA7 6168 long 0x3FFE0000,0xE23855F9 6169 long 0x3FFE0000,0xE8771129 6170 long 0x3FFE0000,0xEE57C16E 6171 long 0x3FFE0000,0xF3E10211 6172 long 0x3FFE0000,0xF919039D 6173 long 0x3FFE0000,0xFE058B8F 6174 long 0x3FFF0000,0x8155FB49 6175 long 0x3FFF0000,0x83889E35 6176 long 0x3FFF0000,0x859CFA76 6177 long 0x3FFF0000,0x87952ECF 6178 long 0x3FFF0000,0x89732FD1 6179 long 0x3FFF0000,0x8B38CAD1 6180 long 0x3FFF0000,0x8CE7A8D8 6181 long 0x3FFF0000,0x8F46A39E 6182 long 0x3FFF0000,0x922DA7D7 6183 long 0x3FFF0000,0x94D19FCB 6184 long 0x3FFF0000,0x973AB944 6185 long 0x3FFF0000,0x996FF00E 6186 long 0x3FFF0000,0x9B773F95 6187 long 0x3FFF0000,0x9D55CC32 6188 long 0x3FFF0000,0x9F100575 6189 long 0x3FFF0000,0xA0A9C290 6190 long 0x3FFF0000,0xA22659EB 6191 long 0x3FFF0000,0xA388B4AF 6192 long 0x3FFF0000,0xA4D35F10 6193 long 0x3FFF0000,0xA60895DC 6194 long 0x3FFF0000,0xA72A51DC 6195 long 0x3FFF0000,0xA83A5153 6196 long 0x3FFF0000,0xA93A2007 6197 long 0x3FFF0000,0xAA9E7245 6198 long 0x3FFF0000,0xAC4C84BA 6199 long 0x3FFF0000,0xADCE4A4A 6200 long 0x3FFF0000,0xAF2A2DCD 6201 long 0x3FFF0000,0xB0656F81 6202 long 0x3FFF0000,0xB1846515 6203 long 0x3FFF0000,0xB28AAA15 6204 long 0x3FFF0000,0xB37B44FF 6205 long 0x3FFF0000,0xB458C3DC 6206 long 0x3FFF0000,0xB525529D 6207 long 0x3FFF0000,0xB5E2CCA9 6208 long 0x3FFF0000,0xB692CADA 6209 long 0x3FFF0000,0xB736AEA7 6210 long 0x3FFF0000,0xB7CFAB28 6211 long 0x3FFF0000,0xB85ECC66 6212 long 0x3FFF0000,0xB8E4FD5A 6213 long 0x3FFF0000,0xB99F41F6 6214 long 0x3FFF0000,0xBA7F1E17 6215 long 0x3FFF0000,0xBB471285 6216 long 0x3FFF0000,0xBBFABE8A 6217 long 0x3FFF0000,0xBC9D0FAD 6218 long 0x3FFF0000,0xBD306A39 6219 long 0x3FFF0000,0xBDB6C731 6220 long 0x3FFF0000,0xBE31CAC5 6221 long 0x3FFF0000,0xBEA2D55C 6222 long 0x3FFF0000,0xBF0B10B7 6223 long 0x3FFF0000,0xBF6B7A18 6224 long 0x3FFF0000,0xBFC4EA46 6225 long 0x3FFF0000,0xC0181BDE 6226 long 0x3FFF0000,0xC065B066 6227 long 0x3FFF0000,0xC0AE345F 6228 long 0x3FFF0000,0xC0F22291 6229 6230 set X,FP_SCR0 6231 set XDCARE,X+2 6232 set XFRAC,X+4 6233 set XFRACLO,X+8 6234 6235 set ATANF,FP_SCR1 6236 set ATANFHI,ATANF+4 6237 set ATANFLO,ATANF+8 6238 6239 global satan 6240 #--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, 6241 satan: 6242 fmov.x (%a0),%fp0 6243 6244 mov.l (%a0),%d1 6245 mov.w 4(%a0),%d1 6246 fmov.x %fp0,X(%a6) 6247 and.l &0x7FFFFFFF,%d1 6248 6249 cmp.l %d1,&0x3FFB8000 6250 bge.b ATANOK1 6251 bra.w ATANSM 6252 6253 ATANOK1: 6254 cmp.l %d1,&0x4002FFFF 6255 ble.b ATANMAIN 6256 bra.w ATANBIG 6257 6258 #--THE MOST LIKELY CASE, |X| IN [1/16, 16). W 6259 #--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F 6260 #--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATA 6261 #--A TABLE, ALL WE NEED IS TO APPROXIMATE ATA 6262 #--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS C 6263 #--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE 6264 #--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE 6265 #--FETCH F AND SAVING OF REGISTERS CAN BE ALL 6266 #--DIVIDE. IN THE END THIS METHOD IS MUCH FAS 6267 #--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME 6268 #--ATAN(X) DIRECTLY WILL NEED TO USE A RATION 6269 #--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOM 6270 #--WILL INVOLVE A VERY LONG POLYNOMIAL. 6271 6272 #--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 6273 #--WE CHOSE F TO BE +-2^K * 1.BBBB1 6274 #--THAT IS IT MATCHES THE EXPONENT AND FIRST 6275 #--SIXTH BITS IS SET TO BE 1. SINCE K = -4, - 6276 #--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SIN 6277 #-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F 6278 6279 ATANMAIN: 6280 6281 and.l &0xF8000000,XFRAC(%a6 6282 or.l &0x04000000,XFRAC(%a6 6283 mov.l &0x00000000,XFRACLO(% 6284 6285 fmov.x %fp0,%fp1 6286 fmul.x X(%a6),%fp1 6287 fsub.x X(%a6),%fp0 6288 fadd.s &0x3F800000,%fp1 6289 fdiv.x %fp1,%fp0 6290 6291 #--WHILE THE DIVISION IS TAKING ITS TIME, WE 6292 #--CREATE ATAN(F) AND STORE IT IN ATANF, AND 6293 #--SAVE REGISTERS FP2. 6294 6295 mov.l %d2,-(%sp) 6296 mov.l %d1,%d2 6297 and.l &0x00007800,%d1 6298 and.l &0x7FFF0000,%d2 6299 sub.l &0x3FFB0000,%d2 6300 asr.l &1,%d2 6301 add.l %d2,%d1 6302 asr.l &7,%d1 6303 lea ATANTBL(%pc),%a1 6304 add.l %d1,%a1 6305 mov.l (%a1)+,ATANF(%a6) 6306 mov.l (%a1)+,ATANFHI(%a6) 6307 mov.l (%a1)+,ATANFLO(%a6) 6308 mov.l X(%a6),%d1 6309 and.l &0x80000000,%d1 6310 or.l %d1,ATANF(%a6) 6311 mov.l (%sp)+,%d2 6312 6313 #--THAT'S ALL I HAVE TO DO FOR NOW, 6314 #--BUT ALAS, THE DIVIDE IS STILL CRANKING! 6315 6316 #--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN 6317 #--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U 6318 #--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NE 6319 #--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + 6320 #--WHAT WE HAVE HERE IS MERELY A1 = A3, A2 = 6321 #--THE REASON FOR THIS REARRANGEMENT IS TO MA 6322 #--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOA 6323 6324 fmovm.x &0x04,-(%sp) 6325 6326 fmov.x %fp0,%fp1 6327 fmul.x %fp1,%fp1 6328 fmov.d ATANA3(%pc),%fp2 6329 fadd.x %fp1,%fp2 6330 fmul.x %fp1,%fp2 6331 fmul.x %fp0,%fp1 6332 fadd.d ATANA2(%pc),%fp2 6333 fmul.d ATANA1(%pc),%fp1 6334 fmul.x %fp2,%fp1 6335 fadd.x %fp1,%fp0 6336 6337 fmovm.x (%sp)+,&0x20 6338 6339 fmov.l %d0,%fpcr 6340 fadd.x ATANF(%a6),%fp0 6341 bra t_inx2 6342 6343 ATANBORS: 6344 #--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVE 6345 #--FP0 IS X AND |X| <= 1/16 OR |X| >= 16. 6346 cmp.l %d1,&0x3FFF8000 6347 bgt.w ATANBIG 6348 6349 ATANSM: 6350 #--|X| <= 1/16 6351 #--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHE 6352 #--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y 6353 #--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*( 6354 #--WHERE Y = X*X, AND Z = Y*Y. 6355 6356 cmp.l %d1,&0x3FD78000 6357 blt.w ATANTINY 6358 6359 #--COMPUTE POLYNOMIAL 6360 fmovm.x &0x0c,-(%sp) 6361 6362 fmul.x %fp0,%fp0 6363 6364 fmov.x %fp0,%fp1 6365 fmul.x %fp1,%fp1 6366 6367 fmov.d ATANB6(%pc),%fp2 6368 fmov.d ATANB5(%pc),%fp3 6369 6370 fmul.x %fp1,%fp2 6371 fmul.x %fp1,%fp3 6372 6373 fadd.d ATANB4(%pc),%fp2 6374 fadd.d ATANB3(%pc),%fp3 6375 6376 fmul.x %fp1,%fp2 6377 fmul.x %fp3,%fp1 6378 6379 fadd.d ATANB2(%pc),%fp2 6380 fadd.d ATANB1(%pc),%fp1 6381 6382 fmul.x %fp0,%fp2 6383 fmul.x X(%a6),%fp0 6384 6385 fadd.x %fp2,%fp1 6386 6387 fmul.x %fp1,%fp0 6388 6389 fmovm.x (%sp)+,&0x30 6390 6391 fmov.l %d0,%fpcr 6392 fadd.x X(%a6),%fp0 6393 bra t_inx2 6394 6395 ATANTINY: 6396 #--|X| < 2^(-40), ATAN(X) = X 6397 6398 fmov.l %d0,%fpcr 6399 mov.b &FMOV_OP,%d1 6400 fmov.x X(%a6),%fp0 6401 6402 bra t_catch 6403 6404 ATANBIG: 6405 #--IF |X| > 2^(100), RETURN SIGN(X)*(PI/2 6406 #--RETURN SIGN(X)*PI/2 + ATAN(-1/X). 6407 cmp.l %d1,&0x40638000 6408 bgt.w ATANHUGE 6409 6410 #--APPROXIMATE ATAN(-1/X) BY 6411 #--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' 6412 #--THIS CAN BE RE-WRITTEN AS 6413 #--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] 6414 6415 fmovm.x &0x0c,-(%sp) 6416 6417 fmov.s &0xBF800000,%fp1 6418 fdiv.x %fp0,%fp1 6419 6420 #--DIVIDE IS STILL CRANKING 6421 6422 fmov.x %fp1,%fp0 6423 fmul.x %fp0,%fp0 6424 fmov.x %fp1,X(%a6) 6425 6426 fmov.x %fp0,%fp1 6427 fmul.x %fp1,%fp1 6428 6429 fmov.d ATANC5(%pc),%fp3 6430 fmov.d ATANC4(%pc),%fp2 6431 6432 fmul.x %fp1,%fp3 6433 fmul.x %fp1,%fp2 6434 6435 fadd.d ATANC3(%pc),%fp3 6436 fadd.d ATANC2(%pc),%fp2 6437 6438 fmul.x %fp3,%fp1 6439 fmul.x %fp0,%fp2 6440 6441 fadd.d ATANC1(%pc),%fp1 6442 fmul.x X(%a6),%fp0 6443 6444 fadd.x %fp2,%fp1 6445 6446 fmul.x %fp1,%fp0 6447 # ... 6448 fadd.x X(%a6),%fp0 6449 6450 fmovm.x (%sp)+,&0x30 6451 6452 fmov.l %d0,%fpcr 6453 tst.b (%a0) 6454 bpl.b pos_big 6455 6456 neg_big: 6457 fadd.x NPIBY2(%pc),%fp0 6458 bra t_minx2 6459 6460 pos_big: 6461 fadd.x PPIBY2(%pc),%fp0 6462 bra t_pinx2 6463 6464 ATANHUGE: 6465 #--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PI 6466 tst.b (%a0) 6467 bpl.b pos_huge 6468 6469 neg_huge: 6470 fmov.x NPIBY2(%pc),%fp0 6471 fmov.l %d0,%fpcr 6472 fadd.x PTINY(%pc),%fp0 6473 bra t_minx2 6474 6475 pos_huge: 6476 fmov.x PPIBY2(%pc),%fp0 6477 fmov.l %d0,%fpcr 6478 fadd.x NTINY(%pc),%fp0 6479 bra t_pinx2 6480 6481 global satand 6482 #--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED A 6483 satand: 6484 bra t_extdnrm 6485 6486 ############################################# 6487 # sasin(): computes the inverse sine of a no 6488 # sasind(): computes the inverse sine of a de 6489 # 6490 # INPUT ************************************* 6491 # a0 = pointer to extended precision in 6492 # d0 = round precision,mode 6493 # 6494 # OUTPUT ************************************ 6495 # fp0 = arcsin(X) 6496 # 6497 # ACCURACY and MONOTONICITY ***************** 6498 # The returned result is within 3 ulps 6499 # i.e. within 0.5001 ulp to 53 bits if 6500 # rounded to double precision. The resu 6501 # in double precision. 6502 # 6503 # ALGORITHM ********************************* 6504 # 6505 # ASIN 6506 # 1. If |X| >= 1, go to 3. 6507 # 6508 # 2. (|X| < 1) Calculate asin(X) by 6509 # z := sqrt( [1-X][1+X] ) 6510 # asin(X) = atan( x / z ). 6511 # Exit. 6512 # 6513 # 3. If |X| > 1, go to 5. 6514 # 6515 # 4. (|X| = 1) sgn := sign(X), return a 6516 # 6517 # 5. (|X| > 1) Generate an invalid oper 6518 # Exit. 6519 # 6520 ############################################# 6521 6522 global sasin 6523 sasin: 6524 fmov.x (%a0),%fp0 6525 6526 mov.l (%a0),%d1 6527 mov.w 4(%a0),%d1 6528 and.l &0x7FFFFFFF,%d1 6529 cmp.l %d1,&0x3FFF8000 6530 bge.b ASINBIG 6531 6532 # This catch is added here for the '060 QSP. 6533 # satan() would handle this case by causing t 6534 # not be caught until gen_except(). Now, with 6535 # detected inside of satan(), the exception w 6536 # instead of inside sasin() as expected. 6537 cmp.l %d1,&0x3FD78000 6538 blt.w ASINTINY 6539 6540 #--THIS IS THE USUAL CASE, |X| < 1 6541 #--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) ) 6542 6543 ASINMAIN: 6544 fmov.s &0x3F800000,%fp1 6545 fsub.x %fp0,%fp1 6546 fmovm.x &0x4,-(%sp) 6547 fmov.s &0x3F800000,%fp2 6548 fadd.x %fp0,%fp2 6549 fmul.x %fp2,%fp1 6550 fmovm.x (%sp)+,&0x20 6551 fsqrt.x %fp1 6552 fdiv.x %fp1,%fp0 6553 fmovm.x &0x01,-(%sp) 6554 lea (%sp),%a0 6555 bsr satan 6556 add.l &0xc,%sp 6557 bra t_inx2 6558 6559 ASINBIG: 6560 fabs.x %fp0 6561 fcmp.s %fp0,&0x3F800000 6562 fbgt t_operr 6563 6564 #--|X| = 1, ASIN(X) = +- PI/2. 6565 ASINONE: 6566 fmov.x PIBY2(%pc),%fp0 6567 mov.l (%a0),%d1 6568 and.l &0x80000000,%d1 6569 or.l &0x3F800000,%d1 6570 mov.l %d1,-(%sp) 6571 fmov.l %d0,%fpcr 6572 fmul.s (%sp)+,%fp0 6573 bra t_inx2 6574 6575 #--|X| < 2^(-40), ATAN(X) = X 6576 ASINTINY: 6577 fmov.l %d0,%fpcr 6578 mov.b &FMOV_OP,%d1 6579 fmov.x (%a0),%fp0 6580 bra t_catch 6581 6582 global sasind 6583 #--ASIN(X) = X FOR DENORMALIZED X 6584 sasind: 6585 bra t_extdnrm 6586 6587 ############################################# 6588 # sacos(): computes the inverse cosine of a 6589 # sacosd(): computes the inverse cosine of a 6590 # 6591 # INPUT ************************************* 6592 # a0 = pointer to extended precision in 6593 # d0 = round precision,mode 6594 # 6595 # OUTPUT ************************************ 6596 # fp0 = arccos(X) 6597 # 6598 # ACCURACY and MONOTONICITY ***************** 6599 # The returned result is within 3 ulps 6600 # i.e. within 0.5001 ulp to 53 bits if 6601 # rounded to double precision. The resu 6602 # in double precision. 6603 # 6604 # ALGORITHM ********************************* 6605 # 6606 # ACOS 6607 # 1. If |X| >= 1, go to 3. 6608 # 6609 # 2. (|X| < 1) Calculate acos(X) by 6610 # z := (1-X) / (1+X) 6611 # acos(X) = 2 * atan( sqrt(z) ) 6612 # Exit. 6613 # 6614 # 3. If |X| > 1, go to 5. 6615 # 6616 # 4. (|X| = 1) If X > 0, return 0. Othe 6617 # 6618 # 5. (|X| > 1) Generate an invalid oper 6619 # Exit. 6620 # 6621 ############################################# 6622 6623 global sacos 6624 sacos: 6625 fmov.x (%a0),%fp0 6626 6627 mov.l (%a0),%d1 6628 mov.w 4(%a0),%d1 6629 and.l &0x7FFFFFFF,%d1 6630 cmp.l %d1,&0x3FFF8000 6631 bge.b ACOSBIG 6632 6633 #--THIS IS THE USUAL CASE, |X| < 1 6634 #--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) ) 6635 6636 ACOSMAIN: 6637 fmov.s &0x3F800000,%fp1 6638 fadd.x %fp0,%fp1 6639 fneg.x %fp0 6640 fadd.s &0x3F800000,%fp0 6641 fdiv.x %fp1,%fp0 6642 fsqrt.x %fp0 6643 mov.l %d0,-(%sp) 6644 clr.l %d0 6645 fmovm.x &0x01,-(%sp) 6646 lea (%sp),%a0 6647 bsr satan 6648 add.l &0xc,%sp 6649 6650 fmov.l (%sp)+,%fpcr 6651 fadd.x %fp0,%fp0 6652 bra t_pinx2 6653 6654 ACOSBIG: 6655 fabs.x %fp0 6656 fcmp.s %fp0,&0x3F800000 6657 fbgt t_operr 6658 6659 #--|X| = 1, ACOS(X) = 0 OR PI 6660 tst.b (%a0) 6661 bpl.b ACOSP1 6662 6663 #--X = -1 6664 #Returns PI and inexact exception 6665 ACOSM1: 6666 fmov.x PI(%pc),%fp0 6667 fmov.l %d0,%fpcr 6668 fadd.s &0x00800000,%fp0 6669 bra t_pinx2 6670 6671 ACOSP1: 6672 bra ld_pzero 6673 6674 global sacosd 6675 #--ACOS(X) = PI/2 FOR DENORMALIZED X 6676 sacosd: 6677 fmov.l %d0,%fpcr 6678 fmov.x PIBY2(%pc),%fp0 6679 bra t_pinx2 6680 6681 ############################################# 6682 # setox(): computes the exponential for a 6683 # setoxd(): computes the exponential for a 6684 # setoxm1(): computes the exponential minus 6685 # setoxm1d(): computes the exponential minus 6686 # 6687 # INPUT ************************************* 6688 # a0 = pointer to extended precision in 6689 # d0 = round precision,mode 6690 # 6691 # OUTPUT ************************************ 6692 # fp0 = exp(X) or exp(X)-1 6693 # 6694 # ACCURACY and MONOTONICITY ***************** 6695 # The returned result is within 0.85 ul 6696 # i.e. within 0.5001 ulp to 53 bits if 6697 # rounded to double precision. The resu 6698 # in double precision. 6699 # 6700 # ALGORITHM and IMPLEMENTATION ************** 6701 # 6702 # setoxd 6703 # ------ 6704 # Step 1. Set ans := 1.0 6705 # 6706 # Step 2. Return ans := ans + sign(X)* 6707 # Notes: This will always generate one 6708 # 6709 # 6710 # setox 6711 # ----- 6712 # 6713 # Step 1. Filter out extreme cases of i 6714 # 1.1 If |X| >= 2^(-65), go 6715 # 1.2 Go to Step 7. 6716 # 1.3 If |X| < 16380 log(2) 6717 # 1.4 Go to Step 8. 6718 # Notes: The usual case should take th 6719 # To avoid the use of floating- 6720 # compact representation of |X| 6721 # 32-bit integer, the upper (mo 6722 # are the sign and biased expon 6723 # lower 16 bits are the 16 most 6724 # (including the explicit bit) 6725 # the comparisons in Steps 1.1 6726 # by integer comparison. Note a 6727 # 16380 log(2) used in Step 1.3 6728 # form. Thus taking the branch 6729 # |X| < 16380 log(2). There is 6730 # number of cases where |X| is 6731 # 16380 log(2) and the branch t 6732 # 6733 # Step 2. Calculate N = round-to-neares 6734 # 2.1 Set AdjFlag := 0 (ind 6735 # was taken) 6736 # 2.2 N := round-to-nearest 6737 # 2.3 Calculate J = N 6738 # or 63. 6739 # 2.4 Calculate M = ( 6740 # 2.5 Calculate the address 6741 # 2^(J/64). 6742 # 2.6 Create the value Scal 6743 # Notes: The calculation in 2.2 is rea 6744 # Z := X * constant 6745 # N := round-to-nearest 6746 # where 6747 # constant := single-pr 6748 # 6749 # Using a single-precision cons 6750 # access. Another effect of usi 6751 # "constant" is that the calcul 6752 # 6753 # Z = X*(64/log2)*(1+ep 6754 # 6755 # This error has to be consider 6756 # 6757 # Step 3. Calculate X - N*log2/64. 6758 # 3.1 R := X + N*L1, 6759 # where L1 := s 6760 # 3.2 R := R + N*L2, 6761 # L2 := extende 6762 # Notes: a) The way L1 and L2 are chos 6763 # approximate the value -log2/6 6764 # b) N*L1 is exact because N is 6765 # and L1 is no longer than 24 b 6766 # c) The calculation X+N*L1 is 6767 # cancellation. Thus, R is prac 6768 # 64 bits. 6769 # d) It is important to estimat 6770 # after Step 3.2. 6771 # 6772 # N = rnd-to-int( X*64/log2 (1+ 6773 # X*64/log2 (1+eps) = 6774 # X*64/log2 - N = f - e 6775 # X - N*log2/64 = f*log 6776 # 6777 # 6778 # Now |X| <= 16446 log2, thus 6779 # 6780 # |X - N*log2/64| <= (0 6781 # <= 0. 6782 # This bound will be used in S 6783 # 6784 # Step 4. Approximate exp(R)-1 by a pol 6785 # p = R + R*R*(A1 + R*(A2 + R*( 6786 # Notes: a) In order to reduce memory 6787 # are made as "short" as possib 6788 # and A5 are single precision; 6789 # precision. 6790 # b) Even with the restrictions 6791 # |p - (exp(R)-1)| < 2^(-68. 6792 # Note that 0.0062 is slightly 6793 # c) To fully utilize the pipel 6794 # two independent pieces of rou 6795 # p = [ R + R*S*(A2 + S 6796 # [ S*(A1 + S*( 6797 # where S = R*R. 6798 # 6799 # Step 5. Compute 2^(J/64)*exp(R) = 2^( 6800 # ans := T + ( 6801 # where T and t are the stored 6802 # Notes: 2^(J/64) is stored as T and t 6803 # 2^(J/64) to roughly 85 bits; 6804 # and t is in single precision. 6805 # rounded to 62 bits so that th 6806 # zero. The reason for such a s 6807 # T-2, and T-8 will all be exac 6808 # give much more accurate compu 6809 # EXPM1. 6810 # 6811 # Step 6. Reconstruction of exp(X) 6812 # exp(X) = 2^M * 2^(J/6 6813 # 6.1 If AdjFlag = 0, go to 6814 # 6.2 ans := ans * AdjScale 6815 # 6.3 Restore the user FPCR 6816 # 6.4 Return ans := ans * S 6817 # Notes: If AdjFlag = 0, we have X = M 6818 # |M| <= 16380, and Scale = 2^M 6819 # neither overflow nor underflo 6820 # means that 6821 # X = (M1+M)log2 + Jlog 6822 # Hence, exp(X) may overflow or 6823 # When that is the case, AdjSca 6824 # approximately M. Thus 6.2 wil 6825 # over/underflow. Possible exce 6826 # or underflow. The inexact exc 6827 # 6.4. Although one can argue t 6828 # should always be raised, to s 6829 # cost to much than the flag is 6830 # 6831 # Step 7. Return 1 + X. 6832 # 7.1 ans := X 6833 # 7.2 Restore user FPCR. 6834 # 7.3 Return ans := 1 + ans 6835 # Notes: For non-zero X, the inexact e 6836 # raised by 7.3. That is the on 6837 # Note also that we use the FMO 6838 # in Step 7.1 to avoid unnecess 6839 # the FMOVEM may not seem relev 6840 # the precaution will be useful 6841 # this code where the separate 6842 # inputs will be done away with 6843 # 6844 # Step 8. Handle exp(X) where |X| >= 16 6845 # 8.1 If |X| > 16480 log2, 6846 # (mimic 2.2 - 2.6) 6847 # 8.2 N := round-to-integer 6848 # 8.3 Calculate J = N mod 6 6849 # 8.4 K := (N-J)/64, M1 := 6850 # AdjFlag := 1. 6851 # 8.5 Calculate the address 6852 # 2^(J/64). 6853 # 8.6 Create the values Sca 6854 # 8.7 Go to Step 3. 6855 # Notes: Refer to notes for 2.2 - 2.6. 6856 # 6857 # Step 9. Handle exp(X), |X| > 16480 lo 6858 # 9.1 If X < 0, go to 9.3 6859 # 9.2 ans := Huge, go to 9. 6860 # 9.3 ans := Tiny. 6861 # 9.4 Restore user FPCR. 6862 # 9.5 Return ans := ans * a 6863 # Notes: Exp(X) will surely overflow o 6864 # X's sign. "Huge" and "Tiny" a 6865 # extended-precision numbers wh 6866 # with an inexact result. Thus, 6867 # inexact together with either 6868 # 6869 # setoxm1d 6870 # -------- 6871 # 6872 # Step 1. Set ans := 0 6873 # 6874 # Step 2. Return ans := X + ans. Exit. 6875 # Notes: This will return X with the a 6876 # precision prescribed by the 6877 # 6878 # setoxm1 6879 # ------- 6880 # 6881 # Step 1. Check |X| 6882 # 1.1 If |X| >= 1/4, go to 6883 # 1.2 Go to Step 7. 6884 # 1.3 If |X| < 70 log(2), g 6885 # 1.4 Go to Step 10. 6886 # Notes: The usual case should take th 6887 # However, it is conceivable |X 6888 # because EXPM1 is intended to 6889 # accurately when |X| is small. 6890 # the comparisons, see the note 6891 # 6892 # Step 2. Calculate N = round-to-neares 6893 # 2.1 N := round-to-nearest 6894 # 2.2 Calculate J = N 6895 # or 63. 6896 # 2.3 Calculate M = ( 6897 # 2.4 Calculate the address 6898 # 2^(J/64). 6899 # 2.5 Create the values Sc 6900 # OnebySc := -2^(-M). 6901 # Notes: See the notes on Step 2 of se 6902 # 6903 # Step 3. Calculate X - N*log2/64. 6904 # 3.1 R := X + N*L1, 6905 # where L1 := s 6906 # 3.2 R := R + N*L2, 6907 # L2 := extende 6908 # Notes: Applying the analysis of Step 6909 # shows that |R| <= 0.0055 (not 6910 # this case). 6911 # 6912 # Step 4. Approximate exp(R)-1 by a pol 6913 # p = R+R*R*(A1+R*(A2+R 6914 # Notes: a) In order to reduce memory 6915 # are made as "short" as possib 6916 # and A6 are single precision; 6917 # precision. 6918 # b) Even with the restriction 6919 # |p - (exp(R)-1)| < 6920 # for all |R| <= 0.0055. 6921 # c) To fully utilize the pipel 6922 # two independent pieces of rou 6923 # p = [ R*S*(A2 + S*(A4 6924 # [ R + S*(A1 + 6925 # where S = R*R. 6926 # 6927 # Step 5. Compute 2^(J/64)*p by 6928 # p := T*p 6929 # where T and t are the stored 6930 # Notes: 2^(J/64) is stored as T and t 6931 # 2^(J/64) to roughly 85 bits; 6932 # and t is in single precision. 6933 # rounded to 62 bits so that th 6934 # zero. The reason for such a s 6935 # T-2, and T-8 will all be exac 6936 # be exploited in Step 6 below. 6937 # in p is no bigger than 2^(-67 6938 # result. 6939 # 6940 # Step 6. Reconstruction of exp(X)-1 6941 # exp(X)-1 = 2^M * ( 2^ 6942 # 6.1 If M <= 63, go to Ste 6943 # 6.2 ans := T + (p + (t + 6944 # 6.3 If M >= -3, go to 6.5 6945 # 6.4 ans := (T + (p + t)) 6946 # 6.5 ans := (T + OnebySc) 6947 # 6.6 Restore user FPCR. 6948 # 6.7 Return ans := Sc * an 6949 # Notes: The various arrangements of t 6950 # accurate evaluations. 6951 # 6952 # Step 7. exp(X)-1 for |X| < 1/4. 6953 # 7.1 If |X| >= 2^(-65), go 6954 # 7.2 Go to Step 8. 6955 # 6956 # Step 8. Calculate exp(X)-1, |X| < 2^( 6957 # 8.1 If |X| < 2^(-16312), 6958 # 8.2 Restore FPCR; return 6959 # Exit. 6960 # 8.3 X := X * 2^(140). 6961 # 8.4 Restore FPCR; ans := 6962 # Return ans := ans*2^(140). E 6963 # Notes: The idea is to return "X - ti 6964 # precision and rounding modes. 6965 # inefficiency, we stay away fr 6966 # the best we can. For |X| >= 2 6967 # straightforward 8.2 generates 6968 # the case warrants. 6969 # 6970 # Step 9. Calculate exp(X)-1, |X| < 1/4 6971 # p = X + X*X*(B1 + X*( 6972 # Notes: a) In order to reduce memory 6973 # are made as "short" as possib 6974 # to B12 are single precision; 6975 # precision; and B2 is double e 6976 # b) Even with the restriction 6977 # |p - (exp(X)-1)| < |X 6978 # for all |X| <= 0.251. 6979 # Note that 0.251 is slightly b 6980 # c) To fully preserve accuracy 6981 # computed as 6982 # X + ( S*B1 + Q ) w 6983 # Q = X*S*( 6984 # d) To fully utilize the pipel 6985 # two independent pieces of rou 6986 # Q = [ X*S*(B2 + S*(B4 6987 # [ S*S*(B3 + S 6988 # 6989 # Step 10. Calculate exp(X)-1 for |X| > 6990 # 10.1 If X >= 70log2 , exp(X) 6991 # practical purposes. Therefore 6992 # 10.2 If X <= -70log2, exp(X) 6993 # purposes. 6994 # ans := -1 6995 # Restore user FPCR 6996 # Return ans := ans + 2^(-126). 6997 # Notes: 10.2 will always create an in 6998 # in the user rounding precisio 6999 # 7000 ############################################# 7001 7002 L2: long 0x3FDC0000,0x82E30865 7003 7004 EEXPA3: long 0x3FA55555,0x55554CC1 7005 EEXPA2: long 0x3FC55555,0x55554A54 7006 7007 EM1A4: long 0x3F811111,0x11174385 7008 EM1A3: long 0x3FA55555,0x55554F5A 7009 7010 EM1A2: long 0x3FC55555,0x55555555 7011 7012 EM1B8: long 0x3EC71DE3,0xA5774682 7013 EM1B7: long 0x3EFA01A0,0x19D7CB68 7014 7015 EM1B6: long 0x3F2A01A0,0x1A019DF3 7016 EM1B5: long 0x3F56C16C,0x16C170E2 7017 7018 EM1B4: long 0x3F811111,0x11111111 7019 EM1B3: long 0x3FA55555,0x55555555 7020 7021 EM1B2: long 0x3FFC0000,0xAAAAAAAA 7022 long 0x00000000 7023 7024 TWO140: long 0x48B00000,0x00000000 7025 TWON140: 7026 long 0x37300000,0x00000000 7027 7028 EEXPTBL: 7029 long 0x3FFF0000,0x80000000 7030 long 0x3FFF0000,0x8164D1F3 7031 long 0x3FFF0000,0x82CD8698 7032 long 0x3FFF0000,0x843A28C3 7033 long 0x3FFF0000,0x85AAC367 7034 long 0x3FFF0000,0x871F6196 7035 long 0x3FFF0000,0x88980E80 7036 long 0x3FFF0000,0x8A14D575 7037 long 0x3FFF0000,0x8B95C1E3 7038 long 0x3FFF0000,0x8D1ADF5B 7039 long 0x3FFF0000,0x8EA4398B 7040 long 0x3FFF0000,0x9031DC43 7041 long 0x3FFF0000,0x91C3D373 7042 long 0x3FFF0000,0x935A2B2F 7043 long 0x3FFF0000,0x94F4EFA8 7044 long 0x3FFF0000,0x96942D37 7045 long 0x3FFF0000,0x9837F051 7046 long 0x3FFF0000,0x99E04593 7047 long 0x3FFF0000,0x9B8D39B9 7048 long 0x3FFF0000,0x9D3ED9A7 7049 long 0x3FFF0000,0x9EF53260 7050 long 0x3FFF0000,0xA0B0510F 7051 long 0x3FFF0000,0xA2704303 7052 long 0x3FFF0000,0xA43515AE 7053 long 0x3FFF0000,0xA5FED6A9 7054 long 0x3FFF0000,0xA7CD93B4 7055 long 0x3FFF0000,0xA9A15AB4 7056 long 0x3FFF0000,0xAB7A39B5 7057 long 0x3FFF0000,0xAD583EEA 7058 long 0x3FFF0000,0xAF3B78AD 7059 long 0x3FFF0000,0xB123F581 7060 long 0x3FFF0000,0xB311C412 7061 long 0x3FFF0000,0xB504F333 7062 long 0x3FFF0000,0xB6FD91E3 7063 long 0x3FFF0000,0xB8FBAF47 7064 long 0x3FFF0000,0xBAFF5AB2 7065 long 0x3FFF0000,0xBD08A39F 7066 long 0x3FFF0000,0xBF1799B6 7067 long 0x3FFF0000,0xC12C4CCA 7068 long 0x3FFF0000,0xC346CCDA 7069 long 0x3FFF0000,0xC5672A11 7070 long 0x3FFF0000,0xC78D74C8 7071 long 0x3FFF0000,0xC9B9BD86 7072 long 0x3FFF0000,0xCBEC14FE 7073 long 0x3FFF0000,0xCE248C15 7074 long 0x3FFF0000,0xD06333DA 7075 long 0x3FFF0000,0xD2A81D91 7076 long 0x3FFF0000,0xD4F35AAB 7077 long 0x3FFF0000,0xD744FCCA 7078 long 0x3FFF0000,0xD99D15C2 7079 long 0x3FFF0000,0xDBFBB797 7080 long 0x3FFF0000,0xDE60F482 7081 long 0x3FFF0000,0xE0CCDEEC 7082 long 0x3FFF0000,0xE33F8972 7083 long 0x3FFF0000,0xE5B906E7 7084 long 0x3FFF0000,0xE8396A50 7085 long 0x3FFF0000,0xEAC0C6E7 7086 long 0x3FFF0000,0xED4F301E 7087 long 0x3FFF0000,0xEFE4B99B 7088 long 0x3FFF0000,0xF281773C 7089 long 0x3FFF0000,0xF5257D15 7090 long 0x3FFF0000,0xF7D0DF73 7091 long 0x3FFF0000,0xFA83B2DB 7092 long 0x3FFF0000,0xFD3E0C0C 7093 7094 set ADJFLAG,L_SCR2 7095 set SCALE,FP_SCR0 7096 set ADJSCALE,FP_SCR1 7097 set SC,FP_SCR0 7098 set ONEBYSC,FP_SCR1 7099 7100 global setox 7101 setox: 7102 #--entry point for EXP(X), here X is finite, 7103 7104 #--Step 1. 7105 mov.l (%a0),%d1 7106 and.l &0x7FFF0000,%d1 7107 cmp.l %d1,&0x3FBE0000 7108 bge.b EXPC1 7109 bra EXPSM 7110 7111 EXPC1: 7112 #--The case |X| >= 2^(-65) 7113 mov.w 4(%a0),%d1 7114 cmp.l %d1,&0x400CB167 7115 blt.b EXPMAIN 7116 bra EEXPBIG 7117 7118 EXPMAIN: 7119 #--Step 2. 7120 #--This is the normal branch: 2^(-65) <= |X 7121 fmov.x (%a0),%fp0 7122 7123 fmov.x %fp0,%fp1 7124 fmul.s &0x42B8AA3B,%fp0 7125 fmovm.x &0xc,-(%sp) 7126 mov.l &0,ADJFLAG(%a6) 7127 fmov.l %fp0,%d1 7128 lea EEXPTBL(%pc),%a1 7129 fmov.l %d1,%fp0 7130 7131 mov.l %d1,L_SCR1(%a6) 7132 and.l &0x3F,%d1 7133 lsl.l &4,%d1 7134 add.l %d1,%a1 7135 mov.l L_SCR1(%a6),%d1 7136 asr.l &6,%d1 7137 add.w &0x3FFF,%d1 7138 mov.w L2(%pc),L_SCR1(%a6) 7139 7140 EXPCONT1: 7141 #--Step 3. 7142 #--fp1,fp2 saved on the stack. fp0 is N, fp1 7143 #--a0 points to 2^(J/64), D0 is biased expo. 7144 fmov.x %fp0,%fp2 7145 fmul.s &0xBC317218,%fp0 7146 fmul.x L2(%pc),%fp2 7147 fadd.x %fp1,%fp0 7148 fadd.x %fp2,%fp0 7149 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*A 7153 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE 7154 #--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))] 7155 7156 fmov.x %fp0,%fp1 7157 fmul.x %fp1,%fp1 7158 7159 fmov.s &0x3AB60B70,%fp2 7160 7161 fmul.x %fp1,%fp2 7162 fmov.x %fp1,%fp3 7163 fmul.s &0x3C088895,%fp3 7164 7165 fadd.d EEXPA3(%pc),%fp2 7166 fadd.d EEXPA2(%pc),%fp3 7167 7168 fmul.x %fp1,%fp2 7169 mov.w %d1,SCALE(%a6) 7170 mov.l &0x80000000,SCALE+4(% 7171 clr.l SCALE+8(%a6) 7172 7173 fmul.x %fp1,%fp3 7174 7175 fadd.s &0x3F000000,%fp2 7176 fmul.x %fp0,%fp3 7177 7178 fmul.x %fp1,%fp2 7179 fadd.x %fp3,%fp0 7180 7181 fmov.x (%a1)+,%fp1 7182 fadd.x %fp2,%fp0 7183 7184 #--Step 5 7185 #--final reconstruction process 7186 #--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP( 7187 7188 fmul.x %fp1,%fp0 7189 fmovm.x (%sp)+,&0x30 7190 fadd.s (%a1),%fp0 7191 7192 fadd.x %fp1,%fp0 7193 mov.l ADJFLAG(%a6),%d1 7194 7195 #--Step 6 7196 tst.l %d1 7197 beq.b NORMAL 7198 ADJUST: 7199 fmul.x ADJSCALE(%a6),%fp0 7200 NORMAL: 7201 fmov.l %d0,%fpcr 7202 mov.b &FMUL_OP,%d1 7203 fmul.x SCALE(%a6),%fp0 7204 bra t_catch 7205 7206 EXPSM: 7207 #--Step 7 7208 fmovm.x (%a0),&0x80 7209 fmov.l %d0,%fpcr 7210 fadd.s &0x3F800000,%fp0 7211 bra t_pinx2 7212 7213 EEXPBIG: 7214 #--Step 8 7215 cmp.l %d1,&0x400CB27C 7216 bgt.b EXP2BIG 7217 #--Steps 8.2 -- 8.6 7218 fmov.x (%a0),%fp0 7219 7220 fmov.x %fp0,%fp1 7221 fmul.s &0x42B8AA3B,%fp0 7222 fmovm.x &0xc,-(%sp) 7223 mov.l &1,ADJFLAG(%a6) 7224 fmov.l %fp0,%d1 7225 lea EEXPTBL(%pc),%a1 7226 fmov.l %d1,%fp0 7227 mov.l %d1,L_SCR1(%a6) 7228 and.l &0x3F,%d1 7229 lsl.l &4,%d1 7230 add.l %d1,%a1 7231 mov.l L_SCR1(%a6),%d1 7232 asr.l &6,%d1 7233 mov.l %d1,L_SCR1(%a6) 7234 asr.l &1,%d1 7235 sub.l %d1,L_SCR1(%a6) 7236 add.w &0x3FFF,%d1 7237 mov.w %d1,ADJSCALE(%a6) 7238 mov.l &0x80000000,ADJSCALE+ 7239 clr.l ADJSCALE+8(%a6) 7240 mov.l L_SCR1(%a6),%d1 7241 add.w &0x3FFF,%d1 7242 bra.w EXPCONT1 7243 7244 EXP2BIG: 7245 #--Step 9 7246 tst.b (%a0) 7247 bmi t_unfl2 7248 bra t_ovfl2 7249 7250 global setoxd 7251 setoxd: 7252 #--entry point for EXP(X), X is denormalized 7253 mov.l (%a0),-(%sp) 7254 andi.l &0x80000000,(%sp) 7255 ori.l &0x00800000,(%sp) 7256 7257 fmov.s &0x3F800000,%fp0 7258 7259 fmov.l %d0,%fpcr 7260 fadd.s (%sp)+,%fp0 7261 bra t_pinx2 7262 7263 global setoxm1 7264 setoxm1: 7265 #--entry point for EXPM1(X), here X is finite 7266 7267 #--Step 1. 7268 #--Step 1.1 7269 mov.l (%a0),%d1 7270 and.l &0x7FFF0000,%d1 7271 cmp.l %d1,&0x3FFD0000 7272 bge.b EM1CON1 7273 bra EM1SM 7274 7275 EM1CON1: 7276 #--Step 1.3 7277 #--The case |X| >= 1/4 7278 mov.w 4(%a0),%d1 7279 cmp.l %d1,&0x4004C215 7280 ble.b EM1MAIN 7281 bra EM1BIG 7282 7283 EM1MAIN: 7284 #--Step 2. 7285 #--This is the case: 1/4 <= |X| <= 70 log2 7286 fmov.x (%a0),%fp0 7287 7288 fmov.x %fp0,%fp1 7289 fmul.s &0x42B8AA3B,%fp0 7290 fmovm.x &0xc,-(%sp) 7291 fmov.l %fp0,%d1 7292 lea EEXPTBL(%pc),%a1 7293 fmov.l %d1,%fp0 7294 7295 mov.l %d1,L_SCR1(%a6) 7296 and.l &0x3F,%d1 7297 lsl.l &4,%d1 7298 add.l %d1,%a1 7299 mov.l L_SCR1(%a6),%d1 7300 asr.l &6,%d1 7301 mov.l %d1,L_SCR1(%a6) 7302 7303 #--Step 3. 7304 #--fp1,fp2 saved on the stack. fp0 is N, fp1 7305 #--a0 points to 2^(J/64), D0 and a1 both cont 7306 fmov.x %fp0,%fp2 7307 fmul.s &0xBC317218,%fp0 7308 fmul.x L2(%pc),%fp2 7309 fadd.x %fp1,%fp0 7310 fadd.x %fp2,%fp0 7311 add.w &0x3FFF,%d1 7312 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*( 7316 #--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE 7317 #--[R*S*(A2+S*(A4+S*A6))] + [R+S*(A1+S*(A3+S* 7318 7319 fmov.x %fp0,%fp1 7320 fmul.x %fp1,%fp1 7321 7322 fmov.s &0x3950097B,%fp2 7323 7324 fmul.x %fp1,%fp2 7325 fmov.x %fp1,%fp3 7326 fmul.s &0x3AB60B6A,%fp3 7327 7328 fadd.d EM1A4(%pc),%fp2 7329 fadd.d EM1A3(%pc),%fp3 7330 mov.w %d1,SC(%a6) 7331 mov.l &0x80000000,SC+4(%a6) 7332 clr.l SC+8(%a6) 7333 7334 fmul.x %fp1,%fp2 7335 mov.l L_SCR1(%a6),%d1 7336 neg.w %d1 7337 fmul.x %fp1,%fp3 7338 add.w &0x3FFF,%d1 7339 fadd.d EM1A2(%pc),%fp2 7340 fadd.s &0x3F000000,%fp3 7341 7342 fmul.x %fp1,%fp2 7343 or.w &0x8000,%d1 7344 mov.w %d1,ONEBYSC(%a6) 7345 mov.l &0x80000000,ONEBYSC+4 7346 clr.l ONEBYSC+8(%a6) 7347 fmul.x %fp3,%fp1 7348 7349 fmul.x %fp0,%fp2 7350 fadd.x %fp1,%fp0 7351 7352 fadd.x %fp2,%fp0 7353 7354 fmovm.x (%sp)+,&0x30 7355 7356 #--Step 5 7357 #--Compute 2^(J/64)*p 7358 7359 fmul.x (%a1),%fp0 7360 7361 #--Step 6 7362 #--Step 6.1 7363 mov.l L_SCR1(%a6),%d1 7364 cmp.l %d1,&63 7365 ble.b MLE63 7366 #--Step 6.2 M >= 64 7367 fmov.s 12(%a1),%fp1 7368 fadd.x ONEBYSC(%a6),%fp1 7369 fadd.x %fp1,%fp0 7370 fadd.x (%a1),%fp0 7371 bra EM1SCALE 7372 MLE63: 7373 #--Step 6.3 M <= 63 7374 cmp.l %d1,&-3 7375 bge.b MGEN3 7376 MLTN3: 7377 #--Step 6.4 M <= -4 7378 fadd.s 12(%a1),%fp0 7379 fadd.x (%a1),%fp0 7380 fadd.x ONEBYSC(%a6),%fp0 7381 bra EM1SCALE 7382 MGEN3: 7383 #--Step 6.5 -3 <= M <= 63 7384 fmov.x (%a1)+,%fp1 7385 fadd.s (%a1),%fp0 7386 fadd.x ONEBYSC(%a6),%fp1 7387 fadd.x %fp1,%fp0 7388 7389 EM1SCALE: 7390 #--Step 6.6 7391 fmov.l %d0,%fpcr 7392 fmul.x SC(%a6),%fp0 7393 bra t_inx2 7394 7395 EM1SM: 7396 #--Step 7 |X| < 1/4. 7397 cmp.l %d1,&0x3FBE0000 7398 bge.b EM1POLY 7399 7400 EM1TINY: 7401 #--Step 8 |X| < 2^(-65) 7402 cmp.l %d1,&0x00330000 7403 blt.b EM12TINY 7404 #--Step 8.2 7405 mov.l &0x80010000,SC(%a6) 7406 mov.l &0x80000000,SC+4(%a6) 7407 clr.l SC+8(%a6) 7408 fmov.x (%a0),%fp0 7409 fmov.l %d0,%fpcr 7410 mov.b &FADD_OP,%d1 7411 fadd.x SC(%a6),%fp0 7412 bra t_catch 7413 7414 EM12TINY: 7415 #--Step 8.3 7416 fmov.x (%a0),%fp0 7417 fmul.d TWO140(%pc),%fp0 7418 mov.l &0x80010000,SC(%a6) 7419 mov.l &0x80000000,SC+4(%a6) 7420 clr.l SC+8(%a6) 7421 fadd.x SC(%a6),%fp0 7422 fmov.l %d0,%fpcr 7423 mov.b &FMUL_OP,%d1 7424 fmul.d TWON140(%pc),%fp0 7425 bra t_catch 7426 7427 EM1POLY: 7428 #--Step 9 exp(X)-1 by a simple polynomi 7429 fmov.x (%a0),%fp0 7430 fmul.x %fp0,%fp0 7431 fmovm.x &0xc,-(%sp) 7432 fmov.s &0x2F30CAA8,%fp1 7433 fmul.x %fp0,%fp1 7434 fmov.s &0x310F8290,%fp2 7435 fadd.s &0x32D73220,%fp1 7436 7437 fmul.x %fp0,%fp2 7438 fmul.x %fp0,%fp1 7439 7440 fadd.s &0x3493F281,%fp2 7441 fadd.d EM1B8(%pc),%fp1 7442 7443 fmul.x %fp0,%fp2 7444 fmul.x %fp0,%fp1 7445 7446 fadd.d EM1B7(%pc),%fp2 7447 fadd.d EM1B6(%pc),%fp1 7448 7449 fmul.x %fp0,%fp2 7450 fmul.x %fp0,%fp1 7451 7452 fadd.d EM1B5(%pc),%fp2 7453 fadd.d EM1B4(%pc),%fp1 7454 7455 fmul.x %fp0,%fp2 7456 fmul.x %fp0,%fp1 7457 7458 fadd.d EM1B3(%pc),%fp2 7459 fadd.x EM1B2(%pc),%fp1 7460 7461 fmul.x %fp0,%fp2 7462 fmul.x %fp0,%fp1 7463 7464 fmul.x %fp0,%fp2 7465 fmul.x (%a0),%fp1 7466 7467 fmul.s &0x3F000000,%fp0 7468 fadd.x %fp2,%fp1 7469 7470 fmovm.x (%sp)+,&0x30 7471 7472 fadd.x %fp1,%fp0 7473 7474 fmov.l %d0,%fpcr 7475 fadd.x (%a0),%fp0 7476 bra t_inx2 7477 7478 EM1BIG: 7479 #--Step 10 |X| > 70 log2 7480 mov.l (%a0),%d1 7481 cmp.l %d1,&0 7482 bgt.w EXPC1 7483 #--Step 10.2 7484 fmov.s &0xBF800000,%fp0 7485 fmov.l %d0,%fpcr 7486 fadd.s &0x00800000,%fp0 7487 bra t_minx2 7488 7489 global setoxm1d 7490 setoxm1d: 7491 #--entry point for EXPM1(X), here X is denorm 7492 #--Step 0. 7493 bra t_extdnrm 7494 7495 ############################################# 7496 # sgetexp(): returns the exponent portion of 7497 # The exponent bias is removed an 7498 # returned as an extended precisi 7499 # sgetexpd(): handles denormalized numbers. 7500 # 7501 # sgetman(): extracts the mantissa of the in 7502 # mantissa is converted to an ext 7503 # an exponent of $3fff and is ret 7504 # the result is [1.0 - 2.0). 7505 # sgetmand(): handles denormalized numbers. 7506 # 7507 # INPUT ************************************* 7508 # a0 = pointer to extended precision i 7509 # 7510 # OUTPUT ************************************ 7511 # fp0 = exponent(X) or mantissa(X) 7512 # 7513 ############################################# 7514 7515 global sgetexp 7516 sgetexp: 7517 mov.w SRC_EX(%a0),%d0 7518 bclr &0xf,%d0 7519 subi.w &0x3fff,%d0 7520 fmov.w %d0,%fp0 7521 blt.b sgetexpn 7522 rts 7523 7524 sgetexpn: 7525 mov.b &neg_bmask,FPSR_CC(%a 7526 rts 7527 7528 global sgetexpd 7529 sgetexpd: 7530 bsr.l norm 7531 neg.w %d0 7532 subi.w &0x3fff,%d0 7533 fmov.w %d0,%fp0 7534 mov.b &neg_bmask,FPSR_CC(%a 7535 rts 7536 7537 global sgetman 7538 sgetman: 7539 mov.w SRC_EX(%a0),%d0 7540 ori.w &0x7fff,%d0 7541 bclr &0xe,%d0 7542 7543 # here, we build the result in a tmp location 7544 mov.l SRC_HI(%a0),FP_SCR0_H 7545 mov.l SRC_LO(%a0),FP_SCR0_L 7546 mov.w %d0,FP_SCR0_EX(%a6) 7547 fmov.x FP_SCR0(%a6),%fp0 7548 bmi.b sgetmann 7549 rts 7550 7551 sgetmann: 7552 mov.b &neg_bmask,FPSR_CC(%a 7553 rts 7554 7555 # 7556 # For denormalized numbers, shift the mantiss 7557 # then load the exponent with +/1 $3fff. 7558 # 7559 global sgetmand 7560 sgetmand: 7561 bsr.l norm 7562 bra.b sgetman 7563 7564 ############################################# 7565 # scosh(): computes the hyperbolic cosine of 7566 # scoshd(): computes the hyperbolic cosine of 7567 # 7568 # INPUT ************************************* 7569 # a0 = pointer to extended precision in 7570 # d0 = round precision,mode 7571 # 7572 # OUTPUT ************************************ 7573 # fp0 = cosh(X) 7574 # 7575 # ACCURACY and MONOTONICITY ***************** 7576 # The returned result is within 3 ulps 7577 # i.e. within 0.5001 ulp to 53 bits if 7578 # rounded to double precision. The resu 7579 # in double precision. 7580 # 7581 # ALGORITHM ********************************* 7582 # 7583 # COSH 7584 # 1. If |X| > 16380 log2, go to 3. 7585 # 7586 # 2. (|X| <= 16380 log2) Cosh(X) is obt 7587 # y = |X|, z = exp(Y), and 7588 # cosh(X) = (1/2)*( z + 1/z ). 7589 # Exit. 7590 # 7591 # 3. (|X| > 16380 log2). If |X| > 16480 7592 # 7593 # 4. (16380 log2 < |X| <= 16480 log2) 7594 # cosh(X) = sign(X) * exp(|X|)/ 7595 # However, invoking exp(|X|) ma 7596 # overflow. Thus, we calculate 7597 # Y := |X| 7598 # Fact := 2**(16380) 7599 # Y' := Y - 16381 log2 7600 # cosh(X) := Fact * exp(Y'). 7601 # Exit. 7602 # 7603 # 5. (|X| > 16480 log2) sinh(X) must ov 7604 # Huge*Huge to generate overflo 7605 # the appropriate sign. Huge is 7606 # in extended format. Exit. 7607 # 7608 ############################################# 7609 7610 TWO16380: 7611 long 0x7FFB0000,0x80000000 7612 7613 global scosh 7614 scosh: 7615 fmov.x (%a0),%fp0 7616 7617 mov.l (%a0),%d1 7618 mov.w 4(%a0),%d1 7619 and.l &0x7FFFFFFF,%d1 7620 cmp.l %d1,&0x400CB167 7621 bgt.b COSHBIG 7622 7623 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2 7624 #--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) ) 7625 7626 fabs.x %fp0 7627 7628 mov.l %d0,-(%sp) 7629 clr.l %d0 7630 fmovm.x &0x01,-(%sp) 7631 lea (%sp),%a0 7632 bsr setox 7633 add.l &0xc,%sp 7634 fmul.s &0x3F000000,%fp0 7635 mov.l (%sp)+,%d0 7636 7637 fmov.s &0x3E800000,%fp1 7638 fdiv.x %fp0,%fp1 7639 7640 fmov.l %d0,%fpcr 7641 mov.b &FADD_OP,%d1 7642 fadd.x %fp1,%fp0 7643 bra t_catch 7644 7645 COSHBIG: 7646 cmp.l %d1,&0x400CB2B3 7647 bgt.b COSHHUGE 7648 7649 fabs.x %fp0 7650 fsub.d T1(%pc),%fp0 7651 fsub.d T2(%pc),%fp0 7652 7653 mov.l %d0,-(%sp) 7654 clr.l %d0 7655 fmovm.x &0x01,-(%sp) 7656 lea (%sp),%a0 7657 bsr setox 7658 add.l &0xc,%sp 7659 mov.l (%sp)+,%d0 7660 7661 fmov.l %d0,%fpcr 7662 mov.b &FMUL_OP,%d1 7663 fmul.x TWO16380(%pc),%fp0 7664 bra t_catch 7665 7666 COSHHUGE: 7667 bra t_ovfl2 7668 7669 global scoshd 7670 #--COSH(X) = 1 FOR DENORMALIZED X 7671 scoshd: 7672 fmov.s &0x3F800000,%fp0 7673 7674 fmov.l %d0,%fpcr 7675 fadd.s &0x00800000,%fp0 7676 bra t_pinx2 7677 7678 ############################################# 7679 # ssinh(): computes the hyperbolic sine of a 7680 # ssinhd(): computes the hyperbolic sine of a 7681 # 7682 # INPUT ************************************* 7683 # a0 = pointer to extended precision in 7684 # d0 = round precision,mode 7685 # 7686 # OUTPUT ************************************ 7687 # fp0 = sinh(X) 7688 # 7689 # ACCURACY and MONOTONICITY ***************** 7690 # The returned result is within 3 ulps 7691 # i.e. within 0.5001 ulp to 53 bits if 7692 # rounded to double precision. The resu 7693 # in double precision. 7694 # 7695 # ALGORITHM ********************************* 7696 # 7697 # SINH 7698 # 1. If |X| > 16380 log2, go to 3. 7699 # 7700 # 2. (|X| <= 16380 log2) Sinh(X) is obt 7701 # y = |X|, sgn = sign(X), and z 7702 # sinh(X) = sgn*(1/2)*( z + z/( 7703 # Exit. 7704 # 7705 # 3. If |X| > 16480 log2, go to 5. 7706 # 7707 # 4. (16380 log2 < |X| <= 16480 log2) 7708 # sinh(X) = sign(X) * exp(|X|)/ 7709 # However, invoking exp(|X|) may cau 7710 # Thus, we calculate sinh(X) as foll 7711 # Y := |X| 7712 # sgn := sign(X) 7713 # sgnFact := sgn * 2**(16380) 7714 # Y' := Y - 16381 log2 7715 # sinh(X) := sgnFact * exp(Y'). 7716 # Exit. 7717 # 7718 # 5. (|X| > 16480 log2) sinh(X) must ov 7719 # sign(X)*Huge*Huge to generate over 7720 # the appropriate sign. Huge is the 7721 # extended format. Exit. 7722 # 7723 ############################################# 7724 7725 global ssinh 7726 ssinh: 7727 fmov.x (%a0),%fp0 7728 7729 mov.l (%a0),%d1 7730 mov.w 4(%a0),%d1 7731 mov.l %d1,%a1 7732 and.l &0x7FFFFFFF,%d1 7733 cmp.l %d1,&0x400CB167 7734 bgt.b SINHBIG 7735 7736 #--THIS IS THE USUAL CASE, |X| < 16380 LOG2 7737 #--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*( 7738 7739 fabs.x %fp0 7740 7741 movm.l &0x8040,-(%sp) 7742 fmovm.x &0x01,-(%sp) 7743 lea (%sp),%a0 7744 clr.l %d0 7745 bsr setoxm1 7746 add.l &0xc,%sp 7747 fmov.l &0,%fpcr 7748 movm.l (%sp)+,&0x0201 7749 7750 fmov.x %fp0,%fp1 7751 fadd.s &0x3F800000,%fp1 7752 fmov.x %fp0,-(%sp) 7753 fdiv.x %fp1,%fp0 7754 mov.l %a1,%d1 7755 and.l &0x80000000,%d1 7756 or.l &0x3F000000,%d1 7757 fadd.x (%sp)+,%fp0 7758 mov.l %d1,-(%sp) 7759 7760 fmov.l %d0,%fpcr 7761 mov.b &FMUL_OP,%d1 7762 fmul.s (%sp)+,%fp0 7763 bra t_catch 7764 7765 SINHBIG: 7766 cmp.l %d1,&0x400CB2B3 7767 bgt t_ovfl 7768 fabs.x %fp0 7769 fsub.d T1(%pc),%fp0 7770 mov.l &0,-(%sp) 7771 mov.l &0x80000000,-(%sp) 7772 mov.l %a1,%d1 7773 and.l &0x80000000,%d1 7774 or.l &0x7FFB0000,%d1 7775 mov.l %d1,-(%sp) 7776 fsub.d T2(%pc),%fp0 7777 7778 mov.l %d0,-(%sp) 7779 clr.l %d0 7780 fmovm.x &0x01,-(%sp) 7781 lea (%sp),%a0 7782 bsr setox 7783 add.l &0xc,%sp 7784 7785 mov.l (%sp)+,%d0 7786 fmov.l %d0,%fpcr 7787 mov.b &FMUL_OP,%d1 7788 fmul.x (%sp)+,%fp0 7789 bra t_catch 7790 7791 global ssinhd 7792 #--SINH(X) = X FOR DENORMALIZED X 7793 ssinhd: 7794 bra t_extdnrm 7795 7796 ############################################# 7797 # stanh(): computes the hyperbolic tangent o 7798 # stanhd(): computes the hyperbolic tangent o 7799 # 7800 # INPUT ************************************* 7801 # a0 = pointer to extended precision in 7802 # d0 = round precision,mode 7803 # 7804 # OUTPUT ************************************ 7805 # fp0 = tanh(X) 7806 # 7807 # ACCURACY and MONOTONICITY ***************** 7808 # The returned result is within 3 ulps 7809 # i.e. within 0.5001 ulp to 53 bits if 7810 # rounded to double precision. The resu 7811 # in double precision. 7812 # 7813 # ALGORITHM ********************************* 7814 # 7815 # TANH 7816 # 1. If |X| >= (5/2) log2 or |X| <= 2** 7817 # 7818 # 2. (2**(-40) < |X| < (5/2) log2) Calc 7819 # sgn := sign(X), y := 2|X|, z 7820 # tanh(X) = sgn*( z/(2+z) ). 7821 # Exit. 7822 # 7823 # 3. (|X| <= 2**(-40) or |X| >= (5/2) l 7824 # go to 7. 7825 # 7826 # 4. (|X| >= (5/2) log2) If |X| >= 50 l 7827 # 7828 # 5. ((5/2) log2 <= |X| < 50 log2) Calc 7829 # sgn := sign(X), y := 2|X|, z 7830 # tanh(X) = sgn - [ sgn*2/(1+z) 7831 # Exit. 7832 # 7833 # 6. (|X| >= 50 log2) Tanh(X) = +-1 (ro 7834 # calculate Tanh(X) by 7835 # sgn := sign(X), Tiny := 2**(- 7836 # tanh(X) := sgn - sgn*Tiny. 7837 # Exit. 7838 # 7839 # 7. (|X| < 2**(-40)). Tanh(X) = X. 7840 # 7841 ############################################# 7842 7843 set X,FP_SCR0 7844 set XFRAC,X+4 7845 7846 set SGN,L_SCR3 7847 7848 set V,FP_SCR0 7849 7850 global stanh 7851 stanh: 7852 fmov.x (%a0),%fp0 7853 7854 fmov.x %fp0,X(%a6) 7855 mov.l (%a0),%d1 7856 mov.w 4(%a0),%d1 7857 mov.l %d1,X(%a6) 7858 and.l &0x7FFFFFFF,%d1 7859 cmp.l %d1, &0x3fd78000 7860 blt.w TANHBORS 7861 cmp.l %d1, &0x3fffddce 7862 bgt.w TANHBORS 7863 7864 #--THIS IS THE USUAL CASE 7865 #--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) 7866 7867 mov.l X(%a6),%d1 7868 mov.l %d1,SGN(%a6) 7869 and.l &0x7FFF0000,%d1 7870 add.l &0x00010000,%d1 7871 mov.l %d1,X(%a6) 7872 and.l &0x80000000,SGN(%a6) 7873 fmov.x X(%a6),%fp0 7874 7875 mov.l %d0,-(%sp) 7876 clr.l %d0 7877 fmovm.x &0x1,-(%sp) 7878 lea (%sp),%a0 7879 bsr setoxm1 7880 add.l &0xc,%sp 7881 mov.l (%sp)+,%d0 7882 7883 fmov.x %fp0,%fp1 7884 fadd.s &0x40000000,%fp1 7885 mov.l SGN(%a6),%d1 7886 fmov.x %fp1,V(%a6) 7887 eor.l %d1,V(%a6) 7888 7889 fmov.l %d0,%fpcr 7890 fdiv.x V(%a6),%fp0 7891 bra t_inx2 7892 7893 TANHBORS: 7894 cmp.l %d1,&0x3FFF8000 7895 blt.w TANHSM 7896 7897 cmp.l %d1,&0x40048AA1 7898 bgt.w TANHHUGE 7899 7900 #-- (5/2) LOG2 < |X| < 50 LOG2, 7901 #--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X 7902 #--TANH(X) = SGN - SGN*2/[EXP(Y)+1]. 7903 7904 mov.l X(%a6),%d1 7905 mov.l %d1,SGN(%a6) 7906 and.l &0x7FFF0000,%d1 7907 add.l &0x00010000,%d1 7908 mov.l %d1,X(%a6) 7909 and.l &0x80000000,SGN(%a6) 7910 mov.l SGN(%a6),%d1 7911 fmov.x X(%a6),%fp0 7912 7913 mov.l %d0,-(%sp) 7914 clr.l %d0 7915 fmovm.x &0x01,-(%sp) 7916 lea (%sp),%a0 7917 bsr setox 7918 add.l &0xc,%sp 7919 mov.l (%sp)+,%d0 7920 mov.l SGN(%a6),%d1 7921 fadd.s &0x3F800000,%fp0 7922 7923 eor.l &0xC0000000,%d1 7924 fmov.s %d1,%fp1 7925 fdiv.x %fp0,%fp1 7926 7927 mov.l SGN(%a6),%d1 7928 or.l &0x3F800000,%d1 7929 fmov.s %d1,%fp0 7930 7931 fmov.l %d0,%fpcr 7932 mov.b &FADD_OP,%d1 7933 fadd.x %fp1,%fp0 7934 bra t_inx2 7935 7936 TANHSM: 7937 fmov.l %d0,%fpcr 7938 mov.b &FMOV_OP,%d1 7939 fmov.x X(%a6),%fp0 7940 bra t_catch 7941 7942 #---RETURN SGN(X) - SGN(X)EPS 7943 TANHHUGE: 7944 mov.l X(%a6),%d1 7945 and.l &0x80000000,%d1 7946 or.l &0x3F800000,%d1 7947 fmov.s %d1,%fp0 7948 and.l &0x80000000,%d1 7949 eor.l &0x80800000,%d1 7950 7951 fmov.l %d0,%fpcr 7952 fadd.s %d1,%fp0 7953 bra t_inx2 7954 7955 global stanhd 7956 #--TANH(X) = X FOR DENORMALIZED X 7957 stanhd: 7958 bra t_extdnrm 7959 7960 ############################################# 7961 # slogn(): computes the natural logarithm 7962 # slognd(): computes the natural logarithm 7963 # slognp1(): computes the log(1+X) of a norm 7964 # slognp1d(): computes the log(1+X) of a deno 7965 # 7966 # INPUT ************************************* 7967 # a0 = pointer to extended precision in 7968 # d0 = round precision,mode 7969 # 7970 # OUTPUT ************************************ 7971 # fp0 = log(X) or log(1+X) 7972 # 7973 # ACCURACY and MONOTONICITY ***************** 7974 # The returned result is within 2 ulps 7975 # i.e. within 0.5001 ulp to 53 bits if 7976 # rounded to double precision. The resu 7977 # in double precision. 7978 # 7979 # ALGORITHM ********************************* 7980 # LOGN: 7981 # Step 1. If |X-1| < 1/16, approximate 7982 # polynomial in u, where u = 2( 7983 # move on to Step 2. 7984 # 7985 # Step 2. X = 2**k * Y where 1 <= Y < 2 7986 # seven significant bits of Y p 7987 # F = 1.xxxxxx1 in base 2 where 7988 # of Y. Note that |Y-F| <= 2**( 7989 # 7990 # Step 3. Define u = (Y-F)/F. Approxima 7991 # polynomial in u, log(1+u) = p 7992 # 7993 # Step 4. Reconstruct 7994 # log(X) = log( 2**k * Y ) = k* 7995 # by k*log(2) + (log(F) + poly) 7996 # calculated beforehand and sto 7997 # 7998 # lognp1: 7999 # Step 1: If |X| < 1/16, approximate lo 8000 # polynomial in u where u = 2X/ 8001 # to Step 2. 8002 # 8003 # Step 2: Let 1+X = 2**k * Y, where 1 < 8004 # in Step 2 of the algorithm fo 8005 # log(1+X) as k*log(2) + log(F) 8006 # approximates log(1+u), u = (Y 8007 # 8008 # Implementation Notes: 8009 # Note 1. There are 64 different possib 8010 # log(F)'s need to be tabulated 8011 # 1/F are also tabulated so tha 8012 # can be performed by a multipl 8013 # 8014 # Note 2. In Step 2 of lognp1, in order 8015 # the value Y-F has to be calcu 8016 # 1/2 <= X < 3/2. 8017 # 8018 # Note 3. To fully exploit the pipeline 8019 # separated into two parts eval 8020 # being added up. 8021 # 8022 ############################################# 8023 LOGOF2: 8024 long 0x3FFE0000,0xB17217F7 8025 8026 one: 8027 long 0x3F800000 8028 zero: 8029 long 0x00000000 8030 infty: 8031 long 0x7F800000 8032 negone: 8033 long 0xBF800000 8034 8035 LOGA6: 8036 long 0x3FC2499A,0xB5E4040B 8037 LOGA5: 8038 long 0xBFC555B5,0x848CB7DB 8039 8040 LOGA4: 8041 long 0x3FC99999,0x987D8730 8042 LOGA3: 8043 long 0xBFCFFFFF,0xFF6F7E97 8044 8045 LOGA2: 8046 long 0x3FD55555,0x555555A4 8047 LOGA1: 8048 long 0xBFE00000,0x00000008 8049 8050 LOGB5: 8051 long 0x3F175496,0xADD7DAD6 8052 LOGB4: 8053 long 0x3F3C71C2,0xFE80C7E0 8054 8055 LOGB3: 8056 long 0x3F624924,0x928BCCFF 8057 LOGB2: 8058 long 0x3F899999,0x999995EC 8059 8060 LOGB1: 8061 long 0x3FB55555,0x55555555 8062 TWO: 8063 long 0x40000000,0x00000000 8064 8065 LTHOLD: 8066 long 0x3f990000,0x80000000 8067 8068 LOGTBL: 8069 long 0x3FFE0000,0xFE03F80F 8070 long 0x3FF70000,0xFF015358 8071 long 0x3FFE0000,0xFA232CF2 8072 long 0x3FF90000,0xBDC8D83E 8073 long 0x3FFE0000,0xF6603D98 8074 long 0x3FFA0000,0x9CF43DCF 8075 long 0x3FFE0000,0xF2B9D648 8076 long 0x3FFA0000,0xDA16EB88 8077 long 0x3FFE0000,0xEF2EB71F 8078 long 0x3FFB0000,0x8B29B775 8079 long 0x3FFE0000,0xEBBDB2A5 8080 long 0x3FFB0000,0xA8D839F8 8081 long 0x3FFE0000,0xE865AC7B 8082 long 0x3FFB0000,0xC61A2EB1 8083 long 0x3FFE0000,0xE525982A 8084 long 0x3FFB0000,0xE2F2A47A 8085 long 0x3FFE0000,0xE1FC780E 8086 long 0x3FFB0000,0xFF64898E 8087 long 0x3FFE0000,0xDEE95C4C 8088 long 0x3FFC0000,0x8DB956A9 8089 long 0x3FFE0000,0xDBEB61EE 8090 long 0x3FFC0000,0x9B8FE100 8091 long 0x3FFE0000,0xD901B203 8092 long 0x3FFC0000,0xA9372F1D 8093 long 0x3FFE0000,0xD62B80D6 8094 long 0x3FFC0000,0xB6B07F38 8095 long 0x3FFE0000,0xD3680D36 8096 long 0x3FFC0000,0xC3FD0329 8097 long 0x3FFE0000,0xD0B69FCB 8098 long 0x3FFC0000,0xD11DE0FF 8099 long 0x3FFE0000,0xCE168A77 8100 long 0x3FFC0000,0xDE1433A1 8101 long 0x3FFE0000,0xCB8727C0 8102 long 0x3FFC0000,0xEAE10B5A 8103 long 0x3FFE0000,0xC907DA4E 8104 long 0x3FFC0000,0xF7856E5E 8105 long 0x3FFE0000,0xC6980C69 8106 long 0x3FFD0000,0x82012CA5 8107 long 0x3FFE0000,0xC4372F85 8108 long 0x3FFD0000,0x882C5FCD 8109 long 0x3FFE0000,0xC1E4BBD5 8110 long 0x3FFD0000,0x8E44C60B 8111 long 0x3FFE0000,0xBFA02FE8 8112 long 0x3FFD0000,0x944AD09E 8113 long 0x3FFE0000,0xBD691047 8114 long 0x3FFD0000,0x9A3EECD4 8115 long 0x3FFE0000,0xBB3EE721 8116 long 0x3FFD0000,0xA0218434 8117 long 0x3FFE0000,0xB92143FA 8118 long 0x3FFD0000,0xA5F2FCAB 8119 long 0x3FFE0000,0xB70FBB5A 8120 long 0x3FFD0000,0xABB3B8BA 8121 long 0x3FFE0000,0xB509E68A 8122 long 0x3FFD0000,0xB1641795 8123 long 0x3FFE0000,0xB30F6352 8124 long 0x3FFD0000,0xB7047551 8125 long 0x3FFE0000,0xB11FD3B8 8126 long 0x3FFD0000,0xBC952AFE 8127 long 0x3FFE0000,0xAF3ADDC6 8128 long 0x3FFD0000,0xC2168ED0 8129 long 0x3FFE0000,0xAD602B58 8130 long 0x3FFD0000,0xC788F439 8131 long 0x3FFE0000,0xAB8F69E2 8132 long 0x3FFD0000,0xCCECAC08 8133 long 0x3FFE0000,0xA9C84A47 8134 long 0x3FFD0000,0xD2420487 8135 long 0x3FFE0000,0xA80A80A8 8136 long 0x3FFD0000,0xD7894992 8137 long 0x3FFE0000,0xA655C439 8138 long 0x3FFD0000,0xDCC2C4B4 8139 long 0x3FFE0000,0xA4A9CF1D 8140 long 0x3FFD0000,0xE1EEBD3E 8141 long 0x3FFE0000,0xA3065E3F 8142 long 0x3FFD0000,0xE70D785C 8143 long 0x3FFE0000,0xA16B312E 8144 long 0x3FFD0000,0xEC1F392C 8145 long 0x3FFE0000,0x9FD809FD 8146 long 0x3FFD0000,0xF12440D3 8147 long 0x3FFE0000,0x9E4CAD23 8148 long 0x3FFD0000,0xF61CCE92 8149 long 0x3FFE0000,0x9CC8E160 8150 long 0x3FFD0000,0xFB091FD3 8151 long 0x3FFE0000,0x9B4C6F9E 8152 long 0x3FFD0000,0xFFE97042 8153 long 0x3FFE0000,0x99D722DA 8154 long 0x3FFE0000,0x825EFCED 8155 long 0x3FFE0000,0x9868C809 8156 long 0x3FFE0000,0x84C37A7A 8157 long 0x3FFE0000,0x97012E02 8158 long 0x3FFE0000,0x87224C2E 8159 long 0x3FFE0000,0x95A02568 8160 long 0x3FFE0000,0x897B8CAC 8161 long 0x3FFE0000,0x94458094 8162 long 0x3FFE0000,0x8BCF55DE 8163 long 0x3FFE0000,0x92F11384 8164 long 0x3FFE0000,0x8E1DC0FB 8165 long 0x3FFE0000,0x91A2B3C4 8166 long 0x3FFE0000,0x9066E68C 8167 long 0x3FFE0000,0x905A3863 8168 long 0x3FFE0000,0x92AADE74 8169 long 0x3FFE0000,0x8F1779D9 8170 long 0x3FFE0000,0x94E9BFF6 8171 long 0x3FFE0000,0x8DDA5202 8172 long 0x3FFE0000,0x9723A1B7 8173 long 0x3FFE0000,0x8CA29C04 8174 long 0x3FFE0000,0x995899C8 8175 long 0x3FFE0000,0x8B70344A 8176 long 0x3FFE0000,0x9B88BDAA 8177 long 0x3FFE0000,0x8A42F870 8178 long 0x3FFE0000,0x9DB4224F 8179 long 0x3FFE0000,0x891AC73A 8180 long 0x3FFE0000,0x9FDADC26 8181 long 0x3FFE0000,0x87F78087 8182 long 0x3FFE0000,0xA1FCFF17 8183 long 0x3FFE0000,0x86D90544 8184 long 0x3FFE0000,0xA41A9E8F 8185 long 0x3FFE0000,0x85BF3761 8186 long 0x3FFE0000,0xA633CD7E 8187 long 0x3FFE0000,0x84A9F9C8 8188 long 0x3FFE0000,0xA8489E60 8189 long 0x3FFE0000,0x83993052 8190 long 0x3FFE0000,0xAA59233C 8191 long 0x3FFE0000,0x828CBFBE 8192 long 0x3FFE0000,0xAC656DAE 8193 long 0x3FFE0000,0x81848DA8 8194 long 0x3FFE0000,0xAE6D8EE3 8195 long 0x3FFE0000,0x80808080 8196 long 0x3FFE0000,0xB07197A2 8197 8198 set ADJK,L_SCR1 8199 8200 set X,FP_SCR0 8201 set XDCARE,X+2 8202 set XFRAC,X+4 8203 8204 set F,FP_SCR1 8205 set FFRAC,F+4 8206 8207 set KLOG2,FP_SCR0 8208 8209 set SAVEU,FP_SCR0 8210 8211 global slogn 8212 #--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-Z 8213 slogn: 8214 fmov.x (%a0),%fp0 8215 mov.l &0x00000000,ADJK(%a6) 8216 8217 LOGBGN: 8218 #--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)* 8219 #--A FINITE, NON-ZERO, NORMALIZED NUMBER. 8220 8221 mov.l (%a0),%d1 8222 mov.w 4(%a0),%d1 8223 8224 mov.l (%a0),X(%a6) 8225 mov.l 4(%a0),X+4(%a6) 8226 mov.l 8(%a0),X+8(%a6) 8227 8228 cmp.l %d1,&0 8229 blt.w LOGNEG 8230 # X IS POSITIVE, CHECK IF X IS NEAR 1 8231 cmp.l %d1,&0x3ffef07d 8232 blt.b LOGMAIN 8233 cmp.l %d1,&0x3fff8841 8234 ble.w LOGNEAR1 8235 8236 LOGMAIN: 8237 #--THIS SHOULD BE THE USUAL CASE, X NOT VERY 8238 8239 #--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXX 8240 #--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS 8241 #--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y) 8242 #-- = K*LOG2 + LOG(F) + 8243 #--NOTE THAT U = (Y-F)/F IS VERY SMALL AND TH 8244 #--LOG(1+U) CAN BE VERY EFFICIENT. 8245 #--ALSO NOTE THAT THE VALUE 1/F IS STORED IN 8246 #--DIVISION IS NEEDED TO CALCULATE (Y-F)/F. 8247 8248 #--GET K, Y, F, AND ADDRESS OF 1/F. 8249 asr.l &8,%d1 8250 asr.l &8,%d1 8251 sub.l &0x3FFF,%d1 8252 add.l ADJK(%a6),%d1 8253 lea LOGTBL(%pc),%a0 8254 fmov.l %d1,%fp1 8255 8256 #--WHILE THE CONVERSION IS GOING ON, WE GET F 8257 mov.l &0x3FFF0000,X(%a6) 8258 mov.l XFRAC(%a6),FFRAC(%a6) 8259 and.l &0xFE000000,FFRAC(%a6 8260 or.l &0x01000000,FFRAC(%a6 8261 mov.l FFRAC(%a6),%d1 # REA 8262 and.l &0x7E000000,%d1 8263 asr.l &8,%d1 8264 asr.l &8,%d1 8265 asr.l &4,%d1 8266 add.l %d1,%a0 8267 8268 fmov.x X(%a6),%fp0 8269 mov.l &0x3fff0000,F(%a6) 8270 clr.l F+8(%a6) 8271 fsub.x F(%a6),%fp0 8272 fmovm.x &0xc,-(%sp) 8273 #--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, 8274 #--REGISTERS SAVED: FPCR, FP1, FP2 8275 8276 LP1CONT1: 8277 #--AN RE-ENTRY POINT FOR LOGNP1 8278 fmul.x (%a0),%fp0 8279 fmul.x LOGOF2(%pc),%fp1 8280 fmov.x %fp0,%fp2 8281 fmul.x %fp2,%fp2 8282 fmov.x %fp1,KLOG2(%a6) 8283 8284 #--LOG(1+U) IS APPROXIMATED BY 8285 #--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6)))) 8286 #--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A 8287 8288 fmov.x %fp2,%fp3 8289 fmov.x %fp2,%fp1 8290 8291 fmul.d LOGA6(%pc),%fp1 8292 fmul.d LOGA5(%pc),%fp2 8293 8294 fadd.d LOGA4(%pc),%fp1 8295 fadd.d LOGA3(%pc),%fp2 8296 8297 fmul.x %fp3,%fp1 8298 fmul.x %fp3,%fp2 8299 8300 fadd.d LOGA2(%pc),%fp1 8301 fadd.d LOGA1(%pc),%fp2 8302 8303 fmul.x %fp3,%fp1 8304 add.l &16,%a0 8305 fmul.x %fp3,%fp2 8306 8307 fmul.x %fp0,%fp1 8308 fadd.x %fp2,%fp0 8309 8310 fadd.x (%a0),%fp1 8311 fmovm.x (%sp)+,&0x30 8312 fadd.x %fp1,%fp0 8313 8314 fmov.l %d0,%fpcr 8315 fadd.x KLOG2(%a6),%fp0 8316 bra t_inx2 8317 8318 8319 LOGNEAR1: 8320 8321 # if the input is exactly equal to one, then 8322 # if these 2 lines weren't here, the correct 8323 # but the INEX2 bit would be set. 8324 fcmp.b %fp0,&0x1 8325 fbeq.l ld_pzero 8326 8327 #--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS T 8328 fmov.x %fp0,%fp1 8329 fsub.s one(%pc),%fp1 8330 fadd.s one(%pc),%fp0 8331 fadd.x %fp1,%fp1 8332 #--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN 8333 #--IN U, U = 2(X-1)/(X+1) = FP1/FP0 8334 8335 LP1CONT2: 8336 #--THIS IS AN RE-ENTRY POINT FOR LOGNP1 8337 fdiv.x %fp0,%fp1 8338 fmovm.x &0xc,-(%sp) 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 8342 #--U + U*V*( [B1 + W*(B3 + W*B5)] + [V*(B2 8343 fmov.x %fp1,%fp0 8344 fmul.x %fp0,%fp0 8345 fmov.x %fp1,SAVEU(%a6) 8346 fmov.x %fp0,%fp1 8347 fmul.x %fp1,%fp1 8348 8349 fmov.d LOGB5(%pc),%fp3 8350 fmov.d LOGB4(%pc),%fp2 8351 8352 fmul.x %fp1,%fp3 8353 fmul.x %fp1,%fp2 8354 8355 fadd.d LOGB3(%pc),%fp3 8356 fadd.d LOGB2(%pc),%fp2 8357 8358 fmul.x %fp3,%fp1 8359 8360 fmul.x %fp0,%fp2 8361 8362 fadd.d LOGB1(%pc),%fp1 8363 fmul.x SAVEU(%a6),%fp0 8364 8365 fadd.x %fp2,%fp1 8366 fmovm.x (%sp)+,&0x30 8367 8368 fmul.x %fp1,%fp0 8369 8370 fmov.l %d0,%fpcr 8371 fadd.x SAVEU(%a6),%fp0 8372 bra t_inx2 8373 8374 #--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID 8375 LOGNEG: 8376 bra t_operr 8377 8378 global slognd 8379 slognd: 8380 #--ENTRY POINT FOR LOG(X) FOR DENORMALIZED IN 8381 8382 mov.l &-100,ADJK(%a6) 8383 8384 #----normalize the input value by left shifti 8385 #----below), adjusting exponent and storing - 8386 #----the value TWOTO100 is no longer needed. 8387 #----Note that this code assumes the denormal 8388 8389 movm.l &0x3f00,-(%sp) 8390 mov.l (%a0),%d3 8391 mov.l 4(%a0),%d4 8392 mov.l 8(%a0),%d5 8393 clr.l %d2 8394 8395 tst.l %d4 8396 bne.b Hi_not0 8397 8398 Hi_0: 8399 mov.l %d5,%d4 8400 clr.l %d5 8401 mov.l &32,%d2 8402 clr.l %d6 8403 bfffo %d4{&0:&32},%d6 8404 lsl.l %d6,%d4 8405 add.l %d6,%d2 8406 8407 mov.l %d3,X(%a6) 8408 mov.l %d4,XFRAC(%a6) 8409 mov.l %d5,XFRAC+4(%a6) 8410 neg.l %d2 8411 mov.l %d2,ADJK(%a6) 8412 fmov.x X(%a6),%fp0 8413 movm.l (%sp)+,&0xfc 8414 lea X(%a6),%a0 8415 bra.w LOGBGN 8416 8417 Hi_not0: 8418 clr.l %d6 8419 bfffo %d4{&0:&32},%d6 8420 mov.l %d6,%d2 8421 lsl.l %d6,%d4 8422 mov.l %d5,%d7 8423 lsl.l %d6,%d5 8424 neg.l %d6 8425 add.l &32,%d6 8426 lsr.l %d6,%d7 8427 or.l %d7,%d4 8428 8429 mov.l %d3,X(%a6) 8430 mov.l %d4,XFRAC(%a6) 8431 mov.l %d5,XFRAC+4(%a6) 8432 neg.l %d2 8433 mov.l %d2,ADJK(%a6) 8434 fmov.x X(%a6),%fp0 8435 movm.l (%sp)+,&0xfc 8436 lea X(%a6),%a0 8437 bra.w LOGBGN 8438 8439 global slognp1 8440 #--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON 8441 slognp1: 8442 fmov.x (%a0),%fp0 8443 fabs.x %fp0 8444 fcmp.x %fp0,LTHOLD(%pc) 8445 fbgt.w LP1REAL 8446 fmov.l %d0,%fpcr 8447 mov.b &FMOV_OP,%d1 8448 fmov.x (%a0),%fp0 8449 bra t_catch 8450 8451 LP1REAL: 8452 fmov.x (%a0),%fp0 8453 mov.l &0x00000000,ADJK(%a6) 8454 fmov.x %fp0,%fp1 8455 fadd.s one(%pc),%fp0 8456 fmov.x %fp0,X(%a6) 8457 mov.w XFRAC(%a6),XDCARE(%a6 8458 mov.l X(%a6),%d1 8459 cmp.l %d1,&0 8460 ble.w LP1NEG0 8461 cmp.l %d1,&0x3ffe8000 8462 blt.w LOGMAIN 8463 cmp.l %d1,&0x3fffc000 8464 bgt.w LOGMAIN 8465 #--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH I 8466 #--CONTAINS AT LEAST 63 BITS OF INFORMATION O 8467 #--SIMPLY INVOKE LOG(X) FOR LOG(1+Z). 8468 8469 LP1NEAR1: 8470 #--NEXT SEE IF EXP(-1/16) < X < EXP(1/16) 8471 cmp.l %d1,&0x3ffef07d 8472 blt.w LP1CARE 8473 cmp.l %d1,&0x3fff8841 8474 bgt.w LP1CARE 8475 8476 LP1ONE16: 8477 #--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG 8478 #--WHERE U = 2Z/(2+Z) = 2Z/(1+X). 8479 fadd.x %fp1,%fp1 8480 fadd.s one(%pc),%fp0 8481 #--U = FP1/FP0 8482 bra.w LP1CONT2 8483 8484 LP1CARE: 8485 #--HERE WE USE THE USUAL TABLE DRIVEN APPROAC 8486 #--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFO 8487 #--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z 8488 #--THERE ARE ONLY TWO CASES. 8489 #--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2- 8490 #--CASE 2: 1+Z > 1, THEN K = 0 AND Y-F = (1- 8491 #--ON RETURNING TO LP1CONT1, WE MUST HAVE K I 8492 #--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED. 8493 8494 mov.l XFRAC(%a6),FFRAC(%a6) 8495 and.l &0xFE000000,FFRAC(%a6 8496 or.l &0x01000000,FFRAC(%a6 8497 cmp.l %d1,&0x3FFF8000 8498 bge.b KISZERO 8499 8500 KISNEG1: 8501 fmov.s TWO(%pc),%fp0 8502 mov.l &0x3fff0000,F(%a6) 8503 clr.l F+8(%a6) 8504 fsub.x F(%a6),%fp0 8505 mov.l FFRAC(%a6),%d1 8506 and.l &0x7E000000,%d1 8507 asr.l &8,%d1 8508 asr.l &8,%d1 8509 asr.l &4,%d1 8510 fadd.x %fp1,%fp1 8511 fmovm.x &0xc,-(%sp) 8512 fadd.x %fp1,%fp0 8513 lea LOGTBL(%pc),%a0 8514 add.l %d1,%a0 8515 fmov.s negone(%pc),%fp1 8516 bra.w LP1CONT1 8517 8518 KISZERO: 8519 fmov.s one(%pc),%fp0 8520 mov.l &0x3fff0000,F(%a6) 8521 clr.l F+8(%a6) 8522 fsub.x F(%a6),%fp0 8523 mov.l FFRAC(%a6),%d1 8524 and.l &0x7E000000,%d1 8525 asr.l &8,%d1 8526 asr.l &8,%d1 8527 asr.l &4,%d1 8528 fadd.x %fp1,%fp0 8529 fmovm.x &0xc,-(%sp) 8530 lea LOGTBL(%pc),%a0 8531 add.l %d1,%a0 8532 fmov.s zero(%pc),%fp1 8533 bra.w LP1CONT1 8534 8535 LP1NEG0: 8536 #--FPCR SAVED. D0 IS X IN COMPACT FORM. 8537 cmp.l %d1,&0 8538 blt.b LP1NEG 8539 LP1ZERO: 8540 fmov.s negone(%pc),%fp0 8541 8542 fmov.l %d0,%fpcr 8543 bra t_dz 8544 8545 LP1NEG: 8546 fmov.s zero(%pc),%fp0 8547 8548 fmov.l %d0,%fpcr 8549 bra t_operr 8550 8551 global slognp1d 8552 #--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED 8553 # Simply return the denorm 8554 slognp1d: 8555 bra t_extdnrm 8556 8557 ############################################# 8558 # satanh(): computes the inverse hyperbolic 8559 # satanhd(): computes the inverse hyperbolic 8560 # 8561 # INPUT ************************************* 8562 # a0 = pointer to extended precision in 8563 # d0 = round precision,mode 8564 # 8565 # OUTPUT ************************************ 8566 # fp0 = arctanh(X) 8567 # 8568 # ACCURACY and MONOTONICITY ***************** 8569 # The returned result is within 3 ulps 8570 # i.e. within 0.5001 ulp to 53 bits if 8571 # rounded to double precision. The resu 8572 # in double precision. 8573 # 8574 # ALGORITHM ********************************* 8575 # 8576 # ATANH 8577 # 1. If |X| >= 1, go to 3. 8578 # 8579 # 2. (|X| < 1) Calculate atanh(X) by 8580 # sgn := sign(X) 8581 # y := |X| 8582 # z := 2y/(1-y) 8583 # atanh(X) := sgn * (1/2) * log 8584 # Exit. 8585 # 8586 # 3. If |X| > 1, go to 5. 8587 # 8588 # 4. (|X| = 1) Generate infinity with a 8589 # divide-by-zero by 8590 # sgn := sign(X) 8591 # atan(X) := sgn / (+0). 8592 # Exit. 8593 # 8594 # 5. (|X| > 1) Generate an invalid oper 8595 # Exit. 8596 # 8597 ############################################# 8598 8599 global satanh 8600 satanh: 8601 mov.l (%a0),%d1 8602 mov.w 4(%a0),%d1 8603 and.l &0x7FFFFFFF,%d1 8604 cmp.l %d1,&0x3FFF8000 8605 bge.b ATANHBIG 8606 8607 #--THIS IS THE USUAL CASE, |X| < 1 8608 #--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) 8609 8610 fabs.x (%a0),%fp0 8611 fmov.x %fp0,%fp1 8612 fneg.x %fp1 8613 fadd.x %fp0,%fp0 8614 fadd.s &0x3F800000,%fp1 8615 fdiv.x %fp1,%fp0 8616 mov.l (%a0),%d1 8617 and.l &0x80000000,%d1 8618 or.l &0x3F000000,%d1 8619 mov.l %d1,-(%sp) 8620 8621 mov.l %d0,-(%sp) 8622 clr.l %d0 8623 fmovm.x &0x01,-(%sp) 8624 lea (%sp),%a0 8625 bsr slognp1 8626 add.l &0xc,%sp 8627 8628 mov.l (%sp)+,%d0 8629 fmov.l %d0,%fpcr 8630 mov.b &FMUL_OP,%d1 8631 fmul.s (%sp)+,%fp0 8632 bra t_catch 8633 8634 ATANHBIG: 8635 fabs.x (%a0),%fp0 8636 fcmp.s %fp0,&0x3F800000 8637 fbgt t_operr 8638 bra t_dz 8639 8640 global satanhd 8641 #--ATANH(X) = X FOR DENORMALIZED X 8642 satanhd: 8643 bra t_extdnrm 8644 8645 ############################################# 8646 # slog10(): computes the base-10 logarithm o 8647 # slog10d(): computes the base-10 logarithm o 8648 # slog2(): computes the base-2 logarithm of 8649 # slog2d(): computes the base-2 logarithm of 8650 # 8651 # INPUT ************************************* 8652 # a0 = pointer to extended precision in 8653 # d0 = round precision,mode 8654 # 8655 # OUTPUT ************************************ 8656 # fp0 = log_10(X) or log_2(X) 8657 # 8658 # ACCURACY and MONOTONICITY ***************** 8659 # The returned result is within 1.7 ulp 8660 # i.e. within 0.5003 ulp to 53 bits if 8661 # rounded to double precision. The resu 8662 # in double precision. 8663 # 8664 # ALGORITHM ********************************* 8665 # 8666 # slog10d: 8667 # 8668 # Step 0. If X < 0, create a NaN and ra 8669 # flag. Otherwise, save FPCR in 8670 # Notes: Default means round-to-neares 8671 # traps, and precision control 8672 # 8673 # Step 1. Call slognd to obtain Y = log 8674 # Notes: Even if X is denormalized, lo 8675 # 8676 # Step 2. Compute log_10(X) = log(X) * 8677 # 2.1 Restore the user FPCR 8678 # 2.2 Return ans := Y * INV_L10. 8679 # 8680 # slog10: 8681 # 8682 # Step 0. If X < 0, create a NaN and ra 8683 # flag. Otherwise, save FPCR in 8684 # Notes: Default means round-to-neares 8685 # traps, and precision control 8686 # 8687 # Step 1. Call sLogN to obtain Y = log( 8688 # 8689 # Step 2. Compute log_10(X) = log(X) 8690 # 2.1 Restore the user FPCR 8691 # 2.2 Return ans := Y * INV_L10. 8692 # 8693 # sLog2d: 8694 # 8695 # Step 0. If X < 0, create a NaN and ra 8696 # flag. Otherwise, save FPCR in 8697 # Notes: Default means round-to-neares 8698 # traps, and precision control 8699 # 8700 # Step 1. Call slognd to obtain Y = log 8701 # Notes: Even if X is denormalized, lo 8702 # 8703 # Step 2. Compute log_10(X) = log(X) 8704 # 2.1 Restore the user FPCR 8705 # 2.2 Return ans := Y * INV_L2. 8706 # 8707 # sLog2: 8708 # 8709 # Step 0. If X < 0, create a NaN and ra 8710 # flag. Otherwise, save FPCR in 8711 # Notes: Default means round-to-neares 8712 # traps, and precision control 8713 # 8714 # Step 1. If X is not an integer power 8715 # go to Step 3. 8716 # 8717 # Step 2. Return k. 8718 # 2.1 Get integer k, X = 2^k. 8719 # 2.2 Restore the user FPCR. 8720 # 2.3 Return ans := convert-to-do 8721 # 8722 # Step 3. Call sLogN to obtain Y = log( 8723 # 8724 # Step 4. Compute log_2(X) = log(X) * 8725 # 4.1 Restore the user FPCR 8726 # 4.2 Return ans := Y * INV_L2. 8727 # 8728 ############################################# 8729 8730 INV_L10: 8731 long 0x3FFD0000,0xDE5BD8A9 8732 8733 INV_L2: 8734 long 0x3FFF0000,0xB8AA3B29 8735 8736 global slog10 8737 #--entry point for Log10(X), X is normalized 8738 slog10: 8739 fmov.b &0x1,%fp0 8740 fcmp.x %fp0,(%a0) 8741 fbeq.l ld_pzero 8742 8743 mov.l (%a0),%d1 8744 blt.w invalid 8745 mov.l %d0,-(%sp) 8746 clr.l %d0 8747 bsr slogn 8748 fmov.l (%sp)+,%fpcr 8749 fmul.x INV_L10(%pc),%fp0 8750 bra t_inx2 8751 8752 global slog10d 8753 #--entry point for Log10(X), X is denormalize 8754 slog10d: 8755 mov.l (%a0),%d1 8756 blt.w invalid 8757 mov.l %d0,-(%sp) 8758 clr.l %d0 8759 bsr slognd 8760 fmov.l (%sp)+,%fpcr 8761 fmul.x INV_L10(%pc),%fp0 8762 bra t_minx2 8763 8764 global slog2 8765 #--entry point for Log2(X), X is normalized 8766 slog2: 8767 mov.l (%a0),%d1 8768 blt.w invalid 8769 8770 mov.l 8(%a0),%d1 8771 bne.b continue 8772 8773 mov.l 4(%a0),%d1 8774 and.l &0x7FFFFFFF,%d1 8775 bne.b continue 8776 8777 #--X = 2^k. 8778 mov.w (%a0),%d1 8779 and.l &0x00007FFF,%d1 8780 sub.l &0x3FFF,%d1 8781 beq.l ld_pzero 8782 fmov.l %d0,%fpcr 8783 fmov.l %d1,%fp0 8784 bra t_inx2 8785 8786 continue: 8787 mov.l %d0,-(%sp) 8788 clr.l %d0 8789 bsr slogn 8790 fmov.l (%sp)+,%fpcr 8791 fmul.x INV_L2(%pc),%fp0 8792 bra t_inx2 8793 8794 invalid: 8795 bra t_operr 8796 8797 global slog2d 8798 #--entry point for Log2(X), X is denormalized 8799 slog2d: 8800 mov.l (%a0),%d1 8801 blt.w invalid 8802 mov.l %d0,-(%sp) 8803 clr.l %d0 8804 bsr slognd 8805 fmov.l (%sp)+,%fpcr 8806 fmul.x INV_L2(%pc),%fp0 8807 bra t_minx2 8808 8809 ############################################# 8810 # stwotox(): computes 2**X for a normalized 8811 # stwotoxd(): computes 2**X for a denormalize 8812 # stentox(): computes 10**X for a normalized 8813 # stentoxd(): computes 10**X for a denormaliz 8814 # 8815 # INPUT ************************************* 8816 # a0 = pointer to extended precision in 8817 # d0 = round precision,mode 8818 # 8819 # OUTPUT ************************************ 8820 # fp0 = 2**X or 10**X 8821 # 8822 # ACCURACY and MONOTONICITY ***************** 8823 # The returned result is within 2 ulps 8824 # i.e. within 0.5001 ulp to 53 bits if 8825 # rounded to double precision. The resu 8826 # in double precision. 8827 # 8828 # ALGORITHM ********************************* 8829 # 8830 # twotox 8831 # 1. If |X| > 16480, go to ExpBig. 8832 # 8833 # 2. If |X| < 2**(-70), go to ExpSm. 8834 # 8835 # 3. Decompose X as X = N/64 + r where 8836 # decompose N as 8837 # N = 64(M + M') + j, j = 0,1 8838 # 8839 # 4. Overwrite r := r * log2. Then 8840 # 2**X = 2**(M') * 2**(M) * 2** 8841 # Go to expr to compute that ex 8842 # 8843 # tentox 8844 # 1. If |X| > 16480*log_10(2) (base 10 8845 # 8846 # 2. If |X| < 2**(-70), go to ExpSm. 8847 # 8848 # 3. Set y := X*log_2(10)*64 (base 2 lo 8849 # N := round-to-int(y). Decompo 8850 # N = 64(M + M') + j, j = 0,1 8851 # 8852 # 4. Define r as 8853 # r := ((X - N*L1)-N*L2) * L10 8854 # where L1, L2 are the leading 8855 # log_10(2)/64 and L10 is the n 8856 # 10**X = 2**(M') * 2**(M) * 2* 8857 # Go to expr to compute that ex 8858 # 8859 # expr 8860 # 1. Fetch 2**(j/64) from table as Fact 8861 # 8862 # 2. Overwrite Fact1 and Fact2 by 8863 # Fact1 := 2**(M) * Fact1 8864 # Fact2 := 2**(M) * Fact2 8865 # Thus Fact1 + Fact2 = 2**(M) * 8866 # 8867 # 3. Calculate P where 1 + P approximat 8868 # P = r + r*r*(A1+r*(A2+...+r*A 8869 # 8870 # 4. Let AdjFact := 2**(M'). Return 8871 # AdjFact * ( Fact1 + ((Fact1*P 8872 # Exit. 8873 # 8874 # ExpBig 8875 # 1. Generate overflow by Huge * Huge i 8876 # generate underflow by Tiny * 8877 # 8878 # ExpSm 8879 # 1. Return 1 + X. 8880 # 8881 ############################################# 8882 8883 L2TEN64: 8884 long 0x406A934F,0x0979A371 8885 L10TWO1: 8886 long 0x3F734413,0x509F8000 8887 8888 L10TWO2: 8889 long 0xBFCD0000,0xC0219DC1 8890 8891 LOG10: long 0x40000000,0x935D8DDD 8892 8893 LOG2: long 0x3FFE0000,0xB17217F7 8894 8895 EXPA5: long 0x3F56C16D,0x6F7BD0B2 8896 EXPA4: long 0x3F811112,0x302C712C 8897 EXPA3: long 0x3FA55555,0x55554CC1 8898 EXPA2: long 0x3FC55555,0x55554A54 8899 EXPA1: long 0x3FE00000,0x00000000 8900 8901 TEXPTBL: 8902 long 0x3FFF0000,0x80000000 8903 long 0x3FFF0000,0x8164D1F3 8904 long 0x3FFF0000,0x82CD8698 8905 long 0x3FFF0000,0x843A28C3 8906 long 0x3FFF0000,0x85AAC367 8907 long 0x3FFF0000,0x871F6196 8908 long 0x3FFF0000,0x88980E80 8909 long 0x3FFF0000,0x8A14D575 8910 long 0x3FFF0000,0x8B95C1E3 8911 long 0x3FFF0000,0x8D1ADF5B 8912 long 0x3FFF0000,0x8EA4398B 8913 long 0x3FFF0000,0x9031DC43 8914 long 0x3FFF0000,0x91C3D373 8915 long 0x3FFF0000,0x935A2B2F 8916 long 0x3FFF0000,0x94F4EFA8 8917 long 0x3FFF0000,0x96942D37 8918 long 0x3FFF0000,0x9837F051 8919 long 0x3FFF0000,0x99E04593 8920 long 0x3FFF0000,0x9B8D39B9 8921 long 0x3FFF0000,0x9D3ED9A7 8922 long 0x3FFF0000,0x9EF53260 8923 long 0x3FFF0000,0xA0B0510F 8924 long 0x3FFF0000,0xA2704303 8925 long 0x3FFF0000,0xA43515AE 8926 long 0x3FFF0000,0xA5FED6A9 8927 long 0x3FFF0000,0xA7CD93B4 8928 long 0x3FFF0000,0xA9A15AB4 8929 long 0x3FFF0000,0xAB7A39B5 8930 long 0x3FFF0000,0xAD583EEA 8931 long 0x3FFF0000,0xAF3B78AD 8932 long 0x3FFF0000,0xB123F581 8933 long 0x3FFF0000,0xB311C412 8934 long 0x3FFF0000,0xB504F333 8935 long 0x3FFF0000,0xB6FD91E3 8936 long 0x3FFF0000,0xB8FBAF47 8937 long 0x3FFF0000,0xBAFF5AB2 8938 long 0x3FFF0000,0xBD08A39F 8939 long 0x3FFF0000,0xBF1799B6 8940 long 0x3FFF0000,0xC12C4CCA 8941 long 0x3FFF0000,0xC346CCDA 8942 long 0x3FFF0000,0xC5672A11 8943 long 0x3FFF0000,0xC78D74C8 8944 long 0x3FFF0000,0xC9B9BD86 8945 long 0x3FFF0000,0xCBEC14FE 8946 long 0x3FFF0000,0xCE248C15 8947 long 0x3FFF0000,0xD06333DA 8948 long 0x3FFF0000,0xD2A81D91 8949 long 0x3FFF0000,0xD4F35AAB 8950 long 0x3FFF0000,0xD744FCCA 8951 long 0x3FFF0000,0xD99D15C2 8952 long 0x3FFF0000,0xDBFBB797 8953 long 0x3FFF0000,0xDE60F482 8954 long 0x3FFF0000,0xE0CCDEEC 8955 long 0x3FFF0000,0xE33F8972 8956 long 0x3FFF0000,0xE5B906E7 8957 long 0x3FFF0000,0xE8396A50 8958 long 0x3FFF0000,0xEAC0C6E7 8959 long 0x3FFF0000,0xED4F301E 8960 long 0x3FFF0000,0xEFE4B99B 8961 long 0x3FFF0000,0xF281773C 8962 long 0x3FFF0000,0xF5257D15 8963 long 0x3FFF0000,0xF7D0DF73 8964 long 0x3FFF0000,0xFA83B2DB 8965 long 0x3FFF0000,0xFD3E0C0C 8966 8967 set INT,L_SCR1 8968 8969 set X,FP_SCR0 8970 set XDCARE,X+2 8971 set XFRAC,X+4 8972 8973 set ADJFACT,FP_SCR0 8974 8975 set FACT1,FP_SCR0 8976 set FACT1HI,FACT1+4 8977 set FACT1LOW,FACT1+8 8978 8979 set FACT2,FP_SCR1 8980 set FACT2HI,FACT2+4 8981 set FACT2LOW,FACT2+8 8982 8983 global stwotox 8984 #--ENTRY POINT FOR 2**(X), HERE X IS FINITE, 8985 stwotox: 8986 fmovm.x (%a0),&0x80 8987 8988 mov.l (%a0),%d1 8989 mov.w 4(%a0),%d1 8990 fmov.x %fp0,X(%a6) 8991 and.l &0x7FFFFFFF,%d1 8992 8993 cmp.l %d1,&0x3FB98000 8994 bge.b TWOOK1 8995 bra.w EXPBORS 8996 8997 TWOOK1: 8998 cmp.l %d1,&0x400D80C0 8999 ble.b TWOMAIN 9000 bra.w EXPBORS 9001 9002 TWOMAIN: 9003 #--USUAL CASE, 2^(-70) <= |X| <= 16480 9004 9005 fmov.x %fp0,%fp1 9006 fmul.s &0x42800000,%fp1 9007 fmov.l %fp1,INT(%a6) 9008 mov.l %d2,-(%sp) 9009 lea TEXPTBL(%pc),%a1 9010 fmov.l INT(%a6),%fp1 9011 mov.l INT(%a6),%d1 9012 mov.l %d1,%d2 9013 and.l &0x3F,%d1 9014 asl.l &4,%d1 9015 add.l %d1,%a1 9016 asr.l &6,%d2 9017 mov.l %d2,%d1 9018 asr.l &1,%d1 9019 sub.l %d1,%d2 9020 add.l &0x3FFF,%d2 9021 9022 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING POR 9023 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT 9024 #--ADJFACT = 2^(M'). 9025 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR 9026 9027 fmovm.x &0x0c,-(%sp) 9028 9029 fmul.s &0x3C800000,%fp1 9030 mov.l (%a1)+,FACT1(%a6) 9031 mov.l (%a1)+,FACT1HI(%a6) 9032 mov.l (%a1)+,FACT1LOW(%a6) 9033 mov.w (%a1)+,FACT2(%a6) 9034 9035 fsub.x %fp1,%fp0 9036 9037 mov.w (%a1)+,FACT2HI(%a6) 9038 clr.w FACT2HI+2(%a6) 9039 clr.l FACT2LOW(%a6) 9040 add.w %d1,FACT1(%a6) 9041 fmul.x LOG2(%pc),%fp0 9042 add.w %d1,FACT2(%a6) 9043 9044 bra.w expr 9045 9046 EXPBORS: 9047 #--FPCR, D0 SAVED 9048 cmp.l %d1,&0x3FFF8000 9049 bgt.b TEXPBIG 9050 9051 #--|X| IS SMALL, RETURN 1 + X 9052 9053 fmov.l %d0,%fpcr 9054 fadd.s &0x3F800000,%fp0 9055 bra t_pinx2 9056 9057 TEXPBIG: 9058 #--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; 9059 #--REGISTERS SAVE SO FAR ARE FPCR AND D0 9060 mov.l X(%a6),%d1 9061 cmp.l %d1,&0 9062 blt.b EXPNEG 9063 9064 bra t_ovfl2 9065 9066 EXPNEG: 9067 bra t_unfl2 9068 9069 global stwotoxd 9070 stwotoxd: 9071 #--ENTRY POINT FOR 2**(X) FOR DENORMALIZED AR 9072 9073 fmov.l %d0,%fpcr 9074 fmov.s &0x3F800000,%fp0 9075 mov.l (%a0),%d1 9076 or.l &0x00800001,%d1 9077 fadd.s %d1,%fp0 9078 bra t_pinx2 9079 9080 global stentox 9081 #--ENTRY POINT FOR 10**(X), HERE X IS FINITE, 9082 stentox: 9083 fmovm.x (%a0),&0x80 9084 9085 mov.l (%a0),%d1 9086 mov.w 4(%a0),%d1 9087 fmov.x %fp0,X(%a6) 9088 and.l &0x7FFFFFFF,%d1 9089 9090 cmp.l %d1,&0x3FB98000 9091 bge.b TENOK1 9092 bra.w EXPBORS 9093 9094 TENOK1: 9095 cmp.l %d1,&0x400B9B07 9096 ble.b TENMAIN 9097 bra.w EXPBORS 9098 9099 TENMAIN: 9100 #--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 9101 9102 fmov.x %fp0,%fp1 9103 fmul.d L2TEN64(%pc),%fp1 9104 fmov.l %fp1,INT(%a6) 9105 mov.l %d2,-(%sp) 9106 lea TEXPTBL(%pc),%a1 9107 fmov.l INT(%a6),%fp1 9108 mov.l INT(%a6),%d1 9109 mov.l %d1,%d2 9110 and.l &0x3F,%d1 9111 asl.l &4,%d1 9112 add.l %d1,%a1 9113 asr.l &6,%d2 9114 mov.l %d2,%d1 9115 asr.l &1,%d1 9116 sub.l %d1,%d2 9117 add.l &0x3FFF,%d2 9118 9119 #--SUMMARY: a1 IS ADDRESS FOR THE LEADING POR 9120 #--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT 9121 #--ADJFACT = 2^(M'). 9122 #--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR 9123 fmovm.x &0x0c,-(%sp) 9124 9125 fmov.x %fp1,%fp2 9126 9127 fmul.d L10TWO1(%pc),%fp1 9128 mov.l (%a1)+,FACT1(%a6) 9129 9130 fmul.x L10TWO2(%pc),%fp2 9131 9132 mov.l (%a1)+,FACT1HI(%a6) 9133 mov.l (%a1)+,FACT1LOW(%a6) 9134 fsub.x %fp1,%fp0 9135 mov.w (%a1)+,FACT2(%a6) 9136 9137 fsub.x %fp2,%fp0 9138 9139 mov.w (%a1)+,FACT2HI(%a6) 9140 clr.w FACT2HI+2(%a6) 9141 clr.l FACT2LOW(%a6) 9142 9143 fmul.x LOG10(%pc),%fp0 9144 add.w %d1,FACT1(%a6) 9145 add.w %d1,FACT2(%a6) 9146 9147 expr: 9148 #--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN 9149 #--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 9150 #--FP0 IS R. THE FOLLOWING CODE COMPUTES 9151 #-- 2**(M'+M) * 2**(J/64) * EXP(R) 9152 9153 fmov.x %fp0,%fp1 9154 fmul.x %fp1,%fp1 9155 9156 fmov.d EXPA5(%pc),%fp2 9157 fmov.d EXPA4(%pc),%fp3 9158 9159 fmul.x %fp1,%fp2 9160 fmul.x %fp1,%fp3 9161 9162 fadd.d EXPA3(%pc),%fp2 9163 fadd.d EXPA2(%pc),%fp3 9164 9165 fmul.x %fp1,%fp2 9166 fmul.x %fp1,%fp3 9167 9168 fadd.d EXPA1(%pc),%fp2 9169 fmul.x %fp0,%fp3 9170 9171 fmul.x %fp1,%fp2 9172 fadd.x %fp3,%fp0 9173 fadd.x %fp2,%fp0 9174 9175 fmovm.x (%sp)+,&0x30 9176 9177 #--FINAL RECONSTRUCTION PROCESS 9178 #--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP( 9179 9180 fmul.x FACT1(%a6),%fp0 9181 fadd.x FACT2(%a6),%fp0 9182 fadd.x FACT1(%a6),%fp0 9183 9184 fmov.l %d0,%fpcr 9185 mov.w %d2,ADJFACT(%a6) 9186 mov.l (%sp)+,%d2 9187 mov.l &0x80000000,ADJFACT+4 9188 clr.l ADJFACT+8(%a6) 9189 mov.b &FMUL_OP,%d1 9190 fmul.x ADJFACT(%a6),%fp0 9191 bra t_catch 9192 9193 global stentoxd 9194 stentoxd: 9195 #--ENTRY POINT FOR 10**(X) FOR DENORMALIZED A 9196 9197 fmov.l %d0,%fpcr 9198 fmov.s &0x3F800000,%fp0 9199 mov.l (%a0),%d1 9200 or.l &0x00800001,%d1 9201 fadd.s %d1,%fp0 9202 bra t_pinx2 9203 9204 ############################################# 9205 # sscale(): computes the destination operand 9206 # operand. If the absoulute value o 9207 # >= 2^14, an overflow or underflow 9208 # 9209 # INPUT ************************************* 9210 # a0 = pointer to double-extended sour 9211 # a1 = pointer to double-extended dest 9212 # 9213 # OUTPUT ************************************ 9214 # fp0 = scale(X,Y) 9215 # 9216 ############################################# 9217 9218 set SIGN, L_SCR1 9219 9220 global sscale 9221 sscale: 9222 mov.l %d0,-(%sp) 9223 9224 mov.w DST_EX(%a1),%d1 9225 smi.b SIGN(%a6) 9226 andi.l &0x00007fff,%d1 9227 9228 mov.w SRC_EX(%a0),%d0 9229 andi.w &0x7fff,%d0 9230 cmpi.w %d0,&0x3fff 9231 blt.w src_small 9232 cmpi.w %d0,&0x400c 9233 bgt.w src_out 9234 9235 # 9236 # Source is within 2^14 range. 9237 # 9238 src_ok: 9239 fintrz.x SRC(%a0),%fp0 9240 fmov.l %fp0,%d0 9241 # don't want any accrued bits from the fintrz 9242 # we may need to read the fpsr for the last f 9243 fmov.l &0x0,%fpsr 9244 9245 tst.b DST_HI(%a1) 9246 bmi.b sok_norm 9247 9248 # the dst is a DENORM. normalize the DENORM a 9249 # the src value. then, jump to the norm part 9250 sok_dnrm: 9251 mov.l %d0,-(%sp) 9252 9253 mov.w DST_EX(%a1),FP_SCR0_E 9254 mov.l DST_HI(%a1),FP_SCR0_H 9255 mov.l DST_LO(%a1),FP_SCR0_L 9256 9257 lea FP_SCR0(%a6),%a0 9258 bsr.l norm 9259 neg.l %d0 9260 add.l (%sp)+,%d0 9261 9262 fmovm.x FP_SCR0(%a6),&0x80 9263 9264 cmpi.w %d0,&-0x3fff 9265 bge.b sok_norm2 9266 9267 # the multiply factor that we're trying to cr 9268 # for the multiply to work. therefore, we're 9269 # multiply with a denorm which will cause an 9270 # exception to be put into the machine which 9271 # later. we don't do this with the DENORMs ab 9272 # is slower. but, don't fret, I don't see it 9273 fmov.l (%sp)+,%fpcr 9274 mov.l &0x80000000,%d1 9275 subi.l &-0x3fff,%d0 9276 neg.l %d0 9277 cmpi.b %d0,&0x20 9278 bge.b sok_dnrm_32 9279 lsr.l %d0,%d1 9280 clr.l -(%sp) 9281 mov.l %d1,-(%sp) 9282 clr.l -(%sp) 9283 bra.b sok_norm_cont 9284 sok_dnrm_32: 9285 subi.b &0x20,%d0 9286 lsr.l %d0,%d1 9287 mov.l %d1,-(%sp) 9288 clr.l -(%sp) 9289 clr.l -(%sp) 9290 bra.b sok_norm_cont 9291 9292 # the src will force the dst to a DENORM valu 9293 # create an fp multiply that will create the 9294 sok_norm: 9295 fmovm.x DST(%a1),&0x80 9296 sok_norm2: 9297 fmov.l (%sp)+,%fpcr 9298 9299 addi.w &0x3fff,%d0 9300 swap %d0 9301 clr.l -(%sp) 9302 mov.l &0x80000000,-(%sp) 9303 mov.l %d0,-(%sp) 9304 9305 sok_norm_cont: 9306 fmov.l %fpcr,%d0 9307 mov.b &FMUL_OP,%d1 9308 fmul.x (%sp)+,%fp0 9309 bra t_catch2 9310 9311 # 9312 # Source is outside of 2^14 range. Test the 9313 # to the appropriate exception handler. 9314 # 9315 src_out: 9316 mov.l (%sp)+,%d0 9317 exg %a0,%a1 9318 tst.b SRC_EX(%a1) 9319 bmi t_unfl 9320 bra t_ovfl_sc 9321 9322 # 9323 # The source input is below 1, so we check fo 9324 # and set unfl. 9325 # 9326 src_small: 9327 tst.b DST_HI(%a1) 9328 bpl.b ssmall_done 9329 9330 mov.l (%sp)+,%d0 9331 fmov.l %d0,%fpcr 9332 mov.b &FMOV_OP,%d1 9333 fmov.x DST(%a1),%fp0 9334 bra t_catch2 9335 ssmall_done: 9336 mov.l (%sp)+,%d0 9337 mov.l %a1,%a0 9338 bra t_resdnrm 9339 9340 ############################################# 9341 # smod(): computes the fp MOD of the input va 9342 # srem(): computes the fp (IEEE) REM of the i 9343 # 9344 # INPUT ************************************* 9345 # a0 = pointer to extended precision in 9346 # a1 = pointer to extended precision in 9347 # d0 = round precision,mode 9348 # 9349 # The input operands X and Y can be eit 9350 # denormalized. 9351 # 9352 # OUTPUT ************************************ 9353 # fp0 = FREM(X,Y) or FMOD(X,Y) 9354 # 9355 # ALGORITHM ********************************* 9356 # 9357 # Step 1. Save and strip signs of X an 9358 # signY := sign(Y), X := |X|, 9359 # signQ := signX EOR signY. Re 9360 # is requested. 9361 # 9362 # Step 2. Set L := expo(X)-expo(Y), k 9363 # If (L < 0) then 9364 # R := X, go to Step 4. 9365 # else 9366 # R := 2^(-L)X, j := L. 9367 # endif 9368 # 9369 # Step 3. Perform MOD(X,Y) 9370 # 3.1 If R = Y, go to Step 9. 9371 # 3.2 If R > Y, then { R := R - Y, 9372 # 3.3 If j = 0, go to Step 4. 9373 # 3.4 k := k + 1, j := j - 1, Q := 9374 # Step 3.1. 9375 # 9376 # Step 4. At this point, R = X - QY = 9377 # Last_Subtract := false (used 9378 # MOD is requested, go to Step 9379 # 9380 # Step 5. R = MOD(X,Y), but REM(X,Y) i 9381 # 5.1 If R < Y/2, then R = MOD(X,Y 9382 # Step 6. 9383 # 5.2 If R > Y/2, then { set Last_ 9384 # Q := Q + 1, Y := signY*Y }. 9385 # 5.3 This is the tricky case of R 9386 # then { Q := Q + 1, signX := 9387 # 9388 # Step 6. R := signX*R. 9389 # 9390 # Step 7. If Last_Subtract = true, R : 9391 # 9392 # Step 8. Return signQ, last 7 bits of 9393 # 9394 # Step 9. At this point, R = 2^(-j)*X 9395 # X = 2^(j)*(Q+1)Y. set Q := 2 9396 # R := 0. Return signQ, last 7 9397 # 9398 ############################################# 9399 9400 set Mod_Flag,L_SCR3 9401 set Sc_Flag,L_SCR3+1 9402 9403 set SignY,L_SCR2 9404 set SignX,L_SCR2+2 9405 set SignQ,L_SCR3+2 9406 9407 set Y,FP_SCR0 9408 set Y_Hi,Y+4 9409 set Y_Lo,Y+8 9410 9411 set R,FP_SCR1 9412 set R_Hi,R+4 9413 set R_Lo,R+8 9414 9415 Scale: 9416 long 0x00010000,0x80000000 9417 9418 global smod 9419 smod: 9420 clr.b FPSR_QBYTE(%a6) 9421 mov.l %d0,-(%sp) 9422 clr.b Mod_Flag(%a6) 9423 bra.b Mod_Rem 9424 9425 global srem 9426 srem: 9427 clr.b FPSR_QBYTE(%a6) 9428 mov.l %d0,-(%sp) 9429 mov.b &0x1,Mod_Flag(%a6) 9430 9431 Mod_Rem: 9432 #..Save sign of X and Y 9433 movm.l &0x3f00,-(%sp) 9434 mov.w SRC_EX(%a0),%d3 9435 mov.w %d3,SignY(%a6) 9436 and.l &0x00007FFF,%d3 9437 9438 # 9439 mov.l SRC_HI(%a0),%d4 9440 mov.l SRC_LO(%a0),%d5 9441 9442 tst.l %d3 9443 bne.b Y_Normal 9444 9445 mov.l &0x00003FFE,%d3 9446 tst.l %d4 9447 bne.b HiY_not0 9448 9449 HiY_0: 9450 mov.l %d5,%d4 9451 clr.l %d5 9452 sub.l &32,%d3 9453 clr.l %d6 9454 bfffo %d4{&0:&32},%d6 9455 lsl.l %d6,%d4 9456 sub.l %d6,%d3 9457 # 9458 bra.b Chk_X 9459 9460 HiY_not0: 9461 clr.l %d6 9462 bfffo %d4{&0:&32},%d6 9463 sub.l %d6,%d3 9464 lsl.l %d6,%d4 9465 mov.l %d5,%d7 9466 lsl.l %d6,%d5 9467 neg.l %d6 9468 add.l &32,%d6 9469 lsr.l %d6,%d7 9470 or.l %d7,%d4 9471 # ...wi 9472 bra.b Chk_X 9473 9474 Y_Normal: 9475 add.l &0x00003FFE,%d3 9476 # ...wi 9477 9478 Chk_X: 9479 mov.w DST_EX(%a1),%d0 9480 mov.w %d0,SignX(%a6) 9481 mov.w SignY(%a6),%d1 9482 eor.l %d0,%d1 9483 and.l &0x00008000,%d1 9484 mov.w %d1,SignQ(%a6) 9485 and.l &0x00007FFF,%d0 9486 mov.l DST_HI(%a1),%d1 9487 mov.l DST_LO(%a1),%d2 9488 tst.l %d0 9489 bne.b X_Normal 9490 mov.l &0x00003FFE,%d0 9491 tst.l %d1 9492 bne.b HiX_not0 9493 9494 HiX_0: 9495 mov.l %d2,%d1 9496 clr.l %d2 9497 sub.l &32,%d0 9498 clr.l %d6 9499 bfffo %d1{&0:&32},%d6 9500 lsl.l %d6,%d1 9501 sub.l %d6,%d0 9502 # ...wi 9503 bra.b Init 9504 9505 HiX_not0: 9506 clr.l %d6 9507 bfffo %d1{&0:&32},%d6 9508 sub.l %d6,%d0 9509 lsl.l %d6,%d1 9510 mov.l %d2,%d7 9511 lsl.l %d6,%d2 9512 neg.l %d6 9513 add.l &32,%d6 9514 lsr.l %d6,%d7 9515 or.l %d7,%d1 9516 # ...wi 9517 bra.b Init 9518 9519 X_Normal: 9520 add.l &0x00003FFE,%d0 9521 # ...wi 9522 9523 Init: 9524 # 9525 mov.l %d3,L_SCR1(%a6) 9526 mov.l %d0,-(%sp) 9527 sub.l %d3,%d0 9528 9529 clr.l %d6 9530 clr.l %d3 9531 mov.l &0,%a1 9532 9533 #..(Carry,D1,D2) is R 9534 tst.l %d0 9535 bge.b Mod_Loop_pre 9536 9537 #..expo(X) < expo(Y). Thus X = mod(X,Y) 9538 # 9539 mov.l (%sp)+,%d0 9540 bra.w Get_Mod 9541 9542 Mod_Loop_pre: 9543 addq.l &0x4,%sp 9544 #..At this point R = 2^(-L)X; Q = 0; k = 0; 9545 Mod_Loop: 9546 tst.l %d6 9547 bgt.b R_GT_Y 9548 9549 #..At this point carry = 0, R = (D1,D2), Y = 9550 cmp.l %d1,%d4 9551 bne.b R_NE_Y 9552 cmp.l %d2,%d5 9553 bne.b R_NE_Y 9554 9555 #..At this point, R = Y 9556 bra.w Rem_is_0 9557 9558 R_NE_Y: 9559 #..use the borrow of the previous compare 9560 bcs.b R_LT_Y 9561 9562 R_GT_Y: 9563 #..If Carry is set, then Y < (Carry,D1,D2) < 9564 #..and Y < (D1,D2) < 2Y. Either way, perform 9565 sub.l %d5,%d2 9566 subx.l %d4,%d1 9567 clr.l %d6 9568 addq.l &1,%d3 9569 9570 R_LT_Y: 9571 #..At this point, Carry=0, R < Y. R = 2^(k-L) 9572 tst.l %d0 9573 beq.b PostLoop 9574 9575 add.l %d3,%d3 9576 add.l %d2,%d2 9577 roxl.l &1,%d1 9578 scs %d6 9579 addq.l &1,%a1 9580 subq.l &1,%d0 9581 #..At this point, R=(Carry,D1,D2) = 2^(k-L)X 9582 9583 bra.b Mod_Loop 9584 9585 PostLoop: 9586 #..k = L, j = 0, Carry = 0, R = (D1,D2) = X - 9587 9588 #..normalize R. 9589 mov.l L_SCR1(%a6),%d0 9590 tst.l %d1 9591 bne.b HiR_not0 9592 9593 HiR_0: 9594 mov.l %d2,%d1 9595 clr.l %d2 9596 sub.l &32,%d0 9597 clr.l %d6 9598 bfffo %d1{&0:&32},%d6 9599 lsl.l %d6,%d1 9600 sub.l %d6,%d0 9601 # ...wi 9602 bra.b Get_Mod 9603 9604 HiR_not0: 9605 clr.l %d6 9606 bfffo %d1{&0:&32},%d6 9607 bmi.b Get_Mod 9608 sub.l %d6,%d0 9609 lsl.l %d6,%d1 9610 mov.l %d2,%d7 9611 lsl.l %d6,%d2 9612 neg.l %d6 9613 add.l &32,%d6 9614 lsr.l %d6,%d7 9615 or.l %d7,%d1 9616 9617 # 9618 Get_Mod: 9619 cmp.l %d0,&0x000041FE 9620 bge.b No_Scale 9621 Do_Scale: 9622 mov.w %d0,R(%a6) 9623 mov.l %d1,R_Hi(%a6) 9624 mov.l %d2,R_Lo(%a6) 9625 mov.l L_SCR1(%a6),%d6 9626 mov.w %d6,Y(%a6) 9627 mov.l %d4,Y_Hi(%a6) 9628 mov.l %d5,Y_Lo(%a6) 9629 fmov.x R(%a6),%fp0 9630 mov.b &1,Sc_Flag(%a6) 9631 bra.b ModOrRem 9632 No_Scale: 9633 mov.l %d1,R_Hi(%a6) 9634 mov.l %d2,R_Lo(%a6) 9635 sub.l &0x3FFE,%d0 9636 mov.w %d0,R(%a6) 9637 mov.l L_SCR1(%a6),%d6 9638 sub.l &0x3FFE,%d6 9639 mov.l %d6,L_SCR1(%a6) 9640 fmov.x R(%a6),%fp0 9641 mov.w %d6,Y(%a6) 9642 mov.l %d4,Y_Hi(%a6) 9643 mov.l %d5,Y_Lo(%a6) 9644 clr.b Sc_Flag(%a6) 9645 9646 # 9647 ModOrRem: 9648 tst.b Mod_Flag(%a6) 9649 beq.b Fix_Sign 9650 9651 mov.l L_SCR1(%a6),%d6 9652 subq.l &1,%d6 9653 cmp.l %d0,%d6 9654 blt.b Fix_Sign 9655 bgt.b Last_Sub 9656 9657 cmp.l %d1,%d4 9658 bne.b Not_EQ 9659 cmp.l %d2,%d5 9660 bne.b Not_EQ 9661 bra.w Tie_Case 9662 9663 Not_EQ: 9664 bcs.b Fix_Sign 9665 9666 Last_Sub: 9667 # 9668 fsub.x Y(%a6),%fp0 9669 addq.l &1,%d3 9670 9671 # 9672 Fix_Sign: 9673 #..Get sign of X 9674 mov.w SignX(%a6),%d6 9675 bge.b Get_Q 9676 fneg.x %fp0 9677 9678 #..Get Q 9679 # 9680 Get_Q: 9681 clr.l %d6 9682 mov.w SignQ(%a6),%d6 9683 mov.l &8,%d7 9684 lsr.l %d7,%d6 9685 and.l &0x0000007F,%d3 9686 or.l %d6,%d3 9687 # swap %d3 9688 # fmov.l %fpsr,%d6 9689 # and.l &0xFF00FFFF,%d6 9690 # or.l %d3,%d6 9691 # fmov.l %d6,%fpsr 9692 mov.b %d3,FPSR_QBYTE(%a6) 9693 9694 # 9695 Restore: 9696 movm.l (%sp)+,&0xfc 9697 mov.l (%sp)+,%d0 9698 fmov.l %d0,%fpcr 9699 tst.b Sc_Flag(%a6) 9700 beq.b Finish 9701 mov.b &FMUL_OP,%d1 9702 fmul.x Scale(%pc),%fp0 9703 bra t_catch2 9704 # the '040 package did this apparently to see 9705 # preceding fmul was a denorm. but, it better 9706 # algorithm just got done playing with fp0 an 9707 # as a result. trust me... 9708 # bra t_avoid_unsupp 9709 # 9710 9711 Finish: 9712 mov.b &FMOV_OP,%d1 9713 fmov.x %fp0,%fp0 9714 bra t_catch2 9715 9716 Rem_is_0: 9717 #..R = 2^(-j)X - Q Y = Y, thus R = 0 and quot 9718 addq.l &1,%d3 9719 cmp.l %d0,&8 9720 bge.b Q_Big 9721 9722 lsl.l %d0,%d3 9723 bra.b Set_R_0 9724 9725 Q_Big: 9726 clr.l %d3 9727 9728 Set_R_0: 9729 fmov.s &0x00000000,%fp0 9730 clr.b Sc_Flag(%a6) 9731 bra.w Fix_Sign 9732 9733 Tie_Case: 9734 #..Check parity of Q 9735 mov.l %d3,%d6 9736 and.l &0x00000001,%d6 9737 tst.l %d6 9738 beq.w Fix_Sign 9739 9740 #..Q is odd, Q := Q + 1, signX := -signX 9741 addq.l &1,%d3 9742 mov.w SignX(%a6),%d6 9743 eor.l &0x00008000,%d6 9744 mov.w %d6,SignX(%a6) 9745 bra.w Fix_Sign 9746 9747 ############################################# 9748 # XDEF ************************************** 9749 # tag(): return the optype of the input 9750 # 9751 # This routine is used by the 060FPLSP. 9752 # 9753 # XREF ************************************** 9754 # None 9755 # 9756 # INPUT ************************************* 9757 # a0 = pointer to extended precision op 9758 # 9759 # OUTPUT ************************************ 9760 # d0 = value of type tag 9761 # one of: NORM, INF, QNAN, SNAN 9762 # 9763 # ALGORITHM ********************************* 9764 # Simply test the exponent, j-bit, and 9765 # determine the type of operand. 9766 # If it's an unnormalized zero, alter t 9767 # to be a normal zero. 9768 # 9769 ############################################# 9770 9771 global tag 9772 tag: 9773 mov.w FTEMP_EX(%a0), %d0 9774 andi.w &0x7fff, %d0 9775 cmpi.w %d0, &0x7fff 9776 beq.b inf_or_nan_x 9777 not_inf_or_nan_x: 9778 btst &0x7,FTEMP_HI(%a0) 9779 beq.b not_norm_x 9780 is_norm_x: 9781 mov.b &NORM, %d0 9782 rts 9783 not_norm_x: 9784 tst.w %d0 9785 bne.b is_unnorm_x 9786 not_unnorm_x: 9787 tst.l FTEMP_HI(%a0) 9788 bne.b is_denorm_x 9789 tst.l FTEMP_LO(%a0) 9790 bne.b is_denorm_x 9791 is_zero_x: 9792 mov.b &ZERO, %d0 9793 rts 9794 is_denorm_x: 9795 mov.b &DENORM, %d0 9796 rts 9797 is_unnorm_x: 9798 bsr.l unnorm_fix 9799 rts 9800 is_unnorm_reg_x: 9801 mov.b &UNNORM, %d0 9802 rts 9803 inf_or_nan_x: 9804 tst.l FTEMP_LO(%a0) 9805 bne.b is_nan_x 9806 mov.l FTEMP_HI(%a0), %d0 9807 and.l &0x7fffffff, %d0 9808 bne.b is_nan_x 9809 is_inf_x: 9810 mov.b &INF, %d0 9811 rts 9812 is_nan_x: 9813 mov.b &QNAN, %d0 9814 rts 9815 9816 ############################################# 9817 9818 qnan: long 0x7fff0000, 0xfffffff 9819 9820 ############################################# 9821 # XDEF ************************************** 9822 # t_dz(): Handle 060FPLSP dz exception 9823 # t_dz2(): Handle 060FPLSP dz exception 9824 # 9825 # These rouitnes are used by the 060FPL 9826 # 9827 # XREF ************************************** 9828 # None 9829 # 9830 # INPUT ************************************* 9831 # a0 = pointer to extended precision so 9832 # 9833 # OUTPUT ************************************ 9834 # fp0 = default DZ result. 9835 # 9836 # ALGORITHM ********************************* 9837 # Transcendental emulation for the 060F 9838 # a DZ exception should occur for the instruc 9839 # return the default result. 9840 # If DZ is enabled, the dst operand sho 9841 # in fp0 while fp1 is used to create a DZ exc 9842 # operating system can log that such an event 9843 # 9844 ############################################# 9845 9846 global t_dz 9847 t_dz: 9848 tst.b SRC_EX(%a0) 9849 bpl.b dz_pinf 9850 9851 global t_dz2 9852 t_dz2: 9853 ori.l &dzinf_mask+neg_mask, 9854 9855 btst &dz_bit,FPCR_ENABLE(% 9856 bne.b dz_minf_ena 9857 9858 # dz is disabled. return a -INF. 9859 fmov.s &0xff800000,%fp0 9860 rts 9861 9862 # dz is enabled. create a dz exception so the 9863 # but use fp1 instead. return the dst operand 9864 dz_minf_ena: 9865 fmovm.x EXC_FP0(%a6),&0x80 9866 fmov.l USER_FPCR(%a6),%fpcr 9867 fmov.s &0xbf800000,%fp1 9868 fdiv.s &0x00000000,%fp1 9869 rts 9870 9871 dz_pinf: 9872 ori.l &dzinf_mask,USER_FPSR 9873 9874 btst &dz_bit,FPCR_ENABLE(% 9875 bne.b dz_pinf_ena 9876 9877 # dz is disabled. return a +INF. 9878 fmov.s &0x7f800000,%fp0 9879 rts 9880 9881 # dz is enabled. create a dz exception so the 9882 # but use fp1 instead. return the dst operand 9883 dz_pinf_ena: 9884 fmovm.x EXC_FP0(%a6),&0x80 9885 fmov.l USER_FPCR(%a6),%fpcr 9886 fmov.s &0x3f800000,%fp1 9887 fdiv.s &0x00000000,%fp1 9888 rts 9889 9890 ############################################# 9891 # XDEF ************************************** 9892 # t_operr(): Handle 060FPLSP OPERR exce 9893 # 9894 # This routine is used by the 060FPLSP 9895 # 9896 # XREF ************************************** 9897 # None. 9898 # 9899 # INPUT ************************************* 9900 # fp1 = source operand 9901 # 9902 # OUTPUT ************************************ 9903 # fp0 = default result 9904 # fp1 = unchanged 9905 # 9906 # ALGORITHM ********************************* 9907 # An operand error should occur as the 9908 # emulation in the 060FPLSP. If OPERR is disa 9909 # in fp0. If OPERR is enabled, return the dst 9910 # and the source operand in fp1. Use fp2 to c 9911 # so that the operating system can log the ev 9912 # 9913 ############################################# 9914 9915 global t_operr 9916 t_operr: 9917 ori.l &opnan_mask,USER_FPSR 9918 9919 btst &operr_bit,FPCR_ENABL 9920 bne.b operr_ena 9921 9922 # operr is disabled. return a QNAN in fp0 9923 fmovm.x qnan(%pc),&0x80 9924 rts 9925 9926 # operr is enabled. create an operr exception 9927 # but use fp2 instead. return the dst operand 9928 operr_ena: 9929 fmovm.x EXC_FP0(%a6),&0x80 9930 fmov.l USER_FPCR(%a6),%fpcr 9931 fmovm.x &0x04,-(%sp) 9932 fmov.s &0x7f800000,%fp2 9933 fmul.s &0x00000000,%fp2 9934 fmovm.x (%sp)+,&0x20 9935 rts 9936 9937 pls_huge: 9938 long 0x7ffe0000,0xffffffff 9939 mns_huge: 9940 long 0xfffe0000,0xffffffff 9941 pls_tiny: 9942 long 0x00000000,0x80000000 9943 mns_tiny: 9944 long 0x80000000,0x80000000 9945 9946 ############################################# 9947 # XDEF ************************************** 9948 # t_unfl(): Handle 060FPLSP underflow e 9949 # t_unfl2(): Handle 060FPLSP underflow 9950 # emulation. result always p 9951 # 9952 # This routine is used by the 060FPLSP 9953 # 9954 # XREF ************************************** 9955 # None. 9956 # 9957 # INPUT ************************************* 9958 # a0 = pointer to extended precision so 9959 # 9960 # OUTPUT ************************************ 9961 # fp0 = default underflow result 9962 # 9963 # ALGORITHM ********************************* 9964 # An underflow should occur as the resu 9965 # emulation in the 060FPLSP. Create an underf 9966 # and two very small numbers of appropriate s 9967 # system can log the event. 9968 # 9969 ############################################# 9970 9971 global t_unfl 9972 t_unfl: 9973 tst.b SRC_EX(%a0) 9974 bpl.b unf_pos 9975 9976 global t_unfl2 9977 t_unfl2: 9978 ori.l &unfinx_mask+neg_mask 9979 9980 fmov.l USER_FPCR(%a6),%fpcr 9981 fmovm.x mns_tiny(%pc),&0x80 9982 fmul.x pls_tiny(%pc),%fp0 9983 9984 fmov.l %fpsr,%d0 9985 rol.l &0x8,%d0 9986 mov.b %d0,FPSR_CC(%a6) 9987 rts 9988 unf_pos: 9989 ori.w &unfinx_mask,FPSR_EXC 9990 9991 fmov.l USER_FPCR(%a6),%fpcr 9992 fmovm.x pls_tiny(%pc),&0x80 9993 fmul.x %fp0,%fp0 9994 9995 fmov.l %fpsr,%d0 9996 rol.l &0x8,%d0 9997 mov.b %d0,FPSR_CC(%a6) 9998 rts 9999 10000 ############################################ 10001 # XDEF ************************************* 10002 # t_ovfl(): Handle 060FPLSP overflow e 10003 # (monadic) 10004 # t_ovfl2(): Handle 060FPLSP overflow 10005 # emulation. result always 10006 # t_ovfl_sc(): Handle 060FPLSP overflo 10007 # emulation for "fscale". 10008 # 10009 # This routine is used by the 060FPLSP 10010 # 10011 # XREF ************************************* 10012 # None. 10013 # 10014 # INPUT ************************************ 10015 # a0 = pointer to extended precision s 10016 # 10017 # OUTPUT *********************************** 10018 # fp0 = default underflow result 10019 # 10020 # ALGORITHM ******************************** 10021 # An overflow should occur as the resu 10022 # emulation in the 060FPLSP. Create an overf 10023 # and two very lareg numbers of appropriate 10024 # system can log the event. 10025 # For t_ovfl_sc() we take special care 10026 # 10027 ############################################ 10028 10029 global t_ovfl_sc 10030 t_ovfl_sc: 10031 ori.l &ovfl_inx_mask,USER_ 10032 10033 mov.b %d0,%d1 10034 andi.b &0xc0,%d1 10035 beq.w ovfl_work 10036 10037 # dst op is a DENORM. we have to normalize t 10038 # result would be inexact for the given prec 10039 # dst so we don't screw up the version passe 10040 mov.w LOCAL_EX(%a0),FP_SCR 10041 mov.l LOCAL_HI(%a0),FP_SCR 10042 mov.l LOCAL_LO(%a0),FP_SCR 10043 lea FP_SCR0(%a6),%a0 10044 movm.l &0xc080,-(%sp) 10045 bsr.l norm 10046 movm.l (%sp)+,&0x0103 10047 10048 cmpi.b %d1,&0x40 10049 bne.b ovfl_sc_dbl 10050 ovfl_sc_sgl: 10051 tst.l LOCAL_LO(%a0) 10052 bne.b ovfl_sc_inx 10053 tst.b 3+LOCAL_HI(%a0) 10054 bne.b ovfl_sc_inx 10055 bra.w ovfl_work 10056 ovfl_sc_dbl: 10057 mov.l LOCAL_LO(%a0),%d1 10058 andi.l &0x7ff,%d1 10059 beq.w ovfl_work 10060 ovfl_sc_inx: 10061 ori.l &inex2_mask,USER_FPS 10062 bra.b ovfl_work 10063 10064 global t_ovfl 10065 t_ovfl: 10066 ori.w &ovfinx_mask,FPSR_EX 10067 ovfl_work: 10068 tst.b SRC_EX(%a0) 10069 bpl.b ovfl_p 10070 ovfl_m: 10071 fmov.l USER_FPCR(%a6),%fpcr 10072 fmovm.x mns_huge(%pc),&0x80 10073 fmul.x pls_huge(%pc),%fp0 10074 10075 fmov.l %fpsr,%d0 10076 rol.l &0x8,%d0 10077 ori.b &neg_mask,%d0 10078 mov.b %d0,FPSR_CC(%a6) 10079 rts 10080 ovfl_p: 10081 fmov.l USER_FPCR(%a6),%fpcr 10082 fmovm.x pls_huge(%pc),&0x80 10083 fmul.x pls_huge(%pc),%fp0 10084 10085 fmov.l %fpsr,%d0 10086 rol.l &0x8,%d0 10087 mov.b %d0,FPSR_CC(%a6) 10088 rts 10089 10090 global t_ovfl2 10091 t_ovfl2: 10092 ori.w &ovfinx_mask,FPSR_EX 10093 fmov.l USER_FPCR(%a6),%fpcr 10094 fmovm.x pls_huge(%pc),&0x80 10095 fmul.x pls_huge(%pc),%fp0 10096 10097 fmov.l %fpsr,%d0 10098 rol.l &0x8,%d0 10099 mov.b %d0,FPSR_CC(%a6) 10100 rts 10101 10102 ############################################ 10103 # XDEF ************************************* 10104 # t_catch(): Handle 060FPLSP OVFL,UNFL 10105 # emulation. 10106 # t_catch2(): Handle 060FPLSP OVFL,UNF 10107 # emulation. 10108 # 10109 # These routines are used by the 060FP 10110 # 10111 # XREF ************************************* 10112 # None. 10113 # 10114 # INPUT ************************************ 10115 # fp0 = default underflow or overflow 10116 # 10117 # OUTPUT *********************************** 10118 # fp0 = default result 10119 # 10120 # ALGORITHM ******************************** 10121 # If an overflow or underflow occurred 10122 # instruction of transcendental 060FPLSP emu 10123 # occurred and has been logged. Now we need 10124 # exception should occur. 10125 # 10126 ############################################ 10127 10128 global t_catch2 10129 t_catch2: 10130 fmov.l %fpsr,%d0 10131 or.l %d0,USER_FPSR(%a6) 10132 bra.b inx2_work 10133 10134 global t_catch 10135 t_catch: 10136 fmov.l %fpsr,%d0 10137 or.l %d0,USER_FPSR(%a6) 10138 10139 ############################################ 10140 # XDEF ************************************* 10141 # t_inx2(): Handle inexact 060FPLSP ex 10142 # t_pinx2(): Handle inexact 060FPLSP e 10143 # t_minx2(): Handle inexact 060FPLSP e 10144 # 10145 # XREF ************************************* 10146 # None. 10147 # 10148 # INPUT ************************************ 10149 # fp0 = default result 10150 # 10151 # OUTPUT *********************************** 10152 # fp0 = default result 10153 # 10154 # ALGORITHM ******************************** 10155 # The last instruction of transcendent 10156 # 060FPLSP should be inexact. So, if inexact 10157 # the event here by adding a large and very 10158 # so that the operating system can log the e 10159 # Must check, too, if the result was z 10160 # set the FPSR bits and return. 10161 # 10162 ############################################ 10163 10164 global t_inx2 10165 t_inx2: 10166 fblt.w t_minx2 10167 fbeq.w inx2_zero 10168 10169 global t_pinx2 10170 t_pinx2: 10171 ori.w &inx2a_mask,FPSR_EXC 10172 bra.b inx2_work 10173 10174 global t_minx2 10175 t_minx2: 10176 ori.l &inx2a_mask+neg_mask 10177 10178 inx2_work: 10179 btst &inex2_bit,FPCR_ENAB 10180 bne.b inx2_work_ena 10181 rts 10182 inx2_work_ena: 10183 fmov.l USER_FPCR(%a6),%fpcr 10184 fmov.s &0x3f800000,%fp1 10185 fadd.x pls_tiny(%pc),%fp1 10186 rts 10187 10188 inx2_zero: 10189 mov.b &z_bmask,FPSR_CC(%a6 10190 ori.w &inx2a_mask,2+USER_F 10191 rts 10192 10193 ############################################ 10194 # XDEF ************************************* 10195 # t_extdnrm(): Handle DENORM inputs in 10196 # t_resdnrm(): Handle DENORM inputs in 10197 # 10198 # This routine is used by the 060FPLSP 10199 # 10200 # XREF ************************************* 10201 # None. 10202 # 10203 # INPUT ************************************ 10204 # a0 = pointer to extended precision i 10205 # 10206 # OUTPUT *********************************** 10207 # fp0 = default result 10208 # 10209 # ALGORITHM ******************************** 10210 # For all functions that have a denorm 10211 # f(x)=x, this is the entry point. 10212 # DENORM value is moved using "fmove" 10213 # if enabled so the operating system can log 10214 # 10215 ############################################ 10216 10217 global t_extdnrm 10218 t_extdnrm: 10219 fmov.l USER_FPCR(%a6),%fpcr 10220 fmov.x SRC_EX(%a0),%fp0 10221 fmov.l %fpsr,%d0 10222 ori.l &unfinx_mask,%d0 10223 or.l %d0,USER_FPSR(%a6) 10224 rts 10225 10226 global t_resdnrm 10227 t_resdnrm: 10228 fmov.l USER_FPCR(%a6),%fpcr 10229 fmov.x SRC_EX(%a0),%fp0 10230 fmov.l %fpsr,%d0 10231 or.l %d0,USER_FPSR(%a6) 10232 rts 10233 10234 ########################################## 10235 10236 # 10237 # sto_cos: 10238 # This is used by fsincos library emul 10239 # values are already in fp0 and fp1 so we do 10240 # 10241 global sto_cos 10242 sto_cos: 10243 rts 10244 10245 ########################################## 10246 10247 # 10248 # dst_qnan --- force result when desti 10249 # 10250 global dst_qnan 10251 dst_qnan: 10252 fmov.x DST(%a1),%fp0 10253 tst.b DST_EX(%a1) 10254 bmi.b dst_qnan_m 10255 dst_qnan_p: 10256 mov.b &nan_bmask,FPSR_CC(% 10257 rts 10258 dst_qnan_m: 10259 mov.b &nan_bmask+neg_bmask 10260 rts 10261 10262 # 10263 # src_qnan --- force result when sourc 10264 # 10265 global src_qnan 10266 src_qnan: 10267 fmov.x SRC(%a0),%fp0 10268 tst.b SRC_EX(%a0) 10269 bmi.b src_qnan_m 10270 src_qnan_p: 10271 mov.b &nan_bmask,FPSR_CC(% 10272 rts 10273 src_qnan_m: 10274 mov.b &nan_bmask+neg_bmask 10275 rts 10276 10277 ########################################## 10278 10279 # 10280 # Native instruction support 10281 # 10282 # Some systems may need entry points e 10283 # instructions. These routines are pr 10284 # convenience. 10285 # 10286 global _fadds_ 10287 _fadds_: 10288 fmov.l %fpcr,-(%sp) 10289 fmov.l &0x00000000,%fpcr 10290 fmov.s 0x8(%sp),%fp0 10291 fmov.l (%sp)+,%fpcr 10292 fadd.s 0x8(%sp),%fp0 10293 rts 10294 10295 global _faddd_ 10296 _faddd_: 10297 fmov.l %fpcr,-(%sp) 10298 fmov.l &0x00000000,%fpcr 10299 fmov.d 0x8(%sp),%fp0 10300 fmov.l (%sp)+,%fpcr 10301 fadd.d 0xc(%sp),%fp0 10302 rts 10303 10304 global _faddx_ 10305 _faddx_: 10306 fmovm.x 0x4(%sp),&0x80 10307 fadd.x 0x10(%sp),%fp0 10308 rts 10309 10310 global _fsubs_ 10311 _fsubs_: 10312 fmov.l %fpcr,-(%sp) 10313 fmov.l &0x00000000,%fpcr 10314 fmov.s 0x8(%sp),%fp0 10315 fmov.l (%sp)+,%fpcr 10316 fsub.s 0x8(%sp),%fp0 10317 rts 10318 10319 global _fsubd_ 10320 _fsubd_: 10321 fmov.l %fpcr,-(%sp) 10322 fmov.l &0x00000000,%fpcr 10323 fmov.d 0x8(%sp),%fp0 10324 fmov.l (%sp)+,%fpcr 10325 fsub.d 0xc(%sp),%fp0 10326 rts 10327 10328 global _fsubx_ 10329 _fsubx_: 10330 fmovm.x 0x4(%sp),&0x80 10331 fsub.x 0x10(%sp),%fp0 10332 rts 10333 10334 global _fmuls_ 10335 _fmuls_: 10336 fmov.l %fpcr,-(%sp) 10337 fmov.l &0x00000000,%fpcr 10338 fmov.s 0x8(%sp),%fp0 10339 fmov.l (%sp)+,%fpcr 10340 fmul.s 0x8(%sp),%fp0 10341 rts 10342 10343 global _fmuld_ 10344 _fmuld_: 10345 fmov.l %fpcr,-(%sp) 10346 fmov.l &0x00000000,%fpcr 10347 fmov.d 0x8(%sp),%fp0 10348 fmov.l (%sp)+,%fpcr 10349 fmul.d 0xc(%sp),%fp0 10350 rts 10351 10352 global _fmulx_ 10353 _fmulx_: 10354 fmovm.x 0x4(%sp),&0x80 10355 fmul.x 0x10(%sp),%fp0 10356 rts 10357 10358 global _fdivs_ 10359 _fdivs_: 10360 fmov.l %fpcr,-(%sp) 10361 fmov.l &0x00000000,%fpcr 10362 fmov.s 0x8(%sp),%fp0 10363 fmov.l (%sp)+,%fpcr 10364 fdiv.s 0x8(%sp),%fp0 10365 rts 10366 10367 global _fdivd_ 10368 _fdivd_: 10369 fmov.l %fpcr,-(%sp) 10370 fmov.l &0x00000000,%fpcr 10371 fmov.d 0x8(%sp),%fp0 10372 fmov.l (%sp)+,%fpcr 10373 fdiv.d 0xc(%sp),%fp0 10374 rts 10375 10376 global _fdivx_ 10377 _fdivx_: 10378 fmovm.x 0x4(%sp),&0x80 10379 fdiv.x 0x10(%sp),%fp0 10380 rts 10381 10382 global _fabss_ 10383 _fabss_: 10384 fabs.s 0x4(%sp),%fp0 10385 rts 10386 10387 global _fabsd_ 10388 _fabsd_: 10389 fabs.d 0x4(%sp),%fp0 10390 rts 10391 10392 global _fabsx_ 10393 _fabsx_: 10394 fabs.x 0x4(%sp),%fp0 10395 rts 10396 10397 global _fnegs_ 10398 _fnegs_: 10399 fneg.s 0x4(%sp),%fp0 10400 rts 10401 10402 global _fnegd_ 10403 _fnegd_: 10404 fneg.d 0x4(%sp),%fp0 10405 rts 10406 10407 global _fnegx_ 10408 _fnegx_: 10409 fneg.x 0x4(%sp),%fp0 10410 rts 10411 10412 global _fsqrts_ 10413 _fsqrts_: 10414 fsqrt.s 0x4(%sp),%fp0 10415 rts 10416 10417 global _fsqrtd_ 10418 _fsqrtd_: 10419 fsqrt.d 0x4(%sp),%fp0 10420 rts 10421 10422 global _fsqrtx_ 10423 _fsqrtx_: 10424 fsqrt.x 0x4(%sp),%fp0 10425 rts 10426 10427 global _fints_ 10428 _fints_: 10429 fint.s 0x4(%sp),%fp0 10430 rts 10431 10432 global _fintd_ 10433 _fintd_: 10434 fint.d 0x4(%sp),%fp0 10435 rts 10436 10437 global _fintx_ 10438 _fintx_: 10439 fint.x 0x4(%sp),%fp0 10440 rts 10441 10442 global _fintrzs_ 10443 _fintrzs_: 10444 fintrz.s 0x4(%sp),%fp0 10445 rts 10446 10447 global _fintrzd_ 10448 _fintrzd_: 10449 fintrz.d 0x4(%sp),%fp0 10450 rts 10451 10452 global _fintrzx_ 10453 _fintrzx_: 10454 fintrz.x 0x4(%sp),%fp0 10455 rts 10456 10457 ############################################ 10458 10459 ############################################ 10460 # src_zero(): Return signed zero according t 10461 ############################################ 10462 global src_zero 10463 src_zero: 10464 tst.b SRC_EX(%a0) 10465 bmi.b ld_mzero 10466 10467 # 10468 # ld_pzero(): return a positive zero. 10469 # 10470 global ld_pzero 10471 ld_pzero: 10472 fmov.s &0x00000000,%fp0 10473 mov.b &z_bmask,FPSR_CC(%a6 10474 rts 10475 10476 # ld_mzero(): return a negative zero. 10477 global ld_mzero 10478 ld_mzero: 10479 fmov.s &0x80000000,%fp0 10480 mov.b &neg_bmask+z_bmask,F 10481 rts 10482 10483 ############################################ 10484 # dst_zero(): Return signed zero according t 10485 ############################################ 10486 global dst_zero 10487 dst_zero: 10488 tst.b DST_EX(%a1) 10489 bmi.b ld_mzero 10490 bra.b ld_pzero 10491 10492 ############################################ 10493 # src_inf(): Return signed inf according to 10494 ############################################ 10495 global src_inf 10496 src_inf: 10497 tst.b SRC_EX(%a0) 10498 bmi.b ld_minf 10499 10500 # 10501 # ld_pinf(): return a positive infinity. 10502 # 10503 global ld_pinf 10504 ld_pinf: 10505 fmov.s &0x7f800000,%fp0 10506 mov.b &inf_bmask,FPSR_CC(% 10507 rts 10508 10509 # 10510 # ld_minf():return a negative infinity. 10511 # 10512 global ld_minf 10513 ld_minf: 10514 fmov.s &0xff800000,%fp0 10515 mov.b &neg_bmask+inf_bmask 10516 rts 10517 10518 ############################################ 10519 # dst_inf(): Return signed inf according to 10520 ############################################ 10521 global dst_inf 10522 dst_inf: 10523 tst.b DST_EX(%a1) 10524 bmi.b ld_minf 10525 bra.b ld_pinf 10526 10527 global szr_inf 10528 ############################################ 10529 # szr_inf(): Return +ZERO for a negative src 10530 # +INF for a positive src 10531 # Routine used for fetox, ftwotox 10532 ############################################ 10533 szr_inf: 10534 tst.b SRC_EX(%a0) 10535 bmi.b ld_pzero 10536 bra.b ld_pinf 10537 10538 ############################################ 10539 # sopr_inf(): Return +INF for a positive src 10540 # jump to operand error routine 10541 # Routine used for flogn, flognp 10542 ############################################ 10543 global sopr_inf 10544 sopr_inf: 10545 tst.b SRC_EX(%a0) 10546 bmi.w t_operr 10547 bra.b ld_pinf 10548 10549 ############################################ 10550 # setoxm1i(): Return minus one for a negativ 10551 # positive infinity for a positi 10552 # Routine used for fetoxm1. 10553 ############################################ 10554 global setoxm1i 10555 setoxm1i: 10556 tst.b SRC_EX(%a0) 10557 bmi.b ld_mone 10558 bra.b ld_pinf 10559 10560 ############################################ 10561 # src_one(): Return signed one according to 10562 ############################################ 10563 global src_one 10564 src_one: 10565 tst.b SRC_EX(%a0) 10566 bmi.b ld_mone 10567 10568 # 10569 # ld_pone(): return positive one. 10570 # 10571 global ld_pone 10572 ld_pone: 10573 fmov.s &0x3f800000,%fp0 10574 clr.b FPSR_CC(%a6) 10575 rts 10576 10577 # 10578 # ld_mone(): return negative one. 10579 # 10580 global ld_mone 10581 ld_mone: 10582 fmov.s &0xbf800000,%fp0 10583 mov.b &neg_bmask,FPSR_CC(% 10584 rts 10585 10586 ppiby2: long 0x3fff0000, 0xc90fda 10587 mpiby2: long 0xbfff0000, 0xc90fda 10588 10589 ############################################ 10590 # spi_2(): Return signed PI/2 according to s 10591 ############################################ 10592 global spi_2 10593 spi_2: 10594 tst.b SRC_EX(%a0) 10595 bmi.b ld_mpi2 10596 10597 # 10598 # ld_ppi2(): return positive PI/2. 10599 # 10600 global ld_ppi2 10601 ld_ppi2: 10602 fmov.l %d0,%fpcr 10603 fmov.x ppiby2(%pc),%fp0 10604 bra.w t_pinx2 10605 10606 # 10607 # ld_mpi2(): return negative PI/2. 10608 # 10609 global ld_mpi2 10610 ld_mpi2: 10611 fmov.l %d0,%fpcr 10612 fmov.x mpiby2(%pc),%fp0 10613 bra.w t_minx2 10614 10615 ############################################ 10616 # The following routines give support for fs 10617 ############################################ 10618 10619 # 10620 # ssincosz(): When the src operand is ZERO, 10621 # cosine register and return a Z 10622 # as the src operand. 10623 # 10624 global ssincosz 10625 ssincosz: 10626 fmov.s &0x3f800000,%fp1 10627 tst.b SRC_EX(%a0) 10628 bpl.b sincoszp 10629 fmov.s &0x80000000,%fp0 10630 mov.b &z_bmask+neg_bmask,F 10631 rts 10632 sincoszp: 10633 fmov.s &0x00000000,%fp0 10634 mov.b &z_bmask,FPSR_CC(%a6 10635 rts 10636 10637 # 10638 # ssincosi(): When the src operand is INF, s 10639 # register and jump to the opera 10640 # src operands. 10641 # 10642 global ssincosi 10643 ssincosi: 10644 fmov.x qnan(%pc),%fp1 10645 bra.w t_operr 10646 10647 # 10648 # ssincosqnan(): When the src operand is a Q 10649 # register and branch to the 10650 # 10651 global ssincosqnan 10652 ssincosqnan: 10653 fmov.x LOCAL_EX(%a0),%fp1 10654 bra.w src_qnan 10655 10656 ############################################ 10657 10658 global smod_sdnrm 10659 global smod_snorm 10660 smod_sdnrm: 10661 smod_snorm: 10662 mov.b DTAG(%a6),%d1 10663 beq.l smod 10664 cmpi.b %d1,&ZERO 10665 beq.w smod_zro 10666 cmpi.b %d1,&INF 10667 beq.l t_operr 10668 cmpi.b %d1,&DENORM 10669 beq.l smod 10670 bra.l dst_qnan 10671 10672 global smod_szero 10673 smod_szero: 10674 mov.b DTAG(%a6),%d1 10675 beq.l t_operr 10676 cmpi.b %d1,&ZERO 10677 beq.l t_operr 10678 cmpi.b %d1,&INF 10679 beq.l t_operr 10680 cmpi.b %d1,&DENORM 10681 beq.l t_operr 10682 bra.l dst_qnan 10683 10684 global smod_sinf 10685 smod_sinf: 10686 mov.b DTAG(%a6),%d1 10687 beq.l smod_fpn 10688 cmpi.b %d1,&ZERO 10689 beq.l smod_zro 10690 cmpi.b %d1,&INF 10691 beq.l t_operr 10692 cmpi.b %d1,&DENORM 10693 beq.l smod_fpn 10694 bra.l dst_qnan 10695 10696 smod_zro: 10697 srem_zro: 10698 mov.b SRC_EX(%a0),%d1 10699 mov.b DST_EX(%a1),%d0 10700 eor.b %d0,%d1 10701 andi.b &0x80,%d1 10702 mov.b %d1,FPSR_QBYTE(%a6) 10703 tst.b %d0 10704 bpl.w ld_pzero 10705 bra.w ld_mzero 10706 10707 smod_fpn: 10708 srem_fpn: 10709 clr.b FPSR_QBYTE(%a6) 10710 mov.l %d0,-(%sp) 10711 mov.b SRC_EX(%a0),%d1 10712 mov.b DST_EX(%a1),%d0 10713 eor.b %d0,%d1 10714 andi.b &0x80,%d1 10715 mov.b %d1,FPSR_QBYTE(%a6) 10716 cmpi.b DTAG(%a6),&DENORM 10717 bne.b smod_nrm 10718 lea DST(%a1),%a0 10719 mov.l (%sp)+,%d0 10720 bra t_resdnrm 10721 smod_nrm: 10722 fmov.l (%sp)+,%fpcr 10723 fmov.x DST(%a1),%fp0 10724 tst.b DST_EX(%a1) 10725 bmi.b smod_nrm_neg 10726 rts 10727 10728 smod_nrm_neg: 10729 mov.b &neg_bmask,FPSR_CC(% 10730 rts 10731 10732 ############################################ 10733 global srem_snorm 10734 global srem_sdnrm 10735 srem_sdnrm: 10736 srem_snorm: 10737 mov.b DTAG(%a6),%d1 10738 beq.l srem 10739 cmpi.b %d1,&ZERO 10740 beq.w srem_zro 10741 cmpi.b %d1,&INF 10742 beq.l t_operr 10743 cmpi.b %d1,&DENORM 10744 beq.l srem 10745 bra.l dst_qnan 10746 10747 global srem_szero 10748 srem_szero: 10749 mov.b DTAG(%a6),%d1 10750 beq.l t_operr 10751 cmpi.b %d1,&ZERO 10752 beq.l t_operr 10753 cmpi.b %d1,&INF 10754 beq.l t_operr 10755 cmpi.b %d1,&DENORM 10756 beq.l t_operr 10757 bra.l dst_qnan 10758 10759 global srem_sinf 10760 srem_sinf: 10761 mov.b DTAG(%a6),%d1 10762 beq.w srem_fpn 10763 cmpi.b %d1,&ZERO 10764 beq.w srem_zro 10765 cmpi.b %d1,&INF 10766 beq.l t_operr 10767 cmpi.b %d1,&DENORM 10768 beq.l srem_fpn 10769 bra.l dst_qnan 10770 10771 ############################################ 10772 10773 global sscale_snorm 10774 global sscale_sdnrm 10775 sscale_snorm: 10776 sscale_sdnrm: 10777 mov.b DTAG(%a6),%d1 10778 beq.l sscale 10779 cmpi.b %d1,&ZERO 10780 beq.l dst_zero 10781 cmpi.b %d1,&INF 10782 beq.l dst_inf 10783 cmpi.b %d1,&DENORM 10784 beq.l sscale 10785 bra.l dst_qnan 10786 10787 global sscale_szero 10788 sscale_szero: 10789 mov.b DTAG(%a6),%d1 10790 beq.l sscale 10791 cmpi.b %d1,&ZERO 10792 beq.l dst_zero 10793 cmpi.b %d1,&INF 10794 beq.l dst_inf 10795 cmpi.b %d1,&DENORM 10796 beq.l sscale 10797 bra.l dst_qnan 10798 10799 global sscale_sinf 10800 sscale_sinf: 10801 mov.b DTAG(%a6),%d1 10802 beq.l t_operr 10803 cmpi.b %d1,&QNAN 10804 beq.l dst_qnan 10805 bra.l t_operr 10806 10807 ############################################ 10808 10809 global sop_sqnan 10810 sop_sqnan: 10811 mov.b DTAG(%a6),%d1 10812 cmpi.b %d1,&QNAN 10813 beq.l dst_qnan 10814 bra.l src_qnan 10815 10816 ############################################ 10817 # norm(): normalize the mantissa of an exten 10818 # input operand should not be normal 10819 # 10820 # XDEF ************************************* 10821 # norm() 10822 # 10823 # XREF ************************************* 10824 # none 10825 # 10826 # INPUT ************************************ 10827 # a0 = pointer fp extended precision o 10828 # 10829 # OUTPUT *********************************** 10830 # d0 = number of bit positions the man 10831 # a0 = the input operand's mantissa is 10832 # is unchanged. 10833 # 10834 ############################################ 10835 global norm 10836 norm: 10837 mov.l %d2, -(%sp) 10838 mov.l %d3, -(%sp) 10839 10840 mov.l FTEMP_HI(%a0), %d0 10841 mov.l FTEMP_LO(%a0), %d1 10842 10843 bfffo %d0{&0:&32}, %d2 10844 beq.b norm_lo 10845 10846 norm_hi: 10847 lsl.l %d2, %d0 10848 bfextu %d1{&0:%d2}, %d3 10849 10850 or.l %d3, %d0 10851 lsl.l %d2, %d1 10852 10853 mov.l %d0, FTEMP_HI(%a0) 10854 mov.l %d1, FTEMP_LO(%a0) 10855 10856 mov.l %d2, %d0 10857 10858 mov.l (%sp)+, %d3 10859 mov.l (%sp)+, %d2 10860 10861 rts 10862 10863 norm_lo: 10864 bfffo %d1{&0:&32}, %d2 10865 lsl.l %d2, %d1 10866 add.l &32, %d2 10867 10868 mov.l %d1, FTEMP_HI(%a0) 10869 clr.l FTEMP_LO(%a0) 10870 10871 mov.l %d2, %d0 10872 10873 mov.l (%sp)+, %d3 10874 mov.l (%sp)+, %d2 10875 10876 rts 10877 10878 ############################################ 10879 # unnorm_fix(): - changes an UNNORM to one o 10880 # - returns corresponding opty 10881 # 10882 # XDEF ************************************* 10883 # unnorm_fix() 10884 # 10885 # XREF ************************************* 10886 # norm() - normalize the mantissa 10887 # 10888 # INPUT ************************************ 10889 # a0 = pointer to unnormalized extende 10890 # 10891 # OUTPUT *********************************** 10892 # d0 = optype tag - is corrected to on 10893 # a0 = input operand has been converte 10894 # zero; both the exponent and man 10895 # 10896 ############################################ 10897 10898 global unnorm_fix 10899 unnorm_fix: 10900 bfffo FTEMP_HI(%a0){&0:&32 10901 bne.b unnorm_shift 10902 10903 # 10904 # hi(man) is all zeroes so see if any bits i 10905 # 10906 unnorm_chk_lo: 10907 bfffo FTEMP_LO(%a0){&0:&32 10908 beq.w unnorm_zero 10909 10910 add.w &32, %d0 10911 10912 # 10913 # d0 = # shifts needed for complete normaliz 10914 # 10915 unnorm_shift: 10916 clr.l %d1 10917 mov.w FTEMP_EX(%a0), %d1 10918 and.w &0x7fff, %d1 10919 10920 cmp.w %d0, %d1 10921 bgt.b unnorm_nrm_zero 10922 10923 # 10924 # exponent would not go < 0. therefore, numb 10925 # 10926 sub.w %d0, %d1 10927 mov.w FTEMP_EX(%a0), %d0 10928 and.w &0x8000, %d0 10929 or.w %d0, %d1 10930 mov.w %d1, FTEMP_EX(%a0) 10931 10932 bsr.l norm 10933 10934 mov.b &NORM, %d0 10935 rts 10936 10937 # 10938 # exponent would go < 0, so only denormalize 10939 # 10940 unnorm_nrm_zero: 10941 cmp.b %d1, &32 10942 bgt.b unnorm_nrm_zero_lrg 10943 10944 bfextu FTEMP_HI(%a0){%d1:&3 10945 mov.l %d0, FTEMP_HI(%a0) 10946 10947 mov.l FTEMP_LO(%a0), %d0 10948 lsl.l %d1, %d0 10949 mov.l %d0, FTEMP_LO(%a0) 10950 10951 and.w &0x8000, FTEMP_EX(%a 10952 10953 mov.b &DENORM, %d0 10954 rts 10955 10956 # 10957 # only mantissa bits set are in lo(man) 10958 # 10959 unnorm_nrm_zero_lrg: 10960 sub.w &32, %d1 10961 10962 mov.l FTEMP_LO(%a0), %d0 10963 lsl.l %d1, %d0 10964 10965 mov.l %d0, FTEMP_HI(%a0) 10966 clr.l FTEMP_LO(%a0) 10967 10968 and.w &0x8000, FTEMP_EX(%a 10969 10970 mov.b &DENORM, %d0 10971 rts 10972 10973 # 10974 # whole mantissa is zero so this UNNORM is a 10975 # 10976 unnorm_zero: 10977 and.w &0x8000, FTEMP_EX(%a 10978 10979 mov.b &ZERO, %d0 10980 rts
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.