[x86] Use AVX in Crankshaft when available.
R=verwaest@chromium.org Committed: https://crrev.com/622be8f71e70b6ece4ea6a89bcfa1bc4be5e70c1 Cr-Commit-Position: refs/heads/master@{#26159} Review URL: https://codereview.chromium.org/860003002 Cr-Commit-Position: refs/heads/master@{#26235}
This commit is contained in:
parent
9e99a6048a
commit
03fbb053b3
@ -1981,19 +1981,43 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
||||
XMMRegister result = ToDoubleRegister(instr->result());
|
||||
switch (instr->op()) {
|
||||
case Token::ADD:
|
||||
__ addsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vaddsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ addsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::SUB:
|
||||
__ subsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vsubsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ subsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::MUL:
|
||||
__ mulsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vmulsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ mulsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::DIV:
|
||||
__ divsd(left, right);
|
||||
// Don't delete this mov. It may improve performance on some CPUs,
|
||||
// when there is a mulsd depending on the result
|
||||
__ movaps(left, left);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vdivsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ divsd(left, right);
|
||||
// Don't delete this mov. It may improve performance on some CPUs,
|
||||
// when there is a mulsd depending on the result
|
||||
__ movaps(left, left);
|
||||
}
|
||||
break;
|
||||
case Token::MOD: {
|
||||
// Pass two doubles as arguments on the stack.
|
||||
|
@ -765,7 +765,8 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
|
||||
LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
|
||||
LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
|
||||
LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
|
||||
return DefineSameAsFirst(result);
|
||||
return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result)
|
||||
: DefineSameAsFirst(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2002,23 +2002,45 @@ void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
||||
XMMRegister left = ToDoubleRegister(instr->left());
|
||||
XMMRegister right = ToDoubleRegister(instr->right());
|
||||
XMMRegister result = ToDoubleRegister(instr->result());
|
||||
// All operations except MOD are computed in-place.
|
||||
DCHECK(instr->op() == Token::MOD || left.is(result));
|
||||
switch (instr->op()) {
|
||||
case Token::ADD:
|
||||
__ addsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vaddsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ addsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::SUB:
|
||||
__ subsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vsubsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ subsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::MUL:
|
||||
__ mulsd(left, right);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vmulsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ mulsd(left, right);
|
||||
}
|
||||
break;
|
||||
case Token::DIV:
|
||||
__ divsd(left, right);
|
||||
// Don't delete this mov. It may improve performance on some CPUs,
|
||||
// when there is a mulsd depending on the result
|
||||
__ movaps(left, left);
|
||||
if (CpuFeatures::IsSupported(AVX)) {
|
||||
CpuFeatureScope scope(masm(), AVX);
|
||||
__ vdivsd(result, left, right);
|
||||
} else {
|
||||
DCHECK(result.is(left));
|
||||
__ divsd(left, right);
|
||||
// Don't delete this mov. It may improve performance on some CPUs,
|
||||
// when there is a mulsd depending on the result
|
||||
__ movaps(left, left);
|
||||
}
|
||||
break;
|
||||
case Token::MOD: {
|
||||
XMMRegister xmm_scratch = double_scratch0();
|
||||
|
@ -748,7 +748,8 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
|
||||
LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
|
||||
LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
|
||||
LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
|
||||
return DefineSameAsFirst(result);
|
||||
return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result)
|
||||
: DefineSameAsFirst(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user