| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/code-stub-assembler.h" | 5 #include "src/code-stub-assembler.h" |
| 6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
| 8 #include "src/frames.h" | 8 #include "src/frames.h" |
| 9 #include "src/ic/handler-configuration.h" | 9 #include "src/ic/handler-configuration.h" |
| 10 #include "src/ic/stub-cache.h" | 10 #include "src/ic/stub-cache.h" |
| (...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1863 } | 1863 } |
| 1864 Bind(&done_loop); | 1864 Bind(&done_loop); |
| 1865 return var_result.value(); | 1865 return var_result.value(); |
| 1866 } | 1866 } |
| 1867 | 1867 |
| 1868 Node* CodeStubAssembler::TruncateHeapNumberValueToWord32(Node* object) { | 1868 Node* CodeStubAssembler::TruncateHeapNumberValueToWord32(Node* object) { |
| 1869 Node* value = LoadHeapNumberValue(object); | 1869 Node* value = LoadHeapNumberValue(object); |
| 1870 return TruncateFloat64ToWord32(value); | 1870 return TruncateFloat64ToWord32(value); |
| 1871 } | 1871 } |
| 1872 | 1872 |
| 1873 Node* CodeStubAssembler::ChangeFloat64ToTagged(Node* value, | 1873 Node* CodeStubAssembler::ChangeFloat64ToTagged(Node* value) { |
| 1874 CanonicalizationMode mode) { | 1874 Node* value32 = RoundFloat64ToInt32(value); |
| 1875 switch (mode) { | 1875 Node* value64 = ChangeInt32ToFloat64(value32); |
| 1876 case CanonicalizationMode::kDontCanonicalize: { | |
| 1877 return AllocateHeapNumberWithValue(value); | |
| 1878 } | |
| 1879 case CanonicalizationMode::kCanonicalize: { | |
| 1880 Node* value32 = RoundFloat64ToInt32(value); | |
| 1881 Node* value64 = ChangeInt32ToFloat64(value32); | |
| 1882 | 1876 |
| 1883 Label if_valueisint32(this), if_valueisheapnumber(this), if_join(this); | 1877 Label if_valueisint32(this), if_valueisheapnumber(this), if_join(this); |
| 1884 | 1878 |
| 1885 Label if_valueisequal(this), if_valueisnotequal(this); | 1879 Label if_valueisequal(this), if_valueisnotequal(this); |
| 1886 Branch(Float64Equal(value, value64), &if_valueisequal, | 1880 Branch(Float64Equal(value, value64), &if_valueisequal, &if_valueisnotequal); |
| 1887 &if_valueisnotequal); | 1881 Bind(&if_valueisequal); |
| 1888 Bind(&if_valueisequal); | 1882 { |
| 1883 GotoUnless(Word32Equal(value32, Int32Constant(0)), &if_valueisint32); |
| 1884 BranchIfInt32LessThan(Float64ExtractHighWord32(value), Int32Constant(0), |
| 1885 &if_valueisheapnumber, &if_valueisint32); |
| 1886 } |
| 1887 Bind(&if_valueisnotequal); |
| 1888 Goto(&if_valueisheapnumber); |
| 1889 |
| 1890 Variable var_result(this, MachineRepresentation::kTagged); |
| 1891 Bind(&if_valueisint32); |
| 1892 { |
| 1893 if (Is64()) { |
| 1894 Node* result = SmiTag(ChangeInt32ToInt64(value32)); |
| 1895 var_result.Bind(result); |
| 1896 Goto(&if_join); |
| 1897 } else { |
| 1898 Node* pair = Int32AddWithOverflow(value32, value32); |
| 1899 Node* overflow = Projection(1, pair); |
| 1900 Label if_overflow(this, Label::kDeferred), if_notoverflow(this); |
| 1901 Branch(overflow, &if_overflow, &if_notoverflow); |
| 1902 Bind(&if_overflow); |
| 1903 Goto(&if_valueisheapnumber); |
| 1904 Bind(&if_notoverflow); |
| 1889 { | 1905 { |
| 1890 GotoUnless(Word32Equal(value32, Int32Constant(0)), &if_valueisint32); | 1906 Node* result = Projection(0, pair); |
| 1891 BranchIfInt32LessThan(Float64ExtractHighWord32(value), Int32Constant(0), | |
| 1892 &if_valueisheapnumber, &if_valueisint32); | |
| 1893 } | |
| 1894 Bind(&if_valueisnotequal); | |
| 1895 Goto(&if_valueisheapnumber); | |
| 1896 | |
| 1897 Variable var_result(this, MachineRepresentation::kTagged); | |
| 1898 Bind(&if_valueisint32); | |
| 1899 { | |
| 1900 if (Is64()) { | |
| 1901 Node* result = SmiTag(ChangeInt32ToInt64(value32)); | |
| 1902 var_result.Bind(result); | |
| 1903 Goto(&if_join); | |
| 1904 } else { | |
| 1905 Node* pair = Int32AddWithOverflow(value32, value32); | |
| 1906 Node* overflow = Projection(1, pair); | |
| 1907 Label if_overflow(this, Label::kDeferred), if_notoverflow(this); | |
| 1908 Branch(overflow, &if_overflow, &if_notoverflow); | |
| 1909 Bind(&if_overflow); | |
| 1910 Goto(&if_valueisheapnumber); | |
| 1911 Bind(&if_notoverflow); | |
| 1912 { | |
| 1913 Node* result = Projection(0, pair); | |
| 1914 var_result.Bind(result); | |
| 1915 Goto(&if_join); | |
| 1916 } | |
| 1917 } | |
| 1918 } | |
| 1919 Bind(&if_valueisheapnumber); | |
| 1920 { | |
| 1921 Node* result = AllocateHeapNumberWithValue(value); | |
| 1922 var_result.Bind(result); | 1907 var_result.Bind(result); |
| 1923 Goto(&if_join); | 1908 Goto(&if_join); |
| 1924 } | 1909 } |
| 1925 Bind(&if_join); | |
| 1926 return var_result.value(); | |
| 1927 } | 1910 } |
| 1928 } | 1911 } |
| 1929 UNREACHABLE(); | 1912 Bind(&if_valueisheapnumber); |
| 1930 return nullptr; | 1913 { |
| 1914 Node* result = AllocateHeapNumberWithValue(value); |
| 1915 var_result.Bind(result); |
| 1916 Goto(&if_join); |
| 1917 } |
| 1918 Bind(&if_join); |
| 1919 return var_result.value(); |
| 1931 } | 1920 } |
| 1932 | 1921 |
| 1933 Node* CodeStubAssembler::ChangeInt32ToTagged(Node* value) { | 1922 Node* CodeStubAssembler::ChangeInt32ToTagged(Node* value) { |
| 1934 if (Is64()) { | 1923 if (Is64()) { |
| 1935 return SmiTag(ChangeInt32ToInt64(value)); | 1924 return SmiTag(ChangeInt32ToInt64(value)); |
| 1936 } | 1925 } |
| 1937 Variable var_result(this, MachineRepresentation::kTagged); | 1926 Variable var_result(this, MachineRepresentation::kTagged); |
| 1938 Node* pair = Int32AddWithOverflow(value, value); | 1927 Node* pair = Int32AddWithOverflow(value, value); |
| 1939 Node* overflow = Projection(1, pair); | 1928 Node* overflow = Projection(1, pair); |
| 1940 Label if_overflow(this, Label::kDeferred), if_notoverflow(this), | 1929 Label if_overflow(this, Label::kDeferred), if_notoverflow(this), |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2636 { | 2625 { |
| 2637 // Load the floating-point value of {arg}. | 2626 // Load the floating-point value of {arg}. |
| 2638 Node* arg_value = LoadHeapNumberValue(arg); | 2627 Node* arg_value = LoadHeapNumberValue(arg); |
| 2639 | 2628 |
| 2640 // Check if {arg} is NaN. | 2629 // Check if {arg} is NaN. |
| 2641 GotoUnless(Float64Equal(arg_value, arg_value), &return_zero); | 2630 GotoUnless(Float64Equal(arg_value, arg_value), &return_zero); |
| 2642 | 2631 |
| 2643 // Truncate {arg} towards zero. | 2632 // Truncate {arg} towards zero. |
| 2644 Node* value = Float64Trunc(arg_value); | 2633 Node* value = Float64Trunc(arg_value); |
| 2645 | 2634 |
| 2646 // Perform optional minus zero truncation. | 2635 if (mode == kTruncateMinusZero) { |
| 2647 switch (mode) { | 2636 // Truncate -0.0 to 0. |
| 2648 case kNoTruncation: | 2637 GotoIf(Float64Equal(value, Float64Constant(0.0)), &return_zero); |
| 2649 break; | |
| 2650 case kTruncateMinusZero: { | |
| 2651 // Truncate -0.0 to 0. | |
| 2652 GotoIf(Float64Equal(value, Float64Constant(0.0)), &return_zero); | |
| 2653 break; | |
| 2654 } | |
| 2655 } | 2638 } |
| 2656 | 2639 |
| 2657 // Tag the {value} using Smi canonicalization, i.e. if {value} can be | 2640 var_arg.Bind(ChangeFloat64ToTagged(value)); |
| 2658 // represented as a Smi, then this will produce a Smi. | |
| 2659 var_arg.Bind( | |
| 2660 ChangeFloat64ToTagged(value, CanonicalizationMode::kCanonicalize)); | |
| 2661 Goto(&out); | 2641 Goto(&out); |
| 2662 } | 2642 } |
| 2663 | 2643 |
| 2664 Bind(&if_argisnotheapnumber); | 2644 Bind(&if_argisnotheapnumber); |
| 2665 { | 2645 { |
| 2666 // Need to convert {arg} to a Number first. | 2646 // Need to convert {arg} to a Number first. |
| 2667 Callable callable = CodeFactory::NonNumberToNumber(isolate()); | 2647 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 2668 var_arg.Bind(CallStub(callable, context, arg)); | 2648 var_arg.Bind(CallStub(callable, context, arg)); |
| 2669 Goto(&loop); | 2649 Goto(&loop); |
| 2670 } | 2650 } |
| (...skipping 2657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5328 Heap::kTheHoleValueRootIndex); | 5308 Heap::kTheHoleValueRootIndex); |
| 5329 | 5309 |
| 5330 // Store the WeakCell in the feedback vector. | 5310 // Store the WeakCell in the feedback vector. |
| 5331 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, | 5311 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, |
| 5332 CodeStubAssembler::SMI_PARAMETERS); | 5312 CodeStubAssembler::SMI_PARAMETERS); |
| 5333 return cell; | 5313 return cell; |
| 5334 } | 5314 } |
| 5335 | 5315 |
| 5336 } // namespace internal | 5316 } // namespace internal |
| 5337 } // namespace v8 | 5317 } // namespace v8 |
| OLD | NEW |