/* Test unwinding of Crunch register saves.  */
/* Origin: Martin Guy <martinwguy@yahoo.it> */
/* Adapted from: gcc-4.3.2/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C */

/* { dg-do run } */
/* { dg-require-effective-target arm32 } */

#ifdef __MAVERICK__
extern "C" void abort (void);
extern "C" void exit (int);

// Test callee-saved regiters too? (the case that is broken)
#define TEST_SAVED_REGS 1

void
foo (void)
{
  register long long mvdx6 asm("mvdx6") = 0;
  register long long mvdx7 asm("mvdx7") = 1;
#if TEST_SAVED_REGS
  register long long mvdx8 asm("mvdx8") = 2;
  register long long mvdx9 asm("mvdx9") = 3;
#endif
  asm volatile ("" : "+v" (mvdx6), "+v" (mvdx7));
#if TEST_SAVED_REGS
  asm volatile ("" : "+v" (mvdx8), "+v" (mvdx9));
#endif
  throw "";
}

int
main (void)
{
  register long long mvdx6 asm("mvdx6") = 6;
  register long long mvdx7 asm("mvdx7") = 7;
#if TEST_SAVED_REGS
  register long long mvdx8 asm("mvdx8") = 8;
  register long long mvdx9 asm("mvdx9") = 9;
#endif
  asm volatile ("" : "+v" (mvdx6), "+v" (mvdx7));
#if TEST_SAVED_REGS
  asm volatile ("" : "+v" (mvdx8), "+v" (mvdx9));
#endif
  try {
    foo ();
  } catch (...) {
  asm volatile ("" : "+v" (mvdx6), "+v" (mvdx7));
#if TEST_SAVED_REGS
  asm volatile ("" : "+v" (mvdx8), "+v" (mvdx9));
#endif
    if (mvdx6 != 6 || mvdx7 != 7
#if TEST_SAVED_REGS
        || mvdx8 != 8 || mvdx9 != 9
#endif
	)
      abort ();
  }
  exit (0);
}
#else
int
main (void)
{
  exit (0);
}
#endif
