_addcarry_u64 и _addcarryx_u64 с MSVC и ICC

MSVC и ICC поддерживают встроенные _addcarry_u64 и _addcarryx_u64 .

Согласно Intel Intrinsic Guide и белой бумаге, они должны сопоставляться с adcx и adcx соответственно. Однако, посмотрев на сгенерированную сборку, ясно, что они сопоставляются с adcx и adcx соответственно, и нет никакого внутреннего, который сопоставляется с adox .

Кроме того, говорить компилятору о включении AVX2 с /arch:AVX2 в MSVC или -march=core-avx2 с ICC на Linux не имеет значения. Я не уверен, как включить ADX с MSVC и ICC.

Документация для MSVC перечисляет _addcarryx_u64 с технологией ADX, тогда как _addcarry_u64 не имеет перечисленных технологий. Тем не менее, ссылка в документации MSVC для этих встроенных функций напрямую связана с руководством Intel Intrinsic, что противоречит собственной документации MSVC и сгенерированной сборке.

Из этого я пришел к выводу, что Intel Intrinsic guide и белая бумага ошибочны.

Это означает, что MSVC считает, что он не позволяет встроенную сборку, он должен предоставить способ использования adc который он выполняет с _addcarry_u64 .

Одним из больших преимуществ adcx и adcx является то, что они работают на разных флагах (переносят CF и переполнение OF ), что позволяет использовать две независимые параллельные цепи переноса. Однако, поскольку для adox нет неотъемлемой возможности, как это возможно? С ICC по крайней мере один может использовать встроенную сборку, но это невозможно с MSVC в 64-битном режиме.


Документация Microsoft и Intel (как белая бумага, так и встроенный гид онлайн) согласуются.

_addcarry_u64 документация _addcarry_u64 говорит только об adc . _addcarryx_u64 может создавать либо adcx либо adcx . Однако с MSVC 2013 и 2015, _addcarryx_u64 создает только adcx . ICC производит оба.

Они сопоставляются с adcx , adcx AND adcx . Компилятор решает, какие инструкции использовать, в зависимости от того, как вы их используете. Если вы одновременно выполняете два добавления большого числа, компилятор будет использовать adcx и adcx для большей пропускной способности. Например:

 unsigned char c1 = 0, c2 = 0 for(i=0; i< 100; i++){ c1 = _addcarry_u64(c1, res[i], a[i], &res[i]); c2 = _addcarry_u64(c2, res[i], b[i], &res[i]); } 

Связанный, GCC не поддерживает ADOX и ADCX на данный момент. «В настоящий момент» включает GCC 6.4 (Fedora 25) и GCC 7.1 (Fedora 26). GCC эффективно отключает встроенные функции, но он все еще рекламирует поддержку, определяя __ADX__ в препроцессоре. Также см. Выпуск 67317, создание глупого кода для _addcarry_u32 / _addcarry_u64 . Большое спасибо Xi Ruoyao за то, что он нашел проблему.

Согласно Uros Bizjak в списке рассылки справки GCC, GCC может никогда не поддерживать внутренние функции . Также см. GCC не генерирует ADCX или ADOX для _addcarryx_u64 .

У Clang есть свой набор проблем в отношении ADOX и ADCX. Clang 3.9 и 4.0 при попытке их использования. Также см. Проблема 34249, Паника при использовании _addcarryx_u64 с Clang 3.9 . По словам Крейга Топпера, это должно быть исправлено в Clang 5.0.

Приношу свои извинения за отправку информации по запросу MSVC. Это один из немногих ударов при поиске информации об использовании встроенных функций.

  • .NET Assembly Diff / Compare Tool - Что доступно?
  • Как сделать kernel ​​для моего загрузчика?
  • Очень быстро memcpy для обработки изображений?
  • Maven: добавьте зависимость к банке относительным путем
  • Инициализировать библиотеку при загрузке сборки
  • Как ссылаться на сборки .NET с помощью PowerShell
  • Безопасно ли читать конец конца буфера на одной странице на x86 и x64?
  • Как объединить несколько сборок в один?
  • Как определить, была ли assembly .NET построена для x86 или x64?
  • Ошибки CocoaPods при сборке проекта
  • Как я могу перечислить все загруженные сборки?
  • Interesting Posts

    различия между использованием wmode = “transparent”, “opaque” или “window” для встроенного объекта на веб-странице

    Удалите файлы старше 3 месяцев в каталоге с помощью .NET.

    Что такое JAXB и почему я должен его использовать?

    Python 2.7: streamовый HTTP-сервер, поддерживающий несколько соединений на одном порту

    как ссылаться на относительный файл из кода и тестов

    Почему csrss.exe и ccsvchst.exe измельчают мой жесткий диск до 45 минут за раз?

    Как использовать wait и уведомлять в Java без IllegalMonitorStateException?

    Получить номер порта сервера из tomcat без запроса

    Соглашение об именах iPhone ivar

    Gson – конвертировать из Json в типизированный ArrayList

    Динамическая форма с повторяющейся формой

    Notepad ++ Найти / заменить номер с добавочным значением

    Зачем мне сначала устанавливать значения Autologon в реестре до того, как он работает, и могу ли я исправить это?

    Как выбрать шаблон пробела?

    В чем разница между комментариями @Component, @Repository и @Service весной?

    Давайте будем гением компьютера.