| Index: src/IceInstX8632.cpp
|
| diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp
|
| index c0e8c8d933002a0e7c8da99c9ac227bf3c45aa2f..57fb1794c07df994ba75417282ee3d80448be164 100644
|
| --- a/src/IceInstX8632.cpp
|
| +++ b/src/IceInstX8632.cpp
|
| @@ -94,6 +94,11 @@ InstX8632Mul::InstX8632Mul(Cfg *Func, Variable *Dest, Variable *Source1,
|
| addSource(Source2);
|
| }
|
|
|
| +InstX8632Neg::InstX8632Neg(Cfg *Func, Operand *SrcDest)
|
| + : InstX8632(Func, InstX8632::Neg, 1, llvm::dyn_cast<Variable>(SrcDest)) {
|
| + addSource(SrcDest);
|
| +}
|
| +
|
| InstX8632Shld::InstX8632Shld(Cfg *Func, Variable *Dest, Variable *Source1,
|
| Variable *Source2)
|
| : InstX8632(Func, InstX8632::Shld, 3, Dest) {
|
| @@ -121,7 +126,7 @@ IceString InstX8632Label::getName(const Cfg *Func) const {
|
| }
|
|
|
| InstX8632Br::InstX8632Br(Cfg *Func, CfgNode *TargetTrue, CfgNode *TargetFalse,
|
| - InstX8632Label *Label, InstX8632Br::BrCond Condition)
|
| + InstX8632Label *Label, InstX8632::BrCond Condition)
|
| : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition),
|
| TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {}
|
|
|
| @@ -139,6 +144,15 @@ InstX8632Cdq::InstX8632Cdq(Cfg *Func, Variable *Dest, Operand *Source)
|
| addSource(Source);
|
| }
|
|
|
| +InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source,
|
| + InstX8632::BrCond Condition)
|
| + : InstX8632(Func, InstX8632::Cmov, 2, Dest), Condition(Condition) {
|
| + // The final result is either the original Dest, or Source, so mark
|
| + // both as sources.
|
| + addSource(Dest);
|
| + addSource(Source);
|
| +}
|
| +
|
| InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr,
|
| Variable *Eax, Variable *Desired,
|
| bool Locked)
|
| @@ -297,11 +311,6 @@ bool InstX8632Movq::isRedundantAssign() const {
|
| return false;
|
| }
|
|
|
| -InstX8632Sqrtss::InstX8632Sqrtss(Cfg *Func, Variable *Dest, Operand *Source)
|
| - : InstX8632(Func, InstX8632::Sqrtss, 1, Dest) {
|
| - addSource(Source);
|
| -}
|
| -
|
| InstX8632Ret::InstX8632Ret(Cfg *Func, Variable *Source)
|
| : InstX8632(Func, InstX8632::Ret, Source ? 1 : 0, NULL) {
|
| if (Source)
|
| @@ -429,7 +438,9 @@ void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func,
|
| Str << "\n";
|
| }
|
|
|
| -template <> const char *InstX8632Neg::Opcode = "neg";
|
| +template <> const char *InstX8632Bsf::Opcode = "bsf";
|
| +template <> const char *InstX8632Bsr::Opcode = "bsr";
|
| +template <> const char *InstX8632Sqrtss::Opcode = "sqrtss";
|
| template <> const char *InstX8632Add::Opcode = "add";
|
| template <> const char *InstX8632Addps::Opcode = "addps";
|
| template <> const char *InstX8632Adc::Opcode = "adc";
|
| @@ -453,6 +464,18 @@ template <> const char *InstX8632Shl::Opcode = "shl";
|
| template <> const char *InstX8632Shr::Opcode = "shr";
|
| template <> const char *InstX8632Sar::Opcode = "sar";
|
|
|
| +template <> void InstX8632Sqrtss::emit(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrEmit();
|
| + assert(getSrcSize() == 1);
|
| + Type Ty = getSrc(0)->getType();
|
| + assert(Ty == IceType_f32 || Ty == IceType_f64);
|
| + Str << "\tsqrt" << TypeX8632Attributes[Ty].SdSsString << "\t";
|
| + getDest()->emit(Func);
|
| + Str << ", ";
|
| + getSrc(0)->emit(Func);
|
| + Str << "\n";
|
| +}
|
| +
|
| template <> void InstX8632Addss::emit(const Cfg *Func) const {
|
| char buf[30];
|
| snprintf(buf, llvm::array_lengthof(buf), "add%s",
|
| @@ -523,6 +546,21 @@ void InstX8632Mul::dump(const Cfg *Func) const {
|
| dumpSources(Func);
|
| }
|
|
|
| +void InstX8632Neg::emit(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrEmit();
|
| + assert(getSrcSize() == 1);
|
| + Str << "\tneg\t";
|
| + getSrc(0)->emit(Func);
|
| + Str << "\n";
|
| +}
|
| +
|
| +void InstX8632Neg::dump(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrDump();
|
| + dumpDest(Func);
|
| + Str << " = neg." << getDest()->getType() << " ";
|
| + dumpSources(Func);
|
| +}
|
| +
|
| void InstX8632Shld::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 3);
|
| @@ -586,6 +624,27 @@ void InstX8632Cdq::dump(const Cfg *Func) const {
|
| dumpSources(Func);
|
| }
|
|
|
| +void InstX8632Cmov::emit(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrEmit();
|
| + Str << "\t";
|
| + assert(Condition != Br_None);
|
| + assert(getDest()->hasReg());
|
| + Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t";
|
| + getDest()->emit(Func);
|
| + Str << ", ";
|
| + getSrc(1)->emit(Func);
|
| + Str << "\n";
|
| +}
|
| +
|
| +void InstX8632Cmov::dump(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrDump();
|
| + Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << ".";
|
| + Str << getDest()->getType() << " ";
|
| + dumpDest(Func);
|
| + Str << ", ";
|
| + dumpSources(Func);
|
| +}
|
| +
|
| void InstX8632Cmpxchg::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 3);
|
| @@ -1007,25 +1066,6 @@ void InstX8632Ret::dump(const Cfg *Func) const {
|
| dumpSources(Func);
|
| }
|
|
|
| -void InstX8632Sqrtss::emit(const Cfg *Func) const {
|
| - Ostream &Str = Func->getContext()->getStrEmit();
|
| - assert(getSrcSize() == 1);
|
| - Type Ty = getSrc(0)->getType();
|
| - assert(Ty == IceType_f32 || Ty == IceType_f64);
|
| - Str << "\tsqrt" << TypeX8632Attributes[Ty].SdSsString << "\t";
|
| - getDest()->emit(Func);
|
| - Str << ", ";
|
| - getSrc(0)->emit(Func);
|
| - Str << "\n";
|
| -}
|
| -
|
| -void InstX8632Sqrtss::dump(const Cfg *Func) const {
|
| - Ostream &Str = Func->getContext()->getStrDump();
|
| - dumpDest(Func);
|
| - Str << " = sqrt." << getDest()->getType() << " ";
|
| - dumpSources(Func);
|
| -}
|
| -
|
| void InstX8632Xadd::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| if (Locked) {
|
|
|