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

Unified Diff: src/IceInstMIPS32.cpp

Issue 1993773004: [Subzero][MIPS32] Addition of bool folding machinery and implementation of conditional branches (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addressed review comments 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
Index: src/IceInstMIPS32.cpp
diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp
index 9ba87776c22526868634bb6c4b2bf51925f15d18..bd44830ddf8dd87439caf4f3eac05ea017538108 100644
--- a/src/IceInstMIPS32.cpp
+++ b/src/IceInstMIPS32.cpp
@@ -25,6 +25,17 @@
namespace Ice {
namespace MIPS32 {
+const struct InstMIPS32CondAttributes_ {
+ CondMIPS32::Cond Opposite;
+ const char *EmitString;
+} InstMIPS32CondAttributes[] = {
+#define X(tag, opp, emit) \
+ { CondMIPS32::opp, emit } \
+ ,
+ ICEINSTMIPS32COND_TABLE
+#undef X
+};
+
bool OperandMIPS32Mem::canHoldOffset(Type Ty, bool SignExt, int32_t Offset) {
(void)SignExt;
(void)Ty;
@@ -112,9 +123,27 @@ template <> void InstMIPS32Multu::emit(const Cfg *Func) const {
InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
const CfgNode *TargetFalse,
- const InstMIPS32Label *Label)
+ const InstMIPS32Label *Label, CondMIPS32::Cond Cond)
: InstMIPS32(Func, InstMIPS32::Br, 0, nullptr), TargetTrue(TargetTrue),
- TargetFalse(TargetFalse), Label(Label) {}
+ TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {}
+
+InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
+ const CfgNode *TargetFalse, Operand *Src0,
+ const InstMIPS32Label *Label, CondMIPS32::Cond Cond)
+ : InstMIPS32(Func, InstMIPS32::Br, 1, nullptr), TargetTrue(TargetTrue),
+ TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {
+ addSource(Src0);
+}
+
+InstMIPS32Br::InstMIPS32Br(Cfg *Func, const CfgNode *TargetTrue,
+ const CfgNode *TargetFalse, Operand *Src0,
+ Operand *Src1, const InstMIPS32Label *Label,
+ CondMIPS32::Cond Cond)
+ : InstMIPS32(Func, InstMIPS32::Br, 2, nullptr), TargetTrue(TargetTrue),
+ TargetFalse(TargetFalse), Label(Label), Predicate(Cond) {
+ addSource(Src0);
+ addSource(Src1);
+}
InstMIPS32Label::InstMIPS32Label(Cfg *Func, TargetMIPS32 *Target)
: InstMIPS32(Func, InstMIPS32::Label, 0, nullptr),
@@ -271,15 +300,56 @@ void InstMIPS32Br::emit(const Cfg *Func) const {
return;
Ostream &Str = Func->getContext()->getStrEmit();
Str << "\t"
- "b"
- << "\t";
+ "b" << InstMIPS32CondAttributes[Predicate].EmitString << "\t";
if (Label) {
Str << Label->getLabelName();
} else {
if (isUnconditionalBranch()) {
Str << getTargetFalse()->getAsmName();
} else {
- // TODO(reed kotler): Finish implementing conditional branch.
+ switch (Predicate) {
+ default:
+ break;
+ case CondMIPS32::EQ:
+ case CondMIPS32::NE: {
+ getSrc(0)->emit(Func);
+ Str << ", ";
+ getSrc(1)->emit(Func);
+ Str << ", ";
+ break;
+ }
+ case CondMIPS32::EQZ:
+ case CondMIPS32::NEZ:
+ case CondMIPS32::LEZ:
+ case CondMIPS32::LTZ:
+ case CondMIPS32::GEZ:
+ case CondMIPS32::GTZ: {
+ getSrc(0)->emit(Func);
+ Str << ", ";
+ break;
+ }
+ }
+ Str << getTargetFalse()->getAsmName();
+ }
+ }
+}
+
+void InstMIPS32Br::dump(const Cfg *Func) const {
+ if (!BuildDefs::dump())
+ return;
+ Ostream &Str = Func->getContext()->getStrDump();
+ Str << "\t"
+ "b" << InstMIPS32CondAttributes[Predicate].EmitString << "\t";
+
+ if (Label) {
+ Str << Label->getLabelName();
+ } else {
+ if (isUnconditionalBranch()) {
+ Str << getTargetFalse()->getAsmName();
+ } else {
+ dumpSources(Func);
+ Str << ", ";
+ Str << getTargetFalse()->getAsmName();
}
}
}
« src/IceInstMIPS32.h ('K') | « src/IceInstMIPS32.h ('k') | src/IceInstMIPS32.def » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698