| Index: src/assembler_ia32.h | 
| diff --git a/src/assembler_ia32.h b/src/assembler_ia32.h | 
| index 1885e0c10cea90b355bb6029b85f34b800162f1e..5c312fb708d9e5a48817ca04a91c5f63acab237b 100644 | 
| --- a/src/assembler_ia32.h | 
| +++ b/src/assembler_ia32.h | 
| @@ -382,10 +382,20 @@ public: | 
| }; | 
|  | 
| struct GPREmitterShiftOp { | 
| -    TypedEmitGPRGPR GPRGPR; | 
| -    TypedEmitGPRImm GPRImm; | 
| // Technically, Addr/GPR and Addr/Imm are also allowed, but */Addr are not. | 
| // In practice, we always normalize the Dest to a Register first. | 
| +    TypedEmitGPRGPR GPRGPR; | 
| +    TypedEmitGPRImm GPRImm; | 
| +  }; | 
| + | 
| +  typedef void (AssemblerX86::*TypedEmitGPRGPRImm)(Type, GPRRegister, | 
| +                                                   GPRRegister, | 
| +                                                   const Immediate &); | 
| +  struct GPREmitterShiftD { | 
| +    // Technically AddrGPR and AddrGPRImm are also allowed, but in practice | 
| +    // we always normalize Dest to a Register first. | 
| +    TypedEmitGPRGPR GPRGPR; | 
| +    TypedEmitGPRGPRImm GPRGPRImm; | 
| }; | 
|  | 
| typedef void (AssemblerX86::*TypedEmitAddrGPR)(Type, const Address &, | 
| @@ -433,6 +443,19 @@ public: | 
| TypedEmitAddr RegAddr; | 
| }; | 
|  | 
| +  // Three operand (potentially) cross Xmm/GPR instructions. | 
| +  // The last operand must be an immediate. | 
| +  template <typename DReg_t, typename SReg_t> struct ThreeOpImmEmitter { | 
| +    typedef void (AssemblerX86::*TypedEmitRegRegImm)(Type, DReg_t, SReg_t, | 
| +                                                     const Immediate &); | 
| +    typedef void (AssemblerX86::*TypedEmitRegAddrImm)(Type, DReg_t, | 
| +                                                      const Address &, | 
| +                                                      const Immediate &); | 
| + | 
| +    TypedEmitRegRegImm RegRegImm; | 
| +    TypedEmitRegAddrImm RegAddrImm; | 
| +  }; | 
| + | 
| /* | 
| * Emit Machine Instructions. | 
| */ | 
| @@ -570,6 +593,13 @@ public: | 
| void sqrtpd(XmmRegister dst); | 
| void shufpd(XmmRegister dst, XmmRegister src, const Immediate &mask); | 
|  | 
| +  void pshufd(Type Ty, XmmRegister dst, XmmRegister src, const Immediate &mask); | 
| +  void pshufd(Type Ty, XmmRegister dst, const Address &src, | 
| +              const Immediate &mask); | 
| +  void shufps(Type Ty, XmmRegister dst, XmmRegister src, const Immediate &mask); | 
| +  void shufps(Type Ty, XmmRegister dst, const Address &src, | 
| +              const Immediate &mask); | 
| + | 
| void cvtdq2ps(Type, XmmRegister dst, XmmRegister src); | 
| void cvtdq2ps(Type, XmmRegister dst, const Address &src); | 
|  | 
| @@ -604,7 +634,19 @@ public: | 
|  | 
| void orpd(XmmRegister dst, XmmRegister src); | 
|  | 
| -  void pextrd(GPRRegister dst, XmmRegister src, const Immediate &imm); | 
| +  void insertps(Type Ty, XmmRegister dst, XmmRegister src, | 
| +                const Immediate &imm); | 
| +  void insertps(Type Ty, XmmRegister dst, const Address &src, | 
| +                const Immediate &imm); | 
| + | 
| +  void pinsr(Type Ty, XmmRegister dst, GPRRegister src, const Immediate &imm); | 
| +  void pinsr(Type Ty, XmmRegister dst, const Address &src, | 
| +             const Immediate &imm); | 
| + | 
| +  void pextr(Type Ty, GPRRegister dst, XmmRegister src, const Immediate &imm); | 
| +  void pextr(Type Ty, GPRRegister dst, const Address &src, | 
| +             const Immediate &imm); | 
| + | 
| void pmovsxdq(XmmRegister dst, XmmRegister src); | 
|  | 
| void pcmpeq(Type Ty, XmmRegister dst, XmmRegister src); | 
| @@ -715,12 +757,12 @@ public: | 
| void sar(Type Ty, GPRRegister operand, GPRRegister shifter); | 
| void sar(Type Ty, const Address &address, GPRRegister shifter); | 
|  | 
| -  void shld(GPRRegister dst, GPRRegister src); | 
| -  void shld(GPRRegister dst, GPRRegister src, const Immediate &imm); | 
| -  void shld(const Address &operand, GPRRegister src); | 
| -  void shrd(GPRRegister dst, GPRRegister src); | 
| -  void shrd(GPRRegister dst, GPRRegister src, const Immediate &imm); | 
| -  void shrd(const Address &dst, GPRRegister src); | 
| +  void shld(Type Ty, GPRRegister dst, GPRRegister src); | 
| +  void shld(Type Ty, GPRRegister dst, GPRRegister src, const Immediate &imm); | 
| +  void shld(Type Ty, const Address &operand, GPRRegister src); | 
| +  void shrd(Type Ty, GPRRegister dst, GPRRegister src); | 
| +  void shrd(Type Ty, GPRRegister dst, GPRRegister src, const Immediate &imm); | 
| +  void shrd(Type Ty, const Address &dst, GPRRegister src); | 
|  | 
| void neg(Type Ty, GPRRegister reg); | 
| void neg(Type Ty, const Address &addr); | 
|  |