// 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.ir.code;

import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import java.util.function.Predicate;

// Value that has a fixed register allocated. These are used for inserting spill, restore, and phi
// moves in the spilling register allocator.
public class FixedRegisterValue extends Value {
  private final int register;

  public FixedRegisterValue(TypeLatticeElement moveType, int register) {
    // Set local info to null since these values are never representatives of live-ranges.
    super(-1, moveType, null);
    setNeedsRegister(true);
    this.register = register;
  }

  @Override
  public ValueType outType() {
    TypeLatticeElement type = getType();
    if (type.isPrimitiveType()) {
      if (type.isSinglePrimitive()) {
        if (type.isInt()) {
          return ValueType.INT;
        }
        if (type.isFloat()) {
          return ValueType.FLOAT;
        }
      } else {
        assert type.isWidePrimitive();
        if (type.isDouble()) {
          return ValueType.DOUBLE;
        }
        if (type.isLong()) {
          return ValueType.LONG;
        }
      }
    } else {
      assert type.isReferenceType();
      return ValueType.OBJECT;
    }
    throw new Unreachable("Unexpected imprecise type: " + type);
  }

  public int getRegister() {
    return register;
  }

  @Override
  public boolean isDefinedByInstructionSatisfying(Predicate<Instruction> predicate) {
    return false;
  }

  @Override
  public boolean isFixedRegisterValue() {
    return true;
  }

  @Override
  public FixedRegisterValue asFixedRegisterValue() {
    return this;
  }

  @Override
  public boolean isConstant() {
    return false;
  }

  @Override
  public String toString() {
    return "r" + register;
  }
}
