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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 case MachineRepresentation::kTaggedSigned: // Fall through. | 291 case MachineRepresentation::kTaggedSigned: // Fall through. |
292 case MachineRepresentation::kTaggedPointer: // Fall through. | 292 case MachineRepresentation::kTaggedPointer: // Fall through. |
293 case MachineRepresentation::kTagged: // Fall through. | 293 case MachineRepresentation::kTagged: // Fall through. |
294 case MachineRepresentation::kWord32: | 294 case MachineRepresentation::kWord32: |
295 opcode = kMipsLw; | 295 opcode = kMipsLw; |
296 break; | 296 break; |
297 case MachineRepresentation::kSimd128: | 297 case MachineRepresentation::kSimd128: |
298 opcode = kMipsMsaLd; | 298 opcode = kMipsMsaLd; |
299 break; | 299 break; |
300 case MachineRepresentation::kWord64: // Fall through. | 300 case MachineRepresentation::kWord64: // Fall through. |
301 case MachineRepresentation::kSimd1x4: // Fall through. | |
302 case MachineRepresentation::kSimd1x8: // Fall through. | |
303 case MachineRepresentation::kSimd1x16: // Fall through. | |
304 case MachineRepresentation::kNone: | 301 case MachineRepresentation::kNone: |
305 UNREACHABLE(); | 302 UNREACHABLE(); |
306 return; | 303 return; |
307 } | 304 } |
308 | 305 |
309 if (g.CanBeImmediate(index, opcode)) { | 306 if (g.CanBeImmediate(index, opcode)) { |
310 Emit(opcode | AddressingModeField::encode(kMode_MRI), | 307 Emit(opcode | AddressingModeField::encode(kMode_MRI), |
311 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); | 308 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); |
312 } else { | 309 } else { |
313 InstructionOperand addr_reg = g.TempRegister(); | 310 InstructionOperand addr_reg = g.TempRegister(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 case MachineRepresentation::kTaggedSigned: // Fall through. | 378 case MachineRepresentation::kTaggedSigned: // Fall through. |
382 case MachineRepresentation::kTaggedPointer: // Fall through. | 379 case MachineRepresentation::kTaggedPointer: // Fall through. |
383 case MachineRepresentation::kTagged: // Fall through. | 380 case MachineRepresentation::kTagged: // Fall through. |
384 case MachineRepresentation::kWord32: | 381 case MachineRepresentation::kWord32: |
385 opcode = kMipsSw; | 382 opcode = kMipsSw; |
386 break; | 383 break; |
387 case MachineRepresentation::kSimd128: | 384 case MachineRepresentation::kSimd128: |
388 opcode = kMipsMsaSt; | 385 opcode = kMipsMsaSt; |
389 break; | 386 break; |
390 case MachineRepresentation::kWord64: // Fall through. | 387 case MachineRepresentation::kWord64: // Fall through. |
391 case MachineRepresentation::kSimd1x4: // Fall through. | |
392 case MachineRepresentation::kSimd1x8: // Fall through. | |
393 case MachineRepresentation::kSimd1x16: // Fall through. | |
394 case MachineRepresentation::kNone: | 388 case MachineRepresentation::kNone: |
395 UNREACHABLE(); | 389 UNREACHABLE(); |
396 return; | 390 return; |
397 } | 391 } |
398 | 392 |
399 if (g.CanBeImmediate(index, opcode)) { | 393 if (g.CanBeImmediate(index, opcode)) { |
400 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), | 394 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), |
401 g.UseRegister(base), g.UseImmediate(index), | 395 g.UseRegister(base), g.UseImmediate(index), |
402 g.UseRegisterOrImmediateZero(value)); | 396 g.UseRegisterOrImmediateZero(value)); |
403 } else { | 397 } else { |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 case MachineRepresentation::kFloat32: | 1229 case MachineRepresentation::kFloat32: |
1236 opcode = kMipsUlwc1; | 1230 opcode = kMipsUlwc1; |
1237 break; | 1231 break; |
1238 case MachineRepresentation::kFloat64: | 1232 case MachineRepresentation::kFloat64: |
1239 opcode = kMipsUldc1; | 1233 opcode = kMipsUldc1; |
1240 break; | 1234 break; |
1241 case MachineRepresentation::kSimd128: | 1235 case MachineRepresentation::kSimd128: |
1242 opcode = kMipsMsaLd; | 1236 opcode = kMipsMsaLd; |
1243 break; | 1237 break; |
1244 case MachineRepresentation::kWord64: // Fall through. | 1238 case MachineRepresentation::kWord64: // Fall through. |
1245 case MachineRepresentation::kSimd1x4: // Fall through. | |
1246 case MachineRepresentation::kSimd1x8: // Fall through. | |
1247 case MachineRepresentation::kSimd1x16: // Fall through. | |
1248 case MachineRepresentation::kNone: | 1239 case MachineRepresentation::kNone: |
1249 UNREACHABLE(); | 1240 UNREACHABLE(); |
1250 return; | 1241 return; |
1251 } | 1242 } |
1252 | 1243 |
1253 if (g.CanBeImmediate(index, opcode)) { | 1244 if (g.CanBeImmediate(index, opcode)) { |
1254 Emit(opcode | AddressingModeField::encode(kMode_MRI), | 1245 Emit(opcode | AddressingModeField::encode(kMode_MRI), |
1255 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); | 1246 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); |
1256 } else { | 1247 } else { |
1257 InstructionOperand addr_reg = g.TempRegister(); | 1248 InstructionOperand addr_reg = g.TempRegister(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 case MachineRepresentation::kTaggedSigned: // Fall through. | 1281 case MachineRepresentation::kTaggedSigned: // Fall through. |
1291 case MachineRepresentation::kTaggedPointer: // Fall through. | 1282 case MachineRepresentation::kTaggedPointer: // Fall through. |
1292 case MachineRepresentation::kTagged: // Fall through. | 1283 case MachineRepresentation::kTagged: // Fall through. |
1293 case MachineRepresentation::kWord32: | 1284 case MachineRepresentation::kWord32: |
1294 opcode = kMipsUsw; | 1285 opcode = kMipsUsw; |
1295 break; | 1286 break; |
1296 case MachineRepresentation::kSimd128: | 1287 case MachineRepresentation::kSimd128: |
1297 opcode = kMipsMsaSt; | 1288 opcode = kMipsMsaSt; |
1298 break; | 1289 break; |
1299 case MachineRepresentation::kWord64: // Fall through. | 1290 case MachineRepresentation::kWord64: // Fall through. |
1300 case MachineRepresentation::kSimd1x4: // Fall through. | |
1301 case MachineRepresentation::kSimd1x8: // Fall through. | |
1302 case MachineRepresentation::kSimd1x16: // Fall through. | |
1303 case MachineRepresentation::kNone: | 1291 case MachineRepresentation::kNone: |
1304 UNREACHABLE(); | 1292 UNREACHABLE(); |
1305 return; | 1293 return; |
1306 } | 1294 } |
1307 | 1295 |
1308 if (g.CanBeImmediate(index, opcode)) { | 1296 if (g.CanBeImmediate(index, opcode)) { |
1309 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), | 1297 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), |
1310 g.UseRegister(base), g.UseImmediate(index), | 1298 g.UseRegister(base), g.UseImmediate(index), |
1311 g.UseRegisterOrImmediateZero(value)); | 1299 g.UseRegisterOrImmediateZero(value)); |
1312 } else { | 1300 } else { |
(...skipping 28 matching lines...) Expand all Loading... |
1341 break; | 1329 break; |
1342 case MachineRepresentation::kFloat64: | 1330 case MachineRepresentation::kFloat64: |
1343 opcode = kCheckedLoadFloat64; | 1331 opcode = kCheckedLoadFloat64; |
1344 break; | 1332 break; |
1345 case MachineRepresentation::kBit: // Fall through. | 1333 case MachineRepresentation::kBit: // Fall through. |
1346 case MachineRepresentation::kTaggedSigned: // Fall through. | 1334 case MachineRepresentation::kTaggedSigned: // Fall through. |
1347 case MachineRepresentation::kTaggedPointer: // Fall through. | 1335 case MachineRepresentation::kTaggedPointer: // Fall through. |
1348 case MachineRepresentation::kTagged: // Fall through. | 1336 case MachineRepresentation::kTagged: // Fall through. |
1349 case MachineRepresentation::kWord64: // Fall through. | 1337 case MachineRepresentation::kWord64: // Fall through. |
1350 case MachineRepresentation::kSimd128: // Fall through. | 1338 case MachineRepresentation::kSimd128: // Fall through. |
1351 case MachineRepresentation::kSimd1x4: // Fall through. | |
1352 case MachineRepresentation::kSimd1x8: // Fall through. | |
1353 case MachineRepresentation::kSimd1x16: // Fall through. | |
1354 case MachineRepresentation::kNone: | 1339 case MachineRepresentation::kNone: |
1355 UNREACHABLE(); | 1340 UNREACHABLE(); |
1356 return; | 1341 return; |
1357 } | 1342 } |
1358 InstructionOperand offset_operand = g.CanBeImmediate(offset, opcode) | 1343 InstructionOperand offset_operand = g.CanBeImmediate(offset, opcode) |
1359 ? g.UseImmediate(offset) | 1344 ? g.UseImmediate(offset) |
1360 : g.UseRegister(offset); | 1345 : g.UseRegister(offset); |
1361 | 1346 |
1362 InstructionOperand length_operand = (!g.CanBeImmediate(offset, opcode)) | 1347 InstructionOperand length_operand = (!g.CanBeImmediate(offset, opcode)) |
1363 ? g.CanBeImmediate(length, opcode) | 1348 ? g.CanBeImmediate(length, opcode) |
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1953 V(F32x4) \ | 1938 V(F32x4) \ |
1954 V(I32x4) \ | 1939 V(I32x4) \ |
1955 V(I16x8) \ | 1940 V(I16x8) \ |
1956 V(I8x16) | 1941 V(I8x16) |
1957 | 1942 |
1958 #define SIMD_FORMAT_LIST(V) \ | 1943 #define SIMD_FORMAT_LIST(V) \ |
1959 V(32x4) \ | 1944 V(32x4) \ |
1960 V(16x8) \ | 1945 V(16x8) \ |
1961 V(8x16) | 1946 V(8x16) |
1962 | 1947 |
1963 #define SIMD_ZERO_OP_LIST(V) \ | |
1964 V(S128Zero) \ | |
1965 V(S1x4Zero) \ | |
1966 V(S1x8Zero) \ | |
1967 V(S1x16Zero) | |
1968 | |
1969 #define SIMD_UNOP_LIST(V) \ | 1948 #define SIMD_UNOP_LIST(V) \ |
1970 V(F32x4SConvertI32x4, kMipsF32x4SConvertI32x4) \ | 1949 V(F32x4SConvertI32x4, kMipsF32x4SConvertI32x4) \ |
1971 V(F32x4UConvertI32x4, kMipsF32x4UConvertI32x4) \ | 1950 V(F32x4UConvertI32x4, kMipsF32x4UConvertI32x4) \ |
1972 V(F32x4Abs, kMipsF32x4Abs) \ | 1951 V(F32x4Abs, kMipsF32x4Abs) \ |
1973 V(F32x4Neg, kMipsF32x4Neg) \ | 1952 V(F32x4Neg, kMipsF32x4Neg) \ |
1974 V(F32x4RecipApprox, kMipsF32x4RecipApprox) \ | 1953 V(F32x4RecipApprox, kMipsF32x4RecipApprox) \ |
1975 V(F32x4RecipSqrtApprox, kMipsF32x4RecipSqrtApprox) \ | 1954 V(F32x4RecipSqrtApprox, kMipsF32x4RecipSqrtApprox) \ |
1976 V(I32x4SConvertF32x4, kMipsI32x4SConvertF32x4) \ | 1955 V(I32x4SConvertF32x4, kMipsI32x4SConvertF32x4) \ |
1977 V(I32x4UConvertF32x4, kMipsI32x4UConvertF32x4) \ | 1956 V(I32x4UConvertF32x4, kMipsI32x4UConvertF32x4) \ |
1978 V(I32x4Neg, kMipsI32x4Neg) \ | 1957 V(I32x4Neg, kMipsI32x4Neg) \ |
1979 V(I16x8Neg, kMipsI16x8Neg) \ | 1958 V(I16x8Neg, kMipsI16x8Neg) \ |
1980 V(I8x16Neg, kMipsI8x16Neg) \ | 1959 V(I8x16Neg, kMipsI8x16Neg) \ |
1981 V(S128Not, kMipsS128Not) \ | 1960 V(S128Not, kMipsS128Not) \ |
1982 V(S1x4Not, kMipsS128Not) \ | |
1983 V(S1x4AnyTrue, kMipsS1x4AnyTrue) \ | 1961 V(S1x4AnyTrue, kMipsS1x4AnyTrue) \ |
1984 V(S1x4AllTrue, kMipsS1x4AllTrue) \ | 1962 V(S1x4AllTrue, kMipsS1x4AllTrue) \ |
1985 V(S1x8Not, kMipsS128Not) \ | |
1986 V(S1x8AnyTrue, kMipsS1x8AnyTrue) \ | 1963 V(S1x8AnyTrue, kMipsS1x8AnyTrue) \ |
1987 V(S1x8AllTrue, kMipsS1x8AllTrue) \ | 1964 V(S1x8AllTrue, kMipsS1x8AllTrue) \ |
1988 V(S1x16Not, kMipsS128Not) \ | |
1989 V(S1x16AnyTrue, kMipsS1x16AnyTrue) \ | 1965 V(S1x16AnyTrue, kMipsS1x16AnyTrue) \ |
1990 V(S1x16AllTrue, kMipsS1x16AllTrue) | 1966 V(S1x16AllTrue, kMipsS1x16AllTrue) |
1991 | 1967 |
1992 #define SIMD_SHIFT_OP_LIST(V) \ | 1968 #define SIMD_SHIFT_OP_LIST(V) \ |
1993 V(I32x4Shl) \ | 1969 V(I32x4Shl) \ |
1994 V(I32x4ShrS) \ | 1970 V(I32x4ShrS) \ |
1995 V(I32x4ShrU) \ | 1971 V(I32x4ShrU) \ |
1996 V(I16x8Shl) \ | 1972 V(I16x8Shl) \ |
1997 V(I16x8ShrS) \ | 1973 V(I16x8ShrS) \ |
1998 V(I16x8ShrU) \ | 1974 V(I16x8ShrU) \ |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 V(I8x16MaxU, kMipsI8x16MaxU) \ | 2028 V(I8x16MaxU, kMipsI8x16MaxU) \ |
2053 V(I8x16MinU, kMipsI8x16MinU) \ | 2029 V(I8x16MinU, kMipsI8x16MinU) \ |
2054 V(I8x16Eq, kMipsI8x16Eq) \ | 2030 V(I8x16Eq, kMipsI8x16Eq) \ |
2055 V(I8x16Ne, kMipsI8x16Ne) \ | 2031 V(I8x16Ne, kMipsI8x16Ne) \ |
2056 V(I8x16GtS, kMipsI8x16GtS) \ | 2032 V(I8x16GtS, kMipsI8x16GtS) \ |
2057 V(I8x16GeS, kMipsI8x16GeS) \ | 2033 V(I8x16GeS, kMipsI8x16GeS) \ |
2058 V(I8x16GtU, kMipsI8x16GtU) \ | 2034 V(I8x16GtU, kMipsI8x16GtU) \ |
2059 V(I8x16GeU, kMipsI8x16GeU) \ | 2035 V(I8x16GeU, kMipsI8x16GeU) \ |
2060 V(S128And, kMipsS128And) \ | 2036 V(S128And, kMipsS128And) \ |
2061 V(S128Or, kMipsS128Or) \ | 2037 V(S128Or, kMipsS128Or) \ |
2062 V(S128Xor, kMipsS128Xor) \ | 2038 V(S128Xor, kMipsS128Xor) |
2063 V(S1x4And, kMipsS128And) \ | |
2064 V(S1x4Or, kMipsS128Or) \ | |
2065 V(S1x4Xor, kMipsS128Xor) \ | |
2066 V(S1x8And, kMipsS128And) \ | |
2067 V(S1x8Or, kMipsS128Or) \ | |
2068 V(S1x8Xor, kMipsS128Xor) \ | |
2069 V(S1x16And, kMipsS128And) \ | |
2070 V(S1x16Or, kMipsS128Or) \ | |
2071 V(S1x16Xor, kMipsS128Xor) | |
2072 | 2039 |
2073 #define SIMD_VISIT_ZERO_OP(Name) \ | 2040 void InstructionSelector::VisitS128Zero(Node* node) { |
2074 void InstructionSelector::Visit##Name(Node* node) { \ | 2041 MipsOperandGenerator g(this); |
2075 MipsOperandGenerator g(this); \ | 2042 Emit(kMipsS128Zero, g.DefineSameAsFirst(node)); |
2076 Emit(kMipsS128Zero, g.DefineSameAsFirst(node)); \ | 2043 } |
2077 } | |
2078 SIMD_ZERO_OP_LIST(SIMD_VISIT_ZERO_OP) | |
2079 #undef SIMD_VISIT_ZERO_OP | |
2080 | 2044 |
2081 #define SIMD_VISIT_SPLAT(Type) \ | 2045 #define SIMD_VISIT_SPLAT(Type) \ |
2082 void InstructionSelector::Visit##Type##Splat(Node* node) { \ | 2046 void InstructionSelector::Visit##Type##Splat(Node* node) { \ |
2083 VisitRR(this, kMips##Type##Splat, node); \ | 2047 VisitRR(this, kMips##Type##Splat, node); \ |
2084 } | 2048 } |
2085 SIMD_TYPE_LIST(SIMD_VISIT_SPLAT) | 2049 SIMD_TYPE_LIST(SIMD_VISIT_SPLAT) |
2086 #undef SIMD_VISIT_SPLAT | 2050 #undef SIMD_VISIT_SPLAT |
2087 | 2051 |
2088 #define SIMD_VISIT_EXTRACT_LANE(Type) \ | 2052 #define SIMD_VISIT_EXTRACT_LANE(Type) \ |
2089 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ | 2053 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ |
(...skipping 23 matching lines...) Expand all Loading... |
2113 SIMD_SHIFT_OP_LIST(SIMD_VISIT_SHIFT_OP) | 2077 SIMD_SHIFT_OP_LIST(SIMD_VISIT_SHIFT_OP) |
2114 #undef SIMD_VISIT_SHIFT_OP | 2078 #undef SIMD_VISIT_SHIFT_OP |
2115 | 2079 |
2116 #define SIMD_VISIT_BINOP(Name, instruction) \ | 2080 #define SIMD_VISIT_BINOP(Name, instruction) \ |
2117 void InstructionSelector::Visit##Name(Node* node) { \ | 2081 void InstructionSelector::Visit##Name(Node* node) { \ |
2118 VisitRRR(this, instruction, node); \ | 2082 VisitRRR(this, instruction, node); \ |
2119 } | 2083 } |
2120 SIMD_BINOP_LIST(SIMD_VISIT_BINOP) | 2084 SIMD_BINOP_LIST(SIMD_VISIT_BINOP) |
2121 #undef SIMD_VISIT_BINOP | 2085 #undef SIMD_VISIT_BINOP |
2122 | 2086 |
2123 #define SIMD_VISIT_SELECT_OP(format) \ | 2087 void InstructionSelector::VisitS128Select(Node* node) { |
2124 void InstructionSelector::VisitS##format##Select(Node* node) { \ | 2088 VisitRRRR(this, kMipsS128Select, node); |
2125 VisitRRRR(this, kMipsS##format##Select, node); \ | 2089 } |
2126 } | |
2127 SIMD_FORMAT_LIST(SIMD_VISIT_SELECT_OP) | |
2128 #undef SIMD_VISIT_SELECT_OP | |
2129 | 2090 |
2130 // static | 2091 // static |
2131 MachineOperatorBuilder::Flags | 2092 MachineOperatorBuilder::Flags |
2132 InstructionSelector::SupportedMachineOperatorFlags() { | 2093 InstructionSelector::SupportedMachineOperatorFlags() { |
2133 MachineOperatorBuilder::Flags flags = MachineOperatorBuilder::kNoFlags; | 2094 MachineOperatorBuilder::Flags flags = MachineOperatorBuilder::kNoFlags; |
2134 if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) && | 2095 if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) && |
2135 IsFp64Mode()) { | 2096 IsFp64Mode()) { |
2136 flags |= MachineOperatorBuilder::kFloat64RoundDown | | 2097 flags |= MachineOperatorBuilder::kFloat64RoundDown | |
2137 MachineOperatorBuilder::kFloat64RoundUp | | 2098 MachineOperatorBuilder::kFloat64RoundUp | |
2138 MachineOperatorBuilder::kFloat64RoundTruncate | | 2099 MachineOperatorBuilder::kFloat64RoundTruncate | |
(...skipping 23 matching lines...) Expand all Loading... |
2162 DCHECK(IsMipsArchVariant(kLoongson) || IsMipsArchVariant(kMips32r1) || | 2123 DCHECK(IsMipsArchVariant(kLoongson) || IsMipsArchVariant(kMips32r1) || |
2163 IsMipsArchVariant(kMips32r2)); | 2124 IsMipsArchVariant(kMips32r2)); |
2164 return MachineOperatorBuilder::AlignmentRequirements:: | 2125 return MachineOperatorBuilder::AlignmentRequirements:: |
2165 NoUnalignedAccessSupport(); | 2126 NoUnalignedAccessSupport(); |
2166 } | 2127 } |
2167 } | 2128 } |
2168 | 2129 |
2169 } // namespace compiler | 2130 } // namespace compiler |
2170 } // namespace internal | 2131 } // namespace internal |
2171 } // namespace v8 | 2132 } // namespace v8 |
OLD | NEW |