/* * Copyright (c) 2016, 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 com.oracle.truffle.api.frame.FrameSlot; import com.oracle.truffle.api.source.SourceSection; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVM80BitFloatReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMAddressReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMDoubleReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMFloatReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMFunctionReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMI16ReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMI1ReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMI32ReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMI64ReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMI8ReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadNodeFactory.LLVMIReadVarBitNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMDoubleVectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMFloatVectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMI16VectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMI1VectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMI32VectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMI64VectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMReadVectorNodeFactory.LLVMI8VectorReadNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWrite80BitFloatingNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteAddressNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteDoubleNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteFloatNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteFunctionNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteI16NodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteI1NodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteI32NodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteI64NodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteI8NodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteNodeFactory.LLVMWriteIVarBitNodeGen; import com.oracle.truffle.llvm.nodes.vars.LLVMWriteVectorNodeGen; import com.oracle.truffle.llvm.runtime.LLVMUnsupportedException; import com.oracle.truffle.llvm.runtime.LLVMUnsupportedException.UnsupportedReason; import com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode; import com.oracle.truffle.llvm.runtime.types.ArrayType; import com.oracle.truffle.llvm.runtime.types.PointerType; import com.oracle.truffle.llvm.runtime.types.PrimitiveType; import com.oracle.truffle.llvm.runtime.types.StructureType; import com.oracle.truffle.llvm.runtime.types.Type; import com.oracle.truffle.llvm.runtime.types.VariableBitWidthType; import com.oracle.truffle.llvm.runtime.types.VectorType; import com.oracle.truffle.llvm.runtime.types.VoidType; final class LLVMFrameReadWriteFactory { private LLVMFrameReadWriteFactory() { } static LLVMExpressionNode createFrameRead(Type llvmType, FrameSlot frameSlot) { if (llvmType instanceof PrimitiveType) { switch (((PrimitiveType) llvmType).getPrimitiveKind()) { case I1: return LLVMI1ReadNodeGen.create(frameSlot); case I8: return LLVMI8ReadNodeGen.create(frameSlot); case I16: return LLVMI16ReadNodeGen.create(frameSlot); case I32: return LLVMI32ReadNodeGen.create(frameSlot); case I64: return LLVMI64ReadNodeGen.create(frameSlot); case FLOAT: return LLVMFloatReadNodeGen.create(frameSlot); case DOUBLE: return LLVMDoubleReadNodeGen.create(frameSlot); case X86_FP80: return LLVM80BitFloatReadNodeGen.create(frameSlot); } } else if (llvmType instanceof VectorType) { switch (((VectorType) llvmType).getElementType().getPrimitiveKind()) { case I1: return LLVMI1VectorReadNodeGen.create(frameSlot); case I8: return LLVMI8VectorReadNodeGen.create(frameSlot); case I16: return LLVMI16VectorReadNodeGen.create(frameSlot); case I32: return LLVMI32VectorReadNodeGen.create(frameSlot); case I64: return LLVMI64VectorReadNodeGen.create(frameSlot); case FLOAT: return LLVMFloatVectorReadNodeGen.create(frameSlot); case DOUBLE: return LLVMDoubleVectorReadNodeGen.create(frameSlot); } } else if (llvmType instanceof VariableBitWidthType) { return LLVMIReadVarBitNodeGen.create(frameSlot); } else if (Type.isFunctionOrFunctionPointer(llvmType)) { return LLVMFunctionReadNodeGen.create(frameSlot); } else if (llvmType instanceof PointerType) { return LLVMAddressReadNodeGen.create(frameSlot); } else if (llvmType instanceof StructureType || llvmType instanceof ArrayType) { return LLVMAddressReadNodeGen.create(frameSlot); } else if (llvmType instanceof VoidType) { throw new LLVMUnsupportedException(UnsupportedReason.PARSER_ERROR_VOID_SLOT); } throw new AssertionError(llvmType + " for " + frameSlot.getIdentifier()); } static LLVMExpressionNode createFrameWrite(Type llvmType, LLVMExpressionNode result, FrameSlot slot, SourceSection source) { if (llvmType instanceof VectorType) { return LLVMWriteVectorNodeGen.create(source, result, slot); } else if (llvmType instanceof PrimitiveType) { return handlePrimitive(llvmType, result, slot, source); } else if (llvmType instanceof VariableBitWidthType) { return LLVMWriteIVarBitNodeGen.create(result, slot, source); } else if (Type.isFunctionOrFunctionPointer(llvmType)) { return LLVMWriteFunctionNodeGen.create(result, slot, source); } else if (llvmType instanceof PointerType) { return LLVMWriteAddressNodeGen.create(result, slot, source); } else if (llvmType instanceof StructureType || llvmType instanceof ArrayType) { return LLVMWriteAddressNodeGen.create(result, slot, source); } throw new AssertionError(llvmType); } private static LLVMExpressionNode handlePrimitive(Type llvmType, LLVMExpressionNode result, FrameSlot slot, SourceSection source) throws AssertionError { switch (((PrimitiveType) llvmType).getPrimitiveKind()) { case I1: return LLVMWriteI1NodeGen.create(result, slot, source); case I8: return LLVMWriteI8NodeGen.create(result, slot, source); case I16: return LLVMWriteI16NodeGen.create(result, slot, source); case I32: return LLVMWriteI32NodeGen.create(result, slot, source); case I64: return LLVMWriteI64NodeGen.create(result, slot, source); case FLOAT: return LLVMWriteFloatNodeGen.create(result, slot, source); case DOUBLE: return LLVMWriteDoubleNodeGen.create(result, slot, source); case X86_FP80: return LLVMWrite80BitFloatingNodeGen.create(result, slot, source); default: throw new AssertionError(llvmType); } } }