clang: lib/CIR/CodeGen/CIRGenBuiltin.cpp Source File (original) (raw)

35 const CallExpr *e, mlir::Operation *calleeValue) {

38}

42 bool poisonZero = false) {

44

47

48 Op op;

49 if constexpr (std::is_same_v<Op, cir::BitClzOp> ||

50 std::is_same_v<Op, cir::BitCtzOp>)

52 else

54

55 mlir::Value result = op.getResult();

57 if (exprTy != result.getType())

59

61}

64 cir::SyncScopeKind syncScope) {

67

68 auto constOrdering = orderingVal.getDefiningOpcir::ConstantOp();

69

70 if (!constOrdering) {

71

72

73 cgf.cgm.errorNYI("Variable atomic fence ordering");

74 return;

75 }

76

77 auto constOrderingAttr = constOrdering.getValueAttrcir::IntAttr();

78 assert(constOrderingAttr && "Expected integer constant for ordering");

79

80 auto ordering = static_castcir::MemOrder\(constOrderingAttr.getUInt());

81

82 cir::AtomicFenceOp::create(

83 builder, cgf.getLoc(expr->getSourceRange()), ordering,

84 cir::SyncScopeKindAttr::get(&cgf.getMLIRContext(), syncScope));

85}

97 assert(type->isIntegerType() && "Given type is not an integer.");

98 unsigned width = type->isBooleanType() ? 1

101 bool isSigned = type->isSignedIntegerType();

102 return {width, isSigned};

103}

110 assert(types.size() > 0 && "Empty list of types.");

111

112

113 bool isSigned = llvm::any_of(types, [](const auto &t) { return t.isSigned; });

114

115

116

117

118

119 unsigned width = 0;

120 for (const auto &type : types)

121 width = std::max(width, type.width + (isSigned && type.isSigned));

122

123 return {width, isSigned};

124}

129

130

131

132

134

136 amount, isRotateLeft);

138}

144

147

148 auto call =

149 Operation::create(cgf.getBuilder(), arg.getLoc(), arg.getType(), arg);

151}

156 auto call =

157 Operation::create(cgf.getBuilder(), arg.getLoc(), arg.getType(), arg);

159}

162 unsigned builtinID) {

163

167 std::string("unimplemented X86 library function builtin call: ") +

169 } else {

171 std::string("unimplemented X86 builtin call: ") +

173 }

174

176}

179 unsigned builtinID) {

180 assert(builtinID == Builtin::BI__builtin_alloca ||

181 builtinID == Builtin::BI__builtin_alloca_uninitialized ||

182 builtinID == Builtin::BIalloca || builtinID == Builtin::BI_alloca);

183

184

186

187

189 const CharUnits suitableAlignmentInBytes =

191

192

193

194

195

196

197

199 mlir::Value allocaAddr = builder.createAlloca(

201 builder.getUInt8Ty(), "bi_alloca", suitableAlignmentInBytes, size);

202

203

204 if (builtinID != Builtin::BI__builtin_alloca_uninitialized) {

205

206

207

208

209 switch (cgf.getLangOpts().getTrivialAutoVarInit()) {

211

212 break;

215 cgf.cgm.errorNYI("trivial auto var init");

216 break;

217 }

218 }

219

220

221

222

223

224

225

230 "Non-default address space for alloca");

231 }

232

233

236}

242

243

244

251

252

253

254

255

258 }

259 }

260

262

264

265

266

267

268

269 unsigned builtinIDIfNoAsmLabel = fd->hasAttr() ? 0 : builtinID;

270

273

274 switch (builtinIDIfNoAsmLabel) {

275 default:

276 break;

277

278

279 case Builtin::BI__builtin_stdarg_start:

280 case Builtin::BI__builtin_va_start:

281 case Builtin::BI__va_start: {

282 mlir::Value vaList = builtinID == Builtin::BI__va_start

287 return {};

288 }

289

290 case Builtin::BI__builtin_va_end:

292 return {};

293 case Builtin::BI__builtin_va_copy: {

296 cir::VACopyOp::create(builder, dstPtr.getLoc(), dstPtr, srcPtr);

297 return {};

298 }

299 case Builtin::BIcos:

300 case Builtin::BIcosf:

301 case Builtin::BIcosl:

302 case Builtin::BI__builtin_cos:

303 case Builtin::BI__builtin_cosf:

304 case Builtin::BI__builtin_cosf16:

305 case Builtin::BI__builtin_cosl:

306 case Builtin::BI__builtin_cosf128:

309

310 case Builtin::BIceil:

311 case Builtin::BIceilf:

312 case Builtin::BIceill:

313 case Builtin::BI__builtin_ceil:

314 case Builtin::BI__builtin_ceilf:

315 case Builtin::BI__builtin_ceilf16:

316 case Builtin::BI__builtin_ceill:

317 case Builtin::BI__builtin_ceilf128:

320

321 case Builtin::BIexp:

322 case Builtin::BIexpf:

323 case Builtin::BIexpl:

324 case Builtin::BI__builtin_exp:

325 case Builtin::BI__builtin_expf:

326 case Builtin::BI__builtin_expf16:

327 case Builtin::BI__builtin_expl:

328 case Builtin::BI__builtin_expf128:

331

332 case Builtin::BIexp2:

333 case Builtin::BIexp2f:

334 case Builtin::BIexp2l:

335 case Builtin::BI__builtin_exp2:

336 case Builtin::BI__builtin_exp2f:

337 case Builtin::BI__builtin_exp2f16:

338 case Builtin::BI__builtin_exp2l:

339 case Builtin::BI__builtin_exp2f128:

342

343 case Builtin::BIfabs:

344 case Builtin::BIfabsf:

345 case Builtin::BIfabsl:

346 case Builtin::BI__builtin_fabs:

347 case Builtin::BI__builtin_fabsf:

348 case Builtin::BI__builtin_fabsf16:

349 case Builtin::BI__builtin_fabsl:

350 case Builtin::BI__builtin_fabsf128:

352

353 case Builtin::BIfloor:

354 case Builtin::BIfloorf:

355 case Builtin::BIfloorl:

356 case Builtin::BI__builtin_floor:

357 case Builtin::BI__builtin_floorf:

358 case Builtin::BI__builtin_floorf16:

359 case Builtin::BI__builtin_floorl:

360 case Builtin::BI__builtin_floorf128:

362

363 case Builtin::BI__assume:

364 case Builtin::BI__builtin_assume: {

367

369 cir::AssumeOp::create(builder, loc, argValue);

371 }

372

373 case Builtin::BI__builtin_assume_separate_storage: {

376 cir::AssumeSepStorageOp::create(builder, loc, value0, value1);

378 }

379

380 case Builtin::BI__builtin_assume_aligned: {

383 mlir::Value offsetValue =

385

386 std::optionalllvm::APSInt alignment =

388 assert(alignment.has_value() &&

389 "the second argument to __builtin_assume_aligned must be an "

390 "integral constant expression");

391

392 mlir::Value result =

394 alignment->getSExtValue(), offsetValue);

396 }

397

398 case Builtin::BI__builtin_complex: {

401 mlir::Value complex = builder.createComplexCreate(loc, real, imag);

403 }

404

405 case Builtin::BI__builtin_creal:

406 case Builtin::BI__builtin_crealf:

407 case Builtin::BI__builtin_creall:

408 case Builtin::BIcreal:

409 case Builtin::BIcrealf:

410 case Builtin::BIcreall: {

412 mlir::Value real = builder.createComplexReal(loc, complex);

414 }

415

416 case Builtin::BI__builtin_cimag:

417 case Builtin::BI__builtin_cimagf:

418 case Builtin::BI__builtin_cimagl:

419 case Builtin::BIcimag:

420 case Builtin::BIcimagf:

421 case Builtin::BIcimagl: {

423 mlir::Value imag = builder.createComplexImag(loc, complex);

425 }

426

427 case Builtin::BI__builtin_conj:

428 case Builtin::BI__builtin_conjf:

429 case Builtin::BI__builtin_conjl:

430 case Builtin::BIconj:

431 case Builtin::BIconjf:

432 case Builtin::BIconjl: {

435 cir::UnaryOpKind::Not, complex);

437 }

438

439 case Builtin::BI__builtin_clrsb:

440 case Builtin::BI__builtin_clrsbl:

441 case Builtin::BI__builtin_clrsbll:

443

444 case Builtin::BI__builtin_ctzs:

445 case Builtin::BI__builtin_ctz:

446 case Builtin::BI__builtin_ctzl:

447 case Builtin::BI__builtin_ctzll:

448 case Builtin::BI__builtin_ctzg:

451

452 case Builtin::BI__builtin_clzs:

453 case Builtin::BI__builtin_clz:

454 case Builtin::BI__builtin_clzl:

455 case Builtin::BI__builtin_clzll:

456 case Builtin::BI__builtin_clzg:

459

460 case Builtin::BI__builtin_ffs:

461 case Builtin::BI__builtin_ffsl:

462 case Builtin::BI__builtin_ffsll:

464

465 case Builtin::BI__builtin_parity:

466 case Builtin::BI__builtin_parityl:

467 case Builtin::BI__builtin_parityll:

469

470 case Builtin::BI__lzcnt16:

471 case Builtin::BI__lzcnt:

472 case Builtin::BI__lzcnt64:

475

476 case Builtin::BI__popcnt16:

477 case Builtin::BI__popcnt:

478 case Builtin::BI__popcnt64:

479 case Builtin::BI__builtin_popcount:

480 case Builtin::BI__builtin_popcountl:

481 case Builtin::BI__builtin_popcountll:

482 case Builtin::BI__builtin_popcountg:

484

485 case Builtin::BI__builtin_expect:

486 case Builtin::BI__builtin_expect_with_probability: {

489

490 mlir::FloatAttr probAttr;

491 if (builtinIDIfNoAsmLabel == Builtin::BI__builtin_expect_with_probability) {

492 llvm::APFloat probability(0.0);

494 [[maybe_unused]] bool evalSucceeded =

496 assert(evalSucceeded &&

497 "probability should be able to evaluate as float");

498 bool loseInfo = false;

499 probability.convert(llvm::APFloat::IEEEdouble(),

500 llvm::RoundingMode::Dynamic, &loseInfo);

501 probAttr = mlir::FloatAttr::get(mlir::Float64Type::get(&getMLIRContext()),

502 probability);

503 }

504

505 auto result = cir::ExpectOp::create(builder, loc, argValue.getType(),

506 argValue, expectedValue, probAttr);

508 }

509

510 case Builtin::BI__builtin_bswap16:

511 case Builtin::BI__builtin_bswap32:

512 case Builtin::BI__builtin_bswap64:

513 case Builtin::BI_byteswap_ushort:

514 case Builtin::BI_byteswap_ulong:

515 case Builtin::BI_byteswap_uint64: {

517 return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));

518 }

519

520 case Builtin::BI__builtin_bitreverse8:

521 case Builtin::BI__builtin_bitreverse16:

522 case Builtin::BI__builtin_bitreverse32:

523 case Builtin::BI__builtin_bitreverse64: {

525 return RValue::get(cir::BitReverseOp::create(builder, loc, arg));

526 }

527

528 case Builtin::BI__builtin_rotateleft8:

529 case Builtin::BI__builtin_rotateleft16:

530 case Builtin::BI__builtin_rotateleft32:

531 case Builtin::BI__builtin_rotateleft64:

532 return emitRotate(e, true);

533

534 case Builtin::BI__builtin_rotateright8:

535 case Builtin::BI__builtin_rotateright16:

536 case Builtin::BI__builtin_rotateright32:

537 case Builtin::BI__builtin_rotateright64:

538 return emitRotate(e, false);

539

540 case Builtin::BI__builtin_coro_id:

541 case Builtin::BI__builtin_coro_promise:

542 case Builtin::BI__builtin_coro_resume:

543 case Builtin::BI__builtin_coro_noop:

544 case Builtin::BI__builtin_coro_destroy:

545 case Builtin::BI__builtin_coro_done:

546 case Builtin::BI__builtin_coro_alloc:

547 case Builtin::BI__builtin_coro_begin:

548 case Builtin::BI__builtin_coro_end:

549 case Builtin::BI__builtin_coro_suspend:

550 case Builtin::BI__builtin_coro_align:

551 cgm.errorNYI(e->getSourceRange(), "BI__builtin_coro_id like NYI");

553

554 case Builtin::BI__builtin_coro_frame: {

556 }

557 case Builtin::BI__builtin_coro_free:

558 case Builtin::BI__builtin_coro_size: {

560 mlir::Type ty = cgm.getTypes().getFunctionType(

561 cgm.getTypes().arrangeGlobalDeclaration(gd));

563 cir::FuncOp fnOp =

564 cgm.getOrCreateCIRFunction(nd->getName(), ty, gd, false);

565 fnOp.setBuiltin(true);

568 }

569

570 case Builtin::BI__builtin_constant_p: {

572

574 QualType argType = arg->getType();

575

576

579

580

583 mlir::castcir::IntType(resultType), 0));

584 }

585

586 if (arg->HasSideEffects(getContext())) {

587

588

591 mlir::castcir::IntType(resultType), 0));

592 }

593

597 "__builtin_constant_p: Obj-C object pointer");

598 return {};

599 }

600 argValue = builder.createBitcast(argValue, convertType(argType));

601

602 mlir::Value result = cir::IsConstantOp::create(

604

605 result = builder.createBoolToInt(result, resultType);

607 }

608 case Builtin::BI__builtin_dynamic_object_size:

609 case Builtin::BI__builtin_object_size: {

610 unsigned type =

613

614

615

616 bool isDynamic = builtinID == Builtin::BI__builtin_dynamic_object_size;

618 nullptr, isDynamic));

619 }

620

621 case Builtin::BI__builtin_prefetch: {

622 auto evaluateOperandAsInt = [&](const Expr *arg) {

624 [[maybe_unused]] bool evalSucceed =

625 arg->EvaluateAsInt(res, cgm.getASTContext());

626 assert(evalSucceed && "expression should be able to evaluate as int");

627 return res.Val.getInt().getZExtValue();

628 };

629

630 bool isWrite = false;

632 isWrite = evaluateOperandAsInt(e->getArg(1));

633

634 int locality = 3;

636 locality = evaluateOperandAsInt(e->getArg(2));

637

639 cir::PrefetchOp::create(builder, loc, address, locality, isWrite);

641 }

642 case Builtin::BI__builtin_readcyclecounter:

643 case Builtin::BI__builtin_readsteadycounter:

644 case Builtin::BI__builtin___clear_cache:

646 case Builtin::BI__builtin_trap:

647 emitTrap(loc, true);

649 case Builtin::BI__builtin_verbose_trap:

650 case Builtin::BI__debugbreak:

652 case Builtin::BI__builtin_unreachable:

655 case Builtin::BI__builtin_powi:

656 case Builtin::BI__builtin_powif:

657 case Builtin::BI__builtin_powil:

658 case Builtin::BI__builtin_frexpl:

659 case Builtin::BI__builtin_frexp:

660 case Builtin::BI__builtin_frexpf:

661 case Builtin::BI__builtin_frexpf128:

662 case Builtin::BI__builtin_frexpf16:

663 case Builtin::BImodf:

664 case Builtin::BImodff:

665 case Builtin::BImodfl:

666 case Builtin::BI__builtin_modf:

667 case Builtin::BI__builtin_modff:

668 case Builtin::BI__builtin_modfl:

669 case Builtin::BI__builtin_isgreater:

670 case Builtin::BI__builtin_isgreaterequal:

671 case Builtin::BI__builtin_isless:

672 case Builtin::BI__builtin_islessequal:

673 case Builtin::BI__builtin_islessgreater:

674 case Builtin::BI__builtin_isunordered:

675

676

677

678

679

680

681 case Builtin::BI__builtin_isnan: {

686 return RValue::get(builder.createBoolToInt(

687 builder.createIsFPClass(loc, v, cir::FPClassTest::Nan),

689 }

690

691 case Builtin::BI__builtin_issignaling: {

695 return RValue::get(builder.createBoolToInt(

696 builder.createIsFPClass(loc, v, cir::FPClassTest::SignalingNaN),

698 }

699

700 case Builtin::BI__builtin_isinf: {

705 return RValue::get(builder.createBoolToInt(

706 builder.createIsFPClass(loc, v, cir::FPClassTest::Infinity),

708 }

709 case Builtin::BIfinite:

710 case Builtin::BI__finite:

711 case Builtin::BIfinitef:

712 case Builtin::BI__finitef:

713 case Builtin::BIfinitel:

714 case Builtin::BI__finitel:

715 case Builtin::BI__builtin_isfinite: {

720 return RValue::get(builder.createBoolToInt(

721 builder.createIsFPClass(loc, v, cir::FPClassTest::Finite),

723 }

724

725 case Builtin::BI__builtin_isnormal: {

729 return RValue::get(builder.createBoolToInt(

730 builder.createIsFPClass(loc, v, cir::FPClassTest::Normal),

732 }

733

734 case Builtin::BI__builtin_issubnormal: {

738 return RValue::get(builder.createBoolToInt(

739 builder.createIsFPClass(loc, v, cir::FPClassTest::Subnormal),

741 }

742

743 case Builtin::BI__builtin_iszero: {

747 return RValue::get(builder.createBoolToInt(

748 builder.createIsFPClass(loc, v, cir::FPClassTest::Zero),

750 }

751 case Builtin::BI__builtin_isfpclass: {

754 break;

755

758 uint64_t test = result.Val.getInt().getLimitedValue();

760

761 return RValue::get(builder.createBoolToInt(

762 builder.createIsFPClass(loc, v, cir::FPClassTest(test)),

764 }

765 case Builtin::BI__builtin_nondeterministic_value:

766 case Builtin::BI__builtin_elementwise_abs:

768 case Builtin::BI__builtin_elementwise_acos:

770 case Builtin::BI__builtin_elementwise_asin:

772 case Builtin::BI__builtin_elementwise_atan:

774 case Builtin::BI__builtin_elementwise_atan2:

775 case Builtin::BI__builtin_elementwise_ceil:

776 case Builtin::BI__builtin_elementwise_exp:

777 case Builtin::BI__builtin_elementwise_exp2:

778 case Builtin::BI__builtin_elementwise_exp10:

779 case Builtin::BI__builtin_elementwise_ldexp:

780 case Builtin::BI__builtin_elementwise_log:

781 case Builtin::BI__builtin_elementwise_log2:

782 case Builtin::BI__builtin_elementwise_log10:

783 case Builtin::BI__builtin_elementwise_pow:

784 case Builtin::BI__builtin_elementwise_bitreverse:

786 case Builtin::BI__builtin_elementwise_cos:

788 case Builtin::BI__builtin_elementwise_cosh:

789 case Builtin::BI__builtin_elementwise_floor:

790 case Builtin::BI__builtin_elementwise_popcount:

791 case Builtin::BI__builtin_elementwise_roundeven:

792 case Builtin::BI__builtin_elementwise_round:

793 case Builtin::BI__builtin_elementwise_rint:

794 case Builtin::BI__builtin_elementwise_nearbyint:

795 case Builtin::BI__builtin_elementwise_sin:

796 case Builtin::BI__builtin_elementwise_sinh:

797 case Builtin::BI__builtin_elementwise_tan:

798 case Builtin::BI__builtin_elementwise_tanh:

799 case Builtin::BI__builtin_elementwise_trunc:

800 case Builtin::BI__builtin_elementwise_canonicalize:

801 case Builtin::BI__builtin_elementwise_copysign:

802 case Builtin::BI__builtin_elementwise_fma:

803 case Builtin::BI__builtin_elementwise_fshl:

804 case Builtin::BI__builtin_elementwise_fshr:

805 case Builtin::BI__builtin_elementwise_add_sat:

806 case Builtin::BI__builtin_elementwise_sub_sat:

807 case Builtin::BI__builtin_elementwise_max:

808 case Builtin::BI__builtin_elementwise_min:

809 case Builtin::BI__builtin_elementwise_maxnum:

810 case Builtin::BI__builtin_elementwise_minnum:

811 case Builtin::BI__builtin_elementwise_maximum:

812 case Builtin::BI__builtin_elementwise_minimum:

813 case Builtin::BI__builtin_elementwise_maximumnum:

814 case Builtin::BI__builtin_elementwise_minimumnum:

815 case Builtin::BI__builtin_reduce_max:

816 case Builtin::BI__builtin_reduce_min:

817 case Builtin::BI__builtin_reduce_add:

818 case Builtin::BI__builtin_reduce_mul:

819 case Builtin::BI__builtin_reduce_xor:

820 case Builtin::BI__builtin_reduce_or:

821 case Builtin::BI__builtin_reduce_and:

822 case Builtin::BI__builtin_reduce_maximum:

823 case Builtin::BI__builtin_reduce_minimum:

824 case Builtin::BI__builtin_matrix_transpose:

825 case Builtin::BI__builtin_matrix_column_major_load:

826 case Builtin::BI__builtin_matrix_column_major_store:

827 case Builtin::BI__builtin_masked_load:

828 case Builtin::BI__builtin_masked_expand_load:

829 case Builtin::BI__builtin_masked_gather:

830 case Builtin::BI__builtin_masked_store:

831 case Builtin::BI__builtin_masked_compress_store:

832 case Builtin::BI__builtin_masked_scatter:

833 case Builtin::BI__builtin_isinf_sign:

834 case Builtin::BI__builtin_flt_rounds:

835 case Builtin::BI__builtin_set_flt_rounds:

836 case Builtin::BI__builtin_fpclassify:

838 case Builtin::BIalloca:

839 case Builtin::BI_alloca:

840 case Builtin::BI__builtin_alloca_uninitialized:

841 case Builtin::BI__builtin_alloca:

843 case Builtin::BI__builtin_alloca_with_align_uninitialized:

844 case Builtin::BI__builtin_alloca_with_align:

845 case Builtin::BI__builtin_infer_alloc_token:

846 case Builtin::BIbzero:

847 case Builtin::BI__builtin_bzero:

848 case Builtin::BIbcopy:

849 case Builtin::BI__builtin_bcopy:

851 case Builtin::BImemcpy:

852 case Builtin::BI__builtin_memcpy:

853 case Builtin::BImempcpy:

854 case Builtin::BI__builtin_mempcpy:

855 case Builtin::BI__builtin_memcpy_inline:

856 case Builtin::BI__builtin_char_memchr:

857 case Builtin::BI__builtin___memcpy_chk:

858 case Builtin::BI__builtin_objc_memmove_collectable:

859 case Builtin::BI__builtin___memmove_chk:

860 case Builtin::BI__builtin_trivially_relocate:

861 case Builtin::BImemmove:

862 case Builtin::BI__builtin_memmove:

863 case Builtin::BImemset:

864 case Builtin::BI__builtin_memset:

865 case Builtin::BI__builtin_memset_inline:

866 case Builtin::BI__builtin___memset_chk:

867 case Builtin::BI__builtin_wmemchr:

868 case Builtin::BI__builtin_wmemcmp:

869 break;

870 case Builtin::BI__builtin_dwarf_cfa:

872 case Builtin::BI__builtin_return_address:

873 case Builtin::BI_ReturnAddress:

874 case Builtin::BI__builtin_frame_address: {

877 if (builtinID == Builtin::BI__builtin_return_address) {

878 return RValue::get(cir::ReturnAddrOp::create(

879 builder, loc,

880 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));

881 }

882 return RValue::get(cir::FrameAddrOp::create(

883 builder, loc,

884 builder.getConstAPInt(loc, builder.getUInt32Ty(), level)));

885 }

886 case Builtin::BI__builtin_extract_return_addr:

887 case Builtin::BI__builtin_frob_return_addr:

888 case Builtin::BI__builtin_dwarf_sp_column:

889 case Builtin::BI__builtin_init_dwarf_reg_size_table:

890 case Builtin::BI__builtin_eh_return:

891 case Builtin::BI__builtin_unwind_init:

892 case Builtin::BI__builtin_extend_pointer:

893 case Builtin::BI__builtin_setjmp:

894 case Builtin::BI__builtin_longjmp:

895 case Builtin::BI__builtin_launder:

896 case Builtin::BI__sync_fetch_and_add:

897 case Builtin::BI__sync_fetch_and_sub:

898 case Builtin::BI__sync_fetch_and_or:

899 case Builtin::BI__sync_fetch_and_and:

900 case Builtin::BI__sync_fetch_and_xor:

901 case Builtin::BI__sync_fetch_and_nand:

902 case Builtin::BI__sync_add_and_fetch:

903 case Builtin::BI__sync_sub_and_fetch:

904 case Builtin::BI__sync_and_and_fetch:

905 case Builtin::BI__sync_or_and_fetch:

906 case Builtin::BI__sync_xor_and_fetch:

907 case Builtin::BI__sync_nand_and_fetch:

908 case Builtin::BI__sync_val_compare_and_swap:

909 case Builtin::BI__sync_bool_compare_and_swap:

910 case Builtin::BI__sync_lock_test_and_set:

911 case Builtin::BI__sync_lock_release:

912 case Builtin::BI__sync_swap:

913 case Builtin::BI__sync_fetch_and_add_1:

914 case Builtin::BI__sync_fetch_and_add_2:

915 case Builtin::BI__sync_fetch_and_add_4:

916 case Builtin::BI__sync_fetch_and_add_8:

917 case Builtin::BI__sync_fetch_and_add_16:

918 case Builtin::BI__sync_fetch_and_sub_1:

919 case Builtin::BI__sync_fetch_and_sub_2:

920 case Builtin::BI__sync_fetch_and_sub_4:

921 case Builtin::BI__sync_fetch_and_sub_8:

922 case Builtin::BI__sync_fetch_and_sub_16:

923 case Builtin::BI__sync_fetch_and_or_1:

924 case Builtin::BI__sync_fetch_and_or_2:

925 case Builtin::BI__sync_fetch_and_or_4:

926 case Builtin::BI__sync_fetch_and_or_8:

927 case Builtin::BI__sync_fetch_and_or_16:

928 case Builtin::BI__sync_fetch_and_and_1:

929 case Builtin::BI__sync_fetch_and_and_2:

930 case Builtin::BI__sync_fetch_and_and_4:

931 case Builtin::BI__sync_fetch_and_and_8:

932 case Builtin::BI__sync_fetch_and_and_16:

933 case Builtin::BI__sync_fetch_and_xor_1:

934 case Builtin::BI__sync_fetch_and_xor_2:

935 case Builtin::BI__sync_fetch_and_xor_4:

936 case Builtin::BI__sync_fetch_and_xor_8:

937 case Builtin::BI__sync_fetch_and_xor_16:

938 case Builtin::BI__sync_fetch_and_nand_1:

939 case Builtin::BI__sync_fetch_and_nand_2:

940 case Builtin::BI__sync_fetch_and_nand_4:

941 case Builtin::BI__sync_fetch_and_nand_8:

942 case Builtin::BI__sync_fetch_and_nand_16:

943 case Builtin::BI__sync_fetch_and_min:

944 case Builtin::BI__sync_fetch_and_max:

945 case Builtin::BI__sync_fetch_and_umin:

946 case Builtin::BI__sync_fetch_and_umax:

947 case Builtin::BI__sync_add_and_fetch_1:

948 case Builtin::BI__sync_add_and_fetch_2:

949 case Builtin::BI__sync_add_and_fetch_4:

950 case Builtin::BI__sync_add_and_fetch_8:

951 case Builtin::BI__sync_add_and_fetch_16:

952 case Builtin::BI__sync_sub_and_fetch_1:

953 case Builtin::BI__sync_sub_and_fetch_2:

954 case Builtin::BI__sync_sub_and_fetch_4:

955 case Builtin::BI__sync_sub_and_fetch_8:

956 case Builtin::BI__sync_sub_and_fetch_16:

957 case Builtin::BI__sync_and_and_fetch_1:

958 case Builtin::BI__sync_and_and_fetch_2:

959 case Builtin::BI__sync_and_and_fetch_4:

960 case Builtin::BI__sync_and_and_fetch_8:

961 case Builtin::BI__sync_and_and_fetch_16:

962 case Builtin::BI__sync_or_and_fetch_1:

963 case Builtin::BI__sync_or_and_fetch_2:

964 case Builtin::BI__sync_or_and_fetch_4:

965 case Builtin::BI__sync_or_and_fetch_8:

966 case Builtin::BI__sync_or_and_fetch_16:

967 case Builtin::BI__sync_xor_and_fetch_1:

968 case Builtin::BI__sync_xor_and_fetch_2:

969 case Builtin::BI__sync_xor_and_fetch_4:

970 case Builtin::BI__sync_xor_and_fetch_8:

971 case Builtin::BI__sync_xor_and_fetch_16:

972 case Builtin::BI__sync_nand_and_fetch_1:

973 case Builtin::BI__sync_nand_and_fetch_2:

974 case Builtin::BI__sync_nand_and_fetch_4:

975 case Builtin::BI__sync_nand_and_fetch_8:

976 case Builtin::BI__sync_nand_and_fetch_16:

977 case Builtin::BI__sync_val_compare_and_swap_1:

978 case Builtin::BI__sync_val_compare_and_swap_2:

979 case Builtin::BI__sync_val_compare_and_swap_4:

980 case Builtin::BI__sync_val_compare_and_swap_8:

981 case Builtin::BI__sync_val_compare_and_swap_16:

982 case Builtin::BI__sync_bool_compare_and_swap_1:

983 case Builtin::BI__sync_bool_compare_and_swap_2:

984 case Builtin::BI__sync_bool_compare_and_swap_4:

985 case Builtin::BI__sync_bool_compare_and_swap_8:

986 case Builtin::BI__sync_bool_compare_and_swap_16:

987 case Builtin::BI__sync_swap_1:

988 case Builtin::BI__sync_swap_2:

989 case Builtin::BI__sync_swap_4:

990 case Builtin::BI__sync_swap_8:

991 case Builtin::BI__sync_swap_16:

992 case Builtin::BI__sync_lock_test_and_set_1:

993 case Builtin::BI__sync_lock_test_and_set_2:

994 case Builtin::BI__sync_lock_test_and_set_4:

995 case Builtin::BI__sync_lock_test_and_set_8:

996 case Builtin::BI__sync_lock_test_and_set_16:

997 case Builtin::BI__sync_lock_release_1:

998 case Builtin::BI__sync_lock_release_2:

999 case Builtin::BI__sync_lock_release_4:

1000 case Builtin::BI__sync_lock_release_8:

1001 case Builtin::BI__sync_lock_release_16:

1002 case Builtin::BI__sync_synchronize:

1003 case Builtin::BI__builtin_nontemporal_load:

1004 case Builtin::BI__builtin_nontemporal_store:

1005 case Builtin::BI__c11_atomic_is_lock_free:

1006 case Builtin::BI__atomic_is_lock_free:

1007 case Builtin::BI__atomic_test_and_set:

1008 case Builtin::BI__atomic_clear:

1010 case Builtin::BI__atomic_thread_fence: {

1013 }

1014 case Builtin::BI__atomic_signal_fence: {

1017 }

1018 case Builtin::BI__c11_atomic_thread_fence:

1019 case Builtin::BI__c11_atomic_signal_fence:

1020 case Builtin::BI__scoped_atomic_thread_fence:

1021 case Builtin::BI__builtin_signbit:

1022 case Builtin::BI__builtin_signbitf:

1023 case Builtin::BI__builtin_signbitl:

1024 case Builtin::BI__warn_memset_zero_len:

1025 case Builtin::BI__annotation:

1026 case Builtin::BI__builtin_annotation:

1027 case Builtin::BI__builtin_addcb:

1028 case Builtin::BI__builtin_addcs:

1029 case Builtin::BI__builtin_addc:

1030 case Builtin::BI__builtin_addcl:

1031 case Builtin::BI__builtin_addcll:

1032 case Builtin::BI__builtin_subcb:

1033 case Builtin::BI__builtin_subcs:

1034 case Builtin::BI__builtin_subc:

1035 case Builtin::BI__builtin_subcl:

1036 case Builtin::BI__builtin_subcll:

1038

1039 case Builtin::BI__builtin_add_overflow:

1040 case Builtin::BI__builtin_sub_overflow:

1041 case Builtin::BI__builtin_mul_overflow: {

1045

1048

1049 WidthAndSignedness leftInfo =

1051 WidthAndSignedness rightInfo =

1053 WidthAndSignedness resultInfo =

1055

1056

1057

1058

1059 WidthAndSignedness encompassingInfo =

1061

1062 auto encompassingCIRTy = cir::IntType::get(

1063 &getMLIRContext(), encompassingInfo.width, encompassingInfo.isSigned);

1064 auto resultCIRTy = mlir::castcir::IntType(cgm.convertType(resultQTy));

1065

1069

1070

1071 if (left.getType() != encompassingCIRTy)

1072 left =

1073 builder.createCast(cir::CastKind::integral, left, encompassingCIRTy);

1074 if (right.getType() != encompassingCIRTy)

1075 right =

1076 builder.createCast(cir::CastKind::integral, right, encompassingCIRTy);

1077

1078

1079 cir::BinOpOverflowKind opKind;

1080 switch (builtinID) {

1081 default:

1082 llvm_unreachable("Unknown overflow builtin id.");

1083 case Builtin::BI__builtin_add_overflow:

1084 opKind = cir::BinOpOverflowKind::Add;

1085 break;

1086 case Builtin::BI__builtin_sub_overflow:

1087 opKind = cir::BinOpOverflowKind::Sub;

1088 break;

1089 case Builtin::BI__builtin_mul_overflow:

1090 opKind = cir::BinOpOverflowKind::Mul;

1091 break;

1092 }

1093

1095 auto arithOp = cir::BinOpOverflowOp::create(builder, loc, resultCIRTy,

1096 opKind, left, right);

1097

1098

1099

1100

1101

1102

1103

1104

1105

1106

1107

1108 bool isVolatile =

1110 builder.createStore(loc, emitToMemory(arithOp.getResult(), resultQTy),

1111 resultPtr, isVolatile);

1112

1113 return RValue::get(arithOp.getOverflow());

1114 }

1115

1116 case Builtin::BI__builtin_uadd_overflow:

1117 case Builtin::BI__builtin_uaddl_overflow:

1118 case Builtin::BI__builtin_uaddll_overflow:

1119 case Builtin::BI__builtin_usub_overflow:

1120 case Builtin::BI__builtin_usubl_overflow:

1121 case Builtin::BI__builtin_usubll_overflow:

1122 case Builtin::BI__builtin_umul_overflow:

1123 case Builtin::BI__builtin_umull_overflow:

1124 case Builtin::BI__builtin_umulll_overflow:

1125 case Builtin::BI__builtin_sadd_overflow:

1126 case Builtin::BI__builtin_saddl_overflow:

1127 case Builtin::BI__builtin_saddll_overflow:

1128 case Builtin::BI__builtin_ssub_overflow:

1129 case Builtin::BI__builtin_ssubl_overflow:

1130 case Builtin::BI__builtin_ssubll_overflow:

1131 case Builtin::BI__builtin_smul_overflow:

1132 case Builtin::BI__builtin_smull_overflow:

1133 case Builtin::BI__builtin_smulll_overflow: {

1134

1137

1140

1141

1142 cir::BinOpOverflowKind arithKind;

1143 switch (builtinID) {

1144 default:

1145 llvm_unreachable("Unknown overflow builtin id.");

1146 case Builtin::BI__builtin_uadd_overflow:

1147 case Builtin::BI__builtin_uaddl_overflow:

1148 case Builtin::BI__builtin_uaddll_overflow:

1149 case Builtin::BI__builtin_sadd_overflow:

1150 case Builtin::BI__builtin_saddl_overflow:

1151 case Builtin::BI__builtin_saddll_overflow:

1152 arithKind = cir::BinOpOverflowKind::Add;

1153 break;

1154 case Builtin::BI__builtin_usub_overflow:

1155 case Builtin::BI__builtin_usubl_overflow:

1156 case Builtin::BI__builtin_usubll_overflow:

1157 case Builtin::BI__builtin_ssub_overflow:

1158 case Builtin::BI__builtin_ssubl_overflow:

1159 case Builtin::BI__builtin_ssubll_overflow:

1160 arithKind = cir::BinOpOverflowKind::Sub;

1161 break;

1162 case Builtin::BI__builtin_umul_overflow:

1163 case Builtin::BI__builtin_umull_overflow:

1164 case Builtin::BI__builtin_umulll_overflow:

1165 case Builtin::BI__builtin_smul_overflow:

1166 case Builtin::BI__builtin_smull_overflow:

1167 case Builtin::BI__builtin_smulll_overflow:

1168 arithKind = cir::BinOpOverflowKind::Mul;

1169 break;

1170 }

1171

1174 auto resultCIRTy = mlir::castcir::IntType(cgm.convertType(resultQTy));

1175

1177 cir::BinOpOverflowOp arithOp = cir::BinOpOverflowOp::create(

1178 builder, loc, resultCIRTy, arithKind, x, y);

1179

1180 bool isVolatile =

1182 builder.createStore(loc, emitToMemory(arithOp.getResult(), resultQTy),

1183 resultPtr, isVolatile);

1184

1185 return RValue::get(arithOp.getOverflow());

1186 }

1187

1188 case Builtin::BIaddressof:

1189 case Builtin::BI__addressof:

1190 case Builtin::BI__builtin_addressof:

1191 case Builtin::BI__builtin_function_start:

1193 case Builtin::BI__builtin_operator_new:

1196 case Builtin::BI__builtin_operator_delete:

1200 case Builtin::BI__builtin_is_aligned:

1201 case Builtin::BI__builtin_align_up:

1202 case Builtin::BI__builtin_align_down:

1203 case Builtin::BI__noop:

1204 case Builtin::BI__builtin_call_with_static_chain:

1205 case Builtin::BI_InterlockedExchange8:

1206 case Builtin::BI_InterlockedExchange16:

1207 case Builtin::BI_InterlockedExchange:

1208 case Builtin::BI_InterlockedExchangePointer:

1209 case Builtin::BI_InterlockedCompareExchangePointer:

1210 case Builtin::BI_InterlockedCompareExchangePointer_nf:

1211 case Builtin::BI_InterlockedCompareExchange8:

1212 case Builtin::BI_InterlockedCompareExchange16:

1213 case Builtin::BI_InterlockedCompareExchange:

1214 case Builtin::BI_InterlockedCompareExchange64:

1215 case Builtin::BI_InterlockedIncrement16:

1216 case Builtin::BI_InterlockedIncrement:

1217 case Builtin::BI_InterlockedDecrement16:

1218 case Builtin::BI_InterlockedDecrement:

1219 case Builtin::BI_InterlockedAnd8:

1220 case Builtin::BI_InterlockedAnd16:

1221 case Builtin::BI_InterlockedAnd:

1222 case Builtin::BI_InterlockedExchangeAdd8:

1223 case Builtin::BI_InterlockedExchangeAdd16:

1224 case Builtin::BI_InterlockedExchangeAdd:

1225 case Builtin::BI_InterlockedExchangeSub8:

1226 case Builtin::BI_InterlockedExchangeSub16:

1227 case Builtin::BI_InterlockedExchangeSub:

1228 case Builtin::BI_InterlockedOr8:

1229 case Builtin::BI_InterlockedOr16:

1230 case Builtin::BI_InterlockedOr:

1231 case Builtin::BI_InterlockedXor8:

1232 case Builtin::BI_InterlockedXor16:

1233 case Builtin::BI_InterlockedXor:

1234 case Builtin::BI_bittest64:

1235 case Builtin::BI_bittest:

1236 case Builtin::BI_bittestandcomplement64:

1237 case Builtin::BI_bittestandcomplement:

1238 case Builtin::BI_bittestandreset64:

1239 case Builtin::BI_bittestandreset:

1240 case Builtin::BI_bittestandset64:

1241 case Builtin::BI_bittestandset:

1242 case Builtin::BI_interlockedbittestandreset:

1243 case Builtin::BI_interlockedbittestandreset64:

1244 case Builtin::BI_interlockedbittestandreset64_acq:

1245 case Builtin::BI_interlockedbittestandreset64_rel:

1246 case Builtin::BI_interlockedbittestandreset64_nf:

1247 case Builtin::BI_interlockedbittestandset64:

1248 case Builtin::BI_interlockedbittestandset64_acq:

1249 case Builtin::BI_interlockedbittestandset64_rel:

1250 case Builtin::BI_interlockedbittestandset64_nf:

1251 case Builtin::BI_interlockedbittestandset:

1252 case Builtin::BI_interlockedbittestandset_acq:

1253 case Builtin::BI_interlockedbittestandset_rel:

1254 case Builtin::BI_interlockedbittestandset_nf:

1255 case Builtin::BI_interlockedbittestandreset_acq:

1256 case Builtin::BI_interlockedbittestandreset_rel:

1257 case Builtin::BI_interlockedbittestandreset_nf:

1258 case Builtin::BI__iso_volatile_load8:

1259 case Builtin::BI__iso_volatile_load16:

1260 case Builtin::BI__iso_volatile_load32:

1261 case Builtin::BI__iso_volatile_load64:

1262 case Builtin::BI__iso_volatile_store8:

1263 case Builtin::BI__iso_volatile_store16:

1264 case Builtin::BI__iso_volatile_store32:

1265 case Builtin::BI__iso_volatile_store64:

1266 case Builtin::BI__builtin_ptrauth_sign_constant:

1267 case Builtin::BI__builtin_ptrauth_auth:

1268 case Builtin::BI__builtin_ptrauth_auth_and_resign:

1269 case Builtin::BI__builtin_ptrauth_blend_discriminator:

1270 case Builtin::BI__builtin_ptrauth_sign_generic_data:

1271 case Builtin::BI__builtin_ptrauth_sign_unauthenticated:

1272 case Builtin::BI__builtin_ptrauth_strip:

1273 case Builtin::BI__builtin_get_vtable_pointer:

1274 case Builtin::BI__exception_code:

1275 case Builtin::BI_exception_code:

1276 case Builtin::BI__exception_info:

1277 case Builtin::BI_exception_info:

1278 case Builtin::BI__abnormal_termination:

1279 case Builtin::BI_abnormal_termination:

1280 case Builtin::BI_setjmpex:

1281 case Builtin::BI_setjmp:

1282 case Builtin::BImove:

1283 case Builtin::BImove_if_noexcept:

1284 case Builtin::BIforward:

1285 case Builtin::BIforward_like:

1286 case Builtin::BIas_const:

1287 case Builtin::BI__GetExceptionInfo:

1288 case Builtin::BI__fastfail:

1289 case Builtin::BIread_pipe:

1290 case Builtin::BIwrite_pipe:

1291 case Builtin::BIreserve_read_pipe:

1292 case Builtin::BIreserve_write_pipe:

1293 case Builtin::BIwork_group_reserve_read_pipe:

1294 case Builtin::BIwork_group_reserve_write_pipe:

1295 case Builtin::BIsub_group_reserve_read_pipe:

1296 case Builtin::BIsub_group_reserve_write_pipe:

1297 case Builtin::BIcommit_read_pipe:

1298 case Builtin::BIcommit_write_pipe:

1299 case Builtin::BIwork_group_commit_read_pipe:

1300 case Builtin::BIwork_group_commit_write_pipe:

1301 case Builtin::BIsub_group_commit_read_pipe:

1302 case Builtin::BIsub_group_commit_write_pipe:

1303 case Builtin::BIget_pipe_num_packets:

1304 case Builtin::BIget_pipe_max_packets:

1305 case Builtin::BIto_global:

1306 case Builtin::BIto_local:

1307 case Builtin::BIto_private:

1308 case Builtin::BIenqueue_kernel:

1309 case Builtin::BIget_kernel_work_group_size:

1310 case Builtin::BIget_kernel_preferred_work_group_size_multiple:

1311 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:

1312 case Builtin::BIget_kernel_sub_group_count_for_ndrange:

1313 case Builtin::BI__builtin_store_half:

1314 case Builtin::BI__builtin_store_halff:

1315 case Builtin::BI__builtin_load_half:

1316 case Builtin::BI__builtin_load_halff:

1318 case Builtin::BI__builtin_printf:

1319 case Builtin::BIprintf:

1320 break;

1321 case Builtin::BI__builtin_canonicalize:

1322 case Builtin::BI__builtin_canonicalizef:

1323 case Builtin::BI__builtin_canonicalizef16:

1324 case Builtin::BI__builtin_canonicalizel:

1325 case Builtin::BI__builtin_thread_pointer:

1326 case Builtin::BI__builtin_os_log_format:

1327 case Builtin::BI__xray_customevent:

1328 case Builtin::BI__xray_typedevent:

1329 case Builtin::BI__builtin_ms_va_start:

1330 case Builtin::BI__builtin_ms_va_end:

1331 case Builtin::BI__builtin_ms_va_copy:

1332 case Builtin::BI__builtin_get_device_side_mangled_name:

1334 }

1335

1336

1337

1338

1339 if (getContext().BuiltinInfo.isLibFunction(builtinID))

1341 cgm.getBuiltinLibFunction(fd, builtinID));

1342

1343

1344

1345

1346

1349 cgm.errorNYI(e->getSourceRange(), "aggregate return value from builtin");

1351 }

1352

1353

1354

1355

1356

1357

1358

1359 if (std::optionalmlir::Value rst =

1361 mlir::Value v = rst.value();

1362

1363

1364 if (!v)

1366

1367 switch (evalKind) {

1369 if (mlir::isacir::VoidType(v.getType()))

1373 cgm.errorNYI(e->getSourceRange(), "aggregate return value from builtin");

1376 llvm_unreachable("No current target builtin returns complex");

1377 }

1378 llvm_unreachable("Bad evaluation kind in EmitBuiltinExpr");

1379 }

1380

1382 std::string("unimplemented builtin call: ") +

1383 getContext().BuiltinInfo.getName(builtinID));

1385}

1390 llvm::Triple::ArchType arch) {

1391

1392

1393

1394

1395

1396

1399 return std::nullopt;

1400

1401 switch (arch) {

1402 case llvm::Triple::arm:

1403 case llvm::Triple::armeb:

1404 case llvm::Triple::thumb:

1405 case llvm::Triple::thumbeb:

1406

1407

1408 return std::nullopt;

1409 case llvm::Triple::aarch64:

1410 case llvm::Triple::aarch64_32:

1411 case llvm::Triple::aarch64_be:

1413 case llvm::Triple::bpfeb:

1414 case llvm::Triple::bpfel:

1415

1416

1417 return std::nullopt;

1418

1419 case llvm::Triple::x86:

1420 case llvm::Triple::x86_64:

1422

1423 case llvm::Triple::ppc:

1424 case llvm::Triple::ppcle:

1425 case llvm::Triple::ppc64:

1426 case llvm::Triple::ppc64le:

1427 case llvm::Triple::r600:

1428 case llvm::Triple::amdgcn:

1429 case llvm::Triple::systemz:

1430 case llvm::Triple::nvptx:

1431 case llvm::Triple::nvptx64:

1432 case llvm::Triple::wasm32:

1433 case llvm::Triple::wasm64:

1434 case llvm::Triple::hexagon:

1435 case llvm::Triple::riscv32:

1436 case llvm::Triple::riscv64:

1437

1438

1439 return std::nullopt;

1440 default:

1441 return std::nullopt;

1442 }

1443}

1448 if (getContext().BuiltinInfo.isAuxBuiltinID(builtinID)) {

1449 assert(getContext().getAuxTargetInfo() && "Missing aux target info");

1451 this, getContext().BuiltinInfo.getAuxBuiltinID(builtinID), e,

1453 }

1454

1456 getTarget().getTriple().getArch());

1457}

1460 const unsigned iceArguments, const unsigned idx, const Expr *argExpr) {

1461 mlir::Value arg = {};

1462 if ((iceArguments & (1 << idx)) == 0) {

1464 } else {

1465

1466

1467 const std::optionalllvm::APSInt result =

1469 assert(result && "Expected argument to be a constant");

1471 }

1472 return arg;

1473}

1478 unsigned builtinID) {

1479 assert(astContext.BuiltinInfo.isLibFunction(builtinID));

1480

1481

1482

1483

1485

1487 name = astContext.BuiltinInfo.getName(builtinID).substr(10);

1488

1492}

1496 if (sanOpts.has(SanitizerKind::Builtin))

1497 return argValue;

1498

1501 "emitCheckedArgForAssume: sanitizers are NYI");

1502 return {};

1503}

1506

1507

1508 cir::VAStartOp::create(builder, vaList.getLoc(), vaList, count);

1509}

1512 cir::VAEndOp::create(builder, vaList.getLoc(), vaList);

1513}

1521 mlir::Location loc = cgm.getLoc(ve->getExprLoc());

1524 return cir::VAArgOp::create(builder, loc, type, vaList);

1525}

1528 cir::IntType resType,

1529 mlir::Value emittedE,

1530 bool isDynamic) {

1532

1533

1534

1535

1538 (type & 2) ? 0 : -1);

1539

1540 mlir::Value ptr = emittedE ? emittedE : emitScalarExpr(e);

1541 assert(mlir::isacir::PointerType(ptr.getType()) &&

1542 "Non-pointer passed to __builtin_object_size?");

1543

1545

1546

1547

1548

1549 const bool min = ((type & 2) != 0);

1550

1551 auto op =

1553 min, true, isDynamic);

1554 return op.getResult();

1555}

1558 const Expr *e, unsigned type, cir::IntType resType, mlir::Value emittedE,

1559 bool isDynamic) {

1560 uint64_t objectSize;

1563 return builder.getConstInt(getLoc(e->getSourceRange()), resType, objectSize);

1564}