/*
 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
 *
 *  This file is licensed to You under the Common Public License (CPL);
 *  You may not use this file except in compliance with the License. You
 *  may obtain a copy of the License at
 *
 *      http://www.opensource.org/licenses/cpl1.0.php
 *
 *  See the COPYRIGHT.txt file distributed with this work for information
 *  regarding copyright ownership.
 */
package org.jikesrvm.compilers.opt.ir.ppc;

import org.jikesrvm.classloader.RVMMethod;
import org.jikesrvm.classloader.TypeReference;
import org.jikesrvm.compilers.opt.ir.GenericRegisterPool;
import org.jikesrvm.compilers.opt.ir.IR;
import org.jikesrvm.compilers.opt.ir.Instruction;
import org.jikesrvm.compilers.opt.ir.Register;
import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand;

/**
 * Pool of symbolic registers.
 * powerPC specific implementation where JTOC is stored in a reserved register.
 * Each IR contains has exactly one register pool object associated with it.
 *
 * @see Register
 */
public abstract class RegisterPool extends GenericRegisterPool {

  /**
   * Initializes a new register pool for the method meth.
   *
   * @param meth the RVMMethod of the outermost method
   */
  public RegisterPool(RVMMethod meth) {
    super(meth);
  }

  /**
   * Get the JTOC register
   *
   * @return the JTOC register
   */
  public Register getJTOC() {
    return physical.getJTOC();
  }

  /**
   * Get a temporary that represents the JTOC register (as an Address)
   *
   * @param ir
   * @param s
   * @return the temp
   */
  public RegisterOperand makeJTOCOp(IR ir, Instruction s) {
    return new RegisterOperand(getJTOC(), TypeReference.Address);
  }

  /**
   * Get a temporary that represents the JTOC register (as an Object)
   *
   * @return the temp
   */
  public RegisterOperand makeTocOp() {
    return new RegisterOperand(getJTOC(), TypeReference.JavaLangObject);
  }

}
