OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/s390/frames-s390.h" | 9 #include "src/s390/frames-s390.h" |
10 | 10 |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 // return true; | 382 // return true; |
383 // default: | 383 // default: |
384 // return false; | 384 // return false; |
385 // } | 385 // } |
386 // } | 386 // } |
387 case IrOpcode::kLoad: { | 387 case IrOpcode::kLoad: { |
388 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); | 388 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); |
389 switch (load_rep.representation()) { | 389 switch (load_rep.representation()) { |
390 case MachineRepresentation::kWord32: | 390 case MachineRepresentation::kWord32: |
391 return true; | 391 return true; |
| 392 case MachineRepresentation::kWord8: |
| 393 if (load_rep.IsSigned()) |
| 394 return false; |
| 395 else |
| 396 return true; |
392 default: | 397 default: |
393 return false; | 398 return false; |
394 } | 399 } |
395 } | 400 } |
396 default: | 401 default: |
397 return false; | 402 return false; |
398 } | 403 } |
399 #endif | 404 #endif |
400 } | 405 } |
401 | 406 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 | 513 |
509 // Generate The following variations: | 514 // Generate The following variations: |
510 // VisitWord32UnaryOp, VisitWord32BinOp, | 515 // VisitWord32UnaryOp, VisitWord32BinOp, |
511 // VisitWord64UnaryOp, VisitWord64BinOp, | 516 // VisitWord64UnaryOp, VisitWord64BinOp, |
512 // VisitFloat32UnaryOp, VisitFloat32BinOp, | 517 // VisitFloat32UnaryOp, VisitFloat32BinOp, |
513 // VisitFloat64UnaryOp, VisitFloat64BinOp | 518 // VisitFloat64UnaryOp, VisitFloat64BinOp |
514 #define VISIT_OP_LIST_32(V) \ | 519 #define VISIT_OP_LIST_32(V) \ |
515 V(Word32, Unary, [](ArchOpcode opcode) { \ | 520 V(Word32, Unary, [](ArchOpcode opcode) { \ |
516 return opcode == kS390_LoadWordS32 || opcode == kS390_LoadWordU32; \ | 521 return opcode == kS390_LoadWordS32 || opcode == kS390_LoadWordU32; \ |
517 }) \ | 522 }) \ |
| 523 V(Word64, Unary, \ |
| 524 [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) \ |
518 V(Float32, Unary, \ | 525 V(Float32, Unary, \ |
519 [](ArchOpcode opcode) { return opcode == kS390_LoadFloat32; }) \ | 526 [](ArchOpcode opcode) { return opcode == kS390_LoadFloat32; }) \ |
520 V(Float64, Unary, \ | 527 V(Float64, Unary, \ |
521 [](ArchOpcode opcode) { return opcode == kS390_LoadDouble; }) \ | 528 [](ArchOpcode opcode) { return opcode == kS390_LoadDouble; }) \ |
522 V(Word32, Bin, [](ArchOpcode opcode) { \ | 529 V(Word32, Bin, [](ArchOpcode opcode) { \ |
523 return opcode == kS390_LoadWordS32 || opcode == kS390_LoadWordU32; \ | 530 return opcode == kS390_LoadWordS32 || opcode == kS390_LoadWordU32; \ |
524 }) \ | 531 }) \ |
525 V(Float32, Bin, \ | 532 V(Float32, Bin, \ |
526 [](ArchOpcode opcode) { return opcode == kS390_LoadFloat32; }) \ | 533 [](ArchOpcode opcode) { return opcode == kS390_LoadFloat32; }) \ |
527 V(Float64, Bin, [](ArchOpcode opcode) { return opcode == kS390_LoadDouble; }) | 534 V(Float64, Bin, [](ArchOpcode opcode) { return opcode == kS390_LoadDouble; }) |
528 | 535 |
529 #if V8_TARGET_ARCH_S390X | 536 #if V8_TARGET_ARCH_S390X |
530 #define VISIT_OP_LIST(V) \ | 537 #define VISIT_OP_LIST(V) \ |
531 VISIT_OP_LIST_32(V) \ | 538 VISIT_OP_LIST_32(V) \ |
532 V(Word64, Unary, \ | |
533 [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) \ | |
534 V(Word64, Bin, [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) | 539 V(Word64, Bin, [](ArchOpcode opcode) { return opcode == kS390_LoadWord64; }) |
535 #else | 540 #else |
536 #define VISIT_OP_LIST VISIT_OP_LIST_32 | 541 #define VISIT_OP_LIST VISIT_OP_LIST_32 |
537 #endif | 542 #endif |
538 | 543 |
539 #define DECLARE_VISIT_HELPER_FUNCTIONS(type1, type2, canCombineWithLoad) \ | 544 #define DECLARE_VISIT_HELPER_FUNCTIONS(type1, type2, canCombineWithLoad) \ |
540 static inline void Visit##type1##type2##Op( \ | 545 static inline void Visit##type1##type2##Op( \ |
541 InstructionSelector* selector, Node* node, InstructionCode opcode, \ | 546 InstructionSelector* selector, Node* node, InstructionCode opcode, \ |
542 OperandModes operand_mode, FlagsContinuation* cont) { \ | 547 OperandModes operand_mode, FlagsContinuation* cont) { \ |
543 Visit##type2##Op(selector, node, opcode, operand_mode, cont, \ | 548 Visit##type2##Op(selector, node, opcode, operand_mode, cont, \ |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 #if V8_TARGET_ARCH_S390X | 1240 #if V8_TARGET_ARCH_S390X |
1236 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } | 1241 void InstructionSelector::VisitWord64Ctz(Node* node) { UNREACHABLE(); } |
1237 #endif | 1242 #endif |
1238 | 1243 |
1239 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } | 1244 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } |
1240 | 1245 |
1241 #if V8_TARGET_ARCH_S390X | 1246 #if V8_TARGET_ARCH_S390X |
1242 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } | 1247 void InstructionSelector::VisitWord64ReverseBits(Node* node) { UNREACHABLE(); } |
1243 #endif | 1248 #endif |
1244 | 1249 |
| 1250 void InstructionSelector::VisitInt32AbsWithOverflow(Node* node) { |
| 1251 VisitWord32UnaryOp(this, node, kS390_Abs32, OperandMode::kNone); |
| 1252 } |
| 1253 |
| 1254 void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { |
| 1255 VisitWord64UnaryOp(this, node, kS390_Abs64, OperandMode::kNone); |
| 1256 } |
| 1257 |
1245 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { | 1258 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { |
1246 S390OperandGenerator g(this); | 1259 S390OperandGenerator g(this); |
1247 Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node), | 1260 Emit(kS390_LoadReverse64RR, g.DefineAsRegister(node), |
1248 g.UseRegister(node->InputAt(0))); | 1261 g.UseRegister(node->InputAt(0))); |
1249 } | 1262 } |
1250 | 1263 |
1251 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { | 1264 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { |
1252 S390OperandGenerator g(this); | 1265 S390OperandGenerator g(this); |
1253 NodeMatcher input(node->InputAt(0)); | 1266 NodeMatcher input(node->InputAt(0)); |
1254 if (CanCover(node, input.node()) && input.IsLoad()) { | 1267 if (CanCover(node, input.node()) && input.IsLoad()) { |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2030 case IrOpcode::kInt32SubWithOverflow: | 2043 case IrOpcode::kInt32SubWithOverflow: |
2031 cont->OverwriteAndNegateIfEqual(kOverflow); | 2044 cont->OverwriteAndNegateIfEqual(kOverflow); |
2032 return VisitWord32BinOp(selector, node, kS390_Sub32, | 2045 return VisitWord32BinOp(selector, node, kS390_Sub32, |
2033 SubOperandMode, cont); | 2046 SubOperandMode, cont); |
2034 case IrOpcode::kInt32MulWithOverflow: | 2047 case IrOpcode::kInt32MulWithOverflow: |
2035 cont->OverwriteAndNegateIfEqual(kNotEqual); | 2048 cont->OverwriteAndNegateIfEqual(kNotEqual); |
2036 return VisitWord32BinOp( | 2049 return VisitWord32BinOp( |
2037 selector, node, kS390_Mul32WithOverflow, | 2050 selector, node, kS390_Mul32WithOverflow, |
2038 OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps, | 2051 OperandMode::kInt32Imm | OperandMode::kAllowDistinctOps, |
2039 cont); | 2052 cont); |
| 2053 case IrOpcode::kInt32AbsWithOverflow: |
| 2054 cont->OverwriteAndNegateIfEqual(kOverflow); |
| 2055 return VisitWord32UnaryOp(selector, node, kS390_Abs32, |
| 2056 OperandMode::kNone, cont); |
2040 #if V8_TARGET_ARCH_S390X | 2057 #if V8_TARGET_ARCH_S390X |
| 2058 case IrOpcode::kInt64AbsWithOverflow: |
| 2059 cont->OverwriteAndNegateIfEqual(kOverflow); |
| 2060 return VisitWord64UnaryOp(selector, node, kS390_Abs64, |
| 2061 OperandMode::kNone, cont); |
2041 case IrOpcode::kInt64AddWithOverflow: | 2062 case IrOpcode::kInt64AddWithOverflow: |
2042 cont->OverwriteAndNegateIfEqual(kOverflow); | 2063 cont->OverwriteAndNegateIfEqual(kOverflow); |
2043 return VisitWord64BinOp(selector, node, kS390_Add64, | 2064 return VisitWord64BinOp(selector, node, kS390_Add64, |
2044 AddOperandMode, cont); | 2065 AddOperandMode, cont); |
2045 case IrOpcode::kInt64SubWithOverflow: | 2066 case IrOpcode::kInt64SubWithOverflow: |
2046 cont->OverwriteAndNegateIfEqual(kOverflow); | 2067 cont->OverwriteAndNegateIfEqual(kOverflow); |
2047 return VisitWord64BinOp(selector, node, kS390_Sub64, | 2068 return VisitWord64BinOp(selector, node, kS390_Sub64, |
2048 SubOperandMode, cont); | 2069 SubOperandMode, cont); |
2049 #endif | 2070 #endif |
2050 default: | 2071 default: |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2443 return MachineOperatorBuilder::kFloat32RoundDown | | 2464 return MachineOperatorBuilder::kFloat32RoundDown | |
2444 MachineOperatorBuilder::kFloat64RoundDown | | 2465 MachineOperatorBuilder::kFloat64RoundDown | |
2445 MachineOperatorBuilder::kFloat32RoundUp | | 2466 MachineOperatorBuilder::kFloat32RoundUp | |
2446 MachineOperatorBuilder::kFloat64RoundUp | | 2467 MachineOperatorBuilder::kFloat64RoundUp | |
2447 MachineOperatorBuilder::kFloat32RoundTruncate | | 2468 MachineOperatorBuilder::kFloat32RoundTruncate | |
2448 MachineOperatorBuilder::kFloat64RoundTruncate | | 2469 MachineOperatorBuilder::kFloat64RoundTruncate | |
2449 MachineOperatorBuilder::kFloat64RoundTiesAway | | 2470 MachineOperatorBuilder::kFloat64RoundTiesAway | |
2450 MachineOperatorBuilder::kWord32Popcnt | | 2471 MachineOperatorBuilder::kWord32Popcnt | |
2451 MachineOperatorBuilder::kWord32ReverseBytes | | 2472 MachineOperatorBuilder::kWord32ReverseBytes | |
2452 MachineOperatorBuilder::kWord64ReverseBytes | | 2473 MachineOperatorBuilder::kWord64ReverseBytes | |
| 2474 MachineOperatorBuilder::kInt32AbsWithOverflow | |
| 2475 MachineOperatorBuilder::kInt64AbsWithOverflow | |
2453 MachineOperatorBuilder::kWord64Popcnt; | 2476 MachineOperatorBuilder::kWord64Popcnt; |
2454 } | 2477 } |
2455 | 2478 |
2456 // static | 2479 // static |
2457 MachineOperatorBuilder::AlignmentRequirements | 2480 MachineOperatorBuilder::AlignmentRequirements |
2458 InstructionSelector::AlignmentRequirements() { | 2481 InstructionSelector::AlignmentRequirements() { |
2459 return MachineOperatorBuilder::AlignmentRequirements:: | 2482 return MachineOperatorBuilder::AlignmentRequirements:: |
2460 FullUnalignedAccessSupport(); | 2483 FullUnalignedAccessSupport(); |
2461 } | 2484 } |
2462 | 2485 |
2463 } // namespace compiler | 2486 } // namespace compiler |
2464 } // namespace internal | 2487 } // namespace internal |
2465 } // namespace v8 | 2488 } // namespace v8 |
OLD | NEW |