Chromium Code Reviews| 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 1450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1461 if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { | 1461 if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { |
| 1462 Float64BinopMatcher mright(m.right().node()); | 1462 Float64BinopMatcher mright(m.right().node()); |
| 1463 Emit(kArmVmlsF64, g.DefineSameAsFirst(node), g.UseRegister(m.left().node()), | 1463 Emit(kArmVmlsF64, g.DefineSameAsFirst(node), g.UseRegister(m.left().node()), |
| 1464 g.UseRegister(mright.left().node()), | 1464 g.UseRegister(mright.left().node()), |
| 1465 g.UseRegister(mright.right().node())); | 1465 g.UseRegister(mright.right().node())); |
| 1466 return; | 1466 return; |
| 1467 } | 1467 } |
| 1468 VisitRRR(this, kArmVsubF64, node); | 1468 VisitRRR(this, kArmVsubF64, node); |
| 1469 } | 1469 } |
| 1470 | 1470 |
| 1471 void InstructionSelector::VisitFloat32Mul(Node* node) { | 1471 void InstructionSelector::VisitFloat32Mul(Node* node) { |
|
titzer
2017/01/30 21:01:25
Can you do the same for these instructions too?
bbudge
2017/01/30 23:42:29
Done.
| |
| 1472 VisitRRR(this, kArmVmulF32, node); | 1472 VisitRRR(this, kArmVmulF32, node); |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 | 1475 |
| 1476 void InstructionSelector::VisitFloat64Mul(Node* node) { | 1476 void InstructionSelector::VisitFloat64Mul(Node* node) { |
| 1477 VisitRRR(this, kArmVmulF64, node); | 1477 VisitRRR(this, kArmVmulF64, node); |
| 1478 } | 1478 } |
| 1479 | 1479 |
| 1480 | 1480 |
| 1481 void InstructionSelector::VisitFloat32Div(Node* node) { | 1481 void InstructionSelector::VisitFloat32Div(Node* node) { |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2279 AddressingMode addressing_mode = kMode_Offset_RR; | 2279 AddressingMode addressing_mode = kMode_Offset_RR; |
| 2280 InstructionOperand inputs[4]; | 2280 InstructionOperand inputs[4]; |
| 2281 size_t input_count = 0; | 2281 size_t input_count = 0; |
| 2282 inputs[input_count++] = g.UseUniqueRegister(base); | 2282 inputs[input_count++] = g.UseUniqueRegister(base); |
| 2283 inputs[input_count++] = g.UseUniqueRegister(index); | 2283 inputs[input_count++] = g.UseUniqueRegister(index); |
| 2284 inputs[input_count++] = g.UseUniqueRegister(value); | 2284 inputs[input_count++] = g.UseUniqueRegister(value); |
| 2285 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); | 2285 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); |
| 2286 Emit(code, 0, nullptr, input_count, inputs); | 2286 Emit(code, 0, nullptr, input_count, inputs); |
| 2287 } | 2287 } |
| 2288 | 2288 |
| 2289 // TODO(bbudge) Macro-ize SIMD methods. | 2289 #define SIMD_TYPE_LIST(V) \ |
| 2290 void InstructionSelector::VisitCreateFloat32x4(Node* node) { | 2290 V(Float32x4) \ |
| 2291 ArmOperandGenerator g(this); | 2291 V(Int32x4) \ |
| 2292 Emit(kArmFloat32x4Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | 2292 V(Int16x8) \ |
| 2293 } | 2293 V(Int8x16) |
| 2294 | 2294 |
| 2295 void InstructionSelector::VisitFloat32x4ExtractLane(Node* node) { | 2295 #define SIMD_UNOP_LIST(V) \ |
| 2296 ArmOperandGenerator g(this); | 2296 V(Float32x4FromInt32x4) \ |
| 2297 int32_t lane = OpParameter<int32_t>(node); | 2297 V(Float32x4FromUint32x4) \ |
| 2298 Emit(kArmFloat32x4ExtractLane, g.DefineAsRegister(node), | 2298 V(Float32x4Abs) \ |
| 2299 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); | 2299 V(Float32x4Neg) \ |
| 2300 } | 2300 V(Int32x4FromFloat32x4) \ |
| 2301 V(Uint32x4FromFloat32x4) \ | |
| 2302 V(Int32x4Neg) \ | |
| 2303 V(Int16x8Neg) \ | |
| 2304 V(Int8x16Neg) | |
| 2301 | 2305 |
| 2302 void InstructionSelector::VisitFloat32x4ReplaceLane(Node* node) { | 2306 #define SIMD_BINOP_LIST(V) \ |
| 2303 ArmOperandGenerator g(this); | 2307 V(Float32x4Add) \ |
| 2304 int32_t lane = OpParameter<int32_t>(node); | 2308 V(Float32x4Sub) \ |
| 2305 Emit(kArmFloat32x4ReplaceLane, g.DefineAsRegister(node), | 2309 V(Float32x4Equal) \ |
| 2306 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), | 2310 V(Float32x4NotEqual) \ |
| 2307 g.Use(node->InputAt(1))); | 2311 V(Int32x4Add) \ |
| 2308 } | 2312 V(Int32x4Sub) \ |
| 2313 V(Int32x4Mul) \ | |
| 2314 V(Int32x4Min) \ | |
| 2315 V(Int32x4Max) \ | |
| 2316 V(Int32x4Equal) \ | |
| 2317 V(Int32x4NotEqual) \ | |
| 2318 V(Int32x4GreaterThan) \ | |
| 2319 V(Int32x4GreaterThanOrEqual) \ | |
| 2320 V(Uint32x4GreaterThan) \ | |
| 2321 V(Uint32x4GreaterThanOrEqual) \ | |
| 2322 V(Int16x8Add) \ | |
| 2323 V(Int16x8Sub) \ | |
| 2324 V(Int16x8Mul) \ | |
| 2325 V(Int16x8Min) \ | |
| 2326 V(Int16x8Max) \ | |
| 2327 V(Int16x8Equal) \ | |
| 2328 V(Int16x8NotEqual) \ | |
| 2329 V(Int16x8GreaterThan) \ | |
| 2330 V(Int16x8GreaterThanOrEqual) \ | |
| 2331 V(Uint16x8GreaterThan) \ | |
| 2332 V(Uint16x8GreaterThanOrEqual) \ | |
| 2333 V(Int8x16Add) \ | |
| 2334 V(Int8x16Sub) \ | |
| 2335 V(Int8x16Mul) \ | |
| 2336 V(Int8x16Min) \ | |
| 2337 V(Int8x16Max) \ | |
| 2338 V(Int8x16Equal) \ | |
| 2339 V(Int8x16NotEqual) \ | |
| 2340 V(Int8x16GreaterThan) \ | |
| 2341 V(Int8x16GreaterThanOrEqual) \ | |
| 2342 V(Uint8x16GreaterThan) \ | |
| 2343 V(Uint8x16GreaterThanOrEqual) | |
| 2309 | 2344 |
| 2310 void InstructionSelector::VisitFloat32x4FromInt32x4(Node* node) { | 2345 #define SIMD_VISIT_SPLAT(Type) \ |
| 2311 ArmOperandGenerator g(this); | 2346 void InstructionSelector::VisitCreate##Type(Node* node) { \ |
|
titzer
2017/01/30 21:01:25
Can you make these macros all call VisitRR or Visi
bbudge
2017/01/30 23:42:29
Done.
| |
| 2312 Emit(kArmFloat32x4FromInt32x4, g.DefineAsRegister(node), | 2347 ArmOperandGenerator g(this); \ |
| 2313 g.UseRegister(node->InputAt(0))); | 2348 Emit(kArm##Type##Splat, g.DefineAsRegister(node), \ |
| 2314 } | 2349 g.UseRegister(node->InputAt(0))); \ |
| 2350 } | |
| 2351 SIMD_TYPE_LIST(SIMD_VISIT_SPLAT) | |
| 2352 #undef SIMD_VISIT_SPLAT | |
| 2315 | 2353 |
| 2316 void InstructionSelector::VisitFloat32x4FromUint32x4(Node* node) { | 2354 #define SIMD_VISIT_EXTRACT_LANE(Type) \ |
| 2317 ArmOperandGenerator g(this); | 2355 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ |
| 2318 Emit(kArmFloat32x4FromUint32x4, g.DefineAsRegister(node), | 2356 ArmOperandGenerator g(this); \ |
| 2319 g.UseRegister(node->InputAt(0))); | 2357 int32_t lane = OpParameter<int32_t>(node); \ |
| 2320 } | 2358 Emit(kArm##Type##ExtractLane, g.DefineAsRegister(node), \ |
| 2359 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); \ | |
| 2360 } | |
| 2361 SIMD_TYPE_LIST(SIMD_VISIT_EXTRACT_LANE) | |
| 2362 #undef SIMD_VISIT_EXTRACT_LANE | |
| 2321 | 2363 |
| 2322 void InstructionSelector::VisitFloat32x4Abs(Node* node) { | 2364 #define SIMD_VISIT_REPLACE_LANE(Type) \ |
| 2323 ArmOperandGenerator g(this); | 2365 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ |
| 2324 Emit(kArmFloat32x4Abs, g.DefineAsRegister(node), | 2366 ArmOperandGenerator g(this); \ |
| 2325 g.UseRegister(node->InputAt(0))); | 2367 int32_t lane = OpParameter<int32_t>(node); \ |
| 2326 } | 2368 Emit(kArm##Type##ReplaceLane, g.DefineAsRegister(node), \ |
| 2369 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), \ | |
| 2370 g.Use(node->InputAt(1))); \ | |
| 2371 } | |
| 2372 SIMD_TYPE_LIST(SIMD_VISIT_REPLACE_LANE) | |
| 2373 #undef SIMD_VISIT_REPLACE_LANE | |
| 2327 | 2374 |
| 2328 void InstructionSelector::VisitFloat32x4Neg(Node* node) { | 2375 #define SIMD_VISIT_UNOP(Name) \ |
| 2329 ArmOperandGenerator g(this); | 2376 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2330 Emit(kArmFloat32x4Neg, g.DefineAsRegister(node), | 2377 ArmOperandGenerator g(this); \ |
| 2331 g.UseRegister(node->InputAt(0))); | 2378 Emit(kArm##Name, g.DefineAsRegister(node), \ |
| 2332 } | 2379 g.UseRegister(node->InputAt(0))); \ |
| 2380 } | |
| 2381 SIMD_UNOP_LIST(SIMD_VISIT_UNOP) | |
| 2382 #undef SIMD_VISIT_UNOP | |
| 2333 | 2383 |
| 2334 void InstructionSelector::VisitFloat32x4Add(Node* node) { | 2384 #define SIMD_VISIT_BINOP(Name) \ |
| 2335 ArmOperandGenerator g(this); | 2385 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2336 Emit(kArmFloat32x4Add, g.DefineAsRegister(node), | 2386 ArmOperandGenerator g(this); \ |
| 2337 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | 2387 Emit(kArm##Name, g.DefineAsRegister(node), \ |
| 2338 } | 2388 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); \ |
| 2339 | 2389 } |
| 2340 void InstructionSelector::VisitFloat32x4Sub(Node* node) { | 2390 SIMD_BINOP_LIST(SIMD_VISIT_BINOP) |
| 2341 ArmOperandGenerator g(this); | 2391 #undef SIMD_VISIT_BINOP |
| 2342 Emit(kArmFloat32x4Sub, g.DefineAsRegister(node), | |
| 2343 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2344 } | |
| 2345 | |
| 2346 void InstructionSelector::VisitFloat32x4Equal(Node* node) { | |
| 2347 ArmOperandGenerator g(this); | |
| 2348 Emit(kArmFloat32x4Eq, g.DefineAsRegister(node), | |
| 2349 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2350 } | |
| 2351 | |
| 2352 void InstructionSelector::VisitFloat32x4NotEqual(Node* node) { | |
| 2353 ArmOperandGenerator g(this); | |
| 2354 Emit(kArmFloat32x4Ne, g.DefineAsRegister(node), | |
| 2355 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2356 } | |
| 2357 | |
| 2358 void InstructionSelector::VisitCreateInt32x4(Node* node) { | |
| 2359 ArmOperandGenerator g(this); | |
| 2360 Emit(kArmInt32x4Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
| 2361 } | |
| 2362 | |
| 2363 void InstructionSelector::VisitInt32x4ExtractLane(Node* node) { | |
| 2364 ArmOperandGenerator g(this); | |
| 2365 int32_t lane = OpParameter<int32_t>(node); | |
| 2366 Emit(kArmInt32x4ExtractLane, g.DefineAsRegister(node), | |
| 2367 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); | |
| 2368 } | |
| 2369 | |
| 2370 void InstructionSelector::VisitInt32x4ReplaceLane(Node* node) { | |
| 2371 ArmOperandGenerator g(this); | |
| 2372 int32_t lane = OpParameter<int32_t>(node); | |
| 2373 Emit(kArmInt32x4ReplaceLane, g.DefineAsRegister(node), | |
| 2374 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), | |
| 2375 g.Use(node->InputAt(1))); | |
| 2376 } | |
| 2377 | |
| 2378 void InstructionSelector::VisitInt32x4FromFloat32x4(Node* node) { | |
| 2379 ArmOperandGenerator g(this); | |
| 2380 Emit(kArmInt32x4FromFloat32x4, g.DefineAsRegister(node), | |
| 2381 g.UseRegister(node->InputAt(0))); | |
| 2382 } | |
| 2383 | |
| 2384 void InstructionSelector::VisitUint32x4FromFloat32x4(Node* node) { | |
| 2385 ArmOperandGenerator g(this); | |
| 2386 Emit(kArmUint32x4FromFloat32x4, g.DefineAsRegister(node), | |
| 2387 g.UseRegister(node->InputAt(0))); | |
| 2388 } | |
| 2389 | |
| 2390 void InstructionSelector::VisitInt32x4Neg(Node* node) { | |
| 2391 ArmOperandGenerator g(this); | |
| 2392 Emit(kArmInt32x4Neg, g.DefineAsRegister(node), | |
| 2393 g.UseRegister(node->InputAt(0))); | |
| 2394 } | |
| 2395 | |
| 2396 void InstructionSelector::VisitInt32x4Add(Node* node) { | |
| 2397 ArmOperandGenerator g(this); | |
| 2398 Emit(kArmInt32x4Add, g.DefineAsRegister(node), | |
| 2399 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2400 } | |
| 2401 | |
| 2402 void InstructionSelector::VisitInt32x4Sub(Node* node) { | |
| 2403 ArmOperandGenerator g(this); | |
| 2404 Emit(kArmInt32x4Sub, g.DefineAsRegister(node), | |
| 2405 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2406 } | |
| 2407 | |
| 2408 void InstructionSelector::VisitInt32x4Mul(Node* node) { | |
| 2409 ArmOperandGenerator g(this); | |
| 2410 Emit(kArmInt32x4Mul, g.DefineAsRegister(node), | |
| 2411 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2412 } | |
| 2413 | |
| 2414 void InstructionSelector::VisitInt32x4Min(Node* node) { | |
| 2415 ArmOperandGenerator g(this); | |
| 2416 Emit(kArmInt32x4Min, g.DefineAsRegister(node), | |
| 2417 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2418 } | |
| 2419 | |
| 2420 void InstructionSelector::VisitInt32x4Max(Node* node) { | |
| 2421 ArmOperandGenerator g(this); | |
| 2422 Emit(kArmInt32x4Max, g.DefineAsRegister(node), | |
| 2423 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2424 } | |
| 2425 | |
| 2426 void InstructionSelector::VisitInt32x4Equal(Node* node) { | |
| 2427 ArmOperandGenerator g(this); | |
| 2428 Emit(kArmInt32x4Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2429 g.UseRegister(node->InputAt(1))); | |
| 2430 } | |
| 2431 | |
| 2432 void InstructionSelector::VisitInt32x4NotEqual(Node* node) { | |
| 2433 ArmOperandGenerator g(this); | |
| 2434 Emit(kArmInt32x4Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2435 g.UseRegister(node->InputAt(1))); | |
| 2436 } | |
| 2437 | |
| 2438 void InstructionSelector::VisitInt32x4GreaterThan(Node* node) { | |
| 2439 ArmOperandGenerator g(this); | |
| 2440 Emit(kArmInt32x4Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2441 g.UseRegister(node->InputAt(1))); | |
| 2442 } | |
| 2443 | |
| 2444 void InstructionSelector::VisitInt32x4GreaterThanOrEqual(Node* node) { | |
| 2445 ArmOperandGenerator g(this); | |
| 2446 Emit(kArmInt32x4Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2447 g.UseRegister(node->InputAt(1))); | |
| 2448 } | |
| 2449 | |
| 2450 void InstructionSelector::VisitUint32x4GreaterThan(Node* node) { | |
| 2451 ArmOperandGenerator g(this); | |
| 2452 Emit(kArmUint32x4Gt, g.DefineAsRegister(node), | |
| 2453 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2454 } | |
| 2455 | |
| 2456 void InstructionSelector::VisitUint32x4GreaterThanOrEqual(Node* node) { | |
| 2457 ArmOperandGenerator g(this); | |
| 2458 Emit(kArmUint32x4Ge, g.DefineAsRegister(node), | |
| 2459 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2460 } | |
| 2461 | 2392 |
| 2462 void InstructionSelector::VisitSimd32x4Select(Node* node) { | 2393 void InstructionSelector::VisitSimd32x4Select(Node* node) { |
| 2463 ArmOperandGenerator g(this); | 2394 ArmOperandGenerator g(this); |
| 2464 Emit(kArmSimd32x4Select, g.DefineAsRegister(node), | 2395 Emit(kArmSimd32x4Select, g.DefineAsRegister(node), |
| 2465 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), | 2396 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1)), |
| 2466 g.UseRegister(node->InputAt(2))); | 2397 g.UseRegister(node->InputAt(2))); |
| 2467 } | 2398 } |
| 2468 | 2399 |
| 2469 void InstructionSelector::VisitCreateInt16x8(Node* node) { | |
| 2470 ArmOperandGenerator g(this); | |
| 2471 Emit(kArmInt16x8Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
| 2472 } | |
| 2473 | |
| 2474 void InstructionSelector::VisitInt16x8ExtractLane(Node* node) { | |
| 2475 ArmOperandGenerator g(this); | |
| 2476 int32_t lane = OpParameter<int32_t>(node); | |
| 2477 Emit(kArmInt16x8ExtractLane, g.DefineAsRegister(node), | |
| 2478 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); | |
| 2479 } | |
| 2480 | |
| 2481 void InstructionSelector::VisitInt16x8ReplaceLane(Node* node) { | |
| 2482 ArmOperandGenerator g(this); | |
| 2483 int32_t lane = OpParameter<int32_t>(node); | |
| 2484 Emit(kArmInt16x8ReplaceLane, g.DefineAsRegister(node), | |
| 2485 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), | |
| 2486 g.Use(node->InputAt(1))); | |
| 2487 } | |
| 2488 | |
| 2489 void InstructionSelector::VisitInt16x8Neg(Node* node) { | |
| 2490 ArmOperandGenerator g(this); | |
| 2491 Emit(kArmInt16x8Neg, g.DefineAsRegister(node), | |
| 2492 g.UseRegister(node->InputAt(0))); | |
| 2493 } | |
| 2494 | |
| 2495 void InstructionSelector::VisitInt16x8Add(Node* node) { | |
| 2496 ArmOperandGenerator g(this); | |
| 2497 Emit(kArmInt16x8Add, g.DefineAsRegister(node), | |
| 2498 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2499 } | |
| 2500 | |
| 2501 void InstructionSelector::VisitInt16x8Sub(Node* node) { | |
| 2502 ArmOperandGenerator g(this); | |
| 2503 Emit(kArmInt16x8Sub, g.DefineAsRegister(node), | |
| 2504 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2505 } | |
| 2506 | |
| 2507 void InstructionSelector::VisitInt16x8Mul(Node* node) { | |
| 2508 ArmOperandGenerator g(this); | |
| 2509 Emit(kArmInt16x8Mul, g.DefineAsRegister(node), | |
| 2510 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2511 } | |
| 2512 | |
| 2513 void InstructionSelector::VisitInt16x8Min(Node* node) { | |
| 2514 ArmOperandGenerator g(this); | |
| 2515 Emit(kArmInt16x8Min, g.DefineAsRegister(node), | |
| 2516 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2517 } | |
| 2518 | |
| 2519 void InstructionSelector::VisitInt16x8Max(Node* node) { | |
| 2520 ArmOperandGenerator g(this); | |
| 2521 Emit(kArmInt16x8Max, g.DefineAsRegister(node), | |
| 2522 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2523 } | |
| 2524 | |
| 2525 void InstructionSelector::VisitInt16x8Equal(Node* node) { | |
| 2526 ArmOperandGenerator g(this); | |
| 2527 Emit(kArmInt16x8Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2528 g.UseRegister(node->InputAt(1))); | |
| 2529 } | |
| 2530 | |
| 2531 void InstructionSelector::VisitInt16x8NotEqual(Node* node) { | |
| 2532 ArmOperandGenerator g(this); | |
| 2533 Emit(kArmInt16x8Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2534 g.UseRegister(node->InputAt(1))); | |
| 2535 } | |
| 2536 | |
| 2537 void InstructionSelector::VisitInt16x8GreaterThan(Node* node) { | |
| 2538 ArmOperandGenerator g(this); | |
| 2539 Emit(kArmInt16x8Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2540 g.UseRegister(node->InputAt(1))); | |
| 2541 } | |
| 2542 | |
| 2543 void InstructionSelector::VisitInt16x8GreaterThanOrEqual(Node* node) { | |
| 2544 ArmOperandGenerator g(this); | |
| 2545 Emit(kArmInt16x8Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2546 g.UseRegister(node->InputAt(1))); | |
| 2547 } | |
| 2548 | |
| 2549 void InstructionSelector::VisitUint16x8GreaterThan(Node* node) { | |
| 2550 ArmOperandGenerator g(this); | |
| 2551 Emit(kArmUint16x8Gt, g.DefineAsRegister(node), | |
| 2552 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2553 } | |
| 2554 | |
| 2555 void InstructionSelector::VisitUint16x8GreaterThanOrEqual(Node* node) { | |
| 2556 ArmOperandGenerator g(this); | |
| 2557 Emit(kArmUint16x8Ge, g.DefineAsRegister(node), | |
| 2558 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2559 } | |
| 2560 | |
| 2561 void InstructionSelector::VisitCreateInt8x16(Node* node) { | |
| 2562 ArmOperandGenerator g(this); | |
| 2563 Emit(kArmInt8x16Splat, g.DefineAsRegister(node), g.Use(node->InputAt(0))); | |
| 2564 } | |
| 2565 | |
| 2566 void InstructionSelector::VisitInt8x16ExtractLane(Node* node) { | |
| 2567 ArmOperandGenerator g(this); | |
| 2568 int32_t lane = OpParameter<int32_t>(node); | |
| 2569 Emit(kArmInt8x16ExtractLane, g.DefineAsRegister(node), | |
| 2570 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane)); | |
| 2571 } | |
| 2572 | |
| 2573 void InstructionSelector::VisitInt8x16ReplaceLane(Node* node) { | |
| 2574 ArmOperandGenerator g(this); | |
| 2575 int32_t lane = OpParameter<int32_t>(node); | |
| 2576 Emit(kArmInt8x16ReplaceLane, g.DefineAsRegister(node), | |
| 2577 g.UseRegister(node->InputAt(0)), g.UseImmediate(lane), | |
| 2578 g.Use(node->InputAt(1))); | |
| 2579 } | |
| 2580 | |
| 2581 void InstructionSelector::VisitInt8x16Neg(Node* node) { | |
| 2582 ArmOperandGenerator g(this); | |
| 2583 Emit(kArmInt8x16Neg, g.DefineAsRegister(node), | |
| 2584 g.UseRegister(node->InputAt(0))); | |
| 2585 } | |
| 2586 | |
| 2587 void InstructionSelector::VisitInt8x16Add(Node* node) { | |
| 2588 ArmOperandGenerator g(this); | |
| 2589 Emit(kArmInt8x16Add, g.DefineAsRegister(node), | |
| 2590 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2591 } | |
| 2592 | |
| 2593 void InstructionSelector::VisitInt8x16Sub(Node* node) { | |
| 2594 ArmOperandGenerator g(this); | |
| 2595 Emit(kArmInt8x16Sub, g.DefineAsRegister(node), | |
| 2596 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2597 } | |
| 2598 | |
| 2599 void InstructionSelector::VisitInt8x16Mul(Node* node) { | |
| 2600 ArmOperandGenerator g(this); | |
| 2601 Emit(kArmInt8x16Mul, g.DefineAsRegister(node), | |
| 2602 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2603 } | |
| 2604 | |
| 2605 void InstructionSelector::VisitInt8x16Min(Node* node) { | |
| 2606 ArmOperandGenerator g(this); | |
| 2607 Emit(kArmInt8x16Min, g.DefineAsRegister(node), | |
| 2608 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2609 } | |
| 2610 | |
| 2611 void InstructionSelector::VisitInt8x16Max(Node* node) { | |
| 2612 ArmOperandGenerator g(this); | |
| 2613 Emit(kArmInt8x16Max, g.DefineAsRegister(node), | |
| 2614 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2615 } | |
| 2616 | |
| 2617 void InstructionSelector::VisitInt8x16Equal(Node* node) { | |
| 2618 ArmOperandGenerator g(this); | |
| 2619 Emit(kArmInt8x16Eq, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2620 g.UseRegister(node->InputAt(1))); | |
| 2621 } | |
| 2622 | |
| 2623 void InstructionSelector::VisitInt8x16NotEqual(Node* node) { | |
| 2624 ArmOperandGenerator g(this); | |
| 2625 Emit(kArmInt8x16Ne, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2626 g.UseRegister(node->InputAt(1))); | |
| 2627 } | |
| 2628 | |
| 2629 void InstructionSelector::VisitInt8x16GreaterThan(Node* node) { | |
| 2630 ArmOperandGenerator g(this); | |
| 2631 Emit(kArmInt8x16Gt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2632 g.UseRegister(node->InputAt(1))); | |
| 2633 } | |
| 2634 | |
| 2635 void InstructionSelector::VisitInt8x16GreaterThanOrEqual(Node* node) { | |
| 2636 ArmOperandGenerator g(this); | |
| 2637 Emit(kArmInt8x16Ge, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | |
| 2638 g.UseRegister(node->InputAt(1))); | |
| 2639 } | |
| 2640 | |
| 2641 void InstructionSelector::VisitUint8x16GreaterThan(Node* node) { | |
| 2642 ArmOperandGenerator g(this); | |
| 2643 Emit(kArmUint8x16Gt, g.DefineAsRegister(node), | |
| 2644 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2645 } | |
| 2646 | |
| 2647 void InstructionSelector::VisitUint8x16GreaterThanOrEqual(Node* node) { | |
| 2648 ArmOperandGenerator g(this); | |
| 2649 Emit(kArmUint8x16Ge, g.DefineAsRegister(node), | |
| 2650 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); | |
| 2651 } | |
| 2652 | |
| 2653 // static | 2400 // static |
| 2654 MachineOperatorBuilder::Flags | 2401 MachineOperatorBuilder::Flags |
| 2655 InstructionSelector::SupportedMachineOperatorFlags() { | 2402 InstructionSelector::SupportedMachineOperatorFlags() { |
| 2656 MachineOperatorBuilder::Flags flags; | 2403 MachineOperatorBuilder::Flags flags; |
| 2657 if (CpuFeatures::IsSupported(SUDIV)) { | 2404 if (CpuFeatures::IsSupported(SUDIV)) { |
| 2658 // The sdiv and udiv instructions correctly return 0 if the divisor is 0, | 2405 // The sdiv and udiv instructions correctly return 0 if the divisor is 0, |
| 2659 // but the fall-back implementation does not. | 2406 // but the fall-back implementation does not. |
| 2660 flags |= MachineOperatorBuilder::kInt32DivIsSafe | | 2407 flags |= MachineOperatorBuilder::kInt32DivIsSafe | |
| 2661 MachineOperatorBuilder::kUint32DivIsSafe; | 2408 MachineOperatorBuilder::kUint32DivIsSafe; |
| 2662 } | 2409 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 2683 Vector<MachineType> req_aligned = Vector<MachineType>::New(2); | 2430 Vector<MachineType> req_aligned = Vector<MachineType>::New(2); |
| 2684 req_aligned[0] = MachineType::Float32(); | 2431 req_aligned[0] = MachineType::Float32(); |
| 2685 req_aligned[1] = MachineType::Float64(); | 2432 req_aligned[1] = MachineType::Float64(); |
| 2686 return MachineOperatorBuilder::AlignmentRequirements:: | 2433 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2687 SomeUnalignedAccessUnsupported(req_aligned, req_aligned); | 2434 SomeUnalignedAccessUnsupported(req_aligned, req_aligned); |
| 2688 } | 2435 } |
| 2689 | 2436 |
| 2690 } // namespace compiler | 2437 } // namespace compiler |
| 2691 } // namespace internal | 2438 } // namespace internal |
| 2692 } // namespace v8 | 2439 } // namespace v8 |
| OLD | NEW |