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

Side by Side Diff: src/compiler/mips64/instruction-selector-mips64.cc

Issue 2391393003: MIPS64: Fix Word32Compare turbofan operator implementation when comparing signed with unsigned oper… (Closed)
Patch Set: Simplify ToSimulateWord32Compare Created 4 years, 2 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 | « no previous file | 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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/base/bits.h" 6 #include "src/base/bits.h"
7 #include "src/compiler/instruction-selector-impl.h" 7 #include "src/compiler/instruction-selector-impl.h"
8 #include "src/compiler/node-matchers.h" 8 #include "src/compiler/node-matchers.h"
9 #include "src/compiler/node-properties.h" 9 #include "src/compiler/node-properties.h"
10 10
(...skipping 1822 matching lines...) Expand 10 before | Expand all | Expand 10 after
1833 default: 1833 default:
1834 VisitCompare(selector, opcode, g.UseRegister(right), 1834 VisitCompare(selector, opcode, g.UseRegister(right),
1835 g.UseRegister(left), cont); 1835 g.UseRegister(left), cont);
1836 } 1836 }
1837 } else { 1837 } else {
1838 VisitCompare(selector, opcode, g.UseRegister(left), g.UseRegister(right), 1838 VisitCompare(selector, opcode, g.UseRegister(left), g.UseRegister(right),
1839 cont); 1839 cont);
1840 } 1840 }
1841 } 1841 }
1842 1842
1843 bool IsNodeUnsigned(Node* n) {
1844 NodeMatcher m(n);
1845
1846 if (m.IsLoad()) {
1847 LoadRepresentation load_rep = LoadRepresentationOf(n->op());
1848 return load_rep.IsUnsigned();
1849 } else if (m.IsUnalignedLoad()) {
1850 UnalignedLoadRepresentation load_rep =
1851 UnalignedLoadRepresentationOf(n->op());
1852 return load_rep.IsUnsigned();
1853 } else {
ahaas 2016/10/13 08:10:54 I think you also have to deal with parameter and p
ivica.bogosavljevic 2016/10/14 08:16:40 Hi Ahaas! I looked at the code: the Phi and Selec
titzer 2016/10/15 10:45:33 Is it possible to add some extra --debug-code chec
1854 return m.IsUint32Div() || m.IsUint32LessThan() ||
1855 m.IsUint32LessThanOrEqual() || m.IsUint32Mod() ||
1856 m.IsUint32MulHigh() || m.IsChangeFloat64ToUint32() ||
1857 m.IsTruncateFloat64ToUint32() || m.IsTruncateFloat32ToUint32();
1858 }
1859 }
1860
1861 // Shared routine for multiple word compare operations.
1862 void VisitSimulateWord32Compare(InstructionSelector* selector, Node* node,
1863 InstructionCode opcode, FlagsContinuation* cont,
1864 bool commutative) {
1865 Mips64OperandGenerator g(selector);
1866 Node* left = node->InputAt(0);
1867 Node* right = node->InputAt(1);
1868 InstructionOperand leftOp = g.TempRegister();
1869 InstructionOperand rightOp = g.TempRegister();
1870
1871 selector->Emit(kMips64Dshl, leftOp, g.UseRegister(left), g.TempImmediate(32));
1872 selector->Emit(kMips64Dshl, rightOp, g.UseRegister(right),
1873 g.TempImmediate(32));
1874
1875 VisitCompare(selector, opcode, leftOp, rightOp, cont);
1876 }
1877
1878 void VisitWord32Compare(InstructionSelector* selector, Node* node,
1879 FlagsContinuation* cont) {
1880 // MIPS64 doesn't support Word32 compare instructions. Instead it relies
1881 // that the values in registers are correctly sign-extended and uses
1882 // Word64 comparison instead. This behavior is correct in most cases,
1883 // but doesn't work when comparing signed with unsigned operands.
1884 // We could simulate Word32 compare in all cases but this would create
1885 // an unnecessary overhead since unsigned integers are rarely used
1886 // in JavaScript.
1887 // The solution proposed here tries to match a comparison of signed
1888 // with unsigned operand, and perform Word32Compare simulation only
1889 // in those cases. Unfortunately, the solution is not complete because
1890 // it might skip cases where Word32 compare simulation is needed, so
1891 // basically it is a hack.
1892 if (IsNodeUnsigned(node->InputAt(0)) != IsNodeUnsigned(node->InputAt(1))) {
1893 VisitSimulateWord32Compare(selector, node, kMips64Cmp, cont, false);
1894 } else {
1895 VisitWordCompare(selector, node, kMips64Cmp, cont, false);
1896 }
1897 }
1898
1843 1899
1844 void VisitWord32Compare(InstructionSelector* selector, Node* node,
1845 FlagsContinuation* cont) {
1846 VisitWordCompare(selector, node, kMips64Cmp, cont, false);
1847 }
1848
1849
1850 void VisitWord64Compare(InstructionSelector* selector, Node* node, 1900 void VisitWord64Compare(InstructionSelector* selector, Node* node,
1851 FlagsContinuation* cont) { 1901 FlagsContinuation* cont) {
1852 VisitWordCompare(selector, node, kMips64Cmp, cont, false); 1902 VisitWordCompare(selector, node, kMips64Cmp, cont, false);
1853 } 1903 }
1854 1904
1855 1905
1856 1906
1857 void EmitWordCompareZero(InstructionSelector* selector, Node* value, 1907 void EmitWordCompareZero(InstructionSelector* selector, Node* value,
1858 FlagsContinuation* cont) { 1908 FlagsContinuation* cont) {
1859 Mips64OperandGenerator g(selector); 1909 Mips64OperandGenerator g(selector);
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
2331 } else { 2381 } else {
2332 DCHECK(kArchVariant == kMips64r2); 2382 DCHECK(kArchVariant == kMips64r2);
2333 return MachineOperatorBuilder::AlignmentRequirements:: 2383 return MachineOperatorBuilder::AlignmentRequirements::
2334 NoUnalignedAccessSupport(); 2384 NoUnalignedAccessSupport();
2335 } 2385 }
2336 } 2386 }
2337 2387
2338 } // namespace compiler 2388 } // namespace compiler
2339 } // namespace internal 2389 } // namespace internal
2340 } // namespace v8 2390 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698