| 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 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 // The mask must be contiguous, and occupy the least-significant bits. | 950 // The mask must be contiguous, and occupy the least-significant bits. |
| 951 DCHECK_EQ(0u, base::bits::CountTrailingZeros64(mask)); | 951 DCHECK_EQ(0u, base::bits::CountTrailingZeros64(mask)); |
| 952 | 952 |
| 953 // Select Ubfx for And(Shr(x, imm), mask) where the mask is in the least | 953 // Select Ubfx for And(Shr(x, imm), mask) where the mask is in the least |
| 954 // significant bits. | 954 // significant bits. |
| 955 Int64BinopMatcher mleft(m.left().node()); | 955 Int64BinopMatcher mleft(m.left().node()); |
| 956 if (mleft.right().HasValue()) { | 956 if (mleft.right().HasValue()) { |
| 957 // Any shift value can match; int64 shifts use `value % 64`. | 957 // Any shift value can match; int64 shifts use `value % 64`. |
| 958 uint32_t lsb = static_cast<uint32_t>(mleft.right().Value() & 0x3f); | 958 uint32_t lsb = static_cast<uint32_t>(mleft.right().Value() & 0x3f); |
| 959 | 959 |
| 960 if (lsb != 0) { | 960 // Ubfx cannot extract bits past the register size, however since |
| 961 // Ubfx cannot extract bits past the register size, however since | 961 // shifting the original value would have introduced some zeros we can |
| 962 // shifting the original value would have introduced some zeros we can | 962 // still use ubfx with a smaller mask and the remaining bits will be |
| 963 // still use ubfx with a smaller mask and the remaining bits will be | 963 // zeros. |
| 964 // zeros. | 964 if (lsb + mask_width > 64) mask_width = 64 - lsb; |
| 965 if (lsb + mask_width > 64) mask_width = 64 - lsb; | |
| 966 | 965 |
| 967 Emit(kArm64Ubfx, g.DefineAsRegister(node), | 966 Emit(kArm64Ubfx, g.DefineAsRegister(node), |
| 968 g.UseRegister(mleft.left().node()), | 967 g.UseRegister(mleft.left().node()), |
| 969 g.UseImmediateOrTemp(mleft.right().node(), lsb), | 968 g.UseImmediateOrTemp(mleft.right().node(), lsb), |
| 970 g.TempImmediate(static_cast<int32_t>(mask_width))); | 969 g.TempImmediate(static_cast<int32_t>(mask_width))); |
| 971 return; | 970 return; |
| 972 } | |
| 973 } | 971 } |
| 974 // Other cases fall through to the normal And operation. | 972 // Other cases fall through to the normal And operation. |
| 975 } | 973 } |
| 976 } | 974 } |
| 977 VisitLogical<Int64BinopMatcher>( | 975 VisitLogical<Int64BinopMatcher>( |
| 978 this, node, &m, kArm64And, CanCover(node, m.left().node()), | 976 this, node, &m, kArm64And, CanCover(node, m.left().node()), |
| 979 CanCover(node, m.right().node()), kLogical64Imm); | 977 CanCover(node, m.right().node()), kLogical64Imm); |
| 980 } | 978 } |
| 981 | 979 |
| 982 | 980 |
| (...skipping 1729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2712 // static | 2710 // static |
| 2713 MachineOperatorBuilder::AlignmentRequirements | 2711 MachineOperatorBuilder::AlignmentRequirements |
| 2714 InstructionSelector::AlignmentRequirements() { | 2712 InstructionSelector::AlignmentRequirements() { |
| 2715 return MachineOperatorBuilder::AlignmentRequirements:: | 2713 return MachineOperatorBuilder::AlignmentRequirements:: |
| 2716 FullUnalignedAccessSupport(); | 2714 FullUnalignedAccessSupport(); |
| 2717 } | 2715 } |
| 2718 | 2716 |
| 2719 } // namespace compiler | 2717 } // namespace compiler |
| 2720 } // namespace internal | 2718 } // namespace internal |
| 2721 } // namespace v8 | 2719 } // namespace v8 |
| OLD | NEW |