Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: src/IceInstMIPS32.h

Issue 1993993004: Subzero, MIPS32: Introduction of floating point registers (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Register allocation works, some code is removed Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/IceInstMIPS32.cpp » ('j') | src/IceInstMIPS32.def » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceInstMIPS32.h
diff --git a/src/IceInstMIPS32.h b/src/IceInstMIPS32.h
index 85f268e8ce9ccaab77b4a2f58bf8966570a2f50f..e5f3849004075c442ef1a6c4be01dfb6ebdbc621 100644
--- a/src/IceInstMIPS32.h
+++ b/src/IceInstMIPS32.h
@@ -127,9 +127,11 @@ public:
La,
Label,
Lui,
+ Mfc1,
Mfhi,
Mflo,
Mov, // actually a pseudo op for addi rd, rs, 0
+ Mtc1,
Mthi,
Mtlo,
Mul,
@@ -172,6 +174,8 @@ public:
const Cfg *Func);
static void emitUnaryopGPRTLoHi(const char *Opcode, const InstMIPS32 *Inst,
const Cfg *Func);
+ static void emitTwoAddr(const char *Opcode, const InstMIPS32 *Inst,
+ const Cfg *Func);
static void emitThreeAddr(const char *Opcode, const InstMIPS32 *Inst,
const Cfg *Func);
static void emitThreeAddrLoHi(const char *Opcode, const InstMIPS32 *Inst,
@@ -256,6 +260,50 @@ private:
static const char *Opcode;
};
+/// Instructions of the form opcode reg, reg.
+template <InstMIPS32::InstKindMIPS32 K>
+class InstMIPS32TwoAddrGPR : public InstMIPS32 {
+ InstMIPS32TwoAddrGPR() = delete;
+ InstMIPS32TwoAddrGPR(const InstMIPS32TwoAddrGPR &) = delete;
+ InstMIPS32TwoAddrGPR &operator=(const InstMIPS32TwoAddrGPR &) = delete;
+
+public:
+ static InstMIPS32TwoAddrGPR *create(Cfg *Func, Variable *Dest,
+ Variable *Src0) {
+ return new (Func->allocate<InstMIPS32TwoAddrGPR>())
+ InstMIPS32TwoAddrGPR(Func, Dest, Src0);
+ }
+ void emit(const Cfg *Func) const override {
+ if (!BuildDefs::dump())
+ return;
+ emitTwoAddr(Opcode, this, Func);
+ }
+ void emitIAS(const Cfg *Func) const override {
+ (void)Func;
+ llvm_unreachable("Not yet implemented");
+ }
+
+ void dump(const Cfg *Func) const override {
+ if (!BuildDefs::dump())
+ return;
+ Ostream &Str = Func->getContext()->getStrDump();
+ dumpDest(Func);
+ Str << " = ";
+ dumpOpcode(Str, Opcode, getDest()->getType());
+ Str << " ";
+ dumpSources(Func);
+ }
+ static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
+
+private:
+ InstMIPS32TwoAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0)
+ : InstMIPS32(Func, K, 2, Dest) {
Jim Stichnoth 2016/05/19 23:12:25 The "2" is the max number of src operands. I thin
obucinac 2016/05/27 11:13:18 Done.
+ addSource(Src0);
+ }
+
+ static const char *Opcode;
+};
+
/// Instructions of the form x := y op z. May have the side-effect of setting
/// status flags.
template <InstMIPS32::InstKindMIPS32 K>
@@ -472,8 +520,10 @@ using InstMIPS32And = InstMIPS32ThreeAddrGPR<InstMIPS32::And>;
using InstMIPS32Andi = InstMIPS32Imm16<InstMIPS32::Andi>;
using InstMIPS32Lui = InstMIPS32Imm16<InstMIPS32::Lui>;
using InstMIPS32La = InstMIPS32UnaryopGPR<InstMIPS32::La>;
+using InstMIPS32Mfc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mfc1>;
using InstMIPS32Mfhi = InstMIPS32UnaryopGPR<InstMIPS32::Mfhi>;
using InstMIPS32Mflo = InstMIPS32UnaryopGPR<InstMIPS32::Mflo>;
+using InstMIPS32Mtc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mtc1>;
using InstMIPS32Mthi = InstMIPS32UnaryopGPR<InstMIPS32::Mthi>;
using InstMIPS32Mtlo = InstMIPS32UnaryopGPR<InstMIPS32::Mtlo>;
using InstMIPS32Mul = InstMIPS32ThreeAddrGPR<InstMIPS32::Mul>;
« no previous file with comments | « no previous file | src/IceInstMIPS32.cpp » ('j') | src/IceInstMIPS32.def » ('J')

Powered by Google App Engine
This is Rietveld 408576698