|
|
1.1 ! root 1: #include "defs" ! 2: ! 3: extern ftnint intcon[14]; ! 4: extern double realcon[6]; ! 5: ! 6: union ! 7: { ! 8: int ijunk; ! 9: struct Intrpacked bits; ! 10: } packed; ! 11: ! 12: struct Intrbits ! 13: { ! 14: int intrgroup /* :3 */; ! 15: int intrstuff /* result type or number of generics */; ! 16: int intrno /* :7 */; ! 17: }; ! 18: ! 19: LOCAL struct Intrblock ! 20: { ! 21: char intrfname[VL]; ! 22: struct Intrbits intrval; ! 23: } intrtab[ ] = ! 24: { ! 25: "int", { INTRCONV, TYLONG }, ! 26: "real", { INTRCONV, TYREAL }, ! 27: "dble", { INTRCONV, TYDREAL }, ! 28: "cmplx", { INTRCONV, TYCOMPLEX }, ! 29: "dcmplx", { INTRCONV, TYDCOMPLEX }, ! 30: "ifix", { INTRCONV, TYLONG }, ! 31: "idint", { INTRCONV, TYLONG }, ! 32: "float", { INTRCONV, TYREAL }, ! 33: "dfloat", { INTRCONV, TYDREAL }, ! 34: "sngl", { INTRCONV, TYREAL }, ! 35: "ichar", { INTRCONV, TYLONG }, ! 36: "char", { INTRCONV, TYCHAR }, ! 37: ! 38: "max", { INTRMAX, TYUNKNOWN }, ! 39: "max0", { INTRMAX, TYLONG }, ! 40: "amax0", { INTRMAX, TYREAL }, ! 41: "max1", { INTRMAX, TYLONG }, ! 42: "amax1", { INTRMAX, TYREAL }, ! 43: "dmax1", { INTRMAX, TYDREAL }, ! 44: ! 45: "and", { INTRBOOL, TYUNKNOWN, OPBITAND }, ! 46: "or", { INTRBOOL, TYUNKNOWN, OPBITOR }, ! 47: "xor", { INTRBOOL, TYUNKNOWN, OPBITXOR }, ! 48: "not", { INTRBOOL, TYUNKNOWN, OPBITNOT }, ! 49: "lshift", { INTRBOOL, TYUNKNOWN, OPLSHIFT }, ! 50: "rshift", { INTRBOOL, TYUNKNOWN, OPRSHIFT }, ! 51: ! 52: "min", { INTRMIN, TYUNKNOWN }, ! 53: "min0", { INTRMIN, TYLONG }, ! 54: "amin0", { INTRMIN, TYREAL }, ! 55: "min1", { INTRMIN, TYLONG }, ! 56: "amin1", { INTRMIN, TYREAL }, ! 57: "dmin1", { INTRMIN, TYDREAL }, ! 58: ! 59: "aint", { INTRGEN, 2, 0 }, ! 60: "dint", { INTRSPEC, TYDREAL, 1 }, ! 61: ! 62: "anint", { INTRGEN, 2, 2 }, ! 63: "dnint", { INTRSPEC, TYDREAL, 3 }, ! 64: ! 65: "nint", { INTRGEN, 4, 4 }, ! 66: "idnint", { INTRGEN, 2, 6 }, ! 67: ! 68: "abs", { INTRGEN, 6, 8 }, ! 69: "iabs", { INTRGEN, 2, 9 }, ! 70: "dabs", { INTRSPEC, TYDREAL, 11 }, ! 71: "cabs", { INTRSPEC, TYREAL, 12 }, ! 72: "zabs", { INTRSPEC, TYDREAL, 13 }, ! 73: ! 74: "mod", { INTRGEN, 4, 14 }, ! 75: "amod", { INTRSPEC, TYREAL, 16 }, ! 76: "dmod", { INTRSPEC, TYDREAL, 17 }, ! 77: ! 78: "sign", { INTRGEN, 4, 18 }, ! 79: "isign", { INTRGEN, 2, 19 }, ! 80: "dsign", { INTRSPEC, TYDREAL, 21 }, ! 81: ! 82: "dim", { INTRGEN, 4, 22 }, ! 83: "idim", { INTRGEN, 2, 23 }, ! 84: "ddim", { INTRSPEC, TYDREAL, 25 }, ! 85: ! 86: "dprod", { INTRSPEC, TYDREAL, 26 }, ! 87: ! 88: "len", { INTRSPEC, TYLONG, 27 }, ! 89: "index", { INTRSPEC, TYLONG, 29 }, ! 90: ! 91: "imag", { INTRGEN, 2, 31 }, ! 92: "aimag", { INTRSPEC, TYREAL, 31 }, ! 93: "dimag", { INTRSPEC, TYDREAL, 32 }, ! 94: ! 95: "conjg", { INTRGEN, 2, 33 }, ! 96: "dconjg", { INTRSPEC, TYDCOMPLEX, 34 }, ! 97: ! 98: "sqrt", { INTRGEN, 4, 35 }, ! 99: "dsqrt", { INTRSPEC, TYDREAL, 36 }, ! 100: "csqrt", { INTRSPEC, TYCOMPLEX, 37 }, ! 101: "zsqrt", { INTRSPEC, TYDCOMPLEX, 38 }, ! 102: ! 103: "exp", { INTRGEN, 4, 39 }, ! 104: "dexp", { INTRSPEC, TYDREAL, 40 }, ! 105: "cexp", { INTRSPEC, TYCOMPLEX, 41 }, ! 106: "zexp", { INTRSPEC, TYDCOMPLEX, 42 }, ! 107: ! 108: "log", { INTRGEN, 4, 43 }, ! 109: "alog", { INTRSPEC, TYREAL, 43 }, ! 110: "dlog", { INTRSPEC, TYDREAL, 44 }, ! 111: "clog", { INTRSPEC, TYCOMPLEX, 45 }, ! 112: "zlog", { INTRSPEC, TYDCOMPLEX, 46 }, ! 113: ! 114: "log10", { INTRGEN, 2, 47 }, ! 115: "alog10", { INTRSPEC, TYREAL, 47 }, ! 116: "dlog10", { INTRSPEC, TYDREAL, 48 }, ! 117: ! 118: "sin", { INTRGEN, 4, 49 }, ! 119: "dsin", { INTRSPEC, TYDREAL, 50 }, ! 120: "csin", { INTRSPEC, TYCOMPLEX, 51 }, ! 121: "zsin", { INTRSPEC, TYDCOMPLEX, 52 }, ! 122: ! 123: "cos", { INTRGEN, 4, 53 }, ! 124: "dcos", { INTRSPEC, TYDREAL, 54 }, ! 125: "ccos", { INTRSPEC, TYCOMPLEX, 55 }, ! 126: "zcos", { INTRSPEC, TYDCOMPLEX, 56 }, ! 127: ! 128: "tan", { INTRGEN, 2, 57 }, ! 129: "dtan", { INTRSPEC, TYDREAL, 58 }, ! 130: ! 131: "asin", { INTRGEN, 2, 59 }, ! 132: "dasin", { INTRSPEC, TYDREAL, 60 }, ! 133: ! 134: "acos", { INTRGEN, 2, 61 }, ! 135: "dacos", { INTRSPEC, TYDREAL, 62 }, ! 136: ! 137: "atan", { INTRGEN, 2, 63 }, ! 138: "datan", { INTRSPEC, TYDREAL, 64 }, ! 139: ! 140: "atan2", { INTRGEN, 2, 65 }, ! 141: "datan2", { INTRSPEC, TYDREAL, 66 }, ! 142: ! 143: "sinh", { INTRGEN, 2, 67 }, ! 144: "dsinh", { INTRSPEC, TYDREAL, 68 }, ! 145: ! 146: "cosh", { INTRGEN, 2, 69 }, ! 147: "dcosh", { INTRSPEC, TYDREAL, 70 }, ! 148: ! 149: "tanh", { INTRGEN, 2, 71 }, ! 150: "dtanh", { INTRSPEC, TYDREAL, 72 }, ! 151: ! 152: "lge", { INTRSPEC, TYLOGICAL, 73}, ! 153: "lgt", { INTRSPEC, TYLOGICAL, 75}, ! 154: "lle", { INTRSPEC, TYLOGICAL, 77}, ! 155: "llt", { INTRSPEC, TYLOGICAL, 79}, ! 156: ! 157: "epbase", { INTRCNST, 4, 0 }, ! 158: "epprec", { INTRCNST, 4, 4 }, ! 159: "epemin", { INTRCNST, 2, 8 }, ! 160: "epemax", { INTRCNST, 2, 10 }, ! 161: "eptiny", { INTRCNST, 2, 12 }, ! 162: "ephuge", { INTRCNST, 4, 14 }, ! 163: "epmrsp", { INTRCNST, 2, 18 }, ! 164: ! 165: "fpexpn", { INTRGEN, 4, 81 }, ! 166: "fpabsp", { INTRGEN, 2, 85 }, ! 167: "fprrsp", { INTRGEN, 2, 87 }, ! 168: "fpfrac", { INTRGEN, 2, 89 }, ! 169: "fpmake", { INTRGEN, 2, 91 }, ! 170: "fpscal", { INTRGEN, 2, 93 }, ! 171: ! 172: "" }; ! 173: ! 174: ! 175: LOCAL struct Specblock ! 176: { ! 177: char atype; ! 178: char rtype; ! 179: char nargs; ! 180: char spxname[XL]; ! 181: char othername; /* index into callbyvalue table */ ! 182: } spectab[ ] = ! 183: { ! 184: { TYREAL,TYREAL,1,"r_int" }, ! 185: { TYDREAL,TYDREAL,1,"d_int" }, ! 186: ! 187: { TYREAL,TYREAL,1,"r_nint" }, ! 188: { TYDREAL,TYDREAL,1,"d_nint" }, ! 189: ! 190: { TYREAL,TYSHORT,1,"h_nint" }, ! 191: { TYREAL,TYLONG,1,"i_nint" }, ! 192: ! 193: { TYDREAL,TYSHORT,1,"h_dnnt" }, ! 194: { TYDREAL,TYLONG,1,"i_dnnt" }, ! 195: ! 196: { TYREAL,TYREAL,1,"r_abs" }, ! 197: { TYSHORT,TYSHORT,1,"h_abs" }, ! 198: { TYLONG,TYLONG,1,"i_abs" }, ! 199: { TYDREAL,TYDREAL,1,"d_abs" }, ! 200: { TYCOMPLEX,TYREAL,1,"c_abs" }, ! 201: { TYDCOMPLEX,TYDREAL,1,"z_abs" }, ! 202: ! 203: { TYSHORT,TYSHORT,2,"h_mod" }, ! 204: { TYLONG,TYLONG,2,"i_mod" }, ! 205: { TYREAL,TYREAL,2,"r_mod" }, ! 206: { TYDREAL,TYDREAL,2,"d_mod" }, ! 207: ! 208: { TYREAL,TYREAL,2,"r_sign" }, ! 209: { TYSHORT,TYSHORT,2,"h_sign" }, ! 210: { TYLONG,TYLONG,2,"i_sign" }, ! 211: { TYDREAL,TYDREAL,2,"d_sign" }, ! 212: ! 213: { TYREAL,TYREAL,2,"r_dim" }, ! 214: { TYSHORT,TYSHORT,2,"h_dim" }, ! 215: { TYLONG,TYLONG,2,"i_dim" }, ! 216: { TYDREAL,TYDREAL,2,"d_dim" }, ! 217: ! 218: { TYREAL,TYDREAL,2,"d_prod" }, ! 219: ! 220: { TYCHAR,TYSHORT,1,"h_len" }, ! 221: { TYCHAR,TYLONG,1,"i_len" }, ! 222: ! 223: { TYCHAR,TYSHORT,2,"h_indx" }, ! 224: { TYCHAR,TYLONG,2,"i_indx" }, ! 225: ! 226: { TYCOMPLEX,TYREAL,1,"r_imag" }, ! 227: { TYDCOMPLEX,TYDREAL,1,"d_imag" }, ! 228: { TYCOMPLEX,TYCOMPLEX,1,"r_cnjg" }, ! 229: { TYDCOMPLEX,TYDCOMPLEX,1,"d_cnjg" }, ! 230: ! 231: { TYREAL,TYREAL,1,"r_sqrt", 1 }, ! 232: { TYDREAL,TYDREAL,1,"d_sqrt", 1 }, ! 233: { TYCOMPLEX,TYCOMPLEX,1,"c_sqrt" }, ! 234: { TYDCOMPLEX,TYDCOMPLEX,1,"z_sqrt" }, ! 235: ! 236: { TYREAL,TYREAL,1,"r_exp", 2 }, ! 237: { TYDREAL,TYDREAL,1,"d_exp", 2 }, ! 238: { TYCOMPLEX,TYCOMPLEX,1,"c_exp" }, ! 239: { TYDCOMPLEX,TYDCOMPLEX,1,"z_exp" }, ! 240: ! 241: { TYREAL,TYREAL,1,"r_log", 3 }, ! 242: { TYDREAL,TYDREAL,1,"d_log", 3 }, ! 243: { TYCOMPLEX,TYCOMPLEX,1,"c_log" }, ! 244: { TYDCOMPLEX,TYDCOMPLEX,1,"z_log" }, ! 245: ! 246: { TYREAL,TYREAL,1,"r_lg10" }, ! 247: { TYDREAL,TYDREAL,1,"d_lg10" }, ! 248: ! 249: { TYREAL,TYREAL,1,"r_sin", 4 }, ! 250: { TYDREAL,TYDREAL,1,"d_sin", 4 }, ! 251: { TYCOMPLEX,TYCOMPLEX,1,"c_sin" }, ! 252: { TYDCOMPLEX,TYDCOMPLEX,1,"z_sin" }, ! 253: ! 254: { TYREAL,TYREAL,1,"r_cos", 5 }, ! 255: { TYDREAL,TYDREAL,1,"d_cos", 5 }, ! 256: { TYCOMPLEX,TYCOMPLEX,1,"c_cos" }, ! 257: { TYDCOMPLEX,TYDCOMPLEX,1,"z_cos" }, ! 258: ! 259: { TYREAL,TYREAL,1,"r_tan", 6 }, ! 260: { TYDREAL,TYDREAL,1,"d_tan", 6 }, ! 261: ! 262: { TYREAL,TYREAL,1,"r_asin", 7 }, ! 263: { TYDREAL,TYDREAL,1,"d_asin", 7 }, ! 264: ! 265: { TYREAL,TYREAL,1,"r_acos", 8 }, ! 266: { TYDREAL,TYDREAL,1,"d_acos", 8 }, ! 267: ! 268: { TYREAL,TYREAL,1,"r_atan", 9 }, ! 269: { TYDREAL,TYDREAL,1,"d_atan", 9 }, ! 270: ! 271: { TYREAL,TYREAL,2,"r_atn2", 10 }, ! 272: { TYDREAL,TYDREAL,2,"d_atn2", 10 }, ! 273: ! 274: { TYREAL,TYREAL,1,"r_sinh", 11 }, ! 275: { TYDREAL,TYDREAL,1,"d_sinh", 11 }, ! 276: ! 277: { TYREAL,TYREAL,1,"r_cosh", 12 }, ! 278: { TYDREAL,TYDREAL,1,"d_cosh", 12 }, ! 279: ! 280: { TYREAL,TYREAL,1,"r_tanh", 13 }, ! 281: { TYDREAL,TYDREAL,1,"d_tanh", 13 }, ! 282: ! 283: { TYCHAR,TYLOGICAL,2,"hl_ge" }, ! 284: { TYCHAR,TYLOGICAL,2,"l_ge" }, ! 285: ! 286: { TYCHAR,TYLOGICAL,2,"hl_gt" }, ! 287: { TYCHAR,TYLOGICAL,2,"l_gt" }, ! 288: ! 289: { TYCHAR,TYLOGICAL,2,"hl_le" }, ! 290: { TYCHAR,TYLOGICAL,2,"l_le" }, ! 291: ! 292: { TYCHAR,TYLOGICAL,2,"hl_lt" }, ! 293: { TYCHAR,TYLOGICAL,2,"l_lt" }, ! 294: ! 295: { TYREAL,TYSHORT,1,"hr_expn" }, ! 296: { TYREAL,TYLONG,1,"ir_expn" }, ! 297: { TYDREAL,TYSHORT,1,"hd_expn" }, ! 298: { TYDREAL,TYLONG,1,"id_expn" }, ! 299: ! 300: { TYREAL,TYREAL,1,"r_absp" }, ! 301: { TYDREAL,TYDREAL,1,"d_absp" }, ! 302: ! 303: { TYREAL,TYDREAL,1,"r_rrsp" }, ! 304: { TYDREAL,TYDREAL,1,"d_rrsp" }, ! 305: ! 306: { TYREAL,TYREAL,1,"r_frac" }, ! 307: { TYDREAL,TYDREAL,1,"d_frac" }, ! 308: ! 309: { TYREAL,TYREAL,2,"r_make" }, ! 310: { TYDREAL,TYDREAL,2,"d_make" }, ! 311: ! 312: { TYREAL,TYREAL,2,"r_scal" }, ! 313: { TYDREAL,TYDREAL,2,"d_scal" } ! 314: } ; ! 315: ! 316: LOCAL struct Incstblock ! 317: { ! 318: char atype; ! 319: char rtype; ! 320: char constno; ! 321: } consttab[ ] = ! 322: { ! 323: { TYSHORT, TYLONG, 0 }, ! 324: { TYLONG, TYLONG, 1 }, ! 325: { TYREAL, TYLONG, 2 }, ! 326: { TYDREAL, TYLONG, 3 }, ! 327: ! 328: { TYSHORT, TYLONG, 4 }, ! 329: { TYLONG, TYLONG, 5 }, ! 330: { TYREAL, TYLONG, 6 }, ! 331: { TYDREAL, TYLONG, 7 }, ! 332: ! 333: { TYREAL, TYLONG, 8 }, ! 334: { TYDREAL, TYLONG, 9 }, ! 335: ! 336: { TYREAL, TYLONG, 10 }, ! 337: { TYDREAL, TYLONG, 11 }, ! 338: ! 339: { TYREAL, TYREAL, 0 }, ! 340: { TYDREAL, TYDREAL, 1 }, ! 341: ! 342: { TYSHORT, TYLONG, 12 }, ! 343: { TYLONG, TYLONG, 13 }, ! 344: { TYREAL, TYREAL, 2 }, ! 345: { TYDREAL, TYDREAL, 3 }, ! 346: ! 347: { TYREAL, TYREAL, 4 }, ! 348: { TYDREAL, TYDREAL, 5 } ! 349: }; ! 350: ! 351: /* For each machine, two arrays must be initialized. ! 352: intcon contains ! 353: radix for short int ! 354: radix for long int ! 355: radix for single precision ! 356: radix for double precision ! 357: precision for short int ! 358: precision for long int ! 359: precision for single precision ! 360: precision for double precision ! 361: emin for single precision ! 362: emin for double precision ! 363: emax for single precision ! 364: emax for double prcision ! 365: largest short int ! 366: largest long int ! 367: ! 368: realcon contains ! 369: tiny for single precision ! 370: tiny for double precision ! 371: huge for single precision ! 372: huge for double precision ! 373: mrsp (epsilon) for single precision ! 374: mrsp (epsilon) for double precision ! 375: ! 376: the realcons should probably be filled in in binary if TARGET==HERE ! 377: */ ! 378: ! 379: char callbyvalue[ ][XL] = ! 380: { ! 381: "sqrt", ! 382: "exp", ! 383: "log", ! 384: "sin", ! 385: "cos", ! 386: "tan", ! 387: "asin", ! 388: "acos", ! 389: "atan", ! 390: "atan2", ! 391: "sinh", ! 392: "cosh", ! 393: "tanh" ! 394: }; ! 395: ! 396: struct Exprblock *intrcall(np, argsp, nargs) ! 397: struct Nameblock *np; ! 398: struct Listblock *argsp; ! 399: int nargs; ! 400: { ! 401: int i, rettype; ! 402: struct Addrblock *ap; ! 403: register struct Specblock *sp; ! 404: struct Exprblock *q, *inline(); ! 405: register struct Chain *cp; ! 406: struct Constblock *mkcxcon(), *mkrealcon(); ! 407: register struct Incstblock *cstp; ! 408: expptr ep; ! 409: int mtype; ! 410: int op; ! 411: int f1field, f2field, f3field; ! 412: ! 413: packed.ijunk = np->vardesc.varno; ! 414: f1field = packed.bits.f1; ! 415: f2field = packed.bits.f2; ! 416: f3field = packed.bits.f3; ! 417: if(nargs == 0) ! 418: goto badnargs; ! 419: ! 420: mtype = 0; ! 421: for(cp = argsp->listp ; cp ; cp = cp->nextp) ! 422: { ! 423: /* TEMPORARY */ ep = cp->datap; ! 424: /* TEMPORARY */ if( ISCONST(ep) && ep->headblock.vtype==TYSHORT ) ! 425: /* TEMPORARY */ cp->datap = mkconv(tyint, ep); ! 426: mtype = maxtype(mtype, ep->headblock.vtype); ! 427: } ! 428: ! 429: switch(f1field) ! 430: { ! 431: case INTRBOOL: ! 432: op = f3field; ! 433: if( ! ONEOF(mtype, MSKINT|MSKLOGICAL) ) ! 434: goto badtype; ! 435: if(op == OPBITNOT) ! 436: { ! 437: if(nargs != 1) ! 438: goto badnargs; ! 439: q = mkexpr(OPBITNOT, argsp->listp->datap, NULL); ! 440: } ! 441: else ! 442: { ! 443: if(nargs != 2) ! 444: goto badnargs; ! 445: q = mkexpr(op, argsp->listp->datap, ! 446: argsp->listp->nextp->datap); ! 447: } ! 448: frchain( &(argsp->listp) ); ! 449: free(argsp); ! 450: return(q); ! 451: ! 452: case INTRCONV: ! 453: rettype = f2field; ! 454: if(rettype == TYLONG) ! 455: rettype = tyint; ! 456: if( ISCOMPLEX(rettype) && nargs==2) ! 457: { ! 458: expptr qr, qi; ! 459: qr = argsp->listp->datap; ! 460: qi = argsp->listp->nextp->datap; ! 461: if(ISCONST(qr) && ISCONST(qi)) ! 462: q = mkcxcon(qr,qi); ! 463: else q = mkexpr(OPCONV,mkconv(rettype-2,qr), ! 464: mkconv(rettype-2,qi)); ! 465: } ! 466: else if(nargs == 1) ! 467: q = mkconv(rettype, argsp->listp->datap); ! 468: else goto badnargs; ! 469: ! 470: q->vtype = rettype; ! 471: frchain(&(argsp->listp)); ! 472: free(argsp); ! 473: return(q); ! 474: ! 475: ! 476: case INTRCNST: ! 477: cstp = consttab + f3field; ! 478: for(i=0 ; i<f2field ; ++i) ! 479: if(cstp->atype == mtype) ! 480: goto foundconst; ! 481: else ! 482: ++cstp; ! 483: goto badtype; ! 484: ! 485: foundconst: ! 486: switch(cstp->rtype) ! 487: { ! 488: case TYLONG: ! 489: return( mkintcon(intcon[cstp->constno]) ); ! 490: ! 491: case TYREAL: ! 492: case TYDREAL: ! 493: return( mkrealcon(cstp->rtype, ! 494: realcon[cstp->constno]) ); ! 495: ! 496: default: ! 497: fatal("impossible intrinsic constant"); ! 498: } ! 499: ! 500: case INTRGEN: ! 501: sp = spectab + f3field; ! 502: if(no66flag) ! 503: if(sp->atype == mtype) ! 504: goto specfunct; ! 505: else err66("generic function"); ! 506: ! 507: for(i=0; i<f2field ; ++i) ! 508: if(sp->atype == mtype) ! 509: goto specfunct; ! 510: else ! 511: ++sp; ! 512: goto badtype; ! 513: ! 514: case INTRSPEC: ! 515: sp = spectab + f3field; ! 516: specfunct: ! 517: if(tyint==TYLONG && sp->rtype==TYSHORT ! 518: && (sp+1)->atype==sp->atype) ! 519: ++sp; ! 520: ! 521: if(nargs != sp->nargs) ! 522: goto badnargs; ! 523: if(mtype != sp->atype) ! 524: goto badtype; ! 525: fixargs(YES, argsp); ! 526: if(q = inline(sp-spectab, mtype, argsp->listp)) ! 527: { ! 528: frchain( &(argsp->listp) ); ! 529: free(argsp); ! 530: } ! 531: else if(sp->othername) ! 532: { ! 533: ap = builtin(sp->rtype, ! 534: varstr(XL, callbyvalue[sp->othername-1]) ); ! 535: q = fixexpr( mkexpr(OPCCALL, ap, argsp) ); ! 536: } ! 537: else ! 538: { ! 539: ap = builtin(sp->rtype, varstr(XL, sp->spxname) ); ! 540: q = fixexpr( mkexpr(OPCALL, ap, argsp) ); ! 541: } ! 542: return(q); ! 543: ! 544: case INTRMIN: ! 545: case INTRMAX: ! 546: if(nargs < 2) ! 547: goto badnargs; ! 548: if( ! ONEOF(mtype, MSKINT|MSKREAL) ) ! 549: goto badtype; ! 550: argsp->vtype = mtype; ! 551: q = mkexpr( (f1field==INTRMIN ? OPMIN : OPMAX), argsp, NULL); ! 552: ! 553: q->vtype = mtype; ! 554: rettype = f2field; ! 555: if(rettype == TYLONG) ! 556: rettype = tyint; ! 557: else if(rettype == TYUNKNOWN) ! 558: rettype = mtype; ! 559: return( mkconv(rettype, q) ); ! 560: ! 561: default: ! 562: fatali("intrcall: bad intrgroup %d", f1field); ! 563: } ! 564: badnargs: ! 565: errstr("bad number of arguments to intrinsic %s", ! 566: varstr(VL,np->varname) ); ! 567: goto bad; ! 568: ! 569: badtype: ! 570: errstr("bad argument type to intrinsic %s", varstr(VL, np->varname) ); ! 571: ! 572: bad: ! 573: return( errnode() ); ! 574: } ! 575: ! 576: ! 577: ! 578: ! 579: intrfunct(s) ! 580: char s[VL]; ! 581: { ! 582: register struct Intrblock *p; ! 583: char nm[VL]; ! 584: register int i; ! 585: ! 586: for(i = 0 ; i<VL ; ++s) ! 587: nm[i++] = (*s==' ' ? '\0' : *s); ! 588: ! 589: for(p = intrtab; p->intrval.intrgroup!=INTREND ; ++p) ! 590: { ! 591: if( eqn(VL, nm, p->intrfname) ) ! 592: { ! 593: packed.bits.f1 = p->intrval.intrgroup; ! 594: packed.bits.f2 = p->intrval.intrstuff; ! 595: packed.bits.f3 = p->intrval.intrno; ! 596: return(packed.ijunk); ! 597: } ! 598: } ! 599: ! 600: return(0); ! 601: } ! 602: ! 603: ! 604: ! 605: ! 606: ! 607: struct Addrblock *intraddr(np) ! 608: struct Nameblock *np; ! 609: { ! 610: struct Addrblock *q; ! 611: register struct Specblock *sp; ! 612: int f3field; ! 613: ! 614: if(np->vclass!=CLPROC || np->vprocclass!=PINTRINSIC) ! 615: fatalstr("intraddr: %s is not intrinsic", varstr(VL,np->varname)); ! 616: packed.ijunk = np->vardesc.varno; ! 617: f3field = packed.bits.f3; ! 618: ! 619: switch(packed.bits.f1) ! 620: { ! 621: case INTRGEN: ! 622: /* imag, log, and log10 arent specific functions */ ! 623: if(f3field==31 || f3field==43 || f3field==47) ! 624: goto bad; ! 625: ! 626: case INTRSPEC: ! 627: sp = spectab + f3field; ! 628: if(tyint==TYLONG && sp->rtype==TYSHORT) ! 629: ++sp; ! 630: q = builtin(sp->rtype, varstr(XL,sp->spxname) ); ! 631: return(q); ! 632: ! 633: case INTRCONV: ! 634: case INTRMIN: ! 635: case INTRMAX: ! 636: case INTRBOOL: ! 637: case INTRCNST: ! 638: bad: ! 639: errstr("cannot pass %s as actual", ! 640: varstr(VL,np->varname)); ! 641: return( errnode() ); ! 642: } ! 643: fatali("intraddr: impossible f1=%d\n", packed.bits.f1); ! 644: /* NOTREACHED */ ! 645: } ! 646: ! 647: ! 648: ! 649: ! 650: ! 651: struct Exprblock *inline(fno, type, args) ! 652: int fno; ! 653: int type; ! 654: struct Chain *args; ! 655: { ! 656: register struct Exprblock *q, *t, *t1; ! 657: ! 658: switch(fno) ! 659: { ! 660: case 8: /* real abs */ ! 661: case 9: /* short int abs */ ! 662: case 10: /* long int abs */ ! 663: case 11: /* double precision abs */ ! 664: if( addressable(q = args->datap) ) ! 665: { ! 666: t = q; ! 667: q = NULL; ! 668: } ! 669: else ! 670: t = mktemp(type); ! 671: t1 = mkexpr(OPQUEST, mkexpr(OPLE, mkconv(type,ICON(0)), cpexpr(t)), ! 672: mkexpr(OPCOLON, cpexpr(t), ! 673: mkexpr(OPNEG, cpexpr(t), NULL) )); ! 674: if(q) ! 675: t1 = mkexpr(OPCOMMA, mkexpr(OPASSIGN, cpexpr(t),q), t1); ! 676: frexpr(t); ! 677: return(t1); ! 678: ! 679: case 26: /* dprod */ ! 680: q = mkexpr(OPSTAR, mkconv(TYDREAL,args->datap), args->nextp->datap); ! 681: return(q); ! 682: ! 683: case 27: /* len of character string */ ! 684: q = cpexpr(args->datap->vleng); ! 685: frexpr(args->datap); ! 686: return(q); ! 687: ! 688: case 14: /* half-integer mod */ ! 689: case 15: /* mod */ ! 690: return( mkexpr(OPMOD, args->datap, args->nextp->datap) ); ! 691: } ! 692: return(NULL); ! 693: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.