1b4536b7de576b20c74c612406c5d3132998075efVladimir Marko/* 2b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * Copyright (C) 2015 The Android Open Source Project 3b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * 4b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 5b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * you may not use this file except in compliance with the License. 6b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * You may obtain a copy of the License at 7b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * 8b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 9b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * 10b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * Unless required by applicable law or agreed to in writing, software 11b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 12b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * See the License for the specific language governing permissions and 14b4536b7de576b20c74c612406c5d3132998075efVladimir Marko * limitations under the License. 15b4536b7de576b20c74c612406c5d3132998075efVladimir Marko */ 16b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 17b4536b7de576b20c74c612406c5d3132998075efVladimir Marko#ifndef ART_COMPILER_OPTIMIZING_NODES_ARM_H_ 18b4536b7de576b20c74c612406c5d3132998075efVladimir Marko#define ART_COMPILER_OPTIMIZING_NODES_ARM_H_ 19b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 20b4536b7de576b20c74c612406c5d3132998075efVladimir Markonamespace art { 21b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 22b4536b7de576b20c74c612406c5d3132998075efVladimir Markoclass HArmDexCacheArraysBase : public HExpression<0> { 23b4536b7de576b20c74c612406c5d3132998075efVladimir Marko public: 24b4536b7de576b20c74c612406c5d3132998075efVladimir Marko explicit HArmDexCacheArraysBase(const DexFile& dex_file) 25b4536b7de576b20c74c612406c5d3132998075efVladimir Marko : HExpression(Primitive::kPrimInt, SideEffects::None(), kNoDexPc), 26b4536b7de576b20c74c612406c5d3132998075efVladimir Marko dex_file_(&dex_file), 27b4536b7de576b20c74c612406c5d3132998075efVladimir Marko element_offset_(static_cast<size_t>(-1)) { } 28b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 29b4536b7de576b20c74c612406c5d3132998075efVladimir Marko void UpdateElementOffset(size_t element_offset) { 30b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // Use the lowest offset from the requested elements so that all offsets from 31b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // this base are non-negative because our assemblers emit negative-offset loads 32b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // as a sequence of two or more instructions. (However, positive offsets beyond 33b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // 4KiB also require two or more instructions, so this simple heuristic could 34b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // be improved for cases where there is a dense cluster of elements far from 35b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // the lowest offset. This is expected to be rare enough though, so we choose 36b4536b7de576b20c74c612406c5d3132998075efVladimir Marko // not to spend compile time on elaborate calculations.) 37b4536b7de576b20c74c612406c5d3132998075efVladimir Marko element_offset_ = std::min(element_offset_, element_offset); 38b4536b7de576b20c74c612406c5d3132998075efVladimir Marko } 39b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 40b4536b7de576b20c74c612406c5d3132998075efVladimir Marko const DexFile& GetDexFile() const { 41b4536b7de576b20c74c612406c5d3132998075efVladimir Marko return *dex_file_; 42b4536b7de576b20c74c612406c5d3132998075efVladimir Marko } 43b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 44b4536b7de576b20c74c612406c5d3132998075efVladimir Marko size_t GetElementOffset() const { 45b4536b7de576b20c74c612406c5d3132998075efVladimir Marko return element_offset_; 46b4536b7de576b20c74c612406c5d3132998075efVladimir Marko } 47b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 48b4536b7de576b20c74c612406c5d3132998075efVladimir Marko DECLARE_INSTRUCTION(ArmDexCacheArraysBase); 49b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 50b4536b7de576b20c74c612406c5d3132998075efVladimir Marko private: 51b4536b7de576b20c74c612406c5d3132998075efVladimir Marko const DexFile* dex_file_; 52b4536b7de576b20c74c612406c5d3132998075efVladimir Marko size_t element_offset_; 53b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 54b4536b7de576b20c74c612406c5d3132998075efVladimir Marko DISALLOW_COPY_AND_ASSIGN(HArmDexCacheArraysBase); 55b4536b7de576b20c74c612406c5d3132998075efVladimir Marko}; 56b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 57b4536b7de576b20c74c612406c5d3132998075efVladimir Marko} // namespace art 58b4536b7de576b20c74c612406c5d3132998075efVladimir Marko 59b4536b7de576b20c74c612406c5d3132998075efVladimir Marko#endif // ART_COMPILER_OPTIMIZING_NODES_ARM_H_ 60