From nobody Thu Nov 13 22:04:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail header.i=@quicinc.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=quicinc.com ARC-Seal: i=1; a=rsa-sha256; t=1582910968; cv=none; d=zohomail.com; s=zohoarc; b=UJcnlJLwnq4mipGZpIFdvcW/P9JR+9bbKfKRb9v53YVBr7seaR4Jxg9eBCxrRAEMhm+5Xh/0N31jvo8kO5Wb1itMG/h9kfbQebvt65tVFo40+iQjnT/xfsbhaFnt6/QkM6I9ZjSFfalY9xQF1XwDz2/2wzN9MxJsSW1GixMC6XQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1582910968; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=zBSsenuL99bAnEL69hm+U2pbTVoWHiQlIwHhAN1ZnmM=; b=Ps8YdWMtfiFm20A/qD+2U6LYGLnjqDZKZhvvRLDCLDtt41HmuOEUtJGP+RHnFaQiitrjng92W5Cgga3+oYba0CFeOLrpJ7KofMkb0fExKX8AlG1Ak9Z4gyW95RLMynMiyWKK0SLUtkpuhhMuOT9mAIwQnKAI2O4G/BJNCml5NKI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail header.i=@quicinc.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1582910968012834.4916525030835; Fri, 28 Feb 2020 09:29:28 -0800 (PST) Received: from localhost ([::1]:51316 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j7jS2-0007pG-D4 for importer@patchew.org; Fri, 28 Feb 2020 12:29:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58618) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j7imR-0005rU-PS for qemu-devel@nongnu.org; Fri, 28 Feb 2020 11:46:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j7imP-0007VI-M6 for qemu-devel@nongnu.org; Fri, 28 Feb 2020 11:46:27 -0500 Received: from alexa-out-sd-02.qualcomm.com ([199.106.114.39]:27049) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1j7imP-0005V5-8b for qemu-devel@nongnu.org; Fri, 28 Feb 2020 11:46:25 -0500 Received: from unknown (HELO ironmsg-SD-alpha.qualcomm.com) ([10.53.140.30]) by alexa-out-sd-02.qualcomm.com with ESMTP; 28 Feb 2020 08:44:34 -0800 Received: from vu-tsimpson-aus.qualcomm.com (HELO vu-tsimpson1-aus.qualcomm.com) ([10.222.150.1]) by ironmsg-SD-alpha.qualcomm.com with ESMTP; 28 Feb 2020 08:44:34 -0800 Received: by vu-tsimpson1-aus.qualcomm.com (Postfix, from userid 47164) id 2F6AA115A; Fri, 28 Feb 2020 10:44:34 -0600 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1582908385; x=1614444385; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zBSsenuL99bAnEL69hm+U2pbTVoWHiQlIwHhAN1ZnmM=; b=iPJhG3g7CGIYsXZYk20+TwfClykUZIBmkpTCNNVsyhO5xgi6e6qnj4Uy AZu2j6CJNeca6IFVzC1RXl4o2lmn2XcBW3HXrL3ouTa69lg4n5xH74RCy cQVo3nCMKvAhS+XTnP7xDLIrfrEh/2xh0JgnQPxSNnr6L4cJa8nzUGFGE Y=; From: Taylor Simpson To: qemu-devel@nongnu.org Subject: [RFC PATCH v2 66/67] Hexagon HVX translation Date: Fri, 28 Feb 2020 10:44:02 -0600 Message-Id: <1582908244-304-67-git-send-email-tsimpson@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1582908244-304-1-git-send-email-tsimpson@quicinc.com> References: <1582908244-304-1-git-send-email-tsimpson@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 199.106.114.39 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: , Cc: riku.voipio@iki.fi, richard.henderson@linaro.org, laurent@vivier.eu, Taylor Simpson , philmd@redhat.com, aleksandar.m.mail@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Changes to packet semantics to support HVX Signed-off-by: Taylor Simpson --- target/hexagon/translate.h | 30 ++++++++ target/hexagon/translate.c | 188 +++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 218 insertions(+) diff --git a/target/hexagon/translate.h b/target/hexagon/translate.h index 65b721e..481dbbd 100644 --- a/target/hexagon/translate.h +++ b/target/hexagon/translate.h @@ -32,6 +32,14 @@ typedef struct DisasContext { int ctx_preg_log[PRED_WRITES_MAX]; int ctx_preg_log_idx; uint8_t ctx_store_width[STORES_MAX]; + int ctx_temp_vregs_idx; + int ctx_temp_qregs_idx; + int ctx_vreg_log[NUM_VREGS]; + int ctx_vreg_is_predicated[NUM_VREGS]; + int ctx_vreg_log_idx; + int ctx_qreg_log[NUM_QREGS]; + int ctx_qreg_is_predicated[NUM_QREGS]; + int ctx_qreg_log_idx; } DisasContext; =20 static inline void ctx_log_reg_write(DisasContext *ctx, int rnum) @@ -54,6 +62,22 @@ static inline void ctx_log_pred_write(DisasContext *ctx,= int pnum) ctx->ctx_preg_log_idx++; } =20 +static inline void ctx_log_vreg_write(DisasContext *ctx, + int rnum, int is_predicated) +{ + ctx->ctx_vreg_log[ctx->ctx_vreg_log_idx] =3D rnum; + ctx->ctx_vreg_is_predicated[ctx->ctx_vreg_log_idx] =3D is_predicated; + ctx->ctx_vreg_log_idx++; +} + +static inline void ctx_log_qreg_write(DisasContext *ctx, + int rnum, int is_predicated) +{ + ctx->ctx_qreg_log[ctx->ctx_qreg_log_idx] =3D rnum; + ctx->ctx_qreg_is_predicated[ctx->ctx_qreg_log_idx] =3D is_predicated; + ctx->ctx_qreg_log_idx++; +} + extern TCGv hex_gpr[TOTAL_PER_THREAD_REGS]; extern TCGv hex_pred[NUM_PREGS]; extern TCGv hex_next_PC; @@ -74,9 +98,15 @@ extern TCGv llsc_val; extern TCGv_i64 llsc_val_i64; extern TCGv hex_is_gather_store_insn; extern TCGv hex_gather_issued; +extern TCGv hex_VRegs_updated_tmp; +extern TCGv hex_VRegs_updated; +extern TCGv hex_VRegs_select; +extern TCGv hex_QRegs_updated; =20 void hexagon_translate_init(void); extern void gen_exception(int excp); extern void gen_exception_debug(void); =20 +extern void gen_memcpy(TCGv_ptr dest, TCGv_ptr src, size_t n); + #endif diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c index 57ab294..f5c135b 100644 --- a/target/hexagon/translate.c +++ b/target/hexagon/translate.c @@ -51,6 +51,10 @@ TCGv llsc_val; TCGv_i64 llsc_val_i64; TCGv hex_is_gather_store_insn; TCGv hex_gather_issued; +TCGv hex_VRegs_updated_tmp; +TCGv hex_VRegs_updated; +TCGv hex_VRegs_select; +TCGv hex_QRegs_updated; =20 static const char * const hexagon_prednames[] =3D { "p0", "p1", "p2", "p3" @@ -137,6 +141,10 @@ static void gen_start_packet(DisasContext *ctx, packet= _t *pkt) /* Clear out the disassembly context */ ctx->ctx_reg_log_idx =3D 0; ctx->ctx_preg_log_idx =3D 0; + ctx->ctx_temp_vregs_idx =3D 0; + ctx->ctx_temp_qregs_idx =3D 0; + ctx->ctx_vreg_log_idx =3D 0; + ctx->ctx_qreg_log_idx =3D 0; for (i =3D 0; i < STORES_MAX; i++) { ctx->ctx_store_width[i] =3D 0; } @@ -155,6 +163,15 @@ static void gen_start_packet(DisasContext *ctx, packet= _t *pkt) tcg_gen_movi_tl(hex_next_PC, next_PC); } tcg_gen_movi_tl(hex_pred_written, 0); + + if (pkt->pkt_has_hvx) { + tcg_gen_movi_tl(hex_VRegs_updated_tmp, 0); + tcg_gen_movi_tl(hex_VRegs_updated, 0); + tcg_gen_movi_tl(hex_VRegs_select, 0); + tcg_gen_movi_tl(hex_QRegs_updated, 0); + tcg_gen_movi_tl(hex_is_gather_store_insn, 0); + tcg_gen_movi_tl(hex_gather_issued, 0); + } } =20 static int is_gather_store_insn(insn_t *insn) @@ -445,10 +462,163 @@ static bool process_change_of_flow(DisasContext *ctx= , packet_t *pkt) return false; } =20 +void gen_memcpy(TCGv_ptr dest, TCGv_ptr src, size_t n) +{ + TCGv_ptr d =3D tcg_temp_new_ptr(); + TCGv_ptr s =3D tcg_temp_new_ptr(); + int i; + + tcg_gen_addi_ptr(d, dest, 0); + tcg_gen_addi_ptr(s, src, 0); + if (n % 8 =3D=3D 0) { + TCGv_i64 temp =3D tcg_temp_new_i64(); + for (i =3D 0; i < n / 8; i++) { + tcg_gen_ld_i64(temp, s, 0); + tcg_gen_st_i64(temp, d, 0); + tcg_gen_addi_ptr(s, s, 8); + tcg_gen_addi_ptr(d, d, 8); + } + tcg_temp_free_i64(temp); + } else if (n % 4 =3D=3D 0) { + TCGv temp =3D tcg_temp_new(); + for (i =3D 0; i < n / 4; i++) { + tcg_gen_ld32u_tl(temp, s, 0); + tcg_gen_st32_tl(temp, d, 0); + tcg_gen_addi_ptr(s, s, 4); + tcg_gen_addi_ptr(d, d, 4); + } + tcg_temp_free(temp); + } else if (n % 2 =3D=3D 0) { + TCGv temp =3D tcg_temp_new(); + for (i =3D 0; i < n / 2; i++) { + tcg_gen_ld16u_tl(temp, s, 0); + tcg_gen_st16_tl(temp, d, 0); + tcg_gen_addi_ptr(s, s, 2); + tcg_gen_addi_ptr(d, d, 2); + } + tcg_temp_free(temp); + } else { + TCGv temp =3D tcg_temp_new(); + for (i =3D 0; i < n; i++) { + tcg_gen_ld8u_tl(temp, s, 0); + tcg_gen_st8_tl(temp, d, 0); + tcg_gen_addi_ptr(s, s, 1); + tcg_gen_addi_ptr(d, d, 1); + } + tcg_temp_free(temp); + } + + tcg_temp_free_ptr(d); + tcg_temp_free_ptr(s); +} + +static inline void gen_vec_copy(intptr_t dstoff, intptr_t srcoff, size_t s= ize) +{ + TCGv_ptr src =3D tcg_temp_new_ptr(); + TCGv_ptr dst =3D tcg_temp_new_ptr(); + tcg_gen_addi_ptr(src, cpu_env, srcoff); + tcg_gen_addi_ptr(dst, cpu_env, dstoff); + gen_memcpy(dst, src, size); + tcg_temp_free_ptr(src); + tcg_temp_free_ptr(dst); +} + +static inline bool pkt_has_hvx_store(packet_t *pkt) +{ + int i; + for (i =3D 0; i < pkt->num_insns; i++) { + int opcode =3D pkt->insn[i].opcode; + if (GET_ATTRIB(opcode, A_CVI) && GET_ATTRIB(opcode, A_STORE)) { + return true; + } + } + return false; +} + +static void gen_commit_hvx(DisasContext *ctx, packet_t *pkt) +{ + int i; + + /* + * for (i =3D 0; i < ctx->ctx_vreg_log_idx; i++) { + * int rnum =3D ctx->ctx_vreg_log[i]; + * if (ctx->ctx_vreg_is_predicated[i]) { + * if (env->VRegs_updated & (1 << rnum)) { + * env->VRegs[rnum] =3D env->future_VRegs[rnum]; + * } + * } else { + * env->VRegs[rnum] =3D env->future_VRegs[rnum]; + * } + * } + */ + for (i =3D 0; i < ctx->ctx_vreg_log_idx; i++) { + int rnum =3D ctx->ctx_vreg_log[i]; + int is_predicated =3D ctx->ctx_vreg_is_predicated[i]; + intptr_t dstoff =3D offsetof(CPUHexagonState, VRegs[rnum]); + intptr_t srcoff =3D offsetof(CPUHexagonState, future_VRegs[rnum]); + size_t size =3D sizeof(mmvector_t); + + if (is_predicated) { + TCGv cmp =3D tcg_temp_local_new(); + TCGLabel *label_skip =3D gen_new_label(); + + tcg_gen_andi_tl(cmp, hex_VRegs_updated, 1 << rnum); + tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip); + { + gen_vec_copy(dstoff, srcoff, size); + } + gen_set_label(label_skip); + tcg_temp_free(cmp); + } else { + gen_vec_copy(dstoff, srcoff, size); + } + } + + /* + * for (i =3D 0; i < ctx-_ctx_qreg_log_idx; i++) { + * int rnum =3D ctx->ctx_qreg_log[i]; + * if (ctx->ctx_qreg_is_predicated[i]) { + * if (env->QRegs_updated) & (1 << rnum)) { + * env->QRegs[rnum] =3D env->future_QRegs[rnum]; + * } + * } else { + * env->QRegs[rnum] =3D env->future_QRegs[rnum]; + * } + * } + */ + for (i =3D 0; i < ctx->ctx_qreg_log_idx; i++) { + int rnum =3D ctx->ctx_qreg_log[i]; + int is_predicated =3D ctx->ctx_qreg_is_predicated[i]; + intptr_t dstoff =3D offsetof(CPUHexagonState, QRegs[rnum]); + intptr_t srcoff =3D offsetof(CPUHexagonState, future_QRegs[rnum]); + size_t size =3D sizeof(mmqreg_t); + + if (is_predicated) { + TCGv cmp =3D tcg_temp_local_new(); + TCGLabel *label_skip =3D gen_new_label(); + + tcg_gen_andi_tl(cmp, hex_QRegs_updated, 1 << rnum); + tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip); + { + gen_vec_copy(dstoff, srcoff, size); + } + gen_set_label(label_skip); + tcg_temp_free(cmp); + } else { + gen_vec_copy(dstoff, srcoff, size); + } + } + + if (pkt_has_hvx_store(pkt)) { + gen_helper_commit_hvx_stores(cpu_env); + } +} + static void gen_exec_counters(packet_t *pkt) { int num_insns =3D pkt->num_insns; int num_real_insns =3D 0; + int num_hvx_insns =3D 0; int i; =20 for (i =3D 0; i < num_insns; i++) { @@ -457,6 +627,9 @@ static void gen_exec_counters(packet_t *pkt) !GET_ATTRIB(pkt->insn[i].opcode, A_IT_NOP)) { num_real_insns++; } + if (pkt->insn[i].hvx_resource) { + num_hvx_insns++; + } } =20 tcg_gen_addi_tl(hex_gpr[HEX_REG_QEMU_PKT_CNT], @@ -465,6 +638,10 @@ static void gen_exec_counters(packet_t *pkt) tcg_gen_addi_tl(hex_gpr[HEX_REG_QEMU_INSN_CNT], hex_gpr[HEX_REG_QEMU_INSN_CNT], num_real_insns); } + if (num_hvx_insns) { + tcg_gen_addi_tl(hex_gpr[HEX_REG_QEMU_HVX_CNT], + hex_gpr[HEX_REG_QEMU_HVX_CNT], num_hvx_insns); + } } =20 static void gen_commit_packet(DisasContext *ctx, packet_t *pkt) @@ -476,6 +653,9 @@ static void gen_commit_packet(DisasContext *ctx, packet= _t *pkt) process_store_log(ctx, pkt); process_dczeroa(ctx, pkt); end_tb |=3D process_change_of_flow(ctx, pkt); + if (pkt->pkt_has_hvx) { + gen_commit_hvx(ctx, pkt); + } gen_exec_counters(pkt); #if HEX_DEBUG { @@ -702,6 +882,14 @@ void hexagon_translate_init(void) "is_gather_store_insn"); hex_gather_issued =3D tcg_global_mem_new(cpu_env, offsetof(CPUHexagonState, gather_issued), "gather_issued"); + hex_VRegs_updated_tmp =3D tcg_global_mem_new(cpu_env, + offsetof(CPUHexagonState, VRegs_updated_tmp), "VRegs_updated_tmp"); + hex_VRegs_updated =3D tcg_global_mem_new(cpu_env, + offsetof(CPUHexagonState, VRegs_updated), "VRegs_updated"); + hex_VRegs_select =3D tcg_global_mem_new(cpu_env, + offsetof(CPUHexagonState, VRegs_select), "VRegs_select"); + hex_QRegs_updated =3D tcg_global_mem_new(cpu_env, + offsetof(CPUHexagonState, QRegs_updated), "QRegs_updated"); for (i =3D 0; i < STORES_MAX; i++) { sprintf(store_addr_names[i], "store_addr_%d", i); hex_store_addr[i] =3D tcg_global_mem_new(cpu_env, --=20 2.7.4