1 /* { dg-do compile } */
2 /* { dg-options "-O2 -mbmi -fdump-tree-optimized" } */
3 /* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */
4 
5 #include <x86intrin.h>
6 
7 extern void link_error (void);
8 
9 volatile unsigned int a;
10 volatile unsigned long long b;
11 
12 int
main()13 main ()
14 {
15   if (__bextr_u32 (0xffffffffU, 0 | (0 << 8)) != 0
16       || __bextr_u32 (0xffffffffU, 64 | (16 << 8)) != 0
17       || __bextr_u32 (0x12345678U, 4 | (10 << 8)) != 0x167
18       || __bextr_u32 (0xffffffffU, 2 | (255 << 8)) != 0x3fffffff
19       || __bextr_u32 (0xdeadbeefU, 2 | (64 << 8)) != 0x37ab6fbb
20       || __bextr_u32 (0xdeadbeefU, 0 | (64 << 8)) != 0xdeadbeefU
21       || __bextr_u32 (a, 0 | (0 << 8)) != 0
22       || __bextr_u32 (a, 32 | (16 << 8)) != 0)
23     link_error ();
24   if (_bextr_u32 (0xffffffffU, 0, 0) != 0
25       || _bextr_u32 (0xffffffffU, 64, 16) != 0
26       || _bextr_u32 (0x12345678U, 4, 10) != 0x167
27       || _bextr_u32 (0xffffffffU, 2, 255) != 0x3fffffff
28       || _bextr_u32 (0xdeadbeefU, 2, 64) != 0x37ab6fbb
29       || _bextr_u32 (0xdeadbeefU, 0, 64) != 0xdeadbeefU
30       || _bextr_u32 (a, 0, 0) != 0
31       || _bextr_u32 (a, 32, 16) != 0)
32     link_error ();
33 #ifdef __x86_64__
34   if (__bextr_u64 (0xffffffffffffffffUL, 0 | (0 << 8)) != 0
35       || __bextr_u64 (0xffffffffffffffffUL, 128 | (16 << 8)) != 0
36       || __bextr_u64 (0x123456789abcdef0UL, 5 | (37 << 8)) != 0x13c4d5e6f7UL
37       || __bextr_u64 (0xffffffffffffffffUL, 2 | (255 << 8)) != 0x3fffffffffffffffUL
38       || __bextr_u64 (0xdeadbeefbeefdeadU, 2 | (64 << 8)) != 0x37ab6fbbefbbf7abUL
39       || __bextr_u64 (0xdeadbeefbeefdeadU, 0 | (64 << 8)) != 0xdeadbeefbeefdeadUL
40       || __bextr_u64 (b, 0 | (0 << 8)) != 0
41       || __bextr_u64 (b, 64 | (16 << 8)) != 0)
42     link_error ();
43   if (_bextr_u64 (0xffffffffffffffffUL, 0, 0) != 0
44       || _bextr_u64 (0xffffffffffffffffUL, 128, 16) != 0
45       || _bextr_u64 (0x123456789abcdef0UL, 5, 37) != 0x13c4d5e6f7UL
46       || _bextr_u64 (0xffffffffffffffffUL, 2, 255) != 0x3fffffffffffffffUL
47       || _bextr_u64 (0xdeadbeefbeefdeadUL, 2, 64) != 0x37ab6fbbefbbf7abUL
48       || _bextr_u64 (0xdeadbeefbeefdeadUL, 0, 64) != 0xdeadbeefbeefdeadUL
49       || _bextr_u64 (b, 0, 0) != 0
50       || _bextr_u64 (b, 64, 16) != 0)
51     link_error ();
52 #endif
53   return 0;
54 }
55