Chromium Code Reviews| Index: src/IceInstX86Base.h |
| diff --git a/src/IceInstX86Base.h b/src/IceInstX86Base.h |
| index b53620847ad595498c485f85f480c7d553676acd..50cf5efd95ca45dd61645fa6d4a1cca906d6c6e8 100644 |
| --- a/src/IceInstX86Base.h |
| +++ b/src/IceInstX86Base.h |
| @@ -149,6 +149,8 @@ public: |
| IacaEnd |
| }; |
| + enum SseSuffix { None, Packed, Scalar }; |
| + |
| static const char *getWidthString(Type Ty); |
| static const char *getFldString(Type Ty); |
| static typename Traits::Cond::BrCond |
| @@ -749,20 +751,39 @@ protected: |
| }; |
| template <class Machine, typename InstX86Base<Machine>::InstKindX86 K, |
| - bool NeedsElementType> |
| + bool NeedsElementType, |
| + typename InstX86Base<Machine>::SseSuffix Suffix> |
| class InstX86BaseBinopXmm : public InstX86Base<Machine> { |
| InstX86BaseBinopXmm() = delete; |
| InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete; |
| InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete; |
| public: |
| - using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType>; |
| + using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType, Suffix>; |
| void emit(const Cfg *Func) const override { |
| if (!BuildDefs::dump()) |
| return; |
| this->validateVectorAddrMode(); |
| - this->emitTwoAddress(Opcode, this, Func); |
| + switch (Suffix) { |
| + case InstX86Base<Machine>::SseSuffix::None: |
| + this->emitTwoAddress(Opcode, this, Func); |
| + break; |
| + case InstX86Base<Machine>::SseSuffix::Packed: { |
| + char buf[30]; |
|
John
2015/12/17 14:06:36
I know these routines don't make to the final bina
sehr
2015/12/17 21:03:31
Done. And added another case for the Integral SSE
|
| + Type DestTy = this->getDest()->getType(); |
| + snprintf(buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
| + InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString); |
| + this->emitTwoAddress(buf, this, Func); |
| + } break; |
| + case InstX86Base<Machine>::SseSuffix::Scalar: { |
| + char buf[30]; |
| + Type DestTy = this->getDest()->getType(); |
| + snprintf(buf, llvm::array_lengthof(buf), "%s%s", this->Opcode, |
| + InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString); |
| + this->emitTwoAddress(buf, this, Func); |
| + } break; |
| + } |
| } |
| void emitIAS(const Cfg *Func) const override { |
| this->validateVectorAddrMode(); |
| @@ -1254,7 +1275,8 @@ private: |
| template <class Machine> |
| class InstX86Addps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Addps>()) |
| @@ -1263,8 +1285,9 @@ public: |
| private: |
| InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1303,24 +1326,25 @@ private: |
| template <class Machine> |
| class InstX86Addss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Addss>()) |
| InstX86Addss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Padd |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source); |
| @@ -1330,8 +1354,9 @@ public: |
| private: |
| InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1370,7 +1395,8 @@ private: |
| template <class Machine> |
| class InstX86Subps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Subps>()) |
| @@ -1379,25 +1405,26 @@ public: |
| private: |
| InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Subss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Subss>()) |
| InstX86Subss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1436,7 +1463,8 @@ private: |
| template <class Machine> |
| class InstX86Psub |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source); |
| @@ -1446,8 +1474,9 @@ public: |
| private: |
| InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1466,36 +1495,36 @@ private: |
| template <class Machine> |
| class InstX86Andnps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Andnps>()) |
| InstX86Andnps(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Andps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Andps>()) |
| InstX86Andps(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1520,7 +1549,8 @@ private: |
| template <class Machine> |
| class InstX86Pand |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source); |
| @@ -1528,13 +1558,15 @@ public: |
| private: |
| InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Pandn |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pandn>()) |
| @@ -1543,42 +1575,43 @@ public: |
| private: |
| InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Maxss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Maxss>()) |
| InstX86Maxss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Minss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Minss>()) |
| InstX86Minss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1597,18 +1630,18 @@ private: |
| template <class Machine> |
| class InstX86Orps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1633,7 +1666,8 @@ private: |
| template <class Machine> |
| class InstX86Por |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source); |
| @@ -1641,8 +1675,9 @@ public: |
| private: |
| InstX86Por(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1661,19 +1696,19 @@ private: |
| template <class Machine> |
| class InstX86Xorps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Xorps>()) |
| InstX86Xorps(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1698,7 +1733,8 @@ private: |
| template <class Machine> |
| class InstX86Pxor |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source); |
| @@ -1706,8 +1742,9 @@ public: |
| private: |
| InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1748,7 +1785,8 @@ private: |
| template <class Machine> |
| class InstX86Mulps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Mulps>()) |
| @@ -1757,30 +1795,32 @@ public: |
| private: |
| InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Mulss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Mulss>()) |
| InstX86Mulss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Pmull |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pmull>()) |
| @@ -1792,14 +1832,15 @@ public: |
| private: |
| InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Pmuludq |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, |
| - false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pmuludq>()) |
| @@ -1810,13 +1851,15 @@ public: |
| private: |
| InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Divps |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed> { |
| public: |
| static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Divps>()) |
| @@ -1825,25 +1868,26 @@ public: |
| private: |
| InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true, |
| + InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Divss |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar> { |
| public: |
| static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Divss>()) |
| InstX86Divss(Func, Dest, Source); |
| } |
| - void emit(const Cfg *Func) const override; |
| - |
| private: |
| InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false, |
| + InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| @@ -1953,7 +1997,8 @@ private: |
| template <class Machine> |
| class InstX86Pcmpeq |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pcmpeq>()) |
| @@ -1964,13 +2009,15 @@ public: |
| private: |
| InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |
| class InstX86Pcmpgt |
| - : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true> { |
| + : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, |
| + InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86Pcmpgt>()) |
| @@ -1981,8 +2028,9 @@ public: |
| private: |
| InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| /// movss is only a binary operation when the source and dest operands are both |
| @@ -1994,7 +2042,7 @@ private: |
| template <class Machine> |
| class InstX86MovssRegs |
| : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, |
| - false> { |
| + false, InstX86Base<Machine>::SseSuffix::None> { |
| public: |
| static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) { |
| return new (Func->allocate<InstX86MovssRegs>()) |
| @@ -2005,8 +2053,9 @@ public: |
| private: |
| InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source) |
| - : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false>( |
| - Func, Dest, Source) {} |
| + : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false, |
| + InstX86Base<Machine>::SseSuffix::None>(Func, Dest, |
| + Source) {} |
| }; |
| template <class Machine> |