| Index: src/IceAssemblerARM32.cpp
|
| diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
|
| index 71e5c6aeb347af7a007cbbc044e5fcab14d772b2..2cf09ff6b9167c414655af42b2d8ba74cdf101b3 100644
|
| --- a/src/IceAssemblerARM32.cpp
|
| +++ b/src/IceAssemblerARM32.cpp
|
| @@ -2422,6 +2422,102 @@ void AssemblerARM32::vbslq(const Operand *OpQd, const Operand *OpQm,
|
| emitSIMDqqq(VbslqOpcode, ElmtTy, OpQd, OpQm, OpQn, Vbslq);
|
| }
|
|
|
| +void AssemblerARM32::vceqqi(const Type ElmtTy, const Operand *OpQd,
|
| + const Operand *OpQm, const Operand *OpQn) {
|
| + // vceq (register) - ARM section A8.8.291, encoding A1:
|
| + // vceq.<st> <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 111100110Dssnnnndddd1000NQM1mmmm where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm, and
|
| + // st in [i8, i16, i32] where ss is the index.
|
| + constexpr const char *Vceq = "vceq";
|
| + constexpr IValueT VceqOpcode = B24 | B11 | B4;
|
| + emitSIMDqqq(VceqOpcode, ElmtTy, OpQd, OpQm, OpQn, Vceq);
|
| +}
|
| +
|
| +void AssemblerARM32::vceqqs(const Operand *OpQd, const Operand *OpQm,
|
| + const Operand *OpQn) {
|
| + // vceq (register) - ARM section A8.8.291, encoding A2:
|
| + // vceq.f32 <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 111100100D00nnnndddd1110NQM0mmmm where Dddd=OpQd, Nnnn=OpQm, and Mmmm=OpQm.
|
| + constexpr const char *Vceq = "vceq";
|
| + constexpr IValueT VceqOpcode = B11 | B10 | B9;
|
| + constexpr Type ElmtTy = IceType_i8; // encoded as 0b00
|
| + emitSIMDqqq(VceqOpcode, ElmtTy, OpQd, OpQm, OpQn, Vceq);
|
| +}
|
| +
|
| +void AssemblerARM32::vcgeqi(const Type ElmtTy, const Operand *OpQd,
|
| + const Operand *OpQm, const Operand *OpQn) {
|
| + // vcge (register) - ARM section A8.8.293, encoding A1:
|
| + // vcge.<st> <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 1111001U0Dssnnnndddd0011NQM1mmmm where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm,
|
| + // 0=U, and st in [s8, s16, s32] where ss is the index.
|
| + constexpr const char *Vcge = "vcge";
|
| + constexpr IValueT VcgeOpcode = B9 | B8 | B4;
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| +void AssemblerARM32::vcugeqi(const Type ElmtTy, const Operand *OpQd,
|
| + const Operand *OpQm, const Operand *OpQn) {
|
| + // vcge (register) - ARM section A8.8.293, encoding A1:
|
| + // vcge.<st> <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 1111001U0Dssnnnndddd0011NQM1mmmm where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm,
|
| + // 1=U, and st in [u8, u16, u32] where ss is the index.
|
| + constexpr const char *Vcge = "vcge";
|
| + constexpr IValueT VcgeOpcode = B24 | B9 | B8 | B4;
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| +void AssemblerARM32::vcgeqs(const Operand *OpQd, const Operand *OpQm,
|
| + const Operand *OpQn) {
|
| + // vcge (register) - ARM section A8.8.293, encoding A2:
|
| + // vcge.f32 <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 111100110D00nnnndddd1110NQM0mmmm where Dddd=OpQd, Nnnn=OpQm, and Mmmm=OpQm.
|
| + constexpr const char *Vcge = "vcge";
|
| + constexpr IValueT VcgeOpcode = B24 | B11 | B10 | B9;
|
| + constexpr Type ElmtTy = IceType_i8; // encoded as 0b00.
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| +void AssemblerARM32::vcgtqi(const Type ElmtTy, const Operand *OpQd,
|
| + const Operand *OpQm, const Operand *OpQn) {
|
| + // vcgt (register) - ARM section A8.8.295, encoding A1:
|
| + // vcgt.<st> <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 1111001U0Dssnnnndddd0011NQM0mmmm where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm,
|
| + // 0=U, and st in [s8, s16, s32] where ss is the index.
|
| + constexpr const char *Vcge = "vcgt";
|
| + constexpr IValueT VcgeOpcode = B9 | B8;
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| +void AssemblerARM32::vcugtqi(const Type ElmtTy, const Operand *OpQd,
|
| + const Operand *OpQm, const Operand *OpQn) {
|
| + // vcgt (register) - ARM section A8.8.295, encoding A1:
|
| + // vcgt.<st> <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 111100110Dssnnnndddd0011NQM0mmmm where Dddd=OpQd, Nnnn=OpQm, Mmmm=OpQm,
|
| + // 1=U, and st in [u8, u16, u32] where ss is the index.
|
| + constexpr const char *Vcge = "vcgt";
|
| + constexpr IValueT VcgeOpcode = B24 | B9 | B8;
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| +void AssemblerARM32::vcgtqs(const Operand *OpQd, const Operand *OpQm,
|
| + const Operand *OpQn) {
|
| + // vcgt (register) - ARM section A8.8.295, encoding A2:
|
| + // vcgt.f32 <Qd>, <Qn>, <Qm>
|
| + //
|
| + // 111100110D10nnnndddd1110NQM0mmmm where Dddd=OpQd, Nnnn=OpQm, and Mmmm=OpQm.
|
| + constexpr const char *Vcge = "vcgt";
|
| + constexpr IValueT VcgeOpcode = B24 | B21 | B11 | B10 | B9;
|
| + constexpr Type ElmtTy = IceType_i8; // encoded as 0b00.
|
| + emitSIMDqqq(VcgeOpcode, ElmtTy, OpQd, OpQm, OpQn, Vcge);
|
| +}
|
| +
|
| void AssemblerARM32::vcmpd(const Operand *OpDd, const Operand *OpDm,
|
| CondARM32::Cond Cond) {
|
| constexpr const char *Vcmpd = "vcmpd";
|
| @@ -3143,6 +3239,23 @@ void AssemblerARM32::vmulqf(const Operand *OpQd, const Operand *OpQn,
|
| emitSIMDqqqBase(VmulqfOpcode, OpQd, OpQn, OpQm, IsFloatTy, Vmulqf);
|
| }
|
|
|
| +void AssemblerARM32::vmvnq(const Operand *OpQd, const Operand *OpQm) {
|
| + // VMVN (integer) - ARM section A8.8.354, encoding A1:
|
| + // vmvn <Qd>, <Qm>
|
| + //
|
| + // 111100111D110000dddd01011QM0mmmm where Dddd=Qd, Mmmm=Qm, and 1=Q.
|
| + // TODO(jpp) xxx: unify
|
| + constexpr const char *Vmvn = "vmvn";
|
| + constexpr IValueT VmvnOpcode = B24 | B23 | B21 | B20 | B10 | B8 | B7;
|
| + const IValueT Qd = encodeQRegister(OpQd, "Qd", Vmvn);
|
| + constexpr IValueT Qn = 0;
|
| + const IValueT Qm = encodeQRegister(OpQm, "Qm", Vmvn);
|
| + constexpr bool UseQRegs = true;
|
| + constexpr bool IsFloat = false;
|
| + emitSIMDBase(VmvnOpcode, mapQRegToDReg(Qd), mapQRegToDReg(Qn),
|
| + mapQRegToDReg(Qm), UseQRegs, IsFloat);
|
| +}
|
| +
|
| void AssemblerARM32::vnegqs(Type ElmtTy, const Operand *OpQd,
|
| const Operand *OpQm) {
|
| // VNEG - ARM section A8.8.355, encoding A1:
|
|
|