Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index c30c9f55ee1f451a58588cefe0f64050036204bb..f0eb3d1b4c6de84f77cacdbb79be9a2a13cc3c71 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -136,11 +136,8 @@ InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget) |
addSource(CallTarget); |
} |
-InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source) |
- : InstX8632(Func, InstX8632::Cdq, 1, Dest) { |
- assert(Dest->getRegNum() == TargetX8632::Reg_edx); |
- assert(llvm::isa<Variable>(Source)); |
- assert(llvm::dyn_cast<Variable>(Source)->getRegNum() == TargetX8632::Reg_eax); |
+InstX8632Cbwdq::InstX8632Cbwdq(Cfg *Func, Variable *Dest, Operand *Source) |
+ : InstX8632(Func, InstX8632::Cbwdq, 1, Dest) { |
addSource(Source); |
} |
@@ -721,16 +718,38 @@ void InstX8632Shrd::dump(const Cfg *Func) const { |
dumpSources(Func); |
} |
-void InstX8632Cdq::emit(const Cfg *Func) const { |
+void InstX8632Cbwdq::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |
- Str << "\tcdq\n"; |
+ Variable *Dest = getDest(); |
+ (void)Dest; |
+ Operand *Src0 = getSrc(0); |
+ assert(llvm::isa<Variable>(Dest)); |
Jim Stichnoth
2014/08/07 19:58:10
This is redundant, since Dest is types as a Variab
wala
2014/08/07 20:30:35
Woops, done.
|
+ assert(llvm::isa<Variable>(Src0)); |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == TargetX8632::Reg_eax); |
+ switch (Src0->getType()) { |
+ default: |
+ llvm_unreachable("unexpected source type!"); |
+ break; |
+ case IceType_i8: |
+ assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_eax); |
Jim Stichnoth
2014/08/07 19:58:10
Don't need to cast Dest to Variable, here and belo
wala
2014/08/07 20:30:35
Done.
|
+ Str << "\tcbw\n"; |
+ break; |
+ case IceType_i16: |
+ assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_edx); |
+ Str << "\tcwd\n"; |
+ break; |
+ case IceType_i32: |
+ assert(llvm::cast<Variable>(Dest)->getRegNum() == TargetX8632::Reg_edx); |
+ Str << "\tcdq\n"; |
+ break; |
+ } |
} |
-void InstX8632Cdq::dump(const Cfg *Func) const { |
+void InstX8632Cbwdq::dump(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrDump(); |
dumpDest(Func); |
- Str << " = cdq." << getSrc(0)->getType() << " "; |
+ Str << " = cbw/cwd/cdq." << getSrc(0)->getType() << " "; |
dumpSources(Func); |
} |