| 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}; \
|
| } \
|
| }
|
|
|
|
|