Annotation of gcc/libgcc1.c, revision 1.1.1.3

1.1       root        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
1.1.1.3 ! root      131: #define perform_fixdfsi(a) return (nongcc_SI_type) a;
1.1       root      132: #endif
                    133: 
                    134: #ifndef perform_fixsfsi
1.1.1.3 ! root      135: #define perform_fixsfsi(a) return (nongcc_SI_type) a
1.1       root      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
1.1.1.2   root      204: #define perform_lesf2(a, b) return 1 - (a <= b);
1.1       root      205: #endif
                    206: 
                    207: /* Define the C data type to use for an SImode value.  */
                    208: 
1.1.1.3 ! root      209: #ifndef nongcc_SI_type
        !           210: #define nongcc_SI_type long int
1.1       root      211: #endif
                    212: 
                    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.  */
                    217: 
                    218: #ifndef FLOAT_VALUE_TYPE  
                    219: #define FLOAT_VALUE_TYPE int
                    220: #endif
                    221: 
                    222: #ifndef INTIFY
                    223: #define INTIFY(FLOATVAL)  (intify.f = (FLOATVAL), intify.i)
                    224: #endif
                    225: 
                    226: #ifndef FLOATIFY
                    227: #define FLOATIFY(INTVAL)  ((INTVAL).f)
                    228: #endif
                    229: 
                    230: #ifndef FLOAT_ARG_TYPE
                    231: #define FLOAT_ARG_TYPE union flt_or_int
                    232: #endif
                    233: 
                    234: union flt_or_value { FLOAT_VALUE_TYPE i; float f; };
                    235: 
                    236: union flt_or_int { int i; float f; };
                    237: 
                    238: 
                    239: #ifdef L_mulsi3
1.1.1.3 ! root      240: nongcc_SI_type
1.1       root      241: __mulsi3 (a, b)
1.1.1.3 ! root      242:      nongcc_SI_type a, b;
1.1       root      243: {
                    244:   perform_mulsi3 (a, b);
                    245: }
                    246: #endif
                    247: 
                    248: #ifdef L_udivsi3
1.1.1.3 ! root      249: nongcc_SI_type
1.1       root      250: __udivsi3 (a, b)
1.1.1.3 ! root      251:      unsigned nongcc_SI_type a, b;
1.1       root      252: {
                    253:   perform_udivsi3 (a, b);
                    254: }
                    255: #endif
                    256: 
                    257: #ifdef L_divsi3
1.1.1.3 ! root      258: nongcc_SI_type
1.1       root      259: __divsi3 (a, b)
1.1.1.3 ! root      260:      nongcc_SI_type a, b;
1.1       root      261: {
                    262:   perform_divsi3 (a, b);
                    263: }
                    264: #endif
                    265: 
                    266: #ifdef L_umodsi3
1.1.1.3 ! root      267: nongcc_SI_type
1.1       root      268: __umodsi3 (a, b)
1.1.1.3 ! root      269:      unsigned nongcc_SI_type a, b;
1.1       root      270: {
                    271:   perform_umodsi3 (a, b);
                    272: }
                    273: #endif
                    274: 
                    275: #ifdef L_modsi3
1.1.1.3 ! root      276: nongcc_SI_type
1.1       root      277: __modsi3 (a, b)
1.1.1.3 ! root      278:      nongcc_SI_type a, b;
1.1       root      279: {
                    280:   perform_modsi3 (a, b);
                    281: }
                    282: #endif
                    283: 
                    284: #ifdef L_lshrsi3
1.1.1.3 ! root      285: nongcc_SI_type
1.1       root      286: __lshrsi3 (a, b)
1.1.1.3 ! root      287:      unsigned nongcc_SI_type a, b;
1.1       root      288: {
                    289:   perform_lshrsi3 (a, b);
                    290: }
                    291: #endif
                    292: 
                    293: #ifdef L_lshlsi3
1.1.1.3 ! root      294: nongcc_SI_type
1.1       root      295: __lshlsi3 (a, b)
1.1.1.3 ! root      296:      unsigned nongcc_SI_type a, b;
1.1       root      297: {
                    298:   perform_lshlsi3 (a, b);
                    299: }
                    300: #endif
                    301: 
                    302: #ifdef L_ashrsi3
1.1.1.3 ! root      303: nongcc_SI_type
1.1       root      304: __ashrsi3 (a, b)
1.1.1.3 ! root      305:      nongcc_SI_type a, b;
1.1       root      306: {
                    307:   perform_ashrsi3 (a, b);
                    308: }
                    309: #endif
                    310: 
                    311: #ifdef L_ashlsi3
1.1.1.3 ! root      312: nongcc_SI_type
1.1       root      313: __ashlsi3 (a, b)
1.1.1.3 ! root      314:      nongcc_SI_type a, b;
1.1       root      315: {
                    316:   perform_ashlsi3 (a, b);
                    317: }
                    318: #endif
                    319: 
                    320: #ifdef L_divdf3
                    321: double
                    322: __divdf3 (a, b)
                    323:      double a, b;
                    324: {
                    325:   perform_divdf3 (a, b);
                    326: }
                    327: #endif
                    328: 
                    329: #ifdef L_muldf3
                    330: double
                    331: __muldf3 (a, b)
                    332:      double a, b;
                    333: {
                    334:   perform_muldf3 (a, b);
                    335: }
                    336: #endif
                    337: 
                    338: #ifdef L_negdf2
                    339: double
                    340: __negdf2 (a)
                    341:      double a;
                    342: {
                    343:   perform_negdf2 (a);
                    344: }
                    345: #endif
                    346: 
                    347: #ifdef L_adddf3
                    348: double
                    349: __adddf3 (a, b)
                    350:      double a, b;
                    351: {
                    352:   perform_adddf3 (a, b);
                    353: }
                    354: #endif
                    355: 
                    356: #ifdef L_subdf3
                    357: double
                    358: __subdf3 (a, b)
                    359:      double a, b;
                    360: {
                    361:   perform_subdf3 (a, b);
                    362: }
                    363: #endif
                    364: 
                    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,
                    368:    and so on.  */
                    369: 
                    370: #ifdef L_eqdf2
1.1.1.3 ! root      371: nongcc_SI_type
1.1       root      372: __eqdf2 (a, b)
                    373:      double a, b;
                    374: {
                    375:   /* Value == 0 iff a == b.  */
                    376:   perform_eqdf2 (a, b);
                    377: }
                    378: #endif
                    379: 
                    380: #ifdef L_nedf2
1.1.1.3 ! root      381: nongcc_SI_type
1.1       root      382: __nedf2 (a, b)
                    383:      double a, b;
                    384: {
                    385:   /* Value != 0 iff a != b.  */
                    386:   perform_nedf2 (a, b);
                    387: }
                    388: #endif
                    389: 
                    390: #ifdef L_gtdf2
1.1.1.3 ! root      391: nongcc_SI_type
1.1       root      392: __gtdf2 (a, b)
                    393:      double a, b;
                    394: {
                    395:   /* Value > 0 iff a > b.  */
                    396:   perform_gtdf2 (a, b);
                    397: }
                    398: #endif
                    399: 
                    400: #ifdef L_gedf2
1.1.1.3 ! root      401: nongcc_SI_type
1.1       root      402: __gedf2 (a, b)
                    403:      double a, b;
                    404: {
                    405:   /* Value >= 0 iff a >= b.  */
                    406:   perform_gedf2 (a, b);
                    407: }
                    408: #endif
                    409: 
                    410: #ifdef L_ltdf2
1.1.1.3 ! root      411: nongcc_SI_type
1.1       root      412: __ltdf2 (a, b)
                    413:      double a, b;
                    414: {
                    415:   /* Value < 0 iff a < b.  */
                    416:   perform_ltdf2 (a, b);
                    417: }
                    418: #endif
                    419: 
                    420: #ifdef L_ledf2
1.1.1.3 ! root      421: nongcc_SI_type
1.1       root      422: __ledf2 (a, b)
                    423:      double a, b;
                    424: {
                    425:   /* Value <= 0 iff a <= b.  */
                    426:   perform_ledf2 (a, b);
                    427: }
                    428: #endif
                    429: 
                    430: #ifdef L_fixdfsi
1.1.1.3 ! root      431: nongcc_SI_type
1.1       root      432: __fixdfsi (a)
                    433:      double a;
                    434: {
                    435:   perform_fixdfsi (a);
                    436: }
                    437: #endif
                    438: 
                    439: #ifdef L_fixsfsi
1.1.1.3 ! root      440: nongcc_SI_type
1.1       root      441: __fixsfsi (a)
                    442:      FLOAT_ARG_TYPE a;
                    443: {
                    444:   union flt_or_value intify;
                    445:   perform_fixsfsi (FLOATIFY (a));
                    446: }
                    447: #endif
                    448: 
                    449: #ifdef L_floatsidf
                    450: double
                    451: __floatsidf (a)
1.1.1.3 ! root      452:      nongcc_SI_type a;
1.1       root      453: {
                    454:   perform_floatsidf (a);
                    455: }
                    456: #endif
                    457: 
                    458: #ifdef L_floatsisf
                    459: FLOAT_VALUE_TYPE
                    460: __floatsisf (a)
1.1.1.3 ! root      461:      nongcc_SI_type a;
1.1       root      462: {
                    463:   union flt_or_value intify;
                    464:   perform_floatsisf (a);
                    465: }
                    466: #endif
                    467: 
                    468: #ifdef L_addsf3
                    469: FLOAT_VALUE_TYPE
                    470: __addsf3 (a, b)
                    471:      FLOAT_ARG_TYPE a, b;
                    472: {
                    473:   union flt_or_value intify;
                    474:   perform_addsf3 (FLOATIFY (a), FLOATIFY (b));
                    475: }
                    476: #endif
                    477: 
                    478: #ifdef L_negsf2
                    479: FLOAT_VALUE_TYPE
                    480: __negsf2 (a)
                    481:      FLOAT_ARG_TYPE a;
                    482: {
                    483:   union flt_or_value intify;
                    484:   perform_negsf2 (FLOATIFY (a));
                    485: }
                    486: #endif
                    487: 
                    488: #ifdef L_subsf3
                    489: FLOAT_VALUE_TYPE
                    490: __subsf3 (a, b)
                    491:      FLOAT_ARG_TYPE a, b;
                    492: {
                    493:   union flt_or_value intify;
                    494:   perform_subsf3 (FLOATIFY (a), FLOATIFY (b));
                    495: }
                    496: #endif
                    497: 
                    498: #ifdef L_eqsf2
1.1.1.3 ! root      499: nongcc_SI_type
1.1       root      500: __eqsf2 (a, b)
                    501:      FLOAT_ARG_TYPE a, b;
                    502: {
                    503:   union flt_or_int intify;
                    504:   /* Value == 0 iff a == b.  */
                    505:   perform_eqsf2 (FLOATIFY (a), FLOATIFY (b));
                    506: }
                    507: #endif
                    508: 
                    509: #ifdef L_nesf2
1.1.1.3 ! root      510: nongcc_SI_type
1.1       root      511: __nesf2 (a, b)
                    512:      FLOAT_ARG_TYPE a, b;
                    513: {
                    514:   union flt_or_int intify;
                    515:   /* Value != 0 iff a != b.  */
                    516:   perform_nesf2 (FLOATIFY (a), FLOATIFY (b));
                    517: }
                    518: #endif
                    519: 
                    520: #ifdef L_gtsf2
1.1.1.3 ! root      521: nongcc_SI_type
1.1       root      522: __gtsf2 (a, b)
                    523:      FLOAT_ARG_TYPE a, b;
                    524: {
                    525:   union flt_or_int intify;
                    526:   /* Value > 0 iff a > b.  */
                    527:   perform_gtsf2 (FLOATIFY (a), FLOATIFY (b));
                    528: }
                    529: #endif
                    530: 
                    531: #ifdef L_gesf2
1.1.1.3 ! root      532: nongcc_SI_type
1.1       root      533: __gesf2 (a, b)
                    534:      FLOAT_ARG_TYPE a, b;
                    535: {
                    536:   union flt_or_int intify;
                    537:   /* Value >= 0 iff a >= b.  */
                    538:   perform_gesf2 (FLOATIFY (a), FLOATIFY (b));
                    539: }
                    540: #endif
                    541: 
                    542: #ifdef L_ltsf2
1.1.1.3 ! root      543: nongcc_SI_type
1.1       root      544: __ltsf2 (a, b)
                    545:      FLOAT_ARG_TYPE a, b;
                    546: {
                    547:   union flt_or_int intify;
                    548:   /* Value < 0 iff a < b.  */
                    549:   perform_ltsf2 (FLOATIFY (a), FLOATIFY (b));
                    550: }
                    551: #endif
                    552: 
                    553: #ifdef L_lesf2
1.1.1.3 ! root      554: nongcc_SI_type
1.1       root      555: __lesf2 (a, b)
                    556:      FLOAT_ARG_TYPE a, b;
                    557: {
                    558:   union flt_or_int intify;
                    559:   /* Value <= 0 iff a <= b.  */
                    560:   perform_lesf2 (FLOATIFY (a), FLOATIFY (b));
                    561: }
                    562: #endif
                    563: 
                    564: #ifdef L_mulsf3
                    565: FLOAT_VALUE_TYPE
                    566: __mulsf3 (a, b)
                    567:      FLOAT_ARG_TYPE a, b;
                    568: {
                    569:   union flt_or_value intify;
                    570:   perform_mulsf3 (FLOATIFY (a), FLOATIFY (b));
                    571: }
                    572: #endif
                    573: 
                    574: #ifdef L_divsf3
                    575: FLOAT_VALUE_TYPE
                    576: __divsf3 (a, b)
                    577:      FLOAT_ARG_TYPE a, b;
                    578: {
                    579:   union flt_or_value intify;
                    580:   perform_divsf3 (FLOATIFY (a), FLOATIFY (b));
                    581: }
                    582: #endif
                    583: 
                    584: #ifdef L_truncdfsf2
                    585: FLOAT_VALUE_TYPE
                    586: __truncdfsf2 (a)
                    587:      double a;
                    588: {
                    589:   union flt_or_value intify;
                    590:   perform_truncdfsf2 (a);
                    591: }
                    592: #endif
                    593: 
                    594: #ifdef L_extendsfdf2
                    595: double
                    596: __extendsfdf2 (a)
                    597:      FLOAT_ARG_TYPE a;
                    598: {
                    599:   union flt_or_value intify;
                    600:   perform_extendsfdf2 (FLOATIFY (a));
                    601: }
                    602: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.