| Index: src/IceInstMIPS32.h
|
| diff --git a/src/IceInstMIPS32.h b/src/IceInstMIPS32.h
|
| index c2b09453852abe33cb9b366df2b31c694d51c489..cf2e865abfe3f040556e927c34cd4ce8abf33465 100644
|
| --- a/src/IceInstMIPS32.h
|
| +++ b/src/IceInstMIPS32.h
|
| @@ -224,6 +224,7 @@ public:
|
| La,
|
| Label,
|
| Ldc1,
|
| + Ll,
|
| Lui,
|
| Lw,
|
| Lwc1,
|
| @@ -253,6 +254,7 @@ public:
|
| Or,
|
| Ori,
|
| Ret,
|
| + Sc,
|
| Sdc1,
|
| Sll,
|
| Sllv,
|
| @@ -272,6 +274,7 @@ public:
|
| Subu,
|
| Sw,
|
| Swc1,
|
| + Sync,
|
| Teq,
|
| Trunc_l_d,
|
| Trunc_l_s,
|
| @@ -598,35 +601,40 @@ public:
|
| return;
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| const Type Ty = getDest()->getType();
|
| - switch (Ty) {
|
| - case IceType_i1:
|
| - case IceType_i8:
|
| - Str << "\t"
|
| - << "lb"
|
| - << "\t";
|
| - break;
|
| - case IceType_i16:
|
| - Str << "\t"
|
| - << "lh"
|
| - << "\t";
|
| - break;
|
| - case IceType_i32:
|
| - Str << "\t"
|
| - << "lw"
|
| - << "\t";
|
| - break;
|
| - case IceType_f32:
|
| - Str << "\t"
|
| - << "lwc1"
|
| - << "\t";
|
| - break;
|
| - case IceType_f64:
|
| - Str << "\t"
|
| - << "ldc1"
|
| - << "\t";
|
| - break;
|
| - default:
|
| - llvm_unreachable("InstMIPS32Load unknown type");
|
| +
|
| + if (getKind() == static_cast<InstKind>(Ll)) {
|
| + Str << "\t" << Opcode << "\t";
|
| + } else {
|
| + switch (Ty) {
|
| + case IceType_i1:
|
| + case IceType_i8:
|
| + Str << "\t"
|
| + "lb"
|
| + "\t";
|
| + break;
|
| + case IceType_i16:
|
| + Str << "\t"
|
| + "lh"
|
| + "\t";
|
| + break;
|
| + case IceType_i32:
|
| + Str << "\t"
|
| + "lw"
|
| + "\t";
|
| + break;
|
| + case IceType_f32:
|
| + Str << "\t"
|
| + "lwc1"
|
| + "\t";
|
| + break;
|
| + case IceType_f64:
|
| + Str << "\t"
|
| + "ldc1"
|
| + "\t";
|
| + break;
|
| + default:
|
| + llvm_unreachable("InstMIPS32Load unknown type");
|
| + }
|
| }
|
| getDest()->emit(Func);
|
| Str << ", ";
|
| @@ -683,35 +691,40 @@ public:
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 2);
|
| const Type Ty = getSrc(0)->getType();
|
| - switch (Ty) {
|
| - case IceType_i1:
|
| - case IceType_i8:
|
| - Str << "\t"
|
| - << "sb"
|
| - << "\t";
|
| - break;
|
| - case IceType_i16:
|
| - Str << "\t"
|
| - << "sh"
|
| - << "\t";
|
| - break;
|
| - case IceType_i32:
|
| - Str << "\t"
|
| - << "sw"
|
| - << "\t";
|
| - break;
|
| - case IceType_f32:
|
| - Str << "\t"
|
| - << "swc1"
|
| - << "\t";
|
| - break;
|
| - case IceType_f64:
|
| - Str << "\t"
|
| - << "sdc1"
|
| - << "\t";
|
| - break;
|
| - default:
|
| - llvm_unreachable("InstMIPS32Store unknown type");
|
| +
|
| + if (getKind() == static_cast<InstKind>(Sc)) {
|
| + Str << "\t" << Opcode << "\t";
|
| + } else {
|
| + switch (Ty) {
|
| + case IceType_i1:
|
| + case IceType_i8:
|
| + Str << "\t"
|
| + "sb"
|
| + "\t";
|
| + break;
|
| + case IceType_i16:
|
| + Str << "\t"
|
| + "sh"
|
| + "\t";
|
| + break;
|
| + case IceType_i32:
|
| + Str << "\t"
|
| + "sw"
|
| + "\t";
|
| + break;
|
| + case IceType_f32:
|
| + Str << "\t"
|
| + "swc1"
|
| + "\t";
|
| + break;
|
| + case IceType_f64:
|
| + Str << "\t"
|
| + "sdc1"
|
| + "\t";
|
| + break;
|
| + default:
|
| + llvm_unreachable("InstMIPS32Store unknown type");
|
| + }
|
| }
|
| getSrc(0)->emit(Func);
|
| Str << ", ";
|
| @@ -793,6 +806,13 @@ public:
|
| InstMIPS32Br(Func, NoCondTarget, Target, NoLabel, CondMIPS32::AL);
|
| }
|
|
|
| + static InstMIPS32Br *create(Cfg *Func, CfgNode *Target,
|
| + const InstMIPS32Label *Label) {
|
| + constexpr CfgNode *NoCondTarget = nullptr;
|
| + return new (Func->allocate<InstMIPS32Br>())
|
| + InstMIPS32Br(Func, NoCondTarget, Target, Label, CondMIPS32::AL);
|
| + }
|
| +
|
| /// Create a conditional branch to the false node.
|
| static InstMIPS32Br *create(Cfg *Func, CfgNode *TargetTrue,
|
| CfgNode *TargetFalse, Operand *Src0,
|
| @@ -921,6 +941,40 @@ private:
|
| static const char *Opcode;
|
| };
|
|
|
| +class InstMIPS32Sync : public InstMIPS32 {
|
| + InstMIPS32Sync() = delete;
|
| + InstMIPS32Sync(const InstMIPS32Sync &) = delete;
|
| + InstMIPS32Sync &operator=(const InstMIPS32Sync &) = delete;
|
| +
|
| +public:
|
| + static InstMIPS32Sync *create(Cfg *Func) {
|
| + return new (Func->allocate<InstMIPS32Sync>()) InstMIPS32Sync(Func);
|
| + }
|
| +
|
| + void emit(const Cfg *Func) const override {
|
| + if (!BuildDefs::dump())
|
| + return;
|
| + Ostream &Str = Func->getContext()->getStrEmit();
|
| + Str << "\t" << Opcode << "\t";
|
| + }
|
| +
|
| + void dump(const Cfg *Func) const override {
|
| + if (!BuildDefs::dump())
|
| + return;
|
| + Func->getContext()->getStrDump() << Opcode << "\t";
|
| + }
|
| +
|
| + static bool classof(const Inst *Inst) {
|
| + return isClassof(Inst, InstMIPS32::Sync);
|
| + }
|
| +
|
| + void emitIAS(const Cfg *Func) const override;
|
| +
|
| +private:
|
| + InstMIPS32Sync(Cfg *Func) : InstMIPS32(Func, InstMIPS32::Sync, 0, nullptr) {}
|
| + static const char *Opcode;
|
| +};
|
| +
|
| // Trap
|
| template <InstMIPS32::InstKindMIPS32 K>
|
| class InstMIPS32Trap : public InstMIPS32 {
|
| @@ -1175,6 +1229,7 @@ using InstMIPS32Div_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Div_s>;
|
| using InstMIPS32Divu = InstMIPS32ThreeAddrGPR<InstMIPS32::Divu>;
|
| using InstMIPS32La = InstMIPS32UnaryopGPR<InstMIPS32::La>;
|
| using InstMIPS32Ldc1 = InstMIPS32Load<InstMIPS32::Ldc1>;
|
| +using InstMIPS32Ll = InstMIPS32Load<InstMIPS32::Ll>;
|
| using InstMIPS32Lui = InstMIPS32UnaryopGPR<InstMIPS32::Lui>;
|
| using InstMIPS32Lw = InstMIPS32Load<InstMIPS32::Lw>;
|
| using InstMIPS32Lwc1 = InstMIPS32Load<InstMIPS32::Lwc1>;
|
| @@ -1202,6 +1257,7 @@ using InstMIPS32Multu = InstMIPS32ThreeAddrGPR<InstMIPS32::Multu>;
|
| using InstMIPS32Nor = InstMIPS32ThreeAddrGPR<InstMIPS32::Nor>;
|
| using InstMIPS32Or = InstMIPS32ThreeAddrGPR<InstMIPS32::Or>;
|
| using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>;
|
| +using InstMIPS32Sc = InstMIPS32Store<InstMIPS32::Sc>;
|
| using InstMIPS32Sdc1 = InstMIPS32Store<InstMIPS32::Sdc1>;
|
| using InstMIPS32Sll = InstMIPS32Imm16<InstMIPS32::Sll>;
|
| using InstMIPS32Sllv = InstMIPS32ThreeAddrGPR<InstMIPS32::Sllv>;
|
|
|