(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
eh/
seh-xmm-unwind.C
/* PR target/99234 */
/* Test SEH unwinding of XMM register saves.  */

/* { dg-do run { target { x86_64-*-mingw32 && lp64 } } } */

extern "C" void abort (void);
extern "C" void exit (int);

void
foo (void)
{
  register __int128 xmm6  asm("xmm6")  = 0;
  register __int128 xmm7  asm("xmm7")  = 0;
  register __int128 xmm8  asm("xmm8")  = 0;
  register __int128 xmm9  asm("xmm9")  = 0;
  register __int128 xmm10 asm("xmm10") = 0;
  register __int128 xmm11 asm("xmm11") = 0;
  register __int128 xmm12 asm("xmm12") = 0;
  register __int128 xmm13 asm("xmm13") = 0;
  register __int128 xmm14 asm("xmm14") = 0;
  register __int128 xmm15 asm("xmm15") = 0;

  __asm__ __volatile__ ("" : "+x" (xmm6),  "+x" (xmm7),  "+x" (xmm8),  "+x" (xmm9),
			     "+x" (xmm10), "+x" (xmm11), "+x" (xmm12), "+x" (xmm13),
			     "+x" (xmm14), "+x" (xmm15));

  throw 1;
}

int
main (void)
{
  register __int128 xmm6  asm("xmm6")  = 6;
  register __int128 xmm7  asm("xmm7")  = 7;
  register __int128 xmm8  asm("xmm8")  = 8;
  register __int128 xmm9  asm("xmm9")  = 9;
  register __int128 xmm10 asm("xmm10") = 10;
  register __int128 xmm11 asm("xmm11") = 11;
  register __int128 xmm12 asm("xmm12") = 12;
  register __int128 xmm13 asm("xmm13") = 13;
  register __int128 xmm14 asm("xmm14") = 14;
  register __int128 xmm15 asm("xmm15") = 15;

  __asm__ __volatile__ ("" : "+x" (xmm6),  "+x" (xmm7),  "+x" (xmm8),  "+x" (xmm9),
			     "+x" (xmm10), "+x" (xmm11), "+x" (xmm12), "+x" (xmm13),
			     "+x" (xmm14), "+x" (xmm15));

  try {
    foo ();
  } catch (...) {
    __asm__ __volatile__ ("" : "+x" (xmm6),  "+x" (xmm7),  "+x" (xmm8),  "+x" (xmm9),
			       "+x" (xmm10), "+x" (xmm11), "+x" (xmm12), "+x" (xmm13),
			       "+x" (xmm14), "+x" (xmm15));

    if (xmm6 != 6 || xmm7 != 7 || xmm8 != 8 || xmm9 != 9 || xmm10 != 10
        || xmm11 != 11 || xmm12 != 12 || xmm13 != 13 || xmm14 != 14 || xmm15 != 15)
      abort ();
  }

  exit (0);
}