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