1 /* { dg-do compile } */ 2 /* { dg-options "-mgp64" } */ 3 /* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */ 4 5 #define TEST(ID, TYPE1, TYPE2) \ 6 union u##ID { \ 7 TYPE1 m1[sizeof (TYPE2) / sizeof (TYPE1)]; \ 8 TYPE2 m2; \ 9 }; \ 10 \ 11 /* The MIPS16 versions of the shifts we need are too \ 12 expensive. */ \ 13 TYPE1 __attribute__((nomips16)) \ 14 f##ID (TYPE2 x, union u##ID *u) \ 15 { \ 16 u->m2 = x; \ 17 return (u->m1[0] \ 18 + u->m1[sizeof (TYPE2) / sizeof (TYPE1) - 1]); \ 19 } \ 20 \ 21 TYPE1 __attribute__((nomips16)) \ 22 g##ID (union u##ID *u) \ 23 { \ 24 u->m2 = 0; \ 25 return (u->m1[0] | u->m1[1]); \ 26 } 27 28 TEST (1, unsigned int, unsigned long long); 29 TEST (2, int, long long); 30 TEST (3, unsigned short, unsigned long long); 31 TEST (4, short, long long); 32 TEST (5, unsigned char, unsigned long long); 33 TEST (6, signed char, long long); 34 35 TEST (7, unsigned short, unsigned int); 36 TEST (8, short, int); 37 TEST (9, unsigned char, unsigned int); 38 TEST (10, signed char, int); 39 40 TEST (11, unsigned char, unsigned short); 41 TEST (12, signed char, short); 42 43 /* { dg-final { scan-assembler-not "\tlh\t" } } */ 44 /* { dg-final { scan-assembler-not "\tlhu\t" } } */ 45 /* { dg-final { scan-assembler-not "\tlw\t" } } */ 46 /* { dg-final { scan-assembler-not "\tlwu\t" } } */ 47 /* { dg-final { scan-assembler-not "\tlb\t" } } */ 48 /* { dg-final { scan-assembler-not "\tlbu\t" } } */ 49