Не удалось вставить g ++ в вызове always_inline "int _rdrand16_step ()" - PullRequest
0 голосов
/ 07 сентября 2018

Я написал код с использованием функции Intel _rdrand16_step(), в Windows (Visual Studio 2017) работает нормально, но в Linux (g ++) я не могу заставить его работать. Я вызываю эту функцию 2 раза в моем коде:

#include <immintrin.h>
...
unsigned short val = 0;
if (_rdrand16_step(&val))
...
_rdrand16_step(&val);
...

и вывод g ++ это:

/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h: In member function ‘int otp_s7c::crypt(std::__cxx11::string, std::__cxx11::string, long long unsigned int)’:
/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h:129:1: error: inlining failed in call to always_inline ‘int _rdrand16_step(short unsigned int*)’: target specific option mismatch
 _rdrand16_step (unsigned short *__P)
 ^~~~~~~~~~~~~~
otp_s7c.cpp:139:24: note: called from here
      if (_rdrand16_step(&val))
          ~~~~~~~~~~~~~~^~~~~~
/usr/lib/gcc/x86_64-linux-gnu/8/include/immintrin.h:129:1: error: inlining failed in call to always_inline ‘int _rdrand16_step(short unsigned int*)’: target specific option mismatch
 _rdrand16_step (unsigned short *__P)
 ^~~~~~~~~~~~~~
otp_s7c.cpp:148:23: note: called from here
         _rdrand16_step(&val);
         ~~~~~~~~~~~~~~^~~~~~

1 Ответ

0 голосов
/ 07 сентября 2018

Это несколько вводящее в заблуждение сообщение об ошибке, вытекающее из того факта, что вы на самом деле не говорите компилятору о том, что инструкция RDRAND поддерживается в вашей целевой архитектуре (насколько я могу судить, важной частью здесь является «целевой специфический параметр» Несоответствие "часть в конце).

Добавление -mrdrnd к флагам компилятора, похоже, решает проблему.


Сравните пример в Compiler Explorer с и без флаг

...