]>
Commit | Line | Data |
---|---|---|
73984f84 | 1 | /* { dg-do compile } */ |
d8d9aa38 | 2 | /* { dg-require-effective-target bswap } */ |
73984f84 TP |
3 | /* { dg-require-effective-target stdint_types } */ |
4 | /* { dg-options "-O2 -fdump-tree-bswap" } */ | |
71e51352 | 5 | /* { dg-additional-options "-march=z900" { target s390*-*-* } } */ |
73984f84 TP |
6 | |
7 | #include <stdint.h> | |
8 | ||
9 | extern unsigned char data[4]; | |
10 | ||
11 | struct uint32_st { | |
12 | unsigned char u0, u1, u2, u3; | |
13 | }; | |
14 | ||
15 | uint32_t read_le32_1 (void) | |
16 | { | |
17 | return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); | |
18 | } | |
19 | ||
20 | uint32_t read_le32_2 (struct uint32_st data) | |
21 | { | |
22 | return data.u0 | (data.u1 << 8) | (data.u2 << 16) | (data.u3 << 24); | |
23 | } | |
24 | ||
25 | uint32_t read_le32_3 (unsigned char *data) | |
26 | { | |
27 | return *data | (*(data + 1) << 8) | (*(data + 2) << 16) | |
28 | | (*(data + 3) << 24); | |
29 | } | |
30 | ||
31 | uint32_t read_be32_1 (void) | |
32 | { | |
33 | return data[3] | (data[2] << 8) | (data[1] << 16) | (data[0] << 24); | |
34 | } | |
35 | ||
36 | uint32_t read_be32_2 (struct uint32_st data) | |
37 | { | |
38 | return data.u3 | (data.u2 << 8) | (data.u1 << 16) | (data.u0 << 24); | |
39 | } | |
40 | ||
41 | uint32_t read_be32_3 (unsigned char *data) | |
42 | { | |
43 | return *(data + 3) | (*(data + 2) << 8) | (*(data + 1) << 16) | |
44 | | (*data << 24); | |
45 | } | |
46 | ||
0f507a36 | 47 | static inline unsigned short |
8ea884b8 | 48 | get_unaligned_16_le (unsigned char *p) |
0f507a36 RB |
49 | { |
50 | return p[0] | (p[1] << 8); | |
51 | } | |
52 | unsigned int | |
8ea884b8 | 53 | get_unaligned_32_le (unsigned char *p) |
0f507a36 | 54 | { |
8ea884b8 RB |
55 | return get_unaligned_16_le (p) | (get_unaligned_16_le (p + 2) << 16); |
56 | } | |
57 | ||
58 | static inline unsigned short | |
59 | get_unaligned_16_be (unsigned char *p) | |
60 | { | |
61 | return p[1] | (p[0] << 8); | |
62 | } | |
63 | unsigned int | |
64 | get_unaligned_32_be (unsigned char *p) | |
65 | { | |
66 | return get_unaligned_16_be (p + 2) | (get_unaligned_16_be (p) << 16); | |
0f507a36 RB |
67 | } |
68 | ||
69 | /* { dg-final { scan-tree-dump-times "32 bit load in target endianness found at" 4 "bswap" } } */ | |
8ea884b8 | 70 | /* { dg-final { scan-tree-dump-times "32 bit bswap implementation found at" 4 "bswap" } } */ |