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