#ifndef V3_CONFIG_FP_SWITCH
-#define V3_FP_EXIT_SAVE(core)
-#define V3_FP_ENTRY_RESTORE(core)
+/* Ideally these would use the TS trick to do lazy calls to used_fpu() */
+#define V3_FP_EXIT_SAVE(core)
+
+#define V3_FP_ENTRY_RESTORE(core) \
+ do { \
+ if ((core)->fp_state.need_restore) { \
+ v3_put_fp_state(core); \
+ (core)->fp_state.need_restore=0; \
+ } \
+ } while (0)
#else
if (barrier->active == 0) {
return 0;
}
-
-#ifdef V3_CONFIG_LAZY_FP_SWITCH
+#ifndef V3_CONFIG_FP_SWITCH
+ v3_get_fp_state(core); // snapshot FP state now
+#else
+# ifdef V3_CONFIG_LAZY_FP_SWITCH
v3_get_fp_state(core); // snapshot FP state now regardless of lazy eval
+# endif
#endif
V3_Print(core->vm_info, core, "Core %d waiting at barrier\n", core->vcpu_id);
// Barrier wait will spin if there is no competing work
v3_yield(core,-1);
}
-
-#ifdef V3_LAZY_FP_SWITCH
+
+#ifndef V3_CONFIG_FP_SWITCH
+ core->fp_state.need_restore=1; // restore FP on next entry
+#else
+# ifdef V3_CONFIG_LAZY_FP_SWITCH
core->fp_state.need_restore=1; // restore FP on next entry
+# endif
#endif
return 0;