ReC98/libs/BorlandC/math/_pow10.asm

118 lines
1.7 KiB
NASM

; long double __pascal __near _pow10(int p)
public __pow10
__pow10 proc near
MAX_87_EXP = 4932
p = word ptr 4
push bp
mov bp, sp
push si
ifdef __HUGE__
mov ax, seg e0to7
mov ds, ax
endif
mov ax, [bp+p]
cmp ax, -MAX_87_EXP
jge short @@tooLarge?
fldz
jmp @@p10_end
@@tooLarge?:
cmp ax, MAX_87_EXP
jle short @@10pow0
fld eINF
jmp @@p10_end
@@10pow0:
or ax, ax
jnz short @@nontrivial
fld1
jmp @@p10_end
@@nontrivial:
or ax, ax
jge short @@p10_abs
neg ax
@@p10_abs:
mov si, 7
and si, ax
shl si, 1
shl si, 1
fld e0to7[si]
shr ax, 1
shr ax, 1
shr ax, 1
shr ax, 1
jnb short @@p10_maybe16
fmul e8
@@p10_maybe16:
jnz short @@keep_going
jmp short @@p10_checkSign
@@keep_going:
shr ax, 1
jnb short @@p10_maybe32
fmul e16
@@p10_maybe32:
shr ax, 1
jnb short @@p10_maybe64
fld tbyte ptr e32
fmulp st(1), st
@@p10_maybe64:
shr ax, 1
jnb short @@p10_maybe128
fld tbyte ptr e64
fmulp st(1), st
@@p10_maybe128:
shr ax, 1
jnb short @@p10_maybe256
fld tbyte ptr e128
fmulp st(1), st
@@p10_maybe256:
shr ax, 1
jnb short @@p10_maybe512
fld tbyte ptr e256
fmulp st(1), st
@@p10_maybe512:
shr ax, 1
jnb short @@p10_maybe1024
fld tbyte ptr e512
fmulp st(1), st
@@p10_maybe1024:
shr ax, 1
jnb short @@p10_maybe2048
fld tbyte ptr e1024
fmulp st(1), st
@@p10_maybe2048:
shr ax, 1
jnb short @@p10_maybe4096
fld tbyte ptr e2048
fmulp st(1), st
@@p10_maybe4096:
shr ax, 1
jnb short @@p10_checkSign
fld tbyte ptr e4096
fmulp st(1), st
@@p10_checkSign:
test byte ptr [bp+p+1], 80h
jz short @@p10_end
fdivr e0to7
@@p10_end:
pop si
pop bp
ret 2
__pow10 endp