1 /*
   2  * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.asm.sparc;
  26 
  27 import sun.jvm.hotspot.utilities.*;
  28 
  29 public class SPARCRegisters {
  30 
  31   public static final SPARCRegister G0;
  32   public static final SPARCRegister G1;
  33   public static final SPARCRegister G2;
  34   public static final SPARCRegister G3;
  35   public static final SPARCRegister G4;
  36   public static final SPARCRegister G5;
  37   public static final SPARCRegister G6;
  38   public static final SPARCRegister G7;
  39   public static final SPARCRegister O0;
  40   public static final SPARCRegister O1;
  41   public static final SPARCRegister O2;
  42   public static final SPARCRegister O3;
  43   public static final SPARCRegister O4;
  44   public static final SPARCRegister O5;
  45   public static final SPARCRegister O6;
  46   public static final SPARCRegister O7;
  47   public static final SPARCRegister L0;
  48   public static final SPARCRegister L1;
  49   public static final SPARCRegister L2;
  50   public static final SPARCRegister L3;
  51   public static final SPARCRegister L4;
  52   public static final SPARCRegister L5;
  53   public static final SPARCRegister L6;
  54   public static final SPARCRegister L7;
  55   public static final SPARCRegister I0;
  56   public static final SPARCRegister I1;
  57   public static final SPARCRegister I2;
  58   public static final SPARCRegister I3;
  59   public static final SPARCRegister I4;
  60   public static final SPARCRegister I5;
  61   public static final SPARCRegister I6;
  62   public static final SPARCRegister I7;
  63 
  64   private static String registerNames[];
  65   public static final int NUM_REGISTERS = 32;
  66   private static SPARCRegister registers[];
  67 
  68   static {
  69      G0 = new SPARCRegister(0);
  70      G1 = new SPARCRegister(1);
  71      G2 = new SPARCRegister(2);
  72      G3 = new SPARCRegister(3);
  73      G4 = new SPARCRegister(4);
  74      G5 = new SPARCRegister(5);
  75      G6 = new SPARCRegister(6);
  76      G7 = new SPARCRegister(7);
  77      O0 = new SPARCRegister(8);
  78      O1 = new SPARCRegister(9);
  79      O2 = new SPARCRegister(10);
  80      O3 = new SPARCRegister(11);
  81      O4 = new SPARCRegister(12);
  82      O5 = new SPARCRegister(13);
  83      O6 = new SPARCRegister(14);
  84      O7 = new SPARCRegister(15);
  85      L0 = new SPARCRegister(16);
  86      L1 = new SPARCRegister(17);
  87      L2 = new SPARCRegister(18);
  88      L3 = new SPARCRegister(19);
  89      L4 = new SPARCRegister(20);
  90      L5 = new SPARCRegister(21);
  91      L6 = new SPARCRegister(22);
  92      L7 = new SPARCRegister(23);
  93      I0 = new SPARCRegister(24);
  94      I1 = new SPARCRegister(25);
  95      I2 = new SPARCRegister(26);
  96      I3 = new SPARCRegister(27);
  97      I4 = new SPARCRegister(28);
  98      I5 = new SPARCRegister(29);
  99      I6 = new SPARCRegister(30);
 100      I7 = new SPARCRegister(31);
 101      registerNames = new String[NUM_REGISTERS];
 102      registerNames[G0.getNumber()] = "%g0";
 103      registerNames[G1.getNumber()] = "%g1";
 104      registerNames[G2.getNumber()] = "%g2";
 105      registerNames[G3.getNumber()] = "%g3";
 106      registerNames[G4.getNumber()] = "%g4";
 107      registerNames[G5.getNumber()] = "%g5";
 108      registerNames[G6.getNumber()] = "%g6";
 109      registerNames[G7.getNumber()] = "%g7";
 110      registerNames[O0.getNumber()] = "%o0";
 111      registerNames[O1.getNumber()] = "%o1";
 112      registerNames[O2.getNumber()] = "%o2";
 113      registerNames[O3.getNumber()] = "%o3";
 114      registerNames[O4.getNumber()] = "%o4";
 115      registerNames[O5.getNumber()] = "%o5";
 116      registerNames[O6.getNumber()] = "%sp";
 117      registerNames[O7.getNumber()] = "%o7";
 118      registerNames[I0.getNumber()] = "%i0";
 119      registerNames[I1.getNumber()] = "%i1";
 120      registerNames[I2.getNumber()] = "%i2";
 121      registerNames[I3.getNumber()] = "%i3";
 122      registerNames[I4.getNumber()] = "%i4";
 123      registerNames[I5.getNumber()] = "%i5";
 124      registerNames[I6.getNumber()] = "%fp";
 125      registerNames[I7.getNumber()] = "%i7";
 126      registerNames[L0.getNumber()] = "%l0";
 127      registerNames[L1.getNumber()] = "%l1";
 128      registerNames[L2.getNumber()] = "%l2";
 129      registerNames[L3.getNumber()] = "%l3";
 130      registerNames[L4.getNumber()] = "%l4";
 131      registerNames[L5.getNumber()] = "%l5";
 132      registerNames[L6.getNumber()] = "%l6";
 133      registerNames[L7.getNumber()] = "%l7";
 134      registers = (new SPARCRegister[] {
 135             G0, G1, G2, G3, G4, G5, G6, G7, O0, O1,
 136             O2, O3, O4, O5, O6, O7, L0, L1, L2, L3,
 137             L4, L5, L6, L7, I0, I1, I2, I3, I4, I5,
 138             I6, I7
 139         });
 140   }
 141 
 142   public static final SPARCRegister FP = I6;
 143   public static final SPARCRegister SP = O6;
 144 
 145   // Interpreter frames
 146 
 147   public static final SPARCRegister Lesp        = L0; // expression stack pointer
 148   public static final SPARCRegister Lbcp        = L1; // pointer to next bytecode
 149   public static final SPARCRegister Lmethod     = L2;
 150   public static final SPARCRegister Llocals     = L3;
 151   public static final SPARCRegister Lmonitors   = L4;
 152   public static final SPARCRegister Lbyte_code  = L5;
 153   public static final SPARCRegister Lscratch    = L5;
 154   public static final SPARCRegister Lscratch2   = L6;
 155   public static final SPARCRegister LcpoolCache = L6; // constant pool cache
 156 
 157   public static final SPARCRegister OparamAddr       = O0; // Callers Parameter area address
 158   public static final SPARCRegister IsavedSP         = I5; // Saved SP before bumping for locals
 159   public static final SPARCRegister IsizeCalleeParms = I4; // Saved size of Callee parms used to pop arguments
 160   public static final SPARCRegister IdispatchAddress = I3; // Register which saves the dispatch address for each bytecode
 161   public static final SPARCRegister IdispatchTables  = I2; // Base address of the bytecode dispatch tables
 162 
 163 
 164   /** Prefer to use this instead of the constant above */
 165   public static int getNumRegisters() {
 166     return NUM_REGISTERS;
 167   }
 168 
 169 
 170   public static String getRegisterName(int regNum) {
 171     if (regNum < 0 || regNum >= NUM_REGISTERS) {
 172       return "[Illegal register " + regNum + "]";
 173     }
 174 
 175     if (Assert.ASSERTS_ENABLED) {
 176       Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid integer register number!");
 177     }
 178 
 179     return registerNames[regNum];
 180   }
 181 
 182   public static SPARCRegister getRegister(int regNum) {
 183     if (Assert.ASSERTS_ENABLED) {
 184       Assert.that(regNum > -1 && regNum < NUM_REGISTERS, "invalid integer register number!");
 185     }
 186 
 187     return registers[regNum];
 188   }
 189 }