--- /dev/null
+__attribute__ ((always_inline)) __attribute__ ((pure))
+int cpu_has(unsigned short bit)
+{
+ asm goto ("1: jmp %l[t_no]\n" "2:\n" ".section .altinstructions,\"a\"\n"
+ ".balign 4\n" ".long 1b\n" ".long 0\n" ".word %P0\n" ".byte 2b - 1b\n" ".byte 0\n"
+ ".previous\n"::"i" (bit)::t_no);
+ return 1;
+ t_no:return 0;
+}
+
+union thread_xstate {
+ int swd;
+ int xstate_bv;
+};
+
+void aes_decrypt(union thread_xstate *state)
+{
+ if (fpu_usable()) {
+ decrypt();
+ return;
+ }
+
+ if (__builtin_constant_p(cpu_has(154)) ? cpu_has(154) : cpu_has(154)) {
+ if (state->xstate_bv)
+ return;
+ } else if (cpu_has(24)) {}
+
+ if (state->swd)
+ asm volatile ("fnclex");
+}
+
+void (*funcptr)(void) = aes_decrypt;