From 7f2e40020cfc827f7e59670f8c400b0b9a704481 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 3 Jul 2014 12:36:34 -0700 Subject: [PATCH] target-alpha: Fix cvttq vs large integers The range +- 2**63 - 2**64 was returning the wrong truncated result. We also incorrectly signaled overflow for -2**63. Reported-by: Al Viro Signed-off-by: Richard Henderson --- target-alpha/fpu_helper.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/target-alpha/fpu_helper.c b/target-alpha/fpu_helper.c index 132b5a2a1a..9449c57243 100644 --- a/target-alpha/fpu_helper.c +++ b/target-alpha/fpu_helper.c @@ -453,12 +453,12 @@ static uint64_t do_cvttq(CPUAlphaState *env, uint64_t a, int roundmode) if (shift >= 0) { /* In this case the number is so large that we must shift the fraction left. There is no rounding to do. */ - exc = FPCR_IOV | FPCR_INE; - if (shift < 63) { + if (shift < 64) { ret = frac << shift; - if ((ret >> shift) == frac) { - exc = 0; - } + } + /* Check for overflow. Note the special case of -0x1p63. */ + if (shift >= 11 && a != 0xC3E0000000000000ull) { + exc = FPCR_IOV | FPCR_INE; } } else { uint64_t round; -- 2.11.0