diff options
| author | 2015-06-19 16:39:29 +0000 | |
|---|---|---|
| committer | 2015-06-19 16:39:30 +0000 | |
| commit | e4bb626ff09e409c9482e515716de7cd595ea466 (patch) | |
| tree | e01c42443ab5b6de7cd0f52bbb509824cf970bd3 | |
| parent | 87a135e8699119c9ef99b0221acf481d7d6501d4 (diff) | |
| parent | 8958f7f8702327e713264d0538ab5dec586f3738 (diff) | |
Merge "Quick: Handle total high/low register overlap on arm/mips."
| -rw-r--r-- | compiler/dex/quick/arm/int_arm.cc | 11 | ||||
| -rw-r--r-- | compiler/dex/quick/mips/int_mips.cc | 12 |
2 files changed, 17 insertions, 6 deletions
diff --git a/compiler/dex/quick/arm/int_arm.cc b/compiler/dex/quick/arm/int_arm.cc index 6d30e72f86..cf0188456d 100644 --- a/compiler/dex/quick/arm/int_arm.cc +++ b/compiler/dex/quick/arm/int_arm.cc @@ -471,13 +471,18 @@ void ArmMir2Lir::OpRegCopyWide(RegStorage r_dest, RegStorage r_src) { NewLIR3(kThumb2Fmrrd, r_dest.GetLowReg(), r_dest.GetHighReg(), r_src.GetReg()); } else { // Handle overlap - if (r_src.GetHighReg() == r_dest.GetLowReg()) { - DCHECK_NE(r_src.GetLowReg(), r_dest.GetHighReg()); + if (r_src.GetHighReg() != r_dest.GetLowReg()) { + OpRegCopy(r_dest.GetLow(), r_src.GetLow()); + OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); + } else if (r_src.GetLowReg() != r_dest.GetHighReg()) { OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); OpRegCopy(r_dest.GetLow(), r_src.GetLow()); } else { + RegStorage r_tmp = AllocTemp(); + OpRegCopy(r_tmp, r_src.GetHigh()); OpRegCopy(r_dest.GetLow(), r_src.GetLow()); - OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); + OpRegCopy(r_dest.GetHigh(), r_tmp); + FreeTemp(r_tmp); } } } diff --git a/compiler/dex/quick/mips/int_mips.cc b/compiler/dex/quick/mips/int_mips.cc index 9319c64784..f5ad7c7c33 100644 --- a/compiler/dex/quick/mips/int_mips.cc +++ b/compiler/dex/quick/mips/int_mips.cc @@ -258,13 +258,19 @@ void MipsMir2Lir::OpRegCopyWide(RegStorage r_dest, RegStorage r_src) { } } else { // Here if both src and dest are core registers. - // Handle overlap. - if (r_src.GetHighReg() == r_dest.GetLowReg()) { + // Handle overlap + if (r_src.GetHighReg() != r_dest.GetLowReg()) { + OpRegCopy(r_dest.GetLow(), r_src.GetLow()); + OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); + } else if (r_src.GetLowReg() != r_dest.GetHighReg()) { OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); OpRegCopy(r_dest.GetLow(), r_src.GetLow()); } else { + RegStorage r_tmp = AllocTemp(); + OpRegCopy(r_tmp, r_src.GetHigh()); OpRegCopy(r_dest.GetLow(), r_src.GetLow()); - OpRegCopy(r_dest.GetHigh(), r_src.GetHigh()); + OpRegCopy(r_dest.GetHigh(), r_tmp); + FreeTemp(r_tmp); } } } |