| /* { 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); |
| } |