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.specialization;
014    
015    import org.jikesrvm.ArchitectureSpecific.CodeArray;
016    import org.jikesrvm.compilers.common.CompiledMethod;
017    
018    /**
019     * This class holds the static array of pointers to instructions
020     * of specialized methods
021     */
022    public final class SpecializedMethodPool {
023      private static final int SPECIALIZED_METHOD_COUNT = 1024;
024      static int specializedMethodCount = 0;
025      static CodeArray[] specializedMethods = new CodeArray[SPECIALIZED_METHOD_COUNT];
026    
027      /**
028       * Return the number of specialized methods
029       */
030      public int getSpecializedMethodCount() {
031        return specializedMethodCount;
032      }
033    
034      /**
035       * Register the specialized instructions for a method.
036       */
037      static void registerCompiledMethod(SpecializedMethod m) {
038        int smid = m.getSpecializedMethodIndex();
039        CompiledMethod cm = m.getCompiledMethod();
040        storeSpecializedMethod(cm, smid);
041      }
042    
043      /**
044       * Associate a particular compiled method with a specialized method id.
045       */
046      public static void storeSpecializedMethod(CompiledMethod cm, int smid) {
047        specializedMethods[smid] = cm.getEntryCodeArray();
048      }
049    
050      /**
051       * Is there a compiled version of a particular specialized method?
052       * @param smid
053       */
054      public static boolean hasCompiledVersion(int smid) {
055        return specializedMethods[smid] != null;
056      }
057    
058      /**
059       * @return a new unique integer identifier for a specialized method
060       */
061      public static int createSpecializedMethodID() {
062        specializedMethodCount++;
063        if (specializedMethodCount >= specializedMethods.length) {
064          growSpecializedMethods();
065        }
066        return specializedMethodCount;
067      }
068    
069      /**
070       * Increase the capacity of the internal data structures to track
071       * specialized methods.
072       */
073      public static void growSpecializedMethods() {
074        int org_length = specializedMethods.length;
075        int new_length = 2 * org_length;
076        CodeArray[] temp = new CodeArray[new_length];
077        for (int i = 0; i < org_length; i++) {
078          temp[i] = specializedMethods[i];
079        }
080        specializedMethods = temp;
081      }
082    }