| 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/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
| 9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 } | 737 } |
| 738 case kX87Float32Max: { | 738 case kX87Float32Max: { |
| 739 Label check_nan_left, check_zero, return_left, return_right; | 739 Label check_nan_left, check_zero, return_left, return_right; |
| 740 Condition condition = below; | 740 Condition condition = below; |
| 741 __ fstp(0); | 741 __ fstp(0); |
| 742 __ fld_s(MemOperand(esp, kFloatSize)); | 742 __ fld_s(MemOperand(esp, kFloatSize)); |
| 743 __ fld_s(MemOperand(esp, 0)); | 743 __ fld_s(MemOperand(esp, 0)); |
| 744 __ fld(1); | 744 __ fld(1); |
| 745 __ fld(1); | 745 __ fld(1); |
| 746 __ FCmp(); | 746 __ FCmp(); |
| 747 __ j(parity_even, &check_nan_left, Label::kNear); // At least one NaN. | 747 |
| 748 // At least one NaN. |
| 749 // Return the second operands if one of the two operands is NaN |
| 750 __ j(parity_even, &return_right, Label::kNear); |
| 748 __ j(equal, &check_zero, Label::kNear); // left == right. | 751 __ j(equal, &check_zero, Label::kNear); // left == right. |
| 749 __ j(condition, &return_left, Label::kNear); | 752 __ j(condition, &return_left, Label::kNear); |
| 750 __ jmp(&return_right, Label::kNear); | 753 __ jmp(&return_right, Label::kNear); |
| 751 | 754 |
| 752 __ bind(&check_zero); | 755 __ bind(&check_zero); |
| 753 __ fld(0); | 756 __ fld(0); |
| 754 __ fldz(); | 757 __ fldz(); |
| 755 __ FCmp(); | 758 __ FCmp(); |
| 756 __ j(not_equal, &return_left, Label::kNear); // left == right != 0. | 759 __ j(not_equal, &return_left, Label::kNear); // left == right != 0. |
| 757 | 760 |
| 758 __ fadd(1); | 761 __ fadd(1); |
| 759 __ jmp(&return_left, Label::kNear); | 762 __ jmp(&return_left, Label::kNear); |
| 760 | 763 |
| 761 __ bind(&check_nan_left); | |
| 762 __ fld(0); | |
| 763 __ fld(0); | |
| 764 __ FCmp(); // NaN check. | |
| 765 __ j(parity_even, &return_left, Label::kNear); // left == NaN. | |
| 766 | |
| 767 __ bind(&return_right); | 764 __ bind(&return_right); |
| 768 __ fxch(); | 765 __ fxch(); |
| 769 | 766 |
| 770 __ bind(&return_left); | 767 __ bind(&return_left); |
| 771 __ fstp(0); | 768 __ fstp(0); |
| 772 __ lea(esp, Operand(esp, 2 * kFloatSize)); | 769 __ lea(esp, Operand(esp, 2 * kFloatSize)); |
| 773 break; | 770 break; |
| 774 } | 771 } |
| 775 case kX87Float32Min: { | 772 case kX87Float32Min: { |
| 776 Label check_nan_left, check_zero, return_left, return_right; | 773 Label check_nan_left, check_zero, return_left, return_right; |
| 777 Condition condition = above; | 774 Condition condition = above; |
| 778 __ fstp(0); | 775 __ fstp(0); |
| 779 __ fld_s(MemOperand(esp, kFloatSize)); | 776 __ fld_s(MemOperand(esp, kFloatSize)); |
| 780 __ fld_s(MemOperand(esp, 0)); | 777 __ fld_s(MemOperand(esp, 0)); |
| 781 __ fld(1); | 778 __ fld(1); |
| 782 __ fld(1); | 779 __ fld(1); |
| 783 __ FCmp(); | 780 __ FCmp(); |
| 784 __ j(parity_even, &check_nan_left, Label::kNear); // At least one NaN. | 781 // At least one NaN. |
| 782 // Return the second operands if one of the two operands is NaN |
| 783 __ j(parity_even, &return_right, Label::kNear); |
| 785 __ j(equal, &check_zero, Label::kNear); // left == right. | 784 __ j(equal, &check_zero, Label::kNear); // left == right. |
| 786 __ j(condition, &return_left, Label::kNear); | 785 __ j(condition, &return_left, Label::kNear); |
| 787 __ jmp(&return_right, Label::kNear); | 786 __ jmp(&return_right, Label::kNear); |
| 788 | 787 |
| 789 __ bind(&check_zero); | 788 __ bind(&check_zero); |
| 790 __ fld(0); | 789 __ fld(0); |
| 791 __ fldz(); | 790 __ fldz(); |
| 792 __ FCmp(); | 791 __ FCmp(); |
| 793 __ j(not_equal, &return_left, Label::kNear); // left == right != 0. | 792 __ j(not_equal, &return_left, Label::kNear); // left == right != 0. |
| 794 // At this point, both left and right are either 0 or -0. | 793 // At this point, both left and right are either 0 or -0. |
| 795 // Push st0 and st1 to stack, then pop them to temp registers and OR them, | 794 // Push st0 and st1 to stack, then pop them to temp registers and OR them, |
| 796 // load it to left. | 795 // load it to left. |
| 797 __ push(eax); | 796 __ push(eax); |
| 798 __ fld(1); | 797 __ fld(1); |
| 799 __ fld(1); | 798 __ fld(1); |
| 800 __ sub(esp, Immediate(2 * kPointerSize)); | 799 __ sub(esp, Immediate(2 * kPointerSize)); |
| 801 __ fstp_s(MemOperand(esp, 0)); | 800 __ fstp_s(MemOperand(esp, 0)); |
| 802 __ fstp_s(MemOperand(esp, kPointerSize)); | 801 __ fstp_s(MemOperand(esp, kPointerSize)); |
| 803 __ pop(eax); | 802 __ pop(eax); |
| 804 __ xor_(MemOperand(esp, 0), eax); | 803 __ xor_(MemOperand(esp, 0), eax); |
| 805 __ fstp(0); | 804 __ fstp(0); |
| 806 __ fld_s(MemOperand(esp, 0)); | 805 __ fld_s(MemOperand(esp, 0)); |
| 807 __ pop(eax); // restore esp | 806 __ pop(eax); // restore esp |
| 808 __ pop(eax); // restore esp | 807 __ pop(eax); // restore esp |
| 809 __ jmp(&return_left, Label::kNear); | 808 __ jmp(&return_left, Label::kNear); |
| 810 | 809 |
| 811 __ bind(&check_nan_left); | |
| 812 __ fld(0); | |
| 813 __ fld(0); | |
| 814 __ FCmp(); // NaN check. | |
| 815 __ j(parity_even, &return_left, Label::kNear); // left == NaN. | |
| 816 | 810 |
| 817 __ bind(&return_right); | 811 __ bind(&return_right); |
| 818 __ fxch(); | 812 __ fxch(); |
| 819 | 813 |
| 820 __ bind(&return_left); | 814 __ bind(&return_left); |
| 821 __ fstp(0); | 815 __ fstp(0); |
| 822 __ lea(esp, Operand(esp, 2 * kFloatSize)); | 816 __ lea(esp, Operand(esp, 2 * kFloatSize)); |
| 823 break; | 817 break; |
| 824 } | 818 } |
| 825 case kX87Float32Sqrt: { | 819 case kX87Float32Sqrt: { |
| (...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2007 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2001 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
| 2008 __ Nop(padding_size); | 2002 __ Nop(padding_size); |
| 2009 } | 2003 } |
| 2010 } | 2004 } |
| 2011 | 2005 |
| 2012 #undef __ | 2006 #undef __ |
| 2013 | 2007 |
| 2014 } // namespace compiler | 2008 } // namespace compiler |
| 2015 } // namespace internal | 2009 } // namespace internal |
| 2016 } // namespace v8 | 2010 } // namespace v8 |
| OLD | NEW |