summaryrefslogtreecommitdiff
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
parent804fbf0b8c00fd4e2f37ef0769a610614d06138f (diff)
downloadmusl-7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b.tar.gz
musl-7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b.tar.bz2
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...
-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