aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/apx-ndd-ti-shift.c
blob: 0489712b7f6e8babe05d66bb65f67ab39bb9476e (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* { dg-do run { target { int128 && { ! ia32 } } } } */
/* { dg-require-effective-target apxf } */
/* { dg-options "-O2" } */

#include <stdlib.h>

#define APX_TARGET __attribute__((noinline, target("apxf")))
#define NO_APX __attribute__((noinline, target("no-apxf")))
typedef __uint128_t u128;
typedef __int128 i128;

#define TI_SHIFT_FUNC(TYPE, op, name) \
APX_TARGET \
TYPE apx_##name##TYPE (TYPE a, char b) \
{ \
  return a op b; \
} \
TYPE noapx_##name##TYPE (TYPE a, char b) \
{ \
  return a op b; \
} \

#define TI_SHIFT_FUNC_CONST(TYPE, i, op, name) \
APX_TARGET \
TYPE apx_##name##TYPE##_const (TYPE a) \
{ \
  return a op i; \
} \
NO_APX \
TYPE noapx_##name##TYPE##_const (TYPE a) \
{ \
  return a op i; \
}

#define TI_SHIFT_TEST(TYPE, name, val) \
{\
  if (apx_##name##TYPE (val, b) != noapx_##name##TYPE (val, b)) \
    abort (); \
}

#define TI_SHIFT_CONST_TEST(TYPE, name, val) \
{\
  if (apx_##name##1##TYPE##_const (val) \
      != noapx_##name##1##TYPE##_const (val)) \
    abort (); \
  if (apx_##name##2##TYPE##_const (val) \
      != noapx_##name##2##TYPE##_const (val)) \
    abort (); \
  if (apx_##name##3##TYPE##_const (val) \
      != noapx_##name##3##TYPE##_const (val)) \
    abort (); \
  if (apx_##name##4##TYPE##_const (val) \
      != noapx_##name##4##TYPE##_const (val)) \
    abort (); \
}

TI_SHIFT_FUNC(i128, <<, ashl)
TI_SHIFT_FUNC(i128, >>, ashr)
TI_SHIFT_FUNC(u128, >>, lshr)

TI_SHIFT_FUNC_CONST(i128, 1, <<, ashl1)
TI_SHIFT_FUNC_CONST(i128, 65, <<, ashl2)
TI_SHIFT_FUNC_CONST(i128, 64, <<, ashl3)
TI_SHIFT_FUNC_CONST(i128, 87, <<, ashl4)
TI_SHIFT_FUNC_CONST(i128, 127, >>, ashr1)
TI_SHIFT_FUNC_CONST(i128, 87, >>, ashr2)
TI_SHIFT_FUNC_CONST(i128, 27, >>, ashr3)
TI_SHIFT_FUNC_CONST(i128, 64, >>, ashr4)
TI_SHIFT_FUNC_CONST(u128, 127, >>, lshr1)
TI_SHIFT_FUNC_CONST(u128, 87, >>, lshr2)
TI_SHIFT_FUNC_CONST(u128, 27, >>, lshr3)
TI_SHIFT_FUNC_CONST(u128, 64, >>, lshr4)

int main (void)
{
  if (!__builtin_cpu_supports ("apxf"))
    return 0;

  u128 ival = 0x123456788765432FLL;
  u128 uval = 0xF234567887654321ULL;
  char b = 28;

  TI_SHIFT_TEST(i128, ashl, ival)
  TI_SHIFT_TEST(i128, ashr, ival)
  TI_SHIFT_TEST(u128, lshr, uval)
  TI_SHIFT_CONST_TEST(i128, ashl, ival)
  TI_SHIFT_CONST_TEST(i128, ashr, ival)
  TI_SHIFT_CONST_TEST(u128, lshr, uval)

  return 0;
}