| Index: src/IceInstX8632.cpp
|
| diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp
|
| index df28696ff98336e0c24ef8692d958dcb59693522..305be738b5288d764268cbf33241617ec6c740a2 100644
|
| --- a/src/IceInstX8632.cpp
|
| +++ b/src/IceInstX8632.cpp
|
| @@ -14,8 +14,10 @@
|
|
|
| #include "IceCfg.h"
|
| #include "IceCfgNode.h"
|
| +#include "IceConditionCodesX8632.h"
|
| #include "IceInst.h"
|
| #include "IceInstX8632.h"
|
| +#include "IceRegistersX8632.h"
|
| #include "IceTargetLoweringX8632.h"
|
| #include "IceOperand.h"
|
|
|
| @@ -24,12 +26,12 @@ namespace Ice {
|
| namespace {
|
|
|
| const struct InstX8632BrAttributes_ {
|
| - InstX8632::BrCond Opposite;
|
| + CondX86::BrCond Opposite;
|
| const char *DisplayString;
|
| const char *EmitString;
|
| } InstX8632BrAttributes[] = {
|
| -#define X(tag, opp, dump, emit) \
|
| - { InstX8632::opp, dump, emit } \
|
| +#define X(tag, encode, opp, dump, emit) \
|
| + { CondX86::opp, dump, emit } \
|
| ,
|
| ICEINSTX8632BR_TABLE
|
| #undef X
|
| @@ -131,8 +133,7 @@ IceString InstX8632Label::getName(const Cfg *Func) const {
|
|
|
| InstX8632Br::InstX8632Br(Cfg *Func, const CfgNode *TargetTrue,
|
| const CfgNode *TargetFalse,
|
| - const InstX8632Label *Label,
|
| - InstX8632::BrCond Condition)
|
| + const InstX8632Label *Label, CondX86::BrCond Condition)
|
| : InstX8632(Func, InstX8632::Br, 0, NULL), Condition(Condition),
|
| TargetTrue(TargetTrue), TargetFalse(TargetFalse), Label(Label) {}
|
|
|
| @@ -151,7 +152,7 @@ bool InstX8632Br::optimizeBranch(const CfgNode *NextNode) {
|
| return false;
|
|
|
| // Unconditional branch to the next node can be removed.
|
| - if (Condition == Br_None && getTargetFalse() == NextNode) {
|
| + if (Condition == CondX86::Br_None && getTargetFalse() == NextNode) {
|
| assert(getTargetTrue() == NULL);
|
| setDeleted();
|
| return true;
|
| @@ -166,7 +167,7 @@ bool InstX8632Br::optimizeBranch(const CfgNode *NextNode) {
|
| // (which was already tested above), then invert the branch
|
| // condition, swap the targets, and set new fallthrough to NULL.
|
| if (getTargetTrue() == NextNode) {
|
| - assert(Condition != Br_None);
|
| + assert(Condition != CondX86::Br_None);
|
| Condition = InstX8632BrAttributes[Condition].Opposite;
|
| TargetTrue = getTargetFalse();
|
| TargetFalse = NULL;
|
| @@ -182,7 +183,7 @@ InstX8632Call::InstX8632Call(Cfg *Func, Variable *Dest, Operand *CallTarget)
|
| }
|
|
|
| InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source,
|
| - InstX8632::BrCond Condition)
|
| + CondX86::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.
|
| @@ -191,7 +192,7 @@ InstX8632Cmov::InstX8632Cmov(Cfg *Func, Variable *Dest, Operand *Source,
|
| }
|
|
|
| InstX8632Cmpps::InstX8632Cmpps(Cfg *Func, Variable *Dest, Operand *Source,
|
| - InstX8632Cmpps::CmppsCond Condition)
|
| + CondX86::CmppsCond Condition)
|
| : InstX8632(Func, InstX8632::Cmpps, 2, Dest), Condition(Condition) {
|
| addSource(Dest);
|
| addSource(Source);
|
| @@ -202,7 +203,7 @@ InstX8632Cmpxchg::InstX8632Cmpxchg(Cfg *Func, Operand *DestOrAddr,
|
| bool Locked)
|
| : InstX8632Lockable(Func, InstX8632::Cmpxchg, 3,
|
| llvm::dyn_cast<Variable>(DestOrAddr), Locked) {
|
| - assert(Eax->getRegNum() == TargetX8632::Reg_eax);
|
| + assert(Eax->getRegNum() == RegX8632::Reg_eax);
|
| addSource(DestOrAddr);
|
| addSource(Eax);
|
| addSource(Desired);
|
| @@ -213,10 +214,10 @@ InstX8632Cmpxchg8b::InstX8632Cmpxchg8b(Cfg *Func, OperandX8632 *Addr,
|
| Variable *Ecx, Variable *Ebx,
|
| bool Locked)
|
| : InstX8632Lockable(Func, InstX8632::Cmpxchg, 5, NULL, Locked) {
|
| - assert(Edx->getRegNum() == TargetX8632::Reg_edx);
|
| - assert(Eax->getRegNum() == TargetX8632::Reg_eax);
|
| - assert(Ecx->getRegNum() == TargetX8632::Reg_ecx);
|
| - assert(Ebx->getRegNum() == TargetX8632::Reg_ebx);
|
| + assert(Edx->getRegNum() == RegX8632::Reg_edx);
|
| + assert(Eax->getRegNum() == RegX8632::Reg_eax);
|
| + assert(Ecx->getRegNum() == RegX8632::Reg_ecx);
|
| + assert(Ebx->getRegNum() == RegX8632::Reg_ebx);
|
| addSource(Addr);
|
| addSource(Edx);
|
| addSource(Eax);
|
| @@ -347,7 +348,7 @@ void InstX8632Br::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| Str << "\t";
|
|
|
| - if (Condition == Br_None) {
|
| + if (Condition == CondX86::Br_None) {
|
| Str << "jmp";
|
| } else {
|
| Str << InstX8632BrAttributes[Condition].EmitString;
|
| @@ -356,7 +357,7 @@ void InstX8632Br::emit(const Cfg *Func) const {
|
| if (Label) {
|
| Str << "\t" << Label->getName(Func) << "\n";
|
| } else {
|
| - if (Condition == Br_None) {
|
| + if (Condition == CondX86::Br_None) {
|
| Str << "\t" << getTargetFalse()->getAsmName() << "\n";
|
| } else {
|
| Str << "\t" << getTargetTrue()->getAsmName() << "\n";
|
| @@ -371,7 +372,7 @@ void InstX8632Br::dump(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrDump();
|
| Str << "br ";
|
|
|
| - if (Condition == Br_None) {
|
| + if (Condition == CondX86::Br_None) {
|
| Str << "label %"
|
| << (Label ? Label->getName(Func) : getTargetFalse()->getName());
|
| return;
|
| @@ -422,7 +423,7 @@ void emitTwoAddress(const char *Opcode, const Inst *Inst, const Cfg *Func,
|
| bool EmittedSrc1 = false;
|
| if (ShiftHack) {
|
| Variable *ShiftReg = llvm::dyn_cast<Variable>(Inst->getSrc(1));
|
| - if (ShiftReg && ShiftReg->getRegNum() == TargetX8632::Reg_ecx) {
|
| + if (ShiftReg && ShiftReg->getRegNum() == RegX8632::Reg_ecx) {
|
| Str << "cl";
|
| EmittedSrc1 = true;
|
| }
|
| @@ -611,7 +612,7 @@ void emitVariableBlendInst(const char *Opcode, const Inst *Inst,
|
| assert(Inst->getSrcSize() == 3);
|
| assert(llvm::isa<Variable>(Inst->getSrc(2)));
|
| assert(llvm::cast<Variable>(Inst->getSrc(2))->getRegNum() ==
|
| - TargetX8632::Reg_xmm0);
|
| + RegX8632::Reg_xmm0);
|
| Str << "\t" << Opcode << "\t";
|
| Inst->getDest()->emit(Func);
|
| Str << ", ";
|
| @@ -640,7 +641,7 @@ template <> void InstX8632Imul::emit(const Cfg *Func) const {
|
| // The 8-bit version of imul only allows the form "imul r/m8".
|
| Variable *Src0 = llvm::dyn_cast<Variable>(getSrc(0));
|
| (void)Src0;
|
| - assert(Src0 && Src0->getRegNum() == TargetX8632::Reg_eax);
|
| + assert(Src0 && Src0->getRegNum() == RegX8632::Reg_eax);
|
| Str << "\timul\t";
|
| getSrc(1)->emit(Func);
|
| Str << "\n";
|
| @@ -662,21 +663,21 @@ template <> void InstX8632Cbwdq::emit(const Cfg *Func) const {
|
| assert(getSrcSize() == 1);
|
| Operand *Src0 = getSrc(0);
|
| assert(llvm::isa<Variable>(Src0));
|
| - assert(llvm::cast<Variable>(Src0)->getRegNum() == TargetX8632::Reg_eax);
|
| + assert(llvm::cast<Variable>(Src0)->getRegNum() == RegX8632::Reg_eax);
|
| switch (Src0->getType()) {
|
| default:
|
| llvm_unreachable("unexpected source type!");
|
| break;
|
| case IceType_i8:
|
| - assert(getDest()->getRegNum() == TargetX8632::Reg_eax);
|
| + assert(getDest()->getRegNum() == RegX8632::Reg_eax);
|
| Str << "\tcbw\n";
|
| break;
|
| case IceType_i16:
|
| - assert(getDest()->getRegNum() == TargetX8632::Reg_edx);
|
| + assert(getDest()->getRegNum() == RegX8632::Reg_edx);
|
| Str << "\tcwd\n";
|
| break;
|
| case IceType_i32:
|
| - assert(getDest()->getRegNum() == TargetX8632::Reg_edx);
|
| + assert(getDest()->getRegNum() == RegX8632::Reg_edx);
|
| Str << "\tcdq\n";
|
| break;
|
| }
|
| @@ -686,9 +687,8 @@ void InstX8632Mul::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 2);
|
| assert(llvm::isa<Variable>(getSrc(0)));
|
| - assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() ==
|
| - TargetX8632::Reg_eax);
|
| - assert(getDest()->getRegNum() == TargetX8632::Reg_eax); // TODO: allow edx?
|
| + assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == RegX8632::Reg_eax);
|
| + assert(getDest()->getRegNum() == RegX8632::Reg_eax); // TODO: allow edx?
|
| Str << "\tmul\t";
|
| getSrc(1)->emit(Func);
|
| Str << "\n";
|
| @@ -712,7 +712,7 @@ void InstX8632Shld::emit(const Cfg *Func) const {
|
| Str << ", ";
|
| if (Variable *ShiftReg = llvm::dyn_cast<Variable>(getSrc(2))) {
|
| (void)ShiftReg;
|
| - assert(ShiftReg->getRegNum() == TargetX8632::Reg_ecx);
|
| + assert(ShiftReg->getRegNum() == RegX8632::Reg_ecx);
|
| Str << "cl";
|
| } else {
|
| getSrc(2)->emit(Func);
|
| @@ -738,7 +738,7 @@ void InstX8632Shrd::emit(const Cfg *Func) const {
|
| Str << ", ";
|
| if (Variable *ShiftReg = llvm::dyn_cast<Variable>(getSrc(2))) {
|
| (void)ShiftReg;
|
| - assert(ShiftReg->getRegNum() == TargetX8632::Reg_ecx);
|
| + assert(ShiftReg->getRegNum() == RegX8632::Reg_ecx);
|
| Str << "cl";
|
| } else {
|
| getSrc(2)->emit(Func);
|
| @@ -756,7 +756,7 @@ void InstX8632Shrd::dump(const Cfg *Func) const {
|
| void InstX8632Cmov::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| Str << "\t";
|
| - assert(Condition != Br_None);
|
| + assert(Condition != CondX86::Br_None);
|
| assert(getDest()->hasReg());
|
| Str << "cmov" << InstX8632BrAttributes[Condition].DisplayString << "\t";
|
| getDest()->emit(Func);
|
| @@ -777,7 +777,7 @@ void InstX8632Cmov::dump(const Cfg *Func) const {
|
| void InstX8632Cmpps::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 2);
|
| - assert(Condition < Cmpps_Invalid);
|
| + assert(Condition < CondX86::Cmpps_Invalid);
|
| Str << "\t";
|
| Str << "cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps"
|
| << "\t";
|
| @@ -789,7 +789,7 @@ void InstX8632Cmpps::emit(const Cfg *Func) const {
|
|
|
| void InstX8632Cmpps::dump(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrDump();
|
| - assert(Condition < Cmpps_Invalid);
|
| + assert(Condition < CondX86::Cmpps_Invalid);
|
| dumpDest(Func);
|
| Str << " = cmp" << InstX8632CmppsAttributes[Condition].EmitString << "ps"
|
| << "\t";
|
|
|