# HG changeset patch # User kono # Date 1101910490 -32400 # Node ID 0bc9f3273aa73023ae9a79cd1acc9d6d46d39970 # Parent a7d76928e3c1daf030eb6c1cd2a9e680de047d58 *** empty log message *** diff -r a7d76928e3c1 -r 0bc9f3273aa7 Changes --- 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 では、もっと詳しい情報が得られるので、より簡単になる。 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-code-arm.c --- 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 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-code-ia32.c --- 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 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-code-mips.c --- 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 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-code-powerpc.c --- 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 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-codegen.c --- 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 diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-parse.c --- 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; diff -r a7d76928e3c1 -r 0bc9f3273aa7 mc-switch.c --- 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;