xref: /llvm-project/flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp (revision 5aaf384b1614fcef5504d0b16d3e5063f72943c1)
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-exception
6 //
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 other
17 // file(s).
18 //
19 //===----------------------------------------------------------------------===//
20 
21 #include "flang/Optimizer/Builder/LowLevelIntrinsics.h"
22 #include "flang/Optimizer/Builder/FIRBuilder.h"
23 
24 mlir::func::FuncOp fir::factory::getLlvmMemcpy(fir::FirOpBuilder &builder) {
25   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
26   llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(),
27                                         builder.getI1Type()};
28   auto memcpyTy =
29       mlir::FunctionType::get(builder.getContext(), args, std::nullopt);
30   return builder.createFunction(builder.getUnknownLoc(),
31                                 "llvm.memcpy.p0.p0.i64", memcpyTy);
32 }
33 
34 mlir::func::FuncOp fir::factory::getLlvmMemmove(fir::FirOpBuilder &builder) {
35   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
36   llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(),
37                                         builder.getI1Type()};
38   auto memmoveTy =
39       mlir::FunctionType::get(builder.getContext(), args, std::nullopt);
40   return builder.createFunction(builder.getUnknownLoc(),
41                                 "llvm.memmove.p0.p0.i64", memmoveTy);
42 }
43 
44 mlir::func::FuncOp fir::factory::getLlvmMemset(fir::FirOpBuilder &builder) {
45   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
46   llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(),
47                                         builder.getI1Type()};
48   auto memsetTy =
49       mlir::FunctionType::get(builder.getContext(), args, std::nullopt);
50   return builder.createFunction(builder.getUnknownLoc(),
51                                 "llvm.memset.p0.p0.i64", memsetTy);
52 }
53 
54 mlir::func::FuncOp fir::factory::getRealloc(fir::FirOpBuilder &builder) {
55   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
56   llvm::SmallVector<mlir::Type> args = {ptrTy, builder.getI64Type()};
57   auto reallocTy = mlir::FunctionType::get(builder.getContext(), args, {ptrTy});
58   return builder.createFunction(builder.getUnknownLoc(), "realloc", reallocTy);
59 }
60 
61 mlir::func::FuncOp
62 fir::factory::getLlvmGetRounding(fir::FirOpBuilder &builder) {
63   auto int32Ty = builder.getIntegerType(32);
64   auto funcTy =
65       mlir::FunctionType::get(builder.getContext(), std::nullopt, {int32Ty});
66   return builder.createFunction(builder.getUnknownLoc(), "llvm.get.rounding",
67                                 funcTy);
68 }
69 
70 mlir::func::FuncOp
71 fir::factory::getLlvmSetRounding(fir::FirOpBuilder &builder) {
72   auto int32Ty = builder.getIntegerType(32);
73   auto funcTy =
74       mlir::FunctionType::get(builder.getContext(), {int32Ty}, std::nullopt);
75   return builder.createFunction(builder.getUnknownLoc(), "llvm.set.rounding",
76                                 funcTy);
77 }
78 
79 mlir::func::FuncOp
80 fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) {
81   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
82   auto funcTy = mlir::FunctionType::get(builder.getContext(),
83                                         {ptrTy, ptrTy, ptrTy}, std::nullopt);
84   return builder.createFunction(builder.getUnknownLoc(), "llvm.init.trampoline",
85                                 funcTy);
86 }
87 
88 mlir::func::FuncOp
89 fir::factory::getLlvmAdjustTrampoline(fir::FirOpBuilder &builder) {
90   auto ptrTy = builder.getRefType(builder.getIntegerType(8));
91   auto funcTy = mlir::FunctionType::get(builder.getContext(), {ptrTy}, {ptrTy});
92   return builder.createFunction(builder.getUnknownLoc(),
93                                 "llvm.adjust.trampoline", funcTy);
94 }
95 
96 mlir::func::FuncOp fir::factory::getFeclearexcept(fir::FirOpBuilder &builder) {
97   auto int32Ty = builder.getIntegerType(32);
98   auto funcTy =
99       mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
100   return builder.createFunction(builder.getUnknownLoc(), "feclearexcept",
101                                 funcTy);
102 }
103 
104 mlir::func::FuncOp
105 fir::factory::getFedisableexcept(fir::FirOpBuilder &builder) {
106   auto int32Ty = builder.getIntegerType(32);
107   auto funcTy =
108       mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
109   return builder.createFunction(builder.getUnknownLoc(), "fedisableexcept",
110                                 funcTy);
111 }
112 
113 mlir::func::FuncOp fir::factory::getFeenableexcept(fir::FirOpBuilder &builder) {
114   auto int32Ty = builder.getIntegerType(32);
115   auto funcTy =
116       mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
117   return builder.createFunction(builder.getUnknownLoc(), "feenableexcept",
118                                 funcTy);
119 }
120 
121 mlir::func::FuncOp fir::factory::getFegetexcept(fir::FirOpBuilder &builder) {
122   auto int32Ty = builder.getIntegerType(32);
123   auto funcTy =
124       mlir::FunctionType::get(builder.getContext(), std::nullopt, {int32Ty});
125   return builder.createFunction(builder.getUnknownLoc(), "fegetexcept", funcTy);
126 }
127 
128 mlir::func::FuncOp fir::factory::getFeraiseexcept(fir::FirOpBuilder &builder) {
129   auto int32Ty = builder.getIntegerType(32);
130   auto funcTy =
131       mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
132   return builder.createFunction(builder.getUnknownLoc(), "feraiseexcept",
133                                 funcTy);
134 }
135 
136 mlir::func::FuncOp fir::factory::getFetestexcept(fir::FirOpBuilder &builder) {
137   auto int32Ty = builder.getIntegerType(32);
138   auto funcTy =
139       mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
140   return builder.createFunction(builder.getUnknownLoc(), "fetestexcept",
141                                 funcTy);
142 }
143