diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-03-19 23:53:52 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-03-19 23:53:52 -0400 |
commit | 7513d3ecabb998e2c8c4cb9ed5de48c4b64a166b (patch) | |
tree | c9851d312fb15b1a5f427605a109f3563e8df0cc /src/math/i386/remquo.s | |
parent | 804fbf0b8c00fd4e2f37ef0769a610614d06138f (diff) | |
download | musl-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...
Diffstat (limited to 'src/math/i386/remquo.s')
-rw-r--r-- | src/math/i386/remquo.s | 43 |
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 |