OSDN Git Service

x86_64: Fix GenArrayBoundsCheck
authorSerguei Katkov <serguei.i.katkov@intel.com>
Mon, 23 Jun 2014 17:50:02 +0000 (00:50 +0700)
committerSerguei Katkov <serguei.i.katkov@intel.com>
Mon, 30 Jun 2014 03:52:49 +0000 (10:52 +0700)
The GenArrayBoundsCheck uses args registers to put array_length and
index as a parameter to out call. To ensure that we do not corrupt
register values there is a check whether need arg is not busy.
We need to use reg num comparison instead of reg comparison.

Change-Id: I260f02d1c155b69be8652dee2e89f3b63d15297c
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
compiler/dex/quick/x86/int_x86.cc

index fd20a81..481b00c 100644 (file)
@@ -1006,8 +1006,9 @@ void X86Mir2Lir::GenArrayBoundsCheck(RegStorage index,
 
       RegStorage new_index = index_;
       // Move index out of kArg1, either directly to kArg0, or to kArg2.
-      if (index_.GetReg() == m2l_->TargetReg(kArg1).GetReg()) {
-        if (array_base_.GetReg() == m2l_->TargetReg(kArg0).GetReg()) {
+      // TODO: clean-up to check not a number but with type
+      if (index_.GetRegNum() == m2l_->TargetReg(kArg1).GetRegNum()) {
+        if (array_base_.GetRegNum() == m2l_->TargetReg(kArg0).GetRegNum()) {
           m2l_->OpRegCopy(m2l_->TargetReg(kArg2), index_);
           new_index = m2l_->TargetReg(kArg2);
         } else {