Mercurial > hg > truffle
view graal/Compiler/src/com/sun/c1x/C1XIntrinsic.java @ 2507:9ec15d6914ca
Pull over of compiler from maxine repository.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 27 Apr 2011 11:43:22 +0200 |
parents | |
children |
line wrap: on
line source
/* * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.c1x; import java.util.*; import com.sun.cri.ci.*; import com.sun.cri.ri.*; /** * This enum represents all of the intrinsics, i.e. a library methods that * are treated specially by the compiler. Note that the list includes more intrinsics * than are currently handled by C1X. * * @author Ben L. Titzer */ public enum C1XIntrinsic { // java.lang.Object java_lang_Object$init ("java.lang.Object", "<init>", "()V"), java_lang_Object$hashCode ("java.lang.Object", "hashCode", "()I"), java_lang_Object$getClass ("java.lang.Object", "getClass", "()Ljava/lang/Class;"), java_lang_Object$clone ("java.lang.Object", "clone", "()Ljava/lang/Object;"), // java.lang.Class java_lang_Class$isAssignableFrom ("java.lang.Class", "isAssignableFrom", "(Ljava/lang/Class;)Z"), java_lang_Class$isInstance ("java.lang.Class", "isInstance", "(Ljava/lang/Object;)Z"), java_lang_Class$getModifiers ("java.lang.Class", "getModifiers", "()I"), java_lang_Class$isInterface ("java.lang.Class", "isInterface", "()Z"), java_lang_Class$isArray ("java.lang.Class", "isArray", "()Z"), java_lang_Class$isPrimitive ("java.lang.Class", "isPrimitive", "()Z"), java_lang_Class$getSuperclass ("java.lang.Class", "getSuperclass", "()Ljava/lang/Class;"), java_lang_Class$getComponentType ("java.lang.Class", "getComponentType", "()Ljava/lang/Class;"), // java.util.Arrays java_util_Arrays$copyOf ("java.util.Arrays", "copyOf", "([Ljava/lang/Object;I)[Ljava/lang/Object;"), // java.lang.String java_lang_String$compareTo ("java.lang.String", "compareTo", "(Ljava/lang/String;)I"), java_lang_String$indexOf ("java.lang.String", "indexOf", "(Ljava/lang/String;)I"), java_lang_String$equals ("java.lang.String", "equals", "(Ljava/lang/Object;)Z"), // java.lang.Math java_lang_Math$abs ("java.lang.Math", "abs", "(D)D"), java_lang_Math$sin ("java.lang.Math", "sin", "(D)D"), java_lang_Math$cos ("java.lang.Math", "cos", "(D)D"), java_lang_Math$tan ("java.lang.Math", "tan", "(D)D"), java_lang_Math$atan2 ("java.lang.Math", "atan2", "(DD)D"), java_lang_Math$sqrt ("java.lang.Math", "sqrt", "(D)D"), java_lang_Math$log ("java.lang.Math", "log", "(D)D"), java_lang_Math$log10 ("java.lang.Math", "log10", "(D)D"), java_lang_Math$pow ("java.lang.Math", "pow", "(DD)D"), java_lang_Math$exp ("java.lang.Math", "exp", "(D)D"), java_lang_Math$min ("java.lang.Math", "min", "(II)I"), java_lang_Math$max ("java.lang.Math", "max", "(II)I"), // java.lang.Float java_lang_Float$floatToRawIntBits ("java.lang.Float", "floatToRawIntBits", "(F)I"), java_lang_Float$floatToIntBits ("java.lang.Float", "floatToIntBits", "(F)I"), java_lang_Float$intBitsToFloat ("java.lang.Float", "intBitsToFloat", "(I)F"), // java.lang.Double java_lang_Double$doubleToRawLongBits ("java.lang.Double", "doubleToRawLongBits", "(D)J"), java_lang_Double$doubleToLongBits ("java.lang.Double", "doubleToLongBits", "(D)J"), java_lang_Double$longBitsToDouble ("java.lang.Double", "longBitsToDouble", "(J)D"), // java.lang.Integer java_lang_Integer$bitCount ("java.lang.Integer", "bitCount", "(I)I"), java_lang_Integer$reverseBytes ("java.lang.Integer", "reverseBytes", "(I)I"), // java.lang.Long java_lang_Long$bitCount ("java.lang.Long", "bitCount", "(J)I"), java_lang_Long$reverseBytes ("java.lang.Long", "reverseBytes", "(J)J"), // java.lang.System java_lang_System$identityHashCode ("java.lang.System", "identityHashCode", "(Ljava/lang/Object;)I"), java_lang_System$currentTimeMillis ("java.lang.System", "currentTimeMillis", "()J"), java_lang_System$nanoTime ("java.lang.System", "nanoTime", "()J"), java_lang_System$arraycopy ("java.lang.System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V"), // java.lang.Thread java_lang_Thread$currentThread ("java.lang.Thread", "currentThread", "()Ljava/lang/Thread;"), // java.lang.reflect.Array java_lang_reflect_Array$getLength ("java.lang.reflect.Array", "getLength", "(Ljava/lang/Object;)I"), java_lang_reflect_Array$newArray ("java.lang.reflect.Array", "newArray", "(Ljava/lang/Class;I)Ljava/lang/Object;"), // java.nio.Buffer java_nio_Buffer$checkIndex ("java.nio.Buffer", "checkIndex", "(I)I"), // sun.misc.Unsafe sun_misc_Unsafe$compareAndSwapObject ("sun.misc.Unsafe", "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z"), sun_misc_Unsafe$compareAndSwapLong ("sun.misc.Unsafe", "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z"), sun_misc_Unsafe$compareAndSwapInt ("sun.misc.Unsafe", "compareAndSwapInt", "(Ljava/lang/Object;JII)Z"); private static final HashMap<String, HashMap<String, C1XIntrinsic>> intrinsicMap = new HashMap<String, HashMap<String, C1XIntrinsic>>(100); /** * The name of the class in which this method is declared. */ public final String className; /** * The name of this intrinsic method. */ public final String methodName; /** * The signature of this intrinsic method as a string. */ public final String signature; C1XIntrinsic(String className, String methodName, String signature) { // Check that enum names are according to convention. assert className.equals(name().substring(0, name().indexOf('$')).replace('_', '.')); assert methodName.equals("<init>") || methodName.equals(name().substring(name().indexOf('$') + 1)); this.methodName = methodName; this.className = className; this.signature = signature; } static { // iterate through all the intrinsics and add them to the map for (C1XIntrinsic i : C1XIntrinsic.values()) { // note that the map uses internal names to map lookup faster String className = CiUtil.toInternalName(i.className); HashMap<String, C1XIntrinsic> map = intrinsicMap.get(className); if (map == null) { map = new HashMap<String, C1XIntrinsic>(); intrinsicMap.put(className, map); } map.put(i.methodName + i.signature, i); } } /** * Looks up an intrinsic for the specified method. * @param method the compiler interface method * @return a reference to the intrinsic for the method, if the method is an intrinsic * (and is loaded); {@code null} otherwise */ public static C1XIntrinsic getIntrinsic(RiMethod method) { RiType holder = method.holder(); if (method.isResolved() && holder.isResolved() && holder.isInitialized()) { // note that the map uses internal names to make lookup faster HashMap<String, C1XIntrinsic> map = intrinsicMap.get(holder.name()); if (map != null) { C1XIntrinsic result = map.get(method.name() + method.signature().asString()); return result; } } return null; } }