39 ExceptionModel = TT.getDefaultExceptionHandling();
41 initLibcalls(TT, ExceptionModel,
FloatABI, EABIVersion, ABIName);
46 for (RTLIB::LibcallImpl Impl :
47 {RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
48 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
49 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
50 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
51 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
52 RTLIB::impl__ZGVsNxvl4l4_sincospif,
53 RTLIB::impl__ZGVsNxvl8l8_sincospi})
57 for (RTLIB::LibcallImpl Impl :
58 {RTLIB::impl_armpl_vmodfq_f64, RTLIB::impl_armpl_vmodfq_f32,
59 RTLIB::impl_armpl_svmodf_f64_x, RTLIB::impl_armpl_svmodf_f32_x,
60 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
61 RTLIB::impl_armpl_svsincos_f64_x, RTLIB::impl_armpl_svsincos_f32_x,
62 RTLIB::impl_armpl_vsincospiq_f32, RTLIB::impl_armpl_vsincospiq_f64,
63 RTLIB::impl_armpl_svsincospi_f32_x,
64 RTLIB::impl_armpl_svsincospi_f64_x})
67 for (RTLIB::LibcallImpl Impl :
68 {RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32})
136 RTLIB::LibcallImpl LibcallImpl)
const {
138 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
139 Attribute::NoUnwind, Attribute::WillReturn};
141 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
143 switch (LibcallImpl) {
144 case RTLIB::impl___sincos_stret:
145 case RTLIB::impl___sincosf_stret: {
146 if (!darwinHasSinCosStret(TT))
149 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
153 AttrBuilder FuncAttrBuilder(Ctx);
155 FuncAttrBuilder.addAttribute(Attr);
158 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
165 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
168 AttrBuilder AttrBuilder(Ctx);
170 AttrBuilder.addStructRetAttr(StructTy);
171 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
175 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
179 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
185 case RTLIB::impl_sqrtf:
186 case RTLIB::impl_sqrt: {
187 AttrBuilder FuncAttrBuilder(Ctx);
190 FuncAttrBuilder.addAttribute(Attr);
194 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
200 Attrs = Attrs.addRetAttribute(
203 return {FuncTy, Attrs};
205 case RTLIB::impl__ZGVnN2vl8_modf:
206 case RTLIB::impl__ZGVnN4vl4_modff:
207 case RTLIB::impl__ZGVsNxvl8_modf:
208 case RTLIB::impl__ZGVsNxvl4_modff:
209 case RTLIB::impl_armpl_vmodfq_f64:
210 case RTLIB::impl_armpl_vmodfq_f32:
211 case RTLIB::impl_armpl_svmodf_f64_x:
212 case RTLIB::impl_armpl_svmodf_f32_x: {
213 AttrBuilder FuncAttrBuilder(Ctx);
215 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
216 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
217 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
218 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
220 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
221 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
222 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
223 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
226 unsigned EC = IsF32 ? 4 : 2;
230 FuncAttrBuilder.addAttribute(Attr);
234 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
237 AttrBuilder ArgAttrBuilder(Ctx);
239 ArgAttrBuilder.addAttribute(AK);
240 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
241 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
251 case RTLIB::impl__ZGVnN2vl8l8_sincos:
252 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
253 case RTLIB::impl__ZGVsNxvl8l8_sincos:
254 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
255 case RTLIB::impl_armpl_vsincosq_f64:
256 case RTLIB::impl_armpl_vsincosq_f32:
257 case RTLIB::impl_armpl_svsincos_f64_x:
258 case RTLIB::impl_armpl_svsincos_f32_x:
259 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
260 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
261 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
262 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
263 case RTLIB::impl_armpl_vsincospiq_f32:
264 case RTLIB::impl_armpl_vsincospiq_f64:
265 case RTLIB::impl_armpl_svsincospi_f32_x:
266 case RTLIB::impl_armpl_svsincospi_f64_x: {
267 AttrBuilder FuncAttrBuilder(Ctx);
269 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
270 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
271 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
272 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
273 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
274 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
275 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
276 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
279 unsigned EC = IsF32 ? 4 : 2;
281 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
282 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
283 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
284 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
285 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
286 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
287 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
288 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
292 FuncAttrBuilder.addAttribute(Attr);
296 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
299 AttrBuilder ArgAttrBuilder(Ctx);
301 ArgAttrBuilder.addAttribute(AK);
302 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
303 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
304 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);
This is an important class for using LLVM in a threaded context.