| Index: src/IceInstX8632.h
|
| diff --git a/src/IceInstX8632.h b/src/IceInstX8632.h
|
| index 03605ca0cadc6bf9150d6213701d7212d83896cf..db60d68ee53b5f3e7ed8ebeed96e30fab39edbc0 100644
|
| --- a/src/IceInstX8632.h
|
| +++ b/src/IceInstX8632.h
|
| @@ -156,11 +156,14 @@ public:
|
| Idiv,
|
| Imul,
|
| Label,
|
| + Lea,
|
| Load,
|
| Mfence,
|
| Mov,
|
| + Movd,
|
| Movp,
|
| Movq,
|
| + Movss,
|
| Movsx,
|
| Movzx,
|
| Mul,
|
| @@ -172,6 +175,8 @@ public:
|
| Pand,
|
| Pcmpeq,
|
| Pcmpgt,
|
| + Pextrw,
|
| + Pinsrw,
|
| Pmullw,
|
| Pmuludq,
|
| Pop,
|
| @@ -430,7 +435,11 @@ public:
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(getSrcSize() == 3);
|
| Str << "\t" << Opcode << "\t";
|
| + getDest()->emit(Func);
|
| + Str << ", ";
|
| getSrc(1)->emit(Func);
|
| + Str << ", ";
|
| + getSrc(2)->emit(Func);
|
| Str << "\n";
|
| }
|
| virtual void dump(const Cfg *Func) const {
|
| @@ -454,8 +463,54 @@ private:
|
| static const char *Opcode;
|
| };
|
|
|
| +// Instructions of the form x := y op z
|
| +template <InstX8632::InstKindX8632 K>
|
| +class InstX8632ThreeAddressop : public InstX8632 {
|
| +public:
|
| + static InstX8632ThreeAddressop *create(Cfg *Func, Variable *Dest,
|
| + Operand *Source0, Operand *Source1) {
|
| + return new (Func->allocate<InstX8632ThreeAddressop>())
|
| + InstX8632ThreeAddressop(Func, Dest, Source0, Source1);
|
| + }
|
| + virtual void emit(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrEmit();
|
| + assert(getSrcSize() == 2);
|
| + Str << "\t" << Opcode << "\t";
|
| + getDest()->emit(Func);
|
| + Str << ", ";
|
| + getSrc(0)->emit(Func);
|
| + Str << ", ";
|
| + getSrc(1)->emit(Func);
|
| + Str << "\n";
|
| + }
|
| + virtual void dump(const Cfg *Func) const {
|
| + Ostream &Str = Func->getContext()->getStrDump();
|
| + dumpDest(Func);
|
| + Str << " = " << Opcode << "." << getDest()->getType() << " ";
|
| + dumpSources(Func);
|
| + }
|
| + static bool classof(const Inst *Inst) { return isClassof(Inst, K); }
|
| +
|
| +private:
|
| + InstX8632ThreeAddressop(Cfg *Func, Variable *Dest, Operand *Source0,
|
| + Operand *Source1)
|
| + : InstX8632(Func, K, 2, Dest) {
|
| + addSource(Source0);
|
| + addSource(Source1);
|
| + }
|
| + InstX8632ThreeAddressop(const InstX8632ThreeAddressop &)
|
| + LLVM_DELETED_FUNCTION;
|
| + InstX8632ThreeAddressop &
|
| + operator=(const InstX8632ThreeAddressop &) LLVM_DELETED_FUNCTION;
|
| + virtual ~InstX8632ThreeAddressop() {}
|
| + static const char *Opcode;
|
| +};
|
| +
|
| typedef InstX8632Unaryop<InstX8632::Bsf> InstX8632Bsf;
|
| typedef InstX8632Unaryop<InstX8632::Bsr> InstX8632Bsr;
|
| +typedef InstX8632Unaryop<InstX8632::Lea> InstX8632Lea;
|
| +typedef InstX8632Unaryop<InstX8632::Movd> InstX8632Movd;
|
| +typedef InstX8632Unaryop<InstX8632::Movss> InstX8632Movss;
|
| typedef InstX8632Unaryop<InstX8632::Sqrtss> InstX8632Sqrtss;
|
| typedef InstX8632Binop<InstX8632::Add> InstX8632Add;
|
| typedef InstX8632Binop<InstX8632::Addps> InstX8632Addps;
|
| @@ -489,6 +544,10 @@ typedef InstX8632Binop<InstX8632::Pcmpeq> InstX8632Pcmpeq;
|
| typedef InstX8632Binop<InstX8632::Pcmpgt> InstX8632Pcmpgt;
|
| typedef InstX8632Ternop<InstX8632::Idiv> InstX8632Idiv;
|
| typedef InstX8632Ternop<InstX8632::Div> InstX8632Div;
|
| +typedef InstX8632Ternop<InstX8632::Pinsrw> InstX8632Pinsrw;
|
| +typedef InstX8632Ternop<InstX8632::Shufps> InstX8632Shufps;
|
| +typedef InstX8632ThreeAddressop<InstX8632::Pextrw> InstX8632Pextrw;
|
| +typedef InstX8632ThreeAddressop<InstX8632::Pshufd> InstX8632Pshufd;
|
|
|
| // Base class for a lockable x86-32 instruction (emits a locked prefix).
|
| class InstX8632Lockable : public InstX8632 {
|
| @@ -994,27 +1053,6 @@ private:
|
| virtual ~InstX8632Push() {}
|
| };
|
|
|
| -// Pshufd - shuffle a vector of doublewords
|
| -class InstX8632Pshufd : public InstX8632 {
|
| -public:
|
| - static InstX8632Pshufd *create(Cfg *Func, Variable *Dest, Operand *Source1,
|
| - Operand *Source2) {
|
| - return new (Func->allocate<InstX8632Pshufd>())
|
| - InstX8632Pshufd(Func, Dest, Source1, Source2);
|
| - }
|
| - virtual void emit(const Cfg *Func) const;
|
| - virtual void dump(const Cfg *Func) const;
|
| - static bool classof(const Inst *Inst) { return isClassof(Inst, Pshufd); }
|
| -
|
| -private:
|
| - InstX8632Pshufd(Cfg *Func, Variable *Dest, Operand *Source1,
|
| - Operand *Source2);
|
| - InstX8632Pshufd(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION;
|
| - InstX8632Pshufd &operator=(const InstX8632Pshufd &) LLVM_DELETED_FUNCTION;
|
| - virtual ~InstX8632Pshufd() {}
|
| - static const char *Opcode;
|
| -};
|
| -
|
| // Ret instruction. Currently only supports the "ret" version that
|
| // does not pop arguments. This instruction takes a Source operand
|
| // (for non-void returning functions) for liveness analysis, though
|
| @@ -1035,27 +1073,6 @@ private:
|
| virtual ~InstX8632Ret() {}
|
| };
|
|
|
| -// Shufps - select from two vectors of floating point values
|
| -class InstX8632Shufps : public InstX8632 {
|
| -public:
|
| - static InstX8632Shufps *create(Cfg *Func, Variable *Dest, Operand *Source1,
|
| - Operand *Source2) {
|
| - return new (Func->allocate<InstX8632Shufps>())
|
| - InstX8632Shufps(Func, Dest, Source1, Source2);
|
| - }
|
| - virtual void emit(const Cfg *Func) const;
|
| - virtual void dump(const Cfg *Func) const;
|
| - static bool classof(const Inst *Inst) { return isClassof(Inst, Shufps); }
|
| -
|
| -private:
|
| - InstX8632Shufps(Cfg *Func, Variable *Dest, Operand *Source1,
|
| - Operand *Source2);
|
| - InstX8632Shufps(const InstX8632Shufps &) LLVM_DELETED_FUNCTION;
|
| - InstX8632Shufps &operator=(const InstX8632Shufps &) LLVM_DELETED_FUNCTION;
|
| - virtual ~InstX8632Shufps() {}
|
| - static const char *Opcode;
|
| -};
|
| -
|
| // Exchanging Add instruction. Exchanges the first operand (destination
|
| // operand) with the second operand (source operand), then loads the sum
|
| // of the two values into the destination operand. The destination may be
|
|
|