/* { dg-do compile } */ /* { dg-options "-O" } */ /* { dg-final { check-function-bodies "**" "" } } */ #include <stdint.h> #define H3 ((uint64_t) 0xffff << 48) #define H2 ((uint64_t) 0xffff << 32) #define H1 ((uint64_t) 0xffff << 16) #define H0 ((uint64_t) 0xffff) /* ** f1: ** mov w0, w1 ** movk w0, #0x9876(?:, lsl #?0)? ** ret */ uint32_t f1 (uint32_t dummy, uint32_t x) { return (x & 0xffff0000) | 0x9876; } /* ** f2: ** movk w0, #0x1234, lsl #?16 ** ret */ uint32_t f2 (uint32_t x) { return (x & 0xffff) | 0x12340000; } /* ** g1: ** movk x0, #0x1234, lsl #?0 ** ret */ uint64_t g1 (uint64_t x) { return (x & (H3 | H2 | H1)) | 0x1234; } /* ** g2: ** movk x0, #0x900e, lsl #?16 ** ret */ uint64_t g2 (uint64_t x) { return (x & (H3 | H2 | H0)) | ((uint64_t) 0x900e << 16); } /* ** g3: ** movk x0, #0xee33, lsl #?32 ** ret */ uint64_t g3 (uint64_t x) { return (x & (H3 | H1 | H0)) | ((uint64_t) 0xee33 << 32); } /* ** g4: ** mov x0, x1 ** movk x0, #0x7654, lsl #?48 ** ret */ uint64_t g4 (uint64_t dummy, uint64_t x) { return (x & (H2 | H1 | H0)) | ((uint64_t) 0x7654 << 48); }