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

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

Issue 1779713009: Implement optional turbofan UnalignedLoad and UnalignedStore operators (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix review remarks Created 4 years, 9 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
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 1307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 } 1318 }
1319 } 1319 }
1320 } 1320 }
1321 } 1321 }
1322 1322
1323 1323
1324 bool InstructionSelector::IsTailCallAddressImmediate() { return false; } 1324 bool InstructionSelector::IsTailCallAddressImmediate() { return false; }
1325 1325
1326 int InstructionSelector::GetTempsCountForTailCallFromJSFunction() { return 3; } 1326 int InstructionSelector::GetTempsCountForTailCallFromJSFunction() { return 3; }
1327 1327
1328 void InstructionSelector::VisitUnalignedLoad(Node* node) {
1329 UnalignedLoadRepresentation load_rep =
1330 UnalignedLoadRepresentationOf(node->op());
1331 Mips64OperandGenerator g(this);
1332 Node* base = node->InputAt(0);
1333 Node* index = node->InputAt(1);
1334
1335 ArchOpcode opcode = kArchNop;
1336 switch (load_rep.representation()) {
1337 case MachineRepresentation::kFloat32:
1338 opcode = kMips64Ulwc1;
1339 break;
1340 case MachineRepresentation::kFloat64:
1341 opcode = kMips64Uldc1;
1342 break;
1343 case MachineRepresentation::kBit: // Fall through.
1344 case MachineRepresentation::kWord8:
1345 opcode = load_rep.IsUnsigned() ? kMips64Lbu : kMips64Lb;
1346 break;
1347 case MachineRepresentation::kWord16:
1348 opcode = load_rep.IsUnsigned() ? kMips64Ulhu : kMips64Ulh;
1349 break;
1350 case MachineRepresentation::kWord32:
1351 opcode = kMips64Ulw;
1352 break;
1353 case MachineRepresentation::kTagged: // Fall through.
1354 case MachineRepresentation::kWord64:
1355 opcode = kMips64Uld;
1356 break;
1357 case MachineRepresentation::kSimd128: // Fall through.
1358 case MachineRepresentation::kNone:
1359 UNREACHABLE();
1360 return;
1361 }
1362
1363 if (g.CanBeImmediate(index, opcode)) {
1364 Emit(opcode | AddressingModeField::encode(kMode_MRI),
1365 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index));
1366 } else {
1367 InstructionOperand addr_reg = g.TempRegister();
1368 Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg,
1369 g.UseRegister(index), g.UseRegister(base));
1370 // Emit desired load opcode, using temp addr_reg.
1371 Emit(opcode | AddressingModeField::encode(kMode_MRI),
1372 g.DefineAsRegister(node), addr_reg, g.TempImmediate(0));
1373 }
1374 }
1375
1376 void InstructionSelector::VisitUnalignedStore(Node* node) {
1377 Mips64OperandGenerator g(this);
1378 Node* base = node->InputAt(0);
1379 Node* index = node->InputAt(1);
1380 Node* value = node->InputAt(2);
1381
1382 UnalignedStoreRepresentation rep = UnalignedStoreRepresentationOf(node->op());
1383 ArchOpcode opcode = kArchNop;
1384 switch (rep) {
1385 case MachineRepresentation::kFloat32:
1386 opcode = kMips64Uswc1;
1387 break;
1388 case MachineRepresentation::kFloat64:
1389 opcode = kMips64Usdc1;
1390 break;
1391 case MachineRepresentation::kBit: // Fall through.
1392 case MachineRepresentation::kWord8:
1393 opcode = kMips64Sb;
1394 break;
1395 case MachineRepresentation::kWord16:
1396 opcode = kMips64Ush;
1397 break;
1398 case MachineRepresentation::kWord32:
1399 opcode = kMips64Usw;
1400 break;
1401 case MachineRepresentation::kTagged: // Fall through.
1402 case MachineRepresentation::kWord64:
1403 opcode = kMips64Usd;
1404 break;
1405 case MachineRepresentation::kSimd128: // Fall through.
1406 case MachineRepresentation::kNone:
1407 UNREACHABLE();
1408 return;
1409 }
1410
1411 if (g.CanBeImmediate(index, opcode)) {
1412 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
1413 g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value));
1414 } else {
1415 InstructionOperand addr_reg = g.TempRegister();
1416 Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg,
1417 g.UseRegister(index), g.UseRegister(base));
1418 // Emit desired store opcode, using temp addr_reg.
1419 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
1420 addr_reg, g.TempImmediate(0), g.UseRegister(value));
1421 }
1422 }
1423
1328 void InstructionSelector::VisitCheckedLoad(Node* node) { 1424 void InstructionSelector::VisitCheckedLoad(Node* node) {
1329 CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op()); 1425 CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op());
1330 Mips64OperandGenerator g(this); 1426 Mips64OperandGenerator g(this);
1331 Node* const buffer = node->InputAt(0); 1427 Node* const buffer = node->InputAt(0);
1332 Node* const offset = node->InputAt(1); 1428 Node* const offset = node->InputAt(1);
1333 Node* const length = node->InputAt(2); 1429 Node* const length = node->InputAt(2);
1334 ArchOpcode opcode = kArchNop; 1430 ArchOpcode opcode = kArchNop;
1335 switch (load_rep.representation()) { 1431 switch (load_rep.representation()) {
1336 case MachineRepresentation::kWord8: 1432 case MachineRepresentation::kWord8:
1337 opcode = load_rep.IsSigned() ? kCheckedLoadInt8 : kCheckedLoadUint8; 1433 opcode = load_rep.IsSigned() ? kCheckedLoadInt8 : kCheckedLoadUint8;
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
1910 Node* left = node->InputAt(0); 2006 Node* left = node->InputAt(0);
1911 Node* right = node->InputAt(1); 2007 Node* right = node->InputAt(1);
1912 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node), 2008 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node),
1913 g.UseRegister(left), g.UseRegister(right)); 2009 g.UseRegister(left), g.UseRegister(right));
1914 } 2010 }
1915 2011
1916 2012
1917 // static 2013 // static
1918 MachineOperatorBuilder::Flags 2014 MachineOperatorBuilder::Flags
1919 InstructionSelector::SupportedMachineOperatorFlags() { 2015 InstructionSelector::SupportedMachineOperatorFlags() {
1920 return MachineOperatorBuilder::kWord32Ctz | 2016 MachineOperatorBuilder::Flags flags = MachineOperatorBuilder::kNoFlags;
2017 if (kArchVariant == kMips64r2) {
2018 flags |= MachineOperatorBuilder::kUnalignedLoad |
2019 MachineOperatorBuilder::kUnalignedStore;
2020 }
2021 return flags | MachineOperatorBuilder::kWord32Ctz |
1921 MachineOperatorBuilder::kWord64Ctz | 2022 MachineOperatorBuilder::kWord64Ctz |
1922 MachineOperatorBuilder::kWord32Popcnt | 2023 MachineOperatorBuilder::kWord32Popcnt |
1923 MachineOperatorBuilder::kWord64Popcnt | 2024 MachineOperatorBuilder::kWord64Popcnt |
1924 MachineOperatorBuilder::kWord32ShiftIsSafe | 2025 MachineOperatorBuilder::kWord32ShiftIsSafe |
1925 MachineOperatorBuilder::kInt32DivIsSafe | 2026 MachineOperatorBuilder::kInt32DivIsSafe |
1926 MachineOperatorBuilder::kUint32DivIsSafe | 2027 MachineOperatorBuilder::kUint32DivIsSafe |
1927 MachineOperatorBuilder::kFloat64Min | 2028 MachineOperatorBuilder::kFloat64Min |
1928 MachineOperatorBuilder::kFloat64Max | 2029 MachineOperatorBuilder::kFloat64Max |
1929 MachineOperatorBuilder::kFloat32Min | 2030 MachineOperatorBuilder::kFloat32Min |
1930 MachineOperatorBuilder::kFloat32Max | 2031 MachineOperatorBuilder::kFloat32Max |
1931 MachineOperatorBuilder::kFloat64RoundDown | 2032 MachineOperatorBuilder::kFloat64RoundDown |
1932 MachineOperatorBuilder::kFloat32RoundDown | 2033 MachineOperatorBuilder::kFloat32RoundDown |
1933 MachineOperatorBuilder::kFloat64RoundUp | 2034 MachineOperatorBuilder::kFloat64RoundUp |
1934 MachineOperatorBuilder::kFloat32RoundUp | 2035 MachineOperatorBuilder::kFloat32RoundUp |
1935 MachineOperatorBuilder::kFloat64RoundTruncate | 2036 MachineOperatorBuilder::kFloat64RoundTruncate |
1936 MachineOperatorBuilder::kFloat32RoundTruncate | 2037 MachineOperatorBuilder::kFloat32RoundTruncate |
1937 MachineOperatorBuilder::kFloat64RoundTiesEven | 2038 MachineOperatorBuilder::kFloat64RoundTiesEven |
1938 MachineOperatorBuilder::kFloat32RoundTiesEven; 2039 MachineOperatorBuilder::kFloat32RoundTiesEven;
1939 } 2040 }
1940 2041
1941 } // namespace compiler 2042 } // namespace compiler
1942 } // namespace internal 2043 } // namespace internal
1943 } // namespace v8 2044 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698