Mercurial > hg > CbC > old > device
comparison mc-codegen.c @ 344:b7f07df0c0f8
fix parallel assigment bug
author | kono |
---|---|
date | Sun, 27 Jun 2004 14:56:21 +0900 |
parents | 11f8f2e6bb72 |
children | 2b3946ee4fc9 |
comparison
equal
deleted
inserted
replaced
343:11f8f2e6bb72 | 344:b7f07df0c0f8 |
---|---|
831 /* target list4(list2(tag,disp),cdr,ty,source_expr) */ | 831 /* target list4(list2(tag,disp),cdr,ty,source_expr) */ |
832 /* source expr=listn(tag,...) */ | 832 /* source expr=listn(tag,...) */ |
833 /* source (after) list2(tag,disp) */ | 833 /* source (after) list2(tag,disp) */ |
834 /* source list list3(e,cdr,sz) */ | 834 /* source list list3(e,cdr,sz) */ |
835 | 835 |
836 #define DEBUG_PARALLEL_ASSIGN 0 | 836 #define DEBUG_PARALLEL_ASSIGN 2 |
837 | 837 |
838 static int | 838 static int |
839 overrap(int t,int sz,int source) | 839 overlap(int t,int sz,int source) |
840 { | 840 { |
841 int s,s0,s1; | 841 int s,s0,s1; |
842 int t0=cadr(t); | 842 int t0=cadr(t); |
843 int t1=t0+sz; | 843 int t1=t0+sz; |
844 for(;source;source=cadr(source)) { | 844 for(;source;source=cadr(source)) { |
845 s=car(source); s0=cadr(s); | 845 s=car(source); s0=cadr(s); |
846 if(car(s)==REGISTER && car(t)==REGISTER) { | 846 switch(car(s)) { |
847 if(s0==t0) return s; | 847 // double register pair? |
848 } else if (is_same_type(s,t)) { | 848 case REGISTER: |
849 if(car(t)==REGISTER && s0==t0) return s; | |
850 case DREGISTER: | |
851 if(car(t)==DREGISTER && s0==t0) return s; | |
852 case FREGISTER: | |
853 if(car(t)==FREGISTER && s0==t0) return s; | |
854 case LREGISTER: | |
855 if(car(t)==LREGISTER && s0==t0) return s; | |
856 } | |
857 if (is_same_type(s,t)) { | |
849 s1=s0+caddr(source); | 858 s1=s0+caddr(source); |
850 #if DEBUG_PARALLEL_ASSIGN>1 | 859 #if DEBUG_PARALLEL_ASSIGN>1 |
851 printf("# ovedrrap source %d t0 %d t1 %d\n",car(car(t)),t0,t1); | 860 printf("# overlap source %d t0 %d t1 %d\n",car(car(t)),t0,t1); |
852 printf("# ovedrrap target %d s0 %d s1 %d\n",car(car(source)),s0,s1); | 861 printf("# overlap target %d s0 %d s1 %d\n",car(car(source)),s0,s1); |
853 printf("# ovedrrap equal = %d\n",((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1))); | 862 printf("# overlap equal = %d\n",((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1))); |
854 #endif | 863 #endif |
855 if((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1)) return s; | 864 if((t0<=s0&&s0<t1)||(t0<s1&&s1<=t1)) return s; |
856 } | 865 } |
857 } | 866 } |
858 return 0; | 867 return 0; |
925 #if DEBUG_PARALLEL_ASSIGN | 934 #if DEBUG_PARALLEL_ASSIGN |
926 printf("# circular dependency %d ty %d+%d sz %d\n",car(t1),ty,cadr(t1),sz); | 935 printf("# circular dependency %d ty %d+%d sz %d\n",car(t1),ty,cadr(t1),sz); |
927 #endif | 936 #endif |
928 return 1; | 937 return 1; |
929 } | 938 } |
930 if ((s1=overrap(t1,sz,*source))) { | 939 if ((s1=overlap(t1,sz,*source))) { |
931 /* another overrap start over */ | 940 /* another overlap start over */ |
932 return circular_dependency(t,s1,target,source); | 941 return circular_dependency(t,s1,target,source); |
933 } | 942 } |
934 } | 943 } |
935 target0=cadr(target0); | 944 target0=cadr(target0); |
936 } | 945 } |
951 #if DEBUG_PARALLEL_ASSIGN | 960 #if DEBUG_PARALLEL_ASSIGN |
952 printf("# remove same %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz); | 961 printf("# remove same %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz); |
953 #endif | 962 #endif |
954 remove_target(target,t,use); | 963 remove_target(target,t,use); |
955 /* 破壊されては困るので、source listからは除かない */ | 964 /* 破壊されては困るので、source listからは除かない */ |
956 } else if (!(s1=overrap(t,sz,*source))) { | 965 } else if (!(s1=overlap(t,sz,*source))) { |
957 /* 重なってないので安心して書き込める */ | 966 /* 重なってないので安心して書き込める */ |
958 #if DEBUG_PARALLEL_ASSIGN | 967 #if DEBUG_PARALLEL_ASSIGN |
959 printf("# normal assign %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz); | 968 printf("# normal assign %d ty %d+%d sz %d\n",car(t),ty,cadr(t),sz); |
960 #endif | 969 #endif |
961 g_expr_u(assign_expr0(t,s,ty,ty)); | 970 g_expr_u(assign_expr0(t,s,ty,ty)); |
1004 | 1013 |
1005 static int | 1014 static int |
1006 is_simple(int e1) | 1015 is_simple(int e1) |
1007 { | 1016 { |
1008 switch(e1) { | 1017 switch(e1) { |
1018 case CONST: case FNAME: case LVAR: case REGISTER: case DREGISTER: | |
1009 case FREGISTER: case LREGISTER: | 1019 case FREGISTER: case LREGISTER: |
1010 case GVAR: case RGVAR: case RLVAR: case CRLVAR: case CRGVAR: | 1020 case GVAR: case RGVAR: case RLVAR: case CRLVAR: case CRGVAR: |
1011 case DRLVAR: case FRLVAR: case LRLVAR: | 1021 case DRLVAR: case FRLVAR: case LRLVAR: |
1012 case CURLVAR: case SURLVAR: case CURGVAR: case SURGVAR: | 1022 case CURLVAR: case SURLVAR: case CURGVAR: case SURGVAR: |
1013 return 1; | 1023 return 1; |
1014 } | 1024 } |
1015 return 0; | 1025 return 0; |
1016 } | 1026 } |
1027 | |
1017 | 1028 |
1018 static int | 1029 static int |
1019 is_same_type(int e1,int e2) | 1030 is_same_type(int e1,int e2) |
1020 { | 1031 { |
1021 int ce1=car(e1); | 1032 int ce1=car(e1); |
1049 } | 1060 } |
1050 | 1061 |
1051 static int | 1062 static int |
1052 is_memory(int e1) | 1063 is_memory(int e1) |
1053 { | 1064 { |
1054 int ce1=car(e1); | 1065 switch(car(e1)) { |
1055 switch(car(ce1)) { | |
1056 case LVAR : case RLVAR: case CRLVAR : case DRLVAR : case LRLVAR : | 1066 case LVAR : case RLVAR: case CRLVAR : case DRLVAR : case LRLVAR : |
1057 case GVAR : case RGVAR: case CRGVAR : case DRGVAR : case LRGVAR : | 1067 case GVAR : case RGVAR: case CRGVAR : case DRGVAR : case LRGVAR : |
1058 case FRLVAR : case FRGVAR : | 1068 case FRLVAR : case FRGVAR : |
1059 case CURGVAR : case SURGVAR: case SRGVAR : | 1069 case CURGVAR : case SURGVAR: case SRGVAR : |
1060 case REGISTER : case DREGISTER : case FREGISTER : | 1070 case REGISTER : case DREGISTER : case FREGISTER : |
1061 case LREGISTER: | 1071 case LREGISTER: |
1062 return 1; | 1072 return 1; |
1063 } | 1073 } |
1064 return 0; | 1074 return 0; |
1065 } | 1075 } |
1066 | |
1067 | 1076 |
1068 static void | 1077 static void |
1069 jump(int e1, int env) | 1078 jump(int e1, int env) |
1070 { | 1079 { |
1071 int e2,e3,e4,sz,arg_size,ty,regs,fregs; | 1080 int e2,e3,e4,sz,arg_size,ty,regs,fregs; |