Mercurial > hg > CbC > old > device
changeset 458:0bc9f3273aa7
*** empty log message ***
author | kono |
---|---|
date | Wed, 01 Dec 2004 23:14:50 +0900 |
parents | a7d76928e3c1 |
children | 9fc266d4010f |
files | Changes mc-code-arm.c mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-codegen.c mc-parse.c mc-switch.c |
diffstat | 8 files changed, 36 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Dec 01 22:04:36 2004 +0900 +++ b/Changes Wed Dec 01 23:14:50 2004 +0900 @@ -6970,3 +6970,18 @@ static で used っていう属性がないとちょっとまずい。compiler warning だすべきだし。 + +switch(5) みたいな場合をone pathで取り扱うのは、ちょっと面倒。 + switch(5) + for() { + default: ... + case 3: ... + case 5: ... + case 7: ... + } +みたいな場合があるわけだよね。しかも、default があるかどうか +は、switch の場合ではわからないし。cslist をチェックすればわ +かるか。でも、default code を取り除けるかどうかは、default +を見つけた時点ではわかりえない。 + +pexpr では、もっと詳しい情報が得られるので、より簡単になる。
--- a/mc-code-arm.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-code-arm.c Wed Dec 01 23:14:50 2004 +0900 @@ -3123,7 +3123,7 @@ int code_csvalue() { - return creg; + return glist2(REGISTER,creg); } void
--- a/mc-code-ia32.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-code-ia32.c Wed Dec 01 23:14:50 2004 +0900 @@ -1733,7 +1733,7 @@ int code_csvalue() { - return rname[creg]; /* for switch value */ + return glist2(REGISTER,rname[creg]); /* for switch value */ } void
--- a/mc-code-mips.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-code-mips.c Wed Dec 01 23:14:50 2004 +0900 @@ -2671,7 +2671,7 @@ int code_csvalue() { - return creg; + return glist2(REGISTER,creg); } void
--- a/mc-code-powerpc.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-code-powerpc.c Wed Dec 01 23:14:50 2004 +0900 @@ -2591,7 +2591,7 @@ int code_csvalue() { - return creg; + return glist2(REGISTER,creg); } void
--- a/mc-codegen.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-codegen.c Wed Dec 01 23:14:50 2004 +0900 @@ -2317,8 +2317,20 @@ extern void cmpdimm(int e, int csreg,int label,int cond) { - if (!chk) - code_cmpdimm(e, csreg,label,cond); + if (!chk) { + if (car(csreg)==CONST) { + switch(cond) { + case 1: case 0: + if (cond ^ (cadr(csreg)==e)) gen_jmp(label); + break; + case LT: + if ((cadr(csreg)>e)) gen_jmp(label); + break; + } + } else if (car(csreg)==REGISTER) { + code_cmpdimm(e, cadr(csreg),label,cond); + } else error(-1); + } } extern int
--- a/mc-parse.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-parse.c Wed Dec 01 23:14:50 2004 +0900 @@ -2176,6 +2176,7 @@ if(dlabel) def_label(cslabel,dlabel); else fwddef(cslabel); #endif + free_glist2(csvalue1); } csvalue1=svalue; cslabel=scase;
--- a/mc-switch.c Wed Dec 01 22:04:36 2004 +0900 +++ b/mc-switch.c Wed Dec 01 23:14:50 2004 +0900 @@ -200,7 +200,8 @@ count,delta,max,min); l = fwdlabel(); - code_table_jump(l,csvalue1,delta,max,min,dlabel); + if (car(csvalue1)!=REGISTER) error(-1); + code_table_jump(l,cadr(csvalue1),delta,max,min,dlabel); control=0; code_table_open(l); i = min;