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 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 with other programs, and to distribute
13 those programs without any restriction coming from the use of this
14 file. (The General Public License restrictions do apply in other
15 respects; for example, they cover modification of the file, and
16 distribution when not linked into another program.)
18 This file is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; see the file COPYING. If not, write to
25 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
27 /* As a special exception, if you link this library with files
28 compiled with GCC to produce an executable, this does not cause
29 the resulting executable to be covered by the GNU General Public License.
30 This exception does not however invalidate any other reasons why
31 the executable file might be covered by the GNU General Public License. */
35 /* Don't use `fancy_abort' here even if config.h says to use it. */
40 /* On some machines, cc is really GCC. For these machines, we can't
41 expect these functions to be properly compiled unless GCC open codes
42 the operation (which is precisely when the function won't be used).
43 So allow tm.h to specify ways of accomplishing the operations
44 by defining the macros perform_*.
46 On a machine where cc is some other compiler, there is usually no
47 reason to define perform_*. The other compiler normally has other ways
48 of implementing all of these operations.
50 In some cases a certain machine may come with GCC installed as cc
51 or may have some other compiler. Then it may make sense for tm.h
52 to define perform_* only if __GNUC__ is defined. */
54 #ifndef perform_mulsi3
55 #define perform_mulsi3(a, b) return a * b
58 #ifndef perform_divsi3
59 #define perform_divsi3(a, b) return a / b
62 #ifndef perform_udivsi3
63 #define perform_udivsi3(a, b) return a / b
66 #ifndef perform_modsi3
67 #define perform_modsi3(a, b) return a % b
70 #ifndef perform_umodsi3
71 #define perform_umodsi3(a, b) return a % b
74 #ifndef perform_lshrsi3
75 #define perform_lshrsi3(a, b) return a >> b
78 #ifndef perform_lshlsi3
79 #define perform_lshlsi3(a, b) return a << b
82 #ifndef perform_ashrsi3
83 #define perform_ashrsi3(a, b) return a >> b
86 #ifndef perform_ashlsi3
87 #define perform_ashlsi3(a, b) return a << b
90 #ifndef perform_adddf3
91 #define perform_adddf3(a, b) return a + b
94 #ifndef perform_subdf3
95 #define perform_subdf3(a, b) return a - b
98 #ifndef perform_muldf3
99 #define perform_muldf3(a, b) return a * b
102 #ifndef perform_divdf3
103 #define perform_divdf3(a, b) return a / b
106 #ifndef perform_addsf3
107 #define perform_addsf3(a, b) return INTIFY (a + b)
110 #ifndef perform_subsf3
111 #define perform_subsf3(a, b) return INTIFY (a - b)
114 #ifndef perform_mulsf3
115 #define perform_mulsf3(a, b) return INTIFY (a * b)
118 #ifndef perform_divsf3
119 #define perform_divsf3(a, b) return INTIFY (a / b)
122 #ifndef perform_negdf2
123 #define perform_negdf2(a) return -a
126 #ifndef perform_negsf2
127 #define perform_negsf2(a) return INTIFY (-a)
130 #ifndef perform_fixdfsi
131 #define perform_fixdfsi(a) return (nongcc_SI_type) a;
134 #ifndef perform_fixsfsi
135 #define perform_fixsfsi(a) return (nongcc_SI_type) a
138 #ifndef perform_floatsidf
139 #define perform_floatsidf(a) return (double) a
142 #ifndef perform_floatsisf
143 #define perform_floatsisf(a) return INTIFY ((float) a)
146 #ifndef perform_extendsfdf2
147 #define perform_extendsfdf2(a) return a
150 #ifndef perform_truncdfsf2
151 #define perform_truncdfsf2(a) return INTIFY (a)
154 /* Note that eqdf2 returns a value for "true" that is == 0,
155 nedf2 returns a value for "true" that is != 0,
156 gtdf2 returns a value for "true" that is > 0,
159 #ifndef perform_eqdf2
160 #define perform_eqdf2(a, b) return !(a == b)
163 #ifndef perform_nedf2
164 #define perform_nedf2(a, b) return a != b
167 #ifndef perform_gtdf2
168 #define perform_gtdf2(a, b) return a > b
171 #ifndef perform_gedf2
172 #define perform_gedf2(a, b) return (a >= b) - 1
175 #ifndef perform_ltdf2
176 #define perform_ltdf2(a, b) return -(a < b)
179 #ifndef perform_ledf2
180 #define perform_ledf2(a, b) return 1 - (a <= b)
183 #ifndef perform_eqsf2
184 #define perform_eqsf2(a, b) return !(a == b)
187 #ifndef perform_nesf2
188 #define perform_nesf2(a, b) return a != b
191 #ifndef perform_gtsf2
192 #define perform_gtsf2(a, b) return a > b
195 #ifndef perform_gesf2
196 #define perform_gesf2(a, b) return (a >= b) - 1
199 #ifndef perform_ltsf2
200 #define perform_ltsf2(a, b) return -(a < b)
203 #ifndef perform_lesf2
204 #define perform_lesf2(a, b) return 1 - (a <= b);
207 /* Define the C data type to use for an SImode value. */
209 #ifndef nongcc_SI_type
210 #define nongcc_SI_type long int
213 /* Define the type to be used for returning an SF mode value
214 and the method for turning a float into that type.
215 These definitions work for machines where an SF value is
216 returned in the same register as an int. */
218 #ifndef FLOAT_VALUE_TYPE
219 #define FLOAT_VALUE_TYPE int
223 #define INTIFY(FLOATVAL) (intify.f = (FLOATVAL), intify.i)
227 #define FLOATIFY(INTVAL) ((INTVAL).f)
230 #ifndef FLOAT_ARG_TYPE
231 #define FLOAT_ARG_TYPE union flt_or_int
234 union flt_or_value
{ FLOAT_VALUE_TYPE i
; float f
; };
236 union flt_or_int
{ int i
; float f
; };
244 perform_mulsi3 (a
, b
);
251 unsigned nongcc_SI_type a
, b
;
253 perform_udivsi3 (a
, b
);
262 perform_divsi3 (a
, b
);
269 unsigned nongcc_SI_type a
, b
;
271 perform_umodsi3 (a
, b
);
280 perform_modsi3 (a
, b
);
287 unsigned nongcc_SI_type a
, b
;
289 perform_lshrsi3 (a
, b
);
296 unsigned nongcc_SI_type a
, b
;
298 perform_lshlsi3 (a
, b
);
307 perform_ashrsi3 (a
, b
);
316 perform_ashlsi3 (a
, b
);
325 perform_divdf3 (a
, b
);
334 perform_muldf3 (a
, b
);
352 perform_adddf3 (a
, b
);
361 perform_subdf3 (a
, b
);
365 /* Note that eqdf2 returns a value for "true" that is == 0,
366 nedf2 returns a value for "true" that is != 0,
367 gtdf2 returns a value for "true" that is > 0,
375 /* Value == 0 iff a == b. */
376 perform_eqdf2 (a
, b
);
385 /* Value != 0 iff a != b. */
386 perform_nedf2 (a
, b
);
395 /* Value > 0 iff a > b. */
396 perform_gtdf2 (a
, b
);
405 /* Value >= 0 iff a >= b. */
406 perform_gedf2 (a
, b
);
415 /* Value < 0 iff a < b. */
416 perform_ltdf2 (a
, b
);
425 /* Value <= 0 iff a <= b. */
426 perform_ledf2 (a
, b
);
444 union flt_or_value intify
;
445 perform_fixsfsi (FLOATIFY (a
));
454 perform_floatsidf (a
);
463 union flt_or_value intify
;
464 perform_floatsisf (a
);
473 union flt_or_value intify
;
474 perform_addsf3 (FLOATIFY (a
), FLOATIFY (b
));
483 union flt_or_value intify
;
484 perform_negsf2 (FLOATIFY (a
));
493 union flt_or_value intify
;
494 perform_subsf3 (FLOATIFY (a
), FLOATIFY (b
));
503 union flt_or_int intify
;
504 /* Value == 0 iff a == b. */
505 perform_eqsf2 (FLOATIFY (a
), FLOATIFY (b
));
514 union flt_or_int intify
;
515 /* Value != 0 iff a != b. */
516 perform_nesf2 (FLOATIFY (a
), FLOATIFY (b
));
525 union flt_or_int intify
;
526 /* Value > 0 iff a > b. */
527 perform_gtsf2 (FLOATIFY (a
), FLOATIFY (b
));
536 union flt_or_int intify
;
537 /* Value >= 0 iff a >= b. */
538 perform_gesf2 (FLOATIFY (a
), FLOATIFY (b
));
547 union flt_or_int intify
;
548 /* Value < 0 iff a < b. */
549 perform_ltsf2 (FLOATIFY (a
), FLOATIFY (b
));
558 union flt_or_int intify
;
559 /* Value <= 0 iff a <= b. */
560 perform_lesf2 (FLOATIFY (a
), FLOATIFY (b
));
569 union flt_or_value intify
;
570 perform_mulsf3 (FLOATIFY (a
), FLOATIFY (b
));
579 union flt_or_value intify
;
580 perform_divsf3 (FLOATIFY (a
), FLOATIFY (b
));
589 union flt_or_value intify
;
590 perform_truncdfsf2 (a
);
599 union flt_or_value intify
;
600 perform_extendsfdf2 (FLOATIFY (a
));