3 * (C) Copyright Apr 15 1995, Edmond J. Breen.
5 * This code may be copied for personal, non-profit use only.
7 * Documentation in: ../doc/tech_doc/typesets.doc
12 /* Modified by Intel OpenCV team. The bug fix has been applied to EiC_castvar function
13 in order to prevent throwing of errors while parsing ISO C compatible input. */
28 static void binhint(), binhuint();
29 static void binhlong(), binhulong(), binhdouble(), binhconst(), binhllong();
30 extern void EiC_binhlval();
32 void (*BINFUN[]) () = {
33 NULL, NULL, /* t_error, t_bool, */
34 binhint, binhint, /* t_char, t_uchar, */
35 binhint, binhint, /* t_short, t_ushort */
36 binhint, binhint, /* t_int, t_enum, */
37 binhuint, /* t_uint, */
39 binhlong, binhulong, /* t_long, t_ulong, */
40 binhllong, /* t_llong */
41 binhdouble, binhdouble, /* t_float, t_double, */
42 EiC_binhlval, NULL, /* t_pointer, t_void */
43 NULL,NULL, /* t_struct, t_union */
44 NULL,EiC_binhlval, /* t_lval, t_array */
48 typedef unsigned long set_t;
49 #define ismem(S,m) (((long)1 << (m)) & (S))
50 #define I(x) ((long)1 << (x))
52 #define SETNUM I(t_char)+I(t_short)+I(t_int)+I(t_enum)+I(t_long)+I(t_llong)
53 #define SETUNUM I(t_uchar)+I(t_ushort)+I(t_uint)+I(t_ulong)
54 #define SETFLOAT I(t_float)+I(t_double)
68 * two pointers cannot be added together
72 {SETNUM + SETUNUM + SETFLOAT,
73 SETNUM + SETUNUM + SETFLOAT},
74 {I(t_pointer) + I(t_array),
77 I(t_pointer) + I(t_array)},
81 * integrals can be subtracted from a pointer
82 * but not visa a versa
86 {SETNUM + SETUNUM + SETFLOAT,
87 SETNUM + SETUNUM + SETFLOAT},
88 {I(t_pointer) + I(t_array),
89 I(t_pointer) + I(t_array) + SETNUM + SETUNUM},
94 {SETNUM + SETUNUM + SETFLOAT ,
95 SETNUM + SETUNUM + SETFLOAT }};
99 {SETNUM + SETUNUM + SETFLOAT ,
100 SETNUM + SETUNUM + SETFLOAT}};
104 {I(t_pointer) + I(t_array) + SETNUM + SETUNUM + SETFLOAT ,
105 I(t_pointer) + I(t_array) + SETNUM + SETUNUM + SETFLOAT}};
116 {'+', addLR, sizeof(addLR) / sizeof(LRset_t),},
117 {'-', subLR, sizeof(subLR) / sizeof(LRset_t),},
118 {'*', multLR, sizeof(multLR) / sizeof(LRset_t),},
119 {'/', divLR, sizeof(divLR) / sizeof(LRset_t),},
120 {'%', modLR, sizeof(modLR) / sizeof(LRset_t),},
121 {LSHT, modLR, sizeof(modLR) / sizeof(LRset_t),},
122 {RSHT, modLR, sizeof(modLR) / sizeof(LRset_t),},
123 {BOR, modLR, sizeof(modLR) / sizeof(LRset_t),},
124 {XOR, modLR, sizeof(modLR) / sizeof(LRset_t),},
125 {AND, modLR, sizeof(modLR) / sizeof(LRset_t),},
126 {LT, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
127 {LE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
128 {EQ, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
129 {NE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
130 {GT, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
131 {GE, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
132 {LOR, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
133 {LAND, LTLR, sizeof(LTLR) / sizeof(LRset_t),},
137 void EiC_castvar(token_t * e1,
138 token_t * e2, int explicit)
140 /* cast e1 into e2 */
142 if (EiC_gettype(e2->Type) == t_func) {
145 e3.Type = EiC_copytype(nextType(e2->Type));
146 EiC_castvar(e1, &e3, explicit);
147 EiC_freetype(e3.Type);
150 if (EiC_gettype(e2->Type) == t_lval) {
152 e2->Type = nextType(e2->Type);
153 EiC_castvar(e1, e2, explicit);
157 if(EiC_gettype(e2->Type) == t_void) {
158 e1->Type = EiC_addtype(t_void,EiC_freetype(e1->Type));
162 switch (EiC_gettype(e1->Type)) {
164 switch (EiC_gettype(e2->Type)) {
166 EiC_generate(&e1->Code,int2uchar,&e1->Val,0);
169 EiC_generate(&e1->Code,int2ushort,&e1->Val,0);
171 case t_char: case t_short: case t_int: case t_uint:
173 CASE_LONG: CASE_ULONG:
174 if(sizeof(int) != sizeof(long))
175 EiC_generate(&e1->Code, int2long, &e1->Val, 0);
178 if(sizeof(int) != sizeof(eic_llong))
179 EiC_generate(&e1->Code, int2llong, &e1->Val, 0);
182 EiC_generate(&e1->Code, int2double, &e1->Val, 0);
185 EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
186 e1->Type = EiC_addtype(t_pointer,e1->Type);
188 EiC_warningerror("Suspicious pointer conversion");
192 EiC_error("Illegal cast operation");
196 switch (EiC_gettype(e2->Type)) {
199 CASE_LONG: CASE_ULONG:
200 if(sizeof(int) != sizeof(long))
201 EiC_generate(&e1->Code, uint2long, &e1->Val, 0);
204 if(sizeof(int) != sizeof(eic_llong))
205 EiC_generate(&e1->Code, uint2llong, &e1->Val, 0);
208 EiC_generate(&e1->Code, uint2double, &e1->Val, 0);
211 EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
212 e1->Type = EiC_addtype(t_pointer,e1->Type);
214 EiC_warningerror("Suspicious pointer conversion");
217 EiC_error("Illegal cast operation");
221 switch (EiC_gettype(e2->Type)) {
223 if(sizeof(int) != sizeof(long))
224 EiC_generate(&e1->Code, long2int, &e1->Val, 0);
226 CASE_LONG: CASE_ULONG:
229 EiC_generate(&e1->Code, long2double, &e1->Val, 0);
232 EiC_generate(&e1->Code, long2llong, &e1->Val, 0); break;
234 EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
235 e1->Type = EiC_addtype(t_pointer,e1->Type);
237 EiC_warningerror("Suspicious pointer conversion");
240 EiC_error("Illegal cast operation");
244 switch (EiC_gettype(e2->Type)) {
246 if(sizeof(int) != sizeof(long))
247 EiC_generate(&e1->Code, ulong2int, &e1->Val, 0);
249 CASE_LONG: CASE_ULONG:
252 EiC_generate(&e1->Code, ulong2double, &e1->Val, 0);
255 EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0); break;
257 EiC_generate(&e1->Code, int2ptr, &e1->Val, 0);
258 e1->Type = EiC_addtype(t_pointer,e1->Type);
260 EiC_warningerror("Suspicious pointer conversion");
263 EiC_error("Illegal cast operation");
269 switch (EiC_gettype(e2->Type)) {
273 if(sizeof(int) != sizeof(eic_llong))
274 EiC_generate(&e1->Code, llong2int, &e1->Val, 0);
277 CASE_LONG: CASE_ULONG:
278 if(sizeof(long) != sizeof(eic_llong))
279 EiC_generate(&e1->Code, llong2long, &e1->Val, 0);
284 EiC_error("Illegal cast operation");
288 switch (EiC_gettype(e2->Type)) {
290 EiC_generate(&e1->Code, double2int, &e1->Val, 0);
292 CASE_LONG: CASE_ULONG:
293 EiC_generate(&e1->Code, double2long, &e1->Val, 0);
296 EiC_generate(&e1->Code, double2llong, &e1->Val, 0);
300 if(EiC_gettype(e1->Type) == t_double
301 && EiC_gettype(e2->Type) == t_float)
302 EiC_generate(&e1->Code, double2float, &e1->Val, 0);
309 EiC_error("Illegal cast operation");
314 switch (EiC_gettype(e2->Type)) {
317 EiC_error("Illegal cast operation");
323 EiC_generate(&e1->Code, ptr2int, &e1->Val, 0);
327 EiC_generate(&e1->Code, ptr2long, &e1->Val, 0);
329 CASE_FLOAT:EiC_error("Illegal cast operation");
332 if (!EiC_sametypes(e1->Type, e2->Type)) {
333 if (EiC_gettype(e2->Type) != t_pointer)
334 EiC_error("Illegal cast operation");
336 EiC_warningerror("Suspicious pointer conversion");
338 if(ConstIntegrity(nextType(e2->Type),nextType(e1->Type)))
339 EiC_error("Cast loses const qualifier");
340 if(!EiC_compareSafe(nextType(e1->Type),nextType(e2->Type)))
341 EiC_error("Casting between safe and unsafe address");
344 EiC_error("Illegal cast operation");
347 EiC_freetype(e1->Type);
348 e1->Type = EiC_copytype(e2->Type);
351 if (EiC_gettype(e2->Type) == t_pointer) {
352 EiC_exchtype(t_pointer, e1->Type);
353 if (!EiC_sametypes(e1->Type, e2->Type) && !explicit)
354 EiC_warningerror("Suspicious pointer conversion");
355 } else if(EiC_gettype(e2->Type) == t_array) {
356 if (!EiC_sametypes(e1->Type, e2->Type))
357 EiC_error("Illegal cast operation");
359 EiC_error("Illegal cast operation");
362 e1->Type = EiC_succType(e1->Type);
363 EiC_castvar(e1, e2, explicit);
368 if (EiC_gettype(e2->Type) == t_lval) {
369 if (!EiC_sametypes(e1->Type, nextType(e2->Type)))
370 EiC_error("Illegal cast operation");
371 } else if (!EiC_sametypes(e1->Type, e2->Type))
372 EiC_error("Illegal cast operation");
375 EiC_error("Illegal cast operation");
377 EiC_set_bastype(EiC_bastype(e2->Type), e1->Type);
383 void EiC_castconst(token_t * e1, token_t * e2, int explicit)
386 * cast e1 type into an e2 type and
387 * where e1 is a constant
390 if (EiC_gettype(e2->Type) == t_func) {
392 e3.Type = EiC_copytype(nextType(e2->Type));
393 EiC_castconst(e1, &e3, explicit);
394 EiC_freetype(e3.Type);
398 EiC_castvar(e1, e2, explicit);
401 if(EiC_gettype(e2->Type) == t_void) {
402 e1->Type = EiC_addtype(t_void,EiC_freetype(e1->Type));
407 switch ((t = EiC_gettype(e2->Type))) {
409 switch (EiC_gettype(e1->Type)) {
410 CASE_INT: CASE_UINT: break;
411 CASE_LONG:e1->Val.ival = (int) e1->Val.lval; break;
412 CASE_ULONG:e1->Val.ival = (int) e1->Val.ulval; break;
413 CASE_FLOAT:e1->Val.ival = (int) e1->Val.dval; break;
414 case t_llong: e1->Val.ival = (int)e1->Val.llval; break;
416 EiC_error("Illegal cast operation");
420 switch (EiC_gettype(e1->Type)) {
421 CASE_INT:e1->Val.lval = (long) e1->Val.ival;
423 CASE_UINT:e1->Val.lval = (long) e1->Val.uival;
428 case t_llong:e1->Val.lval = (long)e1->Val.llval;
431 CASE_FLOAT:e1->Val.lval = (long) e1->Val.dval;
434 EiC_error("Illegal cast operation");
438 switch (EiC_gettype(e1->Type)) {
439 CASE_INT:e1->Val.ulval = (unsigned long) e1->Val.ival;
441 CASE_UINT:e1->Val.ulval = (unsigned long) e1->Val.uival;
446 case t_llong: e1->Val.ulval = (long)e1->Val.llval; break;
448 CASE_FLOAT:e1->Val.ulval = (unsigned long) e1->Val.dval;
451 EiC_error("Illegal cast operation");
456 switch (EiC_gettype(e1->Type)) {
457 CASE_INT: e1->Val.llval = (eic_llong) e1->Val.ival; break;
458 CASE_UINT: e1->Val.llval = (eic_llong) e1->Val.uival; break;
459 CASE_LONG: e1->Val.llval = (eic_llong) e1->Val.lval; break;
460 case t_ulong:e1->Val.llval =(eic_llong) e1->Val.ulval; break;
463 CASE_FLOAT:e1->Val.llval = (eic_llong)e1->Val.dval;
466 EiC_error("Illegal cast operation");
471 switch (EiC_gettype(e1->Type)) {
472 CASE_INT:e1->Val.dval = (double) e1->Val.ival;
474 CASE_UINT:e1->Val.dval = (double) e1->Val.uival;
476 CASE_LONG:e1->Val.dval = (double) e1->Val.lval;
479 e1->Val.dval = (double) e1->Val.ulval;
481 case t_llong: e1->Val.dval = (double)e1->Val.llval; break;
483 EiC_error("Illegal floating point operation");
486 e1->Val.dval = (float)e1->Val.dval; break;
492 e2->Type = EiC_succType(e2->Type);
493 EiC_castconst(e1, e2, explicit);
494 e2->Type = EiC_addtype(t, e2->Type);
497 if (EiC_gettype(e1->Type) != t_pointer && !explicit
498 && e1->Val.ival != 0 && !TREFON)
499 EiC_warningerror("Suspicious pointer conversion");
500 switch (EiC_gettype(e1->Type)) {
501 CASE_INT: e1->Val.p.sp = e1->Val.p.p = (void *) e1->Val.ival;
502 if(EiC_gettype(nextType(e2->Type)) != t_void)
503 e1->Val.p.ep = (void *) (e1->Val.ival + EiC_get_sizeof(nextType(e2->Type)));
505 e1->Val.p.ep = (void *) (e1->Val.ival + sizeof(void *));
507 CASE_UINT: e1->Val.p.sp = e1->Val.p.p = (void *) e1->Val.uival;
508 if(EiC_gettype(nextType(e2->Type)) != t_void)
509 e1->Val.p.ep = (void *) (e1->Val.uival + EiC_get_sizeof(nextType(e2->Type)));
511 e1->Val.p.ep = (void *) (e1->Val.uival + sizeof(void *));
515 e1->Val.p.sp = e1->Val.p.p = (void *) e1->Val.ulval;
516 if(EiC_gettype(nextType(e2->Type)) != t_void)
517 e1->Val.p.ep = (void *) (e1->Val.ulval + EiC_get_sizeof(nextType(e2->Type)));
519 e1->Val.p.ep = (void *) (e1->Val.ulval + sizeof(void *));
522 if (!EiC_sametypes(e2->Type,e1->Type))
523 EiC_warningerror("Suspicious pointer conversion");
524 e1->Type = EiC_freetype(e1->Type);
525 e1->Type = EiC_copytype(e2->Type);
529 EiC_error("Illegal cast operation");
532 EiC_exchtype(t_pointer, e1->Type);
534 if(!issafe(e2->Type))
540 if (EiC_gettype(e2->Type) == t_lval) {
541 if (!EiC_sametypes(e1->Type, nextType(e2->Type)))
542 EiC_error("Illegal cast operation");
543 } else if (!EiC_sametypes(e1->Type, e2->Type))
544 EiC_error("Illegal cast operation");
547 EiC_error("Illegal cast operation");
549 EiC_set_bastype(EiC_bastype(e2->Type), e1->Type);
553 void EiC_do_lor(token_t *e1, int n)
558 switch(EiC_gettype(e1->Type)) {
560 CASE_UINT: inst = jmpTint; break;
562 CASE_ULONG: inst = jmpTlng; break;
563 CASE_FLOAT: inst = jmpTdbl; break;
564 case t_pointer: inst = jmpTptr;break;
566 EiC_error("syntax error near '||'");
569 EiC_exchtype(t_int,e1->Type);
571 EiC_generate(&e1->Code, inst, &u1, 0);
573 void EiC_do_land(token_t *e1, int n)
578 switch(EiC_gettype(e1->Type)) {
580 CASE_UINT: inst = jmpFint; break;
582 CASE_ULONG: inst = jmpFlng; break;
583 CASE_FLOAT: inst = jmpFdbl; break;
584 case t_pointer: inst = jmpFptr;break;
586 EiC_error("syntax error associated near '&&'");
589 EiC_exchtype(t_int,e1->Type);
591 EiC_generate(&e1->Code, inst, &u1, 0);
594 static void checkint(unsigned obj, token_t * e1, token_t * e2)
596 if (EiC_gettype(e1->Type) != obj) {
597 if(!isconst(e1->Type))
598 EiC_exchtype(obj, e1->Type);
600 EiC_castconst(e1,e2,0);
602 if (EiC_gettype(e2->Type) != obj) {
603 if(!isconst(e1->Type))
604 EiC_exchtype(obj, e2->Type);
606 EiC_castconst(e2, e1, 0);
613 void binhint(unsigned oper, token_t * e1, token_t * e2)
615 checkint(t_int, e1, e2);
618 EiC_generate(&e2->Code, addint, &e2->Val, 0);
621 EiC_generate(&e2->Code, subint, &e2->Val, 0);
624 EiC_generate(&e2->Code, multint, &e2->Val, 0);
627 EiC_generate(&e2->Code, divint, &e2->Val, 0);
630 EiC_generate(&e2->Code, modint, &e2->Val, 0);
633 EiC_generate(&e2->Code, lshtint, &e2->Val, 0);
636 EiC_generate(&e2->Code, rshtint, &e2->Val, 0);
639 EiC_generate(&e2->Code, ltint, &e2->Val, 0);
642 EiC_generate(&e2->Code, leint, &e2->Val, 0);
645 EiC_generate(&e2->Code, eqint, &e2->Val, 0);
648 EiC_generate(&e2->Code, neint, &e2->Val, 0);
651 EiC_generate(&e2->Code, gtint, &e2->Val, 0);
654 EiC_generate(&e2->Code, geint, &e2->Val, 0);
657 EiC_generate(&e2->Code, borint, &e2->Val, 0);
660 EiC_generate(&e2->Code, xorint, &e2->Val, 0);
663 EiC_generate(&e2->Code, andint, &e2->Val, 0);
668 void binhuint(unsigned oper, token_t * e1, token_t * e2)
670 checkint(t_uint, e1, e2);
673 EiC_generate(&e2->Code, adduint, &e2->Val, 0);
676 EiC_generate(&e2->Code, subuint, &e2->Val, 0);
679 EiC_generate(&e2->Code, multuint, &e2->Val, 0);
682 EiC_generate(&e2->Code, divuint, &e2->Val, 0);
685 EiC_generate(&e2->Code, moduint, &e2->Val, 0);
688 EiC_generate(&e2->Code, lshtuint, &e2->Val, 0);
691 EiC_generate(&e2->Code, rshtuint, &e2->Val, 0);
694 EiC_generate(&e2->Code, boruint, &e2->Val, 0);
697 EiC_generate(&e2->Code, xoruint, &e2->Val, 0);
700 EiC_generate(&e2->Code, anduint, &e2->Val, 0);
704 EiC_exchtype(t_int, e1->Type); /* should really be boolean */
707 EiC_generate(&e2->Code, ltuint, &e2->Val, 0);
710 EiC_generate(&e2->Code, leuint, &e2->Val, 0);
713 EiC_generate(&e2->Code, equint, &e2->Val, 0);
716 EiC_generate(&e2->Code, neuint, &e2->Val, 0);
719 EiC_generate(&e2->Code, gtuint, &e2->Val, 0);
722 EiC_generate(&e2->Code, geuint, &e2->Val, 0);
728 static void checklong(unsigned obj, token_t * e1, token_t * e2)
731 if ((t=EiC_gettype(e1->Type)) != obj) {
732 if (!isconst(e1->Type)) {
735 if(sizeof(int) != sizeof(long))
737 CASE_INT:EiC_generate(&e1->Code, int2long, &e1->Val, 0);
739 CASE_UINT:EiC_generate(&e1->Code, uint2long, &e1->Val, 0);
742 EiC_exchtype(obj, e1->Type);
744 EiC_castconst(e1, e2, 0);
746 if ((t=EiC_gettype(e2->Type)) != obj) {
747 if (!isconst(e2->Type)) {
750 if(sizeof(int) != sizeof(long))
752 CASE_INT:EiC_generate(&e2->Code, int2long, &e1->Val, 0);
754 CASE_UINT:EiC_generate(&e2->Code, uint2long, &e1->Val, 0);
757 EiC_exchtype(obj, e2->Type);
759 EiC_castconst(e2, e1, 0);
765 void binhlong(unsigned oper, token_t * e1, token_t * e2)
767 checklong(t_long, e1, e2);
771 EiC_generate(&e2->Code, addlong, &e2->Val, 0);
774 EiC_generate(&e2->Code, sublong, &e2->Val, 0);
777 EiC_generate(&e2->Code, multlong, &e2->Val, 0);
780 EiC_generate(&e2->Code, divlong, &e2->Val, 0);
783 EiC_generate(&e2->Code, modlong, &e2->Val, 0);
786 EiC_generate(&e2->Code, lshtlong, &e2->Val, 0);
789 EiC_generate(&e2->Code, rshtlong, &e2->Val, 0);
792 EiC_generate(&e2->Code, borlong, &e2->Val, 0);
795 EiC_generate(&e2->Code, xorlong, &e2->Val, 0);
798 EiC_generate(&e2->Code, andlong, &e2->Val, 0);
802 EiC_exchtype(t_int, e1->Type); /* should really be boolean */
805 EiC_generate(&e2->Code, ltlong, &e2->Val, 0);
808 EiC_generate(&e2->Code, lelong, &e2->Val, 0);
811 EiC_generate(&e2->Code, eqlong, &e2->Val, 0);
814 EiC_generate(&e2->Code, nelong, &e2->Val, 0);
817 EiC_generate(&e2->Code, gtlong, &e2->Val, 0);
820 EiC_generate(&e2->Code, gelong, &e2->Val, 0);
827 void binhulong(unsigned oper, token_t * e1, token_t * e2)
829 checklong(t_ulong, e1, e2);
832 EiC_generate(&e2->Code, addulong, &e2->Val, 0);
835 EiC_generate(&e2->Code, subulong, &e2->Val, 0);
838 EiC_generate(&e2->Code, multulong, &e2->Val, 0);
841 EiC_generate(&e2->Code, divulong, &e2->Val, 0);
844 EiC_generate(&e2->Code, modulong, &e2->Val, 0);
847 EiC_generate(&e2->Code, lshtulong, &e2->Val, 0);
850 EiC_generate(&e2->Code, rshtulong, &e2->Val, 0);
853 EiC_generate(&e2->Code, borulong, &e2->Val, 0);
856 EiC_generate(&e2->Code, xorulong, &e2->Val, 0);
859 EiC_generate(&e2->Code, andulong, &e2->Val, 0);
863 EiC_exchtype(t_int, e1->Type); /* should really be boolean */
866 EiC_generate(&e2->Code, ltulong, &e2->Val, 0);
869 EiC_generate(&e2->Code, leulong, &e2->Val, 0);
872 EiC_generate(&e2->Code, equlong, &e2->Val, 0);
875 EiC_generate(&e2->Code, neulong, &e2->Val, 0);
878 EiC_generate(&e2->Code, gtulong, &e2->Val, 0);
881 EiC_generate(&e2->Code, geulong, &e2->Val, 0);
888 static void checkllong(unsigned obj, token_t * e1, token_t * e2)
891 if ((t=EiC_gettype(e1->Type)) != obj) {
892 if (!isconst(e1->Type)) {
895 if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {
897 CASE_INT:EiC_generate(&e1->Code, int2llong, &e1->Val, 0);
899 CASE_UINT:EiC_generate(&e1->Code, uint2llong, &e1->Val, 0);
901 } else if(sizeof(long) != sizeof(eic_llong)) {
903 case t_long:EiC_generate(&e1->Code, long2llong, &e1->Val, 0);
905 case t_ulong:EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0);
908 EiC_exchtype(obj, e1->Type);
910 EiC_castconst(e1, e2, 0);
912 if ((t=EiC_gettype(e2->Type)) != obj) {
913 if (!isconst(e2->Type)) {
916 if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {
918 CASE_INT:EiC_generate(&e2->Code, int2llong, &e1->Val, 0);
920 CASE_UINT:EiC_generate(&e2->Code, uint2llong, &e1->Val, 0);
922 } else if(sizeof(long) != sizeof(eic_llong)) {
924 case t_long:EiC_generate(&e2->Code, long2llong, &e1->Val, 0);
926 case t_ulong:EiC_generate(&e2->Code, ulong2llong, &e1->Val, 0);
929 EiC_exchtype(obj, e2->Type);
931 EiC_castconst(e2, e1, 0);
938 void binhllong(unsigned oper, token_t * e1, token_t * e2)
940 checkllong(t_llong, e1, e2);
944 EiC_generate(&e2->Code, addllong, &e2->Val, 0);
947 EiC_generate(&e2->Code, subllong, &e2->Val, 0);
950 EiC_generate(&e2->Code, multllong, &e2->Val, 0);
953 EiC_generate(&e2->Code, divllong, &e2->Val, 0);
956 EiC_generate(&e2->Code, modllong, &e2->Val, 0);
959 EiC_generate(&e2->Code, lshtllong, &e2->Val, 0);
962 EiC_generate(&e2->Code, rshtllong, &e2->Val, 0);
965 EiC_generate(&e2->Code, borllong, &e2->Val, 0);
968 EiC_generate(&e2->Code, xorllong, &e2->Val, 0);
971 EiC_generate(&e2->Code, andllong, &e2->Val, 0);
975 EiC_exchtype(t_int, e1->Type); /* should really be boolean */
978 EiC_generate(&e2->Code, ltllong, &e2->Val, 0);
981 EiC_generate(&e2->Code, lellong, &e2->Val, 0);
984 EiC_generate(&e2->Code, eqllong, &e2->Val, 0);
987 EiC_generate(&e2->Code, nellong, &e2->Val, 0);
990 EiC_generate(&e2->Code, gtllong, &e2->Val, 0);
993 EiC_generate(&e2->Code, gellong, &e2->Val, 0);
1002 void binhdouble(unsigned oper, token_t * e1, token_t * e2)
1005 if ((t=EiC_gettype(e1->Type)) != t_double) {
1006 if (!isconst(e1->Type)) {
1010 CASE_INT:EiC_generate(&e1->Code, int2double, &e1->Val, 0);
1012 CASE_UINT:EiC_generate(&e1->Code, uint2double, &e1->Val, 0);
1014 CASE_LONG:EiC_generate(&e1->Code, long2double, &e1->Val, 0);
1016 CASE_ULONG:EiC_generate(&e1->Code, ulong2double, &e1->Val, 0);
1018 case t_llong: EiC_generate(&e1->Code, llong2double, &e1->Val, 0);
1021 EiC_exchtype(t_double, e1->Type);
1023 EiC_castconst(e1, e2, 0);
1025 if ((t=EiC_gettype(e2->Type)) != t_double) {
1026 if (!isconst(e2->Type)) {
1030 CASE_INT:EiC_generate(&e2->Code, int2double, &e1->Val, 0);
1032 CASE_UINT:EiC_generate(&e2->Code, uint2double, &e1->Val, 0);
1034 CASE_LONG:EiC_generate(&e2->Code, long2double, &e1->Val, 0);
1036 CASE_ULONG:EiC_generate(&e2->Code, ulong2double, &e1->Val, 0);
1038 case t_llong:EiC_generate(&e2->Code, llong2double, &e1->Val, 0);
1041 EiC_exchtype(t_double, e2->Type);
1043 EiC_castconst(e2, e1, 0);
1050 EiC_generate(&e2->Code, adddouble, &e2->Val, 0);
1053 EiC_generate(&e2->Code, subdouble, &e2->Val, 0);
1056 EiC_generate(&e2->Code, multdouble, &e2->Val, 0);
1059 EiC_generate(&e2->Code, divdouble, &e2->Val, 0);
1063 EiC_exchtype(t_int, e1->Type); /* should really be boolean */
1066 EiC_generate(&e2->Code, ltdouble, &e2->Val, 0);
1069 EiC_generate(&e2->Code, ledouble, &e2->Val, 0);
1072 EiC_generate(&e2->Code, eqdouble, &e2->Val, 0);
1075 EiC_generate(&e2->Code, nedouble, &e2->Val, 0);
1078 EiC_generate(&e2->Code, gtdouble, &e2->Val, 0);
1081 EiC_generate(&e2->Code, gedouble, &e2->Val, 0);
1083 default:EiC_error("illegal binary operation to `%c'", oper);
1088 #define arrayLimit(type) /* replaced by runtime checks */
1090 /*if(limit && (e2->Val.type >= limit || \
1092 EiC_error("Array bound violation");
1094 #define ConstPval(y) { if(oper == '+')\
1095 e1->Val.p.p = (char*)e1->Val.p.p + e2->Val.y;\
1097 e1->Val.p.p = (char*)e1->Val.p.p - e2->Val.y;\
1100 void EiC_binhlval(unsigned oper, token_t * e1, token_t * e2)
1103 if (EiC_gettype(e1->Type) != t_pointer) {
1104 if(EiC_gettype(e1->Type) != t_array) {
1105 EiC_binhlval(oper,e2,e1);
1106 EiC_swaptokens(e1,e2);
1108 } else { /* convert array to pointer */
1109 limit = getNumElems(e1->Type);
1113 if(EiC_gettype(e2->Type) == t_array)
1116 if (EiC_gettype(e2->Type) != t_pointer) {
1117 if(oper == '+' || oper == '-') {
1119 VAL.ival = EiC_get_sizeof(nextType(e1->Type));
1121 EiC_error("Illegal pointer operation");
1122 if(isconst(e1->Type) && isconst(e2->Type))
1124 if(isconst(e2->Type)) {
1125 switch (EiC_gettype(e2->Type)) {
1128 e2->Val.ival *= VAL.ival;
1134 e2->Val.uival *= VAL.ival;
1140 e2->Val.lval *= VAL.ival;
1146 e2->Val.ulval *= VAL.ival;
1151 EiC_error("Illegal pointer operation");
1157 VAL.ival = -VAL.ival;
1159 if(EiC_gettype(e2->Type) > t_uint && sizeof(int) != sizeof(long)) {
1162 e3.Type = EiC_addtype(t_int,NULL);
1163 EiC_castvar(e2,&e3,0);
1164 EiC_freetype(e3.Type);
1166 if(VAL.ival > 1 || VAL.ival < 0)
1167 EiC_generate(&e2->Code, ixa, &VAL, limit);
1169 EiC_generate(&e2->Code, addptr2int, &e2->Val, 0);
1173 if (isconst(e2->Type))
1174 EiC_castconst(e2, e1, 0);
1176 EiC_castvar(e2, e1, 0);
1179 } else if (!EiC_compatibletypes(e1->Type, e2->Type))
1180 EiC_error("Mixed pointer operation");
1186 EiC_generate(&e2->Code, subptr, &e2->Val, 0);
1187 VAL.ival = EiC_get_sizeof(nextType(e1->Type));
1189 int size = VAL.ival;
1191 EiC_generate(&e2->Code, bump, &VAL, 0);
1193 EiC_generate(&e2->Code, pushint, &VAL, 0);
1194 EiC_generate(&e2->Code, divint, &VAL, 0);
1198 EiC_generate(&e2->Code, ltptr, &e2->Val, 0);
1201 EiC_generate(&e2->Code, leptr, &e2->Val, 0);
1204 EiC_generate(&e2->Code, eqptr, &e2->Val, 0);
1207 EiC_generate(&e2->Code, neptr, &e2->Val, 0);
1210 EiC_generate(&e2->Code, gtptr, &e2->Val, 0);
1213 EiC_generate(&e2->Code, geptr, &e2->Val, 0);
1217 EiC_freetype(e1->Type);
1218 e1->Type = EiC_addtype(t_int, NULL);
1222 void (*compatable(LRset_t S[],
1223 unsigned n, unsigned left,
1228 if(left > 32 || right > 32)
1231 for (i = 0; i < n; i++)
1232 if (ismem(S[i].Lset, left) && ismem(S[i].Rset, right)) {
1233 m = left > right ? left : right;
1239 int EiC_bin_validate(unsigned oper, token_t * e1, token_t * e2)
1242 void (*f) (int op, token_t * e1, token_t * e2);
1244 if(sizeof(int) == sizeof(long)) {
1245 if(EiC_gettype(e1->Type) == t_uint)
1246 EiC_exchtype(t_ulong,e1->Type);
1247 if(EiC_gettype(e2->Type) == t_uint)
1248 EiC_exchtype(t_ulong,e2->Type);
1252 if(isconst(e1->Type) || isconst(e2->Type)) {
1253 binhconst(oper,e1,e2);
1257 left = EiC_gettype(e1->Type);
1258 right = EiC_gettype(e2->Type);
1260 for (i = 0; i < sizeof(BINSET) / sizeof(Binset); i++)
1261 if (oper == BINSET[i].oper) {
1262 f = compatable(BINSET[i].LRset,
1266 (*f) (oper, e1, e2);
1269 EiC_error("Incompatible types");
1274 void EiC_cast2comm(token_t * e1, token_t * e2)
1276 /* cast e1 and e2 to a common type */
1279 t1 = EiC_gettype(e1->Type);
1280 t2 = EiC_gettype(e2->Type);
1283 if(isconst(e1->Type)) {
1285 if(isconst(e2->Type))
1286 EiC_castconst(e2, e1, 0);
1288 EiC_castvar(e2, e1, 0);
1290 EiC_castconst(e1, e2, 0);
1296 if(t2 == t_array || t2 == t_pointer ||
1298 EiC_error("Illegal cast operation");
1301 if(isconst(e2->Type))
1302 EiC_castconst(e2,e1,0);
1304 EiC_castvar(e2,e1,0);
1306 EiC_castvar(e1,e2,0);
1310 if (!EiC_sametypes(e1->Type, e2->Type)) {
1311 if (isconst(e2->Type))
1312 EiC_castconst(e2, e1, 0);
1316 if (EiC_gettype(e2->Type) == t_pointer) {
1317 if (!EiC_sametypes(nextType(e1->Type), nextType(e2->Type)))
1318 EiC_warningerror("Suspicious pointer conversion");
1319 EiC_exchtype(t_pointer, e1->Type);
1321 EiC_error("Illegal cast operation");
1325 if(EiC_sametypes(e1->Type,e2->Type))
1328 if(!EiC_sametypes(e1->Type,e2->Type))
1329 EiC_error("Illegal cast operation");
1334 int EiC_unaryop(token_t * e1, int op)
1336 void derefConst(token_t * e1);
1339 if (!isconst(e1->Type) && op != INC && op != DEC)
1342 if(!e1->Pflag && isconst(e1->Type)) {
1345 switch (EiC_gettype(e1->Type)) {
1347 e1->Val.ival = -e1->Val.ival;
1350 e1->Val.uival = -e1->Val.uival;
1353 e1->Val.lval = -e1->Val.lval;
1356 e1->Val.lval = -e1->Val.ulval;
1359 e1->Val.dval = -e1->Val.dval;
1362 EiC_error("Illegal operand");
1366 switch (EiC_gettype(e1->Type)) {
1368 e1->Val.ival = ~e1->Val.ival; break;
1370 e1->Val.uival = ~e1->Val.uival;
1371 EiC_exchtype(t_uint,e1->Type);
1375 e1->Val.lval = ~e1->Val.lval; break;
1377 e1->Val.ulval = ~e1->Val.ulval;
1378 EiC_exchtype(t_ulong,e1->Type);
1382 EiC_error("Illegal operand");
1387 switch (EiC_gettype(e1->Type)) {
1388 CASE_INT: CASE_UINT:
1389 e1->Val.ival = !e1->Val.ival;
1393 e1->Val.ival = !e1->Val.lval;
1395 CASE_FLOAT:e1->Val.ival = !e1->Val.dval;
1398 e1->Val.ival = !e1->Val.p.p;
1401 EiC_error("Illegal operand");
1403 e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
1412 EiC_error("Illegal unary opertion");
1421 switch ((t =EiC_gettype(e1->Type))) {
1428 EiC_exchtype(t_int,e1->Type);
1429 EiC_generate(&e1->Code, negint, &e1->Val, 0);
1432 EiC_generate(&e1->Code, neguint, &e1->Val, 0);
1435 EiC_generate(&e1->Code, neglong, &e1->Val, 0);
1438 EiC_generate(&e1->Code, negulong, &e1->Val, 0);
1441 EiC_generate(&e1->Code, negdouble, &e1->Val, 0);
1444 EiC_error("Illegal operand");
1449 switch ((t=EiC_gettype(e1->Type))) {
1450 CASE_INT: CASE_UINT:
1452 EiC_exchtype(t_uint,e1->Type);
1453 EiC_generate(&e1->Code, compint, &e1->Val, 0);
1457 EiC_generate(&e1->Code, compulong, &e1->Val, 0);
1458 EiC_exchtype(t_ulong,e1->Type);
1461 EiC_error("Illegal operand");
1465 switch (EiC_gettype(e1->Type)) {
1466 CASE_INT: CASE_UINT:
1467 EiC_generate(&e1->Code, notint, &e1->Val, 0);
1471 EiC_generate(&e1->Code, notlong, &e1->Val, 0);
1473 CASE_FLOAT:EiC_generate(&e1->Code, notdouble, &e1->Val, 0);
1476 t = EiC_gettype(e1->Type);
1477 e1->Type = EiC_succType(e1->Type);
1478 EiC_unaryop(e1, op);
1479 e1->Type = EiC_addtype(t, e1->Type);
1482 EiC_generate(&e1->Code, notptr, &e1->Val, 0);
1485 EiC_error("Illegal operand");
1487 e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
1492 if(isconstp(e1->Type) || isconst(e1->Type)) {
1494 EiC_error("increment of read-only variable %s",e1->Sym->id);
1496 EiC_error("decrement of read-only variable %s",e1->Sym->id);
1499 EiC_do_inc_dec(e1, op);
1501 EiC_do_stooutput(e1);
1504 if((t = EiC_gettype(e1->Type)) == t_pointer || t == t_array) {
1506 EiC_exchtype(t_lval, e1->Type);
1507 if(nextType(e1->Type) && (!isconstp(nextType(e1->Type)) ||
1508 !isconst(nextType(e1->Type))))
1509 unsetConst(e1->Type);
1510 } else if(t != t_lval)
1511 EiC_error("Must have pointer");
1514 EiC_error(" Invalid unary assignment");
1520 int do_binaryop(token_t * e1, token_t * e2, int op)
1522 int t1 = EiC_gettype(e1->Type);
1523 int t2 = EiC_gettype(e2->Type);
1524 if(t1 == t_pointer || t2 == t_pointer) {
1525 if(!(op >= LT && op <= GE)) {
1526 EiC_binhlval(op,e1,e2);
1532 EiC_castconst(e2, e1, 0);
1534 EiC_castconst(e1, e2, 0);
1536 switch (EiC_gettype(e1->Type)) {
1540 e1->Val.dval *= e2->Val.dval;
1543 e1->Val.dval /= e2->Val.dval;
1546 e1->Val.dval += e2->Val.dval;
1549 e1->Val.dval -= e2->Val.dval;
1552 EiC_set_bastype(t_int, e1->Type);
1555 e1->Val.ival = e1->Val.dval < e2->Val.dval;
1558 e1->Val.ival = e1->Val.dval <= e2->Val.dval;
1561 e1->Val.ival = e1->Val.dval == e2->Val.dval;
1564 e1->Val.ival = e1->Val.dval != e2->Val.dval;
1567 e1->Val.ival = e1->Val.dval > e2->Val.dval;
1570 e1->Val.ival = e1->Val.dval >= e2->Val.dval;
1572 default: EiC_error("illegal binary operation to `%c'", op);
1580 e1->Val.ival *= e2->Val.ival;
1583 e1->Val.ival /= e2->Val.ival;
1586 e1->Val.ival += e2->Val.ival;
1589 e1->Val.ival -= e2->Val.ival;
1592 e1->Val.ival %= e2->Val.ival;
1595 e1->Val.ival <<= e2->Val.ival;
1598 e1->Val.ival >>= e2->Val.ival;
1601 e1->Val.ival = e1->Val.ival & e2->Val.ival;
1604 e1->Val.ival = e1->Val.ival | e2->Val.ival;
1607 e1->Val.ival = e1->Val.ival ^ e2->Val.ival;
1610 e1->Val.ival = e1->Val.ival < e2->Val.ival;
1613 e1->Val.ival = e1->Val.ival <= e2->Val.ival;
1616 e1->Val.ival = e1->Val.ival == e2->Val.ival;
1619 e1->Val.ival = e1->Val.ival != e2->Val.ival;
1622 e1->Val.ival = e1->Val.ival > e2->Val.ival;
1625 e1->Val.ival = e1->Val.ival >= e2->Val.ival;
1632 e1->Val.uival *= e2->Val.uival;
1635 e1->Val.uival /= e2->Val.uival;
1638 e1->Val.uival += e2->Val.uival;
1641 e1->Val.uival -= e2->Val.uival;
1644 e1->Val.uival %= e2->Val.uival;
1647 e1->Val.uival <<= e2->Val.uival;
1650 e1->Val.uival >>= e2->Val.uival;
1653 e1->Val.uival = e1->Val.uival & e2->Val.uival;
1656 e1->Val.uival = e1->Val.uival | e2->Val.uival;
1659 e1->Val.uival = e1->Val.uival ^ e2->Val.uival;
1662 EiC_set_bastype(t_int, e1->Type);
1665 e1->Val.ival = e1->Val.uival < e2->Val.uival;
1668 e1->Val.ival = e1->Val.uival <= e2->Val.uival;
1671 e1->Val.ival = e1->Val.uival == e2->Val.uival;
1674 e1->Val.ival = e1->Val.uival != e2->Val.uival;
1677 e1->Val.ival = e1->Val.uival > e2->Val.uival;
1680 e1->Val.ival = e1->Val.uival >= e2->Val.uival;
1689 e1->Val.lval *= e2->Val.lval;
1692 e1->Val.lval /= e2->Val.lval;
1695 e1->Val.lval += e2->Val.lval;
1698 e1->Val.lval -= e2->Val.lval;
1701 e1->Val.lval %= e2->Val.lval;
1704 e1->Val.lval <<= e2->Val.lval;
1707 e1->Val.lval >>= e2->Val.lval;
1710 e1->Val.lval = e1->Val.lval & e2->Val.lval;
1713 e1->Val.lval = e1->Val.lval | e2->Val.lval;
1716 e1->Val.lval = e1->Val.lval ^ e2->Val.lval;
1719 EiC_set_bastype(t_int, e1->Type);
1722 e1->Val.ival = e1->Val.lval < e2->Val.lval;
1725 e1->Val.ival = e1->Val.lval <= e2->Val.lval;
1728 e1->Val.ival = e1->Val.lval == e2->Val.lval;
1731 e1->Val.ival = e1->Val.lval != e2->Val.lval;
1734 e1->Val.ival = e1->Val.lval > e2->Val.lval;
1737 e1->Val.ival = e1->Val.lval >= e2->Val.lval;
1746 e1->Val.ulval *= e2->Val.ulval;
1749 e1->Val.ulval /= e2->Val.ulval;
1752 e1->Val.ulval += e2->Val.ulval;
1755 e1->Val.ulval -= e2->Val.ulval;
1758 e1->Val.ulval %= e2->Val.ulval;
1761 e1->Val.ulval <<= e2->Val.ulval;
1764 e1->Val.ulval >>= e2->Val.ulval;
1767 e1->Val.ulval = e1->Val.ulval & e2->Val.ulval;
1770 e1->Val.ulval = e1->Val.ulval | e2->Val.ulval;
1773 e1->Val.ulval = e1->Val.ulval ^ e2->Val.ulval;
1776 EiC_set_bastype(t_int, e1->Type);
1779 e1->Val.ival = e1->Val.ulval < e2->Val.ulval;
1782 e1->Val.ival = e1->Val.ulval <= e2->Val.ulval;
1785 e1->Val.ival = e1->Val.ulval == e2->Val.ulval;
1788 e1->Val.ival = e1->Val.ulval != e2->Val.ulval;
1791 e1->Val.ival = e1->Val.ulval > e2->Val.ulval;
1794 e1->Val.ival = e1->Val.ulval >= e2->Val.ulval;
1803 e1->Val.ival = e1->Val.p.p < e2->Val.p.p;
1806 e1->Val.ival = e1->Val.p.p <= e2->Val.p.p;
1809 e1->Val.ival = e1->Val.p.p == e2->Val.p.p;
1812 e1->Val.ival = e1->Val.p.p != e2->Val.p.p;
1815 e1->Val.ival = e1->Val.p.p > e2->Val.p.p;
1818 e1->Val.ival = e1->Val.p.p >= e2->Val.p.p;
1821 EiC_error("Illegal constant pointer operation");
1823 e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type));
1827 EiC_error("Illegal constants");
1832 void * EiC_getaddress(token_t * e1)
1835 int t = EiC_gettype(e1->Type);
1838 if (e1->Sym->val.vfunc != 0)
1839 p = (void*)e1->Sym->val.vfunc;
1841 EiC_error("No link to builtin function");
1842 e1->Type = EiC_addtype(t_pointer, e1->Type);
1847 e1->Type = EiC_addtype(t_pointer, e1->Type);
1851 EiC_error("Illegal use of structure or uion: need an lvalue");
1854 EiC_exchtype(t_pointer, e1->Type);
1857 if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref)
1858 p = EiC_ENV->AR[e1->Sym->val.ival].v.p.p;
1860 p = &EiC_ENV->AR[e1->Sym->val.ival].v;
1864 /* watch out 4 reference variables */
1865 if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref) {
1866 e1->Type = EiC_succType(e1->Type);
1867 if(EiC_gettype(e1->Type) != t_pointer)
1868 EiC_error("Illegal use of reference variable: %s", e1->Sym->id);
1869 p = *(void**)EiC_ENV->AR[e1->Sym->val.ival].v.p.p;
1871 EiC_error("Unknown type: need an lvalue");
1876 void derefConst(token_t * e1)
1878 /* assumes incoming type is a ptr or array */
1880 e1->Type = EiC_succType(e1->Type);
1882 switch(EiC_gettype(e1->Type)) {
1883 case t_char: case t_uchar:
1884 case t_short: case t_ushort:
1885 case t_int: case t_uint:
1886 case t_long: case t_ulong:
1888 case t_float: case t_double:
1892 EiC_generate(&e1->Code,pushptr,&e1->Val, 0);
1893 e1->Type = EiC_addtype(t_lval,e1->Type);
1898 EiC_exchtype(t_pointer,e1->Type);
1903 EiC_error("Unknown const in derefConst");
1909 void EiC_addRval(code_t * code, int type, val_t *v, int st)
1911 /* optomise away rvals */
1913 if((i=nextinst(code)))
1914 if(IsSto_op(opcode(code,i-1)) && ivalcode(code,i) == ivalcode(code,i-1))
1917 EiC_generate(code,type,v,st);
1921 void EiC_output(token_t * e1)
1924 if (e1->Pflag == 0) {
1925 int t = EiC_gettype(e1->Type);
1927 if(isconst(e1->Type)) {
1930 EiC_generate(&e1->Code, pushint, &e1->Val, 0); break;
1932 EiC_generate(&e1->Code, pushuint, &e1->Val, 0); break;
1934 EiC_generate(&e1->Code, pushlong, &e1->Val, 0); break;
1936 EiC_generate(&e1->Code, pushulong, &e1->Val, 0); break;
1937 case t_llong: EiC_generate(&e1->Code, pushllong, &e1->Val, 0);
1939 CASE_FLOAT:EiC_generate(&e1->Code, pushdouble, &e1->Val, 0);
1945 EiC_exchtype(t_pointer, e1->Type);
1947 EiC_generate(&e1->Code, pushptr, &e1->Val, 0);
1952 EiC_error("Unknown const type through output");
1955 unsetConst(e1->Type);
1961 EiC_generate(&e1->Code, rvalchar, &e1->Val, EiC_GI(e1));
1962 EiC_exchtype(t_int,e1->Type);
1965 EiC_generate(&e1->Code, rvaluchar, &e1->Val, EiC_GI(e1));
1966 EiC_exchtype(t_int,e1->Type);
1969 EiC_generate(&e1->Code, rvalshort, &e1->Val, EiC_GI(e1));
1970 EiC_exchtype(t_int,e1->Type);
1973 EiC_generate(&e1->Code, rvalushort, &e1->Val, EiC_GI(e1));
1974 EiC_exchtype(t_int,e1->Type);
1978 /*EiC_addRval(&e1->Code, rvalint, &e1->Val, EiC_GI(e1));*/
1979 EiC_generate(&e1->Code, rvalint, &e1->Val, EiC_GI(e1));
1982 CASE_ULONG:EiC_generate(&e1->Code, rvallong, &e1->Val, EiC_GI(e1));
1986 EiC_generate(&e1->Code, rvalllong, &e1->Val, EiC_GI(e1)); break;
1989 EiC_generate(&e1->Code, rvalfloat, &e1->Val,EiC_GI(e1));
1990 EiC_exchtype(t_double,e1->Type);
1994 EiC_generate(&e1->Code, rvaldouble, &e1->Val,EiC_GI(e1));
1998 if (e1->Sym->val.vfunc != 0) {
1999 v.vfunc = e1->Sym->val.vfunc;
2000 EiC_generate(&e1->Code, pushptr, &v, 0);
2001 e1->Type = EiC_addtype(t_pointer, e1->Type);
2003 EiC_error("No link to builtin function");
2006 EiC_exchtype(t_func, e1->Type);
2009 EiC_generate(&e1->Code, pushptr, &v, 0);
2010 e1->Type = EiC_addtype(t_pointer, e1->Type);
2016 EiC_exchtype(t_pointer, e1->Type);
2018 if(issafe(e1->Type))
2019 EiC_generate(&e1->Code, rvalptr, &e1->Val, EiC_GI(e1));
2021 EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1));
2026 EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1));
2031 e1->Type = EiC_succType(e1->Type);
2032 switch (EiC_gettype(e1->Type)) {
2034 EiC_generate(&e1->Code, drefuchar, &e1->Val, 0);
2037 EiC_generate(&e1->Code, drefchar, &e1->Val, 0);
2040 EiC_generate(&e1->Code, drefshort, &e1->Val, 0);
2043 EiC_generate(&e1->Code, drefushort, &e1->Val, 0);
2046 EiC_generate(&e1->Code, drefint, &e1->Val, 0);
2049 EiC_generate(&e1->Code, drefuint, &e1->Val, 0);
2051 CASE_LONG:EiC_generate(&e1->Code, dreflong, &e1->Val, 0);
2053 CASE_ULONG:EiC_generate(&e1->Code, drefulong, &e1->Val, 0);
2055 case t_llong:EiC_generate(&e1->Code, drefllong, &e1->Val, 0);
2058 EiC_generate(&e1->Code, dreffloat, &e1->Val, 0);
2061 EiC_generate(&e1->Code, drefdouble, &e1->Val, 0);
2068 if(issafe(e1->Type))
2069 EiC_generate(&e1->Code, drefptr, &e1->Val, EiC_GI(e1));
2071 EiC_generate(&e1->Code, drefuptr, &e1->Val, EiC_GI(e1));
2076 e1->Type = EiC_succType(e1->Type);
2077 if(EiC_gettype(nextType(e1->Type)) == t_void)
2078 EiC_generate(&e1->Code, eiccall, &e1->Val, 0);
2080 EiC_generate(&e1->Code, eiccall, &e1->Val, 1);
2083 if(EiC_gettype(nextType(e1->Type)) == t_void)
2084 EiC_generate(&e1->Code, call, &e1->Val, 0);
2086 EiC_generate(&e1->Code, call, &e1->Val, 1);
2087 e1->Type = EiC_succType(e1->Type);
2090 EiC_error("Illegal lvalue");
2098 EiC_error("Undeclared identifier %s",e1->Sym->id);
2102 EiC_error("Unknown type through output");
2109 void EiC_do_inc_dec(token_t * e1, int op)
2114 switch (EiC_gettype(e1->Type)) {
2116 t = EiC_gettype(e1->Type);
2123 EiC_exchtype(t,e1->Type);
2126 t = EiC_gettype(e1->Type);
2133 EiC_exchtype(t,e1->Type);
2162 v.ival = EiC_get_sizeof(nextType(e1->Type));
2170 EiC_generate(&e1->Code, dupval, &v, 0);
2172 EiC_do_inc_dec(e1, op);
2174 /*EiC_generate(&e1->Code, bump, &v, 0);*/
2175 e1->Type = EiC_addtype(t_lval, e1->Type);
2179 t = EiC_gettype(e1->Type);
2186 EiC_exchtype(t,e1->Type);
2190 EiC_error("Cannot apply inc\\dec");
2193 EiC_generate(&e1->Code, op, &v, 0);
2196 void EiC_do_stooutput(token_t * e1)
2199 if (e1->Pflag == 0) {
2200 switch (EiC_gettype(e1->Type)) {
2203 EiC_generate(&e1->Code, stochar, &e1->Val, EiC_GI(e1));
2207 EiC_generate(&e1->Code, stoshort, &e1->Val, EiC_GI(e1));
2211 EiC_generate(&e1->Code, stoint, &e1->Val, EiC_GI(e1));
2214 CASE_ULONG:EiC_generate(&e1->Code, stolong, &e1->Val, EiC_GI(e1));
2216 case t_llong:EiC_generate(&e1->Code, stollong, &e1->Val, EiC_GI(e1));
2220 EiC_generate(&e1->Code, stofloat, &e1->Val, EiC_GI(e1));
2223 EiC_generate(&e1->Code, stodouble, &e1->Val, EiC_GI(e1));
2226 if(issafe(e1->Type))
2227 EiC_generate(&e1->Code, stoptr, &e1->Val, EiC_GI(e1));
2229 EiC_generate(&e1->Code, stouptr, &e1->Val, EiC_GI(e1));
2234 v.ival = EiC_get_sizeof(e1->Type);
2236 EiC_generate(&e1->Code, refmem, &v, 0);
2240 e1->Type = EiC_succType(e1->Type);
2241 if(isconst(e1->Type) || isconstp(e1->Type))
2242 EiC_error("Illegal assignment operation");
2243 switch (EiC_gettype(e1->Type)) {
2246 EiC_generate(&e1->Code, refchar, &e1->Val, 0);
2250 EiC_generate(&e1->Code, refshort, &e1->Val, 0);
2254 EiC_generate(&e1->Code, refint, &e1->Val, 0);
2256 CASE_LONG:EiC_generate(&e1->Code, reflong, &e1->Val, 0);
2258 CASE_ULONG:EiC_generate(&e1->Code, refulong, &e1->Val, 0);
2261 EiC_generate(&e1->Code, refllong, &e1->Val, 0);
2264 EiC_generate(&e1->Code, reffloat, &e1->Val, 0);
2267 EiC_generate(&e1->Code, refdouble, &e1->Val, 0);
2270 if(issafe(e1->Type))
2271 EiC_generate(&e1->Code, refptr, &e1->Val, EiC_GI(e1));
2273 EiC_generate(&e1->Code, refuptr, &e1->Val, EiC_GI(e1));
2278 v.ival = EiC_get_sizeof(e1->Type);
2279 EiC_generate(&e1->Code, refmem, &v, 0);
2283 EiC_error("Illegal lvalue");
2288 EiC_error(" Invalid assignment");
2295 void binhconst(unsigned opr, token_t * e1, token_t * e2)
2297 void (*f) (unsigned, token_t *, token_t *);
2300 if(!e1->Pflag && isconst(e1->Type) && isconst(e2->Type)) {
2304 do_binaryop(e1, e2, opr);
2310 * Now perform usual arithmetic conversion
2311 * i.e promote to larger type.
2314 if(EiC_gettype(e1->Type) < EiC_gettype(e2->Type))
2315 t = EiC_gettype(e2->Type);
2317 t = EiC_gettype(e1->Type);
2320 CASE_INT: f = binhint; break;
2321 CASE_UINT: f = binhuint; break;
2322 CASE_LONG: f = binhlong; break;
2323 CASE_ULONG: f = binhulong; break;
2324 CASE_FLOAT: f = binhdouble; break;
2325 case t_llong: f = binhllong; break;
2332 EiC_error("Unknown type in binhconst");