aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/avr/torture/builtins-4-roundfx.c
blob: 46e915a6c8755f14a68dbe172dba0660a333a358 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/* { dg-options "-std=gnu99" } */
/* { dg-do run } */

#include <stdfix.h>

extern void abort (void);

typedef short _Fract fx_hr_t;
typedef _Fract fx_r_t;
typedef long _Fract fx_lr_t;
typedef long long _Fract fx_llr_t;

typedef unsigned short _Fract fx_uhr_t;
typedef unsigned _Fract fx_ur_t;
typedef unsigned long _Fract fx_ulr_t;
typedef unsigned long long _Fract fx_ullr_t;

typedef short _Accum fx_hk_t;
typedef _Accum fx_k_t;
typedef long _Accum fx_lk_t;
typedef long long _Accum fx_llk_t;

typedef unsigned short _Accum fx_uhk_t;
typedef unsigned _Accum fx_uk_t;
typedef unsigned long _Accum fx_ulk_t;
typedef unsigned long long _Accum fx_ullk_t;


typedef unsigned char int_uhr_t;
typedef unsigned int int_ur_t;
typedef unsigned long int_ulr_t;
typedef unsigned long long int_ullr_t;

typedef unsigned int int_uhk_t;
typedef unsigned long int_uk_t;
typedef unsigned long long int_ulk_t;
typedef unsigned long long int_ullk_t;


#define DEFTEST1(T,FX)                              \
  T test1_##FX (T x, int rp)                        \
  {                                                 \
    return round##FX (x, rp);                       \
  }                                                 \
                                                    \
  unsigned T test1_u##FX (unsigned T x, int rp)     \
  {                                                 \
    return roundu##FX (x, rp);                      \
  }

DEFTEST1 (short fract, hr)
DEFTEST1 (fract, r)
DEFTEST1 (long fract, lr)
DEFTEST1 (long long fract, llr)

DEFTEST1 (short accum, hk)
DEFTEST1 (accum, k)

DEFTEST1 (long accum, lk)
DEFTEST1 (long long accum, llk)


#define TEST2(FX, RP, VAL, ROUND)                                    \
  {                                                                  \
    if (round##FX (FX##bits (VAL), RP) != FX##bits (ROUND))          \
      abort();                                                       \
    fx_##FX##_t (*f)(fx_##FX##_t,int) = round##FX;                   \
    asm ("" : "+r" (f));                                             \
    if (f (FX##bits (VAL), RP) != FX##bits (ROUND))                  \
      abort();                                                       \
  }

static void test2hr (void)
{
  TEST2 (hr, 1, 0x7f, 0x7f);
  TEST2 (hr, 2, 0x70, 0x7f);
  TEST2 (hr, 3, 0x78, 0x7f);
  TEST2 (hr, 4, 0x7f, 0x7f);
 
  TEST2 (uhr, 1, 0x7f, 0x80);
  TEST2 (uhr, 2, 0x7f, 0x80);
  TEST2 (uhr, 3, 0x7f, 0x80);
  TEST2 (uhr, 4, 0x7f, 0x80);
}

void test2k (void)
{
  TEST2 (k, 1, 0x7fffff00, 0x7fffffff);
  TEST2 (k, 2, 0x7ffffff0, 0x7fffffff);
  TEST2 (k, 2, 0x7ffff000, 0x7fffffff);
  TEST2 (k, 3, 0x7ffff000, 0x7ffff000);
  TEST2 (k, 3, 0x7ffff800, 0x7fffffff);
  TEST2 (k, 3, 0x7ffff7ff, 0x7ffff000);
  TEST2 (k, 4, 0x7ffff7ff, 0x7ffff800);

  TEST2 (uk, 1, 0x7fffffff, 1ul << 31);
  TEST2 (uk, 2, 0x7fffffff, 1ul << 31);
  TEST2 (uk, 3, 0x7fffffff, 1ul << 31);
  TEST2 (uk, 4, 0x7fffffff, 1ul << 31);
}

#define DEFTEST3(FX, FBIT)                            \
  void test3##FX (void)                               \
  {                                                   \
    TEST2 (FX, FBIT-1, 0b01100, 0b01100);             \
    TEST2 (FX, FBIT-2, 0b01100, 0b01100);             \
    TEST2 (FX, FBIT-3, 0b01100, 0b10000);             \
    TEST2 (FX, FBIT-4, 0b01100, 0b10000);             \
    TEST2 (FX, FBIT-5, 0b01100, 0);                   \
                                                      \
    if (FX##bits ((int_##FX##_t) -1) > 0)             \
      return;                                         \
                                                      \
    TEST2 (FX, FBIT-1, -0b01100, -0b01100);           \
    TEST2 (FX, FBIT-2, -0b01100, -0b01100);           \
    TEST2 (FX, FBIT-3, -0b01100, -0b01000);           \
    TEST2 (FX, FBIT-4, -0b01100, -0b10000);           \
    TEST2 (FX, FBIT-5, -0b01100, -0b00000);           \
    }

DEFTEST3 (hr, SFRACT_FBIT)
DEFTEST3 (r, FRACT_FBIT)
DEFTEST3 (lr, LFRACT_FBIT)

DEFTEST3 (uhr, USFRACT_FBIT)
DEFTEST3 (ur, UFRACT_FBIT)
DEFTEST3 (ulr, ULFRACT_FBIT)

DEFTEST3 (hk, SACCUM_FBIT)
DEFTEST3 (k, ACCUM_FBIT)
DEFTEST3 (lk, LACCUM_FBIT)
DEFTEST3 (llk, LLACCUM_FBIT)

DEFTEST3 (uhk, USACCUM_FBIT)
DEFTEST3 (uk, UACCUM_FBIT)
DEFTEST3 (ulk, ULACCUM_FBIT)
DEFTEST3 (ullk, ULLACCUM_FBIT)

int main (void)
{
  test2hr();
  test2k();

  test3hr();
  test3r();
  test3lr();

  test3uhr();
  test3ur();
  test3ulr();

  test3hk();
  test3k();
  test3lk();
  test3llk();

  test3uhk();
  test3uk();
  test3ulk();
  test3ullk();

  return 0;
}