diff options
| author | 2015-01-14 10:49:16 +0000 | |
|---|---|---|
| committer | 2015-01-21 11:27:57 +0000 | |
| commit | 41aedbb684ccef76ff8373f39aba606ce4cb3194 (patch) | |
| tree | 94929237a0fe9b24dda7409d9433f07e82af4461 /compiler/optimizing/nodes.h | |
| parent | 97c89e4c081dcf4bacbde70b6609e366c9da417e (diff) | |
Fully support pairs in the register allocator.
Enabled on ARM for longs and doubles.
Change-Id: Id8792d08bd7ca9fb049c5db8a40ae694bafc2d8b
Diffstat (limited to 'compiler/optimizing/nodes.h')
| -rw-r--r-- | compiler/optimizing/nodes.h | 25 | 
1 files changed, 16 insertions, 9 deletions
| diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index fa51f27f0a..dc8a7ee7cd 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -2802,18 +2802,25 @@ class HParallelMove : public HTemplateInstruction<0> {        AddMove(source.ToLow(), destination.ToLow(), instruction);        AddMove(source.ToHigh(), destination.ToHigh(), nullptr);      } else if (source.IsPair()) { -      DCHECK(destination.IsDoubleStackSlot()); +      DCHECK(destination.IsDoubleStackSlot()) << destination;        AddMove(source.ToLow(), Location::StackSlot(destination.GetStackIndex()), instruction);        AddMove(source.ToHigh(), Location::StackSlot(destination.GetHighStackIndex(4)), nullptr);      } else if (destination.IsPair()) { -      DCHECK(source.IsDoubleStackSlot()); -      AddMove(Location::StackSlot(source.GetStackIndex()), destination.ToLow(), instruction); -      // TODO: rewrite GetHighStackIndex to not require a word size. It's supposed to -      // always be 4. -      static constexpr int kHighOffset = 4; -      AddMove(Location::StackSlot(source.GetHighStackIndex(kHighOffset)), -              destination.ToHigh(), -              nullptr); +      if (source.IsConstant()) { +        // We put the same constant in the move. The code generator will handle which +        // low or high part to use. +        AddMove(source, destination.ToLow(), instruction); +        AddMove(source, destination.ToHigh(), nullptr); +      } else { +        DCHECK(source.IsDoubleStackSlot()); +        AddMove(Location::StackSlot(source.GetStackIndex()), destination.ToLow(), instruction); +        // TODO: rewrite GetHighStackIndex to not require a word size. It's supposed to +        // always be 4. +        static constexpr int kHighOffset = 4; +        AddMove(Location::StackSlot(source.GetHighStackIndex(kHighOffset)), +                destination.ToHigh(), +                nullptr); +      }      } else {        if (kIsDebugBuild) {          if (instruction != nullptr) { |