aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/rx/rx-abi-function-tests.c
blob: e07ff71a007e0743277974a12de44b5d4bbaadd9 (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
/* { dg-do run } */
/* { dg-options "-msim" } */
/* Note: The -msim above is actually there to override the default
   options which include -ansi -pendantic and -Wlong-long...   */

extern int printf (const char *, ...);
extern void exit (int);
extern void abort (void);

extern signed long        _COM_CONVf32s (float);
extern unsigned long      _COM_CONVf32u (float);
extern float              _COM_CONV32sf (signed long);
extern float              _COM_CONV32uf (unsigned long);
extern float              _COM_ADDf (float, float);
extern float              _COM_SUBf (float, float);
extern float              _COM_MULf (float, float);
extern float              _COM_DIVf (float, float);
extern int                _COM_CMPLTf (float, float);

extern long long          _COM_MUL64 (long long, long long);
extern signed long long   _COM_DIV64s (long long, long long);
extern unsigned long long _COM_DIV64u (unsigned long long, unsigned long long);
extern long long          _COM_SHLL64 (long long, int);
extern long long          _COM_SHLR64 (long long, int);
extern long long          _COM_SHAR64 (long long, int);
extern signed long long   _COM_CONVf64s (float);
extern unsigned long long _COM_CONVf64u (float);
extern signed long long   _COM_CONVd64s (double);
extern unsigned long long _COM_CONVd64u (double);
extern float              _COM_CONV64sf (signed long long);
extern float              _COM_CONV64uf (unsigned long long);
extern double             _COM_CONV64sd (signed long long);
extern double             _COM_CONV64ud (unsigned long long);
extern signed long long   _COM_MOD64s (long long, long long);
extern unsigned long long _COM_MOD64u (unsigned long long, unsigned long long);
extern int                _COM_CMPLT64s (long long, long long);
extern int                _COM_CMPLT64u (unsigned long long, unsigned long long);
extern int                _COM_CMPGT64s (long long, long long);
extern int                _COM_CMPGT64u (unsigned long long, unsigned long long);
extern int                _COM_CMPLE64s (long long, long long);
extern int                _COM_CMPLE64u (unsigned long long, unsigned long long);
extern int                _COM_CMPGE64s (long long, long long);
extern int                _COM_CMPGE64u (unsigned long long, unsigned long long);
extern int                _COM_CMPEQ64 (long long, long long);
extern int                _COM_CMPNE64 (long long, long long);

extern double             _COM_ADDd (double, double);
extern double             _COM_SUBd (double, double);
extern double             _COM_MULd (double, double);
extern double             _COM_DIVd (double, double);
extern signed long        _COM_CONVd32s (double);
extern unsigned long      _COM_CONVd32u (double);
extern double             _COM_CONV32sd (signed long);
extern double             _COM_CONV32ud (unsigned long);
extern double             _COM_CONVfd (float);
extern float              _COM_CONVdf (double);
extern double             _COM_NEGd (double);


/* #define DEBUG 1 */

#ifdef DEBUG
# define TEST1(func,arg1,result)	if (func (arg1) != result) printf ("fail: " #func " (" #arg1 ") returns %x rather than " #result "\n", func (arg1))
# define TEST2(func,arg1,arg2,result)	if (func (arg1, arg2) != result) printf ("fail: " #func " (" #arg1 ", " #arg2 ") returns %x rather than " #result "\n", func (arg1, arg2))
# define TEST_CMP(func, low_arg, high_arg, lt_result, eq_result, gt_result)	\
  do									\
    {									\
      int res;								\
									\
      if ((res = func (low_arg, high_arg)) != lt_result)   printf ("fail: " #func " (" #low_arg ", " #high_arg ") returns %d rather than %d\n", res, lt_result); \
      if ((res = func (high_arg, low_arg)) != gt_result)   printf ("fail: " #func " (" #high_arg ", " #low_arg ") returns %d rather than %d\n", res, gt_result); \
      if ((res = func (low_arg, low_arg))  != eq_result)   printf ("fail: " #func " (" #low_arg ", " #low_arg ") returns %d rather than %d\n", res, eq_result); \
    } \
  while (0)
#else
# define TEST1(func,arg1,result)	if (func (arg1) != result) abort ()
# define TEST2(func,arg1,arg2,result)	if (func (arg1, arg2) != result) abort ()
# define TEST_CMP(func,low,high,lt_res,eq_res,gt_res)	\
  if (   (func (low, high) != lt_res)			\
      || (func (high, low) != gt_res)			\
      || (func (low, low)  != eq_res))			\
    abort ();
#endif


int
main (void)
{
#ifdef DEBUG
  printf ("Tests starting\n");
#endif

  TEST1 (_COM_CONVf32s, -2.0f, -2);
  TEST1 (_COM_CONVf32u, -2.0f, (unsigned) -2);
  TEST1 (_COM_CONV32sf, -2, -2.0f);
  TEST1 (_COM_CONV32uf, 2, 2.0f);
  TEST2 (_COM_ADDf, 1.0f, 2.0f, 3.0f);
  TEST2 (_COM_SUBf, 3.0f, 2.0f, 1.0f);
  TEST2 (_COM_MULf, 2.0f, 3.0f, 6.0f);
  TEST2 (_COM_DIVf, 6.0f, 2.0f, 3.0f);
  TEST_CMP (_COM_CMPLTf, 1.0f, 2.0f, 1, 0, 0);
  TEST_CMP (_COM_CMPGTf, 1.0f, 2.0f, 0, 0, 1);
  TEST_CMP (_COM_CMPLEf, 1.0f, 2.0f, 1, 1, 0);
  TEST_CMP (_COM_CMPGEf, 1.0f, 2.0f, 0, 1, 1);
  TEST_CMP (_COM_CMPEQf, 1.0f, 2.0f, 0, 1, 0);
  TEST_CMP (_COM_CMPNEf, 1.0f, 2.0f, 1, 0, 1);


  TEST2 (_COM_MUL64, 2LL, 4LL, 8LL);
  TEST2 (_COM_DIV64s, 6LL, 3LL, 2LL);
  TEST2 (_COM_DIV64u, 6ULL, 3ULL, 2ULL);
  TEST2 (_COM_SHLL64, 6LL, 3, 48LL);
  TEST2 (_COM_SHLR64, 8LL, 2, 2LL);
  TEST2 (_COM_SHAR64, -1LL, 2, -1LL);  
  TEST1 (_COM_CONVf64s, -2.0f, -2LL);
  TEST1 (_COM_CONVf64u, 2.0f, 2ULL);
  TEST1 (_COM_CONVd64s, -2.0, -2LL);
  TEST1 (_COM_CONVd64u, 2.0, 2ULL);
  TEST1 (_COM_CONV64sf, -2LL, -2.0f);
  TEST1 (_COM_CONV64uf, 2ULL, 2.0f);
  TEST1 (_COM_CONV64sd, -2LL, -2.0);
  TEST1 (_COM_CONV64ud, 2ULL, 2.0);
  TEST2 (_COM_MOD64s, 4LL, 3LL, 1LL);
  TEST2 (_COM_MOD64u, 4ULL, 3ULL, 1ULL);
  TEST_CMP (_COM_CMPLT64s, 1LL, 2LL, 1, 0, 0);
  TEST_CMP (_COM_CMPLT64u, 1ULL, 2ULL, 1, 0, 0);
  TEST_CMP (_COM_CMPGT64s, 1LL, 2LL, 0, 0, 1);
  TEST_CMP (_COM_CMPGT64u, 1ULL, 2ULL, 0, 0, 1);
  TEST_CMP (_COM_CMPLE64s, 1LL, 2LL, 1, 1, 0);
  TEST_CMP (_COM_CMPLE64u, 1ULL, 2ULL, 1, 1, 0);
  TEST_CMP (_COM_CMPGE64s, 1LL, 2LL, 0, 1, 1);
  TEST_CMP (_COM_CMPGE64u, 1ULL, 2ULL, 0, 1, 1);
  TEST_CMP (_COM_CMPEQ64, 1LL, 2LL, 0, 1, 0);
  TEST_CMP (_COM_CMPNE64, 1LL, 2LL, 1, 0, 1);


  TEST2 (_COM_ADDd, 1.0, 2.0, 3.0);
  TEST2 (_COM_SUBd, 3.0, 2.0, 1.0);
  TEST2 (_COM_MULd, 2.0, 3.0, 6.0);
  TEST2 (_COM_DIVd, 6.0, 2.0, 3.0);
  TEST1 (_COM_CONVd32s, -2.0, -2);
  TEST1 (_COM_CONVd32u, -2.0, (unsigned) -2);
  TEST1 (_COM_CONV32sd, -2, -2.0);
  TEST1 (_COM_CONV32ud, 2, 2.0);
  TEST1 (_COM_CONVfd, 2.0f, 2.0);
  TEST1 (_COM_CONVdf, 2.0, 2.0f);
  TEST1 (_COM_NEGd, -2.0, 2.0);
  TEST_CMP (_COM_CMPLTd, 1.0, 2.0, 1, 0, 0);
  TEST_CMP (_COM_CMPGTd, 1.0, 2.0, 0, 0, 1);
  TEST_CMP (_COM_CMPLEd, 1.0, 2.0, 1, 1, 0);
  TEST_CMP (_COM_CMPGEd, 1.0, 2.0, 0, 1, 1);
  TEST_CMP (_COM_CMPEQd, 1.0, 2.0, 0, 1, 0);
  TEST_CMP (_COM_CMPNEd, 1.0, 2.0, 1, 0, 1);
  
#ifdef DEBUG
  printf ("Tests finished\n");
#endif
  exit (0);
}