[sve2] Implement complex integer multiply-add (vector).
Include cmla and sqrdcmlah.
Change-Id: Ic842db287b4cf5a7531de4205e9f8b431be2a8aa
diff --git a/src/aarch64/simulator-aarch64.cc b/src/aarch64/simulator-aarch64.cc
index 0d7dfcb..7a704d8 100644
--- a/src/aarch64/simulator-aarch64.cc
+++ b/src/aarch64/simulator-aarch64.cc
@@ -85,7 +85,7 @@
{"cdot_z_zzz", &Simulator::SimulateSVEComplexDotProduct},
{"cdot_z_zzzi_d", &Simulator::SimulateSVEComplexDotProduct},
{"cdot_z_zzzi_s", &Simulator::SimulateSVEComplexDotProduct},
- {"cmla_z_zzz", &Simulator::Simulate_ZdaT_ZnT_ZmT_const},
+ {"cmla_z_zzz", &Simulator::SimulateSVEComplexIntMulAdd},
{"cmla_z_zzzi_h", &Simulator::Simulate_ZdaH_ZnH_ZmH_imm_const},
{"cmla_z_zzzi_s", &Simulator::Simulate_ZdaS_ZnS_ZmS_imm_const},
{"eor3_z_zzz", &Simulator::SimulateSVEBitwiseTernary},
@@ -217,7 +217,7 @@
{"sqdmullt_z_zzi_d", &Simulator::SimulateSVESaturatingIntMulLongIdx},
{"sqdmullt_z_zzi_s", &Simulator::Simulate_ZdS_ZnH_ZmH_imm},
{"sqneg_z_p_z", &Simulator::Simulate_ZdT_PgM_ZnT},
- {"sqrdcmlah_z_zzz", &Simulator::Simulate_ZdaT_ZnT_ZmT_const},
+ {"sqrdcmlah_z_zzz", &Simulator::SimulateSVEComplexIntMulAdd},
{"sqrdcmlah_z_zzzi_h", &Simulator::Simulate_ZdaH_ZnH_ZmH_imm_const},
{"sqrdcmlah_z_zzzi_s", &Simulator::Simulate_ZdaS_ZnS_ZmS_imm_const},
{"sqrdmlah_z_zzz", &Simulator::Simulate_ZdaT_ZnT_ZmT},
@@ -3057,20 +3057,19 @@
}
}
-void Simulator::Simulate_ZdaT_ZnT_ZmT_const(const Instruction* instr) {
+void Simulator::SimulateSVEComplexIntMulAdd(const Instruction* instr) {
+ VectorFormat vform = instr->GetSVEVectorFormat();
SimVRegister& zda = ReadVRegister(instr->GetRd());
- USE(zda);
SimVRegister& zm = ReadVRegister(instr->GetRm());
- USE(zm);
SimVRegister& zn = ReadVRegister(instr->GetRn());
- USE(zn);
+ int rot = instr->ExtractBits(11, 10) * 90;
switch (form_hash_) {
case Hash("cmla_z_zzz"):
- VIXL_UNIMPLEMENTED();
+ cmla(vform, zda, zda, zn, zm, rot);
break;
case Hash("sqrdcmlah_z_zzz"):
- VIXL_UNIMPLEMENTED();
+ sqrdcmlah(vform, zda, zda, zn, zm, rot);
break;
default:
VIXL_UNIMPLEMENTED();