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/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 // Fall through. | 655 // Fall through. |
656 case kUnsignedLessThanOrEqual: | 656 case kUnsignedLessThanOrEqual: |
657 __ j(below_equal, tlabel); | 657 __ j(below_equal, tlabel); |
658 break; | 658 break; |
659 case kUnorderedGreaterThan: | 659 case kUnorderedGreaterThan: |
660 __ j(parity_even, tlabel); | 660 __ j(parity_even, tlabel); |
661 // Fall through. | 661 // Fall through. |
662 case kUnsignedGreaterThan: | 662 case kUnsignedGreaterThan: |
663 __ j(above, tlabel); | 663 __ j(above, tlabel); |
664 break; | 664 break; |
| 665 case kOverflow: |
| 666 __ j(overflow, tlabel); |
| 667 break; |
| 668 case kNotOverflow: |
| 669 __ j(no_overflow, tlabel); |
| 670 break; |
665 } | 671 } |
666 if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. | 672 if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. |
667 __ bind(&done); | 673 __ bind(&done); |
668 } | 674 } |
669 | 675 |
670 | 676 |
671 // Assembles boolean materializations after this instruction. | 677 // Assembles boolean materializations after this instruction. |
672 void CodeGenerator::AssembleArchBoolean(Instruction* instr, | 678 void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
673 FlagsCondition condition) { | 679 FlagsCondition condition) { |
674 X64OperandConverter i(this, instr); | 680 X64OperandConverter i(this, instr); |
675 Label done; | 681 Label done; |
676 | 682 |
677 // Materialize a full 32-bit 1 or 0 value. | 683 // Materialize a full 64-bit 1 or 0 value. The result register is always the |
| 684 // last output of the instruction. |
678 Label check; | 685 Label check; |
679 Register reg = i.OutputRegister(); | 686 ASSERT_NE(0, instr->OutputCount()); |
| 687 Register reg = i.OutputRegister(instr->OutputCount() - 1); |
680 Condition cc = no_condition; | 688 Condition cc = no_condition; |
681 switch (condition) { | 689 switch (condition) { |
682 case kUnorderedEqual: | 690 case kUnorderedEqual: |
683 __ j(parity_odd, &check, Label::kNear); | 691 __ j(parity_odd, &check, Label::kNear); |
684 __ movl(reg, Immediate(0)); | 692 __ movl(reg, Immediate(0)); |
685 __ jmp(&done, Label::kNear); | 693 __ jmp(&done, Label::kNear); |
686 // Fall through. | 694 // Fall through. |
687 case kEqual: | 695 case kEqual: |
688 cc = equal; | 696 cc = equal; |
689 break; | 697 break; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 cc = below_equal; | 740 cc = below_equal; |
733 break; | 741 break; |
734 case kUnorderedGreaterThan: | 742 case kUnorderedGreaterThan: |
735 __ j(parity_odd, &check, Label::kNear); | 743 __ j(parity_odd, &check, Label::kNear); |
736 __ movl(reg, Immediate(1)); | 744 __ movl(reg, Immediate(1)); |
737 __ jmp(&done, Label::kNear); | 745 __ jmp(&done, Label::kNear); |
738 // Fall through. | 746 // Fall through. |
739 case kUnsignedGreaterThan: | 747 case kUnsignedGreaterThan: |
740 cc = above; | 748 cc = above; |
741 break; | 749 break; |
| 750 case kOverflow: |
| 751 cc = overflow; |
| 752 break; |
| 753 case kNotOverflow: |
| 754 cc = no_overflow; |
| 755 break; |
742 } | 756 } |
743 __ bind(&check); | 757 __ bind(&check); |
744 __ setcc(cc, reg); | 758 __ setcc(cc, reg); |
745 __ movzxbl(reg, reg); | 759 __ movzxbl(reg, reg); |
746 __ bind(&done); | 760 __ bind(&done); |
747 } | 761 } |
748 | 762 |
749 | 763 |
750 void CodeGenerator::AssemblePrologue() { | 764 void CodeGenerator::AssemblePrologue() { |
751 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 765 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 return false; | 988 return false; |
975 } | 989 } |
976 return *(code->instruction_start() + start_pc) == | 990 return *(code->instruction_start() + start_pc) == |
977 v8::internal::Assembler::kNopByte; | 991 v8::internal::Assembler::kNopByte; |
978 } | 992 } |
979 | 993 |
980 #endif | 994 #endif |
981 } | 995 } |
982 } | 996 } |
983 } // namespace v8::internal::compiler | 997 } // namespace v8::internal::compiler |
OLD | NEW |