fixed 64bit instrinsics for Div/Mod/Shr/Shl/Shrs
[libfirm] / ir / be / test / ll.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef long long int ll_t;
5 typedef unsigned long long int ull_t;
6
7 #ifdef __GNUC__
8 ll_t mul_ll(ll_t a, ll_t b) __attribute__((noinline));
9 ll_t shl_ll(ll_t a, ll_t b) __attribute__((noinline));
10 ll_t shr_ll(ll_t a, ll_t b) __attribute__((noinline));
11 ll_t add_ll(ll_t a, ll_t b) __attribute__((noinline));
12 ll_t sub_ll(ll_t a, ll_t b) __attribute__((noinline));
13 ll_t div_ll(ll_t a, ll_t b) __attribute__((noinline));
14 ll_t mod_ll(ll_t a, ll_t b) __attribute__((noinline));
15 ll_t divmod_ll(ll_t a, ll_t b) __attribute__((noinline));
16 ll_t abs_ll(ll_t a) __attribute__((noinline));
17 ll_t neg_ll(ll_t a) __attribute__((noinline));
18
19 ull_t mul_ull(ull_t a, ull_t b) __attribute__((noinline));
20 ull_t shl_ull(ull_t a, ull_t b) __attribute__((noinline));
21 ull_t shr_ull(ull_t a, ull_t b) __attribute__((noinline));
22 ull_t add_ull(ull_t a, ull_t b) __attribute__((noinline));
23 ull_t sub_ull(ull_t a, ull_t b) __attribute__((noinline));
24 ull_t div_ull(ull_t a, ull_t b) __attribute__((noinline));
25 ull_t mod_ull(ull_t a, ull_t b) __attribute__((noinline));
26 ull_t divmod_ull(ull_t a, ull_t b) __attribute__((noinline));
27 ull_t abs_ull(ull_t a) __attribute__((noinline));
28 ull_t neg_ull(ull_t a) __attribute__((noinline));
29 #endif
30
31 ll_t mul_ll(ll_t a, ll_t b) {
32         return a * b;
33 }
34
35 ll_t shl_ll(ll_t a, ll_t b) {
36         return a << b;
37 }
38
39 ll_t shr_ll(ll_t a, ll_t b) {
40         return a >> b;
41 }
42
43 ll_t add_ll(ll_t a, ll_t b) {
44         return a + b;
45 }
46
47 ll_t sub_ll(ll_t a, ll_t b) {
48         return a - b;
49 }
50
51 ll_t div_ll(ll_t a, ll_t b) {
52         return a / b;
53 }
54
55 ll_t mod_ll(ll_t a, ll_t b) {
56         return a % b;
57 }
58
59 ll_t divmod_ll(ll_t a, ll_t b) {
60         return (a / b) + (a % b);
61 }
62
63 ll_t neg_ll(ll_t a) {
64         return -a;
65 }
66
67 ll_t abs_ll(ll_t a) {
68         return llabs(a);
69 }
70
71 #if 0
72 double conv_ll_d(ll_t a) {
73         return (double)a;
74 }
75
76 ll_t conv_d_ll(double a) {
77         return (ll_t)a;
78 }
79 #endif
80
81 /* unsigned */
82
83 ull_t mul_ull(ull_t a, ull_t b) {
84         return a * b;
85 }
86
87 ull_t shl_ull(ull_t a, ull_t b) {
88         return a << b;
89 }
90
91 ull_t shr_ull(ull_t a, ull_t b) {
92         return a >> b;
93 }
94
95 ull_t add_ull(ull_t a, ull_t b) {
96         return a + b;
97 }
98
99 ull_t sub_ull(ull_t a, ull_t b) {
100         return a - b;
101 }
102
103 ull_t div_ull(ull_t a, ull_t b) {
104         return a / b;
105 }
106
107 ull_t mod_ull(ull_t a, ull_t b) {
108         return a % b;
109 }
110
111 ull_t divmod_ull(ull_t a, ull_t b) {
112         return (a / b) + (a % b);
113 }
114
115 ull_t neg_ull(ull_t a) {
116         return -a;
117 }
118
119 ull_t abs_ull(ull_t a) {
120         return llabs(a);
121 }
122
123 #if 0
124 double conv_ull_d(ull_t a) {
125         return (double)a;
126 }
127
128 ull_t conv_d_ull(double a) {
129         return (ull_t)a;
130 }
131 #endif
132
133 int main(void) {
134         ll_t a = 0xff;
135         ll_t b = 0x123456789;
136         ll_t c = 0x8001023000002460;
137         double d = (double)c;
138
139         ull_t ua = 0xff;
140         ull_t ub = 0x123456789;
141         ull_t uc = 0x8001023000002460;
142
143         printf("%lld * %lld  = %lld\n", a, b, mul_ll(a, b));
144         printf("%lld + %lld  = %lld\n", a, b, add_ll(a, b));
145         printf("%lld - %lld  = %lld\n", a, b, sub_ll(a, b));
146         printf("%lld / %lld  = %lld\n", b, a, div_ll(b, a));
147         printf("%lld %% %lld  = %lld\n", b, a, mod_ll(b, a));
148         printf("%lld / + %% %lld  = %lld\n", b, a, divmod_ll(b, a));
149         printf("%lld << %d = %lld\n", a, 2, shl_ll(a, 2));
150         printf("%lld >> %d = %lld\n", a, 2, shr_ll(a, 2));
151         printf("abs(%lld)    = %lld\n", c, abs_ll(c));
152         printf("neg(%lld)    = %lld\n", b, neg_ll(b));
153 #if 0
154         printf("conv(%lld)   = %lf\n",  c, conv_ll_d(c));
155         printf("conv(%lf)    = %lld\n", d, conv_d_ll(d));
156 #endif
157
158         printf("%llu * %llu  = %llu\n", ua, ub, mul_ull(ua, ub));
159         printf("%llu + %llu  = %llu\n", ua, ub, add_ull(ua, ub));
160         printf("%llu - %llu  = %llu\n", ua, ub, sub_ull(ua, ub));
161         printf("%llu / %llu  = %llu\n", ub, ua, div_ull(ub, ua));
162         printf("%llu %% %llu  = %llu\n", ub, ua, mod_ull(ub, ua));
163         printf("%llu / + %% %llu  = %llu\n", ub, ua, divmod_ull(ub, ua));
164         printf("%llu << %d = %llu\n", ua, 2, shl_ull(ua, 2));
165         printf("%llu >> %d = %llu\n", ua, 2, shr_ull(ua, 2));
166         printf("abs(%llu)    = %llu\n", uc, abs_ull(uc));
167         printf("neg(%llu)    = %llu\n", ub, neg_ull(ub));
168 #if 0
169         printf("conv(%llu)   = %lf\n",  uc, conv_ull_d(uc));
170         printf("conv(%lf)    = %llu\n", d, conv_d_ull(d));
171 #endif
172         return 0;
173 }