OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/crankshaft/mips64/lithium-codegen-mips64.h" | 5 #include "src/crankshaft/mips64/lithium-codegen-mips64.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/crankshaft/hydrogen-osr.h" | 9 #include "src/crankshaft/hydrogen-osr.h" |
10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" | 10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" |
(...skipping 1828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 DeoptimizeIf(al, instr); | 1839 DeoptimizeIf(al, instr); |
1840 __ bind(&no_overflow_label); | 1840 __ bind(&no_overflow_label); |
1841 } | 1841 } |
1842 } | 1842 } |
1843 | 1843 |
1844 | 1844 |
1845 void LCodeGen::DoMathMinMax(LMathMinMax* instr) { | 1845 void LCodeGen::DoMathMinMax(LMathMinMax* instr) { |
1846 LOperand* left = instr->left(); | 1846 LOperand* left = instr->left(); |
1847 LOperand* right = instr->right(); | 1847 LOperand* right = instr->right(); |
1848 HMathMinMax::Operation operation = instr->hydrogen()->operation(); | 1848 HMathMinMax::Operation operation = instr->hydrogen()->operation(); |
1849 Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge; | 1849 Register scratch = scratch1(); |
1850 if (instr->hydrogen()->representation().IsSmiOrInteger32()) { | 1850 if (instr->hydrogen()->representation().IsSmiOrInteger32()) { |
| 1851 Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge; |
1851 Register left_reg = ToRegister(left); | 1852 Register left_reg = ToRegister(left); |
1852 Register right_reg = EmitLoadRegister(right, scratch0()); | 1853 Register right_reg = EmitLoadRegister(right, scratch0()); |
1853 Register result_reg = ToRegister(instr->result()); | 1854 Register result_reg = ToRegister(instr->result()); |
1854 Label return_right, done; | 1855 Label return_right, done; |
1855 Register scratch = scratch1(); | |
1856 __ Slt(scratch, left_reg, Operand(right_reg)); | 1856 __ Slt(scratch, left_reg, Operand(right_reg)); |
1857 if (condition == ge) { | 1857 if (condition == ge) { |
1858 __ Movz(result_reg, left_reg, scratch); | 1858 __ Movz(result_reg, left_reg, scratch); |
1859 __ Movn(result_reg, right_reg, scratch); | 1859 __ Movn(result_reg, right_reg, scratch); |
1860 } else { | 1860 } else { |
1861 DCHECK(condition == le); | 1861 DCHECK(condition == le); |
1862 __ Movn(result_reg, left_reg, scratch); | 1862 __ Movn(result_reg, left_reg, scratch); |
1863 __ Movz(result_reg, right_reg, scratch); | 1863 __ Movz(result_reg, right_reg, scratch); |
1864 } | 1864 } |
1865 } else { | 1865 } else { |
1866 DCHECK(instr->hydrogen()->representation().IsDouble()); | 1866 DCHECK(instr->hydrogen()->representation().IsDouble()); |
1867 FPURegister left_reg = ToDoubleRegister(left); | 1867 FPURegister left_reg = ToDoubleRegister(left); |
1868 FPURegister right_reg = ToDoubleRegister(right); | 1868 FPURegister right_reg = ToDoubleRegister(right); |
1869 FPURegister result_reg = ToDoubleRegister(instr->result()); | 1869 FPURegister result_reg = ToDoubleRegister(instr->result()); |
1870 Label check_nan_left, check_zero, return_left, return_right, done; | 1870 Label nan, done; |
1871 __ BranchF(&check_zero, &check_nan_left, eq, left_reg, right_reg); | 1871 if (operation == HMathMinMax::kMathMax) { |
1872 __ BranchF(&return_left, NULL, condition, left_reg, right_reg); | 1872 __ MaxNaNCheck_d(result_reg, left_reg, right_reg, &nan); |
1873 __ Branch(&return_right); | |
1874 | |
1875 __ bind(&check_zero); | |
1876 // left == right != 0. | |
1877 __ BranchF(&return_left, NULL, ne, left_reg, kDoubleRegZero); | |
1878 // At this point, both left and right are either 0 or -0. | |
1879 if (operation == HMathMinMax::kMathMin) { | |
1880 // The algorithm is: -((-L) + (-R)), which in case of L and R being | |
1881 // different registers is most efficiently expressed as -((-L) - R). | |
1882 __ neg_d(left_reg, left_reg); | |
1883 if (left_reg.is(right_reg)) { | |
1884 __ add_d(result_reg, left_reg, right_reg); | |
1885 } else { | |
1886 __ sub_d(result_reg, left_reg, right_reg); | |
1887 } | |
1888 __ neg_d(result_reg, result_reg); | |
1889 } else { | 1873 } else { |
1890 __ add_d(result_reg, left_reg, right_reg); | 1874 DCHECK(operation == HMathMinMax::kMathMin); |
| 1875 __ MinNaNCheck_d(result_reg, left_reg, right_reg, &nan); |
1891 } | 1876 } |
1892 __ Branch(&done); | 1877 __ Branch(&done); |
1893 | 1878 |
1894 __ bind(&check_nan_left); | 1879 __ bind(&nan); |
1895 // left == NaN. | 1880 __ LoadRoot(scratch, Heap::kNanValueRootIndex); |
1896 __ BranchF(NULL, &return_left, eq, left_reg, left_reg); | 1881 __ ldc1(result_reg, FieldMemOperand(scratch, HeapNumber::kValueOffset)); |
1897 __ bind(&return_right); | |
1898 if (!right_reg.is(result_reg)) { | |
1899 __ mov_d(result_reg, right_reg); | |
1900 } | |
1901 __ Branch(&done); | |
1902 | 1882 |
1903 __ bind(&return_left); | |
1904 if (!left_reg.is(result_reg)) { | |
1905 __ mov_d(result_reg, left_reg); | |
1906 } | |
1907 __ bind(&done); | 1883 __ bind(&done); |
1908 } | 1884 } |
1909 } | 1885 } |
1910 | 1886 |
1911 | 1887 |
1912 void LCodeGen::DoArithmeticD(LArithmeticD* instr) { | 1888 void LCodeGen::DoArithmeticD(LArithmeticD* instr) { |
1913 DoubleRegister left = ToDoubleRegister(instr->left()); | 1889 DoubleRegister left = ToDoubleRegister(instr->left()); |
1914 DoubleRegister right = ToDoubleRegister(instr->right()); | 1890 DoubleRegister right = ToDoubleRegister(instr->right()); |
1915 DoubleRegister result = ToDoubleRegister(instr->result()); | 1891 DoubleRegister result = ToDoubleRegister(instr->result()); |
1916 switch (instr->op()) { | 1892 switch (instr->op()) { |
(...skipping 3847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5764 __ ld(result, FieldMemOperand(scratch, | 5740 __ ld(result, FieldMemOperand(scratch, |
5765 FixedArray::kHeaderSize - kPointerSize)); | 5741 FixedArray::kHeaderSize - kPointerSize)); |
5766 __ bind(deferred->exit()); | 5742 __ bind(deferred->exit()); |
5767 __ bind(&done); | 5743 __ bind(&done); |
5768 } | 5744 } |
5769 | 5745 |
5770 #undef __ | 5746 #undef __ |
5771 | 5747 |
5772 } // namespace internal | 5748 } // namespace internal |
5773 } // namespace v8 | 5749 } // namespace v8 |
OLD | NEW |