Index: src/IceInstX8632.cpp |
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp |
index c0e8c8d933002a0e7c8da99c9ac227bf3c45aa2f..a1f56639e10969e7bdad026ea38bb0c9584bd986 100644 |
--- a/src/IceInstX8632.cpp |
+++ b/src/IceInstX8632.cpp |
@@ -39,10 +39,11 @@ const size_t InstX8632BrAttributesSize = |
const struct TypeX8632Attributes_ { |
const char *CvtString; // i (integer), s (single FP), d (double FP) |
const char *SdSsString; // ss, sd, or <blank> |
+ const char *PackString; // b, w, d, or <blank> |
const char *WidthString; // {byte,word,dword,qword} ptr |
} TypeX8632Attributes[] = { |
-#define X(tag, cvt, sdss, width) \ |
- { cvt, "" sdss, width } \ |
+#define X(tag, cvt, sdss, pack, width) \ |
+ { cvt, "" sdss, pack, width } \ |
, |
ICETYPEX8632_TABLE |
#undef X |
@@ -297,6 +298,21 @@ bool InstX8632Movq::isRedundantAssign() const { |
return false; |
} |
+InstX8632Pshufd::InstX8632Pshufd(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2) |
+ : InstX8632(Func, InstX8632::Pshufd, 2, Dest) { |
+ addSource(Source1); |
+ addSource(Source2); |
+} |
+ |
+InstX8632Shufps::InstX8632Shufps(Cfg *Func, Variable *Dest, Operand *Source1, |
+ Operand *Source2) |
+ : InstX8632(Func, InstX8632::Shufps, 3, Dest) { |
+ addSource(Dest); |
+ addSource(Source1); |
+ addSource(Source2); |
+} |
+ |
InstX8632Sqrtss::InstX8632Sqrtss(Cfg *Func, Variable *Dest, Operand *Source) |
: InstX8632(Func, InstX8632::Sqrtss, 1, Dest) { |
addSource(Source); |
@@ -434,17 +450,23 @@ template <> const char *InstX8632Add::Opcode = "add"; |
template <> const char *InstX8632Addps::Opcode = "addps"; |
template <> const char *InstX8632Adc::Opcode = "adc"; |
template <> const char *InstX8632Addss::Opcode = "addss"; |
+template <> const char *InstX8632Padd::Opcode = "padd"; |
template <> const char *InstX8632Sub::Opcode = "sub"; |
template <> const char *InstX8632Subps::Opcode = "subps"; |
template <> const char *InstX8632Subss::Opcode = "subss"; |
template <> const char *InstX8632Sbb::Opcode = "sbb"; |
+template <> const char *InstX8632Psub::Opcode = "psub"; |
template <> const char *InstX8632And::Opcode = "and"; |
+template <> const char *InstX8632Pand::Opcode = "pand"; |
template <> const char *InstX8632Or::Opcode = "or"; |
+template <> const char *InstX8632Por::Opcode = "por"; |
template <> const char *InstX8632Xor::Opcode = "xor"; |
template <> const char *InstX8632Pxor::Opcode = "pxor"; |
template <> const char *InstX8632Imul::Opcode = "imul"; |
template <> const char *InstX8632Mulps::Opcode = "mulps"; |
template <> const char *InstX8632Mulss::Opcode = "mulss"; |
+template <> const char *InstX8632Pmullw::Opcode = "pmullw"; |
+template <> const char *InstX8632Pmuludq::Opcode = "pmuludq"; |
template <> const char *InstX8632Div::Opcode = "div"; |
template <> const char *InstX8632Divps::Opcode = "divps"; |
template <> const char *InstX8632Idiv::Opcode = "idiv"; |
@@ -460,6 +482,13 @@ template <> void InstX8632Addss::emit(const Cfg *Func) const { |
emitTwoAddress(buf, this, Func); |
} |
+template <> void InstX8632Padd::emit(const Cfg *Func) const { |
+ char buf[30]; |
+ snprintf(buf, llvm::array_lengthof(buf), "padd%s", |
+ TypeX8632Attributes[getDest()->getType()].PackString); |
+ emitTwoAddress(buf, this, Func); |
+} |
+ |
template <> void InstX8632Subss::emit(const Cfg *Func) const { |
char buf[30]; |
snprintf(buf, llvm::array_lengthof(buf), "sub%s", |
@@ -467,6 +496,13 @@ template <> void InstX8632Subss::emit(const Cfg *Func) const { |
emitTwoAddress(buf, this, Func); |
} |
+template <> void InstX8632Psub::emit(const Cfg *Func) const { |
+ char buf[30]; |
+ snprintf(buf, llvm::array_lengthof(buf), "psub%s", |
+ TypeX8632Attributes[getDest()->getType()].PackString); |
+ emitTwoAddress(buf, this, Func); |
+} |
+ |
template <> void InstX8632Mulss::emit(const Cfg *Func) const { |
char buf[30]; |
snprintf(buf, llvm::array_lengthof(buf), "mul%s", |
@@ -474,6 +510,18 @@ template <> void InstX8632Mulss::emit(const Cfg *Func) const { |
emitTwoAddress(buf, this, Func); |
} |
+template <> void InstX8632Pmullw::emit(const Cfg *Func) const { |
+ assert(getSrc(0)->getType() == IceType_v8i16 && |
+ getSrc(1)->getType() == IceType_v8i16); |
+ emitTwoAddress(Opcode, this, Func); |
+} |
+ |
+template <> void InstX8632Pmuludq::emit(const Cfg *Func) const { |
+ assert(getSrc(0)->getType() == IceType_v4i32 && |
+ getSrc(1)->getType() == IceType_v4i32); |
+ emitTwoAddress(Opcode, this, Func); |
+} |
+ |
template <> void InstX8632Divss::emit(const Cfg *Func) const { |
char buf[30]; |
snprintf(buf, llvm::array_lengthof(buf), "div%s", |
@@ -631,7 +679,7 @@ void InstX8632Cmpxchg8b::dump(const Cfg *Func) const { |
void InstX8632Cvt::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |
- Str << "\tcvts" << TypeX8632Attributes[getSrc(0)->getType()].CvtString << "2s" |
+ Str << "\tcvt" << TypeX8632Attributes[getSrc(0)->getType()].CvtString << "2" |
<< TypeX8632Attributes[getDest()->getType()].CvtString << "\t"; |
getDest()->emit(Func); |
Str << ", "; |
@@ -995,6 +1043,25 @@ void InstX8632Push::dump(const Cfg *Func) const { |
dumpSources(Func); |
} |
+void InstX8632Pshufd::emit(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 2); |
+ Str << "\tpshufd\t"; |
+ getDest()->emit(Func); |
+ Str << ", "; |
+ getSrc(0)->emit(Func); |
+ Str << ", "; |
+ getSrc(1)->emit(Func); |
+ Str << "\n"; |
+} |
+ |
+void InstX8632Pshufd::dump(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ dumpDest(Func); |
+ Str << " = pshufd." << getDest()->getType() << " "; |
+ dumpSources(Func); |
+} |
+ |
void InstX8632Ret::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
Str << "\tret\n"; |
@@ -1007,6 +1074,25 @@ void InstX8632Ret::dump(const Cfg *Func) const { |
dumpSources(Func); |
} |
+void InstX8632Shufps::emit(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrEmit(); |
+ assert(getSrcSize() == 3); |
+ Str << "\tshufps\t"; |
+ getDest()->emit(Func); |
+ Str << ", "; |
+ getSrc(1)->emit(Func); |
+ Str << ", "; |
+ getSrc(2)->emit(Func); |
+ Str << "\n"; |
+} |
+ |
+void InstX8632Shufps::dump(const Cfg *Func) const { |
+ Ostream &Str = Func->getContext()->getStrDump(); |
+ dumpDest(Func); |
+ Str << " = shufps." << getDest()->getType() << " "; |
+ dumpSources(Func); |
+} |
+ |
void InstX8632Sqrtss::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(getSrcSize() == 1); |