From patchwork Fri May 4 18:30:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 135022 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp381711lji; Fri, 4 May 2018 11:34:51 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpEqCF1v/b2kyApKy0qLRpEES8V6j15MiUnzmU+kuSrKJqpdX4tmlJe2sAvhVsZn+VRW/lm X-Received: by 2002:a0c:e849:: with SMTP id l9-v6mr8835968qvo.55.1525458891200; Fri, 04 May 2018 11:34:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525458891; cv=none; d=google.com; s=arc-20160816; b=gKSVpnkhbBPvcEBYHZ+DOLk9Qf6DomKaIKlZRjqUVW0QS/2+3w6pX3uP4FBrtN1rmE XqG4mtC2+nlYEH8aOzFADoDGfFKEr+NzKz9po2/srWuZ//K4U2Eu9mligunS6x40gqrI ZKHbmixf3Yz3DWarCNgXdH1bvSZwrrXdrUCcvFawJBpfzA6vcir07WGYt2W2R//qjyD/ NJ9Lelz2fYax3KPZCm3j4Bl/Io4HINO2laUOqTDR86Ik4oG6o53CqYjYZaA6hsEsKcxo 6goDVLZ5B/Stu8rackIuwuV9zwtgYWY0+8zvu2CrsGi6veY1dB8CWtJHLXmBL02oMVHM yTpQ== 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=2pebf/0PR+IvJNPCRpXipzxGfr/2aHKqB2n6O6kIo6g=; b=vWa+a4kqkmVkpq/Jm9xif6AaAdaOZUO0KcTC489Aq0PzzGHdQ+rH86ryPG8NYYI7Yi iJ+YAb8GmNWBwsuDe1pbD8uS8OOtpre8ZWVqg6VnzJuM+5YMawlc6vDqyKqZt/u4xPbg f2ByCK3tie0dpKx7hKNPTKsu5PI+L5Ah5t97wx++9rUrZN3yAOH6gxsnZ9ZRmWHUyejk 2CJSpCDif8UJb5OPodQ9Nc9N4ACgD2O69afn7MzxtPKF8kstH6A/7mMzS+FIGF4T4KHz RCL8K6jxoBxy/66Yyt9Q9SDnH2dpLqqYtzSda6KEZLoHazjNPURMob877hhV8syFHM8X i++w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=Sx5oaXRo; 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 r11-v6si1166193qta.137.2018.05.04.11.34.51 for (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 04 May 2018 11:34:51 -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=Sx5oaXRo; 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]:35995 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEfXe-0002ZZ-Jl for patch@linaro.org; Fri, 04 May 2018 14:34:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45597) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEfTW-0007Xi-Cm for qemu-devel@nongnu.org; Fri, 04 May 2018 14:30:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEfTV-00019i-FM for qemu-devel@nongnu.org; Fri, 04 May 2018 14:30:34 -0400 Received: from mail-pg0-x241.google.com ([2607:f8b0:400e:c05::241]:37438) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEfTV-00018y-B0 for qemu-devel@nongnu.org; Fri, 04 May 2018 14:30:33 -0400 Received: by mail-pg0-x241.google.com with SMTP id a13-v6so15979063pgu.4 for ; Fri, 04 May 2018 11:30:33 -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=2pebf/0PR+IvJNPCRpXipzxGfr/2aHKqB2n6O6kIo6g=; b=Sx5oaXRo4C8YWxHMGfFrR+PmOR9mtPX6JVxLGYYu3V3GG/7IRq6iEW8BjON1pnxMan 82mZsRnMFl7U7w4hlH3FPdHvVXffsSlJ2jCVsJy/kMjZ0nx3rONYNiyd7dJ+iV/vH5aL A+iKhdwzi15qC+hkm3xyOZVRmndVvLWfFCm44= 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=2pebf/0PR+IvJNPCRpXipzxGfr/2aHKqB2n6O6kIo6g=; b=SKqcTN5Y3WINZmGQW0DEdNvra84+wMoHmpdgNE4xhAyuAdQo2/k42L4PgM7AqA+fEJ X0h91zRXwjOZrXqqNT9G1Ga9bSjupX8d3wXSykzKn6TFw1AkTGs4xIJx4J4KN/yYAlA1 2NiXJyNCaM3aRIeAb33ICy4bJ2Ms7ofniWb+EDbnsdLWWFvfOZOTpeQO4y9zRIj94lJn 8D7KFMq2cj7zyuNKJxOwgJMCFRBVJVTW+hF2NH8EozFxqPHyzQKaclabsHWuwMhcpFqI +9BI7lkC3V/7jQrCGt8dPTwZ44mdyiFIswwJBn+Dzma5XVq0IF9yo5h6NID+rSEcUFDH z3GQ== X-Gm-Message-State: ALQs6tCyktC6bdrHRSE+9T4B3PsmX5raxSTUIEn72KFz123Jk2eH/ynd EDnYR0nG1b54Tfx5RdxJ3Ff0X5mejlA= X-Received: by 2002:a17:902:2f84:: with SMTP id t4-v6mr29620928plb.24.1525458632062; Fri, 04 May 2018 11:30:32 -0700 (PDT) Received: from cloudburst.twiddle.net (97-113-2-170.tukw.qwest.net. [97.113.2.170]) by smtp.gmail.com with ESMTPSA id r8-v6sm16987413pgn.2.2018.05.04.11.30.30 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 May 2018 11:30:31 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Fri, 4 May 2018 11:30:17 -0700 Message-Id: <20180504183021.19318-7-richard.henderson@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180504183021.19318-1-richard.henderson@linaro.org> References: <20180504183021.19318-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:c05::241 Subject: [Qemu-devel] [PATCH v2 06/10] target/riscv: Use new atomic min/max expanders 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: peter.maydell@linaro.org, qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Reviewed-by: Michael Clark Signed-off-by: Richard Henderson --- target/riscv/translate.c | 72 ++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 52 deletions(-) -- 2.14.3 diff --git a/target/riscv/translate.c b/target/riscv/translate.c index 808eab7f50..9cab717088 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -725,7 +725,6 @@ static void gen_atomic(DisasContext *ctx, uint32_t opc, TCGv src1, src2, dat; TCGLabel *l1, *l2; TCGMemOp mop; - TCGCond cond; bool aq, rl; /* Extract the size of the atomic operation. */ @@ -823,60 +822,29 @@ static void gen_atomic(DisasContext *ctx, uint32_t opc, tcg_gen_atomic_fetch_or_tl(src2, src1, src2, ctx->mem_idx, mop); gen_set_gpr(rd, src2); break; - case OPC_RISC_AMOMIN: - cond = TCG_COND_LT; - goto do_minmax; - case OPC_RISC_AMOMAX: - cond = TCG_COND_GT; - goto do_minmax; - case OPC_RISC_AMOMINU: - cond = TCG_COND_LTU; - goto do_minmax; - case OPC_RISC_AMOMAXU: - cond = TCG_COND_GTU; - goto do_minmax; - do_minmax: - /* Handle the RL barrier. The AQ barrier is handled along the - parallel path by the SC atomic cmpxchg. On the serial path, - of course, barriers do not matter. */ - if (rl) { - tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); - } - if (tb_cflags(ctx->tb) & CF_PARALLEL) { - l1 = gen_new_label(); - gen_set_label(l1); - } else { - l1 = NULL; - } - gen_get_gpr(src1, rs1); gen_get_gpr(src2, rs2); - if ((mop & MO_SSIZE) == MO_SL) { - /* Sign-extend the register comparison input. */ - tcg_gen_ext32s_tl(src2, src2); - } - dat = tcg_temp_local_new(); - tcg_gen_qemu_ld_tl(dat, src1, ctx->mem_idx, mop); - tcg_gen_movcond_tl(cond, src2, dat, src2, dat, src2); - - if (tb_cflags(ctx->tb) & CF_PARALLEL) { - /* Parallel context. Make this operation atomic by verifying - that the memory didn't change while we computed the result. */ - tcg_gen_atomic_cmpxchg_tl(src2, src1, dat, src2, ctx->mem_idx, mop); - - /* If the cmpxchg failed, retry. */ - /* ??? There is an assumption here that this will eventually - succeed, such that we don't live-lock. This is not unlike - a similar loop that the compiler would generate for e.g. - __atomic_fetch_and_xor, so don't worry about it. */ - tcg_gen_brcond_tl(TCG_COND_NE, dat, src2, l1); - } else { - /* Serial context. Directly store the result. */ - tcg_gen_qemu_st_tl(src2, src1, ctx->mem_idx, mop); - } - gen_set_gpr(rd, dat); - tcg_temp_free(dat); + tcg_gen_atomic_fetch_smin_tl(src2, src1, src2, ctx->mem_idx, mop); + gen_set_gpr(rd, src2); + break; + case OPC_RISC_AMOMAX: + gen_get_gpr(src1, rs1); + gen_get_gpr(src2, rs2); + tcg_gen_atomic_fetch_smax_tl(src2, src1, src2, ctx->mem_idx, mop); + gen_set_gpr(rd, src2); + break; + case OPC_RISC_AMOMINU: + gen_get_gpr(src1, rs1); + gen_get_gpr(src2, rs2); + tcg_gen_atomic_fetch_umin_tl(src2, src1, src2, ctx->mem_idx, mop); + gen_set_gpr(rd, src2); + break; + case OPC_RISC_AMOMAXU: + gen_get_gpr(src1, rs1); + gen_get_gpr(src2, rs2); + tcg_gen_atomic_fetch_umax_tl(src2, src1, src2, ctx->mem_idx, mop); + gen_set_gpr(rd, src2); break; default: