| /* Test to generate output reload in asm goto on x86_64. */ |
| /* { dg-do compile { target lra } } */ |
| /* { dg-skip-if "no O0" { { i?86-*-* x86_64-*-* } && { ! ia32 } } { "-O0" } { "" } } */ |
| |
| #if defined __x86_64__ |
| #define ASM(s) asm (s) |
| #else |
| #define ASM(s) |
| #endif |
| |
| int |
| foo (int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, |
| int a9, int a10, int a11, int a12, int a13, int a14, int a15, int a16) |
| { |
| register int v0 ASM ("rax") = a3; |
| register int v1 ASM ("rbx") = a4; |
| register int v2 ASM ("rcx") = a5; |
| register int v3 ASM ("rdx") = a6; |
| register int v4 ASM ("rsi") = a7; |
| register int v5 ASM ("rdi") = a8; |
| register int v6 ASM ("r8") = a9; |
| register int v7 ASM ("r9") = a10; |
| register int v8 ASM ("r10") = a11; |
| register int v9 ASM ("r11") = a12; |
| register int v10 ASM ("r12") = a13; |
| register int v11 ASM ("r13") = a14; |
| register int v12 ASM ("r14") = a15; |
| register int v13 ASM ("r15") = a16; |
| int x; |
| |
| v0 += a0; |
| v1 += a1; |
| v2 += a2; |
| v0 |= a0; |
| v1 |= a1; |
| v2 |= a2; |
| v0 ^= a0; |
| v1 ^= a1; |
| v2 ^= a2; |
| v0 &= a0; |
| v1 &= a1; |
| v2 &= a2; |
| asm goto ("": "=r" (x) : : : lab); |
| a1 ^= a0; |
| a2 = a1; |
| a0 |= a2; |
| a0 |= x; |
| lab: |
| v0 += x + a0 + a1 + a2; |
| v1 -= a0 - a1 - a2; |
| v2 |= a0 | a1 | a2; |
| v3 |= a0 & a1 & a2; |
| v4 ^= a0 ^ a1 ^ a2; |
| return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 + v12 + v13 + a0 + a1 + a2; |
| } |
| |