17 const TypeInfo boolT = {mlir::IntegerType::getTypeID(), 1};
18 const TypeInfo i4T = {mlir::IntegerType::getTypeID(), 4};
19 const TypeInfo i8T = {mlir::IntegerType::getTypeID(), 8};
20 const TypeInfo i16T = {mlir::IntegerType::getTypeID(), 16};
21 const TypeInfo i32T = {mlir::IntegerType::getTypeID(), 32};
22 const TypeInfo i48T = {mlir::IntegerType::getTypeID(), 48};
23 const TypeInfo i64T = {mlir::IntegerType::getTypeID(), 64};
24 const TypeInfo bf16T = {mlir::BFloat16Type::getTypeID(), 16};
25 const TypeInfo fp16T = {mlir::Float16Type::getTypeID(), 16};
26 const TypeInfo fp32T = {mlir::Float32Type::getTypeID(), 32};
27 const TypeInfo fp8e4m3T = {mlir::Float8E4M3FNType::getTypeID(), 8};
28 const TypeInfo fp8e5m2T = {mlir::Float8E5M2Type::getTypeID(), 8};
33 const TypeInfo fp6e2m3T = {mlir::Float6E2M3FNType::getTypeID(), 6};
34 const TypeInfo fp6e3m2T = {mlir::Float6E3M2FNType::getTypeID(), 6};
35 const TypeInfo fp4e2m1T = {mlir::Float4E2M1FNType::getTypeID(), 4};
36 const TypeInfo fp8ue8m0T = {mlir::Float8E8M0FNUType::getTypeID(), 8};
37 const TypeInfo mxint8T = {mlir::tosa::mxint8Type::getTypeID(), 8};
40 const TypeID blockScaledID = mlir::tosa::BlockScaledType::getTypeID();
41 const TypeID fp4e2m1ID = mlir::Float4E2M1FNType::getTypeID();
42 const TypeID fp6e2m3ID = mlir::Float6E2M3FNType::getTypeID();
43 const TypeID fp6e3m2ID = mlir::Float6E3M2FNType::getTypeID();
44 const TypeID fp8e4m3ID = mlir::Float8E4M3FNType::getTypeID();
45 const TypeID fp8e5m2ID = mlir::Float8E5M2Type::getTypeID();
46 const TypeID fp8ue8m0ID = mlir::Float8E8M0FNUType::getTypeID();
47 const TypeID mxint8ID = mlir::tosa::mxint8Type::getTypeID();
49 const TypeInfo bs32_fp8ue8m0_fp4e2m1T = {blockScaledID, 4, fp4e2m1ID,
51 tosa::BlockShape::BLOCK_SHAPE_32};
52 const TypeInfo bs32_fp8ue8m0_fp6e2m3T = {blockScaledID, 6, fp6e2m3ID,
54 tosa::BlockShape::BLOCK_SHAPE_32};
55 const TypeInfo bs32_fp8ue8m0_fp6e3m2T = {blockScaledID, 6, fp6e3m2ID,
57 tosa::BlockShape::BLOCK_SHAPE_32};
58 const TypeInfo bs32_fp8ue8m0_fp8e4m3T = {blockScaledID, 8, fp8e4m3ID,
60 tosa::BlockShape::BLOCK_SHAPE_32};
61 const TypeInfo bs32_fp8ue8m0_fp8e5m2T = {blockScaledID, 8, fp8e5m2ID,
63 tosa::BlockShape::BLOCK_SHAPE_32};
64 const TypeInfo bs32_fp8ue8m0_mxint8T = {
65 blockScaledID, 8, mxint8ID, fp8ue8m0ID, tosa::BlockShape::BLOCK_SHAPE_32};
467 if (specRequiredModeSet.size() == 0)
470 const auto maybeOpEntries = getOperatorMatchedEntries<T>(op);
471 if (failed(maybeOpEntries)) {
477 for (
const auto &cands : specRequiredModeSet) {
480 modeCount += cands.size();
484 << (modeCount > 1 ?
" any of " :
" ") <<
"["
487 <<
"] but not enabled in target\n";
492 const auto opEntries = maybeOpEntries.value();
493 if (opEntries.size() == 0) {
509 const auto isVersionCompatible =
512 info.operandTypeInfoSet.front().second};
516 for (
const auto &info : opEntries) {
519 assert(llvm::all_of(info.mode,
520 [&specRequiredModeSet](
const T &mode) {
521 return llvm::is_contained(specRequiredModeSet.front(),
524 "the profile/extension requirement of the operator should be "
525 "included in the profile compliance information");
527 if (isModeAllowed(info) && isVersionCompatible(info))
534 llvm::raw_string_ostream os(message);
537 const size_t numOpEntries = opEntries.size();
538 for (
const auto &[
index, info] : llvm::enumerate(opEntries)) {
539 bool mismatchedVersion =
false;
540 if (!isVersionCompatible(info)) {
541 mismatchedVersion =
true;
542 os <<
"requires specification version compatible with "
547 if (!isModeAllowed(info)) {
548 if (mismatchedVersion)
553 <<
"] profiles/extensions ";
556 if (
index != numOpEntries - 1)
559 os <<
"to be specified in the target environment";
585 const auto maybeProfEntries = getOperatorMatchedEntries<Profile>(op);
586 const auto maybeExtEntries = getOperatorMatchedEntries<Extension>(op);
587 if (failed(maybeProfEntries) && failed(maybeExtEntries))
590 const bool hasEntry =
591 (succeeded(maybeProfEntries) && !maybeProfEntries.value().empty()) ||
592 (succeeded(maybeExtEntries) && !maybeExtEntries.value().empty());
596 llvm::raw_string_ostream os(message);
597 os <<
"illegal: operation operand/result data types did not align with any "
598 "profile or extension, got (";
602 for (
const auto &typeInfo : llvm::drop_end(current))
611 const auto searchBestMatch = [&](
auto map) {
612 for (
const auto &complianceInfos : map[opName]) {
613 for (
const auto &versionedTypeInfos :
614 complianceInfos.operandTypeInfoSet) {
616 if (current.size() != typeInfos.size())
618 const int matches = llvm::count_if(
619 llvm::zip_equal(current, typeInfos), [&](
const auto zipType) {
621 std::get<1>(zipType));
623 if (matches > maxMatches) {
624 maxMatches = matches;
625 bestTypeInfo = typeInfos;
633 os <<
", did you mean (";
634 for (
const auto &typeInfo : llvm::drop_end(bestTypeInfo))
637 os <<
"Otherwise, please refer to the 'supported data types' for '"
638 << opName <<
"' in the specification.";
723 const auto stringifyScalarTypeInfo =
725 if (typeInfo.
typeID == mlir::IntegerType::getTypeID()) {
726 return {
"i" + llvm::utostr(typeInfo.
bitWidth)};
728 if (typeInfo.
typeID == mlir::Float16Type::getTypeID()) {
730 }
else if (typeInfo.
typeID == mlir::Float32Type::getTypeID()) {
732 }
else if (typeInfo.
typeID == mlir::BFloat16Type::getTypeID()) {
734 }
else if (typeInfo.
typeID == mlir::Float8E4M3FNType::getTypeID()) {
736 }
else if (typeInfo.
typeID == mlir::Float8E5M2Type::getTypeID()) {
738 }
else if (typeInfo.
typeID == mlir::Float6E2M3FNType::getTypeID()) {
740 }
else if (typeInfo.
typeID == mlir::Float6E3M2FNType::getTypeID()) {
742 }
else if (typeInfo.
typeID == mlir::Float4E2M1FNType::getTypeID()) {
744 }
else if (typeInfo.
typeID == mlir::Float8E8M0FNUType::getTypeID()) {
746 }
else if (typeInfo.
typeID == tosa::mxint8Type::getTypeID()) {
749 llvm_unreachable(
"unknown type");
752 if (typeInfo.
typeID == tosa::BlockScaledType::getTypeID()) {
756 llvm::raw_svector_ostream os(
result);
758 << tosa::BlockShapeAttr::getBlockShapeValue(typeInfo.
blockShape.value())
759 <<
"_" << stringifyScalarTypeInfo(scaleInfo) <<
"_"
760 << stringifyScalarTypeInfo(valueInfo);
764 return stringifyScalarTypeInfo(typeInfo);