| Index: src/IceAssemblerMIPS32.h
|
| diff --git a/src/IceAssemblerMIPS32.h b/src/IceAssemblerMIPS32.h
|
| index eefb1b2004e7f0e55c73013bba50967dd4b17d15..ff67904c9fab03693be9b04887d0888c99afbff2 100644
|
| --- a/src/IceAssemblerMIPS32.h
|
| +++ b/src/IceAssemblerMIPS32.h
|
| @@ -27,6 +27,13 @@ namespace MIPS32 {
|
| using IValueT = uint32_t;
|
| using IOffsetT = int32_t;
|
|
|
| +enum FPInstDataFormat {
|
| + SinglePrecision = 16,
|
| + DoublePrecision = 17,
|
| + Word = 20,
|
| + Long = 21
|
| +};
|
| +
|
| class AssemblerMIPS32 : public Assembler {
|
| AssemblerMIPS32(const AssemblerMIPS32 &) = delete;
|
| AssemblerMIPS32 &operator=(const AssemblerMIPS32 &) = delete;
|
| @@ -54,56 +61,134 @@ public:
|
| void nop();
|
|
|
| void emitRtRsImm16(IValueT Opcode, const Operand *OpRt, const Operand *OpRs,
|
| - const uint32_t Imm, const char *InsnName);
|
| + uint32_t Imm, const char *InsnName);
|
| +
|
| + void emitFtRsImm16(IValueT Opcode, const Operand *OpFt, const Operand *OpRs,
|
| + uint32_t Imm, const char *InsnName);
|
|
|
| void emitRdRtSa(IValueT Opcode, const Operand *OpRd, const Operand *OpRt,
|
| - const uint32_t Sa, const char *InsnName);
|
| + uint32_t Sa, const char *InsnName);
|
|
|
| void emitRdRsRt(IValueT Opcode, const Operand *OpRd, const Operand *OpRs,
|
| const Operand *OpRt, const char *InsnName);
|
|
|
| + void emitCOP1FmtFsFd(IValueT Opcode, FPInstDataFormat Format,
|
| + const Operand *OpFd, const Operand *OpFs,
|
| + const char *InsnName);
|
| +
|
| + void emitCOP1FmtFtFsFd(IValueT Opcode, FPInstDataFormat Format,
|
| + const Operand *OpFd, const Operand *OpFs,
|
| + const Operand *OpFt, const char *InsnName);
|
| +
|
| + void emitCOP1FmtRtFsFd(IValueT Opcode, FPInstDataFormat Format,
|
| + const Operand *OpFd, const Operand *OpFs,
|
| + const Operand *OpRt, const char *InsnName);
|
| +
|
| + void emitCOP1MovRtFs(IValueT Opcode, const Operand *OpRt, const Operand *OpFs,
|
| + const char *InsnName);
|
| +
|
| void emitBr(const CondMIPS32::Cond Cond, const Operand *OpRs,
|
| const Operand *OpRt, IOffsetT Offset);
|
|
|
| - void addiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| + void abs_d(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void slti(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| + void abs_s(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void sltiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| + void add_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void add_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void addu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| +
|
| + void addiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
|
|
| void and_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
|
|
| void andi(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
|
|
| - void or_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| + void b(Label *TargetLabel);
|
|
|
| - void ori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| + void cvt_d_l(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void xor_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| + void cvt_d_s(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void xori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| + void cvt_d_w(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void sll(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
| + void cvt_s_d(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void srl(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
| + void cvt_s_l(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void sra(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
| + void cvt_s_w(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void div_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void div_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void lw(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
|
| +
|
| + void mfc1(const Operand *OpRt, const Operand *OpFs);
|
| +
|
| + void mov_d(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void mov_s(const Operand *OpFd, const Operand *OpFs);
|
|
|
| void move(const Operand *OpRd, const Operand *OpRs);
|
|
|
| - void addu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| + void movn_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void movn_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void movz_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void movz_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void mtc1(const Operand *OpRt, const Operand *OpFs);
|
| +
|
| + void mul_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void mul_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void or_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| +
|
| + void ori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| +
|
| + void ret(void);
|
| +
|
| + void sll(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
|
|
| void slt(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
|
|
| + void slti(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| +
|
| + void sltiu(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
| +
|
| void sltu(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
|
|
| + void sqrt_d(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void sqrt_s(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void sra(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
| +
|
| + void srl(const Operand *OpRd, const Operand *OpRt, const uint32_t Sa);
|
| +
|
| + void sub_d(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| + void sub_s(const Operand *OpFd, const Operand *OpFs, const Operand *OpFt);
|
| +
|
| void sw(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
|
|
|
| - void lw(const Operand *OpRt, const Operand *OpBase, const uint32_t Offset);
|
| + void trunc_l_d(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void ret(void);
|
| + void trunc_l_s(const Operand *OpFd, const Operand *OpFs);
|
|
|
| - void b(Label *TargetLabel);
|
| + void trunc_w_d(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void trunc_w_s(const Operand *OpFd, const Operand *OpFs);
|
| +
|
| + void xor_(const Operand *OpRd, const Operand *OpRs, const Operand *OpRt);
|
| +
|
| + void xori(const Operand *OpRt, const Operand *OpRs, const uint32_t Imm);
|
|
|
| void bcc(const CondMIPS32::Cond Cond, const Operand *OpRs,
|
| const Operand *OpRt, Label *TargetLabel);
|
|
|