LLVM: lib/IR/RuntimeLibcalls.cpp Source File (original) (raw)

34

35

36

37

39 ExceptionModel = TT.getDefaultExceptionHandling();

40

41 initLibcalls(TT, ExceptionModel, FloatABI, EABIVersion, ABIName);

42

43

44 switch (VecLib) {

46 for (RTLIB::LibcallImpl Impl :

47 {RTLIB::impl__ZGVnN2vv_fmod, RTLIB::impl__ZGVnN4vv_fmodf,

48 RTLIB::impl__ZGVsMxvv_fmod, RTLIB::impl__ZGVsMxvv_fmodf,

49 RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,

50 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,

51 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,

52 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,

53 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,

54 RTLIB::impl__ZGVsNxvl4l4_sincospif,

55 RTLIB::impl__ZGVsNxvl8l8_sincospi})

57 break;

59 for (RTLIB::LibcallImpl Impl :

60 {RTLIB::impl_armpl_svfmod_f32_x, RTLIB::impl_armpl_svfmod_f64_x,

61 RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,

62 RTLIB::impl_armpl_vmodfq_f64, RTLIB::impl_armpl_vmodfq_f32,

63 RTLIB::impl_armpl_svmodf_f64_x, RTLIB::impl_armpl_svmodf_f32_x,

64 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,

65 RTLIB::impl_armpl_svsincos_f64_x, RTLIB::impl_armpl_svsincos_f32_x,

66 RTLIB::impl_armpl_vsincospiq_f32, RTLIB::impl_armpl_vsincospiq_f64,

67 RTLIB::impl_armpl_svsincospi_f32_x,

68 RTLIB::impl_armpl_svsincospi_f64_x})

70

71 for (RTLIB::LibcallImpl Impl :

72 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,

73 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32})

75 break;

76 default:

77 break;

78 }

79}

141 return DL.getIndexType(Ctx, 0);

142}

147 RTLIB::LibcallImpl LibcallImpl) const {

148

150 Attribute::MustProgress, Attribute::NoCallback, Attribute::NoFree,

151 Attribute::NoSync, Attribute::NoUnwind, Attribute::WillReturn};

153 Attribute::MustProgress, Attribute::NoUnwind, Attribute::WillReturn};

155 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};

156

157 switch (LibcallImpl) {

158 case RTLIB::impl___sincos_stret:

159 case RTLIB::impl___sincosf_stret: {

160 if (!darwinHasSinCosStret(TT))

161 return {};

162

163 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret

166

167 AttrBuilder FuncAttrBuilder(Ctx);

169 FuncAttrBuilder.addAttribute(Attr);

170

171 const bool UseSret =

172 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&

174

177

178 AttributeList Attrs;

179 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

180

181 if (UseSret) {

182 AttrBuilder AttrBuilder(Ctx);

184 AttrBuilder.addStructRetAttr(StructTy);

185 AttrBuilder.addAlignmentAttr(DL.getABITypeAlign(StructTy));

187 Type::getVoidTy(Ctx), {DL.getAllocaPtrType(Ctx), ScalarTy}, false);

188

189 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};

190 }

191

192 Type *RetTy =

193 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()

196

198 }

199 case RTLIB::impl_malloc:

200 case RTLIB::impl_calloc: {

201 AttrBuilder FuncAttrBuilder(Ctx);

203 FuncAttrBuilder.addAttribute(Attr);

204 FuncAttrBuilder.addAttribute(Attribute::NoFree);

205

207 if (LibcallImpl == RTLIB::impl_malloc)

209

210

211 FuncAttrBuilder.addAllocKindAttr(AllocKind);

212 FuncAttrBuilder.addAttribute("alloc-family", "malloc");

213 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc

214 ? std::nullopt

215 : std::make_optional(1));

216

217 AttributeList Attrs;

218 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

219

220 {

221 AttrBuilder ArgAttrBuilder(Ctx);

223 ArgAttrBuilder.addAttribute(AK);

224

225 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);

226 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);

227 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);

228 if (LibcallImpl == RTLIB::impl_calloc)

229 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);

230 }

231

235 if (LibcallImpl == RTLIB::impl_calloc)

237

239 }

240 case RTLIB::impl_free: {

241

242 AttrBuilder FuncAttrBuilder(Ctx);

244 FuncAttrBuilder.addAttribute(Attr);

245

247 FuncAttrBuilder.addAttribute("alloc-family", "malloc");

248

249 AttributeList Attrs;

250 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

251

252 {

253 AttrBuilder ArgAttrBuilder(Ctx);

254 ArgAttrBuilder.addAttribute(Attribute::NoUndef);

255 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);

257 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);

258 }

259

261 false),

262 Attrs};

263 }

264 case RTLIB::impl_sqrtf:

265 case RTLIB::impl_sqrt: {

266 AttrBuilder FuncAttrBuilder(Ctx);

267

269 FuncAttrBuilder.addAttribute(Attr);

271

272 AttributeList Attrs;

273 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

274

278

279 Attrs = Attrs.addRetAttribute(

282 return {FuncTy, Attrs};

283 }

284 case RTLIB::impl__ZGVnN2vv_fmod:

285 case RTLIB::impl__ZGVnN4vv_fmodf:

286 case RTLIB::impl__ZGVsMxvv_fmod:

287 case RTLIB::impl__ZGVsMxvv_fmodf:

288 case RTLIB::impl_armpl_vfmodq_f32:

289 case RTLIB::impl_armpl_vfmodq_f64:

290 case RTLIB::impl_armpl_svfmod_f32_x:

291 case RTLIB::impl_armpl_svfmod_f64_x: {

292 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||

293 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||

294 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||

295 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32;

296

297 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||

298 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||

299 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||

300 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x;

301

302 AttrBuilder FuncAttrBuilder(Ctx);

303

305 FuncAttrBuilder.addAttribute(Attr);

306

307 AttributeList Attrs;

308 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

309

311 unsigned EC = IsF32 ? 4 : 2;

313

317

319 return {FuncTy, Attrs};

320 }

321 case RTLIB::impl__ZGVnN2vl8_modf:

322 case RTLIB::impl__ZGVnN4vl4_modff:

323 case RTLIB::impl__ZGVsNxvl8_modf:

324 case RTLIB::impl__ZGVsNxvl4_modff:

325 case RTLIB::impl_armpl_vmodfq_f64:

326 case RTLIB::impl_armpl_vmodfq_f32:

327 case RTLIB::impl_armpl_svmodf_f64_x:

328 case RTLIB::impl_armpl_svmodf_f32_x: {

329 AttrBuilder FuncAttrBuilder(Ctx);

330

331 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||

332 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||

333 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||

334 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;

335

336 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||

337 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||

338 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||

339 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;

340

342 unsigned EC = IsF32 ? 4 : 2;

344

346 FuncAttrBuilder.addAttribute(Attr);

348

349 AttributeList Attrs;

350 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

351

352 {

353 AttrBuilder ArgAttrBuilder(Ctx);

355 ArgAttrBuilder.addAttribute(AK);

356 ArgAttrBuilder.addAlignmentAttr(DL.getABITypeAlign(VecTy));

357 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);

358 }

359

364

366 }

367 case RTLIB::impl__ZGVnN2vl8l8_sincos:

368 case RTLIB::impl__ZGVnN4vl4l4_sincosf:

369 case RTLIB::impl__ZGVsNxvl8l8_sincos:

370 case RTLIB::impl__ZGVsNxvl4l4_sincosf:

371 case RTLIB::impl_armpl_vsincosq_f64:

372 case RTLIB::impl_armpl_vsincosq_f32:

373 case RTLIB::impl_armpl_svsincos_f64_x:

374 case RTLIB::impl_armpl_svsincos_f32_x:

375 case RTLIB::impl__ZGVnN4vl4l4_sincospif:

376 case RTLIB::impl__ZGVnN2vl8l8_sincospi:

377 case RTLIB::impl__ZGVsNxvl4l4_sincospif:

378 case RTLIB::impl__ZGVsNxvl8l8_sincospi:

379 case RTLIB::impl_armpl_vsincospiq_f32:

380 case RTLIB::impl_armpl_vsincospiq_f64:

381 case RTLIB::impl_armpl_svsincospi_f32_x:

382 case RTLIB::impl_armpl_svsincospi_f64_x: {

383 AttrBuilder FuncAttrBuilder(Ctx);

384

385 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||

386 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||

387 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||

388 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||

389 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||

390 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||

391 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||

392 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;

393

395 unsigned EC = IsF32 ? 4 : 2;

396

397 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||

398 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||

399 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||

400 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||

401 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||

402 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||

403 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||

404 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;

406

408 FuncAttrBuilder.addAttribute(Attr);

410

411 AttributeList Attrs;

412 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);

413

414 {

415 AttrBuilder ArgAttrBuilder(Ctx);

417 ArgAttrBuilder.addAttribute(AK);

418 ArgAttrBuilder.addAlignmentAttr(DL.getABITypeAlign(VecTy));

419 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);

420 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);

421 }

422

427

429 }

430 default:

431 return {};

432 }

433

434 return {};

435}

438

439

440 switch (Impl) {

441 case RTLIB::impl_armpl_svfmod_f32_x:

442 case RTLIB::impl_armpl_svfmod_f64_x:

443 case RTLIB::impl_armpl_svmodf_f64_x:

444 case RTLIB::impl_armpl_svmodf_f32_x:

445 case RTLIB::impl_armpl_svsincos_f32_x:

446 case RTLIB::impl_armpl_svsincos_f64_x:

447 case RTLIB::impl_armpl_svsincospi_f32_x:

448 case RTLIB::impl_armpl_svsincospi_f64_x:

449 case RTLIB::impl__ZGVsMxvv_fmod:

450 case RTLIB::impl__ZGVsMxvv_fmodf:

451 return true;

452 default:

453 return false;

454 }

455}