| Index: src/IceAssemblerARM32.cpp
|
| diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
|
| index 3908de35bcfed3873533d2b07544aa4f5dc86a92..6611aa0fa962444a417208d1cfdea10b5973e684 100644
|
| --- a/src/IceAssemblerARM32.cpp
|
| +++ b/src/IceAssemblerARM32.cpp
|
| @@ -1477,23 +1477,24 @@ void AssemblerARM32::mul(const Operand *OpRd, const Operand *OpRn,
|
| MulName);
|
| }
|
|
|
| -void AssemblerARM32::udiv(const Operand *OpRd, const Operand *OpRn,
|
| - const Operand *OpSrc1, CondARM32::Cond Cond) {
|
| - // UDIV - ARM section A8.8.248, encoding A1.
|
| - // udiv<c> <Rd>, <Rn>, <Rm>
|
| +void AssemblerARM32::rsb(const Operand *OpRd, const Operand *OpRn,
|
| + const Operand *OpSrc1, bool SetFlags,
|
| + CondARM32::Cond Cond) {
|
| + // RSB (immediate) - ARM section A8.8.152, encoding A1.
|
| + // rsb{s}<c> <Rd>, <Rn>, #<RotatedImm8>
|
| //
|
| - // cccc01110011dddd1111mmmm0001nnnn where cccc=Cond, dddd=Rd, nnnn=Rn, and
|
| - // mmmm=Rm.
|
| - constexpr const char *UdivName = "udiv";
|
| - IValueT Rd = encodeRegister(OpRd, "Rd", UdivName);
|
| - IValueT Rn = encodeRegister(OpRn, "Rn", UdivName);
|
| - IValueT Rm = encodeRegister(OpSrc1, "Rm", UdivName);
|
| - verifyRegNotPc(Rd, "Rd", UdivName);
|
| - verifyRegNotPc(Rn, "Rn", UdivName);
|
| - verifyRegNotPc(Rm, "Rm", UdivName);
|
| - // Assembler registers rd, rn, rm are encoded as rn, rm, rs.
|
| - constexpr IValueT UdivOpcode = B21;
|
| - emitDivOp(Cond, UdivOpcode, Rd, Rn, Rm, UdivName);
|
| + // cccc0010011snnnnddddiiiiiiiiiiii where cccc=Cond, dddd=Rd, nnnn=Rn,
|
| + // s=setFlags and iiiiiiiiiiii defines the RotatedImm8 value.
|
| + //
|
| + // RSB (register) - ARM section A8.8.163, encoding A1.
|
| + // rsb{s}<c> <Rd>, <Rn>, <Rm>{, <Shift>}
|
| + //
|
| + // cccc0000011snnnnddddiiiiitt0mmmm where cccc=Cond, dddd=Rd, nnnn=Rn,
|
| + // mmmm=Rm, iiiii=shift, tt==ShiftKind, and s=SetFlags.
|
| + constexpr const char *RsbName = "rsb";
|
| + constexpr IValueT RsbOpcode = B1 | B0; // 0011
|
| + emitType01(Cond, RsbOpcode, OpRd, OpRn, OpSrc1, SetFlags, RdIsPcAndSetFlags,
|
| + RsbName);
|
| }
|
|
|
| void AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn,
|
| @@ -1505,7 +1506,7 @@ void AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn,
|
| // sub{s}<c> <Rd>, sp, <Rm>{, <Shift>}
|
| //
|
| // cccc0000010snnnnddddiiiiitt0mmmm where cccc=Cond, dddd=Rd, nnnn=Rn,
|
| - // mmmm=Rm, iiiiii=shift, tt=ShiftKind, and s=SetFlags.
|
| + // mmmm=Rm, iiiii=shift, tt=ShiftKind, and s=SetFlags.
|
| //
|
| // Sub (Immediate) - ARM section A8.8.222, encoding A1:
|
| // sub{s}<c> <Rd>, <Rn>, #<RotatedImm8>
|
| @@ -1538,6 +1539,25 @@ void AssemblerARM32::tst(const Operand *OpRn, const Operand *OpSrc1,
|
| emitCompareOp(Cond, TstOpcode, OpRn, OpSrc1, TstName);
|
| }
|
|
|
| +void AssemblerARM32::udiv(const Operand *OpRd, const Operand *OpRn,
|
| + const Operand *OpSrc1, CondARM32::Cond Cond) {
|
| + // UDIV - ARM section A8.8.248, encoding A1.
|
| + // udiv<c> <Rd>, <Rn>, <Rm>
|
| + //
|
| + // cccc01110011dddd1111mmmm0001nnnn where cccc=Cond, dddd=Rd, nnnn=Rn, and
|
| + // mmmm=Rm.
|
| + constexpr const char *UdivName = "udiv";
|
| + IValueT Rd = encodeRegister(OpRd, "Rd", UdivName);
|
| + IValueT Rn = encodeRegister(OpRn, "Rn", UdivName);
|
| + IValueT Rm = encodeRegister(OpSrc1, "Rm", UdivName);
|
| + verifyRegNotPc(Rd, "Rd", UdivName);
|
| + verifyRegNotPc(Rn, "Rn", UdivName);
|
| + verifyRegNotPc(Rm, "Rm", UdivName);
|
| + // Assembler registers rd, rn, rm are encoded as rn, rm, rs.
|
| + constexpr IValueT UdivOpcode = B21;
|
| + emitDivOp(Cond, UdivOpcode, Rd, Rn, Rm, UdivName);
|
| +}
|
| +
|
| void AssemblerARM32::umull(const Operand *OpRdLo, const Operand *OpRdHi,
|
| const Operand *OpRn, const Operand *OpRm,
|
| CondARM32::Cond Cond) {
|
|
|