| /* PR target/39139 */ |
| /* { dg-do compile } */ |
| /* { dg-options "-Os" } */ |
| |
| #ifdef __x86_64__ |
| # define AX_REG asm ("rax") |
| # define DI_REG asm ("rdi") |
| # define SI_REG asm ("rsi") |
| #else |
| # define AX_REG asm ("eax") |
| # define DI_REG asm ("edi") |
| # define SI_REG asm ("esi") |
| #endif |
| |
| __extension__ typedef __SIZE_TYPE__ size_t; |
| |
| static inline int |
| foo (unsigned int x, void *y) |
| { |
| register size_t r AX_REG; |
| register size_t a1 DI_REG; |
| register size_t a2 SI_REG; |
| a1 = (size_t) x; |
| a2 = (size_t) y; |
| asm volatile ("" : "=r" (r), "+r" (a1), "+r" (a2) : : "memory"); |
| return (int) r; |
| } |
| |
| struct T { size_t t1, t2; unsigned int t3, t4, t5; }; |
| |
| int |
| bar (size_t x, unsigned int y, size_t u, unsigned int v) |
| { |
| long r; |
| struct T e = { .t1 = x, .t2 = u }; |
| |
| if (x << y != u << v) |
| return 5; |
| r = foo (11, &e); |
| return e.t3 == x; |
| } |