// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.code;

import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.ir.code.ValueType;

public enum  MoveType {
  SINGLE,
  WIDE,
  OBJECT;

  public static MoveType fromValueType(ValueType type) {
    switch (type) {
      case OBJECT:
        return OBJECT;
      case INT:
      case FLOAT:
      case INT_OR_FLOAT:
      case INT_OR_FLOAT_OR_NULL:
        return SINGLE;
      case LONG:
      case DOUBLE:
      case LONG_OR_DOUBLE:
        return WIDE;
      default:
        throw new Unreachable("Unexpected value type: " + type);
    }
  }

  public ValueType toValueType() {
    switch (this) {
      case SINGLE:
        return ValueType.INT_OR_FLOAT;
      case WIDE:
        return ValueType.LONG_OR_DOUBLE;
      case OBJECT:
        return ValueType.OBJECT;
      default:
        throw new Unreachable("Unexpected move type: " + this);
    }
  }

  public int requiredRegisters() {
    return this == WIDE ? 2 : 1;
  }
}
