| 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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 77 |
| 78 | 78 |
| 79 namespace { | 79 namespace { |
| 80 | 80 |
| 81 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { | 81 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
| 82 ArmOperandGenerator g(selector); | 82 ArmOperandGenerator g(selector); |
| 83 selector->Emit(opcode, g.DefineAsRegister(node), | 83 selector->Emit(opcode, g.DefineAsRegister(node), |
| 84 g.UseRegister(node->InputAt(0))); | 84 g.UseRegister(node->InputAt(0))); |
| 85 } | 85 } |
| 86 | 86 |
| 87 | |
| 88 void VisitRRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { | 87 void VisitRRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
| 89 ArmOperandGenerator g(selector); | 88 ArmOperandGenerator g(selector); |
| 90 selector->Emit(opcode, g.DefineAsRegister(node), | 89 selector->Emit(opcode, g.DefineAsRegister(node), |
| 91 g.UseRegister(node->InputAt(0)), | 90 g.UseRegister(node->InputAt(0)), |
| 92 g.UseRegister(node->InputAt(1))); | 91 g.UseRegister(node->InputAt(1))); |
| 93 } | 92 } |
| 94 | 93 |
| 95 void VisitRRRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { | 94 void VisitRRRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
| 96 ArmOperandGenerator g(selector); | 95 ArmOperandGenerator g(selector); |
| 96 // Use DefineSameAsFirst for ternary ops that clobber their first input, |
| 97 // e.g. the NEON vbsl instruction. |
| 97 selector->Emit( | 98 selector->Emit( |
| 98 opcode, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), | 99 opcode, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)), |
| 99 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(2))); | 100 g.UseRegister(node->InputAt(1)), g.UseRegister(node->InputAt(2))); |
| 100 } | 101 } |
| 101 | 102 |
| 102 void VisitRRI(InstructionSelector* selector, ArchOpcode opcode, Node* node) { | 103 void VisitRRI(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
| 103 ArmOperandGenerator g(selector); | 104 ArmOperandGenerator g(selector); |
| 104 int32_t imm = OpParameter<int32_t>(node); | 105 int32_t imm = OpParameter<int32_t>(node); |
| 105 selector->Emit(opcode, g.DefineAsRegister(node), | 106 selector->Emit(opcode, g.DefineAsRegister(node), |
| 106 g.UseRegister(node->InputAt(0)), g.UseImmediate(imm)); | 107 g.UseRegister(node->InputAt(0)), g.UseImmediate(imm)); |
| 107 } | 108 } |
| 108 | 109 |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 opcode = load_rep.IsUnsigned() ? kArmLdrh : kArmLdrsh; | 421 opcode = load_rep.IsUnsigned() ? kArmLdrh : kArmLdrsh; |
| 421 break; | 422 break; |
| 422 case MachineRepresentation::kTaggedSigned: // Fall through. | 423 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 423 case MachineRepresentation::kTaggedPointer: // Fall through. | 424 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 424 case MachineRepresentation::kTagged: // Fall through. | 425 case MachineRepresentation::kTagged: // Fall through. |
| 425 case MachineRepresentation::kWord32: | 426 case MachineRepresentation::kWord32: |
| 426 opcode = kArmLdr; | 427 opcode = kArmLdr; |
| 427 break; | 428 break; |
| 428 case MachineRepresentation::kWord64: // Fall through. | 429 case MachineRepresentation::kWord64: // Fall through. |
| 429 case MachineRepresentation::kSimd128: // Fall through. | 430 case MachineRepresentation::kSimd128: // Fall through. |
| 431 case MachineRepresentation::kSimd1x4: // Fall through. |
| 432 case MachineRepresentation::kSimd1x8: // Fall through. |
| 433 case MachineRepresentation::kSimd1x16: // Fall through. |
| 430 case MachineRepresentation::kNone: | 434 case MachineRepresentation::kNone: |
| 431 UNREACHABLE(); | 435 UNREACHABLE(); |
| 432 return; | 436 return; |
| 433 } | 437 } |
| 434 | 438 |
| 435 InstructionOperand output = g.DefineAsRegister(node); | 439 InstructionOperand output = g.DefineAsRegister(node); |
| 436 EmitLoad(this, opcode, &output, base, index); | 440 EmitLoad(this, opcode, &output, base, index); |
| 437 } | 441 } |
| 438 | 442 |
| 439 void InstructionSelector::VisitProtectedLoad(Node* node) { | 443 void InstructionSelector::VisitProtectedLoad(Node* node) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 opcode = kArmStrh; | 509 opcode = kArmStrh; |
| 506 break; | 510 break; |
| 507 case MachineRepresentation::kTaggedSigned: // Fall through. | 511 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 508 case MachineRepresentation::kTaggedPointer: // Fall through. | 512 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 509 case MachineRepresentation::kTagged: // Fall through. | 513 case MachineRepresentation::kTagged: // Fall through. |
| 510 case MachineRepresentation::kWord32: | 514 case MachineRepresentation::kWord32: |
| 511 opcode = kArmStr; | 515 opcode = kArmStr; |
| 512 break; | 516 break; |
| 513 case MachineRepresentation::kWord64: // Fall through. | 517 case MachineRepresentation::kWord64: // Fall through. |
| 514 case MachineRepresentation::kSimd128: // Fall through. | 518 case MachineRepresentation::kSimd128: // Fall through. |
| 519 case MachineRepresentation::kSimd1x4: // Fall through. |
| 520 case MachineRepresentation::kSimd1x8: // Fall through. |
| 521 case MachineRepresentation::kSimd1x16: // Fall through. |
| 515 case MachineRepresentation::kNone: | 522 case MachineRepresentation::kNone: |
| 516 UNREACHABLE(); | 523 UNREACHABLE(); |
| 517 return; | 524 return; |
| 518 } | 525 } |
| 519 | 526 |
| 520 InstructionOperand inputs[4]; | 527 InstructionOperand inputs[4]; |
| 521 size_t input_count = 0; | 528 size_t input_count = 0; |
| 522 inputs[input_count++] = g.UseRegister(value); | 529 inputs[input_count++] = g.UseRegister(value); |
| 523 inputs[input_count++] = g.UseRegister(base); | 530 inputs[input_count++] = g.UseRegister(base); |
| 524 EmitStore(this, opcode, input_count, inputs, index); | 531 EmitStore(this, opcode, input_count, inputs, index); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 break; | 675 break; |
| 669 case MachineRepresentation::kFloat64: | 676 case MachineRepresentation::kFloat64: |
| 670 opcode = kCheckedLoadFloat64; | 677 opcode = kCheckedLoadFloat64; |
| 671 break; | 678 break; |
| 672 case MachineRepresentation::kBit: // Fall through. | 679 case MachineRepresentation::kBit: // Fall through. |
| 673 case MachineRepresentation::kTaggedSigned: // Fall through. | 680 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 674 case MachineRepresentation::kTaggedPointer: // Fall through. | 681 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 675 case MachineRepresentation::kTagged: // Fall through. | 682 case MachineRepresentation::kTagged: // Fall through. |
| 676 case MachineRepresentation::kWord64: // Fall through. | 683 case MachineRepresentation::kWord64: // Fall through. |
| 677 case MachineRepresentation::kSimd128: // Fall through. | 684 case MachineRepresentation::kSimd128: // Fall through. |
| 685 case MachineRepresentation::kSimd1x4: // Fall through. |
| 686 case MachineRepresentation::kSimd1x8: // Fall through. |
| 687 case MachineRepresentation::kSimd1x16: // Fall through. |
| 678 case MachineRepresentation::kNone: | 688 case MachineRepresentation::kNone: |
| 679 UNREACHABLE(); | 689 UNREACHABLE(); |
| 680 return; | 690 return; |
| 681 } | 691 } |
| 682 InstructionOperand offset_operand = g.UseRegister(offset); | 692 InstructionOperand offset_operand = g.UseRegister(offset); |
| 683 InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) | 693 InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) |
| 684 ? g.UseImmediate(length) | 694 ? g.UseImmediate(length) |
| 685 : g.UseRegister(length); | 695 : g.UseRegister(length); |
| 686 Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), | 696 Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), |
| 687 g.DefineAsRegister(node), offset_operand, length_operand, | 697 g.DefineAsRegister(node), offset_operand, length_operand, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 712 break; | 722 break; |
| 713 case MachineRepresentation::kFloat64: | 723 case MachineRepresentation::kFloat64: |
| 714 opcode = kCheckedStoreFloat64; | 724 opcode = kCheckedStoreFloat64; |
| 715 break; | 725 break; |
| 716 case MachineRepresentation::kBit: // Fall through. | 726 case MachineRepresentation::kBit: // Fall through. |
| 717 case MachineRepresentation::kTaggedSigned: // Fall through. | 727 case MachineRepresentation::kTaggedSigned: // Fall through. |
| 718 case MachineRepresentation::kTaggedPointer: // Fall through. | 728 case MachineRepresentation::kTaggedPointer: // Fall through. |
| 719 case MachineRepresentation::kTagged: // Fall through. | 729 case MachineRepresentation::kTagged: // Fall through. |
| 720 case MachineRepresentation::kWord64: // Fall through. | 730 case MachineRepresentation::kWord64: // Fall through. |
| 721 case MachineRepresentation::kSimd128: // Fall through. | 731 case MachineRepresentation::kSimd128: // Fall through. |
| 732 case MachineRepresentation::kSimd1x4: // Fall through. |
| 733 case MachineRepresentation::kSimd1x8: // Fall through. |
| 734 case MachineRepresentation::kSimd1x16: // Fall through. |
| 722 case MachineRepresentation::kNone: | 735 case MachineRepresentation::kNone: |
| 723 UNREACHABLE(); | 736 UNREACHABLE(); |
| 724 return; | 737 return; |
| 725 } | 738 } |
| 726 InstructionOperand offset_operand = g.UseRegister(offset); | 739 InstructionOperand offset_operand = g.UseRegister(offset); |
| 727 InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) | 740 InstructionOperand length_operand = g.CanBeImmediate(length, kArmCmp) |
| 728 ? g.UseImmediate(length) | 741 ? g.UseImmediate(length) |
| 729 : g.UseRegister(length); | 742 : g.UseRegister(length); |
| 730 Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), g.NoOutput(), | 743 Emit(opcode | AddressingModeField::encode(kMode_Offset_RR), g.NoOutput(), |
| 731 offset_operand, length_operand, g.UseRegister(value), | 744 offset_operand, length_operand, g.UseRegister(value), |
| (...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2172 V(Float32x4) \ | 2185 V(Float32x4) \ |
| 2173 V(Int32x4) \ | 2186 V(Int32x4) \ |
| 2174 V(Int16x8) \ | 2187 V(Int16x8) \ |
| 2175 V(Int8x16) | 2188 V(Int8x16) |
| 2176 | 2189 |
| 2177 #define SIMD_FORMAT_LIST(V) \ | 2190 #define SIMD_FORMAT_LIST(V) \ |
| 2178 V(32x4) \ | 2191 V(32x4) \ |
| 2179 V(16x8) \ | 2192 V(16x8) \ |
| 2180 V(8x16) | 2193 V(8x16) |
| 2181 | 2194 |
| 2182 #define SIMD_UNOP_LIST(V) \ | 2195 #define SIMD_UNOP_LIST(V) \ |
| 2183 V(Float32x4FromInt32x4) \ | 2196 V(Float32x4FromInt32x4, kArmFloat32x4FromInt32x4) \ |
| 2184 V(Float32x4FromUint32x4) \ | 2197 V(Float32x4FromUint32x4, kArmFloat32x4FromUint32x4) \ |
| 2185 V(Float32x4Abs) \ | 2198 V(Float32x4Abs, kArmFloat32x4Abs) \ |
| 2186 V(Float32x4Neg) \ | 2199 V(Float32x4Neg, kArmFloat32x4Neg) \ |
| 2187 V(Int32x4FromFloat32x4) \ | 2200 V(Int32x4FromFloat32x4, kArmInt32x4FromFloat32x4) \ |
| 2188 V(Uint32x4FromFloat32x4) \ | 2201 V(Uint32x4FromFloat32x4, kArmUint32x4FromFloat32x4) \ |
| 2189 V(Int32x4Neg) \ | 2202 V(Int32x4Neg, kArmInt32x4Neg) \ |
| 2190 V(Int16x8Neg) \ | 2203 V(Int16x8Neg, kArmInt16x8Neg) \ |
| 2191 V(Int8x16Neg) \ | 2204 V(Int8x16Neg, kArmInt8x16Neg) \ |
| 2192 V(Simd128Not) | 2205 V(Simd128Not, kArmSimd128Not) \ |
| 2206 V(Simd1x4Not, kArmSimd128Not) \ |
| 2207 V(Simd1x4AnyTrue, kArmSimd1x4AnyTrue) \ |
| 2208 V(Simd1x4AllTrue, kArmSimd1x4AllTrue) \ |
| 2209 V(Simd1x8Not, kArmSimd128Not) \ |
| 2210 V(Simd1x8AnyTrue, kArmSimd1x8AnyTrue) \ |
| 2211 V(Simd1x8AllTrue, kArmSimd1x8AllTrue) \ |
| 2212 V(Simd1x16Not, kArmSimd128Not) \ |
| 2213 V(Simd1x16AnyTrue, kArmSimd1x16AnyTrue) \ |
| 2214 V(Simd1x16AllTrue, kArmSimd1x16AllTrue) |
| 2193 | 2215 |
| 2194 #define SIMD_BINOP_LIST(V) \ | 2216 #define SIMD_BINOP_LIST(V) \ |
| 2195 V(Float32x4Add) \ | 2217 V(Float32x4Add, kArmFloat32x4Add) \ |
| 2196 V(Float32x4Sub) \ | 2218 V(Float32x4Sub, kArmFloat32x4Sub) \ |
| 2197 V(Float32x4Equal) \ | 2219 V(Float32x4Equal, kArmFloat32x4Equal) \ |
| 2198 V(Float32x4NotEqual) \ | 2220 V(Float32x4NotEqual, kArmFloat32x4NotEqual) \ |
| 2199 V(Int32x4Add) \ | 2221 V(Int32x4Add, kArmInt32x4Add) \ |
| 2200 V(Int32x4Sub) \ | 2222 V(Int32x4Sub, kArmInt32x4Sub) \ |
| 2201 V(Int32x4Mul) \ | 2223 V(Int32x4Mul, kArmInt32x4Mul) \ |
| 2202 V(Int32x4Min) \ | 2224 V(Int32x4Min, kArmInt32x4Min) \ |
| 2203 V(Int32x4Max) \ | 2225 V(Int32x4Max, kArmInt32x4Max) \ |
| 2204 V(Int32x4Equal) \ | 2226 V(Int32x4Equal, kArmInt32x4Equal) \ |
| 2205 V(Int32x4NotEqual) \ | 2227 V(Int32x4NotEqual, kArmInt32x4NotEqual) \ |
| 2206 V(Int32x4GreaterThan) \ | 2228 V(Int32x4GreaterThan, kArmInt32x4GreaterThan) \ |
| 2207 V(Int32x4GreaterThanOrEqual) \ | 2229 V(Int32x4GreaterThanOrEqual, kArmInt32x4GreaterThanOrEqual) \ |
| 2208 V(Uint32x4Min) \ | 2230 V(Uint32x4Min, kArmUint32x4Min) \ |
| 2209 V(Uint32x4Max) \ | 2231 V(Uint32x4Max, kArmUint32x4Max) \ |
| 2210 V(Uint32x4GreaterThan) \ | 2232 V(Uint32x4GreaterThan, kArmUint32x4GreaterThan) \ |
| 2211 V(Uint32x4GreaterThanOrEqual) \ | 2233 V(Uint32x4GreaterThanOrEqual, kArmUint32x4GreaterThanOrEqual) \ |
| 2212 V(Int16x8Add) \ | 2234 V(Int16x8Add, kArmInt16x8Add) \ |
| 2213 V(Int16x8AddSaturate) \ | 2235 V(Int16x8AddSaturate, kArmInt16x8AddSaturate) \ |
| 2214 V(Int16x8Sub) \ | 2236 V(Int16x8Sub, kArmInt16x8Sub) \ |
| 2215 V(Int16x8SubSaturate) \ | 2237 V(Int16x8SubSaturate, kArmInt16x8SubSaturate) \ |
| 2216 V(Int16x8Mul) \ | 2238 V(Int16x8Mul, kArmInt16x8Mul) \ |
| 2217 V(Int16x8Min) \ | 2239 V(Int16x8Min, kArmInt16x8Min) \ |
| 2218 V(Int16x8Max) \ | 2240 V(Int16x8Max, kArmInt16x8Max) \ |
| 2219 V(Int16x8Equal) \ | 2241 V(Int16x8Equal, kArmInt16x8Equal) \ |
| 2220 V(Int16x8NotEqual) \ | 2242 V(Int16x8NotEqual, kArmInt16x8NotEqual) \ |
| 2221 V(Int16x8GreaterThan) \ | 2243 V(Int16x8GreaterThan, kArmInt16x8GreaterThan) \ |
| 2222 V(Int16x8GreaterThanOrEqual) \ | 2244 V(Int16x8GreaterThanOrEqual, kArmInt16x8GreaterThanOrEqual) \ |
| 2223 V(Uint16x8AddSaturate) \ | 2245 V(Uint16x8AddSaturate, kArmUint16x8AddSaturate) \ |
| 2224 V(Uint16x8SubSaturate) \ | 2246 V(Uint16x8SubSaturate, kArmUint16x8SubSaturate) \ |
| 2225 V(Uint16x8Min) \ | 2247 V(Uint16x8Min, kArmUint16x8Min) \ |
| 2226 V(Uint16x8Max) \ | 2248 V(Uint16x8Max, kArmUint16x8Max) \ |
| 2227 V(Uint16x8GreaterThan) \ | 2249 V(Uint16x8GreaterThan, kArmUint16x8GreaterThan) \ |
| 2228 V(Uint16x8GreaterThanOrEqual) \ | 2250 V(Uint16x8GreaterThanOrEqual, kArmUint16x8GreaterThanOrEqual) \ |
| 2229 V(Int8x16Add) \ | 2251 V(Int8x16Add, kArmInt8x16Add) \ |
| 2230 V(Int8x16AddSaturate) \ | 2252 V(Int8x16AddSaturate, kArmInt8x16AddSaturate) \ |
| 2231 V(Int8x16Sub) \ | 2253 V(Int8x16Sub, kArmInt8x16Sub) \ |
| 2232 V(Int8x16SubSaturate) \ | 2254 V(Int8x16SubSaturate, kArmInt8x16SubSaturate) \ |
| 2233 V(Int8x16Mul) \ | 2255 V(Int8x16Mul, kArmInt8x16Mul) \ |
| 2234 V(Int8x16Min) \ | 2256 V(Int8x16Min, kArmInt8x16Min) \ |
| 2235 V(Int8x16Max) \ | 2257 V(Int8x16Max, kArmInt8x16Max) \ |
| 2236 V(Int8x16Equal) \ | 2258 V(Int8x16Equal, kArmInt8x16Equal) \ |
| 2237 V(Int8x16NotEqual) \ | 2259 V(Int8x16NotEqual, kArmInt8x16NotEqual) \ |
| 2238 V(Int8x16GreaterThan) \ | 2260 V(Int8x16GreaterThan, kArmInt8x16GreaterThan) \ |
| 2239 V(Int8x16GreaterThanOrEqual) \ | 2261 V(Int8x16GreaterThanOrEqual, kArmInt8x16GreaterThanOrEqual) \ |
| 2240 V(Uint8x16AddSaturate) \ | 2262 V(Uint8x16AddSaturate, kArmUint8x16AddSaturate) \ |
| 2241 V(Uint8x16SubSaturate) \ | 2263 V(Uint8x16SubSaturate, kArmUint8x16SubSaturate) \ |
| 2242 V(Uint8x16Min) \ | 2264 V(Uint8x16Min, kArmUint8x16Min) \ |
| 2243 V(Uint8x16Max) \ | 2265 V(Uint8x16Max, kArmUint8x16Max) \ |
| 2244 V(Uint8x16GreaterThan) \ | 2266 V(Uint8x16GreaterThan, kArmUint8x16GreaterThan) \ |
| 2245 V(Uint8x16GreaterThanOrEqual) \ | 2267 V(Uint8x16GreaterThanOrEqual, kArmUint8x16GreaterThanOrEqual) \ |
| 2246 V(Simd128And) \ | 2268 V(Simd128And, kArmSimd128And) \ |
| 2247 V(Simd128Or) \ | 2269 V(Simd128Or, kArmSimd128Or) \ |
| 2248 V(Simd128Xor) | 2270 V(Simd128Xor, kArmSimd128Xor) \ |
| 2271 V(Simd1x4And, kArmSimd128And) \ |
| 2272 V(Simd1x4Or, kArmSimd128Or) \ |
| 2273 V(Simd1x4Xor, kArmSimd128Xor) \ |
| 2274 V(Simd1x8And, kArmSimd128And) \ |
| 2275 V(Simd1x8Or, kArmSimd128Or) \ |
| 2276 V(Simd1x8Xor, kArmSimd128Xor) \ |
| 2277 V(Simd1x16And, kArmSimd128And) \ |
| 2278 V(Simd1x16Or, kArmSimd128Or) \ |
| 2279 V(Simd1x16Xor, kArmSimd128Xor) |
| 2249 | 2280 |
| 2250 #define SIMD_SHIFT_OP_LIST(V) \ | 2281 #define SIMD_SHIFT_OP_LIST(V) \ |
| 2251 V(Int32x4ShiftLeftByScalar) \ | 2282 V(Int32x4ShiftLeftByScalar) \ |
| 2252 V(Int32x4ShiftRightByScalar) \ | 2283 V(Int32x4ShiftRightByScalar) \ |
| 2253 V(Uint32x4ShiftRightByScalar) \ | 2284 V(Uint32x4ShiftRightByScalar) \ |
| 2254 V(Int16x8ShiftLeftByScalar) \ | 2285 V(Int16x8ShiftLeftByScalar) \ |
| 2255 V(Int16x8ShiftRightByScalar) \ | 2286 V(Int16x8ShiftRightByScalar) \ |
| 2256 V(Uint16x8ShiftRightByScalar) \ | 2287 V(Uint16x8ShiftRightByScalar) \ |
| 2257 V(Int8x16ShiftLeftByScalar) \ | 2288 V(Int8x16ShiftLeftByScalar) \ |
| 2258 V(Int8x16ShiftRightByScalar) \ | 2289 V(Int8x16ShiftRightByScalar) \ |
| 2259 V(Uint8x16ShiftRightByScalar) | 2290 V(Uint8x16ShiftRightByScalar) |
| 2260 | 2291 |
| 2292 #define SIMD_BOOL_OP_LIST(V) \ |
| 2293 V(Int32x4AnyTrue) \ |
| 2294 V(Int32x4AllTrue) \ |
| 2295 V(Int16x8AnyTrue) \ |
| 2296 V(Int16x8AllTrue) \ |
| 2297 V(Int8x16AnyTrue) \ |
| 2298 V(Int8x16AllTrue) |
| 2299 |
| 2261 #define SIMD_VISIT_SPLAT(Type) \ | 2300 #define SIMD_VISIT_SPLAT(Type) \ |
| 2262 void InstructionSelector::VisitCreate##Type(Node* node) { \ | 2301 void InstructionSelector::VisitCreate##Type(Node* node) { \ |
| 2263 VisitRR(this, kArm##Type##Splat, node); \ | 2302 VisitRR(this, kArm##Type##Splat, node); \ |
| 2264 } | 2303 } |
| 2265 SIMD_TYPE_LIST(SIMD_VISIT_SPLAT) | 2304 SIMD_TYPE_LIST(SIMD_VISIT_SPLAT) |
| 2266 #undef SIMD_VISIT_SPLAT | 2305 #undef SIMD_VISIT_SPLAT |
| 2267 | 2306 |
| 2268 #define SIMD_VISIT_EXTRACT_LANE(Type) \ | 2307 #define SIMD_VISIT_EXTRACT_LANE(Type) \ |
| 2269 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ | 2308 void InstructionSelector::Visit##Type##ExtractLane(Node* node) { \ |
| 2270 VisitRRI(this, kArm##Type##ExtractLane, node); \ | 2309 VisitRRI(this, kArm##Type##ExtractLane, node); \ |
| 2271 } | 2310 } |
| 2272 SIMD_TYPE_LIST(SIMD_VISIT_EXTRACT_LANE) | 2311 SIMD_TYPE_LIST(SIMD_VISIT_EXTRACT_LANE) |
| 2273 #undef SIMD_VISIT_EXTRACT_LANE | 2312 #undef SIMD_VISIT_EXTRACT_LANE |
| 2274 | 2313 |
| 2275 #define SIMD_VISIT_REPLACE_LANE(Type) \ | 2314 #define SIMD_VISIT_REPLACE_LANE(Type) \ |
| 2276 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ | 2315 void InstructionSelector::Visit##Type##ReplaceLane(Node* node) { \ |
| 2277 VisitRRIR(this, kArm##Type##ReplaceLane, node); \ | 2316 VisitRRIR(this, kArm##Type##ReplaceLane, node); \ |
| 2278 } | 2317 } |
| 2279 SIMD_TYPE_LIST(SIMD_VISIT_REPLACE_LANE) | 2318 SIMD_TYPE_LIST(SIMD_VISIT_REPLACE_LANE) |
| 2280 #undef SIMD_VISIT_REPLACE_LANE | 2319 #undef SIMD_VISIT_REPLACE_LANE |
| 2281 | 2320 |
| 2282 #define SIMD_VISIT_UNOP(Name) \ | 2321 #define SIMD_VISIT_UNOP(Name, instruction) \ |
| 2283 void InstructionSelector::Visit##Name(Node* node) { \ | 2322 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2284 VisitRR(this, kArm##Name, node); \ | 2323 VisitRR(this, instruction, node); \ |
| 2285 } | 2324 } |
| 2286 SIMD_UNOP_LIST(SIMD_VISIT_UNOP) | 2325 SIMD_UNOP_LIST(SIMD_VISIT_UNOP) |
| 2287 #undef SIMD_VISIT_UNOP | 2326 #undef SIMD_VISIT_UNOP |
| 2288 | 2327 |
| 2289 #define SIMD_VISIT_BINOP(Name) \ | 2328 #define SIMD_VISIT_BINOP(Name, instruction) \ |
| 2290 void InstructionSelector::Visit##Name(Node* node) { \ | 2329 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2291 VisitRRR(this, kArm##Name, node); \ | 2330 VisitRRR(this, instruction, node); \ |
| 2292 } | 2331 } |
| 2293 SIMD_BINOP_LIST(SIMD_VISIT_BINOP) | 2332 SIMD_BINOP_LIST(SIMD_VISIT_BINOP) |
| 2294 #undef SIMD_VISIT_BINOP | 2333 #undef SIMD_VISIT_BINOP |
| 2295 | 2334 |
| 2296 #define SIMD_VISIT_SHIFT_OP(Name) \ | 2335 #define SIMD_VISIT_SHIFT_OP(Name) \ |
| 2297 void InstructionSelector::Visit##Name(Node* node) { \ | 2336 void InstructionSelector::Visit##Name(Node* node) { \ |
| 2298 VisitRRI(this, kArm##Name, node); \ | 2337 VisitRRI(this, kArm##Name, node); \ |
| 2299 } | 2338 } |
| 2300 SIMD_SHIFT_OP_LIST(SIMD_VISIT_SHIFT_OP) | 2339 SIMD_SHIFT_OP_LIST(SIMD_VISIT_SHIFT_OP) |
| 2301 #undef SIMD_VISIT_SHIFT_OP | 2340 #undef SIMD_VISIT_SHIFT_OP |
| 2302 | 2341 |
| 2303 #define SIMD_VISIT_SELECT_OP(format) \ | 2342 #define SIMD_VISIT_SELECT_OP(format) \ |
| 2304 void InstructionSelector::VisitSimd##format##Select(Node* node) { \ | 2343 void InstructionSelector::VisitSimd##format##Select(Node* node) { \ |
| 2305 VisitRRRR(this, kArmSimd##format##Select, node); \ | 2344 VisitRRRR(this, kArmSimd128Select, node); \ |
| 2306 } | 2345 } |
| 2307 SIMD_FORMAT_LIST(SIMD_VISIT_SELECT_OP) | 2346 SIMD_FORMAT_LIST(SIMD_VISIT_SELECT_OP) |
| 2308 #undef SIMD_VISIT_SELECT_OP | 2347 #undef SIMD_VISIT_SELECT_OP |
| 2309 | 2348 |
| 2310 // static | 2349 // static |
| 2311 MachineOperatorBuilder::Flags | 2350 MachineOperatorBuilder::Flags |
| 2312 InstructionSelector::SupportedMachineOperatorFlags() { | 2351 InstructionSelector::SupportedMachineOperatorFlags() { |
| 2313 MachineOperatorBuilder::Flags flags; | 2352 MachineOperatorBuilder::Flags flags; |
| 2314 if (CpuFeatures::IsSupported(SUDIV)) { | 2353 if (CpuFeatures::IsSupported(SUDIV)) { |
| 2315 // The sdiv and udiv instructions correctly return 0 if the divisor is 0, | 2354 // The sdiv and udiv instructions correctly return 0 if the divisor is 0, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2340 Vector<MachineType> req_aligned = Vector<MachineType>::New(2); | 2379 Vector<MachineType> req_aligned = Vector<MachineType>::New(2); |
| 2341 req_aligned[0] = MachineType::Float32(); | 2380 req_aligned[0] = MachineType::Float32(); |
| 2342 req_aligned[1] = MachineType::Float64(); | 2381 req_aligned[1] = MachineType::Float64(); |
| 2343 return MachineOperatorBuilder::AlignmentRequirements:: | 2382 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2344 SomeUnalignedAccessUnsupported(req_aligned, req_aligned); | 2383 SomeUnalignedAccessUnsupported(req_aligned, req_aligned); |
| 2345 } | 2384 } |
| 2346 | 2385 |
| 2347 } // namespace compiler | 2386 } // namespace compiler |
| 2348 } // namespace internal | 2387 } // namespace internal |
| 2349 } // namespace v8 | 2388 } // namespace v8 |
| OLD | NEW |