Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index 376d4541add697a0643fc1e7d3f585cce5a3ac2f..47038ef3be37bbc09465cc3fd502ced47856855d 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -182,6 +182,11 @@ InstX8632Mov::InstX8632Mov(Cfg *Func, Variable *Dest, Operand *Source) |
addSource(Source); |
} |
+InstX8632Movp::InstX8632Movp(Cfg *Func, Variable *Dest, Operand *Source) |
+ : InstX8632(Func, InstX8632::Movp, 1, Dest) { |
+ addSource(Source); |
+} |
+ |
InstX8632StoreQ::InstX8632StoreQ(Cfg *Func, Operand *Value, OperandX8632 *Mem) |
: InstX8632(Func, InstX8632::StoreQ, 2, NULL) { |
addSource(Value); |
@@ -237,6 +242,19 @@ bool InstX8632Mov::isRedundantAssign() const { |
return false; |
} |
+bool InstX8632Movp::isRedundantAssign() const { |
jvoung (off chromium)
2014/06/26 23:33:46
At some point, we should just have a base implemen
wala
2014/06/27 21:09:19
I'll add a TODO...
|
+ Variable *Src = llvm::dyn_cast<Variable>(getSrc(0)); |
+ if (Src == NULL) |
+ return false; |
+ if (getDest()->hasReg() && getDest()->getRegNum() == Src->getRegNum()) { |
+ return true; |
+ } |
+ if (!getDest()->hasReg() && !Src->hasReg() && |
+ Dest->getStackOffset() == Src->getStackOffset()) |
+ return true; |
+ return false; |
+} |
+ |
bool InstX8632Movq::isRedundantAssign() const { |
Variable *Src = llvm::dyn_cast<Variable>(getSrc(0)); |
if (Src == NULL) |
@@ -680,6 +698,19 @@ void InstX8632Mov::dump(const Cfg *Func) const { |
dumpSources(Func); |
} |
+void InstX8632Movp::emit(const Cfg *Func) const { |
+ // TODO(wala): movups works with all vector operands, but there exist |
Jim Stichnoth
2014/06/27 18:30:16
maybe TODO(wala,stichnot) just in case
|
+ // other instructions (movaps, movdqa, movdqu) that may perform |
+ // better, depending on the data type and alignment of the operands. |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 1); |
+ Str << "\tmovups\t"; |
+ getDest()->emit(Func); |
+ Str << ", "; |
+ getSrc(0)->emit(Func); |
+ Str << "\n"; |
+} |
+ |
void InstX8632Movq::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |
@@ -692,6 +723,14 @@ void InstX8632Movq::emit(const Cfg *Func) const { |
Str << "\n"; |
} |
+void InstX8632Movp::dump(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ Str << "movups." << getDest()->getType() << " "; |
+ dumpDest(Func); |
+ Str << ", "; |
+ dumpSources(Func); |
+} |
+ |
void InstX8632Movq::dump(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrDump(); |
Str << "movq." << getDest()->getType() << " "; |