Index: src/IceInstMIPS32.cpp |
diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp |
index c83267d11166c748e01b80cbba755cc0903e9ab2..1593bc15be5f5037338a6dc2ddb90e14fe00a85c 100644 |
--- a/src/IceInstMIPS32.cpp |
+++ b/src/IceInstMIPS32.cpp |
@@ -166,42 +166,6 @@ template <> void InstMIPS32Lui::emit(const Cfg *Func) const { |
} |
} |
-template <> void InstMIPS32Mflo::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitUnaryopGPRFLoHi(Opcode, this, Func); |
-} |
- |
-template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitUnaryopGPRFLoHi(Opcode, this, Func); |
-} |
- |
-template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitUnaryopGPRTLoHi(Opcode, this, Func); |
-} |
- |
-template <> void InstMIPS32Mthi::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitUnaryopGPRTLoHi(Opcode, this, Func); |
-} |
- |
-template <> void InstMIPS32Mult::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitThreeAddrLoHi(Opcode, this, Func); |
-} |
- |
-template <> void InstMIPS32Multu::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- emitThreeAddrLoHi(Opcode, this, Func); |
-} |
- |
InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue, |
const CfgNode *TargetFalse, |
const InstMIPS32Label *Label, CondMIPS32::Cond Cond) |
@@ -648,17 +612,9 @@ void InstMIPS32Mov::emitIAS(const Cfg *Func) const { |
// reg to reg |
if (DestIsReg && SrcIsReg) { |
- switch (Dest->getType()) { |
- default: |
- break; |
- case IceType_i1: |
- case IceType_i8: |
- case IceType_i16: |
- case IceType_i32: |
- auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->move(getDest(), getSrc(0)); |
- return; |
- } |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->move(getDest(), getSrc(0)); |
+ return; |
} |
llvm_unreachable("Not yet implemented"); |
} |
@@ -786,19 +742,34 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const { |
llvm::report_fatal_error("Invalid mov instruction. Dest or Src is memory."); |
} |
-template <> void InstMIPS32Addiu::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Abs_d::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->addiu(getDest(), getSrc(0), Imm); |
+ Asm->abs_d(getDest(), getSrc(0)); |
} |
-template <> void InstMIPS32Slti::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Abs_s::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->slti(getDest(), getSrc(0), Imm); |
+ Asm->abs_s(getDest(), getSrc(0)); |
} |
-template <> void InstMIPS32Sltiu::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Add_d::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->sltiu(getDest(), getSrc(0), Imm); |
+ Asm->add_d(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Add_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->add_s(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Addiu::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->addiu(getDest(), getSrc(0), Imm); |
+} |
+ |
+template <> void InstMIPS32Addu::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->addu(getDest(), getSrc(0), getSrc(1)); |
} |
template <> void InstMIPS32And::emitIAS(const Cfg *Func) const { |
@@ -811,6 +782,140 @@ template <> void InstMIPS32Andi::emitIAS(const Cfg *Func) const { |
Asm->andi(getDest(), getSrc(0), Imm); |
} |
+template <> void InstMIPS32Cvt_d_l::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_d_l(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Cvt_d_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_d_s(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Cvt_d_w::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_d_w(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Cvt_s_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_s_d(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Cvt_s_l::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_s_l(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Cvt_s_w::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->cvt_s_w(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Div_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->div_d(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Div_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->div_s(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0)); |
+ ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset()); |
+ uint32_t Imm = static_cast<uint32_t>(Offset->getValue()); |
+ Asm->lw(getDest(), Mem->getBase(), Imm); |
+} |
+ |
+template <> void InstMIPS32Mfc1::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mfc1(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Mflo::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitUnaryopGPRFLoHi(Opcode, this, Func); |
+} |
+ |
+template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitUnaryopGPRFLoHi(Opcode, this, Func); |
+} |
+ |
+template <> void InstMIPS32Mov_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mov_d(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mov_s(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Movn_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->movn_d(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Movn_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->movn_s(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Movz_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->movz_d(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Movz_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->movz_s(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Mtc1::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mtc1(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitUnaryopGPRTLoHi(Opcode, this, Func); |
+} |
+ |
+template <> void InstMIPS32Mthi::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitUnaryopGPRTLoHi(Opcode, this, Func); |
+} |
+ |
+template <> void InstMIPS32Mul_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mul_d(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Mul_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->mul_s(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Mult::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitThreeAddrLoHi(Opcode, this, Func); |
+} |
+ |
+template <> void InstMIPS32Multu::emit(const Cfg *Func) const { |
+ if (!BuildDefs::dump()) |
+ return; |
+ emitThreeAddrLoHi(Opcode, this, Func); |
+} |
+ |
template <> void InstMIPS32Or::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
Asm->or_(getDest(), getSrc(0), getSrc(1)); |
@@ -821,24 +926,39 @@ template <> void InstMIPS32Ori::emitIAS(const Cfg *Func) const { |
Asm->ori(getDest(), getSrc(0), Imm); |
} |
-template <> void InstMIPS32Xor::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Sll::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->xor_(getDest(), getSrc(0), getSrc(1)); |
+ Asm->sll(getDest(), getSrc(0), Imm); |
} |
-template <> void InstMIPS32Xori::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Slt::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->xori(getDest(), getSrc(0), Imm); |
+ Asm->slt(getDest(), getSrc(0), getSrc(1)); |
} |
-template <> void InstMIPS32Sll::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Slti::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->sll(getDest(), getSrc(0), Imm); |
+ Asm->slti(getDest(), getSrc(0), Imm); |
} |
-template <> void InstMIPS32Srl::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Sltiu::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->srl(getDest(), getSrc(0), Imm); |
+ Asm->sltiu(getDest(), getSrc(0), Imm); |
+} |
+ |
+template <> void InstMIPS32Sltu::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->sltu(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Sqrt_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->sqrt_d(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Sqrt_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->sqrt_s(getDest(), getSrc(0)); |
} |
template <> void InstMIPS32Sra::emitIAS(const Cfg *Func) const { |
@@ -846,19 +966,19 @@ template <> void InstMIPS32Sra::emitIAS(const Cfg *Func) const { |
Asm->sra(getDest(), getSrc(0), Imm); |
} |
-template <> void InstMIPS32Addu::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Srl::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->addu(getDest(), getSrc(0), getSrc(1)); |
+ Asm->srl(getDest(), getSrc(0), Imm); |
} |
-template <> void InstMIPS32Slt::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Sub_d::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->slt(getDest(), getSrc(0), getSrc(1)); |
+ Asm->sub_d(getDest(), getSrc(0), getSrc(1)); |
} |
-template <> void InstMIPS32Sltu::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Sub_s::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- Asm->sltu(getDest(), getSrc(0), getSrc(1)); |
+ Asm->sub_s(getDest(), getSrc(0), getSrc(1)); |
} |
template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const { |
@@ -869,12 +989,34 @@ template <> void InstMIPS32Sw::emitIAS(const Cfg *Func) const { |
Asm->sw(getSrc(0), Mem->getBase(), Imm); |
} |
-template <> void InstMIPS32Lw::emitIAS(const Cfg *Func) const { |
+template <> void InstMIPS32Trunc_l_d::emitIAS(const Cfg *Func) const { |
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
- auto *Mem = llvm::dyn_cast<OperandMIPS32Mem>(getSrc(0)); |
- ConstantInteger32 *Offset = llvm::cast<ConstantInteger32>(Mem->getOffset()); |
- uint32_t Imm = static_cast<uint32_t>(Offset->getValue()); |
- Asm->lw(getDest(), Mem->getBase(), Imm); |
+ Asm->trunc_l_d(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Trunc_l_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->trunc_l_s(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Trunc_w_d::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->trunc_w_d(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Trunc_w_s::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->trunc_w_s(getDest(), getSrc(0)); |
+} |
+ |
+template <> void InstMIPS32Xor::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->xor_(getDest(), getSrc(0), getSrc(1)); |
+} |
+ |
+template <> void InstMIPS32Xori::emitIAS(const Cfg *Func) const { |
+ auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); |
+ Asm->xori(getDest(), getSrc(0), Imm); |
} |
} // end of namespace MIPS32 |