* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* the Systems Programming Group of the University of Utah Computer
* %sccs.include.redist.c%
* @(#)support.s 5.2 (Berkeley) %G%
.globl _copysign, _finite, _scalb, _logb, _drem, _pow_p, _atan2__A
| returns x with the sign of y.
| returns the value TRUE if -INF < x < +INF and returns FALSE otherwise.
| returns x * (2**N), for integer values N.
| returns the unbiased exponent of x, a signed integer in double precision,
| except that logb(0) is -INF, logb(INF) is +INF, and logb(NAN) is that NAN.
movw #0x7FF0,d1 | exponent bits
andw d1,d0 | mask off all else
cmpw d1,d0 | max exponent?
bne Lfinite | no, is finite
fmoved sp@(4),fp0 | yes, infinite or NaN
fbun Ldone | NaN returns NaN
fabsx fp0 | +-inf returns inf
fmoved sp@(4),fp0 | get entire number
flog2x fp0 | yes, log(0) a convenient source of -inf
fgetexpx fp0 | get exponent
| returns x REM y = x - [x/y]*y , where [x/y] is the integer nearest x/y;
| in half way case, choose the even one.
| return x**y for x with sign=1 and finite y
| compute atan2(y,x) where x,y are finite and non-zero
| called by atan2() after weeding out all the special cases
moveq #0,d0 | sign of result
fmoved sp@(4),fp0 | get y
moveq #1,d0 | yes, result is neg
fmoved sp@(12),fp1 | get x
fnegx fp1 | yes, make x pos
fatanx fp0,fp1 | atan(y/x)
fsubx fp1,fp0 | pi - atan(y/x)