OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |