From patchwork Tue Jul 3 15:17:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 140974 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp1293860ljj; Tue, 3 Jul 2018 08:20:36 -0700 (PDT) X-Google-Smtp-Source: AAOMgpd1i00LXMGIQ5oHWvAb0DlLFxuFtB9TfJ/O5SbaZLDNC8mLphyuiK5nms4H0p6oFye6KLNK X-Received: by 2002:ac8:2d94:: with SMTP id p20-v6mr12661002qta.338.1530631236289; Tue, 03 Jul 2018 08:20:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530631236; cv=none; d=google.com; s=arc-20160816; b=VFUV8MqyZ6Yeb5O3jv2UG0e6dNCyCIIrxy11Rxc6MqutcnmYdCcy9uJ8sUfTOKi09E gGdwLXXega2uAoOA2Fn+3kfFPRaWmalv2gYpesrt2dhEY8qWxKAwOmtgCcODW4r2RQ9B 3FH+CW9frL6gOfIJPpfB7bQOivpMPhFa5Heu8z2vr9MRBuikIKOAwTwSP9gCui/7MfBO EYDwdjB0XdV63WOzO1QbzGsdf00ZtlYxtiQoaGjyhsUTnr2t2DkmUk+Q5ytwYgJYmqDP xti3Hv8xDh9SLnSKQAmF+VEG+ulXxanVuTRhYiA9heCxm6ZjwAomU2hVXKGFea5pdgmD d66g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature:arc-authentication-results; bh=kjNhSDETLhKZX1kPr5wWZdIwC2gZUpxU/1MvpywHh/8=; b=FbXndVa9OKEJyyC8TY7E31dtzopYOY8SZM/mi2VJB/52QgxkJG6MBuRFcMrMkSNgZI JcPF74F6vbZZccdi7G+0EcqeLxrTp7u3u2kcUrzjBHmLPCmZyWB9njTdfxjgUJS5jguK 2bbIn02GxfhWx1zCFqX+LHYMXW862N6ryme7RcCTfV4HRJ2b7a9PWbbqQwMTcumJCpsW s7q2Eks+QHgyNMJ7sU6Tr84zSZTjAQxoQoCK0iKcZF3mCXl26uBuAWlfnHmKfDXh0SWS QzVArSRaDcy1FxJp1kRgpJibMKDZeiE2ttJxfgNGQD599gGmsAlDv3z9hExsJxFdT39K NnjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=AYJ1TRV2; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id b103-v6si753469qkh.60.2018.07.03.08.20.35 for (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 03 Jul 2018 08:20:36 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=AYJ1TRV2; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:41049 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1faN6Z-00084M-AT for patch@linaro.org; Tue, 03 Jul 2018 11:20:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57696) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1faN3n-0006Ia-HR for qemu-devel@nongnu.org; Tue, 03 Jul 2018 11:17:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1faN3k-0000Nk-99 for qemu-devel@nongnu.org; Tue, 03 Jul 2018 11:17:41 -0400 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]:44464) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1faN3k-0000NB-3I for qemu-devel@nongnu.org; Tue, 03 Jul 2018 11:17:40 -0400 Received: by mail-pf0-x242.google.com with SMTP id j3-v6so1169497pfh.11 for ; Tue, 03 Jul 2018 08:17:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kjNhSDETLhKZX1kPr5wWZdIwC2gZUpxU/1MvpywHh/8=; b=AYJ1TRV2v5yc943DrtvdZ/FHOWru8oVjZgyd3YyGa+JA7RRl1ut+0tO33QYPCw9Fbb 9ls7eCBEc+staJkbGxHIL0uzGh3g6r5ZN/CbcwMeUu5RML+W0kWMuaURV9zS92SxAc0L S89KNgCqisgVPdEWxkrSRAF7ofdBtcdHUY3Ds= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kjNhSDETLhKZX1kPr5wWZdIwC2gZUpxU/1MvpywHh/8=; b=n78bHaBpeOZuE57qtGvv5dvQFt2EZi0DNAUa843MumBK6dn5mDVgjfN4W4HI2DpgxY v8lRP4UHIF//SNnOtyA7a9MX7MVpR1uqA1duuchsCK8+kl8LljQkTihVbSW3Ko1x8RFA mclT48aVHdR3NHpFG0VNUPujIzosOkmgzqHEoid3sUR0jrvJ15jYl2oFGb6tU96hcMon 8+jojHmzUPAyA6SCoUgHOXI6Zn5+V8oFahLVfk4Xx6PKj+TYctOOTZdr0a80SPczIqQg rT51/MffbNHJS0mLnHs0W6qiOiSZ5NnPodfjqR3BcePUxCThtATFrKUkedQhEb/gYI57 Hnfw== X-Gm-Message-State: APt69E3iyweKOAvgMbWjepknKpq/JrWXVYaK1e32KIXaIbxskQq9obqy 3BoYgoiajueLy15lbcYUUtNHtQqnIkk= X-Received: by 2002:a65:4541:: with SMTP id x1-v6mr20775618pgr.26.1530631058915; Tue, 03 Jul 2018 08:17:38 -0700 (PDT) Received: from cloudburst.twiddle.net (97-126-112-211.tukw.qwest.net. [97.126.112.211]) by smtp.gmail.com with ESMTPSA id s185-v6sm4834201pfb.116.2018.07.03.08.17.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Jul 2018 08:17:37 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Tue, 3 Jul 2018 08:17:28 -0700 Message-Id: <20180703151732.29843-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180703151732.29843-1-richard.henderson@linaro.org> References: <20180703151732.29843-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::242 Subject: [Qemu-devel] [PATCH 3/7] target/ppc: Tidy helper_fmul X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: programmingkidx@gmail.com, qemu-ppc@nongnu.org, david@gibson.dropbear.id.au Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Tidy the invalid exception checking so that we rely on softfloat for initial argument validation, and select the kind of invalid operand exception only when we know we must. Pass and return float64 values directly rather than bounce through the CPU_DoubleU union. Signed-off-by: Richard Henderson --- target/ppc/helper.h | 2 +- target/ppc/fpu_helper.c | 25 +++++++++++-------------- 2 files changed, 12 insertions(+), 15 deletions(-) -- 2.17.1 diff --git a/target/ppc/helper.h b/target/ppc/helper.h index 151437d8fc..7ddbc0fc19 100644 --- a/target/ppc/helper.h +++ b/target/ppc/helper.h @@ -87,7 +87,7 @@ DEF_HELPER_2(frim, i64, env, i64) DEF_HELPER_3(fadd, i64, env, i64, i64) DEF_HELPER_3(fsub, i64, env, i64, i64) -DEF_HELPER_3(fmul, i64, env, i64, i64) +DEF_HELPER_3(fmul, f64, env, f64, f64) DEF_HELPER_3(fdiv, f64, env, f64, f64) DEF_HELPER_4(fmadd, i64, env, i64, i64, i64) DEF_HELPER_4(fmsub, i64, env, i64, i64, i64) diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c index 0df7e31c10..5642734b5b 100644 --- a/target/ppc/fpu_helper.c +++ b/target/ppc/fpu_helper.c @@ -627,27 +627,24 @@ uint64_t helper_fsub(CPUPPCState *env, uint64_t arg1, uint64_t arg2) } /* fmul - fmul. */ -uint64_t helper_fmul(CPUPPCState *env, uint64_t arg1, uint64_t arg2) +float64 helper_fmul(CPUPPCState *env, float64 arg1, float64 arg2) { - CPU_DoubleU farg1, farg2; + float64 ret = float64_mul(arg1, arg2, &env->fp_status); + int status = get_float_exception_flags(&env->fp_status); - farg1.ll = arg1; - farg2.ll = arg2; - - if (unlikely((float64_is_infinity(farg1.d) && float64_is_zero(farg2.d)) || - (float64_is_zero(farg1.d) && float64_is_infinity(farg2.d)))) { - /* Multiplication of zero by infinity */ - farg1.ll = float_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1); - } else { - if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) || - float64_is_signaling_nan(farg2.d, &env->fp_status))) { + if (unlikely(status & float_flag_invalid)) { + if ((float64_is_infinity(arg1) && float64_is_zero(arg2)) || + (float64_is_zero(arg1) && float64_is_infinity(arg2))) { + /* Multiplication of zero by infinity */ + float_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1); + } else if (float64_is_signaling_nan(arg1, &env->fp_status) || + float64_is_signaling_nan(arg2, &env->fp_status)) { /* sNaN multiplication */ float_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1); } - farg1.d = float64_mul(farg1.d, farg2.d, &env->fp_status); } - return farg1.ll; + return ret; } /* fdiv - fdiv. */