OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 8941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8952 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); | 8952 __ CompareRoot(rdx, Heap::kUndefinedValueRootIndex); |
8953 __ j(not_equal, &check_for_nan); | 8953 __ j(not_equal, &check_for_nan); |
8954 __ Set(rax, NegativeComparisonResult(cc_)); | 8954 __ Set(rax, NegativeComparisonResult(cc_)); |
8955 __ ret(0); | 8955 __ ret(0); |
8956 __ bind(&check_for_nan); | 8956 __ bind(&check_for_nan); |
8957 } | 8957 } |
8958 | 8958 |
8959 // Test for NaN. Sadly, we can't just compare to Factory::nan_value(), | 8959 // Test for NaN. Sadly, we can't just compare to Factory::nan_value(), |
8960 // so we do the second best thing - test it ourselves. | 8960 // so we do the second best thing - test it ourselves. |
8961 // Note: if cc_ != equal, never_nan_nan_ is not used. | 8961 // Note: if cc_ != equal, never_nan_nan_ is not used. |
8962 __ Set(rax, EQUAL); | 8962 // We cannot set rax to EQUAL until just before return because |
| 8963 // rax must be unchanged on jump to not_identical. |
| 8964 |
8963 if (never_nan_nan_ && (cc_ == equal)) { | 8965 if (never_nan_nan_ && (cc_ == equal)) { |
| 8966 __ Set(rax, EQUAL); |
8964 __ ret(0); | 8967 __ ret(0); |
8965 } else { | 8968 } else { |
8966 Label heap_number; | 8969 Label heap_number; |
8967 // If it's not a heap number, then return equal. | 8970 // If it's not a heap number, then return equal for (in)equality operator. |
8968 __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), | 8971 __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), |
8969 Factory::heap_number_map()); | 8972 Factory::heap_number_map()); |
8970 __ j(equal, &heap_number); | 8973 if (cc_ == equal) { |
8971 __ ret(0); | 8974 __ j(equal, &heap_number); |
| 8975 __ Set(rax, EQUAL); |
| 8976 __ ret(0); |
| 8977 } else { |
| 8978 // Identical objects must still be converted to primitive for < and >. |
| 8979 __ j(not_equal, ¬_identical); |
| 8980 } |
8972 | 8981 |
8973 __ bind(&heap_number); | 8982 __ bind(&heap_number); |
8974 // It is a heap number, so return equal if it's not NaN. | 8983 // It is a heap number, so return equal if it's not NaN. |
8975 // For NaN, return 1 for every condition except greater and | 8984 // For NaN, return 1 for every condition except greater and |
8976 // greater-equal. Return -1 for them, so the comparison yields | 8985 // greater-equal. Return -1 for them, so the comparison yields |
8977 // false for all conditions except not-equal. | 8986 // false for all conditions except not-equal. |
8978 | 8987 __ Set(rax, EQUAL); |
8979 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); | 8988 __ movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); |
8980 __ ucomisd(xmm0, xmm0); | 8989 __ ucomisd(xmm0, xmm0); |
8981 __ setcc(parity_even, rax); | 8990 __ setcc(parity_even, rax); |
8982 // rax is 0 for equal non-NaN heapnumbers, 1 for NaNs. | 8991 // rax is 0 for equal non-NaN heapnumbers, 1 for NaNs. |
8983 if (cc_ == greater_equal || cc_ == greater) { | 8992 if (cc_ == greater_equal || cc_ == greater) { |
8984 __ neg(rax); | 8993 __ neg(rax); |
8985 } | 8994 } |
8986 __ ret(0); | 8995 __ ret(0); |
8987 } | 8996 } |
8988 | 8997 |
(...skipping 2912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11901 } | 11910 } |
11902 | 11911 |
11903 #endif | 11912 #endif |
11904 | 11913 |
11905 | 11914 |
11906 #undef __ | 11915 #undef __ |
11907 | 11916 |
11908 } } // namespace v8::internal | 11917 } } // namespace v8::internal |
11909 | 11918 |
11910 #endif // V8_TARGET_ARCH_X64 | 11919 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |