/* * Copyright (c) 2017, Oracle and/or its affiliates. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials provided * with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.oracle.truffle.llvm.parser.factories; import java.util.HashMap; import java.util.Map; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.llvm.nodes.func.LLVMArgNodeGen; import com.oracle.truffle.llvm.nodes.func.LLVMAtExitNode; import com.oracle.truffle.llvm.nodes.func.LLVMBeginCatchNode; import com.oracle.truffle.llvm.nodes.func.LLVMEndCatchNode; import com.oracle.truffle.llvm.nodes.func.LLVMFreeExceptionNode; import com.oracle.truffle.llvm.nodes.func.LLVMRethrowNode; import com.oracle.truffle.llvm.nodes.func.LLVMThrowExceptionNode; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMAbortNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMAtExitNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMACosNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMASinNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMATan2NodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMATanNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMAbsNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMCeilNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMCosNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMCoshNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMExp2NodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMExpNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMFAbsNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMFloorNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMFmodNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMLAbsNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMLdexpNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMLog10NodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMLog2NodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMLogNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMModfNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMPowNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMRintNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMSinNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMSinhNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMSqrtNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMTanNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCMathsIntrinsicsFactory.LLVMTanhNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCTypeIntrinsicsFactory.LLVMIsalphaNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCTypeIntrinsicsFactory.LLVMIsspaceNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCTypeIntrinsicsFactory.LLVMIsupperNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCTypeIntrinsicsFactory.LLVMToUpperNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMCTypeIntrinsicsFactory.LLVMTolowerNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMExitNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMSignalNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMTruffleOnlyIntrinsicsFactory.LLVMStrCmpNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMTruffleOnlyIntrinsicsFactory.LLVMStrlenNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.c.LLVMTruffleReadBytesNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMSulongFunctionToNativePointerNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleAddressToFunctionNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleBinaryFactory.LLVMTruffleHasSizeNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleBinaryFactory.LLVMTruffleIsBoxedNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleBinaryFactory.LLVMTruffleIsExecutableNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleBinaryFactory.LLVMTruffleIsNullNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleExecuteNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleGetSizeNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleHandleToManagedNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleImportCachedNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleImportNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleInvokeNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleIsTruffleObjectNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleManagedMallocNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleManagedToHandleNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReadFactory.LLVMTruffleReadFromIndexNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReadFactory.LLVMTruffleReadFromNameNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReadNBytesNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReadNStringNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReadStringNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleReleaseHandleNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleUnboxNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleWriteFactory.LLVMTruffleWriteToIndexNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.interop.LLVMTruffleWriteFactory.LLVMTruffleWriteToNameNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.LLVMIntrinsicRootNodeFactory.LLVMIntrinsicExpressionNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.LLVMMemoryIntrinsicFactory.LLVMCallocNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.LLVMMemoryIntrinsicFactory.LLVMFreeNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.LLVMMemoryIntrinsicFactory.LLVMMallocNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.LLVMMemoryIntrinsicFactory.LLVMReallocNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.arith.LLVMComplexDiv; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.arith.LLVMComplexDivSC; import com.oracle.truffle.llvm.nodes.intrinsics.llvm.arith.LLVMComplexMul; import com.oracle.truffle.llvm.nodes.intrinsics.sulong.LLVMRunConstructorFunctionsNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.sulong.LLVMRunDestructorFunctionsNodeGen; import com.oracle.truffle.llvm.nodes.intrinsics.sulong.LLVMRunGlobalVariableInitalizationNodeGen; import com.oracle.truffle.llvm.runtime.LLVMContext; import com.oracle.truffle.llvm.runtime.LLVMExitException; import com.oracle.truffle.llvm.runtime.LLVMLanguage; import com.oracle.truffle.llvm.runtime.NativeIntrinsicProvider; import com.oracle.truffle.llvm.runtime.interop.ToLLVMNode; import com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode; import com.oracle.truffle.llvm.runtime.types.FunctionType; import com.oracle.truffle.llvm.runtime.types.Type; public class LLVMNativeIntrinsicsProvider implements NativeIntrinsicProvider { @Override @TruffleBoundary public final boolean isIntrinsified(String name) { return factories.containsKey(name); } @Override public final RootCallTarget generateIntrinsic(String name, FunctionType type) { CompilerAsserts.neverPartOfCompilation(); if (factories.containsKey(name)) { return factories.get(name).generate(type); } return null; } @Override public final boolean forceInline(String name) { CompilerAsserts.neverPartOfCompilation(); if (factories.containsKey(name)) { return factories.get(name).forceInline; } return false; } @Override public final boolean forceSplit(String name) { CompilerAsserts.neverPartOfCompilation(); if (factories.containsKey(name)) { return factories.get(name).forceSplit; } return false; } protected final Map<String, LLVMNativeIntrinsicFactory> factories = new HashMap<>(); protected final LLVMLanguage language; protected final LLVMContext context; public LLVMNativeIntrinsicsProvider(LLVMContext context, LLVMLanguage language) { this.language = language; this.context = context; } public abstract static class LLVMNativeIntrinsicFactory { private final boolean forceInline; private final boolean forceSplit; public LLVMNativeIntrinsicFactory(boolean forceInline, boolean forceSplit) { this.forceInline = forceInline; this.forceSplit = forceSplit; } protected abstract RootCallTarget generate(FunctionType type); } public LLVMNativeIntrinsicsProvider collectIntrinsics() { registerSulongIntrinsics(); registerTruffleIntrinsics(); registerTruffleIntrinsics(); registerAbortIntrinsics(); registerTruffleOnlyIntrinsics(); registerMathFunctionIntrinsics(); registerMemoryFunctionIntrinsics(); registerExceptionIntrinsics(); registerComplexNumberIntrinsics(); return this; } protected RootCallTarget wrap(String functionName, LLVMExpressionNode node) { return Truffle.getRuntime().createCallTarget(LLVMIntrinsicExpressionNodeGen.create(language, functionName, node)); } protected LLVMExpressionNode[] argumentsArray(int startIndex, int arity) { LLVMExpressionNode[] args = new LLVMExpressionNode[arity]; for (int i = 0; i < arity; i++) { args[i] = LLVMArgNodeGen.create(i + startIndex); } return args; } protected Type[] argumentsTypes(int startIndex, Type[] types) { Type[] args = new Type[types.length - startIndex]; for (int i = startIndex; i < types.length; i++) { args[i - startIndex] = types[i]; } return args; } protected void registerSulongIntrinsics() { factories.put("@sulong_run_global_variable_initialization", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sulong_run_global_variable_initialization", LLVMRunGlobalVariableInitalizationNodeGen.create()); } }); factories.put("@sulong_run_constructor_functions", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sulong_run_constructor_functions", LLVMRunConstructorFunctionsNodeGen.create()); } }); factories.put("@sulong_run_destructor_functions", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sulong_run_destructor_functions", LLVMRunDestructorFunctionsNodeGen.create()); } }); } protected void registerTruffleIntrinsics() { factories.put("@truffle_write", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_i", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_l", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_c", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_f", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("truffle_write_d", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_b", LLVMTruffleWriteToNameNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_i", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_l", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_c", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_f", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_d", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_write_idx_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_write_idx_b", LLVMTruffleWriteToIndexNodeGen.create(type.getArgumentTypes()[2], LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@truffle_read", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(TruffleObject.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_i", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(int.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_l", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(long.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_c", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(byte.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_f", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(float.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_d", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(double.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_b", LLVMTruffleReadFromNameNodeGen.create(ToLLVMNode.createNode(boolean.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(TruffleObject.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_i", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(int.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_l", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(long.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_c", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(byte.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_f", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(float.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_d", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(double.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_idx_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_idx_b", LLVMTruffleReadFromIndexNodeGen.create(ToLLVMNode.createNode(boolean.class), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_unbox_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_i", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(int.class), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_unbox_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_l", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(long.class), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_unbox_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_c", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(byte.class), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_unbox_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_f", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(float.class), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_unbox_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_d", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(double.class), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_unbox_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_unbox_b", LLVMTruffleUnboxNodeGen.create(ToLLVMNode.createNode(boolean.class), LLVMArgNodeGen.create(0))); } }); // factories.put("@truffle_invoke", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(TruffleObject.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_i", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(int.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_l", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(long.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_c", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(byte.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_f", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(float.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_d", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(double.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_invoke_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_invoke_b", LLVMTruffleInvokeNodeGen.create(ToLLVMNode.createNode(boolean.class), argumentsArray(2, type.getArgumentTypes().length - 2), argumentsTypes(2, type.getArgumentTypes()), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); // factories.put("@truffle_execute", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(TruffleObject.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_i", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_i", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(int.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_l", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_l", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(long.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_c", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_c", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(byte.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_f", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_f", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(float.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_d", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_d", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(double.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_execute_b", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_execute_b", LLVMTruffleExecuteNodeGen.create(ToLLVMNode.createNode(boolean.class), argumentsArray(1, type.getArgumentTypes().length - 1), argumentsTypes(1, type.getArgumentTypes()), LLVMArgNodeGen.create(0))); } }); // factories.put("@truffle_import", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_import", LLVMTruffleImportNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_import_cached", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_import_cached", LLVMTruffleImportCachedNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_address_to_function", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_address_to_function", LLVMTruffleAddressToFunctionNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_is_executable", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_is_executable", LLVMTruffleIsExecutableNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_is_null", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_is_null", LLVMTruffleIsNullNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_has_size", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_has_size", LLVMTruffleHasSizeNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_is_boxed", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_is_boxed", LLVMTruffleIsBoxedNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_get_size", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_get_size", LLVMTruffleGetSizeNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_read_string", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_string", LLVMTruffleReadStringNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_read_n_string", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_n_string", LLVMTruffleReadNStringNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_read_bytes", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_bytes", LLVMTruffleReadBytesNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_read_n_bytes", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_read_n_bytes", LLVMTruffleReadNBytesNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@truffle_is_truffle_object", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_is_truffle_object", LLVMTruffleIsTruffleObjectNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_managed_malloc", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_managed_malloc", LLVMTruffleManagedMallocNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_handle_for_managed", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_handle_for_managed", LLVMTruffleManagedToHandleNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_release_handle", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_release_handle", LLVMTruffleReleaseHandleNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_managed_from_handle", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_managed_from_handle", LLVMTruffleHandleToManagedNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@truffle_sulong_function_to_native_pointer", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@truffle_sulong_function_to_native_pointer", LLVMSulongFunctionToNativePointerNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); } protected void registerAbortIntrinsics() { factories.put("@_gfortran_abort", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@_gfortran_abort", LLVMAbortNodeGen.create()); } }); factories.put("@abort", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@abort", LLVMAbortNodeGen.create()); } }); factories.put("@exit", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@exit", LLVMExitNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@atexit", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@atexit", LLVMAtExitNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@signal", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@signal", LLVMSignalNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); } protected void registerTruffleOnlyIntrinsics() { factories.put("@strlen", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@strlen", LLVMStrlenNodeGen.create(context.getNativeLookup().getNativeFunction("@strlen"), LLVMArgNodeGen.create(0))); } }); factories.put("@strcmp", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@strcmp", LLVMStrCmpNodeGen.create(context.getNativeLookup().getNativeFunction("@strcmp"), LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); } protected void registerMathFunctionIntrinsics() { factories.put("@log2", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@log2", LLVMLog2NodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@sqrt", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sqrt", LLVMSqrtNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@log", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@log", LLVMLogNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@log10", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@log10", LLVMLog10NodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@rint", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@rint", LLVMRintNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@ceil", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@ceil", LLVMCeilNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@floor", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@floor", LLVMFloorNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@abs", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@abs", LLVMAbsNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@labs", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@labs", LLVMLAbsNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@fabs", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@fabs", LLVMFAbsNodeGen.create(LLVMArgNodeGen.create(0), null)); } }); factories.put("@pow", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@pow", LLVMPowNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), null)); } }); factories.put("@exp", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@exp", LLVMExpNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@exp2", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@exp2", LLVMExp2NodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@sin", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sin", LLVMSinNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@sinf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sinf", LLVMSinNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@cos", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@cos", LLVMCosNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@cosf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@cosf", LLVMCosNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@tan", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@tan", LLVMTanNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@tanf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@tanf", LLVMTanNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@atan2", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@atan2", LLVMATan2NodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@atan2f", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@atan2f", LLVMATan2NodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@asin", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@asin", LLVMASinNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@asinf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@asinf", LLVMASinNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@acos", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@acos", LLVMACosNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@acosf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@acosf", LLVMACosNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@atan", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@atan", LLVMATanNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@atanf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@atanf", LLVMATanNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@sinh", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sinh", LLVMSinhNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@sinhf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@sinhf", LLVMSinhNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@cosh", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@cosh", LLVMCoshNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@coshf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@coshf", LLVMCoshNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@tanh", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@tanh", LLVMTanhNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@tanhf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@tanhf", LLVMTanhNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@ldexp", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@ldexp", LLVMLdexpNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@modf", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@modf", LLVMModfNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@fmod", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@fmod", LLVMFmodNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); } protected void registerCTypeIntrinsics() { factories.put("@isalpha", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@isalpha", LLVMIsalphaNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@tolower", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@tolower", LLVMTolowerNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@toupper", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@toupper", LLVMToUpperNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@isspace", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@isspace", LLVMIsspaceNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@isupper", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@isupper", LLVMIsupperNodeGen.create(LLVMArgNodeGen.create(0))); } }); } protected void registerMemoryFunctionIntrinsics() { factories.put("@malloc", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@malloc", LLVMMallocNodeGen.create(LLVMArgNodeGen.create(0))); } }); factories.put("@calloc", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@calloc", LLVMCallocNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@realloc", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@realloc", LLVMReallocNodeGen.create(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1))); } }); factories.put("@free", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@free", LLVMFreeNodeGen.create(LLVMArgNodeGen.create(0))); } }); } protected void registerExceptionIntrinsics() { factories.put("@__cxa_throw", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_throw", new LLVMThrowExceptionNode(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@__cxa_rethrow", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_rethrow", new LLVMRethrowNode()); } }); factories.put("@__cxa_begin_catch", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_begin_catch", new LLVMBeginCatchNode(LLVMArgNodeGen.create(0))); } }); factories.put("@__cxa_end_catch", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_end_catch", new LLVMEndCatchNode()); } }); factories.put("@__cxa_free_exception", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_free_exception", new LLVMFreeExceptionNode(LLVMArgNodeGen.create(0))); } }); factories.put("@__cxa_atexit", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_atexit", new LLVMAtExitNode(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2))); } }); factories.put("@__cxa_call_unexpected", new LLVMNativeIntrinsicFactory(true, true) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__cxa_call_unexpected", new LLVMExpressionNode() { @Override public Object executeGeneric(VirtualFrame frame) { throw new LLVMExitException(134); } }); } }); } public void registerComplexNumberIntrinsics() { factories.put("@__divdc3", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__divdc3", new LLVMComplexDiv(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2), LLVMArgNodeGen.create(3), LLVMArgNodeGen.create(4))); } }); factories.put("@__muldc3", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__muldc3", new LLVMComplexMul(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2), LLVMArgNodeGen.create(3), LLVMArgNodeGen.create(4))); } }); factories.put("@__divsc3", new LLVMNativeIntrinsicFactory(true, false) { @Override protected RootCallTarget generate(FunctionType type) { return wrap("@__divsc3", new LLVMComplexDivSC(LLVMArgNodeGen.create(0), LLVMArgNodeGen.create(1), LLVMArgNodeGen.create(2), LLVMArgNodeGen.create(3))); } }); } }