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
f1(uint32_t dummy,uint32_t x)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
f2(uint32_t x)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
g1(uint64_t x)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
g2(uint64_t x)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
g3(uint64_t x)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
g4(uint64_t dummy,uint64_t x)75 g4 (uint64_t dummy, uint64_t x)
76 {
77   return (x & (H2 | H1 | H0)) | ((uint64_t) 0x7654 << 48);
78 }
79