Index: src/IceInstX86BaseImpl.h |
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h |
index c94356014e57d6c011cb0830ac6f08ab504e330e..52f9373a5cb9d3ce649610157c14a0781d340b49 100644 |
--- a/src/IceInstX86BaseImpl.h |
+++ b/src/IceInstX86BaseImpl.h |
@@ -622,19 +622,21 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const { |
// The this->Opcode parameter needs to be char* and not IceString because of |
// template issues. |
template <class Machine> |
-void InstX86Base<Machine>::emitTwoAddress(const char *Opcode, const Inst *Inst, |
- const Cfg *Func) { |
+void InstX86Base<Machine>::emitTwoAddress(const Cfg *Func, const char *Opcode, |
+ const char *Suffix) const { |
if (!BuildDefs::dump()) |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
- assert(Inst->getSrcSize() == 2); |
- Operand *Dest = Inst->getDest(); |
+ assert(getSrcSize() == 2); |
+ Operand *Dest = getDest(); |
if (Dest == nullptr) |
- Dest = Inst->getSrc(0); |
- assert(Dest == Inst->getSrc(0)); |
- Operand *Src1 = Inst->getSrc(1); |
- Str << "\t" << Opcode << InstX86Base<Machine>::getWidthString(Dest->getType()) |
- << "\t"; |
+ Dest = getSrc(0); |
+ assert(Dest == getSrc(0)); |
+ Operand *Src1 = getSrc(1); |
+ Str << "\t" << Opcode; |
+ if (Suffix != nullptr) |
+ Str << Suffix; |
+ Str << InstX86Base<Machine>::getWidthString(Dest->getType()) << "\t"; |
Src1->emit(Func); |
Str << ", "; |
Dest->emit(Func); |
@@ -1008,205 +1010,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const { |
this->getDest()->emit(Func); |
} |
-template <class Machine> |
-void InstX86Addss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "add%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Padd<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "padd%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Pmull<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 || |
- this->getDest()->getType() == IceType_v8i16; |
- auto *Target = InstX86Base<Machine>::getTarget(Func); |
- bool InstructionSetIsValid = |
- this->getDest()->getType() == IceType_v8i16 || |
- Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
- (void)TypesAreValid; |
- (void)InstructionSetIsValid; |
- assert(TypesAreValid); |
- assert(InstructionSetIsValid); |
- snprintf( |
- buf, llvm::array_lengthof(buf), "pmull%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const { |
- Type Ty = this->getDest()->getType(); |
- bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16; |
- auto *Target = InstX86Base<Machine>::getTarget(Func); |
- bool InstructionSetIsValid = |
- Ty == IceType_v8i16 || |
- Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1; |
- (void)TypesAreValid; |
- (void)InstructionSetIsValid; |
- assert(TypesAreValid); |
- assert(InstructionSetIsValid); |
- assert(this->getSrcSize() == 2); |
- Type ElementTy = typeElementType(Ty); |
- emitIASRegOpTyXMM<Machine>(Func, ElementTy, this->getDest(), this->getSrc(1), |
- this->Emitter); |
-} |
- |
-template <class Machine> |
-void InstX86Subss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "sub%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Psub<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "psub%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Mulss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "mul%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Andnps<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PdPsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Andps<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PdPsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Maxss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Minss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Orps<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PdPsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Xorps<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PdPsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Pmuludq<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- assert(this->getSrc(0)->getType() == IceType_v4i32 && |
- this->getSrc(1)->getType() == IceType_v4i32); |
- this->emitTwoAddress(this->Opcode, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Divss<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "div%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .SdSsString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
template <class Machine> void InstX86Div<Machine>::emit(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
@@ -1283,15 +1086,11 @@ template <class Machine> |
void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
} |
template <class Machine> |
void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { |
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, |
&InstX86Base<Machine>::Traits::Assembler::blendvps}; |
@@ -1302,15 +1101,11 @@ template <class Machine> |
void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
emitVariableBlendInst<Machine>(this->Opcode, this, Func); |
} |
template <class Machine> |
void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { |
- assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, |
&InstX86Base<Machine>::Traits::Assembler::pblendvb}; |
@@ -1342,7 +1137,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const { |
Str << ", "; |
Dest->emit(Func); |
} else { |
- this->emitTwoAddress("imul", this, Func); |
+ this->emitTwoAddress(Func, this->Opcode); |
} |
} |
@@ -2791,40 +2586,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const { |
} |
template <class Machine> |
-void InstX86Pcmpeq<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "pcmpeq%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Pcmpgt<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "pcmpgt%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
void InstX86Pextr<Machine>::emit(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(this->getSrcSize() == 2); |
// pextrb and pextrd are SSE4.1 instructions. |
- assert(this->getSrc(0)->getType() == IceType_v8i16 || |
- this->getSrc(0)->getType() == IceType_v8i1 || |
- InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
Str << "\t" << this->Opcode |
<< InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) |
->getType()] |
@@ -2848,9 +2615,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { |
const Variable *Dest = this->getDest(); |
Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( |
this->getSrc(0)->getType()); |
- assert(DispatchTy == IceType_i16 || |
- InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
// pextrw must take a register dest. There is an SSE4.1 version that takes a |
// memory dest, but we aren't using it. For uniformity, just restrict them |
// all to have a register dest for now. |
@@ -2876,11 +2640,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(this->getSrcSize() == 3); |
- // pinsrb and pinsrd are SSE4.1 instructions. |
- assert(this->getDest()->getType() == IceType_v8i16 || |
- this->getDest()->getType() == IceType_v8i1 || |
- InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
Str << "\t" << this->Opcode |
<< InstX86Base< |
Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
@@ -2912,9 +2671,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { |
// pinsrb and pinsrd are SSE4.1 instructions. |
const Operand *Src0 = this->getSrc(1); |
Type DispatchTy = Src0->getType(); |
- assert(DispatchTy == IceType_i16 || |
- InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
- InstX86Base<Machine>::Traits::SSE4_1); |
// If src1 is a register, it should always be r32 (this should fall out from |
// the encodings for ByteRegs overlapping the encodings for r32), but we have |
// to make sure the register allocator didn't choose an 8-bit high register |
@@ -3049,50 +2805,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const { |
this->dumpSources(Func); |
} |
-template <class Machine> |
-void InstX86Psll<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- assert(this->getDest()->getType() == IceType_v8i16 || |
- this->getDest()->getType() == IceType_v8i1 || |
- this->getDest()->getType() == IceType_v4i32 || |
- this->getDest()->getType() == IceType_v4i1); |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "psll%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Psra<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- assert(this->getDest()->getType() == IceType_v8i16 || |
- this->getDest()->getType() == IceType_v8i1 || |
- this->getDest()->getType() == IceType_v4i32 || |
- this->getDest()->getType() == IceType_v4i1); |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "psra%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
-template <class Machine> |
-void InstX86Psrl<Machine>::emit(const Cfg *Func) const { |
- if (!BuildDefs::dump()) |
- return; |
- char buf[30]; |
- snprintf( |
- buf, llvm::array_lengthof(buf), "psrl%s", |
- InstX86Base<Machine>::Traits::TypeAttributes[this->getDest()->getType()] |
- .PackString); |
- this->emitTwoAddress(buf, this, Func); |
-} |
- |
template <class Machine> void InstX86Ret<Machine>::emit(const Cfg *Func) const { |
if (!BuildDefs::dump()) |
return; |