Mercurial > hg > CbC > old > device
diff mc-codegen.c @ 81:f94ca1168520
float first try...
author | kono |
---|---|
date | Mon, 03 Mar 2003 20:59:51 +0900 |
parents | 83d901658ce9 |
children | 25654dc29ecc |
line wrap: on
line diff
--- a/mc-codegen.c Mon Mar 03 05:41:10 2003 +0900 +++ b/mc-codegen.c Mon Mar 03 20:59:51 2003 +0900 @@ -10,6 +10,8 @@ int dreg; /* temporary register */ int reg_sp; /* REGister Stack-Pointer */ +int freg; /* current floating point register */ + /* creg currrent virtual register dreg spare virtual register @@ -275,6 +277,22 @@ code_crlvar(lvar(e2)); regv[creg]=1; return; + case FRLVAR: + code_frlvar(lvar(e2)); + regv[creg]=1; + return; + case FRGVAR: + code_frgvar(lvar(e2)); + regv[creg]=1; + return; + case DRLVAR: + code_drlvar(lvar(e2)); + regv[creg]=1; + return; + case DRGVAR: + code_drgvar(lvar(e2)); + regv[creg]=1; + return; case FNAME: code_fname(((NMTBL *)(e2))->nm); regv[creg]=1; @@ -283,6 +301,10 @@ code_const(e2); regv[creg]=1; return; + case DCONST: + code_dconst(e2); + regv[creg]=1; + return; case STRING: string(e1); regv[creg]=1; @@ -297,7 +319,8 @@ case INDIRECT: g_expr(e2); return; - case RINDIRECT: case CRINDIRECT: + case RINDIRECT: case CRINDIRECT: + case DRINDIRECT: case FRINDIRECT: rindirect(e1); return; case ADDRESS: @@ -307,6 +330,10 @@ g_expr(e2); code_neg(); return; + case DMINUS: + g_expr(e2); + code_dneg(); + return; case BNOT: /* ~ */ g_expr(e2); code_not(); @@ -341,6 +368,10 @@ case ADD: case SUB: case BAND: case EOR: case BOR: machinop(e1); return; + case DMUL: case DDIV: + case DADD: case DSUB: + dmachinop(e1); + return; case COND: e2=fwdlabel(); b_expr(cadr(e1),0,e2,0); @@ -358,12 +389,18 @@ case SASS: sassign(e1); return; - case ASS: case CASS: + case ASS: case CASS: case FASS: assign(e1); return; + case DASS: case LASS: + dassign(e1); + return; case ASSOP: case CASSOP: assop(e1); return; + case DASSOP: case FASSOP: + dassop(e1); + return; case RSTRUCT: g_expr(e2); return; @@ -461,6 +498,14 @@ code_cmp_rlvar(lvar(e2)); jcond(l1,cond); return; + case DRLVAR: + code_cmp_drlvar(lvar(e2)); + jcond(l1,cond); + return; + case DRGVAR: + code_cmp_drgvar(lvar(e2)); + jcond(l1,cond); + return; case REGISTER: code_cmp_register(e2); jcond(l1,cond); @@ -468,9 +513,13 @@ case CONST: if((cond&&e2)||(!cond&&!e2)) jmp(l1); return; + case DCONST: + if((dcadr(e2)!=0.0)^cond) jmp(l1); + return; default: + /* type ? */ if(err) { - error(-1); return; /* recursice g_expr/b_expr */ + error(-1); return; /* recursive g_expr/b_expr */ } g_expr(e1); code_cmp_register(creg); @@ -636,7 +685,8 @@ { return ( e1==CONST || e1==FNAME || e1==LVAR || e1==REGISTER || - e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR + e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR || + e1==DRLVAR || e1==FRLVAR ); } @@ -646,10 +696,10 @@ int ce1=car(e1); int ce2=car(e2); return ( - (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR)) - || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR)) - || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR)) - || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR)) + (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR||ce2==FRLVAR||ce2==DRLVAR)) + || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR||ce1==FRLVAR||ce1==DRLVAR)) + || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR||ce2==FRGVAR||ce2==DRGVAR)) + || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR||ce1==FRGVAR||ce1==DRGVAR)) ); } @@ -658,8 +708,8 @@ { int ce1=car(e1); return ( - ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR || - ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR || + ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR || ce1==DRLVAR || + ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR || ce1==DRGVAR || ce1==REGISTER ); } @@ -792,6 +842,23 @@ return; } +void +dmachinop(int e1) +{ + int e2,e3,op; + + e2 = cadr(e1); + op = car(e1); + e3 = caddr(e1); + g_expr(e3); + emit_dpush(); + g_expr(e2); + dtosop(car(e1),(e2=dpop_register())); + emit_dpop_free(e2); + regv[freg]=1; + return; +} + void sassign(int e1) @@ -827,6 +894,9 @@ int e2,e3,e4,byte; byte=(car(e1) == CASS); + if(car(e1) == FASS) { + /* move float to creg */ + } /* e2=e4 */ e2 = cadr(e1); e3 = cadr(e2); @@ -859,6 +929,34 @@ } void +dassign(int e1) +{ + int e2,e3,e4,byte; + + /* e2=e4 */ + e2 = cadr(e1); + e3 = cadr(e2); + e4 = caddr(e1); + switch(car(e2)) { + case GVAR: /* i=3 */ + g_expr(e4); + code_dassign_gvar(e2,byte); + return; + case LVAR: + g_expr(e4); + code_dassign_lvar(lvar(cadr(e2)),byte); + return; + } + g_expr(e2); + emit_dpush(); + g_expr(e4); + e2 = emit_dpop(0); + code_dassign(e2,byte); + emit_dpop_free(e2); + return; +} + +void assop(int e1) { int e2,e3,byte,op; @@ -883,6 +981,15 @@ return; } +void +dassop(int e1) +{ +} + +void +fassop(int e1) +{ +} int fwdlabel(void)