# HG changeset patch # User kono # Date 1099475451 -32400 # Node ID 6927ec51c1d7d9ccb8658dd72eba2f750e311b53 # Parent b9566a04b6e2de1c251c4a1feaec0279fb77e93f Struct division in Parallel Assignment diff -r b9566a04b6e2 -r 6927ec51c1d7 .gdbinit --- a/.gdbinit Wed Nov 03 13:28:09 2004 +0900 +++ b/.gdbinit Wed Nov 03 18:50:51 2004 +0900 @@ -1,5 +1,5 @@ tb main -run -s test/bitfield.c +run -s test/arg.c # run -s mc-parse.c # run -s mc-codegen.c # run -s nkf203/nkf.c diff -r b9566a04b6e2 -r 6927ec51c1d7 Changes --- a/Changes Wed Nov 03 13:28:09 2004 +0900 +++ b/Changes Wed Nov 03 18:50:51 2004 +0900 @@ -6406,3 +6406,12 @@ らしいのだが、他のmips/powerpc では、そういうことは起きない。 なんでだろう? +Wed Nov 3 18:31:28 JST 2004 + +やっぱり構造体をint単位に分解すると並列代入は良くなるね。し +かし、それだと、巨大な構造体ではコンパイル時間がかかりすぎる +のと、コードがでかくなってしまう。 + +並列代入も、もう少し考えるべきだな。 + +(MIPSが、このコードだとうまく動かないみたいだね...) diff -r b9566a04b6e2 -r 6927ec51c1d7 mc-code-arm.c --- a/mc-code-arm.c Wed Nov 03 13:28:09 2004 +0900 +++ b/mc-code-arm.c Wed Nov 03 18:50:51 2004 +0900 @@ -565,7 +565,7 @@ void code_gexpr(int e){ if (is_int_reg(creg) && creg!=ireg) error(-1); - register_usage("code_gexpr"); +// register_usage("code_gexpr"); } diff -r b9566a04b6e2 -r 6927ec51c1d7 mc-codegen.c --- a/mc-codegen.c Wed Nov 03 13:28:09 2004 +0900 +++ b/mc-codegen.c Wed Nov 03 18:50:51 2004 +0900 @@ -1099,6 +1099,8 @@ return 0; } +#define ASSIGN_STRUCT_DIVIDE 40 + static void jump(int e1, int env) { @@ -1169,16 +1171,51 @@ /* we should check size also (but currently useless) */ remove0(&target,t0); /* still we keep source to avoid overwrite */ + if(is_memory(s0)) { + source=list3(s0,source,sz); + continue; + } } } if(is_memory(s0)) { + if (sz>8 && car(s0)==LVAR && car(t0)==LVAR + &&sz