Index: src/assembler_ia32.h |
diff --git a/src/assembler_ia32.h b/src/assembler_ia32.h |
index e4122fd7ef4a3aed33add7000c8c07b6cec0c2b7..9ceab2530c8244acba6efd27a030d78d5742d16e 100644 |
--- a/src/assembler_ia32.h |
+++ b/src/assembler_ia32.h |
@@ -354,6 +354,13 @@ public: |
TypedEmitGPRImm GPRImm; |
}; |
+ 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. |
+ }; |
+ |
// Operations to emit XMM instructions (and dispatch on operand type). |
typedef void (AssemblerX86::*TypedEmitXmmXmm)(Type, XmmRegister, XmmRegister); |
typedef void (AssemblerX86::*TypedEmitXmmAddr)(Type, XmmRegister, |
@@ -366,6 +373,15 @@ public: |
TypedEmitAddrXmm AddrXmm; |
}; |
+ typedef void (AssemblerX86::*TypedEmitXmmImm)(Type, XmmRegister, |
+ const Immediate &); |
+ |
+ struct XmmEmitterShiftOp { |
+ TypedEmitXmmXmm XmmXmm; |
+ TypedEmitXmmAddr XmmAddr; |
+ TypedEmitXmmImm XmmImm; |
+ }; |
+ |
/* |
* Emit Machine Instructions. |
*/ |
@@ -453,6 +469,8 @@ public: |
void pand(Type Ty, XmmRegister dst, const Address &src); |
void pandn(Type Ty, XmmRegister dst, XmmRegister src); |
void pandn(Type Ty, XmmRegister dst, const Address &src); |
+ void pmull(Type Ty, XmmRegister dst, XmmRegister src); |
+ void pmull(Type Ty, XmmRegister dst, const Address &src); |
void pmuludq(Type Ty, XmmRegister dst, XmmRegister src); |
void pmuludq(Type Ty, XmmRegister dst, const Address &src); |
void por(Type Ty, XmmRegister dst, XmmRegister src); |
@@ -462,6 +480,14 @@ public: |
void pxor(Type Ty, XmmRegister dst, XmmRegister src); |
void pxor(Type Ty, XmmRegister dst, const Address &src); |
+ void psll(Type Ty, XmmRegister dst, XmmRegister src); |
+ void psll(Type Ty, XmmRegister dst, const Address &src); |
+ void psll(Type Ty, XmmRegister dst, const Immediate &src); |
+ |
+ void psra(Type Ty, XmmRegister dst, XmmRegister src); |
+ void psra(Type Ty, XmmRegister dst, const Address &src); |
+ void psra(Type Ty, XmmRegister dst, const Immediate &src); |
+ |
void addps(Type Ty, XmmRegister dst, XmmRegister src); |
void addps(Type Ty, XmmRegister dst, const Address &src); |
void subps(Type Ty, XmmRegister dst, XmmRegister src); |
@@ -629,14 +655,22 @@ public: |
void decl(GPRRegister reg); |
void decl(const Address &address); |
- void shll(GPRRegister reg, const Immediate &imm); |
- void shll(GPRRegister operand, GPRRegister shifter); |
- void shll(const Address &operand, GPRRegister shifter); |
- void shrl(GPRRegister reg, const Immediate &imm); |
- void shrl(GPRRegister operand, GPRRegister shifter); |
- void sarl(GPRRegister reg, const Immediate &imm); |
- void sarl(GPRRegister operand, GPRRegister shifter); |
- void sarl(const Address &address, GPRRegister shifter); |
+ void rol(Type Ty, GPRRegister reg, const Immediate &imm); |
+ void rol(Type Ty, GPRRegister operand, GPRRegister shifter); |
+ void rol(Type Ty, const Address &operand, GPRRegister shifter); |
+ |
+ void shl(Type Ty, GPRRegister reg, const Immediate &imm); |
+ void shl(Type Ty, GPRRegister operand, GPRRegister shifter); |
+ void shl(Type Ty, const Address &operand, GPRRegister shifter); |
+ |
+ void shr(Type Ty, GPRRegister reg, const Immediate &imm); |
+ void shr(Type Ty, GPRRegister operand, GPRRegister shifter); |
+ void shr(Type Ty, const Address &operand, GPRRegister shifter); |
+ |
+ void sar(Type Ty, GPRRegister reg, const Immediate &imm); |
+ 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); |
@@ -721,8 +755,9 @@ private: |
void EmitLabelLink(Label *label); |
void EmitNearLabelLink(Label *label); |
- void EmitGenericShift(int rm, GPRRegister reg, const Immediate &imm); |
- void EmitGenericShift(int rm, const Operand &operand, GPRRegister shifter); |
+ void EmitGenericShift(int rm, Type Ty, GPRRegister reg, const Immediate &imm); |
+ void EmitGenericShift(int rm, Type Ty, const Operand &operand, |
+ GPRRegister shifter); |
AssemblerBuffer buffer_; |