#define FPU_SAVE \
do { \
+ preempt_disable(); \
if (!test_thread_flag(TIF_USEDFPU)) \
__asm__ __volatile__ (" clts;\n"); \
__asm__ __volatile__ ("fsave %0; fwait": "=m"(fpu_save[0])); \
__asm__ __volatile__ ("frstor %0": : "m"(fpu_save[0])); \
if (!test_thread_flag(TIF_USEDFPU)) \
stts(); \
+ preempt_enable(); \
} while (0)
#define LD(x,y) " movq 8*("#x")(%1), %%mm"#y" ;\n"
* Copyright (C) 1999 Zach Brown (with obvious credit due Ingo)
*/
-#define XMMS_SAVE \
+#define XMMS_SAVE do { \
+ preempt_disable(); \
__asm__ __volatile__ ( \
"movl %%cr0,%0 ;\n\t" \
"clts ;\n\t" \
"movups %%xmm3,0x30(%1) ;\n\t" \
: "=&r" (cr0) \
: "r" (xmm_save) \
- : "memory")
+ : "memory"); \
+} while(0)
-#define XMMS_RESTORE \
+#define XMMS_RESTORE do { \
__asm__ __volatile__ ( \
"sfence ;\n\t" \
"movups (%1),%%xmm0 ;\n\t" \
"movl %0,%%cr0 ;\n\t" \
: \
: "r" (cr0), "r" (xmm_save) \
- : "memory")
+ : "memory"); \
+ preempt_enable(); \
+} while(0)
#define ALIGN16 __attribute__((aligned(16)))
/* Doesn't use gcc to save the XMM registers, because there is no easy way to
tell it to do a clts before the register saving. */
-#define XMMS_SAVE \
- asm volatile ( \
+#define XMMS_SAVE do { \
+ preempt_disable(); \
+ asm volatile ( \
"movq %%cr0,%0 ;\n\t" \
"clts ;\n\t" \
"movups %%xmm0,(%1) ;\n\t" \
"movups %%xmm3,0x30(%1) ;\n\t" \
: "=r" (cr0) \
: "r" (xmm_save) \
- : "memory")
+ : "memory"); \
+} while(0)
#define XMMS_RESTORE \
- asm volatile ( \
+ asm volatile ( \
"sfence ;\n\t" \
"movups (%1),%%xmm0 ;\n\t" \
"movups 0x10(%1),%%xmm1 ;\n\t" \
"movq %0,%%cr0 ;\n\t" \
: \
: "r" (cr0), "r" (xmm_save) \
- : "memory")
+ : "memory"); \
+ preempt_enable(); \
+} while(0)
#define OFFS(x) "16*("#x")"
#define PF_OFFS(x) "256+16*("#x")"