Type MoveOperands.

The ParallelMoveResolver implementation needs to know if a move
is for 64bits or not, to handle swaps correctly.

Bug found, and test case courtesy of Serguei I. Katkov.

Change-Id: I9a0917a1cfed398c07e57ad6251aea8c9b0b8506
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 5f50494..a2179fa 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -3418,8 +3418,11 @@
 
 class MoveOperands : public ArenaObject<kArenaAllocMisc> {
  public:
-  MoveOperands(Location source, Location destination, HInstruction* instruction)
-      : source_(source), destination_(destination), instruction_(instruction) {}
+  MoveOperands(Location source,
+               Location destination,
+               Primitive::Type type,
+               HInstruction* instruction)
+      : source_(source), destination_(destination), type_(type), instruction_(instruction) {}
 
   Location GetSource() const { return source_; }
   Location GetDestination() const { return destination_; }
@@ -3467,11 +3470,17 @@
     return source_.IsInvalid();
   }
 
+  bool Is64BitMove() const {
+    return Primitive::Is64BitType(type_);
+  }
+
   HInstruction* GetInstruction() const { return instruction_; }
 
  private:
   Location source_;
   Location destination_;
+  // The type this move is for.
+  Primitive::Type type_;
   // The instruction this move is assocatied with. Null when this move is
   // for moving an input in the expected locations of user (including a phi user).
   // This is only used in debug mode, to ensure we do not connect interval siblings
@@ -3486,7 +3495,10 @@
   explicit HParallelMove(ArenaAllocator* arena)
       : HTemplateInstruction(SideEffects::None()), moves_(arena, kDefaultNumberOfMoves) {}
 
-  void AddMove(Location source, Location destination, HInstruction* instruction) {
+  void AddMove(Location source,
+               Location destination,
+               Primitive::Type type,
+               HInstruction* instruction) {
     DCHECK(source.IsValid());
     DCHECK(destination.IsValid());
     if (kIsDebugBuild) {
@@ -3512,7 +3524,7 @@
             << "Same destination for two moves in a parallel move.";
       }
     }
-    moves_.Add(MoveOperands(source, destination, instruction));
+    moves_.Add(MoveOperands(source, destination, type, instruction));
   }
 
   MoveOperands* MoveOperandsAt(size_t index) const {