Mercurial > hg > CbC > old > device
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) */ |