001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.jikesrvm.compilers.opt.ir; 014 015 import org.jikesrvm.ArchitectureSpecificOpt.PhysicalRegisterSet; 016 import org.jikesrvm.classloader.RVMMethod; 017 import org.jikesrvm.classloader.TypeReference; 018 import org.jikesrvm.compilers.opt.ir.operand.RegisterOperand; 019 020 /** 021 * Pool of symbolic registers. 022 * Each IR contains has exactly one register pool object associated with it. 023 * 024 * @see Register 025 */ 026 public class GenericRegisterPool extends AbstractRegisterPool { 027 028 protected final PhysicalRegisterSet physical = new PhysicalRegisterSet(); 029 030 public PhysicalRegisterSet getPhysicalRegisterSet() { 031 return physical; 032 } 033 034 /** 035 * Initializes a new register pool for the method meth. 036 * 037 * @param meth the RVMMethod of the outermost method 038 */ 039 protected GenericRegisterPool(RVMMethod meth) { 040 // currentNum is assigned an initial value to avoid overlap of 041 // physical and symbolic registers. 042 currentNum = PhysicalRegisterSet.getSize(); 043 } 044 045 /** 046 * Return the number of symbolic registers (doesn't count physical ones) 047 * @return the number of symbolic registers allocated by the pool 048 */ 049 public int getNumberOfSymbolicRegisters() { 050 int start = PhysicalRegisterSet.getSize(); 051 return currentNum - start; 052 } 053 054 /** 055 * Get the Framepointer (FP) 056 * 057 * @return the FP register 058 */ 059 public Register getFP() { 060 return physical.getFP(); 061 } 062 063 /** 064 * Get a temporary that represents the FP register 065 * 066 * @return the temp 067 */ 068 public RegisterOperand makeFPOp() { 069 return new RegisterOperand(getFP(), TypeReference.Address); 070 } 071 072 /** 073 * Get a temporary that represents the PR register 074 * 075 * @return the temp 076 */ 077 public RegisterOperand makeTROp() { 078 RegisterOperand trOp = new RegisterOperand(physical.getTR(), TypeReference.Thread); 079 trOp.setPreciseType(); 080 return trOp; 081 } 082 083 }