Mercurial > hg > CbC > old > device
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 */ |