From 8dac7f572b2f490e16674cc7ed333dac5c93d280 Mon Sep 17 00:00:00 2001 From: Roger Chang Date: Mon, 8 May 2023 14:30:04 +0800 Subject: [PATCH] arch-riscv: Refactor RVC decode flow when funct4==0b1001 and op==C2 the compressed instruction 0x901e (c.add zero, t2) should be decoded as "c_add zero, t2" not c_ebreak Change-Id: Ib2bd4b4d9739aa27ad290ead313e95b11b1727d1 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70358 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/arch/riscv/isa/decoder.isa | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/arch/riscv/isa/decoder.isa b/src/arch/riscv/isa/decoder.isa index d89a0c9d5e..f22efb0bf0 100644 --- a/src/arch/riscv/isa/decoder.isa +++ b/src/arch/riscv/isa/decoder.isa @@ -365,27 +365,21 @@ decode QUADRANT default Unknown::unknown() { Rc1 = rvSext(Rc2); }}); } - 0x1: decode RC1 { - 0x0: SystemOp::c_ebreak({{ - if (RC2 != 0) { - return std::make_shared( - "source reg x1", machInst); - } - return std::make_shared(xc->pcState()); - }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); - default: decode RC2 { - 0x0: Jump::c_jalr({{ - if (RC1 == 0) { - return std::make_shared( - "source reg x0", machInst); - } + 0x1: decode RC2 { + 0x0: decode RC1 { + 0x0: SystemOp::c_ebreak({{ + return std::make_shared( + xc->pcState()); + }}, IsSerializeAfter, IsNonSpeculative, No_OpClass); + default: Jump::c_jalr({{ ra = rvSext(NPC); NPC = rvZext(Rc1); }}, IsIndirectControl, IsUncondControl, IsCall); - default: CompressedROp::c_add({{ - Rc1_sd = rvSext(Rc1_sd + Rc2_sd); - }}); } + default: CompressedROp::c_add({{ + // RC1 == 0 is HINT + Rc1_sd = rvSext(Rc1_sd + Rc2_sd); + }}); } } format CompressedStore {