1 !
   2 ! CDDL HEADER START
   3 !
   4 ! The contents of this file are subject to the terms of the
   5 ! Common Development and Distribution License (the "License").
   6 ! You may not use this file except in compliance with the License.
   7 !
   8 ! You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 ! or http://www.opensolaris.org/os/licensing.
  10 ! See the License for the specific language governing permissions
  11 ! and limitations under the License.
  12 !
  13 ! When distributing Covered Code,  this CDDL HEADER in each
  14 ! file and  the License file at usr/src/OPENSOLARIS.LICENSE.
  15 ! If applicable, add the following below this CDDL HEADER, with the
  16 ! fields enclosed by brackets "[]" replaced with your own identifying
  17 ! information: Portions Copyright [yyyy] [name of copyright owner]
  18 !
  19 ! CDDL HEADER END
  20 !
  21 ! Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  22 !
  23 ! Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  24 ! Use is subject to license terms.
  25 !
  26 
  27 ! Portions of this file are duplicated as GCC inline assembly in
  28 ! libm_inlines.h.  Keep them in sync.
  29 
  30         .inline __r_hypot_,2
  31         ld      [%o0],%o4
  32         sethi   0x1fffff,%o5
  33         or      %o5,1023,%o5
  34         and     %o4,%o5,%o4
  35         sethi   0x1fe000,%o3
  36         cmp     %o4,%o3
  37         ld      [%o0],%f0       ! load result with first argument
  38         bne     2f
  39         nop
  40         fabss   %f0,%f0
  41         ld      [%o1],%f1
  42         .volatile
  43         fcmps   %f0,%f1         ! generate invalid for Snan
  44         .nonvolatile
  45         nop
  46         fba     5f
  47         nop
  48 2:
  49         ld      [%o1],%o4
  50         sethi   0x1fffff,%o5
  51         or      %o5,1023,%o5
  52         and     %o4,%o5,%o4
  53         sethi   0x1fe000,%o3
  54         cmp     %o4,%o3
  55         bne     4f
  56         nop
  57         ld      [%o1],%f0       ! second argument inf
  58         fabss   %f0,%f0
  59         ld      [%o0],%f1
  60         .volatile
  61         fcmps   %f0,%f1         ! generate invalid for Snan
  62         .nonvolatile
  63         nop
  64         fba     5f
  65         nop
  66 4:
  67         ld      [%o1],%f3
  68         fsmuld  %f0,%f0,%f0
  69         fsmuld  %f3,%f3,%f2
  70         faddd   %f2,%f0,%f0
  71         fsqrtd  %f0,%f0
  72         fdtos   %f0,%f0
  73 5:
  74         .end
  75 
  76         .inline __c_abs,1
  77         ld      [%o0],%o4
  78         sethi   0x1fffff,%o5
  79         or      %o5,1023,%o5
  80         and     %o4,%o5,%o4
  81         sethi   0x1fe000,%o3
  82         cmp     %o4,%o3
  83         ld      [%o0],%f0
  84         bne     2f
  85         nop
  86         fabss   %f0,%f0
  87         ld      [%o0+4],%f1
  88         .volatile
  89         fcmps   %f0,%f1         ! generate invalid for Snan
  90         .nonvolatile
  91         nop
  92         fba     5f
  93         nop
  94 2:
  95         ld      [%o0+4],%o4
  96         sethi   0x1fffff,%o5
  97         or      %o5,1023,%o5
  98         and     %o4,%o5,%o4
  99         sethi   0x1fe000,%o3
 100         cmp     %o4,%o3
 101         bne     4f
 102         nop
 103         ld      [%o0+4],%f0
 104         fabss   %f0,%f0
 105         ld      [%o0],%f1
 106         .volatile
 107         fcmps   %f0,%f1         ! generate invalid for Snan
 108         .nonvolatile
 109         nop
 110         fba     5f
 111         nop
 112 ! store to 8-aligned address
 113 4:
 114         ld      [%o0+4],%f3
 115         fsmuld  %f0,%f0,%f0
 116         fsmuld  %f3,%f3,%f2
 117         faddd   %f2,%f0,%f0
 118         fsqrtd  %f0,%f0
 119         fdtos   %f0,%f0
 120 5:
 121         .end
 122 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 123 ! void
 124 ! __Fc_mult(c, a, b)
 125 ! complex *c, *a, *b;
 126 ! {
 127 
 128         .inline __Fc_mult,3
 129 !    21         c->real = (a->real *  b->real) - (a->imag *  b->imag)
 130         ld      [%o1+4],%f0     ! f0 = a->imag
 131         ld      [%o2+4],%f1     ! f1 = b->imag
 132         ld      [%o1],%f2       ! f2 = a->real
 133         fsmuld   %f0,%f1,%f4     ! f4 = (a->imag *  b->imag)
 134         ld      [%o2],%f3       ! f3 = b->real
 135         fsmuld   %f2,%f1,%f6    ! f6 = a->real * b->imag
 136         fsmuld   %f2,%f3,%f8    ! f8 =  a->real * b->real
 137         fsmuld   %f0,%f3,%f10   ! f10 = a->imag * b->real
 138         fsubd   %f8,%f4,%f0     ! f0 =  ar*br - ai*bi
 139         faddd   %f6,%f10,%f2    ! f2 = ai*br + ar*bi
 140         fdtos   %f0,%f4
 141         fdtos   %f2,%f6
 142         st      %f4,[%o0]
 143         st      %f6,[%o0+4]
 144         .end
 145 ! }
 146 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 147 ! void
 148 ! __Fc_div(c, a, b)
 149 ! complex *c, *a, *b;
 150 ! {
 151         .inline __Fc_div,3
 152         ld      [%o2+4],%o3
 153         sethi   %hi(0x7fffffff),%o4
 154         or      %o4,%lo(0x7fffffff),%o4 ! [internal]
 155         andcc   %o3,%o4,%g0
 156         ld      [%o2],%f6               ! f6 gets reb
 157         bne     1f
 158         nop
 159         ld      [%o1],%f0
 160         ld      [%o2],%f1
 161         fdivs   %f0,%f1,%f0
 162         st      %f0,[%o0]
 163         ld      [%o1+4],%f3
 164         fdivs   %f3,%f1,%f3
 165         st      %f3,[%o0+4]
 166         ba      2f
 167         nop
 168 1:                                      ! [internal]
 169         sethi   %hi(0x3ff00000),%o4
 170         or      %g0,0,%o5
 171         std     %o4,[%sp+0x48]
 172         ldd     [%sp+0x48],%f8
 173         ld      [%o2+4],%f10            ! f10 gets imb
 174         fsmuld  %f6,%f6,%f16            ! f16/17 gets reb**2
 175         ld      [%o1+4],%f4             ! f4 gets ima
 176         fsmuld  %f10,%f10,%f12          ! f12/13 gets imb**2
 177         ld      [%o1],%f19              ! f19 gets rea
 178         fsmuld  %f4,%f10,%f0            ! f0/f1 gets ima*imb
 179         fsmuld  %f19,%f6,%f2            ! f2/3 gets rea*reb
 180         faddd   %f12,%f16,%f12          ! f12/13 gets reb**2+imb**2
 181         fdivd   %f8,%f12,%f12           ! f12/13 gets 1/(reb**2+imb**2)
 182         faddd   %f2,%f0,%f2             ! f2/3 gets rea*reb+ima*imb
 183         fsmuld  %f4,%f6,%f24            ! f24/5 gets ima*reb
 184         fmuld   %f2,%f12,%f2            ! f2/3 gets rec
 185         fsmuld  %f19,%f10,%f10          ! f10/11 gets rea*imb
 186         fsubd   %f24,%f10,%f10          ! f10/11 gets ima*reb-rea*imb
 187         fmuld   %f10,%f12,%f12          ! f12 gets imc
 188         fdtos   %f2,%f7                 ! f7 gets rec
 189         fdtos   %f12,%f15               ! f15 gets imc
 190         st      %f7,[%o0]
 191         st      %f15,[%o0+4]
 192 2:
 193         .end
 194 ! }
 195 
 196         .inline .mul,2
 197         .volatile
 198         smul    %o0,%o1,%o0
 199         rd      %y,%o1
 200         sra     %o0,31,%o2
 201         cmp     %o1,%o2
 202         .nonvolatile
 203         .end
 204 
 205         .inline .umul,2
 206         .volatile
 207         umul    %o0,%o1,%o0
 208         rd      %y,%o1
 209         tst     %o1
 210         .nonvolatile
 211         .end
 212 
 213         .inline .div,2
 214         sra     %o0,31,%o4      ! extend sign
 215         .volatile
 216         wr      %o4,%g0,%y
 217         cmp     %o1,0xffffffff  ! is divisor -1?
 218         be,a    1f              ! if yes
 219         .volatile
 220         subcc   %g0,%o0,%o0     ! simply negate dividend
 221         nop                     ! RT620 FABs A.0/A.1
 222         sdiv    %o0,%o1,%o0     ! o0 contains quotient a/b
 223         .nonvolatile
 224 1:
 225         .end
 226 
 227         .inline .udiv,2
 228         .volatile
 229         wr      %g0,%g0,%y
 230         nop
 231         nop
 232         nop
 233         udiv    %o0,%o1,%o0     ! o0 contains quotient a/b
 234         .nonvolatile
 235         .end
 236 
 237         .inline .rem,2
 238         sra     %o0,31,%o4      ! extend sign
 239         .volatile
 240         wr      %o4,%g0,%y
 241         cmp     %o1,0xffffffff  ! is divisor -1?
 242         be,a    1f              ! if yes
 243         .volatile
 244         or      %g0,%g0,%o0     ! simply return 0
 245         nop                     ! RT620 FABs A.0/A.1
 246         sdiv    %o0,%o1,%o2     ! o2 contains quotient a/b
 247         .nonvolatile
 248         smul    %o2,%o1,%o4     ! o4 contains q*b
 249         sub     %o0,%o4,%o0     ! o0 gets a-q*b
 250 1:
 251         .end
 252 
 253         .inline .urem,2
 254         .volatile
 255         wr      %g0,%g0,%y
 256         nop
 257         nop
 258         nop
 259         udiv    %o0,%o1,%o2     ! o2 contains quotient a/b
 260         .nonvolatile
 261         umul    %o2,%o1,%o4     ! o4 contains q*b
 262         sub     %o0,%o4,%o0     ! o0 gets a-q*b
 263         .end
 264 
 265         .inline .div_o3,2
 266         sra     %o0,31,%o4      ! extend sign
 267         .volatile
 268         wr      %o4,%g0,%y
 269         cmp     %o1,0xffffffff  ! is divisor -1?
 270         be,a    1f              ! if yes
 271         .volatile
 272         subcc   %g0,%o0,%o0     ! simply negate dividend
 273         mov     %o0,%o3         ! o3 gets __remainder
 274         sdiv    %o0,%o1,%o0     ! o0 contains quotient a/b
 275         .nonvolatile
 276         smul    %o0,%o1,%o4     ! o4 contains q*b
 277         ba      2f
 278         sub     %o3,%o4,%o3     ! o3 gets a-q*b
 279 1:
 280         mov     %g0,%o3         ! __remainder is 0
 281 2:
 282         .end
 283 
 284         .inline .udiv_o3,2
 285         .volatile
 286         wr      %g0,%g0,%y
 287         mov     %o0,%o3         ! o3 gets __remainder
 288         nop
 289         nop
 290         udiv    %o0,%o1,%o0     ! o0 contains quotient a/b
 291         .nonvolatile
 292         umul    %o0,%o1,%o4     ! o4 contains q*b
 293         sub     %o3,%o4,%o3     ! o3 gets a-q*b
 294         .end
 295 
 296         .inline __ieee754_sqrt,2
 297         std     %o0,[%sp+0x48]          ! store to 8-aligned address
 298         ldd     [%sp+0x48],%f0
 299         fsqrtd  %f0,%f0
 300         .end
 301 
 302         .inline __inline_sqrtf,1
 303         st      %o0,[%sp+0x44]
 304         ld      [%sp+0x44],%f0
 305         fsqrts  %f0,%f0
 306         .end
 307 
 308         .inline __inline_sqrt,2
 309         std     %o0,[%sp+0x48]          ! store to 8-aligned address
 310         ldd     [%sp+0x48],%f0
 311         fsqrtd  %f0,%f0
 312         .end
 313 
 314         .inline __sqrtf,1
 315         st      %o0,[%sp+0x44]
 316         ld      [%sp+0x44],%f0
 317         fsqrts  %f0,%f0
 318         .end
 319 
 320         .inline __sqrt,2
 321         std     %o0,[%sp+0x48]          ! store to 8-aligned address
 322         ldd     [%sp+0x48],%f0
 323         fsqrtd  %f0,%f0
 324         .end
 325 
 326         .inline __r_sqrt_,1
 327         ld      [%o0],%f0
 328         fsqrts  %f0,%f0
 329         .end
 330 
 331         .inline __d_sqrt_,1
 332         ld      [%o0],%f0
 333         ld      [%o0+4],%f1
 334         fsqrtd  %f0,%f0
 335         .end
 336 
 337         .inline __ceil,2
 338         std     %o0,[%sp+0x48]
 339         sethi   %hi(0x80000000),%o5
 340         andn    %o0,%o5,%o2
 341         sethi   %hi(0x43300000),%o3
 342         st      %g0,[%sp+0x54]
 343         subcc   %o2,%o3,%g0
 344         bl      1f
 345         nop
 346         sethi   %hi(0x3ff00000),%o2
 347         st      %o2,[%sp+0x50]
 348         ldd     [%sp+0x48],%f0
 349         ldd     [%sp+0x50],%f2
 350         fmuld   %f0,%f2,%f0
 351         ba      4f
 352         nop
 353 1:
 354         tst     %o0
 355         st      %o3,[%sp+0x50]
 356         ldd     [%sp+0x50],%f2
 357         bge     2f
 358         nop
 359         fnegs   %f2,%f2
 360 2:
 361         ldd     [%sp+0x48],%f4
 362         faddd   %f4,%f2,%f0
 363         fsubd   %f0,%f2,%f0
 364         fcmpd   %f0,%f4
 365         sethi   %hi(0x3ff00000),%o2
 366         st      %o2,[%sp+0x50]
 367         and     %o0,%o5,%o4
 368         fbge    3f
 369         nop
 370         ldd     [%sp+0x50],%f4
 371         faddd   %f0,%f4,%f0
 372 3:
 373         st      %f0,[%sp+0x48]
 374         ld      [%sp+0x48],%o3
 375         andn    %o3,%o5,%o3
 376         or      %o4,%o3,%o3
 377         st      %o3,[%sp+0x48]
 378         ld      [%sp+0x48],%f0
 379 4:
 380         .end
 381 
 382         .inline __floor,2
 383         std     %o0,[%sp+0x48]
 384         sethi   %hi(0x80000000),%o5
 385         andn    %o0,%o5,%o2
 386         sethi   %hi(0x43300000),%o3
 387         st      %g0,[%sp+0x54]
 388         subcc   %o2,%o3,%g0
 389         bl      1f
 390         nop
 391         sethi   %hi(0x3ff00000),%o2
 392         st      %o2,[%sp+0x50]
 393         ldd     [%sp+0x48],%f0
 394         ldd     [%sp+0x50],%f2
 395         fmuld   %f0,%f2,%f0
 396         ba      4f
 397         nop
 398 1:
 399         tst     %o0
 400         st      %o3,[%sp+0x50]
 401         ldd     [%sp+0x50],%f2
 402         bge     2f
 403         nop
 404         fnegs   %f2,%f2
 405 2:
 406         ldd     [%sp+0x48],%f4
 407         faddd   %f4,%f2,%f0
 408         fsubd   %f0,%f2,%f0
 409         fcmpd   %f0,%f4
 410         sethi   %hi(0x3ff00000),%o2
 411         st      %o2,[%sp+0x50]
 412         ldd     [%sp+0x50],%f4
 413         and     %o0,%o5,%o4
 414         fble    3f
 415         nop
 416         fsubd   %f0,%f4,%f0
 417 3:
 418         st      %f0,[%sp+0x48]
 419         ld      [%sp+0x48],%o3
 420         andn    %o3,%o5,%o3
 421         or      %o4,%o3,%o3
 422         st      %o3,[%sp+0x48]
 423         ld      [%sp+0x48],%f0
 424 4:
 425         .end
 426 
 427         .inline __ilogb,2
 428         sethi   %hi(0x7ff00000),%o4
 429         andcc   %o4,%o0,%o2
 430         bne     1f
 431         nop
 432         sethi   %hi(0x43500000),%o3
 433         std     %o0,[%sp+0x48]
 434         st      %o3,[%sp+0x50]
 435         st      %g0,[%sp+0x54]
 436         ldd     [%sp+0x48],%f0
 437         ldd     [%sp+0x50],%f2
 438         fmuld   %f0,%f2,%f0
 439         sethi   %hi(0x80000001),%o0
 440         or      %o0,%lo(0x80000001),%o0
 441         st      %f0,[%sp+0x48]
 442         ld      [%sp+0x48],%o2
 443         andcc   %o2,%o4,%o2
 444         srl     %o2,20,%o2
 445         be      2f
 446         nop
 447         sub     %o2,0x435,%o0
 448         ba      2f
 449         nop
 450 1:
 451         subcc   %o4,%o2,%g0
 452         srl     %o2,20,%o3
 453         bne     0f
 454         nop
 455         sethi   %hi(0x7fffffff),%o0
 456         or      %o0,%lo(0x7fffffff),%o0
 457         ba      2f
 458         nop
 459 0:
 460         sub     %o3,0x3ff,%o0
 461 2:
 462         .end
 463 
 464         .inline __rint,2
 465         std     %o0,[%sp+0x48]
 466         sethi   %hi(0x80000000),%o2
 467         andn    %o0,%o2,%o2
 468         ldd     [%sp+0x48],%f0
 469         sethi   %hi(0x43300000),%o3
 470         st      %g0,[%sp+0x50]
 471         st      %g0,[%sp+0x54]
 472         subcc   %o2,%o3,%g0
 473         bl      1f
 474         nop
 475         sethi   %hi(0x3ff00000),%o2
 476         st      %o2,[%sp+0x50]
 477         ldd     [%sp+0x50],%f2
 478         fmuld   %f0,%f2,%f0
 479         ba      3f
 480         nop
 481 1:
 482         tst     %o0
 483         st      %o3,[%sp+0x48]
 484         st      %g0,[%sp+0x4c]
 485         ldd     [%sp+0x48],%f2
 486         bge     2f
 487         nop
 488         fnegs   %f2,%f2
 489 2:
 490         faddd   %f0,%f2,%f0
 491         fcmpd   %f0,%f2
 492         fbne    0f
 493         nop
 494         ldd     [%sp+0x50],%f0
 495         bge     3f
 496         nop
 497         fnegs   %f0,%f0
 498         ba      3f
 499         nop
 500 0:
 501         fsubd   %f0,%f2,%f0
 502 3:
 503         .end
 504 
 505         .inline __rintf,1
 506         st      %o0,[%sp+0x48]
 507         sethi   %hi(0x80000000),%o2
 508         andn    %o0,%o2,%o2
 509         ld      [%sp+0x48],%f0
 510         sethi   %hi(0x4b000000),%o3
 511         st      %g0,[%sp+0x50]
 512         subcc   %o2,%o3,%g0
 513         bl      1f
 514         nop
 515         sethi   %hi(0x3f800000),%o2
 516         st      %o2,[%sp+0x50]
 517         ld      [%sp+0x50],%f2
 518         fmuls   %f0,%f2,%f0
 519         ba      3f
 520         nop
 521 1:
 522         tst     %o0
 523         st      %o3,[%sp+0x48]
 524         ld      [%sp+0x48],%f2
 525         bge     2f
 526         nop
 527         fnegs   %f2,%f2
 528 2:
 529         fadds   %f0,%f2,%f0
 530         fcmps   %f0,%f2
 531         fbne    0f
 532         nop
 533         ld      [%sp+0x50],%f0
 534         bge     3f
 535         nop
 536         fnegs   %f0,%f0
 537         ba      3f
 538         nop
 539 0:
 540         fsubs   %f0,%f2,%f0
 541 3:
 542         .end
 543 
 544         .inline __min_subnormal,0
 545         set     0x0,%o0
 546         st      %o0,[%sp+0x44]
 547         ld      [%sp+0x44],%f0
 548         set     0x1,%o0
 549         st      %o0,[%sp+0x44]
 550         ld      [%sp+0x44],%f1
 551         .end
 552 
 553         .inline __d_min_subnormal_,0
 554         set     0x0,%o0
 555         st      %o0,[%sp+0x44]
 556         ld      [%sp+0x44],%f0
 557         set     0x1,%o0
 558         st      %o0,[%sp+0x44]
 559         ld      [%sp+0x44],%f1
 560         .end
 561 
 562         .inline __min_subnormalf,0
 563         set     0x1,%o0
 564         st      %o0,[%sp+0x44]
 565         ld      [%sp+0x44],%f0
 566         .end
 567 
 568         .inline __r_min_subnormal_,0
 569         set     0x1,%o0
 570         st      %o0,[%sp+0x44]
 571         ld      [%sp+0x44],%f0
 572         .end
 573 
 574         .inline __max_subnormal,0
 575         set     0x000fffff,%o0
 576         st      %o0,[%sp+0x44]
 577         ld      [%sp+0x44],%f0
 578         set     0xffffffff,%o0
 579         st      %o0,[%sp+0x44]
 580         ld      [%sp+0x44],%f1
 581         .end
 582 
 583         .inline __d_max_subnormal_,0
 584         set     0x000fffff,%o0
 585         st      %o0,[%sp+0x44]
 586         ld      [%sp+0x44],%f0
 587         set     0xffffffff,%o0
 588         st      %o0,[%sp+0x44]
 589         ld      [%sp+0x44],%f1
 590         .end
 591 
 592         .inline __max_subnormalf,0
 593         set     0x007fffff,%o0
 594         st      %o0,[%sp+0x44]
 595         ld      [%sp+0x44],%f0
 596         .end
 597 
 598         .inline __r_max_subnormal_,0
 599         set     0x007fffff,%o0
 600         st      %o0,[%sp+0x44]
 601         ld      [%sp+0x44],%f0
 602         .end
 603 
 604         .inline __min_normal,0
 605         set     0x00100000,%o0
 606         set     0x0,%o1
 607         std     %o0,[%sp+0x48]
 608         ldd     [%sp+0x48],%f0
 609         .end
 610 
 611         .inline __d_min_normal_,0
 612         set     0x00100000,%o0
 613         st      %o0,[%sp+0x44]
 614         ld      [%sp+0x44],%f0
 615         set     0x0,%o0
 616         st      %o0,[%sp+0x44]
 617         ld      [%sp+0x44],%f1
 618         .end
 619 
 620         .inline __min_normalf,0
 621         set     0x00800000,%o0
 622         st      %o0,[%sp+0x44]
 623         ld      [%sp+0x44],%f0
 624         .end
 625 
 626         .inline __r_min_normal_,0
 627         set     0x00800000,%o0
 628         st      %o0,[%sp+0x44]
 629         ld      [%sp+0x44],%f0
 630         .end
 631 
 632         .inline __max_normal,0
 633         set     0x7fefffff,%o0
 634         set     0xffffffff,%o1
 635         std     %o0,[%sp+0x48]
 636         ldd     [%sp+0x48],%f0
 637         .end
 638 
 639         .inline __d_max_normal_,0
 640         set     0x7fefffff,%o0
 641         st      %o0,[%sp+0x44]
 642         ld      [%sp+0x44],%f0
 643         set     0xffffffff,%o0
 644         st      %o0,[%sp+0x44]
 645         ld      [%sp+0x44],%f1
 646         .end
 647 
 648         .inline __max_normalf,0
 649         set     0x7f7fffff,%o0
 650         st      %o0,[%sp+0x44]
 651         ld      [%sp+0x44],%f0
 652         .end
 653 
 654         .inline __r_max_normal_,0
 655         set     0x7f7fffff,%o0
 656         st      %o0,[%sp+0x44]
 657         ld      [%sp+0x44],%f0
 658         .end
 659 
 660         .inline __infinity,0
 661         set      0x7ff00000,%o0
 662         set      0x0,%o1
 663         std      %o0,[%sp+0x48]
 664         ldd      [%sp+0x48],%f0
 665         .end
 666 
 667         .inline __infinity,0
 668         set      0x7ff00000,%o0
 669         set      0x0,%o1
 670         std      %o0,[%sp+0x48]
 671         ldd      [%sp+0x48],%f0
 672         .end
 673 
 674         .inline __d_infinity_,0
 675         set     0x7ff00000,%o0
 676         st      %o0,[%sp+0x44]
 677         ld      [%sp+0x44],%f0
 678         set     0x0,%o0
 679         st      %o0,[%sp+0x44]
 680         ld      [%sp+0x44],%f1
 681         .end
 682 
 683         .inline __infinityf,0
 684         set     0x7f800000,%o0
 685         st      %o0,[%sp+0x44]
 686         ld      [%sp+0x44],%f0
 687         .end
 688 
 689         .inline __r_infinity_,0
 690         set     0x7f800000,%o0
 691         st      %o0,[%sp+0x44]
 692         ld      [%sp+0x44],%f0
 693         .end
 694 
 695         .inline __signaling_nan,0
 696         set     0x7ff00000,%o0
 697         set     0x1,%o1
 698         std     %o0,[%sp+0x48]
 699         ldd     [%sp+0x48],%f0
 700         .end
 701 
 702         .inline __d_signaling_nan_,0
 703         set     0x7ff00000,%o0
 704         st      %o0,[%sp+0x44]
 705         ld      [%sp+0x44],%f0
 706         set     0x1,%o0
 707         st      %o0,[%sp+0x44]
 708         ld      [%sp+0x44],%f1
 709         .end
 710 
 711         .inline __signaling_nanf,0
 712         set     0x7f800001,%o0
 713         st      %o0,[%sp+0x44]
 714         ld      [%sp+0x44],%f0
 715         .end
 716 
 717         .inline __r_signaling_nan_,0
 718         set     0x7f800001,%o0
 719         st      %o0,[%sp+0x44]
 720         ld      [%sp+0x44],%f0
 721         .end
 722 
 723         .inline __quiet_nan,0
 724         set     0x7fffffff,%o0
 725         st      %o0,[%sp+0x44]
 726         ld      [%sp+0x44],%f0
 727         set     0xffffffff,%o0
 728         st      %o0,[%sp+0x44]
 729         ld      [%sp+0x44],%f1
 730         .end
 731 
 732         .inline __d_quiet_nan_,0
 733         set     0x7fffffff,%o0
 734         st      %o0,[%sp+0x44]
 735         ld      [%sp+0x44],%f0
 736         set     0xffffffff,%o0
 737         st      %o0,[%sp+0x44]
 738         ld      [%sp+0x44],%f1
 739         .end
 740 
 741         .inline __quiet_nanf,0
 742         set     0x7fffffff,%o0
 743         st      %o0,[%sp+0x44]
 744         ld      [%sp+0x44],%f0
 745         .end
 746 
 747         .inline __r_quiet_nan_,0
 748         set     0x7fffffff,%o0
 749         st      %o0,[%sp+0x44]
 750         ld      [%sp+0x44],%f0
 751         .end
 752 
 753         .inline __swapEX,1
 754         and     %o0,0x1f,%o1
 755         sll     %o1,5,%o1               ! shift input to aexc bit location
 756         .volatile
 757         st      %fsr,[%sp+0x44]
 758         ld      [%sp+0x44],%o0          ! o0 = fsr
 759         andn    %o0,0x3e0,%o2
 760         or      %o1,%o2,%o1             ! o1 = new fsr
 761         st      %o1,[%sp+0x44]
 762         ld      [%sp+0x44],%fsr
 763         srl     %o0,5,%o0
 764         and     %o0,0x1f,%o0
 765         .nonvolatile
 766         .end
 767 
 768         .inline _QgetRD,0
 769         st      %fsr,[%sp+0x44]
 770         ld      [%sp+0x44],%o0          ! o0 = fsr
 771         srl     %o0,30,%o0              ! return __round control value
 772         .end
 773 
 774         .inline _QgetRP,0
 775         or      %g0,%g0,%o0
 776         .end
 777 
 778         .inline __swapRD,1
 779         and     %o0,0x3,%o0
 780         sll     %o0,30,%o1              ! shift input to RD bit location
 781         .volatile
 782         st      %fsr,[%sp+0x44]
 783         ld      [%sp+0x44],%o0          ! o0 = fsr
 784         set     0xc0000000,%o4          ! mask of rounding direction bits
 785         andn    %o0,%o4,%o2
 786         or      %o1,%o2,%o1             ! o1 = new fsr
 787         st      %o1,[%sp+0x44]
 788         ld      [%sp+0x44],%fsr
 789         srl     %o0,30,%o0
 790         and     %o0,0x3,%o0
 791         .nonvolatile
 792         .end
 793 !
 794 ! On the SPARC, __swapRP is a no-op; always return 0 for backward compatibility
 795 !
 796 
 797         .inline __swapRP,1
 798         or      %g0,%g0,%o0
 799         .end
 800 
 801         .inline __swapTE,1
 802         and     %o0,0x1f,%o0
 803         sll     %o0,23,%o1              ! shift input to TEM bit location
 804         .volatile
 805         st      %fsr,[%sp+0x44]
 806         ld      [%sp+0x44],%o0            ! o0 = fsr
 807         set     0x0f800000,%o4          ! mask of TEM (Trap Enable Mode bits)
 808         andn    %o0,%o4,%o2
 809         or      %o1,%o2,%o1             ! o1 = new fsr
 810         st      %o1,[%sp+0x48]
 811         ld      [%sp+0x48],%fsr
 812         srl     %o0,23,%o0
 813         and     %o0,0x1f,%o0
 814         .nonvolatile
 815         .end
 816 
 817         .inline __fp_class,2
 818         sethi   %hi(0x80000000),%o2     ! o2 gets 80000000
 819         andn    %o0,%o2,%o0             ! o0-o1 gets abs(x)
 820         orcc    %o0,%o1,%g0             ! set cc as x is zero/nonzero
 821         bne     1f                      ! branch if x is nonzero
 822         nop
 823         mov     0,%o0
 824         ba      2f                      ! x is 0
 825         nop
 826 1:
 827         sethi   %hi(0x7ff00000),%o2     ! o2 gets 7ff00000
 828         andcc   %o0,%o2,%g0             ! cc set by __exp field of x
 829         bne     1f                      ! branch if normal or max __exp
 830         nop
 831         mov     1,%o0
 832         ba      2f                      ! x is subnormal
 833         nop
 834 1:
 835         cmp     %o0,%o2
 836         bge     1f                      ! branch if x is max __exp
 837         nop
 838         mov     2,%o0
 839         ba      2f                      ! x is normal
 840         nop
 841 1:
 842         andn    %o0,%o2,%o0             ! o0 gets msw __significand field
 843         orcc    %o0,%o1,%g0             ! set cc by OR __significand
 844         bne     1f                      ! Branch if __nan
 845         nop
 846         mov     3,%o0
 847         ba      2f                      ! x is __infinity
 848         nop
 849 1:
 850         sethi   %hi(0x00080000),%o2
 851         andcc   %o0,%o2,%g0             ! set cc by quiet/sig bit
 852         be      1f                      ! Branch if signaling
 853         nop
 854         mov     4,%o0                   ! x is quiet NaN
 855         ba      2f
 856         nop
 857 1:
 858         mov     5,%o0                   ! x is signaling NaN
 859 2:
 860         .end
 861 
 862         .inline __fp_classf,1
 863         sethi   %hi(0x80000000),%o2
 864         andncc  %o0,%o2,%o0
 865         bne     1f
 866         nop
 867         mov     0,%o0
 868         ba      2f                      ! x is 0
 869         nop
 870 1:
 871         sethi   %hi(0x7f800000),%o2
 872         andcc   %o0,%o2,%g0
 873         bne     1f
 874         nop
 875         mov     1,%o0
 876         ba      2f                      ! x is subnormal
 877         nop
 878 1:
 879         cmp     %o0,%o2
 880         bge     1f
 881         nop
 882         mov     2,%o0
 883         ba      2f                      ! x is normal
 884         nop
 885 1:
 886         bg      1f
 887         nop
 888         mov     3,%o0
 889         ba      2f                      ! x is __infinity
 890         nop
 891 1:
 892         sethi   %hi(0x00400000),%o2
 893         andcc   %o0,%o2,%g0
 894         mov     4,%o0                   ! x is quiet NaN
 895         bne     2f
 896         nop
 897         mov     5,%o0                   ! x is signaling NaN
 898 2:
 899         .end
 900 
 901         .inline __ir_fp_class_,1
 902         ld      [%o0],%o0
 903         sethi   %hi(0x80000000),%o2
 904         andncc  %o0,%o2,%o0
 905         bne     1f
 906         nop
 907         mov     0,%o0
 908         ba      2f                      ! x is 0
 909         nop
 910 1:
 911         sethi   %hi(0x7f800000),%o2
 912         andcc   %o0,%o2,%g0
 913         bne     1f
 914         nop
 915         mov     1,%o0
 916         ba      2f                      ! x is subnormal
 917         nop
 918 1:
 919         cmp     %o0,%o2
 920         bge     1f
 921         nop
 922         mov     2,%o0
 923         ba      2f                      ! x is normal
 924         nop
 925 1:
 926         bg      1f
 927         nop
 928         mov     3,%o0
 929         ba      2f                      ! x is __infinity
 930         nop
 931 1:
 932         sethi   %hi(0x00400000),%o2
 933         andcc   %o0,%o2,%g0
 934         mov     4,%o0                   ! x is quiet NaN
 935         bne     2f
 936         nop
 937         mov     5,%o0                   ! x is signaling NaN
 938 2:
 939         .end
 940 
 941         .inline __copysign,4
 942         set     0x80000000,%o3
 943         and     %o2,%o3,%o2
 944         andn    %o0,%o3,%o0
 945         or      %o0,%o2,%o0
 946         std      %o0,[%sp+0x48]
 947         ldd     [%sp+0x48],%f0
 948         .end
 949 
 950         .inline __copysignf,2
 951         set     0x80000000,%o2
 952         andn    %o0,%o2,%o0
 953         and     %o1,%o2,%o1
 954         or      %o0,%o1,%o0
 955         st      %o0,[%sp+0x44]
 956         ld      [%sp+0x44],%f0
 957         .end
 958 
 959         .inline __r_copysign_,2
 960         ld      [%o0],%o0
 961         ld      [%o1],%o1
 962         set     0x80000000,%o2
 963         andn    %o0,%o2,%o0
 964         and     %o1,%o2,%o1
 965         or      %o0,%o1,%o0
 966         st      %o0,[%sp+0x44]
 967         ld      [%sp+0x44],%f0
 968         .end
 969 
 970         .inline _finite,2
 971         set     0x7ff00000,%o1
 972         and     %o0,%o1,%o0
 973         cmp     %o0,%o1
 974         mov     1,%o0
 975         bne     1f
 976         nop
 977         mov     0,%o0
 978 1:
 979         .end
 980 
 981         .inline __finitef,2
 982         set     0x7f800000,%o1
 983         and     %o0,%o1,%o0
 984         cmp     %o0,%o1
 985         mov     1,%o0
 986         bne     1f
 987         nop
 988         mov     0,%o0
 989 1:
 990         .end
 991 
 992         .inline __ir_finite_,1
 993         ld      [%o0],%o0
 994         set     0x7f800000,%o1
 995         and     %o0,%o1,%o0
 996         cmp     %o0,%o1
 997         mov     1,%o0
 998         bne     1f
 999         nop
1000         mov     0,%o0
1001 1:
1002         .end
1003 
1004         .inline __signbit,1
1005         srl     %o0,31,%o0
1006         .end
1007 
1008         .inline __signbitf,1
1009         srl     %o0,31,%o0
1010         .end
1011 
1012         .inline __ir_signbit_,1
1013         ld      [%o0],%o0
1014         srl     %o0,31,%o0
1015         .end
1016 
1017         .inline __isinf,2
1018         tst     %o1
1019         sethi   %hi(0x80000000),%o2
1020         bne     1f
1021         nop
1022         andn    %o0,%o2,%o0
1023         sethi   %hi(0x7ff00000),%o2
1024         cmp     %o0,%o2
1025         mov     1,%o0
1026         be      2f
1027         nop
1028 1:
1029         mov     0,%o0
1030 2:
1031         .end
1032 
1033         .inline __isinff,1
1034         sethi   %hi(0x80000000),%o2
1035         andn    %o0,%o2,%o0             ! o0 gets abs(x)
1036         sethi   %hi(0x7f800000),%o2
1037         cmp     %o0,%o2
1038         mov     0,%o0
1039         bne     1f                      ! Branch if not inf.
1040         nop
1041         mov     1,%o0
1042 1:
1043         .end
1044 
1045         .inline __ir_isinf_,1
1046         ld      [%o0],%o0
1047         sethi   %hi(0x80000000),%o2
1048         andn    %o0,%o2,%o0             ! o0 gets abs(x)
1049         sethi   %hi(0x7f800000),%o2
1050         cmp     %o0,%o2
1051         mov     0,%o0
1052         bne     1f                      ! Branch if not inf.
1053         nop
1054         mov     1,%o0
1055 1:
1056         .end
1057 
1058         .inline __isnan,2
1059         sethi   %hi(0x80000000),%o2
1060         andn    %o0,%o2,%o0
1061         sub     %g0,%o1,%o3
1062         or      %o1,%o3,%o1
1063         srl     %o1,31,%o1
1064         or      %o0,%o1,%o0
1065         sethi   %hi(0x7ff00000),%o4
1066         sub     %o4,%o0,%o0
1067         srl     %o0,31,%o0
1068         .end
1069 
1070         .inline __isnanf,1
1071         sethi   %hi(0x80000000),%o2
1072         andn    %o0,%o2,%o0
1073         sethi   %hi(0x7f800000),%o1
1074         sub     %o1,%o0,%o0
1075         srl     %o0,31,%o0
1076         .end
1077 
1078         .inline __ir_isnan_,1
1079         ld      [%o0],%o0
1080         sethi   %hi(0x80000000),%o2
1081         andn    %o0,%o2,%o0
1082         sethi   %hi(0x7f800000),%o1
1083         sub     %o1,%o0,%o0
1084         srl     %o0,31,%o0
1085         .end
1086 
1087         .inline __isnormal,2
1088         sethi   %hi(0x80000000),%o2
1089         andn    %o0,%o2,%o0
1090         sethi   %hi(0x7ff00000),%o2
1091         cmp     %o0,%o2
1092         sethi   %hi(0x00100000),%o2
1093         bge     1f
1094         nop
1095         cmp     %o0,%o2
1096         mov     1,%o0
1097         bge     2f
1098         nop
1099 1:
1100         mov     0,%o0
1101 2:
1102         .end
1103 
1104         .inline __isnormalf,1
1105         sethi   %hi(0x80000000),%o2
1106         andn    %o0,%o2,%o0
1107         sethi   %hi(0x7f800000),%o2
1108         cmp     %o0,%o2
1109         sethi   %hi(0x00800000),%o2
1110         bge     1f
1111         nop
1112         cmp     %o0,%o2
1113         mov     1,%o0
1114         bge     2f
1115         nop
1116 1:
1117         mov     0,%o0
1118 2:
1119         .end
1120 
1121         .inline __ir_isnormal_,1
1122         ld      [%o0],%o0
1123         sethi   %hi(0x80000000),%o2
1124         andn    %o0,%o2,%o0
1125         sethi   %hi(0x7f800000),%o2
1126         cmp     %o0,%o2
1127         sethi   %hi(0x00800000),%o2
1128         bge     1f
1129         nop
1130         cmp     %o0,%o2
1131         mov     1,%o0
1132         bge     2f
1133         nop
1134 1:
1135         mov     0,%o0
1136 2:
1137         .end
1138 
1139         .inline __issubnormal,2
1140         sethi   %hi(0x80000000),%o2     ! o2 gets 80000000
1141         andn    %o0,%o2,%o0             ! o0/o1 gets abs(x)
1142         sethi   %hi(0x00100000),%o2     ! o2 gets 00100000
1143         cmp     %o0,%o2
1144         bge     1f                      ! branch if x norm or max __exp
1145         nop
1146         orcc    %o0,%o1,%g0
1147         be      1f                      ! Branch if x zero
1148         nop
1149         mov     1,%o0                   ! x is subnormal
1150         ba      2f
1151         nop
1152 1:
1153         mov     0,%o0
1154 2:
1155         .end
1156 
1157         .inline __issubnormalf,1
1158         sethi   %hi(0x80000000),%o2     ! o2 gets 80000000
1159         andn    %o0,%o2,%o0             ! o0 gets abs(x)
1160         sethi   %hi(0x00800000),%o2     ! o2 gets 00800000
1161         cmp     %o0,%o2
1162         bge     1f                      ! branch if x norm or max __exp
1163         nop
1164         orcc    %o0,%g0,%g0
1165         be      1f                      ! Branch if x zero
1166         nop
1167         mov     1,%o0                   ! x is subnormal
1168         ba      2f
1169         nop
1170 1:
1171         mov     0,%o0
1172 2:
1173         .end
1174 
1175         .inline __ir_issubnormal_,1
1176         ld      [%o0],%o0
1177         sethi   %hi(0x80000000),%o2     ! o2 gets 80000000
1178         andn    %o0,%o2,%o0             ! o0 gets abs(x)
1179         sethi   %hi(0x00800000),%o2     ! o2 gets 00800000
1180         cmp     %o0,%o2
1181         bge     1f                      ! branch if x norm or max __exp
1182         nop
1183         orcc    %o0,%g0,%g0
1184         be      1f                      ! Branch if x zero
1185         nop
1186         mov     1,%o0                   ! x is subnormal
1187         ba      2f
1188         nop
1189 1:
1190         mov     0,%o0
1191 2:
1192         .end
1193 
1194         .inline __iszero,2
1195         sethi   %hi(0x80000000),%o2
1196         andn    %o0,%o2,%o0
1197         orcc    %o0,%o1,%g0
1198         mov     1,%o0
1199         be      1f
1200         nop
1201         mov     0,%o0
1202 1:
1203         .end
1204 
1205         .inline __iszerof,1
1206         sethi   %hi(0x80000000),%o2
1207         andncc  %o0,%o2,%o0
1208         mov     1,%o0
1209         be      1f
1210         nop
1211         mov     0,%o0
1212 1:
1213         .end
1214 
1215         .inline __ir_iszero_,1
1216         ld      [%o0],%o0
1217         sethi   %hi(0x80000000),%o2
1218         andncc  %o0,%o2,%o0
1219         mov     1,%o0
1220         be      1f
1221         nop
1222         mov     0,%o0
1223 1:
1224         .end
1225 
1226         .inline abs,1
1227         sra     %o0,31,%o1
1228         xor     %o0,%o1,%o0
1229         sub     %o0,%o1,%o0
1230         .end
1231 
1232         .inline __fabs,2
1233         st      %o0,[%sp+0x48]
1234         st      %o1,[%sp+0x4c]
1235         ldd     [%sp+0x48],%f0
1236         fabsd   %f0,%f0
1237         .end
1238 
1239         .inline __fabsf,1
1240         st      %o0,[%sp+0x44]
1241         ld      [%sp+0x44],%f0
1242         fabss   %f0,%f0
1243         .end
1244 
1245         .inline __r_fabs_,1
1246         ld      [%o0],%f0
1247         fabss   %f0,%f0
1248         .end
1249 !
1250 !       __nintf - f77 NINT(REAL*4)
1251 !
1252 
1253         .inline __nintf,1
1254         srl     %o0,30-7,%g1
1255         sethi   %hi(0x7fffff),%o2
1256         st      %o0,[%sp+0x44]
1257         and     %g1,0xff,%g1
1258         or      %o2,%lo(0x7fffff),%o2
1259         sethi   %hi(1<<22),%o4
1260         subcc   %g1,127+31,%g0
1261         and     %o0,%o2,%o3
1262         bl      0f
1263         nop
1264         sethi   %hi(0xcf000000),%o2
1265         sethi   %hi(0x80000000),%g1
1266         subcc   %o0,%o2,%g0
1267         or      %g1,%g0,%o0
1268         be      9f
1269         nop
1270         ld      [%sp+0x44],%f0
1271         fstoi   %f0,%f0
1272         st      %f0,[%sp+0x44]
1273         ld      [%sp+0x44],%o0
1274         ba      9f
1275         nop
1276 0:
1277         add     %o4,%o4,%o5
1278         or      %o3,%o5,%o3
1279         sra     %o0,31-0,%o2
1280         subcc   %g1,127,%g1
1281         srl     %o4,%g1,%o4
1282         bge     1f
1283         nop
1284         subcc   %g1,-1,%g0
1285         or      %g0,0,%o0
1286         bne     2f
1287         nop
1288         or      %g0,1,%o0
1289         ba      2f
1290         nop
1291 1:
1292         add     %o3,%o4,%o3
1293         or      %g0,23,%o0
1294         subcc   %o0,%g1,%o0
1295         bl      1f
1296         nop
1297         srl     %o3,%o0,%o0
1298         ba      2f
1299         nop
1300 1:
1301         sub     %g0,%o0,%o0
1302         sll     %o3,%o0,%o0
1303 2:
1304         xor     %o0,%o2,%o0
1305         and     %o2,1,%o2
1306         add     %o0,%o2,%o0
1307 9:
1308         .end
1309 
1310         .inline __il_nint,1
1311         ld      [%o0],%o0
1312         sra     %o0,0,%o0
1313         srlx    %o0,31-8,%g1
1314         or      %g0,1,%o2
1315         sllx    %o2,23-1,%o4
1316         and     %g1,0xff,%g1
1317         sllx    %o2,63-0,%o2
1318         subcc   %g1,127+63,%g0
1319         bl      0f
1320         nop
1321         st      %o0,[%sp+0x48]
1322         ld      [%sp+0x48],%f0
1323         fstox   %f0,%f0
1324         std     %f0,[%sp+0x48]
1325         ldx     [%sp+0x48],%o1
1326         ba      9f
1327         nop
1328 0:
1329         add     %o4,%o4,%o5
1330         srax    %o2,63-23,%o2
1331         sub     %g1,127+23,%o1
1332         xnor    %o2,%g0,%o2
1333         and     %o0,%o2,%o3
1334         or      %o3,%o5,%o3
1335         srax    %o0,63-0,%o2
1336         subcc   %g1,127,%g1
1337         bge     1f
1338         nop
1339         subcc   %g1,-1,%g0
1340         or      %g0,0,%o0
1341         bne     2f
1342         nop
1343         or      %g0,1,%o0
1344         ba      2f
1345         nop
1346 1:
1347         brlz,pt %o1,3f
1348         nop
1349         sub     %g1,23,%o0
1350         sllx    %o3,%o0,%o0
1351         ba      2f
1352         nop
1353 3:
1354         srlx    %o4,%g1,%o4
1355         add     %o3,%o4,%o3
1356         or      %g0,23,%o0
1357         sub     %o0,%g1,%o0
1358         srlx    %o3,%o0,%o0
1359 2:
1360         xor     %o0,%o2,%o0
1361         sub     %o0,%o2,%o1
1362 9:
1363         srlx    %o1,32,%o0
1364         .end
1365 !
1366 !       __i_dnnt - f77 NINT(REAL*8)
1367 !
1368 
1369         .inline __i_dnnt,1
1370         ld      [%o0],%o1
1371         sllx    %o1,32,%o1
1372         ld      [%o0+4],%o0
1373         or      %o0,%o1,%o0
1374         srlx    %o0,63-11,%g1
1375         or      %g0,1,%o2
1376         stx     %o0,[%sp+0x48]
1377         sllx    %o2,52-1,%o4
1378         and     %g1,0x7ff,%g1
1379         sllx    %o2,63-0,%o2
1380         subcc   %g1,1023+32,%g0
1381         bl      0f
1382         nop
1383         ldd     [%sp+0x48],%f0
1384         ba      8f
1385         nop
1386 0:
1387         add     %o4,%o4,%o5
1388         srax    %o2,63-52,%o2
1389         sub     %g1,1023+30,%o1
1390         xnor    %o2,%g0,%o2
1391         and     %o0,%o2,%o3
1392         or      %o3,%o5,%o3
1393         srax    %o0,63-0,%o2
1394         subcc   %g1,1023,%g1
1395         bge     1f
1396         nop
1397         subcc   %g1,-1,%g0
1398         or      %g0,0,%o0
1399         bne     2f
1400         nop
1401         or      %g0,1,%o0
1402         ba      2f
1403         nop
1404 1:
1405         srlx    %o4,%g1,%o4
1406         add     %o3,%o4,%o3
1407         or      %g0,52,%o0
1408         sub     %o0,%g1,%o0
1409         srlx    %o3,%o0,%o0
1410 2:
1411         xor     %o0,%o2,%o0
1412         sub     %o0,%o2,%o0
1413         brlz,pt %o1,9f
1414         nop
1415         stx     %o0,[%sp+0x48]
1416         ldd     [%sp+0x48],%f0
1417         fxtod   %f0,%f0
1418 8:
1419         fdtoi   %f0,%f0
1420         st      %f0,[%sp+0x44]
1421         ld      [%sp+0x44],%o0
1422 9:
1423         .end
1424 
1425         .inline __il_dnnt,1
1426         ld      [%o0],%o1
1427         sllx    %o1,32,%o1
1428         ld      [%o0+4],%o0
1429         or      %o0,%o1,%o0
1430         srlx    %o0,63-11,%g1
1431         or      %g0,1,%o2
1432         sllx    %o2,52-1,%o4
1433         and     %g1,0x7ff,%g1
1434         sllx    %o2,63-0,%o2
1435         subcc   %g1,1023+63,%g0
1436         bl      0f
1437         nop
1438         stx     %o0,[%sp+0x48]
1439         ldd     [%sp+0x48],%f0
1440         fdtox   %f0,%f0
1441         std     %f0,[%sp+0x48]
1442         ldx     [%sp+0x48],%o1
1443         ba      9f
1444         nop
1445 0:
1446         add     %o4,%o4,%o5
1447         srax    %o2,63-52,%o2
1448         sub     %g1,1023+52,%o1
1449         xnor    %o2,%g0,%o2
1450         and     %o0,%o2,%o3
1451         or      %o3,%o5,%o3
1452         srax    %o0,63-0,%o2
1453         subcc   %g1,1023,%g1
1454         bge     1f
1455         nop
1456         subcc   %g1,-1,%g0
1457         or      %g0,0,%o0
1458         bne     2f
1459         nop
1460         or      %g0,1,%o0
1461         ba      2f
1462         nop
1463 1:
1464         brlz,pt %o1,3f
1465         nop
1466         sub     %g1,52,%o0
1467         sllx    %o3,%o0,%o0
1468         ba      2f
1469         nop
1470 3:
1471         srlx    %o4,%g1,%o4
1472         add     %o3,%o4,%o3
1473         or      %g0,52,%o0
1474         sub     %o0,%g1,%o0
1475         srlx    %o3,%o0,%o0
1476 2:
1477         xor     %o0,%o2,%o0
1478         sub     %o0,%o2,%o1
1479 9:
1480         srlx    %o1,32,%o0
1481         .end
1482 
1483         .inline __anintf,1
1484         or      %g0,1,%o1
1485         srl     %o0,23,%g1
1486         and     %g1,0xff,%g1
1487         sub     %g0,%g1,%g1
1488         add     %g1,0x95,%g1
1489         subcc   %g1,23,%g0
1490         sll     %o1,%g1,%o1
1491         sub     %o1,1,%o2
1492         bcs     1f
1493         nop
1494         be      2f
1495         nop
1496         bl      3f
1497         nop
1498         sethi   %hi(0x80000000),%o1
1499         and     %o0,%o1,%o0
1500         ba      3f
1501         nop
1502 1:
1503         and     %o0,%o1,%o1
1504 2:
1505         add     %o0,%o1,%o0
1506         andn    %o0,%o2,%o0
1507 3:
1508         st      %o0,[%sp+0x48]
1509         ld      [%sp+0x48],%f0
1510         .end
1511 
1512         .inline __anint,2
1513         sllx    %o0,32,%o0
1514         or      %o0,%o1,%o0
1515         or      %g0,1,%o1
1516         srlx    %o0,52,%g1
1517         and     %g1,0x7ff,%g1
1518         sub     %g0,%g1,%g1
1519         add     %g1,0x432,%g1
1520         subcc   %g1,52,%g0
1521         sllx    %o1,%g1,%o1
1522         sub     %o1,1,%o2
1523         bcs,pt  %icc,1f
1524         nop
1525         be,pt   %icc,2f
1526         nop
1527         bl,pt   %icc,3f
1528         nop
1529         srlx    %o0,63,%o0
1530         sllx    %o0,63,%o0
1531         ba      3f
1532         nop
1533 1:
1534         and     %o0,%o1,%o1
1535 2:
1536         add     %o0,%o1,%o0
1537         andn    %o0,%o2,%o0
1538 3:
1539         stx     %o0,[%sp+0x48]
1540         ldd     [%sp+0x48],%f0
1541         .end
1542 
1543         .inline __Fz_minus,3
1544         ld      [%o1],%f0
1545         ld      [%o1+0x4],%f1
1546         ld      [%o2],%f4
1547         ld      [%o2+0x4],%f5
1548         fsubd   %f0,%f4,%f0
1549         ld      [%o1+8],%f2
1550         ld      [%o1+0xc],%f3
1551         ld      [%o2+8],%f6
1552         ld      [%o2+0xc],%f7
1553         fsubd   %f2,%f6,%f2
1554         st      %f0,[%o0+0x0]
1555         st      %f1,[%o0+0x4]
1556         st      %f2,[%o0+0x8]
1557         st      %f3,[%o0+0xc]
1558         .end
1559 
1560         .inline __Fz_add,3
1561         ld      [%o1],%f0
1562         ld      [%o1+0x4],%f1
1563         ld      [%o2],%f4
1564         ld      [%o2+0x4],%f5
1565         faddd   %f0,%f4,%f0
1566         ld      [%o1+8],%f2
1567         ld      [%o1+0xc],%f3
1568         ld      [%o2+8],%f6
1569         ld      [%o2+0xc],%f7
1570         faddd   %f2,%f6,%f2
1571         st      %f0,[%o0+0x0]
1572         st      %f1,[%o0+0x4]
1573         st      %f2,[%o0+0x8]
1574         st      %f3,[%o0+0xc]
1575         .end
1576 
1577         .inline __Fz_neg,2
1578         ld      [%o1],%f0
1579         fnegs   %f0,%f0
1580         ld      [%o1+0x4],%f1
1581         st      %f1,[%o0+0x4]
1582         ld      [%o1+8],%f2
1583         fnegs   %f2,%f2
1584         ld      [%o1+0xc],%f3
1585         st      %f3,[%o0+0xc]
1586         st      %f0,[%o0]
1587         st      %f2,[%o0+0x8]
1588         .end
1589 
1590         .inline __Ff_conv_z,2
1591         st      %o1,[%sp+0x44]
1592         ld      [%sp+0x44],%f0
1593         fstod   %f0,%f0
1594         st      %g0,[%o0+0x8]
1595         st      %g0,[%o0+0xc]
1596         st      %f1,[%o0+0x4]
1597         st      %f0,[%o0]
1598         .end
1599 
1600         .inline __Fz_conv_f,1
1601         ld      [%o0],%f0
1602         ld      [%o0+4],%f1
1603         fdtos   %f0,%f0
1604         .end
1605 
1606         .inline __Fz_conv_i,1
1607         ld      [%o0],%f0
1608         ld      [%o0+4],%f1
1609         fdtoi   %f0,%f0
1610         st      %f0,[%sp+0x44]
1611         ld      [%sp+0x44],%o0
1612         .end
1613 
1614         .inline __Fi_conv_z,2
1615         st      %o1,[%sp+0x44]
1616         ld      [%sp+0x44],%f0
1617         fitod   %f0,%f0
1618         st      %g0,[%o0+0x8]
1619         st      %g0,[%o0+0xc]
1620         st      %f1,[%o0+0x4]
1621         st      %f0,[%o0]
1622         .end
1623 
1624         .inline __Fz_conv_d,1
1625         ld      [%o0],%f0
1626         ld      [%o0+4],%f1
1627         .end
1628 
1629         .inline __Fd_conv_z,3
1630         st      %o1,[%o0]
1631         st      %o2,[%o0+0x4]
1632         st      %g0,[%o0+0x8]
1633         st      %g0,[%o0+0xc]
1634         .end
1635 
1636         .inline __Fz_conv_c,2
1637         ldd     [%o1],%f0
1638         fdtos   %f0,%f0
1639         st      %f0,[%o0]
1640         ldd     [%o1+0x8],%f2
1641         fdtos   %f2,%f1
1642         st      %f1,[%o0+0x4]
1643         .end
1644 
1645         .inline __Fz_eq,2
1646         ld      [%o0],%f0
1647         ld      [%o0+4],%f1
1648         ld      [%o1],%f2
1649         ld      [%o1+4],%f3
1650         fcmpd   %f0,%f2
1651         mov     %o0,%o2
1652         mov     0,%o0
1653         fbne    1f
1654         nop
1655         ld      [%o2+8],%f0
1656         ld      [%o2+12],%f1
1657         ld      [%o1+8],%f2
1658         ld      [%o1+12],%f3
1659         fcmpd   %f0,%f2
1660         nop
1661         fbne    1f
1662         nop
1663         mov     1,%o0
1664 1:
1665         .end
1666 
1667         .inline __Fz_ne,2
1668         ld      [%o0],%f0
1669         ld      [%o0+4],%f1
1670         ld      [%o1],%f2
1671         ld      [%o1+4],%f3
1672         fcmpd   %f0,%f2
1673         mov     %o0,%o2
1674         mov     1,%o0
1675         fbne    1f
1676         nop
1677         ld      [%o2+8],%f0
1678         ld      [%o2+12],%f1
1679         ld      [%o1+8],%f2
1680         ld      [%o1+12],%f3
1681         fcmpd   %f0,%f2
1682         nop
1683         fbne    1f
1684         nop
1685         mov     0,%o0
1686 1:
1687         .end
1688 
1689         .inline __c_cmplx,3
1690         ld      [%o1],%o1
1691         st      %o1,[%o0]
1692         ld      [%o2],%o2
1693         st      %o2,[%o0+4]
1694         .end
1695 
1696         .inline __d_cmplx,3
1697         ld      [%o1],%f0
1698         st      %f0,[%o0]
1699         ld      [%o1+4],%f1
1700         st      %f1,[%o0+4]
1701         ld      [%o2],%f0
1702         st      %f0,[%o0+0x8]
1703         ld      [%o2+4],%f1
1704         st      %f1,[%o0+0xc]
1705         .end
1706 
1707         .inline __r_cnjg,2
1708         ld      [%o1+0x4],%f1
1709         fnegs   %f1,%f1
1710         ld      [%o1],%f0
1711         st      %f0,[%o0]
1712         st      %f1,[%o0+4]
1713         .end
1714 
1715         .inline __d_cnjg,2
1716         ld      [%o1+0x8],%f0
1717         fnegs   %f0,%f0
1718         ld      [%o1+0xc],%f1
1719         st      %f1,[%o0+0xc]
1720         ld      [%o1+0x0],%f1
1721         st      %f1,[%o0+0x0]
1722         ld      [%o1+0x4],%f1
1723         st      %f1,[%o0+0x4]
1724         st      %f0,[%o0+0x8]
1725         .end
1726 
1727         .inline __r_dim,2
1728         st      %g0,[%sp+0x48]
1729         ld      [%sp+0x48],%f4
1730         ld      [%o0],%f0
1731         ld      [%o1],%f2
1732         fcmps   %fcc0,%f0,%f2
1733         fmovsule %fcc0,%f4,%f2
1734         fsubs   %f0,%f2,%f0
1735         fmovsule %fcc0,%f4,%f0
1736         .end
1737 
1738         .inline __d_dim,2
1739         stx     %g0,[%sp+0x48]
1740         ldd     [%sp+0x48],%f4
1741         ld      [%o0],%f0
1742         ld      [%o0+4],%f1
1743         ld      [%o1],%f2
1744         ld      [%o1+4],%f3
1745         fcmpd   %fcc0,%f0,%f2
1746         fmovdule %fcc0,%f4,%f2
1747         fsubd   %f0,%f2,%f0
1748         fmovdule %fcc0,%f4,%f0
1749         .end
1750 
1751         .inline __r_imag,1
1752         ld      [%o0+4],%f0
1753         .end
1754 
1755         .inline __d_imag,1
1756         ld      [%o0+8],%f0
1757         ld      [%o0+0xc],%f1
1758         .end
1759 
1760         .inline __f95_signf,2
1761         ld      [%o0],%f0
1762         ld      [%o1],%o1
1763         fabss   %f0,%f0
1764         fnegs   %f0,%f1
1765         sra     %o1,0,%o1
1766         fmovrslz %o1,%f1,%f0
1767         .end
1768 
1769         .inline __f95_sign,2
1770         ld      [%o0],%f0
1771         ld      [%o0+4],%f1
1772         ld      [%o1],%o1
1773         fabsd   %f0,%f0
1774         fnegd   %f0,%f2
1775         sra     %o1,0,%o1
1776         fmovrdlz %o1,%f2,%f0
1777         .end
1778 
1779         .inline __r_sign,2
1780         ld      [%o0],%f0
1781         ld      [%o1],%o1
1782         fabss   %f0,%f0
1783         fnegs   %f0,%f1
1784         sub     %o1,1,%o0
1785         and     %o1,%o0,%o1
1786         sra     %o1,0,%o1
1787         fmovrslz %o1,%f1,%f0
1788         .end
1789 
1790         .inline __d_sign,2
1791         ld      [%o0],%f0
1792         ld      [%o0+4],%f1
1793         ld      [%o1],%o0
1794         sllx    %o0,32,%o0
1795         ld      [%o1+4],%o1
1796         or      %o1,%o0,%o1
1797         fabsd   %f0,%f0
1798         fnegd   %f0,%f2
1799         sub     %o1,1,%o0
1800         and     %o1,%o0,%o1
1801         fmovrdlz %o1,%f2,%f0
1802         .end
1803 
1804         .inline __Fz_mult,3
1805         ld      [%o1],%f0
1806         ld      [%o1+0x4],%f1
1807         ld      [%o2],%f4
1808         ld      [%o2+0x4],%f5
1809         fmuld   %f0,%f4,%f8     ! f8 = r1*r2
1810         ld      [%o1+0x8],%f2
1811         ld      [%o1+0xc],%f3
1812         ld      [%o2+0x8],%f6
1813         ld      [%o2+0xc],%f7
1814         fmuld   %f2,%f6,%f10    ! f10= i1*i2
1815         fsubd   %f8,%f10,%f12   ! f12= r1*r2-i1*i2
1816         st      %f12,[%o0]
1817         st      %f13,[%o0+4]
1818         fmuld   %f0,%f6,%f14    ! f14= r1*i2
1819         fmuld   %f2,%f4,%f16    ! f16= r2*i1
1820         faddd   %f14,%f16,%f2   ! f2 = r1*i2+r2*i1
1821         st      %f2,[%o0+8]
1822         st      %f3,[%o0+12]
1823         .end
1824 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1825 ! void
1826 ! __Fc_minus(c, a, b)
1827 ! complex *c, *a, *b;
1828 ! {
1829 
1830         .inline __Fc_minus,3
1831 !    30         c->real = a->real - b->real
1832         ld      [%o1],%f0
1833         ld      [%o2],%f1
1834         fsubs   %f0,%f1,%f2
1835 !    31         c->imag = a->imag - b->imag
1836         ld      [%o1+4],%f3
1837         ld      [%o2+4],%f4
1838         fsubs   %f3,%f4,%f5
1839         st      %f2,[%o0]
1840         st      %f5,[%o0+4]
1841         .end
1842  }
1843 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1844 ! void
1845 ! __Fc_add(c, a, b)
1846 ! complex *c, *a, *b;
1847 ! {
1848 
1849         .inline __Fc_add,3
1850 !    39         c->real = a->real + b->real
1851         ld      [%o1],%f0
1852         ld      [%o2],%f1
1853         fadds   %f0,%f1,%f2
1854 !    40         c->imag = a->imag + b->imag
1855         ld      [%o1+4],%f3
1856         ld      [%o2+4],%f4
1857         fadds   %f3,%f4,%f5
1858         st      %f2,[%o0]
1859         st      %f5,[%o0+4]
1860         .end
1861 ! }
1862 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1863 ! void
1864 ! __Fc_neg(c, a)
1865 ! complex *c, *a;
1866 ! {
1867 
1868         .inline __Fc_neg,2
1869 !    48         c->real = - a->real
1870         ld      [%o1],%f0
1871         fnegs   %f0,%f1
1872 !    49         c->imag = - a->imag
1873         ld      [%o1+4],%f2
1874         fnegs   %f2,%f3
1875         st      %f1,[%o0]
1876         st      %f3,[%o0+4]
1877         .end
1878 ! }
1879 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1880 ! void
1881 ! __Ff_conv_c(c, x)
1882 ! complex *c;
1883 ! FLOATPARAMETER x;
1884 ! {
1885 
1886         .inline __Ff_conv_c,2
1887 !    59         c->real = x
1888         st      %o1,[%o0]
1889 !    60         c->imag = 0.0
1890         st      %g0,[%o0+4]
1891         .end
1892 ! }
1893 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1894 ! FLOATFUNCTIONTYPE
1895 ! __Fc_conv_f(c)
1896 ! complex *c;
1897 ! {
1898 
1899         .inline __Fc_conv_f,1
1900 !    69         RETURNFLOAT(c->real)
1901         ld      [%o0],%f0
1902         .end
1903 ! }
1904 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1905 ! int
1906 ! __Fc_conv_i(c)
1907 ! complex *c;
1908 ! {
1909 
1910         .inline __Fc_conv_i,1
1911 !    78         return (int)c->real
1912         ld      [%o0],%f0
1913         fstoi   %f0,%f1
1914         st      %f1,[%sp+68]
1915         ld      [%sp+68],%o0
1916         .end
1917 ! }
1918 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1919 ! void
1920 ! __Fi_conv_c(c, i)
1921 ! complex *c;
1922 ! int i;
1923 ! {
1924 
1925         .inline __Fi_conv_c,2
1926 !    88         c->real = (float)i
1927         st      %o1,[%sp+68]
1928         ld      [%sp+68],%f0
1929         fitos   %f0,%f1
1930         st      %f1,[%o0]
1931 !    89         c->imag = 0.0
1932         st      %g0,[%o0+4]
1933         .end
1934 ! }
1935 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1936 ! double
1937 ! __Fc_conv_d(c)
1938 ! complex *c;
1939 ! {
1940 
1941         .inline __Fc_conv_d,1
1942 !    98         return (double)c->real
1943         ld      [%o0],%f2
1944         fstod   %f2,%f0
1945         .end
1946 ! }
1947 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1948 ! void
1949 ! __Fd_conv_c(c, x)
1950 ! complex *c;
1951 ! double x;
1952 ! {
1953 
1954         .inline __Fd_conv_c,2
1955         st      %o1,[%sp+72]
1956         st      %o2,[%sp+76]
1957 !   109         c->real = (float)(x)
1958         ldd     [%sp+72],%f0
1959         fdtos   %f0,%f1
1960         st      %f1,[%o0]
1961 !   110         c->imag = 0.0
1962         st      %g0,[%o0+4]
1963         .end
1964 ! }
1965 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1966 ! void
1967 ! __Fc_conv_z(result, c)
1968 ! dcomplex *result;
1969 ! complex *c;
1970 ! {
1971 
1972         .inline __Fc_conv_z,2
1973 !   120         result->dreal = (double)c->real
1974         ld      [%o1],%f0
1975         fstod   %f0,%f2
1976         st      %f2,[%o0]
1977         st      %f3,[%o0+4]
1978 !   121         result->dimag = (double)c->imag
1979         ld      [%o1+4],%f3
1980         fstod   %f3,%f4
1981         st      %f4,[%o0+8]
1982         st      %f5,[%o0+12]
1983         .end
1984 ! }
1985 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1986 ! int
1987 ! __Fc_eq(x, y)
1988 ! complex *x, *y;
1989 ! {
1990 
1991         .inline __Fc_eq,2
1992 !       return  (x->real == y->real) && (x->imag == y->imag);
1993         ld      [%o0],%f0
1994         ld      [%o1],%f2
1995         mov     %o0,%o2
1996         fcmps   %f0,%f2
1997         mov     0,%o0
1998         fbne    1f
1999         nop
2000         ld      [%o2+4],%f0
2001         ld      [%o1+4],%f2
2002         fcmps   %f0,%f2
2003         nop
2004         fbne    1f
2005         nop
2006         mov     1,%o0
2007 1:
2008         .end
2009 ! }
2010 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2011 ! int
2012 ! __Fc_ne(x, y)
2013 ! complex *x, *y;
2014 ! {
2015 
2016         .inline __Fc_ne,2
2017 !       return  (x->real != y->real) || (x->imag != y->imag);
2018         ld      [%o0],%f0
2019         ld      [%o1],%f2
2020         mov     %o0,%o2
2021         fcmps   %f0,%f2
2022         mov     1,%o0
2023         fbne    1f
2024         nop
2025         ld      [%o2+4],%f0
2026         ld      [%o1+4],%f2
2027         fcmps   %f0,%f2
2028         nop
2029         fbne    1f
2030         nop
2031         mov     0,%o0
2032 1:
2033         .end
2034 ! }