Index: src/IceInstX86Base.h |
diff --git a/src/IceInstX86Base.h b/src/IceInstX86Base.h |
index 1c2e8e6faca33dad15a46eeb41013d04bdd049be..c29538a4553f57a52a87e8f8fd2407958ee39943 100644 |
--- a/src/IceInstX86Base.h |
+++ b/src/IceInstX86Base.h |
@@ -143,6 +143,7 @@ template <typename TraitsType> struct InstImpl { |
Pop, |
Por, |
Pshufd, |
+ Punpckl, |
Psll, |
Psra, |
Psrl, |
@@ -183,7 +184,7 @@ template <typename TraitsType> struct InstImpl { |
IacaEnd |
}; |
- enum SseSuffix { None, Packed, Scalar, Integral }; |
+ enum SseSuffix { None, Packed, Unpack, Scalar, Integral }; |
static const char *getWidthString(Type Ty); |
static const char *getFldString(Type Ty); |
@@ -841,6 +842,9 @@ template <typename TraitsType> struct InstImpl { |
case InstX86Base::SseSuffix::Packed: |
SuffixString = Traits::TypeAttributes[DestTy].PdPsString; |
break; |
+ case InstX86Base::SseSuffix::Unpack: |
+ SuffixString = Traits::TypeAttributes[DestTy].UnpackString; |
+ break; |
case InstX86Base::SseSuffix::Scalar: |
SuffixString = Traits::TypeAttributes[DestTy].SdSsString; |
break; |
@@ -2839,6 +2843,23 @@ template <typename TraitsType> struct InstImpl { |
private: |
InstX86IacaEnd(Cfg *Func); |
}; |
+ |
+ class InstX86Punpckl |
+ : public InstX86BaseBinopXmm<InstX86Base::Punpckl, false, |
+ InstX86Base::SseSuffix::Unpack> { |
+ public: |
+ static InstX86Punpckl *create(Cfg *Func, Variable *Dest, Operand *Source) { |
+ return new (Func->allocate<InstX86Punpckl>()) |
+ InstX86Punpckl(Func, Dest, Source); |
+ } |
+ |
+ private: |
+ InstX86Punpckl(Cfg *Func, Variable *Dest, Operand *Source) |
+ : InstX86BaseBinopXmm<InstX86Base::Punpckl, false, |
+ InstX86Base::SseSuffix::Unpack>(Func, Dest, |
+ Source) {} |
+ }; |
+ |
}; // struct InstImpl |
/// struct Insts is a template that can be used to instantiate all the X86 |
@@ -2960,6 +2981,8 @@ template <typename TraitsType> struct Insts { |
using IacaStart = typename InstImpl<TraitsType>::InstX86IacaStart; |
using IacaEnd = typename InstImpl<TraitsType>::InstX86IacaEnd; |
+ |
+ using Punpckl = typename InstImpl<TraitsType>::InstX86Punpckl; |
}; |
/// X86 Instructions have static data (particularly, opcodes and instruction |
@@ -3189,6 +3212,9 @@ template <typename TraitsType> struct Insts { |
template <> \ |
template <> \ |
const char *InstImpl<TraitsType>::InstX86Pshufd::Base::Opcode = "pshufd"; \ |
+ template <> \ |
+ template <> \ |
+ const char *InstImpl<TraitsType>::InstX86Punpckl::Base::Opcode = "punpckl"; \ |
/* Inplace GPR ops */ \ |
template <> \ |
template <> \ |
@@ -3550,6 +3576,12 @@ template <typename TraitsType> struct Insts { |
&InstImpl<TraitsType>::Assembler::psrl, \ |
&InstImpl<TraitsType>::Assembler::psrl, \ |
&InstImpl<TraitsType>::Assembler::psrl}; \ |
+ template <> \ |
+ template <> \ |
+ const InstImpl<TraitsType>::Assembler::XmmEmitterRegOp \ |
+ InstImpl<TraitsType>::InstX86Punpckl::Base::Emitter = { \ |
+ &InstImpl<TraitsType>::Assembler::punpckldq, \ |
+ &InstImpl<TraitsType>::Assembler::punpckldq}; \ |
} \ |
} |