Index: src/IceAssemblerMIPS32.cpp |
diff --git a/src/IceAssemblerMIPS32.cpp b/src/IceAssemblerMIPS32.cpp |
index 961111aaa9698cbc79921974773493cc353367fd..024835717f4a8f3adf5a5ed7cc81947416c3c06e 100644 |
--- a/src/IceAssemblerMIPS32.cpp |
+++ b/src/IceAssemblerMIPS32.cpp |
@@ -254,6 +254,20 @@ void AssemblerMIPS32::emitRdRsRt(IValueT Opcode, const Operand *OpRd, |
emitInst(Opcode); |
} |
+void AssemblerMIPS32::emitCOP1Fcmp(IValueT Opcode, FPInstDataFormat Format, |
+ const Operand *OpFs, const Operand *OpFt, |
+ IValueT CC, const char *InsnName) { |
+ const IValueT Fs = encodeFPRegister(OpFs, "Fs", InsnName); |
+ const IValueT Ft = encodeFPRegister(OpFt, "Ft", InsnName); |
+ |
+ Opcode |= CC << 8; |
+ Opcode |= Fs << 11; |
+ Opcode |= Ft << 16; |
+ Opcode |= Format << 21; |
+ |
+ emitInst(Opcode); |
+} |
+ |
void AssemblerMIPS32::emitCOP1FmtFsFd(IValueT Opcode, FPInstDataFormat Format, |
const Operand *OpFd, const Operand *OpFs, |
const char *InsnName) { |
@@ -371,6 +385,90 @@ void AssemblerMIPS32::b(Label *TargetLabel) { |
TargetLabel->linkTo(*this, Position); |
} |
+void AssemblerMIPS32::c_eq_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000032; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.eq.d"); |
+} |
+ |
+void AssemblerMIPS32::c_eq_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000032; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.eq.s"); |
+} |
+ |
+void AssemblerMIPS32::c_ole_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000036; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ole.d"); |
+} |
+ |
+void AssemblerMIPS32::c_ole_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000036; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ole.s"); |
+} |
+ |
+void AssemblerMIPS32::c_olt_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000034; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.olt.d"); |
+} |
+ |
+void AssemblerMIPS32::c_olt_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000034; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.olt.s"); |
+} |
+ |
+void AssemblerMIPS32::c_ueq_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000033; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ueq.d"); |
+} |
+ |
+void AssemblerMIPS32::c_ueq_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000033; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ueq.s"); |
+} |
+ |
+void AssemblerMIPS32::c_ule_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000037; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ule.d"); |
+} |
+ |
+void AssemblerMIPS32::c_ule_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000037; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ule.s"); |
+} |
+ |
+void AssemblerMIPS32::c_ult_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000035; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ult.d"); |
+} |
+ |
+void AssemblerMIPS32::c_ult_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000035; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.ult.s"); |
+} |
+ |
+void AssemblerMIPS32::c_un_d(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000031; |
+ emitCOP1Fcmp(Opcode, DoublePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.un.d"); |
+} |
+ |
+void AssemblerMIPS32::c_un_s(const Operand *OpFs, const Operand *OpFt) { |
+ static constexpr IValueT Opcode = 0x44000031; |
+ emitCOP1Fcmp(Opcode, SinglePrecision, OpFs, OpFt, OperandMIPS32FCC::FCC0, |
+ "c.un.s"); |
+} |
+ |
void AssemblerMIPS32::cvt_d_l(const Operand *OpFd, const Operand *OpFs) { |
static constexpr IValueT Opcode = 0x44000021; |
emitCOP1FmtFsFd(Opcode, Long, OpFd, OpFs, "cvt.d.l"); |
@@ -497,6 +595,23 @@ void AssemblerMIPS32::move(const Operand *OpRd, const Operand *OpRs) { |
} |
} |
+void AssemblerMIPS32::movf(const Operand *OpRd, const Operand *OpRs, |
+ const Operand *OpCc) { |
+ IValueT Opcode = 0x00000001; |
+ const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movf"); |
+ const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movf"); |
+ OperandMIPS32FCC::FCC Cc = OperandMIPS32FCC::FCC0; |
+ if (const auto *OpFCC = llvm::dyn_cast<OperandMIPS32FCC>(OpCc)) { |
+ Cc = OpFCC->getFCC(); |
+ } |
+ const IValueT InstEncodingFalse = 0; |
+ Opcode |= Rd << 11; |
+ Opcode |= InstEncodingFalse << 16; |
+ Opcode |= Cc << 18; |
+ Opcode |= Rs << 21; |
+ emitInst(Opcode); |
+} |
+ |
void AssemblerMIPS32::movn_d(const Operand *OpFd, const Operand *OpFs, |
const Operand *OpFt) { |
static constexpr IValueT Opcode = 0x44000013; |
@@ -509,6 +624,23 @@ void AssemblerMIPS32::movn_s(const Operand *OpFd, const Operand *OpFs, |
emitCOP1FmtFtFsFd(Opcode, SinglePrecision, OpFd, OpFs, OpFt, "movn.s"); |
} |
+void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs, |
+ const Operand *OpCc) { |
+ IValueT Opcode = 0x00000001; |
+ const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movf"); |
+ const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movf"); |
+ OperandMIPS32FCC::FCC Cc = OperandMIPS32FCC::FCC0; |
+ if (const auto *OpFCC = llvm::dyn_cast<OperandMIPS32FCC>(OpCc)) { |
+ Cc = OpFCC->getFCC(); |
+ } |
+ const IValueT InstEncodingTrue = 1; |
+ Opcode |= Rd << 11; |
+ Opcode |= InstEncodingTrue << 16; |
+ Opcode |= Cc << 18; |
+ Opcode |= Rs << 21; |
+ emitInst(Opcode); |
+} |
+ |
void AssemblerMIPS32::movz_d(const Operand *OpFd, const Operand *OpFs, |
const Operand *OpFt) { |
static constexpr IValueT Opcode = 0x44000012; |