# HG changeset patch # User kono # Date 1088315781 -32400 # Node ID b7f07df0c0f84953a2cdcd65bc80d2501e78f1f8 # Parent 11f8f2e6bb725786029012be475ee512829e6d25 fix parallel assigment bug diff -r 11f8f2e6bb72 -r b7f07df0c0f8 Changes --- a/Changes Sun Jun 27 10:39:18 2004 +0900 +++ b/Changes Sun Jun 27 14:56:21 2004 +0900 @@ -5219,4 +5219,13 @@ hash は別関数になってないし。 - +Sun Jun 27 10:58:04 JST 2004 + +大した変更してないけど、ia32 code がバグった。 + +Sun Jun 27 14:52:59 JST 2004 + +is_memory のバグでした。 + +そういえば、double register pair のparallel assignmentって +やってる? diff -r 11f8f2e6bb72 -r b7f07df0c0f8 mc-codegen.c --- a/mc-codegen.c Sun Jun 27 10:39:18 2004 +0900 +++ b/mc-codegen.c Sun Jun 27 14:56:21 2004 +0900 @@ -833,24 +833,33 @@ /* source (after) list2(tag,disp) */ /* source list list3(e,cdr,sz) */ -#define DEBUG_PARALLEL_ASSIGN 0 +#define DEBUG_PARALLEL_ASSIGN 2 static int -overrap(int t,int sz,int source) +overlap(int t,int sz,int source) { int s,s0,s1; int t0=cadr(t); int t1=t0+sz; for(;source;source=cadr(source)) { s=car(source); s0=cadr(s); - if(car(s)==REGISTER && car(t)==REGISTER) { - if(s0==t0) return s; - } else if (is_same_type(s,t)) { + switch(car(s)) { + // double register pair? + case REGISTER: + if(car(t)==REGISTER && s0==t0) return s; + case DREGISTER: + if(car(t)==DREGISTER && s0==t0) return s; + case FREGISTER: + if(car(t)==FREGISTER && s0==t0) return s; + case LREGISTER: + if(car(t)==LREGISTER && s0==t0) return s; + } + if (is_same_type(s,t)) { s1=s0+caddr(source); #if DEBUG_PARALLEL_ASSIGN>1 -printf("# ovedrrap source %d t0 %d t1 %d\n",car(car(t)),t0,t1); -printf("# ovedrrap target %d s0 %d s1 %d\n",car(car(source)),s0,s1); -printf("# ovedrrap equal = %d\n",((t0<=s0&&s0