Насколько я знаю.
То, как я реализовал это в Zlib Chromium, использовало доступные функциональные возможности ОС: https://cs.chromium.org/chromium/src/third_party/zlib/arm_features.c?l=29
Также важно упомянуть, чтоИнструкции crc32 в ARMv8 являются частью крипто-расширений, которые являются необязательными для ARMv8 и обязательными для ARMv8-1.Это также означает, что обнаружение функции времени выполнения необходимо, для получения более подробной информации, пожалуйста, проверьте: https://cs.chromium.org/chromium/src/third_party/zlib/BUILD.gn?l=64
Я бы избегал чтения напрямую из / proc / cpuinfo, так как это может быть недоступно в некоторых контекстах (так как также зависит отна аромате Android это может быть ложный минус).
В Chromium zlib будет запускаться как в привилегированном контексте (т. Е. В части сетевого кода в основном процессе браузера), так и в изолированном контексте (т. Е. В части RendererProcess на вкладке).В RendererProcess чтение из / proc / cpuinfo должно завершиться неудачей.
Подход кувалдой - установить обработчик сигнала и выполнить инструкцию со встроенным asm, что приведет к ошибке, если инструкция недоступна (иможет быть захвачен обработчиком).Однако не рекомендуется.
Вышеупомянутый пример (https://github.com/torvalds/linux/blob/master/Documentation/arm64/cpu-feature-registers.txt) работал на 1 плате ARM, которую я тестировал (MachiatoBin), но не удался на 2 других (rock64 и nanopi m4).
Подход, реализованный в Chromium, работает на всех платах (также как и на нескольких мобильных телефонах, которые я тестировал).
Еще одна деталь о getauxval: правильный флаг изменится, если он работает на 32-битной или 64-битной версии.будет HWCAP_CRC32, в то время как в 32 битах это будет HWCAP2_CRC32.
О подходе sledgehammer : Сигналы подвержены гонкам, плюс вы все равно будете полагаться на использование специфичных для ОС API (т.е.установите обработчик сигнала).
Наконец, в зависимости от контекста, если данная задача падает (даже если она задана и изолирована от контекста выполнения), она вызовет красные флаги.
Этоэто точка (то есть обнаружение функций), где жизнь на x86 намного проще.
При этом может быть приемлемым компромиссом полагаться на функции ОС.отправлял связанный код в Chromium с момента выпуска M66 (текущая стабильная версия - M72), впервые полученная почти год назад без каких-либо плохих отчетов.
Одним из соображений на Android было то, что внутренне NDK может реализовать android_getCpuFeatures (), используяdlopen () / dlsym (), который может добавить около 500us к 1000us при первом запуске, поэтому мы кешируем результат обнаружения функции процессора.
Еще одним соображением для многопоточных приложений (таких как Chromium) былонужен барьер для потока (то есть pthread_once_t), чтобы избежать состояния гонки при выполнении определения характеристик процессора.