OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/ia32/assembler-ia32.h" | 10 #include "src/ia32/assembler-ia32.h" |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 __ addss(i.InputDoubleRegister(0), i.InputOperand(1)); | 461 __ addss(i.InputDoubleRegister(0), i.InputOperand(1)); |
462 break; | 462 break; |
463 case kSSEFloat32Sub: | 463 case kSSEFloat32Sub: |
464 __ subss(i.InputDoubleRegister(0), i.InputOperand(1)); | 464 __ subss(i.InputDoubleRegister(0), i.InputOperand(1)); |
465 break; | 465 break; |
466 case kSSEFloat32Mul: | 466 case kSSEFloat32Mul: |
467 __ mulss(i.InputDoubleRegister(0), i.InputOperand(1)); | 467 __ mulss(i.InputDoubleRegister(0), i.InputOperand(1)); |
468 break; | 468 break; |
469 case kSSEFloat32Div: | 469 case kSSEFloat32Div: |
470 __ divss(i.InputDoubleRegister(0), i.InputOperand(1)); | 470 __ divss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 471 // Don't delete this mov. It may improve performance on some CPUs, |
| 472 // when there is a (v)mulss depending on the result. |
| 473 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
471 break; | 474 break; |
472 case kSSEFloat32Max: | 475 case kSSEFloat32Max: |
473 __ maxss(i.InputDoubleRegister(0), i.InputOperand(1)); | 476 __ maxss(i.InputDoubleRegister(0), i.InputOperand(1)); |
474 break; | 477 break; |
475 case kSSEFloat32Min: | 478 case kSSEFloat32Min: |
476 __ minss(i.InputDoubleRegister(0), i.InputOperand(1)); | 479 __ minss(i.InputDoubleRegister(0), i.InputOperand(1)); |
477 break; | 480 break; |
478 case kSSEFloat32Sqrt: | 481 case kSSEFloat32Sqrt: |
479 __ sqrtss(i.OutputDoubleRegister(), i.InputOperand(0)); | 482 __ sqrtss(i.OutputDoubleRegister(), i.InputOperand(0)); |
480 break; | 483 break; |
(...skipping 18 matching lines...) Expand all Loading... |
499 __ addsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 502 __ addsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
500 break; | 503 break; |
501 case kSSEFloat64Sub: | 504 case kSSEFloat64Sub: |
502 __ subsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 505 __ subsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
503 break; | 506 break; |
504 case kSSEFloat64Mul: | 507 case kSSEFloat64Mul: |
505 __ mulsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 508 __ mulsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
506 break; | 509 break; |
507 case kSSEFloat64Div: | 510 case kSSEFloat64Div: |
508 __ divsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 511 __ divsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 512 // Don't delete this mov. It may improve performance on some CPUs, |
| 513 // when there is a (v)mulsd depending on the result. |
| 514 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
509 break; | 515 break; |
510 case kSSEFloat64Max: | 516 case kSSEFloat64Max: |
511 __ maxsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 517 __ maxsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
512 break; | 518 break; |
513 case kSSEFloat64Min: | 519 case kSSEFloat64Min: |
514 __ minsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 520 __ minsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
515 break; | 521 break; |
516 case kSSEFloat64Mod: { | 522 case kSSEFloat64Mod: { |
517 // TODO(dcarney): alignment is wrong. | 523 // TODO(dcarney): alignment is wrong. |
518 __ sub(esp, Immediate(kDoubleSize)); | 524 __ sub(esp, Immediate(kDoubleSize)); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 case kAVXFloat32Mul: { | 628 case kAVXFloat32Mul: { |
623 CpuFeatureScope avx_scope(masm(), AVX); | 629 CpuFeatureScope avx_scope(masm(), AVX); |
624 __ vmulss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 630 __ vmulss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
625 i.InputOperand(1)); | 631 i.InputOperand(1)); |
626 break; | 632 break; |
627 } | 633 } |
628 case kAVXFloat32Div: { | 634 case kAVXFloat32Div: { |
629 CpuFeatureScope avx_scope(masm(), AVX); | 635 CpuFeatureScope avx_scope(masm(), AVX); |
630 __ vdivss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 636 __ vdivss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
631 i.InputOperand(1)); | 637 i.InputOperand(1)); |
| 638 // Don't delete this mov. It may improve performance on some CPUs, |
| 639 // when there is a (v)mulss depending on the result. |
| 640 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
632 break; | 641 break; |
633 } | 642 } |
634 case kAVXFloat32Max: { | 643 case kAVXFloat32Max: { |
635 CpuFeatureScope avx_scope(masm(), AVX); | 644 CpuFeatureScope avx_scope(masm(), AVX); |
636 __ vmaxss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 645 __ vmaxss(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
637 i.InputOperand(1)); | 646 i.InputOperand(1)); |
638 break; | 647 break; |
639 } | 648 } |
640 case kAVXFloat32Min: { | 649 case kAVXFloat32Min: { |
641 CpuFeatureScope avx_scope(masm(), AVX); | 650 CpuFeatureScope avx_scope(masm(), AVX); |
(...skipping 16 matching lines...) Expand all Loading... |
658 case kAVXFloat64Mul: { | 667 case kAVXFloat64Mul: { |
659 CpuFeatureScope avx_scope(masm(), AVX); | 668 CpuFeatureScope avx_scope(masm(), AVX); |
660 __ vmulsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 669 __ vmulsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
661 i.InputOperand(1)); | 670 i.InputOperand(1)); |
662 break; | 671 break; |
663 } | 672 } |
664 case kAVXFloat64Div: { | 673 case kAVXFloat64Div: { |
665 CpuFeatureScope avx_scope(masm(), AVX); | 674 CpuFeatureScope avx_scope(masm(), AVX); |
666 __ vdivsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 675 __ vdivsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
667 i.InputOperand(1)); | 676 i.InputOperand(1)); |
| 677 // Don't delete this mov. It may improve performance on some CPUs, |
| 678 // when there is a (v)mulsd depending on the result. |
| 679 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
668 break; | 680 break; |
669 } | 681 } |
670 case kAVXFloat64Max: { | 682 case kAVXFloat64Max: { |
671 CpuFeatureScope avx_scope(masm(), AVX); | 683 CpuFeatureScope avx_scope(masm(), AVX); |
672 __ vmaxsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 684 __ vmaxsd(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
673 i.InputOperand(1)); | 685 i.InputOperand(1)); |
674 break; | 686 break; |
675 } | 687 } |
676 case kAVXFloat64Min: { | 688 case kAVXFloat64Min: { |
677 CpuFeatureScope avx_scope(masm(), AVX); | 689 CpuFeatureScope avx_scope(masm(), AVX); |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 } | 1484 } |
1473 } | 1485 } |
1474 MarkLazyDeoptSite(); | 1486 MarkLazyDeoptSite(); |
1475 } | 1487 } |
1476 | 1488 |
1477 #undef __ | 1489 #undef __ |
1478 | 1490 |
1479 } // namespace compiler | 1491 } // namespace compiler |
1480 } // namespace internal | 1492 } // namespace internal |
1481 } // namespace v8 | 1493 } // namespace v8 |
OLD | NEW |