comparison mc-codegen.c @ 368:be56772ab12a global-offset

global offset, parallel_rassign fix, save_stack fix.
author kono
date Wed, 07 Jul 2004 23:43:19 +0900
parents 4efbb07f556b
children cd2c80d8cf8b
comparison
equal deleted inserted replaced
367:4efbb07f556b 368:be56772ab12a
797 // target = list3(target_regnum,next,source_regnum); 797 // target = list3(target_regnum,next,source_regnum);
798 798
799 extern void 799 extern void
800 parallel_rassign(int assigns) 800 parallel_rassign(int assigns)
801 { 801 {
802 int free,tmp,tmp_target,remains,t0,t2,src; 802 int free,tmp,remains,t0,t2,src;
803 tmp = 0; 803 tmp = 0;
804 for(;;) { 804 for(;;) {
805 remains = 0; 805 remains = 0;
806 // find free target 806 // find free target
807 for(free=assigns;free;free=cadr(free)) { 807 for(free=assigns;free;free=cadr(free)) {
815 if (src==0) { 815 if (src==0) {
816 break; // free is a free target 816 break; // free is a free target
817 } 817 }
818 } 818 }
819 if (remains==0) { 819 if (remains==0) {
820 if (tmp) { 820 return;
821 code_rlvar(tmp,tmp_target); 821 }
822 if (free) { // free target
823 if (t0!=caddr(free)) {
824 if (caddr(free)>=0) {
825 code_assign_register(t0,0,caddr(free));
826 } else {
827 code_rlvar(caddr(free),t0);
828 }
822 } 829 }
823 return; 830 caddr(free)=0; // mark it done
824 }
825 if (free) { // free target
826 if (t0!=caddr(free))
827 code_assign_register(t0,0,caddr(free));
828 } else { // no free target 831 } else { // no free target
829 for(free=assigns;free;free=cadr(free)) { 832 for(free=assigns;free;free=cadr(free)) {
830 if (caddr(free)) break; // not yet done 833 if (caddr(free)) break; // not yet done
831 } 834 }
832 if (!free) error(-1); 835 if (!free) error(-1);
833 tmp = new_lvar(size_of_int); 836 tmp = new_lvar(size_of_int);
834 tmp_target = car(free); 837 if (tmp>0) error(-1);
835 code_assign_lvar(tmp,caddr(free),0); 838 code_assign_lvar(tmp,caddr(free),0);
836 } 839 caddr(free) = tmp;
837 caddr(free)=0; // mark it done 840 }
838 } 841 }
839 } 842 }
840 843
841 /* goto arguments list */ 844 /* goto arguments list */
842 /* target list4(list2(tag,disp),cdr,ty,source_expr) */ 845 /* target list4(list2(tag,disp),cdr,ty,source_expr) */