From 58b16cf311702cfa8574166750a6a4e4cfa8a288 Mon Sep 17 00:00:00 2001 From: Feruzjon Muyassarov Date: Wed, 7 Dec 2022 10:37:51 +0200 Subject: [PATCH] Add Intel Granite Rapid features (#125) Detect Granite Rapid features - AMXFP16 - tile computational operations on FP16 numbers - PREFETCHI - PREFETCHIT0/1 instructions Signed-off-by: Feruzjon Muyassarov --- README.md | 2 + cpuid.go | 6 + featureid_string.go | 384 ++++++++++++++++++++++---------------------- 3 files changed, 201 insertions(+), 191 deletions(-) diff --git a/README.md b/README.md index e2bc02e..659e0a1 100644 --- a/README.md +++ b/README.md @@ -269,6 +269,7 @@ Exit Code 1 | AMD3DNOWEXT | AMD 3DNowExt | | AMXBF16 | Tile computational operations on BFLOAT16 numbers | | AMXINT8 | Tile computational operations on 8-bit integers | +| AMXFP16 | Tile computational operations on FP16 numbers | | AMXTILE | Tile architecture | | AVX | AVX functions | | AVX2 | AVX2 functions | @@ -368,6 +369,7 @@ Exit Code 1 | PCONFIG | PCONFIG for Intel Multi-Key Total Memory Encryption | | POPCNT | POPCNT instruction | | PPIN | AMD: Protected Processor Inventory Number support. Indicates that Protected Processor Inventory Number (PPIN) capability can be enabled | +| PREFETCHI | PREFETCHIT0/1 instructions | | PSFD | AMD: Predictive Store Forward Disable | | RDPRU | RDPRU instruction supported | | RDRAND | RDRAND instruction is available | diff --git a/cpuid.go b/cpuid.go index 2dd8478..8cad0d1 100644 --- a/cpuid.go +++ b/cpuid.go @@ -73,6 +73,7 @@ const ( AMD3DNOW // AMD 3DNOW AMD3DNOWEXT // AMD 3DNowExt AMXBF16 // Tile computational operations on BFLOAT16 numbers + AMXFP16 // Tile computational operations on FP16 numbers AMXINT8 // Tile computational operations on 8-bit integers AMXTILE // Tile architecture AVX // AVX functions @@ -173,6 +174,7 @@ const ( PCONFIG // PCONFIG for Intel Multi-Key Total Memory Encryption POPCNT // POPCNT instruction PPIN // AMD: Protected Processor Inventory Number support. Indicates that Protected Processor Inventory Number (PPIN) capability can be enabled + PREFETCHI // PREFETCHIT0/1 instructions PSFD // AMD: Predictive Store Forward Disable RDPRU // RDPRU instruction supported RDRAND // RDRAND instruction is available @@ -1175,6 +1177,9 @@ func support() flagSet { fs.setIf(edx&(1<<30) != 0, IA32_CORE_CAP) fs.setIf(edx&(1<<31) != 0, SPEC_CTRL_SSBD) + // CPUID.(EAX=7, ECX=1).EDX + fs.setIf(edx&(1<<14) != 0, PREFETCHI) + // CPUID.(EAX=7, ECX=1) eax1, _, _, _ := cpuidex(7, 1) fs.setIf(fs.inSet(AVX) && eax1&(1<<4) != 0, AVXVNNI) @@ -1219,6 +1224,7 @@ func support() flagSet { fs.setIf(edx&(1<<25) != 0, AMXINT8) // eax1 = CPUID.(EAX=7, ECX=1).EAX fs.setIf(eax1&(1<<5) != 0, AVX512BF16) + fs.setIf(eax1&(1<<21) != 0, AMXFP16) } } diff --git a/featureid_string.go b/featureid_string.go index d9bd083..479162f 100644 --- a/featureid_string.go +++ b/featureid_string.go @@ -13,201 +13,203 @@ func _() { _ = x[AMD3DNOW-3] _ = x[AMD3DNOWEXT-4] _ = x[AMXBF16-5] - _ = x[AMXINT8-6] - _ = x[AMXTILE-7] - _ = x[AVX-8] - _ = x[AVX2-9] - _ = x[AVX512BF16-10] - _ = x[AVX512BITALG-11] - _ = x[AVX512BW-12] - _ = x[AVX512CD-13] - _ = x[AVX512DQ-14] - _ = x[AVX512ER-15] - _ = x[AVX512F-16] - _ = x[AVX512FP16-17] - _ = x[AVX512IFMA-18] - _ = x[AVX512PF-19] - _ = x[AVX512VBMI-20] - _ = x[AVX512VBMI2-21] - _ = x[AVX512VL-22] - _ = x[AVX512VNNI-23] - _ = x[AVX512VP2INTERSECT-24] - _ = x[AVX512VPOPCNTDQ-25] - _ = x[AVXSLOW-26] - _ = x[AVXVNNI-27] - _ = x[BMI1-28] - _ = x[BMI2-29] - _ = x[CETIBT-30] - _ = x[CETSS-31] - _ = x[CLDEMOTE-32] - _ = x[CLMUL-33] - _ = x[CLZERO-34] - _ = x[CMOV-35] - _ = x[CMPSB_SCADBS_SHORT-36] - _ = x[CMPXCHG8-37] - _ = x[CPBOOST-38] - _ = x[CPPC-39] - _ = x[CX16-40] - _ = x[EFER_LMSLE_UNS-41] - _ = x[ENQCMD-42] - _ = x[ERMS-43] - _ = x[F16C-44] - _ = x[FLUSH_L1D-45] - _ = x[FMA3-46] - _ = x[FMA4-47] - _ = x[FP128-48] - _ = x[FP256-49] - _ = x[FSRM-50] - _ = x[FXSR-51] - _ = x[FXSROPT-52] - _ = x[GFNI-53] - _ = x[HLE-54] - _ = x[HRESET-55] - _ = x[HTT-56] - _ = x[HWA-57] - _ = x[HYBRID_CPU-58] - _ = x[HYPERVISOR-59] - _ = x[IA32_ARCH_CAP-60] - _ = x[IA32_CORE_CAP-61] - _ = x[IBPB-62] - _ = x[IBRS-63] - _ = x[IBRS_PREFERRED-64] - _ = x[IBRS_PROVIDES_SMP-65] - _ = x[IBS-66] - _ = x[IBSBRNTRGT-67] - _ = x[IBSFETCHSAM-68] - _ = x[IBSFFV-69] - _ = x[IBSOPCNT-70] - _ = x[IBSOPCNTEXT-71] - _ = x[IBSOPSAM-72] - _ = x[IBSRDWROPCNT-73] - _ = x[IBSRIPINVALIDCHK-74] - _ = x[IBS_FETCH_CTLX-75] - _ = x[IBS_OPDATA4-76] - _ = x[IBS_OPFUSE-77] - _ = x[IBS_PREVENTHOST-78] - _ = x[IBS_ZEN4-79] - _ = x[INT_WBINVD-80] - _ = x[INVLPGB-81] - _ = x[LAHF-82] - _ = x[LAM-83] - _ = x[LBRVIRT-84] - _ = x[LZCNT-85] - _ = x[MCAOVERFLOW-86] - _ = x[MCDT_NO-87] - _ = x[MCOMMIT-88] - _ = x[MD_CLEAR-89] - _ = x[MMX-90] - _ = x[MMXEXT-91] - _ = x[MOVBE-92] - _ = x[MOVDIR64B-93] - _ = x[MOVDIRI-94] - _ = x[MOVSB_ZL-95] - _ = x[MOVU-96] - _ = x[MPX-97] - _ = x[MSRIRC-98] - _ = x[MSR_PAGEFLUSH-99] - _ = x[NRIPS-100] - _ = x[NX-101] - _ = x[OSXSAVE-102] - _ = x[PCONFIG-103] - _ = x[POPCNT-104] - _ = x[PPIN-105] - _ = x[PSFD-106] - _ = x[RDPRU-107] - _ = x[RDRAND-108] - _ = x[RDSEED-109] - _ = x[RDTSCP-110] - _ = x[RTM-111] - _ = x[RTM_ALWAYS_ABORT-112] - _ = x[SERIALIZE-113] - _ = x[SEV-114] - _ = x[SEV_64BIT-115] - _ = x[SEV_ALTERNATIVE-116] - _ = x[SEV_DEBUGSWAP-117] - _ = x[SEV_ES-118] - _ = x[SEV_RESTRICTED-119] - _ = x[SEV_SNP-120] - _ = x[SGX-121] - _ = x[SGXLC-122] - _ = x[SHA-123] - _ = x[SME-124] - _ = x[SME_COHERENT-125] - _ = x[SPEC_CTRL_SSBD-126] - _ = x[SRBDS_CTRL-127] - _ = x[SSE-128] - _ = x[SSE2-129] - _ = x[SSE3-130] - _ = x[SSE4-131] - _ = x[SSE42-132] - _ = x[SSE4A-133] - _ = x[SSSE3-134] - _ = x[STIBP-135] - _ = x[STIBP_ALWAYSON-136] - _ = x[STOSB_SHORT-137] - _ = x[SUCCOR-138] - _ = x[SVM-139] - _ = x[SVMDA-140] - _ = x[SVMFBASID-141] - _ = x[SVML-142] - _ = x[SVMNP-143] - _ = x[SVMPF-144] - _ = x[SVMPFT-145] - _ = x[SYSCALL-146] - _ = x[SYSEE-147] - _ = x[TBM-148] - _ = x[TLB_FLUSH_NESTED-149] - _ = x[TME-150] - _ = x[TOPEXT-151] - _ = x[TSCRATEMSR-152] - _ = x[TSXLDTRK-153] - _ = x[VAES-154] - _ = x[VMCBCLEAN-155] - _ = x[VMPL-156] - _ = x[VMSA_REGPROT-157] - _ = x[VMX-158] - _ = x[VPCLMULQDQ-159] - _ = x[VTE-160] - _ = x[WAITPKG-161] - _ = x[WBNOINVD-162] - _ = x[X87-163] - _ = x[XGETBV1-164] - _ = x[XOP-165] - _ = x[XSAVE-166] - _ = x[XSAVEC-167] - _ = x[XSAVEOPT-168] - _ = x[XSAVES-169] - _ = x[AESARM-170] - _ = x[ARMCPUID-171] - _ = x[ASIMD-172] - _ = x[ASIMDDP-173] - _ = x[ASIMDHP-174] - _ = x[ASIMDRDM-175] - _ = x[ATOMICS-176] - _ = x[CRC32-177] - _ = x[DCPOP-178] - _ = x[EVTSTRM-179] - _ = x[FCMA-180] - _ = x[FP-181] - _ = x[FPHP-182] - _ = x[GPA-183] - _ = x[JSCVT-184] - _ = x[LRCPC-185] - _ = x[PMULL-186] - _ = x[SHA1-187] - _ = x[SHA2-188] - _ = x[SHA3-189] - _ = x[SHA512-190] - _ = x[SM3-191] - _ = x[SM4-192] - _ = x[SVE-193] - _ = x[lastID-194] + _ = x[AMXFP16-6] + _ = x[AMXINT8-7] + _ = x[AMXTILE-8] + _ = x[AVX-9] + _ = x[AVX2-10] + _ = x[AVX512BF16-11] + _ = x[AVX512BITALG-12] + _ = x[AVX512BW-13] + _ = x[AVX512CD-14] + _ = x[AVX512DQ-15] + _ = x[AVX512ER-16] + _ = x[AVX512F-17] + _ = x[AVX512FP16-18] + _ = x[AVX512IFMA-19] + _ = x[AVX512PF-20] + _ = x[AVX512VBMI-21] + _ = x[AVX512VBMI2-22] + _ = x[AVX512VL-23] + _ = x[AVX512VNNI-24] + _ = x[AVX512VP2INTERSECT-25] + _ = x[AVX512VPOPCNTDQ-26] + _ = x[AVXSLOW-27] + _ = x[AVXVNNI-28] + _ = x[BMI1-29] + _ = x[BMI2-30] + _ = x[CETIBT-31] + _ = x[CETSS-32] + _ = x[CLDEMOTE-33] + _ = x[CLMUL-34] + _ = x[CLZERO-35] + _ = x[CMOV-36] + _ = x[CMPSB_SCADBS_SHORT-37] + _ = x[CMPXCHG8-38] + _ = x[CPBOOST-39] + _ = x[CPPC-40] + _ = x[CX16-41] + _ = x[EFER_LMSLE_UNS-42] + _ = x[ENQCMD-43] + _ = x[ERMS-44] + _ = x[F16C-45] + _ = x[FLUSH_L1D-46] + _ = x[FMA3-47] + _ = x[FMA4-48] + _ = x[FP128-49] + _ = x[FP256-50] + _ = x[FSRM-51] + _ = x[FXSR-52] + _ = x[FXSROPT-53] + _ = x[GFNI-54] + _ = x[HLE-55] + _ = x[HRESET-56] + _ = x[HTT-57] + _ = x[HWA-58] + _ = x[HYBRID_CPU-59] + _ = x[HYPERVISOR-60] + _ = x[IA32_ARCH_CAP-61] + _ = x[IA32_CORE_CAP-62] + _ = x[IBPB-63] + _ = x[IBRS-64] + _ = x[IBRS_PREFERRED-65] + _ = x[IBRS_PROVIDES_SMP-66] + _ = x[IBS-67] + _ = x[IBSBRNTRGT-68] + _ = x[IBSFETCHSAM-69] + _ = x[IBSFFV-70] + _ = x[IBSOPCNT-71] + _ = x[IBSOPCNTEXT-72] + _ = x[IBSOPSAM-73] + _ = x[IBSRDWROPCNT-74] + _ = x[IBSRIPINVALIDCHK-75] + _ = x[IBS_FETCH_CTLX-76] + _ = x[IBS_OPDATA4-77] + _ = x[IBS_OPFUSE-78] + _ = x[IBS_PREVENTHOST-79] + _ = x[IBS_ZEN4-80] + _ = x[INT_WBINVD-81] + _ = x[INVLPGB-82] + _ = x[LAHF-83] + _ = x[LAM-84] + _ = x[LBRVIRT-85] + _ = x[LZCNT-86] + _ = x[MCAOVERFLOW-87] + _ = x[MCDT_NO-88] + _ = x[MCOMMIT-89] + _ = x[MD_CLEAR-90] + _ = x[MMX-91] + _ = x[MMXEXT-92] + _ = x[MOVBE-93] + _ = x[MOVDIR64B-94] + _ = x[MOVDIRI-95] + _ = x[MOVSB_ZL-96] + _ = x[MOVU-97] + _ = x[MPX-98] + _ = x[MSRIRC-99] + _ = x[MSR_PAGEFLUSH-100] + _ = x[NRIPS-101] + _ = x[NX-102] + _ = x[OSXSAVE-103] + _ = x[PCONFIG-104] + _ = x[POPCNT-105] + _ = x[PPIN-106] + _ = x[PREFETCHI-107] + _ = x[PSFD-108] + _ = x[RDPRU-109] + _ = x[RDRAND-110] + _ = x[RDSEED-111] + _ = x[RDTSCP-112] + _ = x[RTM-113] + _ = x[RTM_ALWAYS_ABORT-114] + _ = x[SERIALIZE-115] + _ = x[SEV-116] + _ = x[SEV_64BIT-117] + _ = x[SEV_ALTERNATIVE-118] + _ = x[SEV_DEBUGSWAP-119] + _ = x[SEV_ES-120] + _ = x[SEV_RESTRICTED-121] + _ = x[SEV_SNP-122] + _ = x[SGX-123] + _ = x[SGXLC-124] + _ = x[SHA-125] + _ = x[SME-126] + _ = x[SME_COHERENT-127] + _ = x[SPEC_CTRL_SSBD-128] + _ = x[SRBDS_CTRL-129] + _ = x[SSE-130] + _ = x[SSE2-131] + _ = x[SSE3-132] + _ = x[SSE4-133] + _ = x[SSE42-134] + _ = x[SSE4A-135] + _ = x[SSSE3-136] + _ = x[STIBP-137] + _ = x[STIBP_ALWAYSON-138] + _ = x[STOSB_SHORT-139] + _ = x[SUCCOR-140] + _ = x[SVM-141] + _ = x[SVMDA-142] + _ = x[SVMFBASID-143] + _ = x[SVML-144] + _ = x[SVMNP-145] + _ = x[SVMPF-146] + _ = x[SVMPFT-147] + _ = x[SYSCALL-148] + _ = x[SYSEE-149] + _ = x[TBM-150] + _ = x[TLB_FLUSH_NESTED-151] + _ = x[TME-152] + _ = x[TOPEXT-153] + _ = x[TSCRATEMSR-154] + _ = x[TSXLDTRK-155] + _ = x[VAES-156] + _ = x[VMCBCLEAN-157] + _ = x[VMPL-158] + _ = x[VMSA_REGPROT-159] + _ = x[VMX-160] + _ = x[VPCLMULQDQ-161] + _ = x[VTE-162] + _ = x[WAITPKG-163] + _ = x[WBNOINVD-164] + _ = x[X87-165] + _ = x[XGETBV1-166] + _ = x[XOP-167] + _ = x[XSAVE-168] + _ = x[XSAVEC-169] + _ = x[XSAVEOPT-170] + _ = x[XSAVES-171] + _ = x[AESARM-172] + _ = x[ARMCPUID-173] + _ = x[ASIMD-174] + _ = x[ASIMDDP-175] + _ = x[ASIMDHP-176] + _ = x[ASIMDRDM-177] + _ = x[ATOMICS-178] + _ = x[CRC32-179] + _ = x[DCPOP-180] + _ = x[EVTSTRM-181] + _ = x[FCMA-182] + _ = x[FP-183] + _ = x[FPHP-184] + _ = x[GPA-185] + _ = x[JSCVT-186] + _ = x[LRCPC-187] + _ = x[PMULL-188] + _ = x[SHA1-189] + _ = x[SHA2-190] + _ = x[SHA3-191] + _ = x[SHA512-192] + _ = x[SM3-193] + _ = x[SM4-194] + _ = x[SVE-195] + _ = x[lastID-196] _ = x[firstID-0] } -const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXINT8AMXTILEAVXAVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXSLOWAVXVNNIBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4INT_WBINVDINVLPGBLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPSFDRDPRURDRANDRDSEEDRDTSCPRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID" +const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXFP16AMXINT8AMXTILEAVXAVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXSLOWAVXVNNIBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4INT_WBINVDINVLPGBLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPREFETCHIPSFDRDPRURDRANDRDSEEDRDTSCPRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID" -var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 58, 62, 72, 84, 92, 100, 108, 116, 123, 133, 143, 151, 161, 172, 180, 190, 208, 223, 230, 237, 241, 245, 251, 256, 264, 269, 275, 279, 297, 305, 312, 316, 320, 334, 340, 344, 348, 357, 361, 365, 370, 375, 379, 383, 390, 394, 397, 403, 406, 409, 419, 429, 442, 455, 459, 463, 477, 494, 497, 507, 518, 524, 532, 543, 551, 563, 579, 593, 604, 614, 629, 637, 647, 654, 658, 661, 668, 673, 684, 691, 698, 706, 709, 715, 720, 729, 736, 744, 748, 751, 757, 770, 775, 777, 784, 791, 797, 801, 805, 810, 816, 822, 828, 831, 847, 856, 859, 868, 883, 896, 902, 916, 923, 926, 931, 934, 937, 949, 963, 973, 976, 980, 984, 988, 993, 998, 1003, 1008, 1022, 1033, 1039, 1042, 1047, 1056, 1060, 1065, 1070, 1076, 1083, 1088, 1091, 1107, 1110, 1116, 1126, 1134, 1138, 1147, 1151, 1163, 1166, 1176, 1179, 1186, 1194, 1197, 1204, 1207, 1212, 1218, 1226, 1232, 1238, 1246, 1251, 1258, 1265, 1273, 1280, 1285, 1290, 1297, 1301, 1303, 1307, 1310, 1315, 1320, 1325, 1329, 1333, 1337, 1343, 1346, 1349, 1352, 1358} +var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 62, 65, 69, 79, 91, 99, 107, 115, 123, 130, 140, 150, 158, 168, 179, 187, 197, 215, 230, 237, 244, 248, 252, 258, 263, 271, 276, 282, 286, 304, 312, 319, 323, 327, 341, 347, 351, 355, 364, 368, 372, 377, 382, 386, 390, 397, 401, 404, 410, 413, 416, 426, 436, 449, 462, 466, 470, 484, 501, 504, 514, 525, 531, 539, 550, 558, 570, 586, 600, 611, 621, 636, 644, 654, 661, 665, 668, 675, 680, 691, 698, 705, 713, 716, 722, 727, 736, 743, 751, 755, 758, 764, 777, 782, 784, 791, 798, 804, 808, 817, 821, 826, 832, 838, 844, 847, 863, 872, 875, 884, 899, 912, 918, 932, 939, 942, 947, 950, 953, 965, 979, 989, 992, 996, 1000, 1004, 1009, 1014, 1019, 1024, 1038, 1049, 1055, 1058, 1063, 1072, 1076, 1081, 1086, 1092, 1099, 1104, 1107, 1123, 1126, 1132, 1142, 1150, 1154, 1163, 1167, 1179, 1182, 1192, 1195, 1202, 1210, 1213, 1220, 1223, 1228, 1234, 1242, 1248, 1254, 1262, 1267, 1274, 1281, 1289, 1296, 1301, 1306, 1313, 1317, 1319, 1323, 1326, 1331, 1336, 1341, 1345, 1349, 1353, 1359, 1362, 1365, 1368, 1374} func (i FeatureID) String() string { if i < 0 || i >= FeatureID(len(_FeatureID_index)-1) {