Index: src/x64/assembler-x64.h |
diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h |
index c9e319b9f16b70d057f13a461fb052d7bda127fe..27728b6a45edf3269657737b68a6ec24190ca69b 100644 |
--- a/src/x64/assembler-x64.h |
+++ b/src/x64/assembler-x64.h |
@@ -1014,6 +1014,17 @@ class Assembler : public AssemblerBase { |
void sahf(); |
// SSE instructions |
+ void addss(XMMRegister dst, XMMRegister src); |
+ void addss(XMMRegister dst, const Operand& src); |
+ void subss(XMMRegister dst, XMMRegister src); |
+ void subss(XMMRegister dst, const Operand& src); |
+ void mulss(XMMRegister dst, XMMRegister src); |
+ void mulss(XMMRegister dst, const Operand& src); |
+ void divss(XMMRegister dst, XMMRegister src); |
+ void divss(XMMRegister dst, const Operand& src); |
+ |
+ void ucomiss(XMMRegister dst, XMMRegister src); |
+ void ucomiss(XMMRegister dst, const Operand& src); |
void movaps(XMMRegister dst, XMMRegister src); |
void movss(XMMRegister dst, const Operand& src); |
void movss(const Operand& dst, XMMRegister src); |
@@ -1123,6 +1134,157 @@ class Assembler : public AssemblerBase { |
void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); |
+ // AVX instruction |
+ void vfmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0x99, dst, src1, src2); |
+ } |
+ void vfmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xa9, dst, src1, src2); |
+ } |
+ void vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xb9, dst, src1, src2); |
+ } |
+ void vfmadd132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0x99, dst, src1, src2); |
+ } |
+ void vfmadd213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xa9, dst, src1, src2); |
+ } |
+ void vfmadd231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xb9, dst, src1, src2); |
+ } |
+ void vfmsub132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0x9b, dst, src1, src2); |
+ } |
+ void vfmsub213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xab, dst, src1, src2); |
+ } |
+ void vfmsub231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xbb, dst, src1, src2); |
+ } |
+ void vfmsub132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0x9b, dst, src1, src2); |
+ } |
+ void vfmsub213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xab, dst, src1, src2); |
+ } |
+ void vfmsub231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xbb, dst, src1, src2); |
+ } |
+ void vfnmadd132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0x9d, dst, src1, src2); |
+ } |
+ void vfnmadd213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xad, dst, src1, src2); |
+ } |
+ void vfnmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xbd, dst, src1, src2); |
+ } |
+ void vfnmadd132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0x9d, dst, src1, src2); |
+ } |
+ void vfnmadd213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xad, dst, src1, src2); |
+ } |
+ void vfnmadd231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xbd, dst, src1, src2); |
+ } |
+ void vfnmsub132sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0x9f, dst, src1, src2); |
+ } |
+ void vfnmsub213sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xaf, dst, src1, src2); |
+ } |
+ void vfnmsub231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmasd(0xbf, dst, src1, src2); |
+ } |
+ void vfnmsub132sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0x9f, dst, src1, src2); |
+ } |
+ void vfnmsub213sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xaf, dst, src1, src2); |
+ } |
+ void vfnmsub231sd(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmasd(0xbf, dst, src1, src2); |
+ } |
+ void vfmasd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
+ void vfmasd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
+ |
+ void vfmadd132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0x99, dst, src1, src2); |
+ } |
+ void vfmadd213ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xa9, dst, src1, src2); |
+ } |
+ void vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xb9, dst, src1, src2); |
+ } |
+ void vfmadd132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0x99, dst, src1, src2); |
+ } |
+ void vfmadd213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xa9, dst, src1, src2); |
+ } |
+ void vfmadd231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xb9, dst, src1, src2); |
+ } |
+ void vfmsub132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0x9b, dst, src1, src2); |
+ } |
+ void vfmsub213ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xab, dst, src1, src2); |
+ } |
+ void vfmsub231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xbb, dst, src1, src2); |
+ } |
+ void vfmsub132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0x9b, dst, src1, src2); |
+ } |
+ void vfmsub213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xab, dst, src1, src2); |
+ } |
+ void vfmsub231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xbb, dst, src1, src2); |
+ } |
+ void vfnmadd132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0x9d, dst, src1, src2); |
+ } |
+ void vfnmadd213ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xad, dst, src1, src2); |
+ } |
+ void vfnmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xbd, dst, src1, src2); |
+ } |
+ void vfnmadd132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0x9d, dst, src1, src2); |
+ } |
+ void vfnmadd213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xad, dst, src1, src2); |
+ } |
+ void vfnmadd231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xbd, dst, src1, src2); |
+ } |
+ void vfnmsub132ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0x9f, dst, src1, src2); |
+ } |
+ void vfnmsub213ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xaf, dst, src1, src2); |
+ } |
+ void vfnmsub231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { |
+ vfmass(0xbf, dst, src1, src2); |
+ } |
+ void vfnmsub132ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0x9f, dst, src1, src2); |
+ } |
+ void vfnmsub213ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xaf, dst, src1, src2); |
+ } |
+ void vfnmsub231ss(XMMRegister dst, XMMRegister src1, const Operand& src2) { |
+ vfmass(0xbf, dst, src1, src2); |
+ } |
+ void vfmass(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2); |
+ void vfmass(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
+ |
// Debugging |
void Print(); |
@@ -1316,6 +1478,14 @@ class Assembler : public AssemblerBase { |
} |
} |
+ // Emit vex prefix |
+ void emit_vex2_byte0() { emit(0xc5); } |
+ void emit_vex2_byte1(XMMRegister reg, XMMRegister v, byte lpp); |
+ void emit_vex3_byte0() { emit(0xc4); } |
+ void emit_vex3_byte1(XMMRegister reg, XMMRegister rm, byte m); |
+ void emit_vex3_byte1(XMMRegister reg, const Operand& rm, byte m); |
+ void emit_vex3_byte2(byte w, XMMRegister v, byte lpp); |
+ |
// Emit the ModR/M byte, and optionally the SIB byte and |
// 1- or 4-byte offset for a memory operand. Also encodes |
// the second operand of the operation, a register or operation |