| /* Verify that we generate movua to load unaligned 32-bit values on SH4A. */ |
| /* { dg-do run { target { sh4a } } } */ |
| /* { dg-options "-O1 -save-temps -fno-inline" } */ |
| /* { dg-final { scan-assembler-times "movua.l" 6 } } */ |
| |
| /* Aligned. */ |
| struct s0 { long long d : 32; } x0; |
| long long f0() { |
| return x0.d; |
| } |
| |
| /* Unaligned load. */ |
| struct s1 { long long c : 8; long long d : 32; } x1; |
| long long f1() { |
| return x1.d; |
| } |
| |
| /* Unaligned load. */ |
| struct s2 { long long c : 16; long long d : 32; } x2; |
| long long f2() { |
| return x2.d; |
| } |
| |
| /* Unaligned load. */ |
| struct s3 { long long c : 24; long long d : 32; } x3; |
| long long f3() { |
| return x3.d; |
| } |
| |
| /* Aligned. */ |
| struct s4 { long long c : 32; long long d : 32; } x4; |
| long long f4() { |
| return x4.d; |
| } |
| |
| /* Aligned. */ |
| struct u0 { unsigned long long d : 32; } y_0; |
| unsigned long long g0() { |
| return y_0.d; |
| } |
| |
| /* Unaligned load. */ |
| struct u1 { long long c : 8; unsigned long long d : 32; } y_1; |
| unsigned long long g1() { |
| return y_1.d; |
| } |
| |
| /* Unaligned load. */ |
| struct u2 { long long c : 16; unsigned long long d : 32; } y2; |
| unsigned long long g2() { |
| return y2.d; |
| } |
| |
| /* Unaligned load. */ |
| struct u3 { long long c : 24; unsigned long long d : 32; } y3; |
| unsigned long long g3() { |
| return y3.d; |
| } |
| |
| /* Aligned. */ |
| struct u4 { long long c : 32; unsigned long long d : 32; } y4; |
| unsigned long long g4() { |
| return y4.d; |
| } |
| |
| #include <assert.h> |
| |
| int |
| main (void) |
| { |
| x1.d = 0x12345678; |
| assert (f1 () == 0x12345678); |
| |
| x2.d = 0x12345678; |
| assert (f2 () == 0x12345678); |
| |
| x3.d = 0x12345678; |
| assert (f3 () == 0x12345678); |
| |
| y_1.d = 0x12345678; |
| assert (g1 () == 0x12345678); |
| |
| y2.d = 0x12345678; |
| assert (g2 () == 0x12345678); |
| |
| y3.d = 0x12345678; |
| assert (g3 () == 0x12345678); |
| |
| return 0; |
| } |