# double cbrt(arg)
# double arg
# no error exits
#method: range reduction to [1/8,1], poly appox, newtons method
# J F Jarvis, August 10,1978
.globl	_cbrt
.text
.align	1
_cbrt:
	.word	0x00c0
	clrl	r3
	movd	4(ap),r4
	jgtr	range
	jeql	retz
	mnegd	r4,r4	# |arg| in r0,r1
	movl	$0x100,r3	# sign bit of result
range:
	extzv	$7,$8,r4,r6
	insv	$128,$7,$8,r4	# 0.5<= frac: r4,r5 <1.0
	clrl	r7
	ediv	$3,r6,r6,r7	# r6= expnt/3; r7= expnt%3
	addb2	$86,r6
	bisl2	r3,r6	# sign,exponent of result
	polyf	r4,$3,pcoef	# initial estimate is Hart&Cheney CBRT 0642
						# D=4.1
	muld3	r0,r0,r2	# Newtons method, iteration 1, H&C 6.1.10
	divd3	r2,r4,r2
	subd3	r2,r0,r2
	muld2	third,r2
	subd2	r2,r0	# D=8.2
	muld3	r0,r0,r2	# iteration 2
	divd3	r2,r4,r2
	subd3	r2,r0,r2
	muld2	third,r2
	subd2	r2,r0
	muld2	hc[r7],r0	# set range
	insv	r6,$7,$9,r0	# set sign,exponent
	ret
retz:
	clrd	r0
	ret
.data
.align	3
third: .double 0d0.33333333333333333333e+0
hc:
	.double 0d1.25992104989487316476e+0
	.double 0d1.58740105196819947475e+0
	.double	0d1.0e+0
pcoef:
	.float 0f0.1467073818e+0
	.float 0f-0.5173964673e+0
	.float 0f0.9319858515e+0
	.float 0f0.4387762363e+0
