1 /* { dg-do compile } */
2 /* { dg-options "-O" } */
3 /* { dg-final { check-function-bodies "**" "" } } */
4
5 #include <stdint.h>
6
7 #define H3 ((uint64_t) 0xffff << 48)
8 #define H2 ((uint64_t) 0xffff << 32)
9 #define H1 ((uint64_t) 0xffff << 16)
10 #define H0 ((uint64_t) 0xffff)
11
12 /*
13 ** f1:
14 ** mov w0, w1
15 ** movk w0, #0x9876(?:, lsl #?0)?
16 ** ret
17 */
18 uint32_t
19 f1 (uint32_t dummy, uint32_t x)
20 {
21 return (x & 0xffff0000) | 0x9876;
22 }
23
24 /*
25 ** f2:
26 ** movk w0, #0x1234, lsl #?16
27 ** ret
28 */
29 uint32_t
30 f2 (uint32_t x)
31 {
32 return (x & 0xffff) | 0x12340000;
33 }
34
35 /*
36 ** g1:
37 ** movk x0, #0x1234, lsl #?0
38 ** ret
39 */
40 uint64_t
41 g1 (uint64_t x)
42 {
43 return (x & (H3 | H2 | H1)) | 0x1234;
44 }
45
46 /*
47 ** g2:
48 ** movk x0, #0x900e, lsl #?16
49 ** ret
50 */
51 uint64_t
52 g2 (uint64_t x)
53 {
54 return (x & (H3 | H2 | H0)) | ((uint64_t) 0x900e << 16);
55 }
56
57 /*
58 ** g3:
59 ** movk x0, #0xee33, lsl #?32
60 ** ret
61 */
62 uint64_t
63 g3 (uint64_t x)
64 {
65 return (x & (H3 | H1 | H0)) | ((uint64_t) 0xee33 << 32);
66 }
67
68 /*
69 ** g4:
70 ** mov x0, x1
71 ** movk x0, #0x7654, lsl #?48
72 ** ret
73 */
74 uint64_t
75 g4 (uint64_t dummy, uint64_t x)
76 {
77 return (x & (H2 | H1 | H0)) | ((uint64_t) 0x7654 << 48);
78 }