[gem5-dev] [M] Change in gem5/gem5[develop]: arch-arm: Add support for Arm SVE Integer Matrix instructions.

2023-05-25 Thread Bobby Bruce (Gerrit) via gem5-dev
Bobby Bruce has submitted this change. (  
https://gem5-review.googlesource.com/c/public/gem5/+/70730?usp=email )


 (

6 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the  
submitted one.
 )Change subject: arch-arm: Add support for Arm SVE Integer Matrix  
instructions.

..

arch-arm: Add support for Arm SVE Integer Matrix instructions.

Add support for the Arm SVE Integer Matrix Multiply-Accumulate
(SMMLA, USMMLA, UMMLA) instructions. Because the associated SUDOT and
USDOT instructions have not yet been implemented, the SVE Feature ID
register 0 (ID_AA64ZFR0_EL1) has not yet been updated to indicate
support for SVE Int8 matrix multiplication instructions 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: Ia50e28fae03634cbe04b42a9900bab65a604817f
Reviewed-by: Richard Cooper 
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/70730
Maintainer: Andreas Sandberg 
Tested-by: kokoro 
Reviewed-by: Andreas Sandberg 
---
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/insts/sve.isa
3 files changed, 70 insertions(+), 0 deletions(-)

Approvals:
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/arch/arm/isa/formats/sve_2nd_level.isa  
b/src/arch/arm/isa/formats/sve_2nd_level.isa

index 3d211bc..4a44bab 100644
--- a/src/arch/arm/isa/formats/sve_2nd_level.isa
+++ b/src/arch/arm/isa/formats/sve_2nd_level.isa
@@ -246,6 +246,33 @@
 }  // decodeSveIntMulAdd

 StaticInstPtr
+decodeSveIntMatMulAdd(ExtMachInst machInst)
+{
+RegIndex zda = (RegIndex) (uint8_t) bits(machInst, 4, 0);
+RegIndex zn = (RegIndex) (uint8_t) bits(machInst, 9, 5);
+RegIndex zm = (RegIndex) (uint8_t) bits(machInst, 20, 16);
+
+uint8_t uns = bits(machInst, 23, 22);
+
+switch (uns) {
+  case 0x0:
+return new SveSmmla(
+ machInst, zda, zn, zm);
+  case 0x2:
+return new SveUsmmla(
+ machInst, zda, zn, zm);
+  case 0x3:
+return new SveUmmla(
+ machInst, zda, zn, zm);
+  case 0x1:
+  default:
+return new Unknown64(machInst);
+}
+
+return new Unknown64(machInst);
+}  // decodeSveIntMatMulAdd
+
+StaticInstPtr
 decodeSveShiftByImmPred0(ExtMachInst machInst)
 {
 RegIndex zdn = (RegIndex) (uint8_t) bits(machInst, 4, 0);
@@ -3809,5 +3836,21 @@
 return new Unknown64(machInst);
 }  // decodeSveMemStore

+StaticInstPtr
+decodeSveMisc(ExtMachInst machInst) {
+switch(bits(machInst, 13, 10)) {
+  case 0b0110: {
+  return decodeSveIntMatMulAdd(machInst);
+  break;
+  }
+  default: {
+  return new Unknown64(machInst);
+  break;
+  }
+}
+return new Unknown64(machInst);
+}  // decodeSveMisc
+
+
 }  // namespace Aarch64
 }};
diff --git a/src/arch/arm/isa/formats/sve_top_level.isa  
b/src/arch/arm/isa/formats/sve_top_level.isa

index 61f2f5c..20a15a2 100644
--- a/src/arch/arm/isa/formats/sve_top_level.isa
+++ b/src/arch/arm/isa/formats/sve_top_level.isa
@@ -44,6 +44,7 @@
 StaticInstPtr decodeSveShiftByImmPred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntArithUnaryPred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntMulAdd(ExtMachInst machInst);
+StaticInstPtr decodeSveIntMatMulAdd(ExtMachInst machInst);
 StaticInstPtr decodeSveIntArithUnpred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntLogUnpred(ExtMachInst machInst);
 StaticInstPtr decodeSveIndexGen(ExtMachInst machInst);
@@ -94,6 +95,8 @@
 StaticInstPtr decodeSveMemContigLoad(ExtMachInst machInst);
 StaticInstPtr decodeSveMemGather64(ExtMachInst machInst);
 StaticInstPtr decodeSveMemStore(ExtMachInst machInst);
+
+StaticInstPtr decodeSveMisc(ExtMachInst machInst);
 }
 }};

@@ -104,6 +107,14 @@
 StaticInstPtr
 decodeSveInt(ExtMachInst machInst)
 {
+if (bits(machInst, 31, 29) == 0b010) {
+if (bits(machInst, 24) == 0b1 &&
+bits(machInst, 21) == 0b0 &&
+bits(machInst, 15, 14)==0b10) {
+return decodeSveMisc(machInst);
+}
+}
+
 uint8_t b_29_24_21 = (bits(machInst, 29) << 2) |
  (bits(machInst, 24) << 1) |
  bits(machInst, 21);
diff --git a/src/arch/arm/isa/insts/sve.isa 

[gem5-dev] [M] Change in gem5/gem5[develop]: arch-arm: Add support for Arm SVE Integer Matrix instructions.

2023-05-17 Thread Giacomo Travaglini (Gerrit) via gem5-dev

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/+/70730?usp=email

to review the following change.


Change subject: arch-arm: Add support for Arm SVE Integer Matrix  
instructions.

..

arch-arm: Add support for Arm SVE Integer Matrix instructions.

Add support for the Arm SVE Integer Matrix Multiply-Accumulate
(SMMLA, USMMLA, UMMLA) instructions. Because the associated SUDOT and
USDOT instructions have not yet been implemented, the SVE Feature ID
register 0 (ID_AA64ZFR0_EL1) has not yet been updated to indicate
support for SVE Int8 matrix multiplication instructions 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: Ia50e28fae03634cbe04b42a9900bab65a604817f
Reviewed-by: Richard Cooper 
---
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/insts/sve.isa
3 files changed, 72 insertions(+), 0 deletions(-)



diff --git a/src/arch/arm/isa/formats/sve_2nd_level.isa  
b/src/arch/arm/isa/formats/sve_2nd_level.isa

index 6add341..e0ab5f9 100644
--- a/src/arch/arm/isa/formats/sve_2nd_level.isa
+++ b/src/arch/arm/isa/formats/sve_2nd_level.isa
@@ -246,6 +246,33 @@
 }  // decodeSveIntMulAdd

 StaticInstPtr
+decodeSveIntMatMulAdd(ExtMachInst machInst)
+{
+RegIndex zda = (RegIndex) (uint8_t) bits(machInst, 4, 0);
+RegIndex zn = (RegIndex) (uint8_t) bits(machInst, 9, 5);
+RegIndex zm = (RegIndex) (uint8_t) bits(machInst, 20, 16);
+
+uint8_t uns = bits(machInst, 23, 22);
+
+switch (uns) {
+  case 0x0:
+return new SveSmmla(
+ machInst, zda, zn, zm);
+  case 0x2:
+return new SveUsmmla(
+ machInst, zda, zn, zm);
+  case 0x3:
+return new SveUmmla(
+ machInst, zda, zn, zm);
+  case 0x1:
+  default:
+return new Unknown64(machInst);
+}
+
+return new Unknown64(machInst);
+}  // decodeSveIntMatMulAdd
+
+StaticInstPtr
 decodeSveShiftByImmPred0(ExtMachInst machInst)
 {
 RegIndex zdn = (RegIndex) (uint8_t) bits(machInst, 4, 0);
@@ -3763,5 +3790,21 @@
 return new Unknown64(machInst);
 }  // decodeSveMemStore

+StaticInstPtr
+decodeSveMisc(ExtMachInst machInst) {
+switch(bits(machInst, 13, 10)) {
+  case 0b0110: {
+  return decodeSveIntMatMulAdd(machInst);
+  break;
+  }
+  default: {
+  return new Unknown64(machInst);
+  break;
+  }
+}
+return new Unknown64(machInst);
+}  // decodeSveMisc
+
+
 }  // namespace Aarch64
 }};
diff --git a/src/arch/arm/isa/formats/sve_top_level.isa  
b/src/arch/arm/isa/formats/sve_top_level.isa

index 1f3b463..0699637 100644
--- a/src/arch/arm/isa/formats/sve_top_level.isa
+++ b/src/arch/arm/isa/formats/sve_top_level.isa
@@ -44,6 +44,7 @@
 StaticInstPtr decodeSveShiftByImmPred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntArithUnaryPred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntMulAdd(ExtMachInst machInst);
+StaticInstPtr decodeSveIntMatMulAdd(ExtMachInst machInst);
 StaticInstPtr decodeSveIntArithUnpred(ExtMachInst machInst);
 StaticInstPtr decodeSveIntLogUnpred(ExtMachInst machInst);
 StaticInstPtr decodeSveIndexGen(ExtMachInst machInst);
@@ -93,6 +94,8 @@
 StaticInstPtr decodeSveMemContigLoad(ExtMachInst machInst);
 StaticInstPtr decodeSveMemGather64(ExtMachInst machInst);
 StaticInstPtr decodeSveMemStore(ExtMachInst machInst);
+
+StaticInstPtr decodeSveMisc(ExtMachInst machInst);
 }
 }};

@@ -103,6 +106,14 @@
 StaticInstPtr
 decodeSveInt(ExtMachInst machInst)
 {
+if (bits(machInst, 31, 29) == 0b010) {
+if (bits(machInst, 24) == 0b1 &&
+bits(machInst, 21) == 0b0 &&
+bits(machInst, 15, 14)==0b10) {
+return decodeSveMisc(machInst);
+}
+}
+
 uint8_t b_29_24_21 = (bits(machInst, 29) << 2) |
  (bits(machInst, 24) << 1) |
  bits(machInst, 21);
diff --git a/src/arch/arm/isa/insts/sve.isa b/src/arch/arm/isa/insts/sve.isa
index 30dbeba..f7bf8a3 100644
--- a/src/arch/arm/isa/insts/sve.isa
+++ b/src/arch/arm/isa/insts/sve.isa
@@ -4192,6 +4192,24 @@
 # MLS
 mlsCode = 'destElem -= srcElem1 * srcElem2;'
 sveTerInst('mls', 'Mls', 'SimdMultAccOp', signedTypes, mlsCode)
+
+