Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index 8930a17a634df5632b8f8d914d0b0fef059c2356..cdc81aaf5e0b0492f1653ed8d79302d168d73985 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -303,10 +303,8 @@ InstX8632Fstp::InstX8632Fstp(Cfg *Func, Variable *Dest) |
InstX8632Pop::InstX8632Pop(Cfg *Func, Variable *Dest) |
: InstX8632(Func, InstX8632::Pop, 0, Dest) {} |
-InstX8632Push::InstX8632Push(Cfg *Func, Operand *Source, |
- bool SuppressStackAdjustment) |
- : InstX8632(Func, InstX8632::Push, 1, NULL), |
- SuppressStackAdjustment(SuppressStackAdjustment) { |
+InstX8632Push::InstX8632Push(Cfg *Func, Variable *Source) |
+ : InstX8632(Func, InstX8632::Push, 1, NULL) { |
addSource(Source); |
} |
@@ -1868,34 +1866,24 @@ void InstX8632AdjustStack::dump(const Cfg *Func) const { |
void InstX8632Push::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |
- Type Ty = getSrc(0)->getType(); |
- Variable *Var = llvm::dyn_cast<Variable>(getSrc(0)); |
- if ((isVectorType(Ty) || isScalarFloatingType(Ty)) && Var && Var->hasReg()) { |
- // The xmm registers can't be directly pushed, so we fake it by |
- // decrementing esp and then storing to [esp]. |
- Str << "\tsub\tesp, " << typeWidthInBytes(Ty) << "\n"; |
- if (!SuppressStackAdjustment) |
- Func->getTarget()->updateStackAdjustment(typeWidthInBytes(Ty)); |
- if (isVectorType(Ty)) { |
- Str << "\tmovups\txmmword ptr [esp], "; |
- } else { |
- Str << "\tmov" << TypeX8632Attributes[Ty].SdSsString << "\t" |
- << TypeX8632Attributes[Ty].WidthString << " [esp], "; |
- } |
- getSrc(0)->emit(Func); |
- Str << "\n"; |
- } else if (Ty == IceType_f64 && (!Var || !Var->hasReg())) { |
- // A double on the stack has to be pushed as two halves. Push the |
- // upper half followed by the lower half for little-endian. TODO: |
- // implement. |
- llvm_unreachable("Missing support for pushing doubles from memory"); |
- } else { |
- Str << "\tpush\t"; |
- getSrc(0)->emit(Func); |
- Str << "\n"; |
- if (!SuppressStackAdjustment) |
- Func->getTarget()->updateStackAdjustment(4); |
- } |
+ // Push is currently only used for saving GPRs. |
+ Variable *Var = llvm::cast<Variable>(getSrc(0)); |
+ assert(Var->hasReg()); |
+ Str << "\tpush\t"; |
+ Var->emit(Func); |
+ Str << "\n"; |
+} |
+ |
+void InstX8632Push::emitIAS(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 1); |
+ // Push is currently only used for saving GPRs. |
+ Variable *Var = llvm::cast<Variable>(getSrc(0)); |
+ assert(Var->hasReg()); |
+ x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); |
+ intptr_t StartPosition = Asm->GetPosition(); |
+ Asm->pushl(RegX8632::getEncodedGPR(Var->getRegNum())); |
+ emitIASBytes(Str, Asm, StartPosition); |
} |
void InstX8632Push::dump(const Cfg *Func) const { |