OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [testsuite/] [gcc.target/] [i386/] [sse-os-support.h] - Rev 318

Compare with Previous | Blame | View Log

#if defined(__sun__) && defined(__svr4__)
/* Make sure sigaction() is declared even with -std=c99.  */
#define __EXTENSIONS__
#include <signal.h>
#include <ucontext.h>
 
static volatile sig_atomic_t sigill_caught;
 
static void
sigill_hdlr (int sig __attribute((unused)),
	     siginfo_t *sip __attribute__((unused)),
	     ucontext_t *ucp)
{
  sigill_caught = 1;
  /* Set PC to the instruction after the faulting one to skip over it,
     otherwise we enter an infinite loop.  */
  ucp->uc_mcontext.gregs[EIP] += 4;
  setcontext (ucp);
}
#endif
 
/* Check if the OS supports executing SSE instructions.  This function is
   only used in sse-check.h, sse2-check.h, and sse3-check.h so far since
   Solaris 8 and 9 won't run on newer CPUs anyway.  */
 
static int
sse_os_support (void)
{
#if defined(__sun__) && defined(__svr4__)
  /* Solaris 2 before Solaris 9 4/04 cannot execute SSE instructions
     even if the CPU supports them.  Programs receive SIGILL instead, so
     check for that at runtime.  */
 
  struct sigaction act, oact;
 
  act.sa_handler = sigill_hdlr;
  sigemptyset (&act.sa_mask);
  /* Need to set SA_SIGINFO so a ucontext_t * is passed to the handler.  */
  act.sa_flags = SA_SIGINFO;
  sigaction (SIGILL, &act, &oact);
 
  /* We need a single SSE instruction here so the handler can safely skip
     over it.  */
  __asm__ volatile ("movss %xmm2,%xmm1");
 
  sigaction (SIGILL, &oact, NULL);
 
  if (sigill_caught)
    exit (0);
  else
    return 1;
#else
  return 1;
#endif /* __sun__ && __svr4__ */
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.