| 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/compiler/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
| 6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
| 7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 // TODO(dcarney): some unencodable values can be handled by | 95 // TODO(dcarney): some unencodable values can be handled by |
| 96 // switching instructions. | 96 // switching instructions. |
| 97 return Assembler::IsImmLogical(static_cast<uint64_t>(value), 32, | 97 return Assembler::IsImmLogical(static_cast<uint64_t>(value), 32, |
| 98 &ignored, &ignored, &ignored); | 98 &ignored, &ignored, &ignored); |
| 99 case kLogical64Imm: | 99 case kLogical64Imm: |
| 100 return Assembler::IsImmLogical(static_cast<uint64_t>(value), 64, | 100 return Assembler::IsImmLogical(static_cast<uint64_t>(value), 64, |
| 101 &ignored, &ignored, &ignored); | 101 &ignored, &ignored, &ignored); |
| 102 case kArithmeticImm: | 102 case kArithmeticImm: |
| 103 return Assembler::IsImmAddSub(value); | 103 return Assembler::IsImmAddSub(value); |
| 104 case kLoadStoreImm8: | 104 case kLoadStoreImm8: |
| 105 return IsLoadStoreImmediate(value, LSByte); | 105 return IsLoadStoreImmediate(value, 0); |
| 106 case kLoadStoreImm16: | 106 case kLoadStoreImm16: |
| 107 return IsLoadStoreImmediate(value, LSHalfword); | 107 return IsLoadStoreImmediate(value, 1); |
| 108 case kLoadStoreImm32: | 108 case kLoadStoreImm32: |
| 109 return IsLoadStoreImmediate(value, LSWord); | 109 return IsLoadStoreImmediate(value, 2); |
| 110 case kLoadStoreImm64: | 110 case kLoadStoreImm64: |
| 111 return IsLoadStoreImmediate(value, LSDoubleWord); | 111 return IsLoadStoreImmediate(value, 3); |
| 112 case kNoImmediate: | 112 case kNoImmediate: |
| 113 return false; | 113 return false; |
| 114 case kShift32Imm: // Fall through. | 114 case kShift32Imm: // Fall through. |
| 115 case kShift64Imm: | 115 case kShift64Imm: |
| 116 // Shift operations only observe the bottom 5 or 6 bits of the value. | 116 // Shift operations only observe the bottom 5 or 6 bits of the value. |
| 117 // All possible shifts can be encoded by discarding bits which have no | 117 // All possible shifts can be encoded by discarding bits which have no |
| 118 // effect. | 118 // effect. |
| 119 return true; | 119 return true; |
| 120 } | 120 } |
| 121 return false; | 121 return false; |
| 122 } | 122 } |
| 123 | 123 |
| 124 bool CanBeLoadStoreShiftImmediate(Node* node, MachineRepresentation rep) { | 124 bool CanBeLoadStoreShiftImmediate(Node* node, MachineRepresentation rep) { |
| 125 // TODO(arm64): Load and Store on 128 bit Q registers is not supported yet. | 125 // TODO(arm64): Load and Store on 128 bit Q registers is not supported yet. |
| 126 DCHECK_NE(MachineRepresentation::kSimd128, rep); | 126 DCHECK_NE(MachineRepresentation::kSimd128, rep); |
| 127 return IsIntegerConstant(node) && | 127 return IsIntegerConstant(node) && |
| 128 (GetIntegerConstantValue(node) == ElementSizeLog2Of(rep)); | 128 (GetIntegerConstantValue(node) == ElementSizeLog2Of(rep)); |
| 129 } | 129 } |
| 130 | 130 |
| 131 private: | 131 private: |
| 132 bool IsLoadStoreImmediate(int64_t value, LSDataSize size) { | 132 bool IsLoadStoreImmediate(int64_t value, unsigned size) { |
| 133 return Assembler::IsImmLSScaled(value, size) || | 133 return Assembler::IsImmLSScaled(value, size) || |
| 134 Assembler::IsImmLSUnscaled(value); | 134 Assembler::IsImmLSUnscaled(value); |
| 135 } | 135 } |
| 136 }; | 136 }; |
| 137 | 137 |
| 138 | 138 |
| 139 namespace { | 139 namespace { |
| 140 | 140 |
| 141 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { | 141 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { |
| 142 Arm64OperandGenerator g(selector); | 142 Arm64OperandGenerator g(selector); |
| (...skipping 2776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2919 // static | 2919 // static |
| 2920 MachineOperatorBuilder::AlignmentRequirements | 2920 MachineOperatorBuilder::AlignmentRequirements |
| 2921 InstructionSelector::AlignmentRequirements() { | 2921 InstructionSelector::AlignmentRequirements() { |
| 2922 return MachineOperatorBuilder::AlignmentRequirements:: | 2922 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2923 FullUnalignedAccessSupport(); | 2923 FullUnalignedAccessSupport(); |
| 2924 } | 2924 } |
| 2925 | 2925 |
| 2926 } // namespace compiler | 2926 } // namespace compiler |
| 2927 } // namespace internal | 2927 } // namespace internal |
| 2928 } // namespace v8 | 2928 } // namespace v8 |
| OLD | NEW |