| Index: src/compiler/x64/code-generator-x64.cc
|
| diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc
|
| index 3160734788b68d3888aa347fa31e8f8585815a74..fee2702332d463a4f724043d00c23b0cb0084bcd 100644
|
| --- a/src/compiler/x64/code-generator-x64.cc
|
| +++ b/src/compiler/x64/code-generator-x64.cc
|
| @@ -265,7 +265,7 @@ class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode {
|
| } while (0)
|
|
|
|
|
| -#define ASSEMBLE_DOUBLE_BINOP(asm_instr) \
|
| +#define ASSEMBLE_SSE_BINOP(asm_instr) \
|
| do { \
|
| if (instr->InputAt(1)->IsDoubleRegister()) { \
|
| __ asm_instr(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); \
|
| @@ -275,7 +275,17 @@ class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode {
|
| } while (0)
|
|
|
|
|
| -#define ASSEMBLE_AVX_DOUBLE_BINOP(asm_instr) \
|
| +#define ASSEMBLE_SSE_UNOP(asm_instr) \
|
| + do { \
|
| + if (instr->InputAt(0)->IsDoubleRegister()) { \
|
| + __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \
|
| + } else { \
|
| + __ asm_instr(i.OutputDoubleRegister(), i.InputOperand(0)); \
|
| + } \
|
| + } while (0)
|
| +
|
| +
|
| +#define ASSEMBLE_AVX_BINOP(asm_instr) \
|
| do { \
|
| CpuFeatureScope avx_scope(masm(), AVX); \
|
| if (instr->InputAt(1)->IsDoubleRegister()) { \
|
| @@ -701,20 +711,47 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| __ Lzcntl(i.OutputRegister(), i.InputOperand(0));
|
| }
|
| break;
|
| + case kSSEFloat32Cmp:
|
| + ASSEMBLE_SSE_BINOP(ucomiss);
|
| + break;
|
| + case kSSEFloat32Add:
|
| + ASSEMBLE_SSE_BINOP(addss);
|
| + break;
|
| + case kSSEFloat32Sub:
|
| + ASSEMBLE_SSE_BINOP(subss);
|
| + break;
|
| + case kSSEFloat32Mul:
|
| + ASSEMBLE_SSE_BINOP(mulss);
|
| + break;
|
| + case kSSEFloat32Div:
|
| + ASSEMBLE_SSE_BINOP(divss);
|
| + break;
|
| + case kSSEFloat32Max:
|
| + ASSEMBLE_SSE_BINOP(maxss);
|
| + break;
|
| + case kSSEFloat32Min:
|
| + ASSEMBLE_SSE_BINOP(minss);
|
| + break;
|
| + case kSSEFloat32Sqrt:
|
| + ASSEMBLE_SSE_UNOP(sqrtss);
|
| + break;
|
| + case kSSEFloat32ToFloat64:
|
| + ASSEMBLE_SSE_UNOP(cvtss2sd);
|
| + break;
|
| case kSSEFloat64Cmp:
|
| - ASSEMBLE_DOUBLE_BINOP(ucomisd);
|
| + ASSEMBLE_SSE_BINOP(ucomisd);
|
| break;
|
| case kSSEFloat64Add:
|
| - ASSEMBLE_DOUBLE_BINOP(addsd);
|
| + ASSEMBLE_SSE_BINOP(addsd);
|
| break;
|
| case kSSEFloat64Sub:
|
| - ASSEMBLE_DOUBLE_BINOP(subsd);
|
| + ASSEMBLE_SSE_BINOP(subsd);
|
| break;
|
| case kSSEFloat64Mul:
|
| - ASSEMBLE_DOUBLE_BINOP(mulsd);
|
| + ASSEMBLE_SSE_BINOP(mulsd);
|
| break;
|
| case kSSEFloat64Div:
|
| - ASSEMBLE_DOUBLE_BINOP(divsd);
|
| + ASSEMBLE_SSE_BINOP(divsd);
|
| break;
|
| case kSSEFloat64Mod: {
|
| __ subq(rsp, Immediate(kDoubleSize));
|
| @@ -749,17 +786,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| break;
|
| }
|
| case kSSEFloat64Max:
|
| - ASSEMBLE_DOUBLE_BINOP(maxsd);
|
| + ASSEMBLE_SSE_BINOP(maxsd);
|
| break;
|
| case kSSEFloat64Min:
|
| - ASSEMBLE_DOUBLE_BINOP(minsd);
|
| + ASSEMBLE_SSE_BINOP(minsd);
|
| break;
|
| case kSSEFloat64Sqrt:
|
| - if (instr->InputAt(0)->IsDoubleRegister()) {
|
| - __ sqrtsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
|
| - } else {
|
| - __ sqrtsd(i.OutputDoubleRegister(), i.InputOperand(0));
|
| - }
|
| + ASSEMBLE_SSE_UNOP(sqrtsd);
|
| break;
|
| case kSSEFloat64Round: {
|
| CpuFeatureScope sse_scope(masm(), SSE4_1);
|
| @@ -768,19 +801,8 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| __ roundsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), mode);
|
| break;
|
| }
|
| - case kSSECvtss2sd:
|
| - if (instr->InputAt(0)->IsDoubleRegister()) {
|
| - __ cvtss2sd(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
|
| - } else {
|
| - __ cvtss2sd(i.OutputDoubleRegister(), i.InputOperand(0));
|
| - }
|
| - break;
|
| - case kSSECvtsd2ss:
|
| - if (instr->InputAt(0)->IsDoubleRegister()) {
|
| - __ cvtsd2ss(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
|
| - } else {
|
| - __ cvtsd2ss(i.OutputDoubleRegister(), i.InputOperand(0));
|
| - }
|
| + case kSSEFloat64ToFloat32:
|
| + ASSEMBLE_SSE_UNOP(cvtsd2ss);
|
| break;
|
| case kSSEFloat64ToInt32:
|
| if (instr->InputAt(0)->IsDoubleRegister()) {
|
| @@ -848,23 +870,59 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| __ movd(i.OutputDoubleRegister(), i.InputOperand(0));
|
| }
|
| break;
|
| + case kAVXFloat32Cmp: {
|
| + CpuFeatureScope avx_scope(masm(), AVX);
|
| + if (instr->InputAt(1)->IsDoubleRegister()) {
|
| + __ vucomiss(i.InputDoubleRegister(0), i.InputDoubleRegister(1));
|
| + } else {
|
| + __ vucomiss(i.InputDoubleRegister(0), i.InputOperand(1));
|
| + }
|
| + break;
|
| + }
|
| + case kAVXFloat32Add:
|
| + ASSEMBLE_AVX_BINOP(vaddss);
|
| + break;
|
| + case kAVXFloat32Sub:
|
| + ASSEMBLE_AVX_BINOP(vsubss);
|
| + break;
|
| + case kAVXFloat32Mul:
|
| + ASSEMBLE_AVX_BINOP(vmulss);
|
| + break;
|
| + case kAVXFloat32Div:
|
| + ASSEMBLE_AVX_BINOP(vdivss);
|
| + break;
|
| + case kAVXFloat32Max:
|
| + ASSEMBLE_AVX_BINOP(vmaxss);
|
| + break;
|
| + case kAVXFloat32Min:
|
| + ASSEMBLE_AVX_BINOP(vminss);
|
| + break;
|
| + case kAVXFloat64Cmp: {
|
| + CpuFeatureScope avx_scope(masm(), AVX);
|
| + if (instr->InputAt(1)->IsDoubleRegister()) {
|
| + __ vucomisd(i.InputDoubleRegister(0), i.InputDoubleRegister(1));
|
| + } else {
|
| + __ vucomisd(i.InputDoubleRegister(0), i.InputOperand(1));
|
| + }
|
| + break;
|
| + }
|
| case kAVXFloat64Add:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vaddsd);
|
| + ASSEMBLE_AVX_BINOP(vaddsd);
|
| break;
|
| case kAVXFloat64Sub:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vsubsd);
|
| + ASSEMBLE_AVX_BINOP(vsubsd);
|
| break;
|
| case kAVXFloat64Mul:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vmulsd);
|
| + ASSEMBLE_AVX_BINOP(vmulsd);
|
| break;
|
| case kAVXFloat64Div:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vdivsd);
|
| + ASSEMBLE_AVX_BINOP(vdivsd);
|
| break;
|
| case kAVXFloat64Max:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vmaxsd);
|
| + ASSEMBLE_AVX_BINOP(vmaxsd);
|
| break;
|
| case kAVXFloat64Min:
|
| - ASSEMBLE_AVX_DOUBLE_BINOP(vminsd);
|
| + ASSEMBLE_AVX_BINOP(vminsd);
|
| break;
|
| case kX64Movsxbl:
|
| ASSEMBLE_MOVX(movsxbl);
|
|
|