#include "dispatch.h"
-/*----- Main code ---------------------------------------------------------*/
+/*----- Intel x86/AMD64 feature probing -----------------------------------*/
#ifdef CPUFAM_X86
#define EFLAGS_ID (1u << 21)
#define CPUID1D_SSE2 (1u << 26)
#define CPUID1D_FXSR (1u << 24)
+#define CPUID1C_AESNI (1u << 25)
struct cpuid { unsigned a, b, c, d; };
static unsigned cpuid_maxleaf(void)
{ struct cpuid c; cpuid(&c, 0, 0); return (c.a); }
+/* --- @cpuid_features_p@ --- *
+ *
+ * Arguments: @unsigned dbits@ = bits to check in EDX
+ * @unsigned cbits@ = bits to check in ECX
+ *
+ * Returns: Nonzero if all the requested bits are set in the CPUID result
+ * on leaf 1.
+ */
+
static int cpuid_features_p(unsigned dbits, unsigned cbits)
{
struct cpuid c;
return ((c.d & dbits) == dbits && (c.c & cbits) == cbits);
}
+/* --- @xmm_registers_available_p@ --- *
+ *
+ * Arguments: ---
+ *
+ * Returns: Nonzero if the operating system has made the XMM registers
+ * available for use.
+ */
+
static int xmm_registers_available_p(void)
{
#ifdef __GNUC__
#endif
+/*----- External interface ------------------------------------------------*/
+
/* --- @check_env@ --- *
*
* Arguments: @const char *ftok@ = feature token
return (xmm_registers_available_p() &&
cpuid_features_p(CPUID1D_SSE2, 0));
}
+ case CPUFEAT_X86_AESNI: {
+ check_env("x86:aesni");
+ return (xmm_registers_available_p() &&
+ cpuid_features_p(CPUID1D_SSE2, CPUID1C_AESNI));
+ }
#endif
default:
return (0);