110 lines · cpp
1//===-- LowLevelIntrinsics.cpp --------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/10//11//===----------------------------------------------------------------------===//12//13// Low level intrinsic functions.14//15// These include LLVM intrinsic calls and standard C library calls.16// Target-specific calls, such as OS functions, should be factored in other17// file(s).18//19//===----------------------------------------------------------------------===//20 21#include "flang/Optimizer/Builder/LowLevelIntrinsics.h"22#include "flang/Optimizer/Builder/FIRBuilder.h"23 24mlir::func::FuncOp fir::factory::getRealloc(fir::FirOpBuilder &builder) {25 auto ptrTy = builder.getRefType(builder.getIntegerType(8));26 llvm::SmallVector<mlir::Type> args = {ptrTy, builder.getI64Type()};27 auto reallocTy = mlir::FunctionType::get(builder.getContext(), args, {ptrTy});28 return builder.createFunction(builder.getUnknownLoc(), "realloc", reallocTy);29}30 31mlir::func::FuncOp32fir::factory::getLlvmGetRounding(fir::FirOpBuilder &builder) {33 auto int32Ty = builder.getIntegerType(32);34 auto funcTy = mlir::FunctionType::get(builder.getContext(), {}, {int32Ty});35 return builder.createFunction(builder.getUnknownLoc(), "llvm.get.rounding",36 funcTy);37}38 39mlir::func::FuncOp40fir::factory::getLlvmSetRounding(fir::FirOpBuilder &builder) {41 auto int32Ty = builder.getIntegerType(32);42 auto funcTy = mlir::FunctionType::get(builder.getContext(), {int32Ty}, {});43 return builder.createFunction(builder.getUnknownLoc(), "llvm.set.rounding",44 funcTy);45}46 47mlir::func::FuncOp48fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) {49 auto ptrTy = builder.getRefType(builder.getIntegerType(8));50 auto funcTy =51 mlir::FunctionType::get(builder.getContext(), {ptrTy, ptrTy, ptrTy}, {});52 return builder.createFunction(builder.getUnknownLoc(), "llvm.init.trampoline",53 funcTy);54}55 56mlir::func::FuncOp57fir::factory::getLlvmAdjustTrampoline(fir::FirOpBuilder &builder) {58 auto ptrTy = builder.getRefType(builder.getIntegerType(8));59 auto funcTy = mlir::FunctionType::get(builder.getContext(), {ptrTy}, {ptrTy});60 return builder.createFunction(builder.getUnknownLoc(),61 "llvm.adjust.trampoline", funcTy);62}63 64mlir::func::FuncOp fir::factory::getFeclearexcept(fir::FirOpBuilder &builder) {65 auto int32Ty = builder.getIntegerType(32);66 auto funcTy =67 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});68 return builder.createFunction(builder.getUnknownLoc(), "feclearexcept",69 funcTy);70}71 72mlir::func::FuncOp73fir::factory::getFedisableexcept(fir::FirOpBuilder &builder) {74 auto int32Ty = builder.getIntegerType(32);75 auto funcTy =76 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});77 return builder.createFunction(builder.getUnknownLoc(), "fedisableexcept",78 funcTy);79}80 81mlir::func::FuncOp fir::factory::getFeenableexcept(fir::FirOpBuilder &builder) {82 auto int32Ty = builder.getIntegerType(32);83 auto funcTy =84 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});85 return builder.createFunction(builder.getUnknownLoc(), "feenableexcept",86 funcTy);87}88 89mlir::func::FuncOp fir::factory::getFegetexcept(fir::FirOpBuilder &builder) {90 auto int32Ty = builder.getIntegerType(32);91 auto funcTy = mlir::FunctionType::get(builder.getContext(), {}, {int32Ty});92 return builder.createFunction(builder.getUnknownLoc(), "fegetexcept", funcTy);93}94 95mlir::func::FuncOp fir::factory::getFeraiseexcept(fir::FirOpBuilder &builder) {96 auto int32Ty = builder.getIntegerType(32);97 auto funcTy =98 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});99 return builder.createFunction(builder.getUnknownLoc(), "feraiseexcept",100 funcTy);101}102 103mlir::func::FuncOp fir::factory::getFetestexcept(fir::FirOpBuilder &builder) {104 auto int32Ty = builder.getIntegerType(32);105 auto funcTy =106 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});107 return builder.createFunction(builder.getUnknownLoc(), "fetestexcept",108 funcTy);109}110