Mercurial > hg > CbC > old > device
changeset 388:245c6033683d
*** empty log message ***
author | kono |
---|---|
date | Tue, 24 Aug 2004 15:10:16 +0900 |
parents | dc50ca364922 |
children | 68fb244e0e3c |
files | Changes mc-code-arm.c mc-code-mips.c mc-codegen.c |
diffstat | 4 files changed, 56 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sat Jul 31 01:03:04 2004 +0900 +++ b/Changes Tue Aug 24 15:10:16 2004 +0900 @@ -5926,3 +5926,17 @@ まぁ、でも、なんとなく戻って来たか。 ぼろぼろだなぁ。論文も書かなきゃいけないのに。 + +Thu Aug 12 14:15:40 JST 2004 + +ちょっと間あいたね。ARMも、もう少しだけど、c2cbc の方を先に +しないと。C++ からの変換はどうする? cfront って動くのかな? + +(あんな論文書いちゃって...) + +Mon Aug 16 17:27:17 JST 2004 + +COND は、できるだけ CREG_REGISTER を使うようにしたけど、 +アドホックだね。(まぁねぇ) + +CONDのテストが入ってないなぁ。
--- a/mc-code-arm.c Sat Jul 31 01:03:04 2004 +0900 +++ b/mc-code-arm.c Tue Aug 24 15:10:16 2004 +0900 @@ -224,7 +224,8 @@ #define dsuffix(d) (d?'d':'s') -#define use_float(d,reg) if (reg==USE_CREG) arch_mode&UseFPP?use_float0():(reg=d?use_double0():use_float0()) +#define use_float(d,reg) if (reg==USE_CREG) { reg=(arch_mode&UseFPP)?use_float0():(d?use_double0():use_float0());} + static int use_float0() { int i = creg; @@ -3187,7 +3188,20 @@ int code_get_fixed_creg(int reg,int type) { - return creg; + switch(type) { + case DOUBLE: use_float(1,reg); break; + case FLOAT: use_float(0,reg); break; + case LONGLONG: case ULONGLONG: use_longlong(reg); break; + default: + if (reg==USE_CREG) { + if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) { + return CREG_REGISTER; + } + } + use_int(reg); + break; + } + return reg; } void @@ -4142,7 +4156,7 @@ int edx,edx0=-1; int reg0=reg; - xreg = d?emit_pop(0):emit_lpop(0); /* pop e3 value */ + xreg = d?emit_lpop(0):emit_pop(0); /* pop e3 value */ if (!is_int_reg(creg)) error(-1); edx = ireg; emit_push(); @@ -4217,7 +4231,7 @@ if (!(arch_mode&UseFPP)) code_dassop_d(op,reg,d); else - code_dassop_d(op,reg,d); + code_dassop_f(op,reg,d); } void @@ -4408,7 +4422,7 @@ char *grn; int dir=caddr(e1); - if (car(e2)==DREGISTER) { + if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=register_name(cadr(e2)); grn=fregister_name(g=code_dload_1(d)); if (reg==USE_CREG) { @@ -4452,7 +4466,7 @@ char *grn; int dir=caddr(e1); - if (car(e2)==DREGISTER) { + if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=register_name(cadr(e2)); grn=fregister_name(g=code_dload_1(d)); if (reg==USE_CREG) {
--- a/mc-code-mips.c Sat Jul 31 01:03:04 2004 +0900 +++ b/mc-code-mips.c Tue Aug 24 15:10:16 2004 +0900 @@ -3158,7 +3158,20 @@ int code_get_fixed_creg(int reg,int type) { - return creg; + switch(type) { + case DOUBLE: use_float(1,reg); break; + case FLOAT: use_float(0,reg); break; + case LONGLONG: case ULONGLONG: use_longlong(reg); break; + default: + if (reg==USE_CREG) { + if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) { + return CREG_REGISTER; + } + } + use_int(reg); + break; + } + return reg; } void
--- a/mc-codegen.c Sat Jul 31 01:03:04 2004 +0900 +++ b/mc-codegen.c Tue Aug 24 15:10:16 2004 +0900 @@ -422,7 +422,7 @@ if (caddr(e1)) { b_expr(cadr(e1),0,e2,0); g_expr0(caddr(e1)); - } else { + } else { // gcc extenstion a?:DEF bexpr(cadr(e1),0,e2); // value used } t = code_get_fixed_creg(USE_CREG,d); @@ -1879,9 +1879,12 @@ cond(int t,int e1,int e2,int e3) { if(car(e1)==CONST) { - if(cadr(e1)) {type=t;return e2;} else return e3; + if(cadr(e1)) {type=t;return e2?e2:e1;} else return e3; } #if FLOAT_CODE + if(car(e1)==DCONST) { + if(dcadr(e1)) {type=t;return e2?e2:e1;} else return e3; + } if(type==DOUBLE||t==DOUBLE) { e3=double_value(e3); type = t; if (e2) e2=double_value(e2); @@ -1894,6 +1897,9 @@ } #endif #if LONGLONG_CODE + if(car(e1)==LCONST) { + if(lcadr(e1)) {type=t;return e2?e2:e1;} else return e3; + } if(type==LONGLONG||t==LONGLONG) { e3=longlong_value(e3); type = t; if (e2) e2=longlong_value(e2);