| /* { dg-do compile } */ |
| /* { dg-options "-mgp64" } */ |
| /* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */ |
| |
| #define TEST(ID, TYPE1, TYPE2) \ |
| union u##ID { \ |
| TYPE1 m1[sizeof (TYPE2) / sizeof (TYPE1)]; \ |
| TYPE2 m2; \ |
| }; \ |
| \ |
| /* The MIPS16 versions of the shifts we need are too \ |
| expensive. */ \ |
| TYPE1 __attribute__((nomips16)) \ |
| f##ID (TYPE2 x, union u##ID *u) \ |
| { \ |
| u->m2 = x; \ |
| return (u->m1[0] \ |
| + u->m1[sizeof (TYPE2) / sizeof (TYPE1) - 1]); \ |
| } \ |
| \ |
| TYPE1 __attribute__((nomips16)) \ |
| g##ID (union u##ID *u) \ |
| { \ |
| u->m2 = 0; \ |
| return (u->m1[0] | u->m1[1]); \ |
| } |
| |
| TEST (1, unsigned int, unsigned long long); |
| TEST (2, int, long long); |
| TEST (3, unsigned short, unsigned long long); |
| TEST (4, short, long long); |
| TEST (5, unsigned char, unsigned long long); |
| TEST (6, signed char, long long); |
| |
| TEST (7, unsigned short, unsigned int); |
| TEST (8, short, int); |
| TEST (9, unsigned char, unsigned int); |
| TEST (10, signed char, int); |
| |
| TEST (11, unsigned char, unsigned short); |
| TEST (12, signed char, short); |
| |
| /* { dg-final { scan-assembler-not "\tlh\t" } } */ |
| /* { dg-final { scan-assembler-not "\tlhu\t" } } */ |
| /* { dg-final { scan-assembler-not "\tlw\t" } } */ |
| /* { dg-final { scan-assembler-not "\tlwu\t" } } */ |
| /* { dg-final { scan-assembler-not "\tlb\t" } } */ |
| /* { dg-final { scan-assembler-not "\tlbu\t" } } */ |