以下のような x86 RDRAND 実装があります。RDSEED にも同様の実装があります。
inline void RDRAND32(void* output)
{
#if defined(HAVE_GCC_RDRAND_ASM)
__asm__
(
"1:\n"
".byte 0x0f, 0xc7, 0xf0;\n"
"jnc 1b;\n"
: "=a" (*(uint32_t*)output)
: : "cc"
);
#endif
}
発行されたバイトコードはrdrand eax
、有能なプロセッサが喜んでそれらを消費します。Sun Studio 12.1 以降は、GCC インライン アセンブリをサポートし、それらも使用します。
Sun のドキュメントによると、 -xarch=avx_i
RDRAND を提供する ISA (および-xarch=avx2_i
RDSEED) が必要であると書かれています。Sun Studio 12.6 |も参照してください。-xarch x86 のフラグ。
この使用例では-xarch=avx_i
、リンカー フラグにまだ追加する必要がありますか?RDRAND
重要な場合は、実行時に CPU 機能を保護し、Mapfile を使用して ISA を下げます (実行時のパスが保護されるため)。
$ cat cryptopp.mapfile
# Solaris mapfile to override hardware caps to avoid kills
hwcap_1 = SSE SSE2 OVERRIDE;