| 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 | 
|---|