Mercurial > hg > CbC > old > device
diff mc-codegen.c @ 133:7d436c08e949
separate float / double flow
author | kono |
---|---|
date | Fri, 02 May 2003 14:26:54 +0900 |
parents | 07eb1249f07a |
children | 4cfd24d1b929 |
line wrap: on
line diff
--- a/mc-codegen.c Fri Apr 11 14:04:40 2003 +0900 +++ b/mc-codegen.c Fri May 02 14:26:54 2003 +0900 @@ -80,7 +80,7 @@ int g_expr0(int e1) { - int e2,e3,t; + int e2,e3,t,d; NMTBL *n; e2 = cadr(e1); @@ -130,6 +130,9 @@ case DCONST: code_dconst(e1,freg); return DOUBLE; + case FCONST: + code_fconst(e1,freg); + return FLOAT; case STRING: code_string(e1,creg); return ADDRESS; @@ -155,21 +158,22 @@ case DMINUS: g_expr0(e2); code_dneg(freg); return DOUBLE; + case FMINUS: + g_expr0(e2); code_fneg(freg); + return FLOAT; case CONV: g_expr0(e2); switch(caddr(e1)) { - case I2D: - code_i2d(creg,freg); - return DOUBLE; - case D2I: - code_d2i(freg,creg); - return INT; - case U2D: - code_u2d(creg,freg); - return DOUBLE; - case D2U: - code_d2u(freg,creg); - return UNSIGNED; + case I2D: code_i2d(creg,freg); return DOUBLE; + case D2I: code_d2i(freg,creg); return INT; + case U2D: code_u2d(creg,freg); return DOUBLE; + case F2U: code_f2u(freg,creg); return UNSIGNED; + case I2F: code_i2f(creg,freg); return FLOAT; + case F2I: code_f2i(freg,creg); return INT; + case U2F: code_u2f(creg,freg); return FLOAT; + case D2U: code_d2u(freg,creg); return UNSIGNED; + case D2F: code_d2f(freg); return FLOAT; + case F2D: code_f2d(freg); return DOUBLE; default: error(-1); return INT; } @@ -220,8 +224,13 @@ case DMUL: case DDIV: case DADD: case DSUB: case DCMP: case DCMPGE: - dmachinop(e1); + dmachinop(e1,1); return DOUBLE; + case FMUL: case FDIV: + case FADD: case FSUB: + case FCMP: case FCMPGE: + dmachinop(e1,0); + return FLOAT; case COND: e2=fwdlabel(); b_expr(cadr(e1),0,e2,0); @@ -236,14 +245,16 @@ fwddef(e3); return t; case DCOND: + case FCOND: + d = car(e1)==DCOND?DOUBLE:FLOAT; e2=fwdlabel(); b_expr(cadr(e1),0,e2,0); - code_set_fixed_creg(0,DOUBLE); + code_set_fixed_creg(0,d); t = g_expr0(caddr(e1)); code_set_fixed_creg(1,t); jmp(e3=fwdlabel()); fwddef(e2); - code_set_fixed_creg(0,DOUBLE); + code_set_fixed_creg(0,d); t = g_expr0(cadddr(e1)); code_set_fixed_creg(1,t); fwddef(e3); @@ -877,7 +888,7 @@ } void -dmachinop(int e1) +dmachinop(int e1,int d) { int e2,e3,op; @@ -885,15 +896,14 @@ op = car(e1); e3 = caddr(e1); g_expr(e3); - emit_dpush(); + emit_dpush(d); g_expr(e2); - dtosop(car(e1),(e2=emit_dpop(1))); + dtosop(car(e1),(e2=emit_dpop(d))); emit_dpop_free(e2); fregv[freg]=1; return; } - void sassign(int e1) { @@ -1051,7 +1061,8 @@ d = (car(e1)==LASS)?2:(car(e1)==DASS)?1:0; if (!use && ( (e5==DREGISTER) || - (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST)) + (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST))|| + (car(e2)==DREGISTER&&(e5==FRGVAR||e5==FRLVAR||e5==FCONST)) )) { dassign_opt(e5,e2,e4,d); return; @@ -1118,7 +1129,7 @@ op = cadddr(e1); g_expr(e3); - emit_dpush(); + emit_dpush(d); g_expr(e2); code_dassop(op,d); regv[creg]=1; @@ -1240,13 +1251,14 @@ case LSHIFT: case ULSHIFT: case RSHIFT: case URSHIFT: case ADD: case SUB: case BAND: case EOR: case BOR: case CMP: case DMUL: case DDIV: case DADD: case DSUB: case DCMP: case DCMPGE: + case FMUL: case FDIV: case FADD: case FSUB: case FCMP: case FCMPGE: case SASS: case ASS: case CASS: case FASS: case DASS: case LASS: case ASSOP: case CASSOP: case DASSOP: case FASSOP: case COMMA: if (contains(cadr(e),type)) return 1; e = caddr(e); continue; /* tarary operators */ - case COND: + case COND: case DCOND: case FCOND: if (contains(cadr(e), type)) return 1; if (contains(caddr(e),type)) return 1; e = cadddr(e);