OSDN Git Service

* MAINTAINERS: Add myself as a maintainer for the RX port.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / rx / builtins.c
1 /* { dg-do run } */
2 /* { dg-options "-fno-ipa-cp-clone" } */
3
4 /* Verify that the RX specific builtin functions work.  */
5
6 /* IPA CP cloning is disabled because the constant propagation
7    has no understanding of the saturation behaviour of the
8    __builtin_rx_sat function and so it will optimize away the
9    saturation addition test.  */
10    
11 #include <stdlib.h>
12 #include <stdio.h>
13
14 /* We need to prevent these functions from being inlined
15    as otherwise gcc will attempt to optimize away their
16    arguments and we need the operations on them in order
17    to correctly set the psw flags.  */
18
19 int saturate_add         (int, int)      __attribute__((__noinline__));
20 int subtract_with_borrow (int, int, int) __attribute__((__noinline__));
21 int exchange             (int, int)      __attribute__((__noinline__));
22
23 int
24 half_word_swap (int arg)
25 {
26   return __builtin_rx_revw (arg);
27 }
28
29 int
30 saturate_add (int arg1, int arg2)
31 {
32   arg1 += arg2;
33   return __builtin_rx_sat (arg1);
34 }
35
36 long
37 multiply_and_accumulate (long arg1, long arg2, long arg3)
38 {
39   __builtin_rx_mvtaclo (0);
40   __builtin_rx_mvtachi (0);
41
42   __builtin_rx_mullo (arg1, arg2);
43   __builtin_rx_mulhi (arg1, arg2);
44   __builtin_rx_maclo (arg1, arg3);
45   __builtin_rx_machi (arg1, arg3);
46
47   __builtin_rx_racw (1);
48   
49   arg1 = __builtin_rx_mvfachi ();
50   arg1 += __builtin_rx_mvfacmi ();
51
52   return arg1;
53 }
54
55 int
56 rxround (float arg)
57 {
58   return __builtin_rx_round (arg);
59 }
60
61 /* #define DEBUG 1 */
62
63 #ifdef DEBUG
64 #define CHECK_0ARG(func, result)                                        \
65   if (func () != result)                                                \
66     {                                                                   \
67       printf (#func " () fails: %x not %x\n", func (), result);         \
68       abort ();                                                         \
69     }
70
71 #define CHECK_1ARG(func, arg, result)                                   \
72   if (func (arg) != result)                                             \
73     {                                                                   \
74       printf (#func " (" #arg ") fails: %x not %x\n", func (arg), result); \
75       abort ();                                                         \
76     }
77
78 #define CHECK_2ARG(func, arg1, arg2, result)                            \
79   if (func (arg1, arg2) != result)                                      \
80     {                                                                   \
81       printf (#func " (" #arg1 "," #arg2 ") fails: %x not %x\n",        \
82               func (arg1, arg2), result);                               \
83       abort ();                                                         \
84     }
85
86 #define CHECK_3ARG(func, arg1, arg2, arg3, result)                      \
87   if (func (arg1, arg2, arg3) != result)                                \
88     {                                                                   \
89       printf (#func " (" #arg1 "," #arg2 "," #arg3 ") fails: %x not %x\n",      \
90               func (arg1, arg2, arg3), result);                         \
91       abort ();                                                         \
92     }
93 #else
94 #define CHECK_0ARG(func, result)                                        \
95   if (func () != result)                                                \
96     abort ();
97
98 #define CHECK_1ARG(func, arg, result)                                   \
99   if (func (arg) != result)                                             \
100     abort ();
101
102 #define CHECK_2ARG(func, arg1, arg2, result)                            \
103   if (func (arg1, arg2) != result)                                      \
104     abort ();
105
106 #define CHECK_3ARG(func, arg1, arg2, arg3, result)                      \
107   if (func (arg1, arg2, arg3) != result)                                \
108     abort ();
109 #endif
110
111 int
112 main (void)
113 {
114   CHECK_1ARG (half_word_swap, 0x12345678, 0x34127856);
115   CHECK_2ARG (saturate_add, 0x80000000, 0x80000000, 0x80000000);
116   CHECK_3ARG (multiply_and_accumulate, 0x111, 0x222, 0x333, 0x70007);
117   CHECK_1ARG (rxround, 0.5, 1);
118   return 0;
119 }
120
121 /* The following builtins are compiled but
122    not executed because they need OS support.  */
123
124 void
125 rxbreak (void)
126 {
127   __builtin_rx_brk ();
128 }
129
130 void
131 interrupt (void)
132 {
133   __builtin_rx_int (0x12);
134 }
135
136 int
137 get_stack_pointer (void)
138 {
139   return __builtin_rx_mvfc (2);
140 }
141
142 void
143 set_stack_pointer (int value)
144 {
145   __builtin_rx_mvtc (2, value);
146   __builtin_rx_mvtc (2, 0x1234);
147 }
148
149 void
150 wait (void)
151 {
152   __builtin_rx_wait ();
153 }
154
155 void
156 rmpa (int * multiplicand, int * multiplier, int num)
157 {
158   __builtin_rx_rmpa ();
159 }