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

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: Unaligned access simulate using load/shift/or and store/shift/and 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
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 1357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 } 1368 }
1369 } 1369 }
1370 } 1370 }
1371 } 1371 }
1372 1372
1373 1373
1374 bool InstructionSelector::IsTailCallAddressImmediate() { return false; } 1374 bool InstructionSelector::IsTailCallAddressImmediate() { return false; }
1375 1375
1376 int InstructionSelector::GetTempsCountForTailCallFromJSFunction() { return 3; } 1376 int InstructionSelector::GetTempsCountForTailCallFromJSFunction() { return 3; }
1377 1377
1378 void InstructionSelector::VisitUnalignedLoad(Node* node) {
1379 UnalignedLoadRepresentation load_rep =
1380 UnalignedLoadRepresentationOf(node->op());
1381 Mips64OperandGenerator g(this);
1382 Node* base = node->InputAt(0);
1383 Node* index = node->InputAt(1);
1384
1385 ArchOpcode opcode = kArchNop;
1386 switch (load_rep.representation()) {
1387 case MachineRepresentation::kFloat32:
1388 opcode = kMips64Ulwc1;
1389 break;
1390 case MachineRepresentation::kFloat64:
1391 opcode = kMips64Uldc1;
1392 break;
1393 case MachineRepresentation::kBit: // Fall through.
1394 case MachineRepresentation::kWord8:
1395 opcode = load_rep.IsUnsigned() ? kMips64Lbu : kMips64Lb;
1396 break;
1397 case MachineRepresentation::kWord16:
1398 opcode = load_rep.IsUnsigned() ? kMips64Ulhu : kMips64Ulh;
1399 break;
1400 case MachineRepresentation::kWord32:
1401 opcode = kMips64Ulw;
1402 break;
1403 case MachineRepresentation::kTagged: // Fall through.
1404 case MachineRepresentation::kWord64:
1405 opcode = kMips64Uld;
1406 break;
1407 case MachineRepresentation::kSimd128: // Fall through.
1408 case MachineRepresentation::kNone:
1409 UNREACHABLE();
1410 return;
1411 }
1412
1413 if (g.CanBeImmediate(index, opcode)) {
1414 Emit(opcode | AddressingModeField::encode(kMode_MRI),
1415 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index));
1416 } else {
1417 InstructionOperand addr_reg = g.TempRegister();
1418 Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg,
1419 g.UseRegister(index), g.UseRegister(base));
1420 // Emit desired load opcode, using temp addr_reg.
1421 Emit(opcode | AddressingModeField::encode(kMode_MRI),
1422 g.DefineAsRegister(node), addr_reg, g.TempImmediate(0));
1423 }
1424 }
1425
1426 void InstructionSelector::VisitUnalignedStore(Node* node) {
1427 Mips64OperandGenerator g(this);
1428 Node* base = node->InputAt(0);
1429 Node* index = node->InputAt(1);
1430 Node* value = node->InputAt(2);
1431
1432 UnalignedStoreRepresentation rep = UnalignedStoreRepresentationOf(node->op());
1433 ArchOpcode opcode = kArchNop;
1434 switch (rep) {
1435 case MachineRepresentation::kFloat32:
1436 opcode = kMips64Uswc1;
1437 break;
1438 case MachineRepresentation::kFloat64:
1439 opcode = kMips64Usdc1;
1440 break;
1441 case MachineRepresentation::kBit: // Fall through.
1442 case MachineRepresentation::kWord8:
1443 opcode = kMips64Sb;
1444 break;
1445 case MachineRepresentation::kWord16:
1446 opcode = kMips64Ush;
1447 break;
1448 case MachineRepresentation::kWord32:
1449 opcode = kMips64Usw;
1450 break;
1451 case MachineRepresentation::kTagged: // Fall through.
1452 case MachineRepresentation::kWord64:
1453 opcode = kMips64Usd;
1454 break;
1455 case MachineRepresentation::kSimd128: // Fall through.
1456 case MachineRepresentation::kNone:
1457 UNREACHABLE();
1458 return;
1459 }
1460
1461 if (g.CanBeImmediate(index, opcode)) {
1462 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
1463 g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value));
1464 } else {
1465 InstructionOperand addr_reg = g.TempRegister();
1466 Emit(kMips64Dadd | AddressingModeField::encode(kMode_None), addr_reg,
1467 g.UseRegister(index), g.UseRegister(base));
1468 // Emit desired store opcode, using temp addr_reg.
1469 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
1470 addr_reg, g.TempImmediate(0), g.UseRegister(value));
1471 }
1472 }
1473
1378 void InstructionSelector::VisitCheckedLoad(Node* node) { 1474 void InstructionSelector::VisitCheckedLoad(Node* node) {
1379 CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op()); 1475 CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op());
1380 Mips64OperandGenerator g(this); 1476 Mips64OperandGenerator g(this);
1381 Node* const buffer = node->InputAt(0); 1477 Node* const buffer = node->InputAt(0);
1382 Node* const offset = node->InputAt(1); 1478 Node* const offset = node->InputAt(1);
1383 Node* const length = node->InputAt(2); 1479 Node* const length = node->InputAt(2);
1384 ArchOpcode opcode = kArchNop; 1480 ArchOpcode opcode = kArchNop;
1385 switch (load_rep.representation()) { 1481 switch (load_rep.representation()) {
1386 case MachineRepresentation::kWord8: 1482 case MachineRepresentation::kWord8:
1387 opcode = load_rep.IsSigned() ? kCheckedLoadInt8 : kCheckedLoadUint8; 1483 opcode = load_rep.IsSigned() ? kCheckedLoadInt8 : kCheckedLoadUint8;
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
1960 Node* left = node->InputAt(0); 2056 Node* left = node->InputAt(0);
1961 Node* right = node->InputAt(1); 2057 Node* right = node->InputAt(1);
1962 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node), 2058 Emit(kMips64Float64InsertHighWord32, g.DefineSameAsFirst(node),
1963 g.UseRegister(left), g.UseRegister(right)); 2059 g.UseRegister(left), g.UseRegister(right));
1964 } 2060 }
1965 2061
1966 2062
1967 // static 2063 // static
1968 MachineOperatorBuilder::Flags 2064 MachineOperatorBuilder::Flags
1969 InstructionSelector::SupportedMachineOperatorFlags() { 2065 InstructionSelector::SupportedMachineOperatorFlags() {
1970 return MachineOperatorBuilder::kWord32Ctz | 2066 MachineOperatorBuilder::Flags flags = MachineOperatorBuilder::kNoFlags;
2067 if (kArchVariant == kMips64r2) {
2068 flags |= MachineOperatorBuilder::kUnalignedLoad |
2069 MachineOperatorBuilder::kUnalignedStore;
2070 }
2071 return flags | MachineOperatorBuilder::kWord32Ctz |
1971 MachineOperatorBuilder::kWord64Ctz | 2072 MachineOperatorBuilder::kWord64Ctz |
1972 MachineOperatorBuilder::kWord32Popcnt | 2073 MachineOperatorBuilder::kWord32Popcnt |
1973 MachineOperatorBuilder::kWord64Popcnt | 2074 MachineOperatorBuilder::kWord64Popcnt |
1974 MachineOperatorBuilder::kWord32ShiftIsSafe | 2075 MachineOperatorBuilder::kWord32ShiftIsSafe |
1975 MachineOperatorBuilder::kInt32DivIsSafe | 2076 MachineOperatorBuilder::kInt32DivIsSafe |
1976 MachineOperatorBuilder::kUint32DivIsSafe | 2077 MachineOperatorBuilder::kUint32DivIsSafe |
1977 MachineOperatorBuilder::kFloat64Min | 2078 MachineOperatorBuilder::kFloat64Min |
1978 MachineOperatorBuilder::kFloat64Max | 2079 MachineOperatorBuilder::kFloat64Max |
1979 MachineOperatorBuilder::kFloat32Min | 2080 MachineOperatorBuilder::kFloat32Min |
1980 MachineOperatorBuilder::kFloat32Max | 2081 MachineOperatorBuilder::kFloat32Max |
1981 MachineOperatorBuilder::kFloat64RoundDown | 2082 MachineOperatorBuilder::kFloat64RoundDown |
1982 MachineOperatorBuilder::kFloat32RoundDown | 2083 MachineOperatorBuilder::kFloat32RoundDown |
1983 MachineOperatorBuilder::kFloat64RoundUp | 2084 MachineOperatorBuilder::kFloat64RoundUp |
1984 MachineOperatorBuilder::kFloat32RoundUp | 2085 MachineOperatorBuilder::kFloat32RoundUp |
1985 MachineOperatorBuilder::kFloat64RoundTruncate | 2086 MachineOperatorBuilder::kFloat64RoundTruncate |
1986 MachineOperatorBuilder::kFloat32RoundTruncate | 2087 MachineOperatorBuilder::kFloat32RoundTruncate |
1987 MachineOperatorBuilder::kFloat64RoundTiesEven | 2088 MachineOperatorBuilder::kFloat64RoundTiesEven |
1988 MachineOperatorBuilder::kFloat32RoundTiesEven; 2089 MachineOperatorBuilder::kFloat32RoundTiesEven;
1989 } 2090 }
1990 2091
1991 } // namespace compiler 2092 } // namespace compiler
1992 } // namespace internal 2093 } // namespace internal
1993 } // namespace v8 2094 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698