[gem5-dev] [L] Change in gem5/gem5[develop]: arch-arm: Add support for Arm SVE fmmla instruction.
Bobby Bruce has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/70726?usp=email ) Change subject: arch-arm: Add support for Arm SVE fmmla instruction. .. arch-arm: Add support for Arm SVE fmmla instruction. Add support for the Arm SVE Floating Point Matrix Multiply-Accumulate (FMMLA) instruction. Both 32-bit element (single precision) and 64-bit element (double precision) encodings are implemented, but because the associated required instructions (LD1RO*, etc) have not yet been implemented, the SVE Feature ID register 0 (ID_AA64ZFR0_EL1) has only been updated to indicate 32-bit element support at this time. For more information please refer to the "ARM Architecture Reference Manual Supplement - The Scalable Vector Extension (SVE), for ARMv8-A" (https://developer.arm.com/architectures/cpu-architecture/a-profile/ docs/arm-architecture-reference-manual-supplement-armv8-a) Additional Contributors: Giacomo Travaglini Change-Id: If3547378ffa48527fe540767399bcc37a5dab524 Reviewed-by: Richard Cooper Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70726 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg Maintainer: Giacomo Travaglini Tested-by: kokoro Reviewed-by: Giacomo Travaglini --- M src/arch/arm/ArmISA.py M src/arch/arm/ArmSystem.py M src/arch/arm/insts/sve.hh A src/arch/arm/insts/vector_element_traits.hh M src/arch/arm/isa/formats/sve_2nd_level.isa M src/arch/arm/isa/formats/sve_top_level.isa M src/arch/arm/isa/includes.isa M src/arch/arm/isa/insts/sve.isa M src/arch/arm/isa/operands.isa M src/arch/arm/isa/templates/sve.isa M src/arch/arm/process.cc M src/arch/arm/regs/misc.cc 12 files changed, 291 insertions(+), 7 deletions(-) Approvals: Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved Andreas Sandberg: Looks good to me, approved; Looks good to me, approved kokoro: Regressions pass diff --git a/src/arch/arm/ArmISA.py b/src/arch/arm/ArmISA.py index 37970dc..31ecbcb 100644 --- a/src/arch/arm/ArmISA.py +++ b/src/arch/arm/ArmISA.py @@ -53,6 +53,7 @@ "FEAT_LSE", "FEAT_RDM", # Armv8.2 +"FEAT_F32MM", "FEAT_SVE", # Armv8.3 "FEAT_FCMA", diff --git a/src/arch/arm/ArmSystem.py b/src/arch/arm/ArmSystem.py index c1f5e9f..5a7ae79 100644 --- a/src/arch/arm/ArmSystem.py +++ b/src/arch/arm/ArmSystem.py @@ -78,6 +78,7 @@ "FEAT_UAO", "FEAT_LVA", # Optional in Armv8.2 "FEAT_LPA", # Optional in Armv8.2 +"FEAT_F32MM", # Optional in Armv8.2 # Armv8.3 "FEAT_FCMA", "FEAT_JSCVT", @@ -163,6 +164,7 @@ "FEAT_LVA", "FEAT_LPA", "FEAT_SVE", +"FEAT_F32MM", # Armv8.3 "FEAT_FCMA", "FEAT_JSCVT", @@ -196,6 +198,7 @@ "FEAT_LVA", "FEAT_LPA", "FEAT_SVE", +"FEAT_F32MM", ] diff --git a/src/arch/arm/insts/sve.hh b/src/arch/arm/insts/sve.hh index de1163e..dc18ff3 100644 --- a/src/arch/arm/insts/sve.hh +++ b/src/arch/arm/insts/sve.hh @@ -498,7 +498,7 @@ Addr pc, const loader::SymbolTable *symtab) const override; }; -///SVE2 Accumulate instructions +/// Ternary, destructive, unpredicated SVE instruction. class SveTerUnpredOp : public ArmStaticInst { protected: diff --git a/src/arch/arm/insts/vector_element_traits.hh b/src/arch/arm/insts/vector_element_traits.hh new file mode 100644 index 000..3495bef --- /dev/null +++ b/src/arch/arm/insts/vector_element_traits.hh @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED
[gem5-dev] [L] Change in gem5/gem5[develop]: arch-arm: Add support for Arm SVE fmmla instruction.
Attention is currently required from: Richard Cooper. Hello Richard Cooper, I'd like you to do a code review. Please visit https://gem5-review.googlesource.com/c/public/gem5/+/70726?usp=email to review the following change. Change subject: arch-arm: Add support for Arm SVE fmmla instruction. .. arch-arm: Add support for Arm SVE fmmla instruction. Add support for the Arm SVE Floating Point Matrix Multiply-Accumulate (FMMLA) instruction. Both 32-bit element (single precision) and 64-bit element (double precision) encodings are implemented, but because the associated required instructions (LD1RO*, etc) have not yet been implemented, the SVE Feature ID register 0 (ID_AA64ZFR0_EL1) has only been updated to indicate 32-bit element support at this time. For more information please refer to the "ARM Architecture Reference Manual Supplement - The Scalable Vector Extension (SVE), for ARMv8-A" (https://developer.arm.com/architectures/cpu-architecture/a-profile/ docs/arm-architecture-reference-manual-supplement-armv8-a) Additional Contributors: Giacomo Travaglini Change-Id: If3547378ffa48527fe540767399bcc37a5dab524 Reviewed-by: Richard Cooper --- M src/arch/arm/ArmISA.py M src/arch/arm/ArmSystem.py M src/arch/arm/insts/sve.cc M src/arch/arm/insts/sve.hh A src/arch/arm/insts/vector_element_traits.hh M src/arch/arm/isa/formats/sve_2nd_level.isa M src/arch/arm/isa/formats/sve_top_level.isa M src/arch/arm/isa/includes.isa M src/arch/arm/isa/insts/sve.isa M src/arch/arm/isa/operands.isa M src/arch/arm/isa/templates/sve.isa M src/arch/arm/regs/misc.cc 12 files changed, 319 insertions(+), 8 deletions(-) diff --git a/src/arch/arm/ArmISA.py b/src/arch/arm/ArmISA.py index 37970dc..31ecbcb 100644 --- a/src/arch/arm/ArmISA.py +++ b/src/arch/arm/ArmISA.py @@ -53,6 +53,7 @@ "FEAT_LSE", "FEAT_RDM", # Armv8.2 +"FEAT_F32MM", "FEAT_SVE", # Armv8.3 "FEAT_FCMA", diff --git a/src/arch/arm/ArmSystem.py b/src/arch/arm/ArmSystem.py index b826f0d..06d1dcc 100644 --- a/src/arch/arm/ArmSystem.py +++ b/src/arch/arm/ArmSystem.py @@ -78,6 +78,7 @@ "FEAT_UAO", "FEAT_LVA", # Optional in Armv8.2 "FEAT_LPA", # Optional in Armv8.2 +"FEAT_F32MM", # Optional in Armv8.2 # Armv8.3 "FEAT_FCMA", "FEAT_JSCVT", @@ -163,6 +164,7 @@ "FEAT_LVA", "FEAT_LPA", "FEAT_SVE", +"FEAT_F32MM", # Armv8.3 "FEAT_FCMA", "FEAT_JSCVT", @@ -196,6 +198,7 @@ "FEAT_LVA", "FEAT_LPA", "FEAT_SVE", +"FEAT_F32MM", ] diff --git a/src/arch/arm/insts/sve.cc b/src/arch/arm/insts/sve.cc index 546074c..b2f166e 100644 --- a/src/arch/arm/insts/sve.cc +++ b/src/arch/arm/insts/sve.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 ARM Limited + * Copyright (c) 2017-2020 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -436,6 +436,20 @@ } 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 66d82f0..73f4766 100644 --- a/src/arch/arm/insts/sve.hh +++ b/src/arch/arm/insts/sve.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 ARM Limited + * Copyright (c) 2017-2020 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -498,6 +498,22 @@ Addr pc, const loader::SymbolTable *symtab) const override; }; +/// Ternary, destructive, unpredicated SVE instruction. +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/insts/vector_element_traits.hh b/src/arch/arm/insts/vector_element_traits.hh new file mode 100644 index 000..3495bef --- /dev/null +++ b/src/arch/arm/insts/vector_element_traits.hh @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 ARM Limited + * All rights reserved + * + * The license below extends only to