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