| Index: src/ia32/assembler-ia32.h
|
| diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h
|
| index 69046e189bc0fa08447f36270200bda02fc9120e..bb8098daee4fb41329460cbb074f7896983a0826 100644
|
| --- a/src/ia32/assembler-ia32.h
|
| +++ b/src/ia32/assembler-ia32.h
|
| @@ -1314,6 +1314,90 @@ class Assembler : public AssemblerBase {
|
| }
|
| void vss(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2);
|
|
|
| + // BMI instruction
|
| + void andn(Register dst, Register src1, Register src2) {
|
| + andn(dst, src1, Operand(src2));
|
| + }
|
| + void andn(Register dst, Register src1, const Operand& src2) {
|
| + bmi1(0xf2, dst, src1, src2);
|
| + }
|
| + void bextr(Register dst, Register src1, Register src2) {
|
| + bextr(dst, Operand(src1), src2);
|
| + }
|
| + void bextr(Register dst, const Operand& src1, Register src2) {
|
| + bmi1(0xf7, dst, src2, src1);
|
| + }
|
| + void blsi(Register dst, Register src) { blsi(dst, Operand(src)); }
|
| + void blsi(Register dst, const Operand& src) {
|
| + Register ireg = {3};
|
| + bmi1(0xf3, ireg, dst, src);
|
| + }
|
| + void blsmsk(Register dst, Register src) { blsmsk(dst, Operand(src)); }
|
| + void blsmsk(Register dst, const Operand& src) {
|
| + Register ireg = {2};
|
| + bmi1(0xf3, ireg, dst, src);
|
| + }
|
| + void blsr(Register dst, Register src) { blsr(dst, Operand(src)); }
|
| + void blsr(Register dst, const Operand& src) {
|
| + Register ireg = {1};
|
| + bmi1(0xf3, ireg, dst, src);
|
| + }
|
| + void tzcnt(Register dst, Register src) { tzcnt(dst, Operand(src)); }
|
| + void tzcnt(Register dst, const Operand& src);
|
| +
|
| + void lzcnt(Register dst, Register src) { lzcnt(dst, Operand(src)); }
|
| + void lzcnt(Register dst, const Operand& src);
|
| +
|
| + void popcnt(Register dst, Register src) { popcnt(dst, Operand(src)); }
|
| + void popcnt(Register dst, const Operand& src);
|
| +
|
| + void bzhi(Register dst, Register src1, Register src2) {
|
| + bzhi(dst, Operand(src1), src2);
|
| + }
|
| + void bzhi(Register dst, const Operand& src1, Register src2) {
|
| + bmi2(kNone, 0xf5, dst, src2, src1);
|
| + }
|
| + void mulx(Register dst1, Register dst2, Register src) {
|
| + mulx(dst1, dst2, Operand(src));
|
| + }
|
| + void mulx(Register dst1, Register dst2, const Operand& src) {
|
| + bmi2(kF2, 0xf6, dst1, dst2, src);
|
| + }
|
| + void pdep(Register dst, Register src1, Register src2) {
|
| + pdep(dst, src1, Operand(src2));
|
| + }
|
| + void pdep(Register dst, Register src1, const Operand& src2) {
|
| + bmi2(kF2, 0xf5, dst, src1, src2);
|
| + }
|
| + void pext(Register dst, Register src1, Register src2) {
|
| + pext(dst, src1, Operand(src2));
|
| + }
|
| + void pext(Register dst, Register src1, const Operand& src2) {
|
| + bmi2(kF3, 0xf5, dst, src1, src2);
|
| + }
|
| + void sarx(Register dst, Register src1, Register src2) {
|
| + sarx(dst, Operand(src1), src2);
|
| + }
|
| + void sarx(Register dst, const Operand& src1, Register src2) {
|
| + bmi2(kF3, 0xf7, dst, src2, src1);
|
| + }
|
| + void shlx(Register dst, Register src1, Register src2) {
|
| + shlx(dst, Operand(src1), src2);
|
| + }
|
| + void shlx(Register dst, const Operand& src1, Register src2) {
|
| + bmi2(k66, 0xf7, dst, src2, src1);
|
| + }
|
| + void shrx(Register dst, Register src1, Register src2) {
|
| + shrx(dst, Operand(src1), src2);
|
| + }
|
| + void shrx(Register dst, const Operand& src1, Register src2) {
|
| + bmi2(kF2, 0xf7, dst, src2, src1);
|
| + }
|
| + void rorx(Register dst, Register src, byte imm8) {
|
| + rorx(dst, Operand(src), imm8);
|
| + }
|
| + void rorx(Register dst, const Operand& src, byte imm8);
|
| +
|
| // Prefetch src position into cache level.
|
| // Level 1, 2 or 3 specifies CPU cache level. Level 0 specifies a
|
| // non-temporal
|
| @@ -1425,11 +1509,13 @@ class Assembler : public AssemblerBase {
|
|
|
| // Emit vex prefix
|
| enum SIMDPrefix { kNone = 0x0, k66 = 0x1, kF3 = 0x2, kF2 = 0x3 };
|
| - enum VectorLength { kL128 = 0x0, kL256 = 0x4, kLIG = kL128 };
|
| + enum VectorLength { kL128 = 0x0, kL256 = 0x4, kLIG = kL128, kLZ = kL128 };
|
| enum VexW { kW0 = 0x0, kW1 = 0x80, kWIG = kW0 };
|
| - enum LeadingOpcode { k0F = 0x1, k0F38 = 0x2, k0F3A = 0x2 };
|
| + enum LeadingOpcode { k0F = 0x1, k0F38 = 0x2, k0F3A = 0x3 };
|
| inline void emit_vex_prefix(XMMRegister v, VectorLength l, SIMDPrefix pp,
|
| LeadingOpcode m, VexW w);
|
| + inline void emit_vex_prefix(Register v, VectorLength l, SIMDPrefix pp,
|
| + LeadingOpcode m, VexW w);
|
|
|
| // labels
|
| void print(Label* L);
|
| @@ -1441,6 +1527,11 @@ class Assembler : public AssemblerBase {
|
| inline void emit_disp(Label* L, Displacement::Type type);
|
| inline void emit_near_disp(Label* L);
|
|
|
| + // Most BMI instructions are similiar.
|
| + void bmi1(byte op, Register reg, Register vreg, const Operand& rm);
|
| + void bmi2(SIMDPrefix pp, byte op, Register reg, Register vreg,
|
| + const Operand& rm);
|
| +
|
| // record reloc info for current pc_
|
| void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0);
|
|
|
|
|