From dfa3c073cfd0112ab834fbf7d1056e0aa2a090e3 Mon Sep 17 00:00:00 2001 From: Prajwal Hegde Date: Thu, 27 Apr 2023 14:38:36 -0500 Subject: [PATCH] arch-arm,cpu: Add four Arm SVE2 int instructions This changeset adds ARM SVE2 integer instructions - ADCLB, ADCLT, SBCLB, SBCLT - Decoding logic as per sve encoding of Version: 2023-03 Change-Id: I1bd3fe24b33677baa0b6da3c1dd7423f2b13b2c6 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70137 Tested-by: kokoro Reviewed-by: Giacomo Travaglini Maintainer: Giacomo Travaglini --- src/arch/arm/insts/sve.cc | 14 ++++++ src/arch/arm/insts/sve.hh | 17 +++++++ src/arch/arm/isa/formats/sve_2nd_level.isa | 46 +++++++++++++++++ src/arch/arm/isa/formats/sve_top_level.isa | 22 ++++++-- src/arch/arm/isa/insts/sve.isa | 58 ++++++++++++++++++++++ src/arch/arm/isa/templates/sve.isa | 26 ++++++++++ 6 files changed, 179 insertions(+), 4 deletions(-) diff --git a/src/arch/arm/insts/sve.cc b/src/arch/arm/insts/sve.cc index 546074c8fd..b0512817a8 100644 --- a/src/arch/arm/insts/sve.cc +++ b/src/arch/arm/insts/sve.cc @@ -435,6 +435,20 @@ SveTerPredOp::generateDisassembly( return ss.str(); } +std::string +SveTerUnpredOp::generateDisassembly( + Addr pc, const loader::SymbolTable *symtab) const +{ + std::stringstream ss; + printMnemonic(ss, "", false); + printVecReg(ss, dest, true); + ccprintf(ss, ", "); + printVecReg(ss, op1, true); + ccprintf(ss, ", "); + printVecReg(ss, op2, true); + return ss.str(); +} + std::string SveTerImmUnpredOp::generateDisassembly( Addr pc, const loader::SymbolTable *symtab) const diff --git a/src/arch/arm/insts/sve.hh b/src/arch/arm/insts/sve.hh index 66d82f0a3f..de1163ee81 100644 --- a/src/arch/arm/insts/sve.hh +++ b/src/arch/arm/insts/sve.hh @@ -498,6 +498,23 @@ class SveTerPredOp : public ArmStaticInst Addr pc, const loader::SymbolTable *symtab) const override; }; +///SVE2 Accumulate instructions +class SveTerUnpredOp : public ArmStaticInst +{ + protected: + RegIndex dest, op1, op2; + + SveTerUnpredOp(const char* mnem, ExtMachInst _machInst, + OpClass __opClass, RegIndex _dest, + RegIndex _op1, RegIndex _op2) : + ArmStaticInst(mnem, _machInst, __opClass), + dest(_dest), op1(_op1), op2(_op2) + {} + + std::string generateDisassembly( + Addr pc, const loader::SymbolTable *symtab) const override; +}; + /// Ternary with immediate, destructive, unpredicated SVE instruction. class SveTerImmUnpredOp : public ArmStaticInst { diff --git a/src/arch/arm/isa/formats/sve_2nd_level.isa b/src/arch/arm/isa/formats/sve_2nd_level.isa index 2ee3817445..4281eeb632 100644 --- a/src/arch/arm/isa/formats/sve_2nd_level.isa +++ b/src/arch/arm/isa/formats/sve_2nd_level.isa @@ -2283,6 +2283,52 @@ namespace Aarch64 return new Unknown64(machInst); } // decodeSveMultiplyIndexed + StaticInstPtr + decodeSve2ArithCarry(ExtMachInst machInst) + { + RegIndex zn = (RegIndex) (uint8_t) bits(machInst, 9, 5); + RegIndex zm = (RegIndex) (uint8_t) bits(machInst, 20, 16); + RegIndex zda = (RegIndex) (uint8_t) bits(machInst, 4, 0); + + uint8_t size = bits(machInst, 23, 22); + if (size & 0x2) { + if (bits(machInst, 10)){ + return decodeSveTerUnpred( + size, machInst, zda, zn, zm); + } else { + return decodeSveTerUnpred( + size, machInst, zda, zn, zm); + } + } else { + if (bits(machInst, 10)){ + return decodeSveTerUnpred( + size, machInst, zda, zn, zm); + } else { + return decodeSveTerUnpred( + size, machInst, zda, zn, zm); + } + } + return new Unknown64(machInst); + } //decodeSve2ArithCarry + + StaticInstPtr + decodeSve2Accum(ExtMachInst machInst) + { + uint8_t op0 = bits(machInst, 20, 17); + uint8_t op1 = bits(machInst, 13, 11); + if (op0 != 0 && op1 == 3) { + return new Unknown64(machInst); + } + switch (op1) { + case 2: + return decodeSve2ArithCarry(machInst); + default: + break; + } + + return new Unknown64(machInst); + } //decodeSve2Accum + StaticInstPtr decodeSveFpFastReduc(ExtMachInst machInst) { diff --git a/src/arch/arm/isa/formats/sve_top_level.isa b/src/arch/arm/isa/formats/sve_top_level.isa index 155ec1c42f..41861a87bc 100644 --- a/src/arch/arm/isa/formats/sve_top_level.isa +++ b/src/arch/arm/isa/formats/sve_top_level.isa @@ -69,6 +69,7 @@ namespace Aarch64 StaticInstPtr decodeSvePsel(ExtMachInst machInst); StaticInstPtr decodeSveIntWideImmUnpred(ExtMachInst machInst); StaticInstPtr decodeSveClamp(ExtMachInst machInst); + StaticInstPtr decodeSve2Accum(ExtMachInst machInst); StaticInstPtr decodeSveMultiplyAddUnpred(ExtMachInst machInst); StaticInstPtr decodeSveMultiplyIndexed(ExtMachInst machInst); @@ -173,10 +174,23 @@ namespace Aarch64 break; } case 0x2: - if (bits(machInst, 20)) { - return decodeSveIntWideImmPred(machInst); - } else { - return decodeSveLogMaskImm(machInst); + { + if (bits(machInst, 30) == 0) { + if (bits(machInst, 20)) { + return decodeSveIntWideImmPred(machInst); + } else { + return decodeSveLogMaskImm(machInst); + } + } else { + uint8_t b_15_14 = bits(machInst, 15, 14); + switch (b_15_14) { + case 3: + return decodeSve2Accum(machInst); + default : + break; + } + } + break; } case 0x3: { diff --git a/src/arch/arm/isa/insts/sve.isa b/src/arch/arm/isa/insts/sve.isa index 97d4ec7e56..4c10cd6443 100644 --- a/src/arch/arm/isa/insts/sve.isa +++ b/src/arch/arm/isa/insts/sve.isa @@ -926,6 +926,19 @@ output header {{ } } + // Decodes ternary, unpredicated SVE2 instructions + template