From nobody Mon Feb 9 23:39:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1678177401387312.6736399289788; Tue, 7 Mar 2023 00:23:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZSar-00068k-W5; Tue, 07 Mar 2023 03:22:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZSap-000684-QP; Tue, 07 Mar 2023 03:22:43 -0500 Received: from smtp25.cstnet.cn ([159.226.251.25] helo=cstnet.cn) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZSam-0000AR-A6; Tue, 07 Mar 2023 03:22:43 -0500 Received: from localhost.localdomain (unknown [180.165.240.213]) by APP-05 (Coremail) with SMTP id zQCowACn0qJN8gZkNe6lDA--.36330S11; Tue, 07 Mar 2023 16:14:12 +0800 (CST) From: Weiwei Li To: richard.henderson@linaro.org, palmer@dabbelt.com, alistair.francis@wdc.com, bin.meng@windriver.com, qemu-riscv@nongnu.org, qemu-devel@nongnu.org Cc: wangjunqiang@iscas.ac.cn, lazyparser@gmail.com, Weiwei Li Subject: [PATCH v12 09/10] disas/riscv.c: add disasm support for Zc* Date: Tue, 7 Mar 2023 16:14:02 +0800 Message-Id: <20230307081403.61950-10-liweiwei@iscas.ac.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230307081403.61950-1-liweiwei@iscas.ac.cn> References: <20230307081403.61950-1-liweiwei@iscas.ac.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: zQCowACn0qJN8gZkNe6lDA--.36330S11 X-Coremail-Antispam: 1UD129KBjvJXoW3AF4DGw47WrWDXFyUuFW7Arb_yoWfZF1DpF 1rG343trWUKa4Sq3WfAFWUAas8trWUXr4xJaySy3Z3Casru343CF1jq3yavFykG3yrKr47 uFsxWa1jg3Z7JwUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26F4UJVW0owA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_GcCE 3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2I x0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8 JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vIr4 1l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK 67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI 8IcVAFwI0_JFI_Gr1lIxAIcVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJwCI42IY6xAIw20E Y4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267 AKxVW8Jr0_Cr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-Originating-IP: [180.165.240.213] X-CM-SenderInfo: 5olzvxxzhlqxpvfd2hldfou0/ 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; Received-SPF: pass client-ip=159.226.251.25; envelope-from=liweiwei@iscas.ac.cn; helo=cstnet.cn X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_PASS=-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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1678177402586100001 Content-Type: text/plain; charset="utf-8" Zcmp/Zcmt instructions will override disasm for c.fld*/c.fsd* instructions currently. Signed-off-by: Weiwei Li Signed-off-by: Junqiang Wang Acked-by: Alistair Francis --- disas/riscv.c | 228 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 227 insertions(+), 1 deletion(-) diff --git a/disas/riscv.c b/disas/riscv.c index 54455aaaa8..189214c41f 100644 --- a/disas/riscv.c +++ b/disas/riscv.c @@ -163,6 +163,13 @@ typedef enum { rv_codec_v_i, rv_codec_vsetvli, rv_codec_vsetivli, + rv_codec_zcb_ext, + rv_codec_zcb_mul, + rv_codec_zcb_lb, + rv_codec_zcb_lh, + rv_codec_zcmp_cm_pushpop, + rv_codec_zcmp_cm_mv, + rv_codec_zcmt_jt, } rv_codec; =20 typedef enum { @@ -935,6 +942,26 @@ typedef enum { rv_op_vsetvli =3D 766, rv_op_vsetivli =3D 767, rv_op_vsetvl =3D 768, + rv_op_c_zext_b =3D 769, + rv_op_c_sext_b =3D 770, + rv_op_c_zext_h =3D 771, + rv_op_c_sext_h =3D 772, + rv_op_c_zext_w =3D 773, + rv_op_c_not =3D 774, + rv_op_c_mul =3D 775, + rv_op_c_lbu =3D 776, + rv_op_c_lhu =3D 777, + rv_op_c_lh =3D 778, + rv_op_c_sb =3D 779, + rv_op_c_sh =3D 780, + rv_op_cm_push =3D 781, + rv_op_cm_pop =3D 782, + rv_op_cm_popret =3D 783, + rv_op_cm_popretz =3D 784, + rv_op_cm_mva01s =3D 785, + rv_op_cm_mvsa01 =3D 786, + rv_op_cm_jt =3D 787, + rv_op_cm_jalt =3D 788, } rv_op; =20 /* structures */ @@ -958,6 +985,7 @@ typedef struct { uint8_t rnum; uint8_t vm; uint32_t vzimm; + uint8_t rlist; } rv_decode; =20 typedef struct { @@ -1070,6 +1098,10 @@ static const char rv_vreg_name_sym[32][4] =3D { #define rv_fmt_vd_vm "O\tDm" #define rv_fmt_vsetvli "O\t0,1,v" #define rv_fmt_vsetivli "O\t0,u,v" +#define rv_fmt_rs1_rs2_zce_ldst "O\t2,i(1)" +#define rv_fmt_push_rlist "O\tx,-i" +#define rv_fmt_pop_rlist "O\tx,i" +#define rv_fmt_zcmt_index "O\ti" =20 /* pseudo-instruction constraints */ =20 @@ -2065,7 +2097,27 @@ const rv_opcode_data opcode_data[] =3D { { "vsext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf8, = rv_op_vsext_vf8, 0 }, { "vsetvli", rv_codec_vsetvli, rv_fmt_vsetvli, NULL, rv_op_vsetvli, rv= _op_vsetvli, 0 }, { "vsetivli", rv_codec_vsetivli, rv_fmt_vsetivli, NULL, rv_op_vsetivli= , rv_op_vsetivli, 0 }, - { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, rv_op_vsetvl, rv_op_v= setvl, 0 } + { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, rv_op_vsetvl, rv_op_v= setvl, 0 }, + { "c.zext.b", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.sext.b", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.zext.h", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.sext.h", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.zext.w", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.not", rv_codec_zcb_ext, rv_fmt_rd, NULL, 0 }, + { "c.mul", rv_codec_zcb_mul, rv_fmt_rd_rs2, NULL, 0, 0 }, + { "c.lbu", rv_codec_zcb_lb, rv_fmt_rs1_rs2_zce_ldst, NULL, 0, 0, 0 }, + { "c.lhu", rv_codec_zcb_lh, rv_fmt_rs1_rs2_zce_ldst, NULL, 0, 0, 0 }, + { "c.lh", rv_codec_zcb_lh, rv_fmt_rs1_rs2_zce_ldst, NULL, 0, 0, 0 }, + { "c.sb", rv_codec_zcb_lb, rv_fmt_rs1_rs2_zce_ldst, NULL, 0, 0, 0 }, + { "c.sh", rv_codec_zcb_lh, rv_fmt_rs1_rs2_zce_ldst, NULL, 0, 0, 0 }, + { "cm.push", rv_codec_zcmp_cm_pushpop, rv_fmt_push_rlist, NULL, 0, 0 }, + { "cm.pop", rv_codec_zcmp_cm_pushpop, rv_fmt_pop_rlist, NULL, 0, 0 }, + { "cm.popret", rv_codec_zcmp_cm_pushpop, rv_fmt_pop_rlist, NULL, 0, 0,= 0 }, + { "cm.popretz", rv_codec_zcmp_cm_pushpop, rv_fmt_pop_rlist, NULL, 0, 0= }, + { "cm.mva01s", rv_codec_zcmp_cm_mv, rv_fmt_rd_rs2, NULL, 0, 0, 0 }, + { "cm.mvsa01", rv_codec_zcmp_cm_mv, rv_fmt_rd_rs2, NULL, 0, 0, 0 }, + { "cm.jt", rv_codec_zcmt_jt, rv_fmt_zcmt_index, NULL, 0 }, + { "cm.jalt", rv_codec_zcmt_jt, rv_fmt_zcmt_index, NULL, 0 }, }; =20 /* CSR names */ @@ -2084,6 +2136,7 @@ static const char *csr_name(int csrno) case 0x000a: return "vxrm"; case 0x000f: return "vcsr"; case 0x0015: return "seed"; + case 0x0017: return "jvt"; case 0x0040: return "uscratch"; case 0x0041: return "uepc"; case 0x0042: return "ucause"; @@ -2306,6 +2359,24 @@ static void decode_inst_opcode(rv_decode *dec, rv_is= a isa) op =3D rv_op_c_ld; } break; + case 4: + switch ((inst >> 10) & 0b111) { + case 0: op =3D rv_op_c_lbu; break; + case 1: + if (((inst >> 6) & 1) =3D=3D 0) { + op =3D rv_op_c_lhu; + } else { + op =3D rv_op_c_lh; + } + break; + case 2: op =3D rv_op_c_sb; break; + case 3: + if (((inst >> 6) & 1) =3D=3D 0) { + op =3D rv_op_c_sh; + } + break; + } + break; case 5: if (isa =3D=3D rv128) { op =3D rv_op_c_sq; @@ -2362,6 +2433,17 @@ static void decode_inst_opcode(rv_decode *dec, rv_is= a isa) case 3: op =3D rv_op_c_and; break; case 4: op =3D rv_op_c_subw; break; case 5: op =3D rv_op_c_addw; break; + case 6: op =3D rv_op_c_mul; break; + case 7: + switch ((inst >> 2) & 0b111) { + case 0: op =3D rv_op_c_zext_b; break; + case 1: op =3D rv_op_c_sext_b; break; + case 2: op =3D rv_op_c_zext_h; break; + case 3: op =3D rv_op_c_sext_h; break; + case 4: op =3D rv_op_c_zext_w; break; + case 5: op =3D rv_op_c_not; break; + } + break; } break; } @@ -2417,6 +2499,46 @@ static void decode_inst_opcode(rv_decode *dec, rv_is= a isa) op =3D rv_op_c_sqsp; } else { op =3D rv_op_c_fsdsp; + if (((inst >> 12) & 0b01)) { + switch ((inst >> 8) & 0b01111) { + case 8: + if (((inst >> 4) & 0b01111) >=3D 4) { + op =3D rv_op_cm_push; + } + break; + case 10: + if (((inst >> 4) & 0b01111) >=3D 4) { + op =3D rv_op_cm_pop; + } + break; + case 12: + if (((inst >> 4) & 0b01111) >=3D 4) { + op =3D rv_op_cm_popretz; + } + break; + case 14: + if (((inst >> 4) & 0b01111) >=3D 4) { + op =3D rv_op_cm_popret; + } + break; + } + } else { + switch ((inst >> 10) & 0b011) { + case 0: + if (((inst >> 2) & 0xFF) >=3D 32) { + op =3D rv_op_cm_jalt; + } else { + op =3D rv_op_cm_jt; + } + break; + case 3: + switch ((inst >> 5) & 0b011) { + case 1: op =3D rv_op_cm_mvsa01; break; + case 3: op =3D rv_op_cm_mva01s; break; + } + break; + } + } } break; case 6: op =3D rv_op_c_swsp; break; @@ -3661,6 +3783,21 @@ static uint32_t operand_crs2q(rv_inst inst) return (inst << 59) >> 61; } =20 +static uint32_t calculate_xreg(uint32_t sreg) +{ + return sreg < 2 ? sreg + 8 : sreg + 16; +} + +static uint32_t operand_sreg1(rv_inst inst) +{ + return calculate_xreg((inst << 54) >> 61); +} + +static uint32_t operand_sreg2(rv_inst inst) +{ + return calculate_xreg((inst << 59) >> 61); +} + static uint32_t operand_crd(rv_inst inst) { return (inst << 52) >> 59; @@ -3883,6 +4020,46 @@ static uint32_t operand_vm(rv_inst inst) return (inst << 38) >> 63; } =20 +static uint32_t operand_uimm_c_lb(rv_inst inst) +{ + return (((inst << 58) >> 63) << 1) | + ((inst << 57) >> 63); +} + +static uint32_t operand_uimm_c_lh(rv_inst inst) +{ + return (((inst << 58) >> 63) << 1); +} + +static uint32_t operand_zcmp_spimm(rv_inst inst) +{ + return ((inst << 60) >> 62) << 4; +} + +static uint32_t operand_zcmp_rlist(rv_inst inst) +{ + return ((inst << 56) >> 60); +} + +static uint32_t calculate_stack_adj(rv_isa isa, uint32_t rlist, uint32_t s= pimm) +{ + int xlen_bytes_log2 =3D isa =3D=3D rv64 ? 3 : 2; + int regs =3D rlist =3D=3D 15 ? 13 : rlist - 3; + uint32_t stack_adj_base =3D ROUND_UP(regs << xlen_bytes_log2, 16); + return stack_adj_base + spimm; +} + +static uint32_t operand_zcmp_stack_adj(rv_inst inst, rv_isa isa) +{ + return calculate_stack_adj(isa, operand_zcmp_rlist(inst), + operand_zcmp_spimm(inst)); +} + +static uint32_t operand_tbl_index(rv_inst inst) +{ + return ((inst << 54) >> 56); +} + /* decode operands */ =20 static void decode_inst_operands(rv_decode *dec, rv_isa isa) @@ -4199,6 +4376,34 @@ static void decode_inst_operands(rv_decode *dec, rv_= isa isa) dec->imm =3D operand_vimm(inst); dec->vzimm =3D operand_vzimm10(inst); break; + case rv_codec_zcb_lb: + dec->rs1 =3D operand_crs1q(inst) + 8; + dec->rs2 =3D operand_crs2q(inst) + 8; + dec->imm =3D operand_uimm_c_lb(inst); + break; + case rv_codec_zcb_lh: + dec->rs1 =3D operand_crs1q(inst) + 8; + dec->rs2 =3D operand_crs2q(inst) + 8; + dec->imm =3D operand_uimm_c_lh(inst); + break; + case rv_codec_zcb_ext: + dec->rd =3D operand_crs1q(inst) + 8; + break; + case rv_codec_zcb_mul: + dec->rd =3D operand_crs1rdq(inst) + 8; + dec->rs2 =3D operand_crs2q(inst) + 8; + break; + case rv_codec_zcmp_cm_pushpop: + dec->imm =3D operand_zcmp_stack_adj(inst, isa); + dec->rlist =3D operand_zcmp_rlist(inst); + break; + case rv_codec_zcmp_cm_mv: + dec->rd =3D operand_sreg1(inst); + dec->rs2 =3D operand_sreg2(inst); + break; + case rv_codec_zcmt_jt: + dec->imm =3D operand_tbl_index(inst); + break; }; } =20 @@ -4358,6 +4563,9 @@ static void format_inst(char *buf, size_t buflen, siz= e_t tab, rv_decode *dec) case ')': append(buf, ")", buflen); break; + case '-': + append(buf, "-", buflen); + break; case 'b': snprintf(tmp, sizeof(tmp), "%d", dec->bs); append(buf, tmp, buflen); @@ -4541,6 +4749,24 @@ static void format_inst(char *buf, size_t buflen, si= ze_t tab, rv_decode *dec) append(buf, vma, buflen); break; } + case 'x': { + switch (dec->rlist) { + case 4: + snprintf(tmp, sizeof(tmp), "{ra}"); + break; + case 5: + snprintf(tmp, sizeof(tmp), "{ra, s0}"); + break; + case 15: + snprintf(tmp, sizeof(tmp), "{ra, s0-s11}"); + break; + default: + snprintf(tmp, sizeof(tmp), "{ra, s0-s%d}", dec->rlist - 5); + break; + } + append(buf, tmp, buflen); + break; + } default: break; } --=20 2.25.1