/* Test unwinding of Crunch register saves. */ /* Origin: Martin Guy */ /* 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