Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(555)

Side by Side Diff: src/crankshaft/mips64/lithium-codegen-mips64.cc

Issue 1876223003: MIPS: Use max_d, min_d in LCodeGen::DoMathMinMax. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased, added 32-bit and NaN checking. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/crankshaft/mips/lithium-codegen-mips.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/crankshaft/mips/lithium-codegen-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698