Annotation of gcc/libgcc1.c, revision 1.1

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
        !           131: #define perform_fixdfsi(a) return (SItype) a;
        !           132: #endif
        !           133: 
        !           134: #ifndef perform_fixsfsi
        !           135: #define perform_fixsfsi(a) return (SItype) 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 SItype
        !           210: #define SItype long int
        !           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
        !           240: SItype
        !           241: __mulsi3 (a, b)
        !           242:      SItype a, b;
        !           243: {
        !           244:   perform_mulsi3 (a, b);
        !           245: }
        !           246: #endif
        !           247: 
        !           248: #ifdef L_udivsi3
        !           249: SItype
        !           250: __udivsi3 (a, b)
        !           251:      unsigned SItype a, b;
        !           252: {
        !           253:   perform_udivsi3 (a, b);
        !           254: }
        !           255: #endif
        !           256: 
        !           257: #ifdef L_divsi3
        !           258: SItype
        !           259: __divsi3 (a, b)
        !           260:      SItype a, b;
        !           261: {
        !           262:   perform_divsi3 (a, b);
        !           263: }
        !           264: #endif
        !           265: 
        !           266: #ifdef L_umodsi3
        !           267: SItype
        !           268: __umodsi3 (a, b)
        !           269:      unsigned SItype a, b;
        !           270: {
        !           271:   perform_umodsi3 (a, b);
        !           272: }
        !           273: #endif
        !           274: 
        !           275: #ifdef L_modsi3
        !           276: SItype
        !           277: __modsi3 (a, b)
        !           278:      SItype a, b;
        !           279: {
        !           280:   perform_modsi3 (a, b);
        !           281: }
        !           282: #endif
        !           283: 
        !           284: #ifdef L_lshrsi3
        !           285: SItype
        !           286: __lshrsi3 (a, b)
        !           287:      unsigned SItype a, b;
        !           288: {
        !           289:   perform_lshrsi3 (a, b);
        !           290: }
        !           291: #endif
        !           292: 
        !           293: #ifdef L_lshlsi3
        !           294: SItype
        !           295: __lshlsi3 (a, b)
        !           296:      unsigned SItype a, b;
        !           297: {
        !           298:   perform_lshlsi3 (a, b);
        !           299: }
        !           300: #endif
        !           301: 
        !           302: #ifdef L_ashrsi3
        !           303: SItype
        !           304: __ashrsi3 (a, b)
        !           305:      SItype a, b;
        !           306: {
        !           307:   perform_ashrsi3 (a, b);
        !           308: }
        !           309: #endif
        !           310: 
        !           311: #ifdef L_ashlsi3
        !           312: SItype
        !           313: __ashlsi3 (a, b)
        !           314:      SItype a, b;
        !           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
        !           371: SItype
        !           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
        !           381: SItype
        !           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
        !           391: SItype
        !           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
        !           401: SItype
        !           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
        !           411: SItype
        !           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
        !           421: SItype
        !           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
        !           431: SItype
        !           432: __fixdfsi (a)
        !           433:      double a;
        !           434: {
        !           435:   perform_fixdfsi (a);
        !           436: }
        !           437: #endif
        !           438: 
        !           439: #ifdef L_fixsfsi
        !           440: SItype
        !           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)
        !           452:      SItype a;
        !           453: {
        !           454:   perform_floatsidf (a);
        !           455: }
        !           456: #endif
        !           457: 
        !           458: #ifdef L_floatsisf
        !           459: FLOAT_VALUE_TYPE
        !           460: __floatsisf (a)
        !           461:      SItype a;
        !           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
        !           499: SItype
        !           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
        !           510: SItype
        !           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
        !           521: SItype
        !           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
        !           532: SItype
        !           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
        !           543: SItype
        !           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
        !           554: SItype
        !           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.