377 #if defined(__amd64)
378 #define test_sse_hw 1
379 #else
380 extern int _sse_hw;
381 #define test_sse_hw _sse_hw
382 #endif
383
384 #if !defined(REG_PC)
385 #define REG_PC EIP
386 #endif
387
388 /*
389 * If a handling mode is in effect, apply it; otherwise invoke the
390 * saved handler
391 */
392 static void
393 __fex_hdlr(int sig, siginfo_t *sip, ucontext_t *uap)
394 {
395 struct fex_handler_data *thr_handlers;
396 struct sigaction act;
397 void (*handler)(), (*simd_handler[4])();
398 int mode, simd_mode[4], i, len, accrued, *ap;
399 unsigned int cwsw, oldcwsw, mxcsr, oldmxcsr;
400 enum fex_exception e, simd_e[4];
401 fex_info_t info, simd_info[4];
402 unsigned long addr;
403 siginfo_t osip = *sip;
404 sseinst_t inst;
405
406 /* check for an exception caused by an SSE instruction */
407 if (!(uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.status & 0x80)) {
408 len = __fex_parse_sse(uap, &inst);
409 if (len == 0)
410 goto not_ieee;
411
412 /* disable all traps and clear flags */
413 __fenv_getcwsw(&oldcwsw);
414 cwsw = (oldcwsw & ~0x3f) | 0x003f0000;
415 __fenv_setcwsw(&cwsw);
416 __fenv_getmxcsr(&oldmxcsr);
417 mxcsr = (oldmxcsr & ~0x3f) | 0x1f80;
|
377 #if defined(__amd64)
378 #define test_sse_hw 1
379 #else
380 extern int _sse_hw;
381 #define test_sse_hw _sse_hw
382 #endif
383
384 #if !defined(REG_PC)
385 #define REG_PC EIP
386 #endif
387
388 /*
389 * If a handling mode is in effect, apply it; otherwise invoke the
390 * saved handler
391 */
392 static void
393 __fex_hdlr(int sig, siginfo_t *sip, ucontext_t *uap)
394 {
395 struct fex_handler_data *thr_handlers;
396 struct sigaction act;
397 void (*handler)() = NULL, (*simd_handler[4])();
398 int mode, simd_mode[4], i, len, accrued, *ap;
399 unsigned int cwsw, oldcwsw, mxcsr, oldmxcsr;
400 enum fex_exception e, simd_e[4];
401 fex_info_t info, simd_info[4];
402 unsigned long addr;
403 siginfo_t osip = *sip;
404 sseinst_t inst;
405
406 /* check for an exception caused by an SSE instruction */
407 if (!(uap->uc_mcontext.fpregs.fp_reg_set.fpchip_state.status & 0x80)) {
408 len = __fex_parse_sse(uap, &inst);
409 if (len == 0)
410 goto not_ieee;
411
412 /* disable all traps and clear flags */
413 __fenv_getcwsw(&oldcwsw);
414 cwsw = (oldcwsw & ~0x3f) | 0x003f0000;
415 __fenv_setcwsw(&cwsw);
416 __fenv_getmxcsr(&oldmxcsr);
417 mxcsr = (oldmxcsr & ~0x3f) | 0x1f80;
|