From 993e3107af67edefcfc79a62ae55f7b98aa5151e Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 1 Apr 2019 15:58:37 +0700 Subject: [PATCH] alpha: Improve sysdeps/alpha/divqu.S and sysdeps/alpha/remqu.S MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * sysdeps/alpha/divqu.S (__divqu): Move save of $f0 and excb after conditional branch to DIVBYZERO. Fix unwind info. * sysdeps/alpha/remqu.S (__remqu): Move saves of $f0, $f1, $f2 and excb after conditional branch to $powerof2. Add missing unop instructions and .align directives and reorder instructions to match __divqu. Signed-off-by: Uroš Bizjak --- ChangeLog | 9 +++++++++ sysdeps/alpha/divqu.S | 7 ++++--- sysdeps/alpha/remqu.S | 16 +++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 54b90015ad..a514308225 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2019-04-01 Uros Bizjak + + * sysdeps/alpha/divqu.S (__divqu): Move save of $f0 and excb after + conditional branch to DIVBYZERO. Fix unwind info. + * sysdeps/alpha/remqu.S (__remqu): Move saves of $f0, $f1, $f2 and + excb after conditional branch to $powerof2. Add missing unop + instructions and .align directives and reorder instructions to + match __divqu. + 2019-04-01 Richard Henderson * sysdeps/unix/sysv/linux/alpha/kernel-features.h (__NR_shmat): diff --git a/sysdeps/alpha/divqu.S b/sysdeps/alpha/divqu.S index f5cedd0716..3165374b6d 100644 --- a/sysdeps/alpha/divqu.S +++ b/sysdeps/alpha/divqu.S @@ -56,10 +56,10 @@ __divqu: that's done, we have at least 22 cycles until its results are ready -- all the time in the world to figure out how we're going to use the results. */ - stt $f0, 0(sp) - excb beq Y, DIVBYZERO + stt $f0, 0(sp) + excb stt $f1, 8(sp) stt $f3, 48(sp) cfi_rel_offset ($f0, 0) @@ -70,6 +70,7 @@ __divqu: _ITOFT2 X, $f0, 16, Y, $f1, 24 cvtqt $f0, $f0 cvtqt $f1, $f1 + blt X, $x_is_neg divt/c $f0, $f1, $f0 @@ -90,12 +91,12 @@ __divqu: ldt $f0, 0(sp) ldt $f3, 48(sp) + lda sp, FRAME(sp) cfi_remember_state cfi_restore ($f0) cfi_restore ($f1) cfi_restore ($f3) cfi_def_cfa_offset (0) - lda sp, FRAME(sp) ret $31, (RA), 1 .align 4 diff --git a/sysdeps/alpha/remqu.S b/sysdeps/alpha/remqu.S index a240ee9735..3b6a62dd88 100644 --- a/sysdeps/alpha/remqu.S +++ b/sysdeps/alpha/remqu.S @@ -57,19 +57,19 @@ __remqu: ready -- all the time in the world to figure out how we're going to use the results. */ subq Y, 1, AT - stt $f0, 0(sp) and Y, AT, AT - - stt $f1, 8(sp) - excb - stt $f3, 48(sp) beq AT, $powerof2 + + stt $f0, 0(sp) + excb + stt $f1, 8(sp) + stt $f3, 48(sp) cfi_rel_offset ($f0, 0) cfi_rel_offset ($f1, 8) cfi_rel_offset ($f3, 48) + mf_fpcr $f3 _ITOFT2 X, $f0, 16, Y, $f1, 24 - mf_fpcr $f3 cvtqt $f0, $f0 cvtqt $f1, $f1 @@ -116,11 +116,13 @@ $x_is_neg: cfi_rel_offset ($f2, 24) _ITOFS AT, $f2, 16 + .align 4 addt $f0, $f2, $f0 + unop divt/c $f0, $f1, $f0 + unop /* Ok, we've now the divide issued. Continue with other checks. */ - .align 4 ldt $f1, 8(sp) unop ldt $f2, 24(sp)