home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / gcc-2.5.8-src.lha / src / amiga / gcc-2.5.8 / libgcc1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-20  |  11.3 KB  |  608 lines

  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.
  4.  
  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
  8. later version.
  9.  
  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.)
  17.  
  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.
  22.  
  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.  */
  26.  
  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.  */
  32.  
  33. #include "config.h"
  34.  
  35. /* Don't use `fancy_abort' here even if config.h says to use it.  */
  36. #ifdef abort
  37. #undef abort
  38. #endif
  39.  
  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_*.
  45.  
  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.
  49.  
  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.  */
  53.  
  54. #ifndef perform_mulsi3
  55. #define perform_mulsi3(a, b) return a * b
  56. #endif
  57.  
  58. #ifndef perform_divsi3
  59. #define perform_divsi3(a, b) return a / b
  60. #endif
  61.  
  62. #ifndef perform_udivsi3
  63. #define perform_udivsi3(a, b) return a / b
  64. #endif
  65.  
  66. #ifndef perform_modsi3
  67. #define perform_modsi3(a, b) return a % b
  68. #endif
  69.  
  70. #ifndef perform_umodsi3
  71. #define perform_umodsi3(a, b) return a % b
  72. #endif
  73.  
  74. #ifndef perform_lshrsi3
  75. #define perform_lshrsi3(a, b) return a >> b
  76. #endif
  77.  
  78. #ifndef perform_lshlsi3
  79. #define perform_lshlsi3(a, b) return a << b
  80. #endif
  81.  
  82. #ifndef perform_ashrsi3
  83. #define perform_ashrsi3(a, b) return a >> b
  84. #endif
  85.  
  86. #ifndef perform_ashlsi3
  87. #define perform_ashlsi3(a, b) return a << b
  88. #endif
  89.  
  90. #ifndef perform_adddf3
  91. #define perform_adddf3(a, b) return a + b
  92. #endif
  93.  
  94. #ifndef perform_subdf3
  95. #define perform_subdf3(a, b) return a - b
  96. #endif
  97.  
  98. #ifndef perform_muldf3
  99. #define perform_muldf3(a, b) return a * b
  100. #endif
  101.  
  102. #ifndef perform_divdf3
  103. #define perform_divdf3(a, b) return a / b
  104. #endif
  105.  
  106. #ifndef perform_addsf3
  107. #define perform_addsf3(a, b) return INTIFY (a + b)
  108. #endif
  109.  
  110. #ifndef perform_subsf3
  111. #define perform_subsf3(a, b) return INTIFY (a - b)
  112. #endif
  113.  
  114. #ifndef perform_mulsf3
  115. #define perform_mulsf3(a, b) return INTIFY (a * b)
  116. #endif
  117.  
  118. #ifndef perform_divsf3
  119. #define perform_divsf3(a, b) return INTIFY (a / b)
  120. #endif
  121.  
  122. #ifndef perform_negdf2
  123. #define perform_negdf2(a) return -a
  124. #endif
  125.  
  126. #ifndef perform_negsf2
  127. #define perform_negsf2(a) return INTIFY (-a)
  128. #endif
  129.  
  130. #ifndef perform_fixdfsi
  131. #define perform_fixdfsi(a) return (nongcc_SI_type) a;
  132. #endif
  133.  
  134. #ifndef perform_fixsfsi
  135. #define perform_fixsfsi(a) return (nongcc_SI_type) a
  136. #endif
  137.  
  138. #ifndef perform_floatsidf
  139. #define perform_floatsidf(a) return (double) a
  140. #endif
  141.  
  142. #ifndef perform_floatsisf
  143. #define perform_floatsisf(a)  return INTIFY ((float) a)
  144. #endif
  145.  
  146. #ifndef perform_extendsfdf2
  147. #define perform_extendsfdf2(a)  return a
  148. #endif
  149.  
  150. #ifndef perform_truncdfsf2
  151. #define perform_truncdfsf2(a)  return INTIFY (a)
  152. #endif
  153.  
  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,
  157.    and so on.  */
  158.  
  159. #ifndef perform_eqdf2
  160. #define perform_eqdf2(a, b) return !(a == b)
  161. #endif
  162.  
  163. #ifndef perform_nedf2
  164. #define perform_nedf2(a, b) return a != b
  165. #endif
  166.  
  167. #ifndef perform_gtdf2
  168. #define perform_gtdf2(a, b) return a > b
  169. #endif
  170.  
  171. #ifndef perform_gedf2
  172. #define perform_gedf2(a, b) return (a >= b) - 1
  173. #endif
  174.  
  175. #ifndef perform_ltdf2
  176. #define perform_ltdf2(a, b) return -(a < b)
  177. #endif
  178.  
  179. #ifndef perform_ledf2
  180. #define perform_ledf2(a, b) return 1 - (a <= b)
  181. #endif
  182.  
  183. #ifndef perform_eqsf2
  184. #define perform_eqsf2(a, b) return !(a == b)
  185. #endif
  186.  
  187. #ifndef perform_nesf2
  188. #define perform_nesf2(a, b) return a != b
  189. #endif
  190.  
  191. #ifndef perform_gtsf2
  192. #define perform_gtsf2(a, b) return a > b
  193. #endif
  194.  
  195. #ifndef perform_gesf2
  196. #define perform_gesf2(a, b) return (a >= b) - 1
  197. #endif
  198.  
  199. #ifndef perform_ltsf2
  200. #define perform_ltsf2(a, b) return -(a < b)
  201. #endif
  202.  
  203. #ifndef perform_lesf2
  204. #define perform_lesf2(a, b) return 1 - (a <= b);
  205. #endif
  206.  
  207. /* Define the C data type to use for an SImode value.  */
  208.  
  209. #ifndef nongcc_SI_type
  210. #define nongcc_SI_type long int
  211. #endif
  212.  
  213. /* Define the C data type to use for a value of word size */
  214. #ifndef nongcc_word_type
  215. #define nongcc_word_type nongcc_SI_type
  216. #endif
  217.  
  218. /* Define the type to be used for returning an SF mode value
  219.    and the method for turning a float into that type.
  220.    These definitions work for machines where an SF value is
  221.    returned in the same register as an int.  */
  222.  
  223. #ifndef FLOAT_VALUE_TYPE  
  224. #define FLOAT_VALUE_TYPE int
  225. #endif
  226.  
  227. #ifndef INTIFY
  228. #define INTIFY(FLOATVAL)  (intify.f = (FLOATVAL), intify.i)
  229. #endif
  230.  
  231. #ifndef FLOATIFY
  232. #define FLOATIFY(INTVAL)  ((INTVAL).f)
  233. #endif
  234.  
  235. #ifndef FLOAT_ARG_TYPE
  236. #define FLOAT_ARG_TYPE union flt_or_int
  237. #endif
  238.  
  239. union flt_or_value { FLOAT_VALUE_TYPE i; float f; };
  240.  
  241. union flt_or_int { int i; float f; };
  242.  
  243.  
  244. #ifdef L_mulsi3
  245. nongcc_SI_type
  246. __mulsi3 (a, b)
  247.      nongcc_SI_type a, b;
  248. {
  249.   perform_mulsi3 (a, b);
  250. }
  251. #endif
  252.  
  253. #ifdef L_udivsi3
  254. nongcc_SI_type
  255. __udivsi3 (a, b)
  256.      unsigned nongcc_SI_type a, b;
  257. {
  258.   perform_udivsi3 (a, b);
  259. }
  260. #endif
  261.  
  262. #ifdef L_divsi3
  263. nongcc_SI_type
  264. __divsi3 (a, b)
  265.      nongcc_SI_type a, b;
  266. {
  267.   perform_divsi3 (a, b);
  268. }
  269. #endif
  270.  
  271. #ifdef L_umodsi3
  272. nongcc_SI_type
  273. __umodsi3 (a, b)
  274.      unsigned nongcc_SI_type a, b;
  275. {
  276.   perform_umodsi3 (a, b);
  277. }
  278. #endif
  279.  
  280. #ifdef L_modsi3
  281. nongcc_SI_type
  282. __modsi3 (a, b)
  283.      nongcc_SI_type a, b;
  284. {
  285.   perform_modsi3 (a, b);
  286. }
  287. #endif
  288.  
  289. #ifdef L_lshrsi3
  290. nongcc_SI_type
  291. __lshrsi3 (a, b)
  292.      unsigned nongcc_SI_type a, b;
  293. {
  294.   perform_lshrsi3 (a, b);
  295. }
  296. #endif
  297.  
  298. #ifdef L_lshlsi3
  299. nongcc_SI_type
  300. __lshlsi3 (a, b)
  301.      unsigned nongcc_SI_type a, b;
  302. {
  303.   perform_lshlsi3 (a, b);
  304. }
  305. #endif
  306.  
  307. #ifdef L_ashrsi3
  308. nongcc_SI_type
  309. __ashrsi3 (a, b)
  310.      nongcc_SI_type a, b;
  311. {
  312.   perform_ashrsi3 (a, b);
  313. }
  314. #endif
  315.  
  316. #ifdef L_ashlsi3
  317. nongcc_SI_type
  318. __ashlsi3 (a, b)
  319.      nongcc_SI_type a, b;
  320. {
  321.   perform_ashlsi3 (a, b);
  322. }
  323. #endif
  324.  
  325. #ifdef L_divdf3
  326. double
  327. __divdf3 (a, b)
  328.      double a, b;
  329. {
  330.   perform_divdf3 (a, b);
  331. }
  332. #endif
  333.  
  334. #ifdef L_muldf3
  335. double
  336. __muldf3 (a, b)
  337.      double a, b;
  338. {
  339.   perform_muldf3 (a, b);
  340. }
  341. #endif
  342.  
  343. #ifdef L_negdf2
  344. double
  345. __negdf2 (a)
  346.      double a;
  347. {
  348.   perform_negdf2 (a);
  349. }
  350. #endif
  351.  
  352. #ifdef L_adddf3
  353. double
  354. __adddf3 (a, b)
  355.      double a, b;
  356. {
  357.   perform_adddf3 (a, b);
  358. }
  359. #endif
  360.  
  361. #ifdef L_subdf3
  362. double
  363. __subdf3 (a, b)
  364.      double a, b;
  365. {
  366.   perform_subdf3 (a, b);
  367. }
  368. #endif
  369.  
  370. /* Note that eqdf2 returns a value for "true" that is == 0,
  371.    nedf2 returns a value for "true" that is != 0,
  372.    gtdf2 returns a value for "true" that is > 0,
  373.    and so on.  */
  374.  
  375. #ifdef L_eqdf2
  376. nongcc_word_type
  377. __eqdf2 (a, b)
  378.      double a, b;
  379. {
  380.   /* Value == 0 iff a == b.  */
  381.   perform_eqdf2 (a, b);
  382. }
  383. #endif
  384.  
  385. #ifdef L_nedf2
  386. nongcc_word_type
  387. __nedf2 (a, b)
  388.      double a, b;
  389. {
  390.   /* Value != 0 iff a != b.  */
  391.   perform_nedf2 (a, b);
  392. }
  393. #endif
  394.  
  395. #ifdef L_gtdf2
  396. nongcc_word_type
  397. __gtdf2 (a, b)
  398.      double a, b;
  399. {
  400.   /* Value > 0 iff a > b.  */
  401.   perform_gtdf2 (a, b);
  402. }
  403. #endif
  404.  
  405. #ifdef L_gedf2
  406. nongcc_word_type
  407. __gedf2 (a, b)
  408.      double a, b;
  409. {
  410.   /* Value >= 0 iff a >= b.  */
  411.   perform_gedf2 (a, b);
  412. }
  413. #endif
  414.  
  415. #ifdef L_ltdf2
  416. nongcc_word_type
  417. __ltdf2 (a, b)
  418.      double a, b;
  419. {
  420.   /* Value < 0 iff a < b.  */
  421.   perform_ltdf2 (a, b);
  422. }
  423. #endif
  424.  
  425. #ifdef L_ledf2
  426. nongcc_word_type
  427. __ledf2 (a, b)
  428.      double a, b;
  429. {
  430.   /* Value <= 0 iff a <= b.  */
  431.   perform_ledf2 (a, b);
  432. }
  433. #endif
  434.  
  435. #ifdef L_fixdfsi
  436. nongcc_SI_type
  437. __fixdfsi (a)
  438.      double a;
  439. {
  440.   perform_fixdfsi (a);
  441. }
  442. #endif
  443.  
  444. #ifdef L_fixsfsi
  445. nongcc_SI_type
  446. __fixsfsi (a)
  447.      FLOAT_ARG_TYPE a;
  448. {
  449.   union flt_or_value intify;
  450.   perform_fixsfsi (FLOATIFY (a));
  451. }
  452. #endif
  453.  
  454. #ifdef L_floatsidf
  455. double
  456. __floatsidf (a)
  457.      nongcc_SI_type a;
  458. {
  459.   perform_floatsidf (a);
  460. }
  461. #endif
  462.  
  463. #ifdef L_floatsisf
  464. FLOAT_VALUE_TYPE
  465. __floatsisf (a)
  466.      nongcc_SI_type a;
  467. {
  468.   union flt_or_value intify;
  469.   perform_floatsisf (a);
  470. }
  471. #endif
  472.  
  473. #ifdef L_addsf3
  474. FLOAT_VALUE_TYPE
  475. __addsf3 (a, b)
  476.      FLOAT_ARG_TYPE a, b;
  477. {
  478.   union flt_or_value intify;
  479.   perform_addsf3 (FLOATIFY (a), FLOATIFY (b));
  480. }
  481. #endif
  482.  
  483. #ifdef L_negsf2
  484. FLOAT_VALUE_TYPE
  485. __negsf2 (a)
  486.      FLOAT_ARG_TYPE a;
  487. {
  488.   union flt_or_value intify;
  489.   perform_negsf2 (FLOATIFY (a));
  490. }
  491. #endif
  492.  
  493. #ifdef L_subsf3
  494. FLOAT_VALUE_TYPE
  495. __subsf3 (a, b)
  496.      FLOAT_ARG_TYPE a, b;
  497. {
  498.   union flt_or_value intify;
  499.   perform_subsf3 (FLOATIFY (a), FLOATIFY (b));
  500. }
  501. #endif
  502.  
  503. #ifdef L_eqsf2
  504. nongcc_word_type
  505. __eqsf2 (a, b)
  506.      FLOAT_ARG_TYPE a, b;
  507. {
  508.   union flt_or_int intify;
  509.   /* Value == 0 iff a == b.  */
  510.   perform_eqsf2 (FLOATIFY (a), FLOATIFY (b));
  511. }
  512. #endif
  513.  
  514. #ifdef L_nesf2
  515. nongcc_word_type
  516. __nesf2 (a, b)
  517.      FLOAT_ARG_TYPE a, b;
  518. {
  519.   union flt_or_int intify;
  520.   /* Value != 0 iff a != b.  */
  521.   perform_nesf2 (FLOATIFY (a), FLOATIFY (b));
  522. }
  523. #endif
  524.  
  525. #ifdef L_gtsf2
  526. nongcc_word_type
  527. __gtsf2 (a, b)
  528.      FLOAT_ARG_TYPE a, b;
  529. {
  530.   union flt_or_int intify;
  531.   /* Value > 0 iff a > b.  */
  532.   perform_gtsf2 (FLOATIFY (a), FLOATIFY (b));
  533. }
  534. #endif
  535.  
  536. #ifdef L_gesf2
  537. nongcc_word_type
  538. __gesf2 (a, b)
  539.      FLOAT_ARG_TYPE a, b;
  540. {
  541.   union flt_or_int intify;
  542.   /* Value >= 0 iff a >= b.  */
  543.   perform_gesf2 (FLOATIFY (a), FLOATIFY (b));
  544. }
  545. #endif
  546.  
  547. #ifdef L_ltsf2
  548. nongcc_word_type
  549. __ltsf2 (a, b)
  550.      FLOAT_ARG_TYPE a, b;
  551. {
  552.   union flt_or_int intify;
  553.   /* Value < 0 iff a < b.  */
  554.   perform_ltsf2 (FLOATIFY (a), FLOATIFY (b));
  555. }
  556. #endif
  557.  
  558. #ifdef L_lesf2
  559. nongcc_word_type
  560. __lesf2 (a, b)
  561.      FLOAT_ARG_TYPE a, b;
  562. {
  563.   union flt_or_int intify;
  564.   /* Value <= 0 iff a <= b.  */
  565.   perform_lesf2 (FLOATIFY (a), FLOATIFY (b));
  566. }
  567. #endif
  568.  
  569. #ifdef L_mulsf3
  570. FLOAT_VALUE_TYPE
  571. __mulsf3 (a, b)
  572.      FLOAT_ARG_TYPE a, b;
  573. {
  574.   union flt_or_value intify;
  575.   perform_mulsf3 (FLOATIFY (a), FLOATIFY (b));
  576. }
  577. #endif
  578.  
  579. #ifdef L_divsf3
  580. FLOAT_VALUE_TYPE
  581. __divsf3 (a, b)
  582.      FLOAT_ARG_TYPE a, b;
  583. {
  584.   union flt_or_value intify;
  585.   perform_divsf3 (FLOATIFY (a), FLOATIFY (b));
  586. }
  587. #endif
  588.  
  589. #ifdef L_truncdfsf2
  590. FLOAT_VALUE_TYPE
  591. __truncdfsf2 (a)
  592.      double a;
  593. {
  594.   union flt_or_value intify;
  595.   perform_truncdfsf2 (a);
  596. }
  597. #endif
  598.  
  599. #ifdef L_extendsfdf2
  600. double
  601. __extendsfdf2 (a)
  602.      FLOAT_ARG_TYPE a;
  603. {
  604.   union flt_or_value intify;
  605.   perform_extendsfdf2 (FLOATIFY (a));
  606. }
  607. #endif
  608.