Commit 6d18ae25 authored by jing.bao's avatar jing.bao Committed by Commit Bot

[ia32][wasm] Support AVX instructions for I32x4Splat/ReplaceLane/ExtractLane

Add vpinsrd, vpextrd, vmovd. Supplement pshufd and add vpshufd.
Add Movd and Pshufd macro. Add AVX support to Pextrd.
Fix disassembler to recognize "pinsrd/pextrd xmm,[mem],imm8".

BUG=

Review-Url: https://codereview.chromium.org/2916093002
Cr-Commit-Position: refs/heads/master@{#45833}
parent dc3de670
...@@ -1892,16 +1892,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1892,16 +1892,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} }
case kIA32I32x4Splat: { case kIA32I32x4Splat: {
XMMRegister dst = i.OutputSimd128Register(); XMMRegister dst = i.OutputSimd128Register();
__ movd(dst, i.InputOperand(0)); __ Movd(dst, i.InputOperand(0));
__ pshufd(dst, dst, 0x0); __ Pshufd(dst, dst, 0x0);
break; break;
} }
case kIA32I32x4ExtractLane: { case kIA32I32x4ExtractLane: {
__ Pextrd(i.OutputRegister(), i.InputSimd128Register(0), i.InputInt8(1)); __ Pextrd(i.OutputRegister(), i.InputSimd128Register(0), i.InputInt8(1));
break; break;
} }
case kIA32I32x4ReplaceLane: { case kSSEI32x4ReplaceLane: {
__ Pinsrd(i.OutputSimd128Register(), i.InputOperand(2), i.InputInt8(1)); CpuFeatureScope sse_scope(masm(), SSE4_1);
__ pinsrd(i.OutputSimd128Register(), i.InputOperand(2), i.InputInt8(1));
break; break;
} }
case kSSEI32x4Add: { case kSSEI32x4Add: {
...@@ -1912,6 +1913,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1912,6 +1913,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ psubd(i.OutputSimd128Register(), i.InputOperand(1)); __ psubd(i.OutputSimd128Register(), i.InputOperand(1));
break; break;
} }
case kAVXI32x4ReplaceLane: {
CpuFeatureScope avx_scope(masm(), AVX);
__ vpinsrd(i.OutputSimd128Register(), i.InputSimd128Register(0),
i.InputOperand(2), i.InputInt8(1));
break;
}
case kAVXI32x4Add: { case kAVXI32x4Add: {
CpuFeatureScope avx_scope(masm(), AVX); CpuFeatureScope avx_scope(masm(), AVX);
__ vpaddd(i.OutputSimd128Register(), i.InputSimd128Register(0), __ vpaddd(i.OutputSimd128Register(), i.InputSimd128Register(0),
......
...@@ -113,9 +113,10 @@ namespace compiler { ...@@ -113,9 +113,10 @@ namespace compiler {
V(IA32StackCheck) \ V(IA32StackCheck) \
V(IA32I32x4Splat) \ V(IA32I32x4Splat) \
V(IA32I32x4ExtractLane) \ V(IA32I32x4ExtractLane) \
V(IA32I32x4ReplaceLane) \ V(SSEI32x4ReplaceLane) \
V(SSEI32x4Add) \ V(SSEI32x4Add) \
V(SSEI32x4Sub) \ V(SSEI32x4Sub) \
V(AVXI32x4ReplaceLane) \
V(AVXI32x4Add) \ V(AVXI32x4Add) \
V(AVXI32x4Sub) V(AVXI32x4Sub)
......
...@@ -99,9 +99,10 @@ int InstructionScheduler::GetTargetInstructionFlags( ...@@ -99,9 +99,10 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kIA32BitcastIF: case kIA32BitcastIF:
case kIA32I32x4Splat: case kIA32I32x4Splat:
case kIA32I32x4ExtractLane: case kIA32I32x4ExtractLane:
case kIA32I32x4ReplaceLane: case kSSEI32x4ReplaceLane:
case kSSEI32x4Add: case kSSEI32x4Add:
case kSSEI32x4Sub: case kSSEI32x4Sub:
case kAVXI32x4ReplaceLane:
case kAVXI32x4Add: case kAVXI32x4Add:
case kAVXI32x4Sub: case kAVXI32x4Sub:
return (instr->addressing_mode() == kMode_None) return (instr->addressing_mode() == kMode_None)
......
...@@ -1906,10 +1906,16 @@ void InstructionSelector::VisitI32x4ExtractLane(Node* node) { ...@@ -1906,10 +1906,16 @@ void InstructionSelector::VisitI32x4ExtractLane(Node* node) {
void InstructionSelector::VisitI32x4ReplaceLane(Node* node) { void InstructionSelector::VisitI32x4ReplaceLane(Node* node) {
IA32OperandGenerator g(this); IA32OperandGenerator g(this);
int32_t lane = OpParameter<int32_t>(node); InstructionOperand operand0 = g.UseRegister(node->InputAt(0));
Emit(kIA32I32x4ReplaceLane, g.DefineSameAsFirst(node), InstructionOperand operand1 = g.UseImmediate(OpParameter<int32_t>(node));
g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), InstructionOperand operand2 = g.Use(node->InputAt(1));
g.Use(node->InputAt(1))); if (IsSupported(AVX)) {
Emit(kAVXI32x4ReplaceLane, g.DefineAsRegister(node), operand0, operand1,
operand2);
} else {
Emit(kSSEI32x4ReplaceLane, g.DefineSameAsFirst(node), operand0, operand1,
operand2);
}
} }
void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) { void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) {
......
...@@ -2683,8 +2683,7 @@ void Assembler::psrlq(XMMRegister dst, XMMRegister src) { ...@@ -2683,8 +2683,7 @@ void Assembler::psrlq(XMMRegister dst, XMMRegister src) {
emit_sse_operand(dst, src); emit_sse_operand(dst, src);
} }
void Assembler::pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle) {
void Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
EMIT(0x66); EMIT(0x66);
EMIT(0x0F); EMIT(0x0F);
...@@ -2884,6 +2883,22 @@ void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8) { ...@@ -2884,6 +2883,22 @@ void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8) {
EMIT(imm8); EMIT(imm8);
} }
void Assembler::vpshufd(XMMRegister dst, const Operand& src, uint8_t shuffle) {
vinstr(0x70, dst, xmm0, src, k66, k0F, kWIG);
EMIT(shuffle);
}
void Assembler::vpextrd(const Operand& dst, XMMRegister src, int8_t offset) {
vinstr(0x16, src, xmm0, dst, k66, k0F3A, kWIG);
EMIT(offset);
}
void Assembler::vpinsrd(XMMRegister dst, XMMRegister src1, const Operand& src2,
int8_t offset) {
vinstr(0x22, dst, src1, src2, k66, k0F3A, kWIG);
EMIT(offset);
}
void Assembler::bmi1(byte op, Register reg, Register vreg, const Operand& rm) { void Assembler::bmi1(byte op, Register reg, Register vreg, const Operand& rm) {
DCHECK(IsEnabled(BMI1)); DCHECK(IsEnabled(BMI1));
EnsureSpace ensure_space(this); EnsureSpace ensure_space(this);
......
...@@ -1127,7 +1127,11 @@ class Assembler : public AssemblerBase { ...@@ -1127,7 +1127,11 @@ class Assembler : public AssemblerBase {
void psllq(XMMRegister dst, XMMRegister src); void psllq(XMMRegister dst, XMMRegister src);
void psrlq(XMMRegister reg, int8_t shift); void psrlq(XMMRegister reg, int8_t shift);
void psrlq(XMMRegister dst, XMMRegister src); void psrlq(XMMRegister dst, XMMRegister src);
void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle);
void pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
pshufd(dst, Operand(src), shuffle);
}
void pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle);
void pextrd(Register dst, XMMRegister src, int8_t offset) { void pextrd(Register dst, XMMRegister src, int8_t offset) {
pextrd(Operand(dst), src, offset); pextrd(Operand(dst), src, offset);
} }
...@@ -1384,6 +1388,21 @@ class Assembler : public AssemblerBase { ...@@ -1384,6 +1388,21 @@ class Assembler : public AssemblerBase {
void vpsraw(XMMRegister dst, XMMRegister src, int8_t imm8); void vpsraw(XMMRegister dst, XMMRegister src, int8_t imm8);
void vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8); void vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8);
void vpshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
vpshufd(dst, Operand(src), shuffle);
}
void vpshufd(XMMRegister dst, const Operand& src, uint8_t shuffle);
void vpextrd(Register dst, XMMRegister src, int8_t offset) {
vpextrd(Operand(dst), src, offset);
}
void vpextrd(const Operand& dst, XMMRegister src, int8_t offset);
void vpinsrd(XMMRegister dst, XMMRegister src1, Register src2,
int8_t offset) {
vpinsrd(dst, src1, Operand(src2), offset);
}
void vpinsrd(XMMRegister dst, XMMRegister src1, const Operand& src2,
int8_t offset);
void vcvtdq2ps(XMMRegister dst, XMMRegister src) { void vcvtdq2ps(XMMRegister dst, XMMRegister src) {
vcvtdq2ps(dst, Operand(src)); vcvtdq2ps(dst, Operand(src));
} }
...@@ -1397,6 +1416,15 @@ class Assembler : public AssemblerBase { ...@@ -1397,6 +1416,15 @@ class Assembler : public AssemblerBase {
vinstr(0x5B, dst, xmm0, src, kF3, k0F, kWIG); vinstr(0x5B, dst, xmm0, src, kF3, k0F, kWIG);
} }
void vmovd(XMMRegister dst, Register src) { vmovd(dst, Operand(src)); }
void vmovd(XMMRegister dst, const Operand& src) {
vinstr(0x6E, dst, xmm0, src, k66, k0F, kWIG);
}
void vmovd(Register dst, XMMRegister src) { movd(Operand(dst), src); }
void vmovd(const Operand& dst, XMMRegister src) {
vinstr(0x7E, src, xmm0, dst, k66, k0F, kWIG);
}
// BMI instruction // BMI instruction
void andn(Register dst, Register src1, Register src2) { void andn(Register dst, Register src1, Register src2) {
andn(dst, src1, Operand(src2)); andn(dst, src1, Operand(src2));
......
...@@ -817,6 +817,27 @@ int DisassemblerIA32::AVXInstruction(byte* data) { ...@@ -817,6 +817,27 @@ int DisassemblerIA32::AVXInstruction(byte* data) {
default: default:
UnimplementedInstruction(); UnimplementedInstruction();
} }
} else if (vex_66() && vex_0f3a()) {
int mod, regop, rm, vvvv = vex_vreg();
get_modrm(*current, &mod, &regop, &rm);
switch (opcode) {
case 0x16:
AppendToBuffer("vpextrd ");
current += PrintRightOperand(current);
AppendToBuffer(",%s,%d", NameOfXMMRegister(regop),
*reinterpret_cast<int8_t*>(current));
current++;
break;
case 0x22:
AppendToBuffer("vpinsrd %s,%s,", NameOfXMMRegister(regop),
NameOfXMMRegister(vvvv));
current += PrintRightOperand(current);
AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current));
current++;
break;
default:
UnimplementedInstruction();
}
} else if (vex_f2() && vex_0f()) { } else if (vex_f2() && vex_0f()) {
int mod, regop, rm, vvvv = vex_vreg(); int mod, regop, rm, vvvv = vex_vreg();
get_modrm(*current, &mod, &regop, &rm); get_modrm(*current, &mod, &regop, &rm);
...@@ -1101,6 +1122,16 @@ int DisassemblerIA32::AVXInstruction(byte* data) { ...@@ -1101,6 +1122,16 @@ int DisassemblerIA32::AVXInstruction(byte* data) {
NameOfXMMRegister(vvvv)); NameOfXMMRegister(vvvv));
current += PrintRightXMMOperand(current); current += PrintRightXMMOperand(current);
break; break;
case 0x6E:
AppendToBuffer("vmovd %s,", NameOfXMMRegister(regop));
current += PrintRightOperand(current);
break;
case 0x70:
AppendToBuffer("vpshufd %s,", NameOfXMMRegister(regop));
current += PrintRightXMMOperand(current);
AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(current));
current++;
break;
case 0x71: case 0x71:
AppendToBuffer("vps%sw %s,%s", sf_str[regop / 2], AppendToBuffer("vps%sw %s,%s", sf_str[regop / 2],
NameOfXMMRegister(vvvv), NameOfXMMRegister(rm)); NameOfXMMRegister(vvvv), NameOfXMMRegister(rm));
...@@ -1113,6 +1144,11 @@ int DisassemblerIA32::AVXInstruction(byte* data) { ...@@ -1113,6 +1144,11 @@ int DisassemblerIA32::AVXInstruction(byte* data) {
current++; current++;
AppendToBuffer(",%u", *current++); AppendToBuffer(",%u", *current++);
break; break;
case 0x7E:
AppendToBuffer("vmovd ");
current += PrintRightOperand(current);
AppendToBuffer(",%s", NameOfXMMRegister(regop));
break;
#define DECLARE_SSE_AVX_DIS_CASE(instruction, notUsed1, notUsed2, opcode) \ #define DECLARE_SSE_AVX_DIS_CASE(instruction, notUsed1, notUsed2, opcode) \
case 0x##opcode: { \ case 0x##opcode: { \
AppendToBuffer("v" #instruction " %s,%s,", NameOfXMMRegister(regop), \ AppendToBuffer("v" #instruction " %s,%s,", NameOfXMMRegister(regop), \
...@@ -1850,13 +1886,12 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, ...@@ -1850,13 +1886,12 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer,
} else if (*data == 0x16) { } else if (*data == 0x16) {
data++; data++;
int mod, regop, rm; int mod, regop, rm;
get_modrm(*data, &mod, &rm, &regop); get_modrm(*data, &mod, &regop, &rm);
int8_t imm8 = static_cast<int8_t>(data[1]); AppendToBuffer("pextrd ");
AppendToBuffer("pextrd %s,%s,%d", data += PrintRightOperand(data);
NameOfCPURegister(regop), AppendToBuffer(",%s,%d", NameOfXMMRegister(regop),
NameOfXMMRegister(rm), *reinterpret_cast<int8_t*>(data));
static_cast<int>(imm8)); data++;
data += 2;
} else if (*data == 0x17) { } else if (*data == 0x17) {
data++; data++;
int mod, regop, rm; int mod, regop, rm;
...@@ -1871,12 +1906,10 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, ...@@ -1871,12 +1906,10 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer,
data++; data++;
int mod, regop, rm; int mod, regop, rm;
get_modrm(*data, &mod, &regop, &rm); get_modrm(*data, &mod, &regop, &rm);
int8_t imm8 = static_cast<int8_t>(data[1]); AppendToBuffer("pinsrd %s,", NameOfXMMRegister(regop));
AppendToBuffer("pinsrd %s,%s,%d", data += PrintRightOperand(data);
NameOfXMMRegister(regop), AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data));
NameOfCPURegister(rm), data++;
static_cast<int>(imm8));
data += 2;
} else { } else {
UnimplementedInstruction(); UnimplementedInstruction();
} }
...@@ -1942,12 +1975,10 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer, ...@@ -1942,12 +1975,10 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer,
data++; data++;
int mod, regop, rm; int mod, regop, rm;
get_modrm(*data, &mod, &regop, &rm); get_modrm(*data, &mod, &regop, &rm);
int8_t imm8 = static_cast<int8_t>(data[1]); AppendToBuffer("pshufd %s,", NameOfXMMRegister(regop));
AppendToBuffer("pshufd %s,%s,%d", data += PrintRightXMMOperand(data);
NameOfXMMRegister(regop), AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data));
NameOfXMMRegister(rm), data++;
static_cast<int>(imm8));
data += 2;
} else if (*data == 0x90) { } else if (*data == 0x90) {
data++; data++;
AppendToBuffer("nop"); // 2 byte nop. AppendToBuffer("nop"); // 2 byte nop.
......
...@@ -2136,10 +2136,24 @@ void MacroAssembler::Move(XMMRegister dst, uint64_t src) { ...@@ -2136,10 +2136,24 @@ void MacroAssembler::Move(XMMRegister dst, uint64_t src) {
} }
} }
void MacroAssembler::Pshufd(XMMRegister dst, const Operand& src,
uint8_t shuffle) {
if (CpuFeatures::IsSupported(AVX)) {
CpuFeatureScope scope(this, AVX);
vpshufd(dst, src, shuffle);
} else {
pshufd(dst, src, shuffle);
}
}
void MacroAssembler::Pextrd(Register dst, XMMRegister src, int8_t imm8) { void MacroAssembler::Pextrd(Register dst, XMMRegister src, int8_t imm8) {
if (imm8 == 0) { if (imm8 == 0) {
movd(dst, src); Movd(dst, src);
return;
}
if (CpuFeatures::IsSupported(AVX)) {
CpuFeatureScope scope(this, AVX);
vpextrd(dst, src, imm8);
return; return;
} }
if (CpuFeatures::IsSupported(SSE4_1)) { if (CpuFeatures::IsSupported(SSE4_1)) {
......
...@@ -715,6 +715,29 @@ class MacroAssembler: public Assembler { ...@@ -715,6 +715,29 @@ class MacroAssembler: public Assembler {
void PushReturnAddressFrom(Register src) { push(src); } void PushReturnAddressFrom(Register src) { push(src); }
void PopReturnAddressTo(Register dst) { pop(dst); } void PopReturnAddressTo(Register dst) { pop(dst); }
// SSE/SSE2 instructions with AVX version.
#define AVX_OP2_WITH_TYPE(macro_name, name, dst_type, src_type) \
void macro_name(dst_type dst, src_type src) { \
if (CpuFeatures::IsSupported(AVX)) { \
CpuFeatureScope scope(this, AVX); \
v##name(dst, src); \
} else { \
name(dst, src); \
} \
}
AVX_OP2_WITH_TYPE(Movd, movd, XMMRegister, Register)
AVX_OP2_WITH_TYPE(Movd, movd, XMMRegister, const Operand&)
AVX_OP2_WITH_TYPE(Movd, movd, Register, XMMRegister)
AVX_OP2_WITH_TYPE(Movd, movd, const Operand&, XMMRegister)
#undef AVX_OP2_WITH_TYPE
void Pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
Pshufd(dst, Operand(src), shuffle);
}
void Pshufd(XMMRegister dst, const Operand& src, uint8_t shuffle);
// Non-SSE2 instructions. // Non-SSE2 instructions.
void Pextrd(Register dst, XMMRegister src, int8_t imm8); void Pextrd(Register dst, XMMRegister src, int8_t imm8);
void Pinsrd(XMMRegister dst, Register src, int8_t imm8, void Pinsrd(XMMRegister dst, Register src, int8_t imm8,
......
...@@ -462,6 +462,11 @@ TEST(DisasmIa320) { ...@@ -462,6 +462,11 @@ TEST(DisasmIa320) {
__ movdqu(xmm0, Operand(ebx, ecx, times_4, 10000)); __ movdqu(xmm0, Operand(ebx, ecx, times_4, 10000));
__ movdqu(Operand(ebx, ecx, times_4, 10000), xmm0); __ movdqu(Operand(ebx, ecx, times_4, 10000), xmm0);
__ movd(xmm0, edi);
__ movd(xmm0, Operand(ebx, ecx, times_4, 10000));
__ movd(eax, xmm1);
__ movd(Operand(ebx, ecx, times_4, 10000), xmm1);
__ addsd(xmm1, xmm0); __ addsd(xmm1, xmm0);
__ addsd(xmm1, Operand(ebx, ecx, times_4, 10000)); __ addsd(xmm1, Operand(ebx, ecx, times_4, 10000));
__ mulsd(xmm1, xmm0); __ mulsd(xmm1, xmm0);
...@@ -490,6 +495,8 @@ TEST(DisasmIa320) { ...@@ -490,6 +495,8 @@ TEST(DisasmIa320) {
__ psrlq(xmm0, 17); __ psrlq(xmm0, 17);
__ psrlq(xmm0, xmm1); __ psrlq(xmm0, xmm1);
__ pshufd(xmm5, xmm1, 5);
__ pshufd(xmm5, Operand(edx, 4), 5);
__ pinsrw(xmm5, edx, 5); __ pinsrw(xmm5, edx, 5);
__ pinsrw(xmm5, Operand(edx, 4), 5); __ pinsrw(xmm5, Operand(edx, 4), 5);
...@@ -525,7 +532,9 @@ TEST(DisasmIa320) { ...@@ -525,7 +532,9 @@ TEST(DisasmIa320) {
if (CpuFeatures::IsSupported(SSE4_1)) { if (CpuFeatures::IsSupported(SSE4_1)) {
CpuFeatureScope scope(&assm, SSE4_1); CpuFeatureScope scope(&assm, SSE4_1);
__ pextrd(eax, xmm0, 1); __ pextrd(eax, xmm0, 1);
__ pextrd(Operand(edx, 4), xmm0, 1);
__ pinsrd(xmm1, eax, 0); __ pinsrd(xmm1, eax, 0);
__ pinsrd(xmm1, Operand(edx, 4), 0);
__ extractps(eax, xmm1, 0); __ extractps(eax, xmm1, 0);
#define EMIT_SSE4_INSTR(instruction, notUsed1, notUsed2, notUsed3, notUsed4) \ #define EMIT_SSE4_INSTR(instruction, notUsed1, notUsed2, notUsed3, notUsed4) \
...@@ -621,11 +630,22 @@ TEST(DisasmIa320) { ...@@ -621,11 +630,22 @@ TEST(DisasmIa320) {
__ vpsraw(xmm0, xmm7, 21); __ vpsraw(xmm0, xmm7, 21);
__ vpsrad(xmm0, xmm7, 21); __ vpsrad(xmm0, xmm7, 21);
__ vpshufd(xmm5, xmm1, 5);
__ vpshufd(xmm5, Operand(edx, 4), 5);
__ vpextrd(eax, xmm0, 1);
__ vpextrd(Operand(edx, 4), xmm0, 1);
__ vpinsrd(xmm0, xmm1, eax, 0);
__ vpinsrd(xmm0, xmm1, Operand(edx, 4), 0);
__ vcvtdq2ps(xmm1, xmm0); __ vcvtdq2ps(xmm1, xmm0);
__ vcvtdq2ps(xmm1, Operand(ebx, ecx, times_4, 10000)); __ vcvtdq2ps(xmm1, Operand(ebx, ecx, times_4, 10000));
__ vcvttps2dq(xmm1, xmm0); __ vcvttps2dq(xmm1, xmm0);
__ vcvttps2dq(xmm1, Operand(ebx, ecx, times_4, 10000)); __ vcvttps2dq(xmm1, Operand(ebx, ecx, times_4, 10000));
__ vmovd(xmm0, edi);
__ vmovd(xmm0, Operand(ebx, ecx, times_4, 10000));
__ vmovd(eax, xmm1);
__ vmovd(Operand(ebx, ecx, times_4, 10000), xmm1);
#define EMIT_SSE2_AVXINSTR(instruction, notUsed1, notUsed2, notUsed3) \ #define EMIT_SSE2_AVXINSTR(instruction, notUsed1, notUsed2, notUsed3) \
__ v##instruction(xmm7, xmm5, xmm1); \ __ v##instruction(xmm7, xmm5, xmm1); \
__ v##instruction(xmm7, xmm5, Operand(edx, 4)); __ v##instruction(xmm7, xmm5, Operand(edx, 4));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment