Index: src/IceInstX86Base.h |
diff --git a/src/IceInstX86Base.h b/src/IceInstX86Base.h |
index 347447ab450f734d5f7e3794db0bd561ebce47e6..b60040a2ab46203b80e372b874bc045ee7dc9c2b 100644 |
--- a/src/IceInstX86Base.h |
+++ b/src/IceInstX86Base.h |
@@ -764,29 +764,28 @@ public: |
if (!BuildDefs::dump()) |
return; |
this->validateVectorAddrMode(); |
+ Type DestTy = this->getDest()->getType(); |
+ const char *SuffixString = ""; |
+ if (ArithmeticTypeOverride != IceType_void) |
+ DestTy = ArithmeticTypeOverride; |
+ |
switch (Suffix) { |
case InstX86Base<Machine>::SseSuffix::None: |
- this->emitTwoAddress(Func, Opcode); |
break; |
- case InstX86Base<Machine>::SseSuffix::Packed: { |
- const Type DestTy = this->getDest()->getType(); |
- this->emitTwoAddress( |
- Func, this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString); |
- } break; |
- case InstX86Base<Machine>::SseSuffix::Scalar: { |
- const Type DestTy = this->getDest()->getType(); |
- this->emitTwoAddress( |
- Func, this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString); |
- } break; |
- case InstX86Base<Machine>::SseSuffix::Integral: { |
- const Type DestTy = this->getDest()->getType(); |
- this->emitTwoAddress( |
- Func, this->Opcode, |
- InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PackString); |
- } break; |
+ case InstX86Base<Machine>::SseSuffix::Packed: |
+ SuffixString = |
+ InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString; |
+ break; |
+ case InstX86Base<Machine>::SseSuffix::Scalar: |
+ SuffixString = |
+ InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString; |
+ break; |
+ case InstX86Base<Machine>::SseSuffix::Integral: |
+ SuffixString = |
+ InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PackString; |
+ break; |
} |
+ this->emitTwoAddress(Func, Opcode, SuffixString); |
} |
void emitIAS(const Cfg *Func) const override { |
this->validateVectorAddrMode(); |
@@ -810,12 +809,15 @@ public: |
} |
protected: |
- InstX86BaseBinopXmm(Cfg *Func, Variable *Dest, Operand *Source) |
+ InstX86BaseBinopXmm(Cfg *Func, Variable *Dest, Operand *Source, |
+ Type ArithmeticType = IceType_void) |
: InstX86Base<Machine>(Func, K, 2, Dest) { |
this->addSource(Dest); |
this->addSource(Source); |
+ ArithmeticTypeOverride = ArithmeticType; |
Jim Stichnoth
2015/12/20 18:42:23
Can this assignment be moved into the ctor member
sehr
2016/01/07 18:53:11
Done.
|
} |
+ Type ArithmeticTypeOverride; |
static const char *Opcode; |
static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
Emitter; |
@@ -2010,16 +2012,25 @@ class InstX86Pcmpeq |
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
InstX86Base<Machine>::SseSuffix::Integral> { |
public: |
- static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) { |
+ static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source, |
+ Type ArithmeticTypeOverride = IceType_void) { |
+ Type Ty = Dest->getType(); |
+ if (ArithmeticTypeOverride != IceType_void) |
+ Ty = ArithmeticTypeOverride; |
+ (void)Ty; |
+ assert((Ty != IceType_f64 && Ty != IceType_i64) || |
+ InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
+ InstX86Base<Machine>::Traits::SSE4_1); |
return new (Func->allocate<InstX86Pcmpeq>()) |
- InstX86Pcmpeq(Func, Dest, Source); |
+ InstX86Pcmpeq(Func, Dest, Source, ArithmeticTypeOverride); |
} |
private: |
- InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source) |
+ InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source, |
+ Type ArithmeticTypeOverride) |
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
InstX86Base<Machine>::SseSuffix::Integral>( |
- Func, Dest, Source) {} |
+ Func, Dest, Source, ArithmeticTypeOverride) {} |
}; |
template <class Machine> |
@@ -2028,6 +2039,9 @@ class InstX86Pcmpgt |
InstX86Base<Machine>::SseSuffix::Integral> { |
public: |
static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { |
+ assert(Dest->getType() != IceType_f64 || |
+ InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >= |
+ InstX86Base<Machine>::Traits::SSE4_1); |
return new (Func->allocate<InstX86Pcmpgt>()) |
InstX86Pcmpgt(Func, Dest, Source); |
} |