mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
82 lines
3.4 KiB
ArmAsm
82 lines
3.4 KiB
ArmAsm
ttl fast floating point power (ffppwr)
|
|
***************************************
|
|
* (c) copyright 1981 by motorola inc. *
|
|
***************************************
|
|
|
|
*************************************************
|
|
* ffppwr *
|
|
* fast floating point power function *
|
|
* *
|
|
* input: d6 - floating point exponent value *
|
|
* d7 - floating point argument value *
|
|
* *
|
|
* output: d7 - result of the value taken to *
|
|
* the power specified *
|
|
* *
|
|
* all registers but d7 are transparent *
|
|
* *
|
|
* code size: 36 bytes stack work: 42 bytes *
|
|
* *
|
|
* calls subroutines: ffplog, ffpexp and ffpmul2 *
|
|
* *
|
|
* condition codes: *
|
|
* z - set if the result is zero *
|
|
* n - cleared *
|
|
* v - set if overflow occurred or base *
|
|
* value argument was negative *
|
|
* c - undefined *
|
|
* x - undefined *
|
|
* *
|
|
* notes: *
|
|
* 1) a negative base value will force the use*
|
|
* if its absolute value. the "v" bit will*
|
|
* be set upon function return. *
|
|
* 2) if the result overflows then the *
|
|
* maximum size value is returned with the *
|
|
* "v" bit set in the condition code. *
|
|
* 3) spot checks show at least six digit *
|
|
* precision for 80 percent of the cases. *
|
|
* *
|
|
* time: (8mhz no wait states assumed) *
|
|
* *
|
|
* the timing is very data sensitive with *
|
|
* test samples ranging from 720 to *
|
|
* 1206 microseconds *
|
|
* *
|
|
*************************************************
|
|
page
|
|
ffppwr idnt 1,1 ffp power
|
|
|
|
opt pcs
|
|
|
|
section 9
|
|
|
|
xdef ffppwr entry point
|
|
|
|
xref ffplog,ffpexp exponent and log functions
|
|
xref ffpmul2 multiply function
|
|
xref ffpcpyrt copyright stub
|
|
|
|
*****************
|
|
* power entry *
|
|
*****************
|
|
|
|
* take the logorithm of the base value
|
|
ffppwr tst.b d7 ? negative base value
|
|
bpl.s fpppos branch positive
|
|
and.b #$7f,d7 take absolute value
|
|
bsr.s fpppos find result using that
|
|
* or.b #$02,ccr force "v" bit on for negative argument
|
|
dc.l $003c0002 *****assembler error*****
|
|
rts return to caller
|
|
|
|
fpppos jsr ffplog find log of the number to be used
|
|
movem.l d3-d5,-(sp) save multiply work registers
|
|
jsr ffpmul2 multiply by the exponent
|
|
movem.l (sp)+,d3-d5 restore multiply work registers
|
|
* if overflowed, ffpexp will set "v" bit and return desired result anyway
|
|
jmp ffpexp result is exponent
|
|
|
|
end
|
|
|