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;