summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/aarch64/rev16_1.c
blob: 126d3c017714f2de0c4070c658636ed244363598 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* { dg-options "-O2" } */
/* { dg-do run } */

extern void abort (void);

typedef unsigned int __u32;

__u32
__rev16_32_alt (__u32 x)
{
  return (((__u32)(x) & (__u32)0xff00ff00UL) >> 8)
         | (((__u32)(x) & (__u32)0x00ff00ffUL) << 8);
}

__u32
__rev16_32 (__u32 x)
{
  return (((__u32)(x) & (__u32)0x00ff00ffUL) << 8)
         | (((__u32)(x) & (__u32)0xff00ff00UL) >> 8);
}

typedef unsigned long long __u64;

__u64
__rev16_64_alt (__u64 x)
{
  return (((__u64)(x) & (__u64)0xff00ff00ff00ff00UL) >> 8)
         | (((__u64)(x) & (__u64)0x00ff00ff00ff00ffUL) << 8);
}

__u64
__rev16_64 (__u64 x)
{
  return (((__u64)(x) & (__u64)0x00ff00ff00ff00ffUL) << 8)
         | (((__u64)(x) & (__u64)0xff00ff00ff00ff00UL) >> 8);
}

int
main (void)
{
  volatile __u32 in32 = 0x12345678;
  volatile __u32 expected32 = 0x34127856;
  volatile __u64 in64 = 0x1234567890abcdefUL;
  volatile __u64 expected64 = 0x34127856ab90efcdUL;

  if (__rev16_32 (in32) != expected32)
    abort ();

  if (__rev16_32_alt (in32) != expected32)
    abort ();

  if (__rev16_64 (in64) != expected64)
    abort ();

  if (__rev16_64_alt (in64) != expected64)
    abort ();

  return 0;
}