diff options
Diffstat (limited to 'compiler/optimizing/instruction_simplifier_arm64.cc')
-rw-r--r-- | compiler/optimizing/instruction_simplifier_arm64.cc | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/compiler/optimizing/instruction_simplifier_arm64.cc b/compiler/optimizing/instruction_simplifier_arm64.cc index ff0859b456..a6ec02012c 100644 --- a/compiler/optimizing/instruction_simplifier_arm64.cc +++ b/compiler/optimizing/instruction_simplifier_arm64.cc @@ -277,18 +277,30 @@ void InstructionSimplifierArm64Visitor::VisitXor(HXor* instruction) { } void InstructionSimplifierArm64Visitor::VisitVecLoad(HVecLoad* instruction) { - // TODO: Extract regular HIntermediateAddress. if (!instruction->IsPredicated() && !instruction->IsStringCharAt() && TryExtractVecArrayAccessAddress(instruction, instruction->GetIndex())) { RecordSimplification(); + } else if (instruction->IsPredicated()) { + size_t size = DataType::Size(instruction->GetPackedType()); + size_t offset = mirror::Array::DataOffset(size).Uint32Value(); + if (TryExtractArrayAccessAddress( + instruction, instruction->GetArray(), instruction->GetIndex(), offset)) { + RecordSimplification(); + } } } void InstructionSimplifierArm64Visitor::VisitVecStore(HVecStore* instruction) { - // TODO: Extract regular HIntermediateAddress. if (!instruction->IsPredicated() && TryExtractVecArrayAccessAddress(instruction, instruction->GetIndex())) { RecordSimplification(); + } else if (instruction->IsPredicated()) { + size_t size = DataType::Size(instruction->GetPackedType()); + size_t offset = mirror::Array::DataOffset(size).Uint32Value(); + if (TryExtractArrayAccessAddress( + instruction, instruction->GetArray(), instruction->GetIndex(), offset)) { + RecordSimplification(); + } } } |