| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 8e1f65c771800d5e501d0e8989dc9af8b9741ca2..ffe1a5291000382daced4ccefc326de2dbe9a8a8 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -2015,23 +2015,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();
|
|
|