From patchwork Mon Nov 2 17:09:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 320322 Delivered-To: patch@linaro.org Received: by 2002:a92:7b12:0:0:0:0:0 with SMTP id w18csp3895414ilc; Mon, 2 Nov 2020 09:13:09 -0800 (PST) X-Google-Smtp-Source: ABdhPJwIiQdpi3P7tF3ESnCJRx9nmJi2chuI9G77s/gq88oCyiw2ut9LkDwHlaBx45RECO91u3ix X-Received: by 2002:ac8:2af0:: with SMTP id c45mr15701843qta.4.1604337189126; Mon, 02 Nov 2020 09:13:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604337189; cv=none; d=google.com; s=arc-20160816; b=APhaBOG+uA77Sx9turIBy8HdZg7caDB5nULB8i/6Etx24q95ajg51Rew/Jk3zEHHn8 vl43kiGRxmpCde7PH517Q0jLJquHO/keqBSiR4rTMp5fj1/TQNmXDoS6gVNy9y+pF4oU Lx4qZKMMdAjzYc0wHLTIh65N+aAfQY2wptUOsHUKtzvPCb2aQSm6+zUyzk5uZqmZb+sL eilRkVa7wNKkZMM845j2p9cRisrIbmsGu6oZtFWvvEPO6mmd/hyNGtQpCTGbf40psYmO n4OMeLc50s5AKZkKpnmTASJFMJZvaYoYg8ijk+27HOHT3JhSX2mvig9VHKP2D9nbYasK lRXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=uOowFsU/Wl7DM2DhiQSboTeZ8PmxUU3zA8lUWHXMoCA=; b=qALSMil76Z1yXWXQAXtJLVSw/BFhguVEmw5B2rfwZox86XCRdMQrPxX4UC0wiFV2rp n/dphJ2hPWfp1T9tK1JZYZntiaCeAyUCTauswACHGLMyUBEd7zwwIpaFo33D6q2pqh/F +pVn/vbrSrd0777rMRVIQHsmx5yX55yA/4x0s+JA+tPnQ+eHnIOJZ+ZK2408OOb76pKP 5CqEhj8Pjva/bqWS7xeyajIju3AcK/51289s5V82q3T/FRJLqSV7nGqXGVtGVj3eJ19e NBZxmqcNn0GReljtjnClzuzqQc+rW43vNHlQPWMIQRcJftKnSSkMAHFk1fRSXA6KD8HN GJmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qtlOcKNH; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id bv14si9186310qvb.216.2020.11.02.09.13.09 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 02 Nov 2020 09:13:09 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qtlOcKNH; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:48490 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kZdOG-00046D-J8 for patch@linaro.org; Mon, 02 Nov 2020 12:13:08 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:53792) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kZdLX-0000dK-KA for qemu-devel@nongnu.org; Mon, 02 Nov 2020 12:10:19 -0500 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]:43584) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kZdLV-0006PD-IB for qemu-devel@nongnu.org; Mon, 02 Nov 2020 12:10:19 -0500 Received: by mail-wr1-x433.google.com with SMTP id g12so15468650wrp.10 for ; Mon, 02 Nov 2020 09:10:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=uOowFsU/Wl7DM2DhiQSboTeZ8PmxUU3zA8lUWHXMoCA=; b=qtlOcKNHD51bFJMnKxmfmDOoVCuBP0Vx2FGUlByo2agEZlknsXubwiOFl10ZpzXjZ1 SRELv2cUPfIgsJSpfIABJiBgiPm8q7V4YvjxrniHlHxZwvrr0wQQE26DxpN8NyZdNeK3 zDgmHTrv1knShz1RIlaq2qOUGzy5HwubnstHrxuapvkh/1l91XoDQO0csJy/TS6kASU4 IacZcRS5kwI7CT+bBT42CLswwmadMXdnOrn1k6J7jtqp1p60dOA6CMVKP31zZOs6lN3A Gf2wh1DZC54tkwfKLUNhAOg2MLRZhmQMM5nWIexkgQhqzikpV0slfTapforLly5z9x73 sVlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uOowFsU/Wl7DM2DhiQSboTeZ8PmxUU3zA8lUWHXMoCA=; b=HntypfU5iONwfJboBtS+d3gW2ju0w8y3W8vT55OrvJpumuWBUN9qRx7GIMua/mKfyW a8LirE6n0PXcfE866yUTU9EPllI5u7OsAkhbbDiXZvwQGoheWJ7Qxir9wwvmXVYr3xed cm9tC+F1bDcaJ976yCGXfuWBf5ItSzLELNPc5jYDu9oNjMXvmSseqdFT0QhnGQDgMRm1 RHHRpsMR+RLcXI37ZzNNka96LJjtJi/jJykH47om5Ch5RrPeqG87p+HD3MagH9AE80Bl annuYB4r+bK2h92BLedDPVapR1fp4DafWjurEdi5JV7vF3Pb23v/JCT4ZD7CXQXtQc9Z wl/g== X-Gm-Message-State: AOAM531qHfMRrVe78Y/85Quw6uabj7kiifWyuD0EuF1s293Exl1KdCUD XS692G4f8Uydk67Otx18ol4TJ/BBYVmBoA== X-Received: by 2002:adf:eec7:: with SMTP id a7mr21407223wrp.294.1604337015858; Mon, 02 Nov 2020 09:10:15 -0800 (PST) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id c18sm22396540wrt.10.2020.11.02.09.10.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Nov 2020 09:10:15 -0800 (PST) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 06/26] target/arm: Expand read/write_neon_element32 to all MemOp Date: Mon, 2 Nov 2020 17:09:45 +0000 Message-Id: <20201102171005.30690-7-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201102171005.30690-1-peter.maydell@linaro.org> References: <20201102171005.30690-1-peter.maydell@linaro.org> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::433; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x433.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Richard Henderson We can then use this to improve VMOV (scalar to gp) and VMOV (gp to scalar) so that we simply perform the memory operation that we wanted, rather than inserting or extracting from a 32-bit quantity. These were the last uses of neon_load/store_reg, so remove them. Signed-off-by: Richard Henderson Message-id: 20201030022618.785675-7-richard.henderson@linaro.org Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- target/arm/translate.c | 50 +++++++++++++----------- target/arm/translate-vfp.c.inc | 71 +++++----------------------------- 2 files changed, 37 insertions(+), 84 deletions(-) -- 2.20.1 diff --git a/target/arm/translate.c b/target/arm/translate.c index 0ed9eab0b0d..55d5f4ed73b 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -1106,9 +1106,9 @@ static long neon_full_reg_offset(unsigned reg) * Return the offset of a 2**SIZE piece of a NEON register, at index ELE, * where 0 is the least significant end of the register. */ -static long neon_element_offset(int reg, int element, MemOp size) +static long neon_element_offset(int reg, int element, MemOp memop) { - int element_size = 1 << size; + int element_size = 1 << (memop & MO_SIZE); int ofs = element * element_size; #ifdef HOST_WORDS_BIGENDIAN /* @@ -1132,19 +1132,6 @@ static long vfp_reg_offset(bool dp, unsigned reg) } } -static TCGv_i32 neon_load_reg(int reg, int pass) -{ - TCGv_i32 tmp = tcg_temp_new_i32(); - tcg_gen_ld_i32(tmp, cpu_env, neon_element_offset(reg, pass, MO_32)); - return tmp; -} - -static void neon_store_reg(int reg, int pass, TCGv_i32 var) -{ - tcg_gen_st_i32(var, cpu_env, neon_element_offset(reg, pass, MO_32)); - tcg_temp_free_i32(var); -} - static inline void neon_load_reg64(TCGv_i64 var, int reg) { tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(1, reg)); @@ -1165,12 +1152,25 @@ static inline void neon_store_reg32(TCGv_i32 var, int reg) tcg_gen_st_i32(var, cpu_env, vfp_reg_offset(false, reg)); } -static void read_neon_element32(TCGv_i32 dest, int reg, int ele, MemOp size) +static void read_neon_element32(TCGv_i32 dest, int reg, int ele, MemOp memop) { - long off = neon_element_offset(reg, ele, size); + long off = neon_element_offset(reg, ele, memop); - switch (size) { - case MO_32: + switch (memop) { + case MO_SB: + tcg_gen_ld8s_i32(dest, cpu_env, off); + break; + case MO_UB: + tcg_gen_ld8u_i32(dest, cpu_env, off); + break; + case MO_SW: + tcg_gen_ld16s_i32(dest, cpu_env, off); + break; + case MO_UW: + tcg_gen_ld16u_i32(dest, cpu_env, off); + break; + case MO_UL: + case MO_SL: tcg_gen_ld_i32(dest, cpu_env, off); break; default: @@ -1178,11 +1178,17 @@ static void read_neon_element32(TCGv_i32 dest, int reg, int ele, MemOp size) } } -static void write_neon_element32(TCGv_i32 src, int reg, int ele, MemOp size) +static void write_neon_element32(TCGv_i32 src, int reg, int ele, MemOp memop) { - long off = neon_element_offset(reg, ele, size); + long off = neon_element_offset(reg, ele, memop); - switch (size) { + switch (memop) { + case MO_8: + tcg_gen_st8_i32(src, cpu_env, off); + break; + case MO_16: + tcg_gen_st16_i32(src, cpu_env, off); + break; case MO_32: tcg_gen_st_i32(src, cpu_env, off); break; diff --git a/target/arm/translate-vfp.c.inc b/target/arm/translate-vfp.c.inc index 368bae0a73d..28f22f98729 100644 --- a/target/arm/translate-vfp.c.inc +++ b/target/arm/translate-vfp.c.inc @@ -511,11 +511,9 @@ static bool trans_VMOV_to_gp(DisasContext *s, arg_VMOV_to_gp *a) { /* VMOV scalar to general purpose register */ TCGv_i32 tmp; - int pass; - uint32_t offset; - /* SIZE == 2 is a VFP instruction; otherwise NEON. */ - if (a->size == 2 + /* SIZE == MO_32 is a VFP instruction; otherwise NEON. */ + if (a->size == MO_32 ? !dc_isar_feature(aa32_fpsp_v2, s) : !arm_dc_feature(s, ARM_FEATURE_NEON)) { return false; @@ -526,44 +524,12 @@ static bool trans_VMOV_to_gp(DisasContext *s, arg_VMOV_to_gp *a) return false; } - offset = a->index << a->size; - pass = extract32(offset, 2, 1); - offset = extract32(offset, 0, 2) * 8; - if (!vfp_access_check(s)) { return true; } - tmp = neon_load_reg(a->vn, pass); - switch (a->size) { - case 0: - if (offset) { - tcg_gen_shri_i32(tmp, tmp, offset); - } - if (a->u) { - gen_uxtb(tmp); - } else { - gen_sxtb(tmp); - } - break; - case 1: - if (a->u) { - if (offset) { - tcg_gen_shri_i32(tmp, tmp, 16); - } else { - gen_uxth(tmp); - } - } else { - if (offset) { - tcg_gen_sari_i32(tmp, tmp, 16); - } else { - gen_sxth(tmp); - } - } - break; - case 2: - break; - } + tmp = tcg_temp_new_i32(); + read_neon_element32(tmp, a->vn, a->index, a->size | (a->u ? 0 : MO_SIGN)); store_reg(s, a->rt, tmp); return true; @@ -572,12 +538,10 @@ static bool trans_VMOV_to_gp(DisasContext *s, arg_VMOV_to_gp *a) static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a) { /* VMOV general purpose register to scalar */ - TCGv_i32 tmp, tmp2; - int pass; - uint32_t offset; + TCGv_i32 tmp; - /* SIZE == 2 is a VFP instruction; otherwise NEON. */ - if (a->size == 2 + /* SIZE == MO_32 is a VFP instruction; otherwise NEON. */ + if (a->size == MO_32 ? !dc_isar_feature(aa32_fpsp_v2, s) : !arm_dc_feature(s, ARM_FEATURE_NEON)) { return false; @@ -588,30 +552,13 @@ static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a) return false; } - offset = a->index << a->size; - pass = extract32(offset, 2, 1); - offset = extract32(offset, 0, 2) * 8; - if (!vfp_access_check(s)) { return true; } tmp = load_reg(s, a->rt); - switch (a->size) { - case 0: - tmp2 = neon_load_reg(a->vn, pass); - tcg_gen_deposit_i32(tmp, tmp2, tmp, offset, 8); - tcg_temp_free_i32(tmp2); - break; - case 1: - tmp2 = neon_load_reg(a->vn, pass); - tcg_gen_deposit_i32(tmp, tmp2, tmp, offset, 16); - tcg_temp_free_i32(tmp2); - break; - case 2: - break; - } - neon_store_reg(a->vn, pass, tmp); + write_neon_element32(tmp, a->vn, a->index, a->size); + tcg_temp_free_i32(tmp); return true; }