comparison mc-inline.c @ 527:6b0fd56848e6 inline-asm

inline continue.... asm, lvar free
author kono
date Wed, 28 Dec 2005 21:21:57 +0900
parents 9ff5cd7afe2f
children d6fff671793a
comparison
equal deleted inserted replaced
526:9ff5cd7afe2f 527:6b0fd56848e6
11 11
12 static int pvartable; 12 static int pvartable;
13 static int pdisp; 13 static int pdisp;
14 14
15 static int ret_register,ret_reg_mode; 15 static int ret_register,ret_reg_mode;
16
17 static int inline_lvars;
16 18
17 /* 19 /*
18 Basic code generator from parse tree 20 Basic code generator from parse tree
19 */ 21 */
20 22
419 static int 421 static int
420 p_lvar(int e1) 422 p_lvar(int e1)
421 { 423 {
422 int sz = is_memory(e1); 424 int sz = is_memory(e1);
423 int d = cadr(e1); 425 int d = cadr(e1);
424 int d1; 426 int d1,e;
425 if ((d1=(heap[pdisp+d]))) return d1; 427 if ((d1=(heap[pdisp+d]))) return d1;
426 return (heap[pdisp+d]=list3(LVAR,new_lvar(sz),0)); 428 e = heap[pdisp+d]=list3(LVAR,new_lvar(sz),0);
429 inline_lvars = glist2(e,inline_lvars);
430 return e;
427 } 431 }
428 432
429 static int 433 static int
430 pfunction(int e) 434 pfunction(int e)
431 { 435 {
456 return list3(car(e),pexpr(cadr(e)),caddr(e)); 460 return list3(car(e),pexpr(cadr(e)),caddr(e));
457 } 461 }
458 } 462 }
459 463
460 static int 464 static int
465 pindirect(int e)
466 {
467 int lvar;
468 if (car(lvar=cadr(e))==IVAR)
469 lvar=p_lvar(cadr(e)); // can be anything....
470 return list3(car(e),pexpr(cadr(e)),caddr(e));
471 }
472
473 static int
461 paddress(int e) 474 paddress(int e)
462 { 475 {
463 return list2(car(e),pexpr(cadr(e))); 476 return list2(car(e),pexpr(cadr(e)));
464 } 477 }
465 478
466 static int 479 static int
467 p_conv(int e1,int e2) 480 p_conv(int e1,int e2)
468 { 481 {
469 return list3(CONV,pexpr(e1),e2); 482 return list3(CONV,pexpr(e2),e1);
470 } 483 }
471 484
472 static int 485 static int
473 pbinop(int op,int e1,int e2) 486 pbinop(int op,int e1,int e2)
474 { 487 {
593 case EXTRN: case EXTRN1: case STATIC: 606 case EXTRN: case EXTRN1: case STATIC:
594 return pexpr(cadr(e)); 607 return pexpr(cadr(e));
595 default: 608 default:
596 v = list3(LVAR,new_lvar(size(n->ty)),(int)n); 609 v = list3(LVAR,new_lvar(size(n->ty)),(int)n);
597 } 610 }
611 inline_lvars = glist2(v,inline_lvars);
598 if (heap[pdisp+dsp]) error(-1); 612 if (heap[pdisp+dsp]) error(-1);
599 heap[pdisp+dsp]=v; 613 heap[pdisp+dsp]=v;
600 return pexpr(cadr(e)); 614 return pexpr(cadr(e));
601 } 615 }
602 616
805 case CODE: 819 case CODE:
806 return list2(car(e1),pexpr(e2)); 820 return list2(car(e1),pexpr(e2));
807 case INLINE: 821 case INLINE:
808 return p_inline(e1); 822 return p_inline(e1);
809 case INDIRECT: 823 case INDIRECT:
810 return prindirect(e1); 824 return pindirect(e1);
811 case RINDIRECT: case URINDIRECT: 825 case RINDIRECT: case URINDIRECT:
812 case CRINDIRECT: case CURINDIRECT: 826 case CRINDIRECT: case CURINDIRECT:
813 case SRINDIRECT: case SURINDIRECT: 827 case SRINDIRECT: case SURINDIRECT:
814 #if FLOAT_CODE 828 #if FLOAT_CODE
815 case FRINDIRECT: case DRINDIRECT: 829 case FRINDIRECT: case DRINDIRECT:
1014 int sretcont = retcont; 1028 int sretcont = retcont;
1015 int scslabel = cslabel; 1029 int scslabel = cslabel;
1016 int sdisp = pdisp; 1030 int sdisp = pdisp;
1017 int sret_register = ret_register; 1031 int sret_register = ret_register;
1018 int sret_reg_mode = ret_reg_mode; 1032 int sret_reg_mode = ret_reg_mode;
1033 int sinline_lvars = inline_lvars;
1019 1034
1020 int narg,arg; 1035 int narg,arg;
1021 NMTBL *n = (NMTBL*)cadr(cadr(e)); 1036 NMTBL *n = (NMTBL*)cadr(cadr(e));
1022 int e1 = attr_value(n,INLINE); 1037 int e1 = attr_value(n,INLINE);
1023 int parse = car(e1); // inline parse tree 1038 int parse = car(e1); // inline parse tree
1034 retcont = 0; 1049 retcont = 0;
1035 cslabel = -1; 1050 cslabel = -1;
1036 retpending = 0; 1051 retpending = 0;
1037 ret_reg_mode = 0; 1052 ret_reg_mode = 0;
1038 ret_register = 5555; 1053 ret_register = 5555;
1054 inline_lvars = 0;
1039 retlabel = fwdlabel(); 1055 retlabel = fwdlabel();
1040 1056
1041 enter_scope(); // to make label scope happy 1057 enter_scope(); // to make label scope happy
1042 1058
1043 fnptr = n; // st_return see this 1059 fnptr = n; // st_return see this
1054 e4 = car(e3); 1070 e4 = car(e3);
1055 if (0 && is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) { 1071 if (0 && is_const(e4) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) {
1056 heap[pdisp+narg]=e4; 1072 heap[pdisp+narg]=e4;
1057 } else { 1073 } else {
1058 arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0); 1074 arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0);
1075 inline_lvars = glist2(arg,inline_lvars);
1059 // should contain correct argument variable name 1076 // should contain correct argument variable name
1060 if (anptr) 1077 if (anptr)
1061 printf("## var %s\n",anptr->nm); 1078 printf("## var %s\n",anptr->nm);
1062 else 1079 else
1063 printf("## var 0\n"); 1080 printf("## var 0\n");
1080 control=1; 1097 control=1;
1081 1098
1082 if (retcont) error(STERR); // inline can't handle return/environment 1099 if (retcont) error(STERR); // inline can't handle return/environment
1083 1100
1084 leave_scope(); 1101 leave_scope();
1102 while(inline_lvars) {
1103 int e;
1104 int l = car(inline_lvars);
1105 switch(car(l)) {
1106 case LVAR: free_lvar(cadr(l)); break;
1107 case REGISTER: case DREGISTER:
1108 case FREGISTER: case LREGISTER:
1109 free_register(cadr(l));
1110 }
1111 e = cadr(inline_lvars);
1112 free_glist2(inline_lvars);
1113 inline_lvars = e;
1114 }
1085 fnptr = sfnptr; 1115 fnptr = sfnptr;
1086 retlabel = sretlabel; 1116 retlabel = sretlabel;
1087 retcont = sretcont; 1117 retcont = sretcont;
1088 cslabel = scslabel; 1118 cslabel = scslabel;
1089 ret_register = sret_register; 1119 ret_register = sret_register;
1090 ret_reg_mode = sret_reg_mode; 1120 ret_reg_mode = sret_reg_mode;
1121 inline_lvars = sinline_lvars;
1091 1122
1092 return ret_type; 1123 return ret_type;
1093 } 1124 }
1094 1125
1095 /* end */ 1126 /* end */