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

Unified Diff: src/IceInstARM32.cpp

Issue 1159013002: Subzero ARM: addProlog/addEpilogue -- share some code with x86. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: rename field Created 5 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/IceInstARM32.cpp
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
index 713df3a7db596fa28b3fea9d455250c5a9446d99..3e1664d59377bb070a3c2e43e3b9925aa4b4bf49 100644
--- a/src/IceInstARM32.cpp
+++ b/src/IceInstARM32.cpp
@@ -260,6 +260,25 @@ InstARM32Mla::InstARM32Mla(Cfg *Func, Variable *Dest, Variable *Src0,
addSource(Acc);
}
+InstARM32Pop::InstARM32Pop(Cfg *Func, const VarList &Dests)
+ : InstARM32(Func, InstARM32::Pop, 0, Dests[0]), Dests(Dests) {
+ // We only track the first Dest directly. Other Dests should be
Jim Stichnoth 2015/05/30 16:58:54 I think we should consider treating the Dests valu
jvoung (off chromium) 2015/06/01 18:00:23 Yeah that seems cleaner, and it's already storing
+ // modeled with a FakeDef.
+ // A pop instruction affects the stack pointer and so it should not
+ // be allowed to be automatically dead-code eliminated. (The
+ // corresponding push instruction doesn't need this treatment
+ // because it has no dest variable and therefore won't be dead-code
+ // eliminated.) This is needed for late-stage liveness analysis
+ // (e.g. asm-verbose mode).
+ HasSideEffects = true;
+}
+
+InstARM32Push::InstARM32Push(Cfg *Func, const VarList &Srcs)
+ : InstARM32(Func, InstARM32::Push, Srcs.size(), nullptr) {
+ for (Variable *Source : Srcs)
+ addSource(Source);
+}
+
InstARM32Ret::InstARM32Ret(Cfg *Func, Variable *LR, Variable *Source)
: InstARM32(Func, InstARM32::Ret, Source ? 2 : 1, nullptr) {
addSource(LR);
@@ -554,6 +573,66 @@ template <> void InstARM32Movt::emit(const Cfg *Func) const {
}
}
+void InstARM32Pop::emit(const Cfg *Func) const {
+ if (!ALLOW_DUMP)
+ return;
+ assert(Dests.size() > 0);
+ Ostream &Str = Func->getContext()->getStrEmit();
+ Str << "\t"
+ << "pop"
+ << "\t{";
+ for (SizeT I = 0; I < Dests.size(); ++I) {
+ if (I > 0)
+ Str << ", ";
+ Dests[I]->emit(Func);
+ }
+ Str << "}";
+}
+
+void InstARM32Pop::emitIAS(const Cfg *Func) const {
+ (void)Func;
+ llvm_unreachable("Not yet implemented");
+}
+
+void InstARM32Pop::dump(const Cfg *Func) const {
+ if (!ALLOW_DUMP)
+ return;
+ Ostream &Str = Func->getContext()->getStrDump();
+ Str << "pop"
+ << " ";
+ for (SizeT I = 0; I < Dests.size(); ++I) {
+ if (I > 0)
+ Str << ", ";
+ Dests[I]->dump(Func);
+ }
+}
+
+void InstARM32Push::emit(const Cfg *Func) const {
+ if (!ALLOW_DUMP)
+ return;
+ assert(getSrcSize() > 0);
+ Ostream &Str = Func->getContext()->getStrEmit();
+ Str << "\t"
+ << "push"
+ << "\t{";
+ emitSources(Func);
+ Str << "}";
+}
+
+void InstARM32Push::emitIAS(const Cfg *Func) const {
+ (void)Func;
+ llvm_unreachable("Not yet implemented");
+}
+
+void InstARM32Push::dump(const Cfg *Func) const {
+ if (!ALLOW_DUMP)
+ return;
+ Ostream &Str = Func->getContext()->getStrDump();
+ Str << "push"
+ << " ";
+ dumpSources(Func);
+}
+
void InstARM32Ret::emit(const Cfg *Func) const {
if (!ALLOW_DUMP)
return;
@@ -683,7 +762,7 @@ void OperandARM32Mem::dump(const Cfg *Func, Ostream &Str) const {
} else {
getOffset()->dump(Func, Str);
}
- Str << "] AddrMode==" << getAddrMode() << "\n";
+ Str << "] AddrMode==" << getAddrMode();
}
void OperandARM32FlexImm::emit(const Cfg *Func) const {
« no previous file with comments | « src/IceInstARM32.h ('k') | src/IceInstARM32.def » ('j') | src/IceTargetLowering.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698