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