about summary refs log tree commit diff
path: root/src/math/i386/remquo.s
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-03-19 23:53:52 -0400
committerRich Felker <dalias@aerifal.cx>2012-03-19 23:53:52 -0400
commit7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b (patch)
treec9851d312fb15b1a5f427605a109f3563e8df0cc /src/math/i386/remquo.s
parent804fbf0b8c00fd4e2f37ef0769a610614d06138f (diff)
downloadmusl-7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b.tar.gz
musl-7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b.tar.xz
musl-7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b.zip
remquo asm: return quotient mod 8, as intended by the spec
this is a lot more efficient and also what is generally wanted.
perhaps the bit shuffling could be more efficient...
Diffstat (limited to 'src/math/i386/remquo.s')
-rw-r--r--src/math/i386/remquo.s43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/math/i386/remquo.s b/src/math/i386/remquo.s
index 86ae2dc3..37a24450 100644
--- a/src/math/i386/remquo.s
+++ b/src/math/i386/remquo.s
@@ -2,40 +2,49 @@
 .type remquof,@function
 remquof:
 	mov 12(%esp),%ecx
-	fldl 4(%esp)
 	fldl 8(%esp)
+	fldl 4(%esp)
+	mov 11(%esp),%dh
+	xor 7(%esp),%dh
 	jmp 1f
 
 .global remquol
 .type remquol,@function
 remquol:
 	mov 28(%esp),%ecx
-	fldl 4(%esp)
 	fldl 16(%esp)
+	fldl 4(%esp)
+	mov 25(%esp),%dh
+	xor 13(%esp),%dh
 	jmp 1f
 
 .global remquo
 .type remquo,@function
 remquo:
 	mov 20(%esp),%ecx
-	fldl 4(%esp)
 	fldl 12(%esp)
-1:	fld %st(1)
+	fldl 4(%esp)
+	mov 19(%esp),%dh
+	xor 11(%esp),%dh
 1:      fprem1
 	fnstsw %ax
 	sahf
 	jp 1b
-	fsubr %st(0),%st(2)
-	fxch %st(2)
-	fdivp
-	mov $0x4f000000,%eax
-	mov %eax,4(%esp)
-	flds 4(%esp)
-	fxch %st(1)
-1:	fprem
-	fnstsw %ax
-	sahf
-	jp 1b
-	fistpl (%ecx)
-	fstp %st(0)
+	fstp %st(1)
+	mov %ah,%dl
+	shr %dl
+	and $1,%dl
+	mov %ah,%al
+	shr $5,%al
+	and $2,%al
+	or %al,%dl
+	mov %ah,%al
+	shl $2,%al
+	and $4,%al
+	or %al,%dl
+	test %dh,%dh
+	jns 1f
+	neg %dl
+1:	movsbl %dl,%edx
+	mov %edx,(%ecx)
 	ret