+#if CHECK_FLOGR
+ int r12, r13;
+ struct sigaction new_action, old_action;
+ new_action.sa_handler = sigill_handler;
+ sigemptyset(&new_action.sa_mask);
+ new_action.sa_flags = 0;
+ sigaction(SIGILL, NULL, &old_action);
+ if (old_action.sa_handler != SIG_IGN) {
+ sigaction(SIGILL, &new_action, NULL);
+ if (!sigsetjmp(jit_env, 1)) {
+ jit_cpu.flogr = 1;
+ /* flogr %r12, %r12 */
+ __asm__ volatile("lgr %%r12, %0; lgr %%r13, %1;"
+ "flogr %%r12, %%r12;"
+ "lgr %1, %%r13; lgr %0, %%r12;"
+ : "=r" (r12), "=r" (r13));
+ sigaction(SIGILL, &old_action, NULL);
+ }
+ }
+#else
+ /* By default, assume it is available */
+ jit_cpu.flogr = 1;
+#endif