diff options
author | Serguei Katkov <serguei.i.katkov@intel.com> | 2014-07-17 14:39:03 +0700 |
---|---|---|
committer | Serguei Katkov <serguei.i.katkov@intel.com> | 2014-07-23 12:25:26 +0700 |
commit | 9ee4519afd97121f893f82d41d23164fc6c9ed34 (patch) | |
tree | ede311e383b17daf7f6fcb220a47ee3664579586 /compiler/dex/quick/ralloc_util.cc | |
parent | d83d1a7edf07c33336935faff918424b23247320 (diff) | |
download | android_art-9ee4519afd97121f893f82d41d23164fc6c9ed34.tar.gz android_art-9ee4519afd97121f893f82d41d23164fc6c9ed34.tar.bz2 android_art-9ee4519afd97121f893f82d41d23164fc6c9ed34.zip |
x86: GenSelect utility update
The is follow-up https://android-review.googlesource.com/#/c/101396/
to make x86 GenSelectConst32 implementation complete.
Change-Id: I69f318e18093f9a5b00f8f00f0f1c2e4ff7a9ab2
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Diffstat (limited to 'compiler/dex/quick/ralloc_util.cc')
-rw-r--r-- | compiler/dex/quick/ralloc_util.cc | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/compiler/dex/quick/ralloc_util.cc b/compiler/dex/quick/ralloc_util.cc index fa1c36eaa6..45244e1a7a 100644 --- a/compiler/dex/quick/ralloc_util.cc +++ b/compiler/dex/quick/ralloc_util.cc @@ -408,64 +408,67 @@ RegStorage Mir2Lir::AllocTempBody(GrowableArray<RegisterInfo*> ®s, int* next_ return RegStorage::InvalidReg(); // No register available } -/* Return a temp if one is available, -1 otherwise */ -RegStorage Mir2Lir::AllocFreeTemp() { - return AllocTempBody(reg_pool_->core_regs_, ®_pool_->next_core_reg_, false); +RegStorage Mir2Lir::AllocTemp(bool required) { + return AllocTempBody(reg_pool_->core_regs_, ®_pool_->next_core_reg_, required); } -RegStorage Mir2Lir::AllocTemp() { - return AllocTempBody(reg_pool_->core_regs_, ®_pool_->next_core_reg_, true); -} - -RegStorage Mir2Lir::AllocTempWide() { +RegStorage Mir2Lir::AllocTempWide(bool required) { RegStorage res; if (reg_pool_->core64_regs_.Size() != 0) { - res = AllocTempBody(reg_pool_->core64_regs_, ®_pool_->next_core64_reg_, true); + res = AllocTempBody(reg_pool_->core64_regs_, ®_pool_->next_core64_reg_, required); } else { RegStorage low_reg = AllocTemp(); RegStorage high_reg = AllocTemp(); res = RegStorage::MakeRegPair(low_reg, high_reg); } - CheckRegStorage(res, WidenessCheck::kCheckWide, RefCheck::kIgnoreRef, FPCheck::kCheckNotFP); + if (required) { + CheckRegStorage(res, WidenessCheck::kCheckWide, RefCheck::kIgnoreRef, FPCheck::kCheckNotFP); + } return res; } -RegStorage Mir2Lir::AllocTempRef() { - RegStorage res = AllocTempBody(*reg_pool_->ref_regs_, reg_pool_->next_ref_reg_, true); - DCHECK(!res.IsPair()); - CheckRegStorage(res, WidenessCheck::kCheckNotWide, RefCheck::kCheckRef, FPCheck::kCheckNotFP); +RegStorage Mir2Lir::AllocTempRef(bool required) { + RegStorage res = AllocTempBody(*reg_pool_->ref_regs_, reg_pool_->next_ref_reg_, required); + if (required) { + DCHECK(!res.IsPair()); + CheckRegStorage(res, WidenessCheck::kCheckNotWide, RefCheck::kCheckRef, FPCheck::kCheckNotFP); + } return res; } -RegStorage Mir2Lir::AllocTempSingle() { - RegStorage res = AllocTempBody(reg_pool_->sp_regs_, ®_pool_->next_sp_reg_, true); - DCHECK(res.IsSingle()) << "Reg: 0x" << std::hex << res.GetRawBits(); - CheckRegStorage(res, WidenessCheck::kCheckNotWide, RefCheck::kCheckNotRef, FPCheck::kIgnoreFP); +RegStorage Mir2Lir::AllocTempSingle(bool required) { + RegStorage res = AllocTempBody(reg_pool_->sp_regs_, ®_pool_->next_sp_reg_, required); + if (required) { + DCHECK(res.IsSingle()) << "Reg: 0x" << std::hex << res.GetRawBits(); + CheckRegStorage(res, WidenessCheck::kCheckNotWide, RefCheck::kCheckNotRef, FPCheck::kIgnoreFP); + } return res; } -RegStorage Mir2Lir::AllocTempDouble() { - RegStorage res = AllocTempBody(reg_pool_->dp_regs_, ®_pool_->next_dp_reg_, true); - DCHECK(res.IsDouble()) << "Reg: 0x" << std::hex << res.GetRawBits(); - CheckRegStorage(res, WidenessCheck::kCheckWide, RefCheck::kCheckNotRef, FPCheck::kIgnoreFP); +RegStorage Mir2Lir::AllocTempDouble(bool required) { + RegStorage res = AllocTempBody(reg_pool_->dp_regs_, ®_pool_->next_dp_reg_, required); + if (required) { + DCHECK(res.IsDouble()) << "Reg: 0x" << std::hex << res.GetRawBits(); + CheckRegStorage(res, WidenessCheck::kCheckWide, RefCheck::kCheckNotRef, FPCheck::kIgnoreFP); + } return res; } -RegStorage Mir2Lir::AllocTypedTempWide(bool fp_hint, int reg_class) { +RegStorage Mir2Lir::AllocTypedTempWide(bool fp_hint, int reg_class, bool required) { DCHECK_NE(reg_class, kRefReg); // NOTE: the Dalvik width of a reference is always 32 bits. if (((reg_class == kAnyReg) && fp_hint) || (reg_class == kFPReg)) { - return AllocTempDouble(); + return AllocTempDouble(required); } - return AllocTempWide(); + return AllocTempWide(required); } -RegStorage Mir2Lir::AllocTypedTemp(bool fp_hint, int reg_class) { +RegStorage Mir2Lir::AllocTypedTemp(bool fp_hint, int reg_class, bool required) { if (((reg_class == kAnyReg) && fp_hint) || (reg_class == kFPReg)) { - return AllocTempSingle(); + return AllocTempSingle(required); } else if (reg_class == kRefReg) { - return AllocTempRef(); + return AllocTempRef(required); } - return AllocTemp(); + return AllocTemp(required); } RegStorage Mir2Lir::FindLiveReg(GrowableArray<RegisterInfo*> ®s, int s_reg) { |