Commit 6da7ae2b by David Sehr

Add template parameter for suffix to BinopXmm

BUG= R=jpp@chromium.org, stichnot@chromium.org Review URL: https://codereview.chromium.org/1530423002 .
parent 7de24350
...@@ -149,6 +149,8 @@ public: ...@@ -149,6 +149,8 @@ public:
IacaEnd IacaEnd
}; };
enum SseSuffix { None, Packed, Scalar, Integral };
static const char *getWidthString(Type Ty); static const char *getWidthString(Type Ty);
static const char *getFldString(Type Ty); static const char *getFldString(Type Ty);
static typename Traits::Cond::BrCond static typename Traits::Cond::BrCond
...@@ -156,8 +158,8 @@ public: ...@@ -156,8 +158,8 @@ public:
void dump(const Cfg *Func) const override; void dump(const Cfg *Func) const override;
// Shared emit routines for common forms of instructions. // Shared emit routines for common forms of instructions.
static void emitTwoAddress(const char *Opcode, const Inst *Inst, void emitTwoAddress(const Cfg *Func, const char *Opcode,
const Cfg *Func); const char *Suffix = "") const;
static void static void
emitIASGPRShift(const Cfg *Func, Type Ty, const Variable *Var, emitIASGPRShift(const Cfg *Func, Type Ty, const Variable *Var,
...@@ -628,7 +630,7 @@ public: ...@@ -628,7 +630,7 @@ public:
void emit(const Cfg *Func) const override { void emit(const Cfg *Func) const override {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
this->emitTwoAddress(Opcode, this, Func); this->emitTwoAddress(Func, Opcode);
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
Type Ty = this->getDest()->getType(); Type Ty = this->getDest()->getType();
...@@ -671,7 +673,7 @@ public: ...@@ -671,7 +673,7 @@ public:
void emit(const Cfg *Func) const override { void emit(const Cfg *Func) const override {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
this->emitTwoAddress(Opcode, this, Func); this->emitTwoAddress(Func, Opcode);
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
Type Ty = this->getDest()->getType(); Type Ty = this->getDest()->getType();
...@@ -715,7 +717,7 @@ public: ...@@ -715,7 +717,7 @@ public:
void emit(const Cfg *Func) const override { void emit(const Cfg *Func) const override {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
this->emitTwoAddress(Opcode, this, Func); this->emitTwoAddress(Func, Opcode);
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
Type Ty = this->getSrc(0)->getType(); Type Ty = this->getSrc(0)->getType();
...@@ -749,20 +751,43 @@ protected: ...@@ -749,20 +751,43 @@ protected:
}; };
template <class Machine, typename InstX86Base<Machine>::InstKindX86 K, template <class Machine, typename InstX86Base<Machine>::InstKindX86 K,
bool NeedsElementType> bool NeedsElementType,
typename InstX86Base<Machine>::SseSuffix Suffix>
class InstX86BaseBinopXmm : public InstX86Base<Machine> { class InstX86BaseBinopXmm : public InstX86Base<Machine> {
InstX86BaseBinopXmm() = delete; InstX86BaseBinopXmm() = delete;
InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete; InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete;
InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete; InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete;
public: public:
using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType>; using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType, Suffix>;
void emit(const Cfg *Func) const override { void emit(const Cfg *Func) const override {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
this->validateVectorAddrMode(); this->validateVectorAddrMode();
this->emitTwoAddress(Opcode, this, Func); 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;
}
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
this->validateVectorAddrMode(); this->validateVectorAddrMode();
...@@ -818,7 +843,11 @@ public: ...@@ -818,7 +843,11 @@ public:
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
this->validateVectorAddrMode(); this->validateVectorAddrMode();
this->emitTwoAddress(Opcode, this, Func); // Shift operations are always integral, and hence always need a suffix.
const Type DestTy = this->getDest()->getType();
this->emitTwoAddress(
Func, this->Opcode,
InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PackString);
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
this->validateVectorAddrMode(); this->validateVectorAddrMode();
...@@ -1254,7 +1283,8 @@ private: ...@@ -1254,7 +1283,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Addps class InstX86Addps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Addps>()) return new (Func->allocate<InstX86Addps>())
...@@ -1263,8 +1293,9 @@ public: ...@@ -1263,8 +1293,9 @@ public:
private: private:
InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1303,34 +1334,34 @@ private: ...@@ -1303,34 +1334,34 @@ private:
template <class Machine> template <class Machine>
class InstX86Addss class InstX86Addss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Addss>()) return new (Func->allocate<InstX86Addss>())
InstX86Addss(Func, Dest, Source); InstX86Addss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Padd class InstX86Padd
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true,
InstX86Base<Machine>::SseSuffix::Integral> {
public: public:
static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source); return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source) InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true,
InstX86Base<Machine>::SseSuffix::Integral>(
Func, Dest, Source) {} Func, Dest, Source) {}
}; };
...@@ -1370,7 +1401,8 @@ private: ...@@ -1370,7 +1401,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Subps class InstX86Subps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Subps>()) return new (Func->allocate<InstX86Subps>())
...@@ -1379,25 +1411,26 @@ public: ...@@ -1379,25 +1411,26 @@ public:
private: private:
InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Subss class InstX86Subss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Subss>()) return new (Func->allocate<InstX86Subss>())
InstX86Subss(Func, Dest, Source); InstX86Subss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1436,17 +1469,17 @@ private: ...@@ -1436,17 +1469,17 @@ private:
template <class Machine> template <class Machine>
class InstX86Psub class InstX86Psub
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true,
InstX86Base<Machine>::SseSuffix::Integral> {
public: public:
static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source); return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source) InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true,
InstX86Base<Machine>::SseSuffix::Integral>(
Func, Dest, Source) {} Func, Dest, Source) {}
}; };
...@@ -1466,36 +1499,36 @@ private: ...@@ -1466,36 +1499,36 @@ private:
template <class Machine> template <class Machine>
class InstX86Andnps class InstX86Andnps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Andnps>()) return new (Func->allocate<InstX86Andnps>())
InstX86Andnps(Func, Dest, Source); InstX86Andnps(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Andps class InstX86Andps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Andps>()) return new (Func->allocate<InstX86Andps>())
InstX86Andps(Func, Dest, Source); InstX86Andps(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1520,7 +1553,8 @@ private: ...@@ -1520,7 +1553,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Pand class InstX86Pand
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false,
InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source); return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source);
...@@ -1528,13 +1562,15 @@ public: ...@@ -1528,13 +1562,15 @@ public:
private: private:
InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Pandn class InstX86Pandn
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false,
InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Pandn>()) return new (Func->allocate<InstX86Pandn>())
...@@ -1543,42 +1579,43 @@ public: ...@@ -1543,42 +1579,43 @@ public:
private: private:
InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Maxss class InstX86Maxss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Maxss>()) return new (Func->allocate<InstX86Maxss>())
InstX86Maxss(Func, Dest, Source); InstX86Maxss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Minss class InstX86Minss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Minss>()) return new (Func->allocate<InstX86Minss>())
InstX86Minss(Func, Dest, Source); InstX86Minss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1597,18 +1634,18 @@ private: ...@@ -1597,18 +1634,18 @@ private:
template <class Machine> template <class Machine>
class InstX86Orps class InstX86Orps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source); return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1633,7 +1670,8 @@ private: ...@@ -1633,7 +1670,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Por class InstX86Por
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false,
InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source); return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source);
...@@ -1641,8 +1679,9 @@ public: ...@@ -1641,8 +1679,9 @@ public:
private: private:
InstX86Por(Cfg *Func, Variable *Dest, Operand *Source) InstX86Por(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1661,19 +1700,19 @@ private: ...@@ -1661,19 +1700,19 @@ private:
template <class Machine> template <class Machine>
class InstX86Xorps class InstX86Xorps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Xorps>()) return new (Func->allocate<InstX86Xorps>())
InstX86Xorps(Func, Dest, Source); InstX86Xorps(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1698,7 +1737,8 @@ private: ...@@ -1698,7 +1737,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Pxor class InstX86Pxor
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false,
InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source); return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source);
...@@ -1706,8 +1746,9 @@ public: ...@@ -1706,8 +1746,9 @@ public:
private: private:
InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1748,7 +1789,8 @@ private: ...@@ -1748,7 +1789,8 @@ private:
template <class Machine> template <class Machine>
class InstX86Mulps class InstX86Mulps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Mulps>()) return new (Func->allocate<InstX86Mulps>())
...@@ -1757,66 +1799,78 @@ public: ...@@ -1757,66 +1799,78 @@ public:
private: private:
InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Mulss class InstX86Mulss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Mulss>()) return new (Func->allocate<InstX86Mulss>())
InstX86Mulss(Func, Dest, Source); InstX86Mulss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Pmull class InstX86Pmull
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true,
InstX86Base<Machine>::SseSuffix::Integral> {
public: public:
static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) {
bool TypesAreValid =
Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v8i16;
auto *Target = InstX86Base<Machine>::getTarget(Func);
bool InstructionSetIsValid =
Dest->getType() == IceType_v8i16 ||
Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
(void)TypesAreValid;
(void)InstructionSetIsValid;
assert(TypesAreValid);
assert(InstructionSetIsValid);
return new (Func->allocate<InstX86Pmull>()) return new (Func->allocate<InstX86Pmull>())
InstX86Pmull(Func, Dest, Source); InstX86Pmull(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
void emitIAS(const Cfg *Func) const override;
private: private:
InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true,
InstX86Base<Machine>::SseSuffix::Integral>(
Func, Dest, Source) {} Func, Dest, Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Pmuludq class InstX86Pmuludq
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false,
false> { InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) {
assert(Dest->getType() == IceType_v4i32 &&
Source->getType() == IceType_v4i32);
return new (Func->allocate<InstX86Pmuludq>()) return new (Func->allocate<InstX86Pmuludq>())
InstX86Pmuludq(Func, Dest, Source); InstX86Pmuludq(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Divps class InstX86Divps
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true,
InstX86Base<Machine>::SseSuffix::Packed> {
public: public:
static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Divps>()) return new (Func->allocate<InstX86Divps>())
...@@ -1825,25 +1879,26 @@ public: ...@@ -1825,25 +1879,26 @@ public:
private: private:
InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source) InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Divss class InstX86Divss
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false,
InstX86Base<Machine>::SseSuffix::Scalar> {
public: public:
static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Divss>()) return new (Func->allocate<InstX86Divss>())
InstX86Divss(Func, Dest, Source); InstX86Divss(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source) InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -1879,11 +1934,12 @@ class InstX86Psll ...@@ -1879,11 +1934,12 @@ class InstX86Psll
: public InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psll> { : public InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psll> {
public: public:
static InstX86Psll *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Psll *create(Cfg *Func, Variable *Dest, Operand *Source) {
assert(Dest->getType() == IceType_v8i16 ||
Dest->getType() == IceType_v8i1 ||
Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v4i1);
return new (Func->allocate<InstX86Psll>()) InstX86Psll(Func, Dest, Source); return new (Func->allocate<InstX86Psll>()) InstX86Psll(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Psll(Cfg *Func, Variable *Dest, Operand *Source) InstX86Psll(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psll>( : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psll>(
...@@ -1899,8 +1955,6 @@ public: ...@@ -1899,8 +1955,6 @@ public:
return new (Func->allocate<InstX86Psrl>()) InstX86Psrl(Func, Dest, Source); return new (Func->allocate<InstX86Psrl>()) InstX86Psrl(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Psrl(Cfg *Func, Variable *Dest, Operand *Source) InstX86Psrl(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psrl, true>( : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psrl, true>(
...@@ -1940,11 +1994,12 @@ class InstX86Psra ...@@ -1940,11 +1994,12 @@ class InstX86Psra
: public InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra> { : public InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra> {
public: public:
static InstX86Psra *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Psra *create(Cfg *Func, Variable *Dest, Operand *Source) {
assert(Dest->getType() == IceType_v8i16 ||
Dest->getType() == IceType_v8i1 ||
Dest->getType() == IceType_v4i32 || Dest->getType() == IceType_v4i1);
return new (Func->allocate<InstX86Psra>()) InstX86Psra(Func, Dest, Source); return new (Func->allocate<InstX86Psra>()) InstX86Psra(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source) InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>( : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>(
...@@ -1953,35 +2008,35 @@ private: ...@@ -1953,35 +2008,35 @@ private:
template <class Machine> template <class Machine>
class InstX86Pcmpeq class InstX86Pcmpeq
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true,
InstX86Base<Machine>::SseSuffix::Integral> {
public: public:
static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Pcmpeq>()) return new (Func->allocate<InstX86Pcmpeq>())
InstX86Pcmpeq(Func, Dest, Source); InstX86Pcmpeq(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true,
InstX86Base<Machine>::SseSuffix::Integral>(
Func, Dest, Source) {} Func, Dest, Source) {}
}; };
template <class Machine> template <class Machine>
class InstX86Pcmpgt class InstX86Pcmpgt
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true> { : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true,
InstX86Base<Machine>::SseSuffix::Integral> {
public: public:
static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Pcmpgt>()) return new (Func->allocate<InstX86Pcmpgt>())
InstX86Pcmpgt(Func, Dest, Source); InstX86Pcmpgt(Func, Dest, Source);
} }
void emit(const Cfg *Func) const override;
private: private:
InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source) InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true,
InstX86Base<Machine>::SseSuffix::Integral>(
Func, Dest, Source) {} Func, Dest, Source) {}
}; };
...@@ -1994,7 +2049,7 @@ private: ...@@ -1994,7 +2049,7 @@ private:
template <class Machine> template <class Machine>
class InstX86MovssRegs class InstX86MovssRegs
: public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs,
false> { false, InstX86Base<Machine>::SseSuffix::None> {
public: public:
static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86MovssRegs>()) return new (Func->allocate<InstX86MovssRegs>())
...@@ -2005,8 +2060,9 @@ public: ...@@ -2005,8 +2060,9 @@ public:
private: private:
InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source) InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false>( : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false,
Func, Dest, Source) {} InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
Source) {}
}; };
template <class Machine> template <class Machine>
...@@ -2071,6 +2127,11 @@ class InstX86Pinsr ...@@ -2071,6 +2127,11 @@ class InstX86Pinsr
public: public:
static InstX86Pinsr *create(Cfg *Func, Variable *Dest, Operand *Source1, static InstX86Pinsr *create(Cfg *Func, Variable *Dest, Operand *Source1,
Operand *Source2) { Operand *Source2) {
// pinsrb and pinsrd are SSE4.1 instructions.
assert(Dest->getType() == IceType_v8i16 ||
Dest->getType() == IceType_v8i1 ||
InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
return new (Func->allocate<InstX86Pinsr>()) return new (Func->allocate<InstX86Pinsr>())
InstX86Pinsr(Func, Dest, Source1, Source2); InstX86Pinsr(Func, Dest, Source1, Source2);
} }
...@@ -2108,6 +2169,8 @@ class InstX86Blendvps ...@@ -2108,6 +2169,8 @@ class InstX86Blendvps
public: public:
static InstX86Blendvps *create(Cfg *Func, Variable *Dest, Operand *Source1, static InstX86Blendvps *create(Cfg *Func, Variable *Dest, Operand *Source1,
Operand *Source2) { Operand *Source2) {
assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
return new (Func->allocate<InstX86Blendvps>()) return new (Func->allocate<InstX86Blendvps>())
InstX86Blendvps(Func, Dest, Source1, Source2); InstX86Blendvps(Func, Dest, Source1, Source2);
} }
...@@ -2127,6 +2190,8 @@ class InstX86Pblendvb ...@@ -2127,6 +2190,8 @@ class InstX86Pblendvb
public: public:
static InstX86Pblendvb *create(Cfg *Func, Variable *Dest, Operand *Source1, static InstX86Pblendvb *create(Cfg *Func, Variable *Dest, Operand *Source1,
Operand *Source2) { Operand *Source2) {
assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
return new (Func->allocate<InstX86Pblendvb>()) return new (Func->allocate<InstX86Pblendvb>())
InstX86Pblendvb(Func, Dest, Source1, Source2); InstX86Pblendvb(Func, Dest, Source1, Source2);
} }
...@@ -2146,6 +2211,10 @@ class InstX86Pextr ...@@ -2146,6 +2211,10 @@ class InstX86Pextr
public: public:
static InstX86Pextr *create(Cfg *Func, Variable *Dest, Operand *Source0, static InstX86Pextr *create(Cfg *Func, Variable *Dest, Operand *Source0,
Operand *Source1) { Operand *Source1) {
assert(Source0->getType() == IceType_v8i16 ||
Source0->getType() == IceType_v8i1 ||
InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
return new (Func->allocate<InstX86Pextr>()) return new (Func->allocate<InstX86Pextr>())
InstX86Pextr(Func, Dest, Source0, Source1); InstX86Pextr(Func, Dest, Source0, Source1);
} }
......
...@@ -622,19 +622,19 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const { ...@@ -622,19 +622,19 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const {
// The this->Opcode parameter needs to be char* and not IceString because of // The this->Opcode parameter needs to be char* and not IceString because of
// template issues. // template issues.
template <class Machine> template <class Machine>
void InstX86Base<Machine>::emitTwoAddress(const char *Opcode, const Inst *Inst, void InstX86Base<Machine>::emitTwoAddress(const Cfg *Func, const char *Opcode,
const Cfg *Func) { const char *Suffix) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
Ostream &Str = Func->getContext()->getStrEmit(); Ostream &Str = Func->getContext()->getStrEmit();
assert(Inst->getSrcSize() == 2); assert(getSrcSize() == 2);
Operand *Dest = Inst->getDest(); Operand *Dest = getDest();
if (Dest == nullptr) if (Dest == nullptr)
Dest = Inst->getSrc(0); Dest = getSrc(0);
assert(Dest == Inst->getSrc(0)); assert(Dest == getSrc(0));
Operand *Src1 = Inst->getSrc(1); Operand *Src1 = getSrc(1);
Str << "\t" << Opcode << InstX86Base<Machine>::getWidthString(Dest->getType()) Str << "\t" << Opcode << Suffix
<< "\t"; << InstX86Base<Machine>::getWidthString(Dest->getType()) << "\t";
Src1->emit(Func); Src1->emit(Func);
Str << ", "; Str << ", ";
Dest->emit(Func); Dest->emit(Func);
...@@ -1008,205 +1008,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const { ...@@ -1008,205 +1008,6 @@ void InstX86Sqrtss<Machine>::emit(const Cfg *Func) const {
this->getDest()->emit(Func); 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 { template <class Machine> void InstX86Div<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
...@@ -1283,15 +1084,11 @@ template <class Machine> ...@@ -1283,15 +1084,11 @@ template <class Machine>
void InstX86Blendvps<Machine>::emit(const Cfg *Func) const { void InstX86Blendvps<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
emitVariableBlendInst<Machine>(this->Opcode, this, Func); emitVariableBlendInst<Machine>(this->Opcode, this, Func);
} }
template <class Machine> template <class Machine>
void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const { 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 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps, Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
&InstX86Base<Machine>::Traits::Assembler::blendvps}; &InstX86Base<Machine>::Traits::Assembler::blendvps};
...@@ -1302,15 +1099,11 @@ template <class Machine> ...@@ -1302,15 +1099,11 @@ template <class Machine>
void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const { void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
assert(InstX86Base<Machine>::getTarget(Func)->getInstructionSet() >=
InstX86Base<Machine>::Traits::SSE4_1);
emitVariableBlendInst<Machine>(this->Opcode, this, Func); emitVariableBlendInst<Machine>(this->Opcode, this, Func);
} }
template <class Machine> template <class Machine>
void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const { 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 static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb, Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
&InstX86Base<Machine>::Traits::Assembler::pblendvb}; &InstX86Base<Machine>::Traits::Assembler::pblendvb};
...@@ -1342,7 +1135,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const { ...@@ -1342,7 +1135,7 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const {
Str << ", "; Str << ", ";
Dest->emit(Func); Dest->emit(Func);
} else { } else {
this->emitTwoAddress("imul", this, Func); this->emitTwoAddress(Func, this->Opcode);
} }
} }
...@@ -2791,40 +2584,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const { ...@@ -2791,40 +2584,12 @@ void InstX86Fstp<Machine>::dump(const Cfg *Func) const {
} }
template <class Machine> 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 { void InstX86Pextr<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
Ostream &Str = Func->getContext()->getStrEmit(); Ostream &Str = Func->getContext()->getStrEmit();
assert(this->getSrcSize() == 2); assert(this->getSrcSize() == 2);
// pextrb and pextrd are SSE4.1 instructions. // 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 Str << "\t" << this->Opcode
<< InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0) << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
->getType()] ->getType()]
...@@ -2848,9 +2613,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { ...@@ -2848,9 +2613,6 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
const Variable *Dest = this->getDest(); const Variable *Dest = this->getDest();
Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
this->getSrc(0)->getType()); 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 // 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 // memory dest, but we aren't using it. For uniformity, just restrict them
// all to have a register dest for now. // all to have a register dest for now.
...@@ -2876,11 +2638,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { ...@@ -2876,11 +2638,6 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
return; return;
Ostream &Str = Func->getContext()->getStrEmit(); Ostream &Str = Func->getContext()->getStrEmit();
assert(this->getSrcSize() == 3); 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 Str << "\t" << this->Opcode
<< InstX86Base< << InstX86Base<
Machine>::Traits::TypeAttributes[this->getDest()->getType()] Machine>::Traits::TypeAttributes[this->getDest()->getType()]
...@@ -2912,9 +2669,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { ...@@ -2912,9 +2669,6 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
// pinsrb and pinsrd are SSE4.1 instructions. // pinsrb and pinsrd are SSE4.1 instructions.
const Operand *Src0 = this->getSrc(1); const Operand *Src0 = this->getSrc(1);
Type DispatchTy = Src0->getType(); 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 // 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 // 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 // to make sure the register allocator didn't choose an 8-bit high register
...@@ -3049,50 +2803,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const { ...@@ -3049,50 +2803,6 @@ void InstX86Push<Machine>::dump(const Cfg *Func) const {
this->dumpSources(Func); 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 { template <class Machine> void InstX86Ret<Machine>::emit(const Cfg *Func) const {
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment