diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | sysdeps/alpha/remqu.S | 19 |
2 files changed, 19 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index d2303fb151..4b56d0d434 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2004-03-30 Richard Henderson <rth@redhat.com> + + * sysdeps/alpha/remqu.S: Detect power-of-two special case. + 2004-03-30 Ulrich Drepper <drepper@redhat.com> * sysdeps/generic/libc-start.c (LIBC_START_MAIN) diff --git a/sysdeps/alpha/remqu.S b/sysdeps/alpha/remqu.S index 1a1dcad8a0..fa2eb626c7 100644 --- a/sysdeps/alpha/remqu.S +++ b/sysdeps/alpha/remqu.S @@ -54,24 +54,25 @@ __remqu: going to use the results. */ stq X, 16(sp) stq Y, 24(sp) - beq Y, DIVBYZERO + subq Y, 1, AT stt $f0, 0(sp) + and Y, AT, AT stt $f1, 8(sp) + beq AT, $powerof2 cfi_rel_offset ($f0, 0) cfi_rel_offset ($f1, 8) + ldt $f0, 16(sp) ldt $f1, 24(sp) - cvtqt $f0, $f0 cvtqt $f1, $f1 + blt X, $x_is_neg divt/c $f0, $f1, $f0 /* Check to see if Y was mis-converted as signed value. */ ldt $f1, 8(sp) - unop - nop blt Y, $y_is_neg /* Check to see if X fit in the double as an exact value. */ @@ -245,6 +246,16 @@ $y_is_neg: cfi_def_cfa_offset (0) ret $31, (RA), 1 + .align 4 + cfi_def_cfa_offset (FRAME) +$powerof2: + subq Y, 1, AT + beq Y, DIVBYZERO + and X, AT, RV + lda sp, FRAME(sp) + cfi_def_cfa_offset (0) + ret $31, (RA), 1 + cfi_endproc .size __remqu, .-__remqu |