Annotation of gcc/libgcc1.c, revision 1.1.1.5

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

unix.superglobalmegacorp.com

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