001/* 002 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 004 * 005 * This code is free software; you can redistribute it and/or modify it 006 * under the terms of the GNU General Public License version 2 only, as 007 * published by the Free Software Foundation. 008 * 009 * This code is distributed in the hope that it will be useful, but WITHOUT 010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 011 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 012 * version 2 for more details (a copy is included in the LICENSE file that 013 * accompanied this code). 014 * 015 * You should have received a copy of the GNU General Public License version 016 * 2 along with this work; if not, write to the Free Software Foundation, 017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 018 * 019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 020 * or visit www.oracle.com if you need additional information or have any 021 * questions. 022 */ 023package com.oracle.graal.hotspot; 024 025import java.lang.reflect.*; 026 027import jdk.internal.jvmci.code.*; 028import jdk.internal.jvmci.hotspot.*; 029import jdk.internal.jvmci.meta.*; 030 031import com.oracle.graal.api.replacements.*; 032import com.oracle.graal.hotspot.word.*; 033import com.oracle.graal.phases.util.*; 034import com.oracle.graal.replacements.*; 035 036/** 037 * Filters certain method substitutions based on whether there is underlying hardware support for 038 * them. 039 */ 040public class HotSpotReplacementsImpl extends ReplacementsImpl { 041 042 private final HotSpotVMConfig config; 043 044 public HotSpotReplacementsImpl(Providers providers, SnippetReflectionProvider snippetReflection, HotSpotVMConfig config, TargetDescription target) { 045 super(providers, snippetReflection, target); 046 this.config = config; 047 } 048 049 @Override 050 protected boolean hasGenericInvocationPluginAnnotation(ResolvedJavaMethod method) { 051 return method.getAnnotation(HotSpotOperation.class) != null || super.hasGenericInvocationPluginAnnotation(method); 052 } 053 054 @Override 055 protected ResolvedJavaMethod registerMethodSubstitution(ClassReplacements cr, Executable originalMethod, Method substituteMethod) { 056 final Class<?> substituteClass = substituteMethod.getDeclaringClass(); 057 if (substituteClass == IntegerSubstitutions.class || substituteClass == LongSubstitutions.class) { 058 if (substituteMethod.getName().equals("numberOfLeadingZeros")) { 059 if (config.useCountLeadingZerosInstruction) { 060 return null; 061 } 062 } else if (substituteMethod.getName().equals("numberOfTrailingZeros")) { 063 if (config.useCountTrailingZerosInstruction) { 064 return null; 065 } 066 } 067 } 068 return super.registerMethodSubstitution(cr, originalMethod, substituteMethod); 069 } 070}