Index: src/IceAssemblerARM32.cpp |
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp |
index 13e2b1a4d09f2bdba2229ae5b89c8ff1ecd6ecb1..0583813459e6a307c204be08fd358476cd21e161 100644 |
--- a/src/IceAssemblerARM32.cpp |
+++ b/src/IceAssemblerARM32.cpp |
@@ -2159,7 +2159,7 @@ void AssemblerARM32::vaddqi(Type ElmtTy, const Operand *OpQd, |
// VADD (integer) - ARM section A8.8.282, encoding A1: |
// vadd.<dt> <Qd>, <Qn>, <Qm> |
// |
- // 111100100Dssnnn0ddd01000NqM0mmm0 where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm, |
+ // 111100100Dssnnn0ddd01000N1M0mmm0 where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm, |
// and dt in [i8, i16, i32, i64] where ss is the index. |
constexpr const char *Vaddqi = "vaddqi"; |
constexpr IValueT VaddqiOpcode = B11; |
@@ -2778,6 +2778,29 @@ void AssemblerARM32::vsubd(const Operand *OpDd, const Operand *OpDn, |
emitVFPddd(Cond, VsubdOpcode, OpDd, OpDn, OpDm, Vsubd); |
} |
+void AssemblerARM32::vsubqi(Type ElmtTy, const Operand *OpQd, |
+ const Operand *OpQm, const Operand *OpQn) { |
+ // VSUB (integer) - ARM section A8.8.414, encoding A1: |
+ // vsub.<dt> <Qd>, <Qn>, <Qm> |
+ // |
+ // 111100110Dssnnn0ddd01000N1M0mmm0 where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm, |
+ // and dt in [i8, i16, i32, i64] where ss is the index. |
+ constexpr const char *Vsubqi = "vsubqi"; |
+ constexpr IValueT VsubqiOpcode = B24 | B11; |
+ emitSIMDqqq(VsubqiOpcode, ElmtTy, OpQd, OpQm, OpQn, Vsubqi); |
+} |
+ |
+void AssemblerARM32::vsubqf(const Operand *OpQd, const Operand *OpQn, |
+ const Operand *OpQm) { |
+ // VSUB (floating-point) - ARM section A8.8.415, Encoding A1: |
+ // vsub.f32 <Qd>, <Qn>, <Qm> |
+ // |
+ // 111100100D10nnn0ddd01101N1M0mmm0 where Dddd=Qd, Nnnn=Qn, and Mmmm=Qm. |
+ constexpr const char *Vsubqf = "vsubqf"; |
+ constexpr IValueT VsubqfOpcode = B21 | B11 | B10 | B8; |
+ emitSIMDqqq(VsubqfOpcode, IceType_f32, OpQd, OpQn, OpQm, Vsubqf); |
+} |
+ |
void AssemblerARM32::emitVStackOp(CondARM32::Cond Cond, IValueT Opcode, |
const Variable *OpBaseReg, |
SizeT NumConsecRegs) { |