| 
| 
#define  | SSE_TEST_IRQ   10 | 
|   | 
| 
#define  | MXCSR_FZ   (1<<15)   /* Flush to zero */ | 
|   | 
| 
#define  | MXCSR_RC(x)   (((x)&3)<<13)   /* Rounding ctrl */ | 
|   | 
| 
#define  | MXCSR_PM   (1<<12)   /* Precision msk */ | 
|   | 
| 
#define  | MXCSR_UM   (1<<11)   /* Underflow msk */ | 
|   | 
| 
#define  | MXCSR_OM   (1<<10)   /* Overflow  msk */ | 
|   | 
| 
#define  | MXCSR_ZM   (1<< 9)   /* Divbyzero msk */ | 
|   | 
| 
#define  | MXCSR_DM   (1<< 8)   /* Denormal  msk */ | 
|   | 
| 
#define  | MXCSR_IM   (1<< 7)   /* Invalidop msk */ | 
|   | 
| 
#define  | MXCSR_DAZ   (1<< 6)   /* Denorml are 0 */ | 
|   | 
| 
#define  | MXCSR_PE   (1<< 5)   /* Precision flg */ | 
|   | 
| 
#define  | MXCSR_UE   (1<< 4)   /* Underflow flg */ | 
|   | 
| 
#define  | MXCSR_OE   (1<< 3)   /* Overflow  flg */ | 
|   | 
| 
#define  | MXCSR_ZE   (1<< 2)   /* Divbyzero flg */ | 
|   | 
| 
#define  | MXCSR_DE   (1<< 1)   /* Denormal  flg */ | 
|   | 
| 
#define  | MXCSR_IE   (1<< 0)   /* Invalidop flg */ | 
|   | 
| 
#define  | MXCSR_ALLM   (MXCSR_PM | MXCSR_UM | MXCSR_OM | MXCSR_ZM | MXCSR_DM | MXCSR_IM) | 
|   | 
| 
#define  | MXCSR_ALLE   (MXCSR_PE | MXCSR_UE | MXCSR_OE | MXCSR_ZE | MXCSR_DE | MXCSR_IE) | 
|   | 
| 
#define  | FPSR_B   (1<<15)   /* FPU busy      */ | 
|   | 
| 
#define  | FPSR_C3   (1<<14)   /* Cond code C3  */ | 
|   | 
| 
#define  | FPSR_TOP(x)   (((x)&7)<<11)   /* TOP           */ | 
|   | 
| 
#define  | FPSR_C2   (1<<10)   /* Cond code C2  */ | 
|   | 
| 
#define  | FPSR_C1   (1<< 9)   /* Cond code C1  */ | 
|   | 
| 
#define  | FPSR_C0   (1<< 8)   /* Cond code C0  */ | 
|   | 
| 
#define  | FPSR_ES   (1<< 7)   /* Error summary */ | 
|   | 
| 
#define  | FPSR_SF   (1<< 6)   /* Stack fault   */ | 
|   | 
| 
#define  | FPSR_PE   (1<< 5)   /* Precision flg */ | 
|   | 
| 
#define  | FPSR_UE   (1<< 4)   /* Underflow flg */ | 
|   | 
| 
#define  | FPSR_OE   (1<< 3)   /* Overflow  flg */ | 
|   | 
| 
#define  | FPSR_ZE   (1<< 2)   /* Divbyzero flg */ | 
|   | 
| 
#define  | FPSR_DE   (1<< 1)   /* Denormal  flg */ | 
|   | 
| 
#define  | FPSR_IE   (1<< 0)   /* Invalidop flg */ | 
|   | 
| 
#define  | FPCW_X   (1<<12)   /* Infinity ctrl */ | 
|   | 
| 
#define  | FPCW_RC(x)   (((x)&3)<<10)   /* Rounding ctrl */ | 
|   | 
| 
#define  | FPCW_PC(x)   (((x)&3)<< 8)   /* Precision ctl */ | 
|   | 
| 
#define  | FPCW_PM   (1<< 5)   /* Precision msk */ | 
|   | 
| 
#define  | FPCW_UM   (1<< 4)   /* Underflow msk */ | 
|   | 
| 
#define  | FPCW_OM   (1<< 3)   /* Overflow  msk */ | 
|   | 
| 
#define  | FPCW_ZM   (1<< 2)   /* Divbyzero msk */ | 
|   | 
| 
#define  | FPCW_DM   (1<< 1)   /* Denormal  msk */ | 
|   | 
| 
#define  | FPCW_IM   (1<< 0)   /* Invalidop msk */ | 
|   | 
| 
#define  | FPCW_ALLM   (FPCW_PM | FPCW_UM | FPCW_OM | FPCW_ZM | FPCW_DM | FPCW_IM) | 
|   | 
| 
#define  | FPSR_ALLE   (FPSR_ES | FPSR_SF | FPSR_PE | FPSR_UE | FPSR_OE | FPSR_ZE | FPSR_DE | FPSR_IE) | 
|   | 
| #define  | FPUCLOBBER | 
|   | 
| #define  | SSECLOBBER | 
|   | 
| 
#define  | H08   "0x%02"PRIx8 | 
|   | 
| 
#define  | H16   "0x%04"PRIx16 | 
|   | 
| 
#define  | H32   "0x%08"PRIx32 | 
|   | 
| 
#define  | F16   "mismatch ("H16" != "H16")\n" | 
|   | 
| #define  | FLDCMP(fld,  fmt) | 
|   | 
| #define  | FLTCMP(i) | 
|   | 
| #define  | XMMCMP(i) | 
|   | 
| 
#define  | FP_EXC   0 | 
|   | 
| 
#define  | IRQ_EXC   1 | 
|   | 
| 
#define  | SSE_EXC   -1 | 
|   | 
| 
#define  | __INTRAISE(x)   "	int  $32+"#x" \n" | 
|   | 
| 
#define  | INTRAISE(x)   __INTRAISE(x) | 
|   | 
| 
#define  | SSE_TEST_HP_FAILED   1 | 
|   | 
| 
#define  | SSE_TEST_FSPR_FAILED   2 | 
|   | 
| 
#define  | SSE_TEST_CTXTCMP_FAILED   4 | 
|   | 
| 
#define  | MKCASE(X)   case FPE_##X: msg="FPE_"#X; break; | 
|   | 
| 
#define  | CLRXMM(i)   __asm__ volatile("pxor %%xmm"#i", %%xmm"#i:::"xmm"#i) | 
|   | 
 | 
| 
struct Context_Control_sse  | __attribute__ ((aligned(16))) | 
|   | 
| 
void  | fp_st1 (uint8_t(*p_dst)[10], double v) | 
|   | 
| 
void  | fp_st (Context_Control_sse *p_ctxt, int i, double v) | 
|   | 
| 
double  | fp_ld1 (uint8_t(*p_src)[10]) | 
|   | 
| 
double  | fp_ld (Context_Control_sse *p_ctxt, int i) | 
|   | 
| 
void  | all_clobber (uint32_t v1, uint32_t v2) | 
|   | 
| 
  | __asm__ ("all_clobber:               \n" "   finit                   \n" "	movq  0(%esp), %xmm0    \n" "   punpcklqdq %xmm0, %xmm0 \n" "	movdqa %xmm0, %xmm1     \n" "	movdqa %xmm0, %xmm2     \n" "	movdqa %xmm0, %xmm3     \n" "	movdqa %xmm0, %xmm4     \n" "	movdqa %xmm0, %xmm5     \n" "	movdqa %xmm0, %xmm6     \n" "	movdqa %xmm0, %xmm7     \n" "	ret                     \n") | 
|   | 
| 
void  | init_ctxt (Context_Control_sse *p_ctxt) | 
|   | 
| 
  | __asm__ ("init_ctxt:            \n" "	finit              \n" "   mov    4(%esp), %eax\n" "   fxsave (%eax)      \n" "   fwait              \n" "   ret                \n") | 
|   | 
| 
  | __asm__ ("do_raise:               \n" "   fwait                \n" "	test    %eax, %eax   \n" "   je      2f           \n" "   jl      1f           \n" "   jmp     2f           \n" "1: sqrtps  %xmm0, %xmm0 \n" "2:                      \n" "   ret                  \n") | 
|   | 
| 
int  | main (int argc, char **argv) | 
|   | 
| 
uint32_t  | mfcr4 () | 
|   | 
| 
void  | mtcr4 (uint32_t rval) | 
|   | 
| 
uint32_t  | mfmxcsr () | 
|   | 
| 
void  | mtmxcsr (uint32_t rval) | 
|   | 
| 
float  | sseraise () | 
|   | 
Test FPU/SSE Context Save and Restore.