1 /* Subroutines needed by GCC output code on some machines. */
2 /* Compile this file with the Unix C compiler! */
3 /* Copyright (C) 1987, 1988, 1992, 1994, 1995 Free Software Foundation, Inc.
5 This file is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 In addition to the permissions in the GNU General Public License, the
11 Free Software Foundation gives you unlimited permission to link the
12 compiled version of this file into combinations with other programs,
13 and to distribute those combinations without any restriction coming
14 from the use of this file. (The General Public License restrictions
15 do apply in other respects; for example, they cover modification of
16 the file, and distribution when not linked into a combine
19 This file is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; see the file COPYING. If not, write to
26 the Free Software Foundation, 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. */
31 /* Don't use `fancy_abort' here even if config.h says to use it. */
36 /* On some machines, cc is really GCC. For these machines, we can't
37 expect these functions to be properly compiled unless GCC open codes
38 the operation (which is precisely when the function won't be used).
39 So allow tm.h to specify ways of accomplishing the operations
40 by defining the macros perform_*.
42 On a machine where cc is some other compiler, there is usually no
43 reason to define perform_*. The other compiler normally has other ways
44 of implementing all of these operations.
46 In some cases a certain machine may come with GCC installed as cc
47 or may have some other compiler. Then it may make sense for tm.h
48 to define perform_* only if __GNUC__ is defined. */
50 #ifndef perform_mulsi3
51 #define perform_mulsi3(a, b) return a * b
54 #ifndef perform_divsi3
55 #define perform_divsi3(a, b) return a / b
58 #ifndef perform_udivsi3
59 #define perform_udivsi3(a, b) return a / b
62 #ifndef perform_modsi3
63 #define perform_modsi3(a, b) return a % b
66 #ifndef perform_umodsi3
67 #define perform_umodsi3(a, b) return a % b
70 #ifndef perform_lshrsi3
71 #define perform_lshrsi3(a, b) return a >> b
74 #ifndef perform_ashrsi3
75 #define perform_ashrsi3(a, b) return a >> b
78 #ifndef perform_ashlsi3
79 #define perform_ashlsi3(a, b) return a << b
82 #ifndef perform_adddf3
83 #define perform_adddf3(a, b) return a + b
86 #ifndef perform_subdf3
87 #define perform_subdf3(a, b) return a - b
90 #ifndef perform_muldf3
91 #define perform_muldf3(a, b) return a * b
94 #ifndef perform_divdf3
95 #define perform_divdf3(a, b) return a / b
98 #ifndef perform_addsf3
99 #define perform_addsf3(a, b) return INTIFY (a + b)
102 #ifndef perform_subsf3
103 #define perform_subsf3(a, b) return INTIFY (a - b)
106 #ifndef perform_mulsf3
107 #define perform_mulsf3(a, b) return INTIFY (a * b)
110 #ifndef perform_divsf3
111 #define perform_divsf3(a, b) return INTIFY (a / b)
114 #ifndef perform_negdf2
115 #define perform_negdf2(a) return -a
118 #ifndef perform_negsf2
119 #define perform_negsf2(a) return INTIFY (-a)
122 #ifndef perform_fixdfsi
123 #define perform_fixdfsi(a) return (nongcc_SI_type) a;
126 #ifndef perform_fixsfsi
127 #define perform_fixsfsi(a) return (nongcc_SI_type) a
130 #ifndef perform_floatsidf
131 #define perform_floatsidf(a) return (double) a
134 #ifndef perform_floatsisf
135 #define perform_floatsisf(a) return INTIFY ((float) a)
138 #ifndef perform_extendsfdf2
139 #define perform_extendsfdf2(a) return a
142 #ifndef perform_truncdfsf2
143 #define perform_truncdfsf2(a) return INTIFY (a)
146 /* Note that eqdf2 returns a value for "true" that is == 0,
147 nedf2 returns a value for "true" that is != 0,
148 gtdf2 returns a value for "true" that is > 0,
151 #ifndef perform_eqdf2
152 #define perform_eqdf2(a, b) return !(a == b)
155 #ifndef perform_nedf2
156 #define perform_nedf2(a, b) return a != b
159 #ifndef perform_gtdf2
160 #define perform_gtdf2(a, b) return a > b
163 #ifndef perform_gedf2
164 #define perform_gedf2(a, b) return (a >= b) - 1
167 #ifndef perform_ltdf2
168 #define perform_ltdf2(a, b) return -(a < b)
171 #ifndef perform_ledf2
172 #define perform_ledf2(a, b) return 1 - (a <= b)
175 #ifndef perform_eqsf2
176 #define perform_eqsf2(a, b) return !(a == b)
179 #ifndef perform_nesf2
180 #define perform_nesf2(a, b) return a != b
183 #ifndef perform_gtsf2
184 #define perform_gtsf2(a, b) return a > b
187 #ifndef perform_gesf2
188 #define perform_gesf2(a, b) return (a >= b) - 1
191 #ifndef perform_ltsf2
192 #define perform_ltsf2(a, b) return -(a < b)
195 #ifndef perform_lesf2
196 #define perform_lesf2(a, b) return 1 - (a <= b);
199 /* Define the C data type to use for an SImode value. */
201 #ifndef nongcc_SI_type
202 #define nongcc_SI_type long int
205 /* Define the C data type to use for a value of word size */
206 #ifndef nongcc_word_type
207 #define nongcc_word_type nongcc_SI_type
210 /* Define the type to be used for returning an SF mode value
211 and the method for turning a float into that type.
212 These definitions work for machines where an SF value is
213 returned in the same register as an int. */
215 #ifndef FLOAT_VALUE_TYPE
216 #define FLOAT_VALUE_TYPE int
220 #define INTIFY(FLOATVAL) (intify.f = (FLOATVAL), intify.i)
224 #define FLOATIFY(INTVAL) ((INTVAL).f)
227 #ifndef FLOAT_ARG_TYPE
228 #define FLOAT_ARG_TYPE union flt_or_int
231 union flt_or_value
{ FLOAT_VALUE_TYPE i
; float f
; };
233 union flt_or_int
{ int i
; float f
; };
241 perform_mulsi3 (a
, b
);
248 unsigned nongcc_SI_type a
, b
;
250 perform_udivsi3 (a
, b
);
259 perform_divsi3 (a
, b
);
266 unsigned nongcc_SI_type a
, b
;
268 perform_umodsi3 (a
, b
);
277 perform_modsi3 (a
, b
);
284 unsigned nongcc_SI_type a
, b
;
286 perform_lshrsi3 (a
, b
);
295 perform_ashrsi3 (a
, b
);
304 perform_ashlsi3 (a
, b
);
313 perform_divdf3 (a
, b
);
322 perform_muldf3 (a
, b
);
340 perform_adddf3 (a
, b
);
349 perform_subdf3 (a
, b
);
353 /* Note that eqdf2 returns a value for "true" that is == 0,
354 nedf2 returns a value for "true" that is != 0,
355 gtdf2 returns a value for "true" that is > 0,
363 /* Value == 0 iff a == b. */
364 perform_eqdf2 (a
, b
);
373 /* Value != 0 iff a != b. */
374 perform_nedf2 (a
, b
);
383 /* Value > 0 iff a > b. */
384 perform_gtdf2 (a
, b
);
393 /* Value >= 0 iff a >= b. */
394 perform_gedf2 (a
, b
);
403 /* Value < 0 iff a < b. */
404 perform_ltdf2 (a
, b
);
413 /* Value <= 0 iff a <= b. */
414 perform_ledf2 (a
, b
);
432 union flt_or_value intify
;
433 perform_fixsfsi (FLOATIFY (a
));
442 perform_floatsidf (a
);
451 union flt_or_value intify
;
452 perform_floatsisf (a
);
461 union flt_or_value intify
;
462 perform_addsf3 (FLOATIFY (a
), FLOATIFY (b
));
471 union flt_or_value intify
;
472 perform_negsf2 (FLOATIFY (a
));
481 union flt_or_value intify
;
482 perform_subsf3 (FLOATIFY (a
), FLOATIFY (b
));
491 union flt_or_int intify
;
492 /* Value == 0 iff a == b. */
493 perform_eqsf2 (FLOATIFY (a
), FLOATIFY (b
));
502 union flt_or_int intify
;
503 /* Value != 0 iff a != b. */
504 perform_nesf2 (FLOATIFY (a
), FLOATIFY (b
));
513 union flt_or_int intify
;
514 /* Value > 0 iff a > b. */
515 perform_gtsf2 (FLOATIFY (a
), FLOATIFY (b
));
524 union flt_or_int intify
;
525 /* Value >= 0 iff a >= b. */
526 perform_gesf2 (FLOATIFY (a
), FLOATIFY (b
));
535 union flt_or_int intify
;
536 /* Value < 0 iff a < b. */
537 perform_ltsf2 (FLOATIFY (a
), FLOATIFY (b
));
546 union flt_or_int intify
;
547 /* Value <= 0 iff a <= b. */
548 perform_lesf2 (FLOATIFY (a
), FLOATIFY (b
));
557 union flt_or_value intify
;
558 perform_mulsf3 (FLOATIFY (a
), FLOATIFY (b
));
567 union flt_or_value intify
;
568 perform_divsf3 (FLOATIFY (a
), FLOATIFY (b
));
577 union flt_or_value intify
;
578 perform_truncdfsf2 (a
);
587 union flt_or_value intify
;
588 perform_extendsfdf2 (FLOATIFY (a
));