From patchwork Tue Aug 21 04:33:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 144677 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp4791815ljj; Mon, 20 Aug 2018 21:46:29 -0700 (PDT) X-Google-Smtp-Source: AA+uWPxkVtxiJz/5zvqtSsaHJ9gsPA4mPeAoPTCuj4/n+2Iy/SKn3bcR4AQk+x3UFNtzpqybwRCR X-Received: by 2002:ac8:705a:: with SMTP id y26-v6mr48925622qtm.118.1534826789474; Mon, 20 Aug 2018 21:46:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534826789; cv=none; d=google.com; s=arc-20160816; b=cx5Es+cWQ0By7JwwhGssYUFO421FhyEcxltacA0IBvPyIo7VtWECHKl4qbn6QrSyC6 BxdCF1W51MpvcmWLgesO4q+zb1IdTiYJhzK0z3GOf9WvCTZodekiRey98033E+hN5zoK LZ0zGf1blgDK2u8FQavQYVWnch+4Bc/Y0SgEluulHv5ksCQBW5q6vmEEUxIDVL0sEPtM dy9tqy87KAmfvzWEqhZtbwU9hjprFrIH4VTQycICqseRLrBctglEX3bIa0lNXOMDlvN1 JYddv3o9hICY5lIhnE+cRU37xP44sF/kHyY3oDAOxW6A2id0qGDuZ2CZa+qehXMzyVDe NnPQ== 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=JYpuZ8xb23Rvod7PHv/Y4zSD8LNGalXjv+VlXzCYnA4=; b=0Lst0omIVn8uonZOPzaeAp9JmhmTY5idbWDQNN7Uqh4cPpToomKBqp4Zckv95M5uG1 DCwQuUEcfXUHgV4Q86EYxpWpY3zoojqALvPmW7+6fmK8FrT/F2z5h68NFjPW8rNy2WVU 82ErH1c72pcw8WzayifTmZ7Oubhtz5sn736PM8JycVmPiBvFP+HySb/WqKvGW/h/dSW7 zPWTCji0zexuR/q7r335W3XBs83Kcucyj3UkvN2SOR9wk/YVl5k1KadxxqTce0iPULxb ZLb9a2h9Zi1ATVmcbay5UNGNppMqHFWPrROwbkTAt+DpGb3QQ6zz7R5VZA867DL+HoSF 3WyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gibson.dropbear.id.au header.s=201602 header.b=is6+Y61H; 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" Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id o80-v6si22843qkl.306.2018.08.20.21.46.29 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 20 Aug 2018 21:46:29 -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=@gibson.dropbear.id.au header.s=201602 header.b=is6+Y61H; 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" Received: from localhost ([::1]:50704 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fryYm-0007ri-TB for patch@linaro.org; Tue, 21 Aug 2018 00:46:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56510) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fryMt-0004C0-S9 for qemu-devel@nongnu.org; Tue, 21 Aug 2018 00:34:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fryMp-0000Mu-12 for qemu-devel@nongnu.org; Tue, 21 Aug 2018 00:34:11 -0400 Received: from ozlabs.org ([203.11.71.1]:43451) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fryMk-0000FP-Us; Tue, 21 Aug 2018 00:34:05 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41vd9F0586z9sCX; Tue, 21 Aug 2018 14:33:51 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1534826033; bh=qQXE9mfBFMcdiGpmvn+88VcQWkxQvr905pQllx6aO2g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=is6+Y61H3i0W3RRdjSh3dPHDCVXmpUGds63NIUIU5jCNaDV+IXaCbHf99Y4BPZIS9 2JCKyd+CjOacpWzrs8BkFBzf13perOIW6L5cDi8K9/VwmI75iHZ+WRl5WFWwsai+3E JUXuScsx7k+DauNEV9D9+kG6sWfJVE+3VJNXqKko= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 21 Aug 2018 14:33:22 +1000 Message-Id: <20180821043343.7514-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180821043343.7514-1-david@gibson.dropbear.id.au> References: <20180821043343.7514-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 05/26] 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: lvivier@redhat.com, aik@ozlabs.ru, Richard Henderson , groug@kaod.org, qemu-devel@nongnu.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Richard Henderson 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 Signed-off-by: David Gibson --- target/ppc/fpu_helper.c | 25 +++++++++++-------------- target/ppc/helper.h | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) -- 2.17.1 diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c index c20b9ae672..b9ee46eb5f 100644 --- a/target/ppc/fpu_helper.c +++ b/target/ppc/fpu_helper.c @@ -635,27 +635,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; - - farg1.ll = arg1; - farg2.ll = arg2; + float64 ret = float64_mul(arg1, arg2, &env->fp_status); + int status = get_float_exception_flags(&env->fp_status); - 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. */ diff --git a/target/ppc/helper.h b/target/ppc/helper.h index 1c453fa0f7..e4f7c55db9 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)