Index: src/IceAssemblerARM32.cpp |
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp |
index 338022fb32f954475fdc8182511964b5cc49e701..2b6f9e0de05fd7842d663948274ad9b9b8bc7dab 100644 |
--- a/src/IceAssemblerARM32.cpp |
+++ b/src/IceAssemblerARM32.cpp |
@@ -48,6 +48,7 @@ static constexpr IValueT B15 = 1 << 15; |
static constexpr IValueT B20 = 1 << 20; |
static constexpr IValueT B21 = 1 << 21; |
static constexpr IValueT B22 = 1 << 22; |
+static constexpr IValueT B23 = 1 << 23; |
static constexpr IValueT B24 = 1 << 24; |
static constexpr IValueT B25 = 1 << 25; |
static constexpr IValueT B26 = 1 << 26; |
@@ -1048,5 +1049,30 @@ void AssemblerARM32::tst(const Operand *OpRn, const Operand *OpSrc1, |
emitCompareOp(Opcode, OpRn, OpSrc1, Cond); |
} |
+void AssemblerARM32::umull(const Operand *OpRdLo, const Operand *OpRdHi, |
Jim Stichnoth
2015/11/06 22:26:42
Is this a situation where you would comment out um
Karl
2015/11/09 20:16:37
Yes. I forgot that. Commenting appropriate entries
|
+ const Operand *OpRn, const Operand *OpRm, |
+ CondARM32::Cond Cond) { |
+ // UMULL - ARM section A8.8.257, encoding A1: |
+ // umull<c> <RdLo>, <RdHi>, <Rn>, <Rm> |
+ // |
+ // cccc0000100shhhhllllmmmm1001nnnn where hhhh=RdHi, llll=RdLo, nnnn=Rn, |
+ // mmmm=Rm, and s=SetFlags |
+ IValueT RdLo; |
+ IValueT RdHi; |
+ IValueT Rn; |
+ IValueT Rm; |
+ if (decodeOperand(OpRdLo, RdLo) != DecodedAsRegister || |
+ decodeOperand(OpRdHi, RdHi) != DecodedAsRegister || |
+ decodeOperand(OpRn, Rn) != DecodedAsRegister || |
+ decodeOperand(OpRm, Rm) != DecodedAsRegister) |
+ return setNeedsTextFixup(); |
+ if (RdHi == RegARM32::Encoded_Reg_pc || RdLo == RegARM32::Encoded_Reg_pc || |
+ Rn == RegARM32::Encoded_Reg_pc || Rm == RegARM32::Encoded_Reg_pc || |
+ RdHi == RdLo) |
+ llvm::report_fatal_error("Sdiv instruction unpredictable on pc"); |
Jim Stichnoth
2015/11/06 22:26:42
sdiv?
Karl
2015/11/09 20:16:37
Need to improve my cut/paste skills! Fixing.
|
+ constexpr bool SetFlags = false; |
+ emitMulOp(Cond, B23, RdLo, RdHi, Rn, Rm, SetFlags); |
+} |
+ |
} // end of namespace ARM32 |
} // end of namespace Ice |