blob: 062034105004c22f15729c88222f150804928506 [file] [log] [blame]
// { dg-do run { target aarch64*-*-* } }
// { dg-require-effective-target dfp }
/* Test unwinding of AArch64 register saves. */
/* We cannot use #include <decimal/decimal> because it defines
decimal* types as classes, which cannot be assigned to register
variables. Hence the use the mode attribute trick. */
#ifdef __aarch64__
typedef float dec64 __attribute__((mode(DD)));
extern "C" void abort (void);
extern "C" void exit (int);
void
foo (void)
{
register dec64 v10 asm("v10") = 0;
register dec64 v11 asm("v11") = 1;
register dec64 v12 asm("v12") = 2;
register dec64 v13 asm("v13") = 3;
asm volatile ("" : "+w" (v10), "+w" (v11), "+w" (v12), "+w" (v13));
throw "";
}
int
main (void)
{
register dec64 v10 asm("v10") = 10;
register dec64 v11 asm("v11") = 11;
register dec64 v12 asm("v12") = 12;
register dec64 v13 asm("v13") = 13;
asm volatile ("" : "+w" (v10), "+w" (v11), "+w" (v12), "+w" (v13));
try {
foo ();
} catch (...) {
asm volatile ("" : "+w" (v10), "+w" (v11), "+w" (v12), "+w" (v13));
if (v10 != 10 || v11 != 11 || v12 != 12 || v13 != 13)
abort ();
}
exit (0);
}
#else
int
main (void)
{
}
#endif