diff options
author | 2015-05-18 15:25:39 +0000 | |
---|---|---|
committer | 2015-05-18 15:25:40 +0000 | |
commit | 2f9d1379fdebcdeeac52eaeff25ad5697c6b6ffb (patch) | |
tree | 6fe7dd64fc17928540cac48162c4b6471fc2ab6a /compiler/optimizing/common_arm64.h | |
parent | 5969307a254fb731a464119506b2cef9404871b9 (diff) | |
parent | da40309f61f98c16d7d58e4c34cc0f5eef626f93 (diff) |
Merge "Opt compiler: ARM64: Use ldp/stp on arm64 for slow paths."
Diffstat (limited to 'compiler/optimizing/common_arm64.h')
-rw-r--r-- | compiler/optimizing/common_arm64.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/compiler/optimizing/common_arm64.h b/compiler/optimizing/common_arm64.h index 53f1f3c45c..246fff99ac 100644 --- a/compiler/optimizing/common_arm64.h +++ b/compiler/optimizing/common_arm64.h @@ -218,6 +218,28 @@ static inline Location ARM64EncodableConstantOrRegister(HInstruction* constant, return Location::RequiresRegister(); } +// Check if registers in art register set have the same register code in vixl. If the register +// codes are same, we can initialize vixl register list simply by the register masks. Currently, +// only SP/WSP and ZXR/WZR codes are different between art and vixl. +// Note: This function is only used for debug checks. +static inline bool ArtVixlRegCodeCoherentForRegSet(uint32_t art_core_registers, + size_t num_core, + uint32_t art_fpu_registers, + size_t num_fpu) { + // The register masks won't work if the number of register is larger than 32. + DCHECK_GE(sizeof(art_core_registers) * 8, num_core); + DCHECK_GE(sizeof(art_fpu_registers) * 8, num_fpu); + for (size_t art_reg_code = 0; art_reg_code < num_core; ++art_reg_code) { + if (RegisterSet::Contains(art_core_registers, art_reg_code)) { + if (art_reg_code != static_cast<size_t>(VIXLRegCodeFromART(art_reg_code))) { + return false; + } + } + } + // There is no register code translation for float registers. + return true; +} + } // namespace helpers } // namespace arm64 } // namespace art |