OSDN Git Service

Fix LoadValueWide to not call MarkLive for high reg that is equal to low reg
authorChao-ying Fu <chao-ying.fu@intel.com>
Thu, 3 Apr 2014 22:09:37 +0000 (15:09 -0700)
committerChao-ying Fu <chao-ying.fu@intel.com>
Thu, 3 Apr 2014 22:44:01 +0000 (15:44 -0700)
For x86 double FP registers, LoadValueWide should not call MarkLive for
high reg that is equal to low reg.

Change-Id: Ie6a59307c9ff93303bd489c15529432cfdeceaa4
Signed-off-by: Chao-ying Fu <chao-ying.fu@intel.com>
compiler/dex/quick/gen_loadstore.cc

index 897d86d..208eadd 100644 (file)
@@ -211,7 +211,12 @@ RegLocation Mir2Lir::LoadValueWide(RegLocation rl_src, RegisterClass op_kind) {
     LoadValueDirectWide(rl_src, rl_src.reg);
     rl_src.location = kLocPhysReg;
     MarkLive(rl_src.reg.GetLow(), rl_src.s_reg_low);
-    MarkLive(rl_src.reg.GetHigh(), GetSRegHi(rl_src.s_reg_low));
+    if (rl_src.reg.GetLowReg() != rl_src.reg.GetHighReg()) {
+      MarkLive(rl_src.reg.GetHigh(), GetSRegHi(rl_src.s_reg_low));
+    } else {
+      // This must be an x86 vector register value.
+      DCHECK(IsFpReg(rl_src.reg) && (cu_->instruction_set == kX86 || cu_->instruction_set == kX86_64));
+    }
   }
   return rl_src;
 }