summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/aarch64/ashltidisi.c
blob: 293a0f2563b77ddc4fdebf2a6b9967f20f0966b9 (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
/* { dg-do run } */
/* { dg-options "-O2 -save-temps" } */

extern void abort (void);

#define GEN_TEST_CASE(x, y, z)\
__uint128_t __attribute__ ((noinline))\
ushift_##x##_##z (unsigned y data)\
{\
  return (__uint128_t) data << x;\
}\
__int128_t __attribute__ ((noinline)) \
shift_##x##_##z (y data) \
{\
  return (__int128_t) data << x;\
}

GEN_TEST_CASE (53, int, i)
GEN_TEST_CASE (3, long long, ll)
GEN_TEST_CASE (13, long long, ll)
GEN_TEST_CASE (53, long long, ll)

int
main (int argc, char **argv)
{

#define SHIFT_CHECK(x, y, z, p) \
	if (ushift_##y##_##p (x)\
	    != ((__uint128_t) (unsigned z) x << y)) \
	  abort ();\
	if (shift_##y##_##p (x)\
	    != ((__uint128_t) (signed z) x << y)) \
	  abort ();

  SHIFT_CHECK (0x12345678, 53, int, i)
  SHIFT_CHECK (0xcafecafe, 53, int, i)

  SHIFT_CHECK (0x1234567890abcdefLL, 3, long long, ll)
  SHIFT_CHECK (0x1234567890abcdefLL, 13, long long, ll)
  SHIFT_CHECK (0x1234567890abcdefLL, 53, long long, ll)
  SHIFT_CHECK (0xcafecafedeaddeadLL, 3, long long, ll)
  SHIFT_CHECK (0xcafecafedeaddeadLL, 13, long long, ll)
  SHIFT_CHECK (0xcafecafedeaddeadLL, 53, long long, ll)

  return 0;
}

/* { dg-final { scan-assembler-times "asr" 4 } } */
/* { dg-final { scan-assembler-not "extr\t" } } */