/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* 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/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.ir;
import java.util.Enumeration;
import org.jikesrvm.compilers.opt.ir.operand.Operand;
import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand;
/**
* This abstract class provides a set of useful architecture-independent
* methods for manipulating physical registers for an IR.
*/
public abstract class GenericPhysicalRegisterTools extends IRTools {
public abstract IR getIR();
/**
* Create an address register operand for a given physical GPR.
* To be used in passthrough expressions like
* <pre>
* ... Load.create(INT_LOAD, I(2), A(1), IC(4)) ...
* </pre>
*
* @param regnum the given GPR register number
* @return integer register operand
*/
protected final RegisterOperand A(int regnum) {
GenericPhysicalRegisterSet phys = getIR().regpool.getPhysicalRegisterSet();
return A(phys.getGPR(regnum));
}
/**
* Create an integer register operand for a given physical GPR.
* To be used in passthrough expressions like
* <pre>
* ... Load.create(INT_LOAD, I(2), A(1), IC(4)) ...
* </pre>
*
* @param regnum the given GPR register number
* @return integer register operand
*/
protected final RegisterOperand I(int regnum) {
GenericPhysicalRegisterSet phys = getIR().regpool.getPhysicalRegisterSet();
return I(phys.getGPR(regnum));
}
/**
* Create a float register operand for a given physical FPR.
* To be used in passthrough expressions like
* <pre>
* ... Load.create(FLOAT_LOAD, F(2), A(1), IC(4)) ...
* </pre>
*
* @param regnum the given DOUBLE register number
* @return float register operand
*/
final RegisterOperand F(int regnum) {
GenericPhysicalRegisterSet phys = getIR().regpool.getPhysicalRegisterSet();
return F(phys.getFPR(regnum));
}
/**
* Create a double register operand for a given physical FPR.
* To be used in passthrough expressions like
* <pre>
* ... Load.create(DOUBLE_LOAD, D(2), A(1), IC(4)) ...
* </pre>
*
* @param regnum the given double register number
* @return double register operand
*/
final RegisterOperand D(int regnum) {
GenericPhysicalRegisterSet phys = getIR().regpool.getPhysicalRegisterSet();
return D(phys.getFPR(regnum));
}
/**
* Create a long register operand for a given GPR number.
* To be used in passthrough expressions like
* <pre>
* ... Load.create(LONG_LOAD, L(2), A(1), IC(4)) ...
* </pre>
*
* @param regnum the given GPR register number
* @return long register operand
*/
final RegisterOperand L(int regnum) {
GenericPhysicalRegisterSet phys = getIR().regpool.getPhysicalRegisterSet();
return L(phys.getGPR(regnum));
}
/**
* @param s the instruction to check
* @return {@code true} if the instruction has an operand that contains a physical register
*/
static boolean hasPhysicalOperand(Instruction s) {
for (Enumeration<Operand> e = s.getOperands(); e.hasMoreElements();) {
Operand op = e.nextElement();
if (op == null) continue;
if (op.isRegister()) {
if (op.asRegister().getRegister().isPhysical()) {
return true;
}
}
}
return false;
}
}