comparison mc-code-mips.c @ 205:a50f90d0b63a

*** empty log message ***
author kono
date Thu, 15 Apr 2004 01:01:51 +0900
parents 4c614334f3d0
children 32f54ab63b35
comparison
equal deleted inserted replaced
204:4c614334f3d0 205:a50f90d0b63a
99 99
100 #define CREG_REGISTER MAX_TMP_REG 100 #define CREG_REGISTER MAX_TMP_REG
101 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET) 101 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
102 #define DREG_DREGISTER (2+DREG_OFFSET) 102 #define DREG_DREGISTER (2+DREG_OFFSET)
103 103
104 int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER]; 104 static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER];
105 int powerpc_regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_DREGISTER]; 105
106 106 static int dreg_pair0[REAL_MAX_DREGISTER] = {
107 int dreg_pair0[REAL_MAX_DREGISTER] = {
108 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 107 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
109 }; 108 };
110 int dreg_pair1[REAL_MAX_DREGISTER] = { 109 static int dreg_pair1[REAL_MAX_DREGISTER] = {
111 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 110 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
112 }; 111 };
113 112
114 int *regv = powerpc_regv; 113 static int *regs = powerpc_regs;
115 int *regs = powerpc_regs;
116 114
117 static int max_reg_var, max_freg_var; 115 static int max_reg_var, max_freg_var;
118 static int cond_reg=-1,cond_freg=-1,cond_dreg=-1;
119 116
120 static char *reg_name[] = { 117 static char *reg_name[] = {
121 "$0","$1","$2","$3","$4","$5","$6","$7","$8","$9", 118 "$0","$1","$2","$3","$4","$5","$6","$7","$8","$9",
122 "$10","$11","$12","$13","$14","$15","$16","$17","$18","$19", 119 "$10","$11","$12","$13","$14","$15","$16","$17","$18","$19",
123 "$20","$21","$22","$23","$24","$25","$26","$27","$28","$29", 120 "$20","$21","$22","$23","$24","$25","$26","$27","$28","$29",
319 } 316 }
320 317
321 void 318 void
322 code_lvar(int e2,int creg) { 319 code_lvar(int e2,int creg) {
323 lvar_address(e2,creg); 320 lvar_address(e2,creg);
324 regv[creg]=1;
325 } 321 }
326 322
327 void 323 void
328 code_init(void) 324 code_init(void)
329 { 325 {
330 /* this is called once program call */ 326 /* this is called once program call */
331 } 327 }
332 328
333 void 329 void
334 gexpr_code_init(void){ 330 gexpr_code_init(void){
335 regv[creg]=0;
336 regv[freg]=0;
337 } 331 }
338 332
339 void 333 void
340 code_gexpr(int e){ 334 code_gexpr(int e){
341 if (is_int_reg(creg) && creg!=ireg) error(-1); 335 if (is_int_reg(creg) && creg!=ireg) error(-1);
359 type = n->ty; 353 type = n->ty;
360 if (scalar(type)) { 354 if (scalar(type)) {
361 if ((reg = get_input_register_var(reg_var,n,is_code0))) { 355 if ((reg = get_input_register_var(reg_var,n,is_code0))) {
362 n->sc = REGISTER; 356 n->sc = REGISTER;
363 n->dsp = cadr(reg); 357 n->dsp = cadr(reg);
364 regv[n->dsp]= 1;
365 regs[n->dsp]= INPUT_REG; 358 regs[n->dsp]= INPUT_REG;
366 reg_var++; 359 reg_var++;
367 cadddr(args)=size_of_int; /* why we need this? */ 360 cadddr(args)=size_of_int; /* why we need this? */
368 } 361 }
369 } else if (type==FLOAT) { 362 } else if (type==FLOAT) {
370 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) { 363 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
371 n->sc = FREGISTER; 364 n->sc = FREGISTER;
372 n->dsp = cadr(reg); 365 n->dsp = cadr(reg);
373 regv[n->dsp]= 1;
374 regs[n->dsp]= INPUT_REG; 366 regs[n->dsp]= INPUT_REG;
375 freg_var++; 367 freg_var++;
376 cadddr(args)=size(type); /* why we need this? */ 368 cadddr(args)=size(type); /* why we need this? */
377 } 369 }
378 } else if (type==DOUBLE) { 370 } else if (type==DOUBLE) {
379 if ((reg = get_input_dregister_var(reg_var,n,is_code0,1))) { 371 if ((reg = get_input_dregister_var(reg_var,n,is_code0,1))) {
380 n->sc = DREGISTER; 372 n->sc = DREGISTER;
381 n->dsp = cadr(reg); 373 n->dsp = cadr(reg);
382 regv[n->dsp]= 1;
383 regs[n->dsp]= INPUT_REG; 374 regs[n->dsp]= INPUT_REG;
384 reg_var+=2; 375 reg_var+=2;
385 cadddr(args)=size(type); /* why we need this? */ 376 cadddr(args)=size(type); /* why we need this? */
386 } 377 }
387 } 378 }
423 #endif 414 #endif
424 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) { 415 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
425 reg =REG_VAR_BASE-i; 416 reg =REG_VAR_BASE-i;
426 if (! regs[reg]) { /* 使われていないなら */ 417 if (! regs[reg]) { /* 使われていないなら */
427 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ 418 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
428 regv[reg]=0;
429 if (i>max_reg_var) max_reg_var=i; 419 if (i>max_reg_var) max_reg_var=i;
430 return reg; 420 return reg;
431 } 421 }
432 } 422 }
433 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ 423 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
510 } 500 }
511 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) { 501 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
512 reg =FREG_VAR_BASE-i+FREG_OFFSET; 502 reg =FREG_VAR_BASE-i+FREG_OFFSET;
513 if (! regs[reg]) { /* 使われていないなら */ 503 if (! regs[reg]) { /* 使われていないなら */
514 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ 504 regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */
515 regv[reg]=0;
516 if (i>max_freg_var) max_freg_var=i; 505 if (i>max_freg_var) max_freg_var=i;
517 return reg; 506 return reg;
518 } 507 }
519 } 508 }
520 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ 509 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
543 return dreg_stack[--dreg_sp]; 532 return dreg_stack[--dreg_sp];
544 } 533 }
545 #endif 534 #endif
546 535
547 #if LONGLONG_CODE 536 #if LONGLONG_CODE
537 int
538 get_lregister() {
539 return -1;
540 }
541
548 int 542 int
549 get_lregister_var(NMTBL *n) 543 get_lregister_var(NMTBL *n)
550 { 544 {
551 return list2(LVAR,new_lvar(size_of_double)); 545 return list2(LVAR,new_lvar(size_of_double));
552 } 546 }
564 free_register(int i) { /* いらなくなったレジスタを開放 */ 558 free_register(int i) { /* いらなくなったレジスタを開放 */
565 int i0,i1; 559 int i0,i1;
566 if (i<0||MAX_FREGISTER+FREG_OFFSET+REAL_MAX_DREGISTER<i) error(-1); 560 if (i<0||MAX_FREGISTER+FREG_OFFSET+REAL_MAX_DREGISTER<i) error(-1);
567 if (is_double_reg(i)) { 561 if (is_double_reg(i)) {
568 i0 = dreg_pair0[i-DREG_OFFSET]; 562 i0 = dreg_pair0[i-DREG_OFFSET];
569 regv[i0]=regs[i0]=0; 563 regs[i0]=0;
570 i1 = dreg_pair1[i-DREG_OFFSET]; 564 i1 = dreg_pair1[i-DREG_OFFSET];
571 regv[i1]=regs[i1]=0; 565 regs[i1]=0;
572 } 566 }
573 regv[i]=regs[i]=0; 567 regs[i]=0;
574 } 568 }
575 569
576 int 570 int
577 get_input_dregister_var(int i,NMTBL *n,int is_code,int d) 571 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
578 { 572 {
629 free_register_count(int d) 623 free_register_count(int d)
630 { 624 {
631 int i,count,fcount; 625 int i,count,fcount;
632 fcount = count = 0; 626 fcount = count = 0;
633 for(i=0;i<MAX_REGISTER;i++) { 627 for(i=0;i<MAX_REGISTER;i++) {
634 if (! regs[i] && ! regv[i]) count++; 628 if (! regs[i]) count++;
635 } 629 }
636 for(i=0;i<MAX_FREGISTER;i++) { 630 for(i=0;i<MAX_FREGISTER;i++) {
637 if (! regs[i+FREG_OFFSET] && ! regv[i+FREG_OFFSET]) fcount++; 631 if (! regs[i+FREG_OFFSET]) fcount++;
638 } 632 }
639 printf("# free reg %d freg %d\n",count,fcount); 633 printf("# free reg %d freg %d\n",count,fcount);
640 return d?fcount:count; 634 return d?fcount:count;
641 } 635 }
642 636
654 648
655 void 649 void
656 free_all_register(void) 650 free_all_register(void)
657 { 651 {
658 int i; 652 int i;
659 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; regv[i]=0; } 653 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; }
660 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; regv[i+FREG_OFFSET]=0; } 654 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
661 for(i=0;i<MAX_DREGISTER;i++) { regs[i+DREG_OFFSET]=0; regv[i+DREG_OFFSET]=0; } 655 for(i=0;i<MAX_DREGISTER;i++) { regs[i+DREG_OFFSET]=0; }
662 creg = get_register(); 656 creg = get_register();
663 #if FLOAT_CODE 657 #if FLOAT_CODE
664 freg = get_dregister(0); 658 freg = get_dregister(0);
665 dreg = DREG_DREGISTER; 659 dreg = DREG_DREGISTER;
666 #endif 660 #endif
684 is_float_reg(creg)?fregister_name(creg): 678 is_float_reg(creg)?fregister_name(creg):
685 is_double_reg(creg)?dregister_name0(creg):"bad", 679 is_double_reg(creg)?dregister_name0(creg):"bad",
686 register_name(ireg),fregister_name(freg),dregister_name0(dreg)); 680 register_name(ireg),fregister_name(freg),dregister_name0(dreg));
687 #if 0 681 #if 0
688 printf("\n# regs:"); 682 printf("\n# regs:");
689 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regv[i]); }
690 printf(":"); 683 printf(":");
691 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); } 684 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
692 printf("\n# freg:"); 685 printf("\n# freg:");
693 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); } 686 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
694 for(i=reg_sp;i>=0;i--) { 687 for(i=reg_sp;i>=0;i--) {
709 free_register(freg_stack[--freg_sp]); 702 free_register(freg_stack[--freg_sp]);
710 } 703 }
711 while(dreg_sp > 0) { 704 while(dreg_sp > 0) {
712 free_register(dreg_stack[--dreg_sp]); 705 free_register(dreg_stack[--dreg_sp]);
713 } 706 }
714 if (cond_freg!=-1) {
715 if(car(cond_freg)==FREGISTER) free_register(cadr(cond_freg));
716 cond_freg=-1;
717 }
718 if (cond_dreg!=-1) {
719 if(car(cond_dreg)==DREGISTER) free_register(cadr(cond_dreg));
720 cond_dreg=-1;
721 }
722 if (cond_reg!=-1) {
723 if(car(cond_reg)==REGISTER) free_register(cadr(cond_reg));
724 cond_reg=-1;
725 }
726 cmpreg = -1; 707 cmpreg = -1;
727 text_mode(); 708 text_mode();
728 gexpr_code_init(); 709 gexpr_code_init();
729 register_usage("gexpr_init"); 710 register_usage("gexpr_init");
730 } 711 }
740 dreg_sp = 0; 721 dreg_sp = 0;
741 text_mode(); 722 text_mode();
742 } 723 }
743 724
744 int 725 int
745 register_var(int r) {
746 return r;
747 }
748
749
750 int
751 get_register_var(NMTBL *n) 726 get_register_var(NMTBL *n)
752 { 727 {
753 int i; 728 int i;
754 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) { 729 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
755 if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */ 730 if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */
756 /* そのレジスタを使うことを宣言し */ 731 /* そのレジスタを使うことを宣言し */
757 regs[REG_VAR_BASE-i]=USING_REG; 732 regs[REG_VAR_BASE-i]=USING_REG;
758 regv[REG_VAR_BASE-i]=0;
759 if (i>max_reg_var) max_reg_var=i; 733 if (i>max_reg_var) max_reg_var=i;
760 /* その場所を表す番号を返す */ 734 /* その場所を表す番号を返す */
761 return list3(REGISTER,REG_VAR_BASE-i,(int)n); 735 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
762 } 736 }
763 } 737 }
776 if (d) { 750 if (d) {
777 for(i=0;i<DREG_VAR_BASE-DREG_VAR_MIN;i++) { 751 for(i=0;i<DREG_VAR_BASE-DREG_VAR_MIN;i++) {
778 if (! regs[j=(DREG_VAR_BASE-i+DREG_OFFSET)]) { /* 使われていないなら */ 752 if (! regs[j=(DREG_VAR_BASE-i+DREG_OFFSET)]) { /* 使われていないなら */
779 if (regs[dreg_pair0[j]] || regs[dreg_pair1[j]]) continue; 753 if (regs[dreg_pair0[j]] || regs[dreg_pair1[j]]) continue;
780 regs[DREG_VAR_BASE-i+DREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/ 754 regs[DREG_VAR_BASE-i+DREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/
781 regv[DREG_VAR_BASE-i+DREG_OFFSET]=0;
782 regs[dreg_pair0[j]] = regs[dreg_pair1[j]] = USING_REG; 755 regs[dreg_pair0[j]] = regs[dreg_pair1[j]] = USING_REG;
783 regv[dreg_pair0[j]] = regv[dreg_pair1[j]] = 0;
784 if (dreg_pair1[j]>max_reg_var) max_reg_var=dreg_pair1[j]; 756 if (dreg_pair1[j]>max_reg_var) max_reg_var=dreg_pair1[j];
785 /* その場所を表す番号を返す */ 757 /* その場所を表す番号を返す */
786 return list3(DREGISTER,DREG_VAR_BASE-i+DREG_OFFSET,(int)n); 758 return list3(DREGISTER,DREG_VAR_BASE-i+DREG_OFFSET,(int)n);
787 } 759 }
788 } 760 }
789 return list2(LVAR,new_lvar(size_of_double)); 761 return list2(LVAR,new_lvar(size_of_double));
790 } else { 762 } else {
791 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) { 763 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
792 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* 使われていないなら */ 764 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* 使われていないなら */
793 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/ 765 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*そのレジスタを使うことを宣言し*/
794 regv[FREG_VAR_BASE-i+FREG_OFFSET]=0;
795 if (i>max_freg_var) max_freg_var=i; 766 if (i>max_freg_var) max_freg_var=i;
796 /* その場所を表す番号を返す */ 767 /* その場所を表す番号を返す */
797 return list3(FREGISTER,FREG_VAR_BASE-i+FREG_OFFSET,(int)n); 768 return list3(FREGISTER,FREG_VAR_BASE-i+FREG_OFFSET,(int)n);
798 } 769 }
799 } 770 }
807 int new_reg; 778 int new_reg;
808 if (reg_sp>MAX_MAX) error(-1); 779 if (reg_sp>MAX_MAX) error(-1);
809 new_reg = get_register(); 780 new_reg = get_register();
810 reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */ 781 reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */
811 ireg = creg = new_reg; 782 ireg = creg = new_reg;
812 regv[creg]=1;
813 } 783 }
814 784
815 int 785 int
816 emit_pop(int type) 786 emit_pop(int type)
817 { 787 {
820 if (xreg<= -REG_LVAR_OFFSET) { 790 if (xreg<= -REG_LVAR_OFFSET) {
821 reg = get_register(); 791 reg = get_register();
822 code_rlvar(REG_LVAR_OFFSET+xreg,reg); 792 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
823 free_lvar(REG_LVAR_OFFSET+xreg); 793 free_lvar(REG_LVAR_OFFSET+xreg);
824 xreg = reg; 794 xreg = reg;
825 regv[creg]=1;
826 } 795 }
827 return xreg; 796 return xreg;
828 } 797 }
829 798
830 void 799 void
834 } 803 }
835 804
836 void 805 void
837 code_gvar(int e1,int creg) { 806 code_gvar(int e1,int creg) {
838 printf("\tla %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); 807 printf("\tla %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm);
839 regv[creg]=1;
840 } 808 }
841 809
842 void 810 void
843 code_rgvar(int e1,int creg) { 811 code_rgvar(int e1,int creg) {
844 printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); 812 printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm);
845 regv[creg]=1;
846 } 813 }
847 char *cload(int sign,int sz) { return sz==1?(sign?"lbu":"lb"):(sz==size_of_short?(sign?"lhu":"lh"):"lw");} 814 char *cload(int sign,int sz) { return sz==1?(sign?"lbu":"lb"):(sz==size_of_short?(sign?"lhu":"lh"):"lw");}
848 char *cstore(int sz) { return sz==1?"sb":(sz==size_of_short)?"sh":"sw";} 815 char *cstore(int sz) { return sz==1?"sb":(sz==size_of_short)?"sh":"sw";}
849 void 816 void
850 code_crgvar(int e1,int creg,int sign,int sz){ 817 code_crgvar(int e1,int creg,int sign,int sz){
851 printf("\t%s %s,%s\n",cload(sign,sz),register_name(creg),((NMTBL*)cadr(e1))->nm); 818 printf("\t%s %s,%s\n",cload(sign,sz),register_name(creg),((NMTBL*)cadr(e1))->nm);
852 regv[creg]=1;
853 } 819 }
854 820
855 821
856 void 822 void
857 code_register(int e2,int creg) { 823 code_register(int e2,int creg) {
858 if (creg!=e2) 824 if (creg!=e2)
859 printf("\tmove %s,%s\n",register_name(creg),register_name(e2)); 825 printf("\tmove %s,%s\n",register_name(creg),register_name(e2));
860 regv[creg]=1;
861 } 826 }
862 827
863 828
864 void 829 void
865 code_rlvar(int e2,int reg) { 830 code_rlvar(int e2,int reg) {
866 printf("\tlw %s,",register_name(reg)); 831 printf("\tlw %s,",register_name(reg));
867 lvar(e2); 832 lvar(e2);
868 regv[creg]=1;
869 } 833 }
870 834
871 835
872 void 836 void
873 code_crlvar(int e2,int reg,int sign,int sz) { 837 code_crlvar(int e2,int reg,int sign,int sz) {
874 printf("\t%s %s,",cload(sign,sz),register_name(reg)); 838 printf("\t%s %s,",cload(sign,sz),register_name(reg));
875 lvar(e2); 839 lvar(e2);
876 regv[reg]=1;
877 } 840 }
878 841
879 842
880 void 843 void
881 code_fname(NMTBL *n,int creg) { 844 code_fname(NMTBL *n,int creg) {
882 printf("\tla %s,%s\n",register_name(creg),n->nm); 845 printf("\tla %s,%s\n",register_name(creg),n->nm);
883 regv[creg]=1;
884 } 846 }
885 847
886 848
887 void 849 void
888 code_const(int e2,int creg) { 850 code_const(int e2,int creg) {
889 printf("\tli %s,%d\n",register_name(creg),e2); 851 printf("\tli %s,%d\n",register_name(creg),e2);
890 regv[creg]=1;
891 } 852 }
892 853
893 854
894 void 855 void
895 code_neg(int creg) { 856 code_neg(int creg) {
922 if (car(e2)==REGISTER) { 883 if (car(e2)==REGISTER) {
923 printf("\taddu %s,%s,%d\n", 884 printf("\taddu %s,%s,%d\n",
924 register_name(cadr(e2)),register_name(cadr(e2)), dir); 885 register_name(cadr(e2)),register_name(cadr(e2)), dir);
925 if (cadr(reg)!=e2) 886 if (cadr(reg)!=e2)
926 printf("\tmove %s,%s\n",register_name(cadr(reg)),register_name(e2)); 887 printf("\tmove %s,%s\n",register_name(cadr(reg)),register_name(e2));
927 regv[reg]=1;
928 return; 888 return;
929 } 889 }
930 g_expr(e2); 890 g_expr(e2);
931 xrn = register_name(creg); 891 xrn = register_name(creg);
932 dreg=get_register(); if (!dreg) error(-1); 892 dreg=get_register(); if (!dreg) error(-1);
933 drn = register_name(dreg); 893 drn = register_name(dreg);
934 printf("\t%s %s,0(%s)\n",cload(sign,sz),drn,xrn); 894 printf("\t%s %s,0(%s)\n",cload(sign,sz),drn,xrn);
935 printf("\taddu %s,%s,%d\n",drn,drn,dir); 895 printf("\taddu %s,%s,%d\n",drn,drn,dir);
936 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn); 896 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
937 i=creg;creg=dreg;dreg=i; 897 i=creg;creg=dreg;dreg=i;
938 regv[creg]=1; ireg=creg; 898 ireg=creg;
939 free_register(dreg); 899 free_register(dreg);
940 } 900 }
941 901
942 902
943 void 903 void
946 int dreg,nreg,i; 906 int dreg,nreg,i;
947 if (car(e2)==REGISTER) { 907 if (car(e2)==REGISTER) {
948 printf("\tmove %s,%s\n",register_name(reg),register_name(cadr(e2))); 908 printf("\tmove %s,%s\n",register_name(reg),register_name(cadr(e2)));
949 printf("\taddu %s,%s,%d\n", 909 printf("\taddu %s,%s,%d\n",
950 register_name(cadr(e2)),register_name(cadr(e2)),dir); 910 register_name(cadr(e2)),register_name(cadr(e2)),dir);
951 regv[reg]=1;
952 return; 911 return;
953 } 912 }
954 g_expr(e2); 913 g_expr(e2);
955 crn = register_name(creg); 914 crn = register_name(creg);
956 dreg=get_register(); if (!dreg) error(-1); 915 dreg=get_register(); if (!dreg) error(-1);
961 printf("\taddu %s,%s,%d\n",nrn,xrn,dir); 920 printf("\taddu %s,%s,%d\n",nrn,xrn,dir);
962 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn); 921 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
963 i=creg;creg=dreg;dreg=i; 922 i=creg;creg=dreg;dreg=i;
964 free_register(nreg); 923 free_register(nreg);
965 free_register(dreg); 924 free_register(dreg);
966 regv[creg]=1; ireg=creg; 925 ireg=creg;
967 } 926 }
968 927
969 928
970 929
971 void 930 void
1033 992
1034 void 993 void
1035 code_cmp_crgvar(int e1,int sz) { 994 code_cmp_crgvar(int e1,int sz) {
1036 if (cmpreg==-1) cmpreg = get_register(); 995 if (cmpreg==-1) cmpreg = get_register();
1037 code_crgvar(cadr(e1),cmpreg,1,sz); 996 code_crgvar(cadr(e1),cmpreg,1,sz);
1038 regv[cmpreg]=1;
1039 } 997 }
1040 998
1041 999
1042 void 1000 void
1043 code_cmp_crlvar(int e2,int sz) { 1001 code_cmp_crlvar(int e2,int sz) {
1044 if (cmpreg==-1) cmpreg = get_register(); 1002 if (cmpreg==-1) cmpreg = get_register();
1045 code_crlvar(e2,cmpreg,1,sz); 1003 code_crlvar(e2,cmpreg,1,sz);
1046 regv[cmpreg]=1;
1047 } 1004 }
1048 1005
1049 1006
1050 void 1007 void
1051 code_cmp_rgvar(int e1) { 1008 code_cmp_rgvar(int e1) {
1052 if (cmpreg==-1) cmpreg = get_register(); 1009 if (cmpreg==-1) cmpreg = get_register();
1053 code_rgvar(e1,cmpreg); 1010 code_rgvar(e1,cmpreg);
1054 regv[cmpreg]=1;
1055 } 1011 }
1056 1012
1057 1013
1058 void 1014 void
1059 code_cmp_rlvar(int e2) { 1015 code_cmp_rlvar(int e2) {
1060 if (cmpreg==-1) cmpreg = get_register(); 1016 if (cmpreg==-1) cmpreg = get_register();
1061 code_rlvar(e2,cmpreg); 1017 code_rlvar(e2,cmpreg);
1062 regv[cmpreg]=1;
1063 } 1018 }
1064 1019
1065 1020
1066 void 1021 void
1067 code_cmp_register(int e2) { 1022 code_cmp_register(int e2) {
1068 cmpreg = e2; 1023 cmpreg = e2;
1069 /* prevent cmpreg freeing */ 1024 /* prevent cmpreg freeing */
1070 regv[cmpreg]=2;
1071 } 1025 }
1072 1026
1073 1027
1074 void 1028 void
1075 ascii(char *s) 1029 ascii(char *s)
1178 if(creg!=to) { 1132 if(creg!=to) {
1179 free_register(creg); creg=to; 1133 free_register(creg); creg=to;
1180 } 1134 }
1181 } 1135 }
1182 free_register(dreg); 1136 free_register(dreg);
1183 regv[from]=regv[to]=regv[dreg]=0;
1184 regv[creg]=1;
1185 } 1137 }
1186 1138
1187 int 1139 int
1188 struct_push(int e4,int t,int arg) 1140 struct_push(int e4,int t,int arg)
1189 { 1141 {
1465 free_register(cadr(arg)); 1417 free_register(cadr(arg));
1466 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg)); 1418 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
1467 } 1419 }
1468 if (ret_type==DOUBLE) { 1420 if (ret_type==DOUBLE) {
1469 set_dreg(RET_DREGISTER,0); 1421 set_dreg(RET_DREGISTER,0);
1470 regv[dreg]=1; regv[creg]=0;
1471 } else if (ret_type==FLOAT) { 1422 } else if (ret_type==FLOAT) {
1472 set_freg(RET_FREGISTER,0); 1423 set_freg(RET_FREGISTER,0);
1473 regv[freg]=1; regv[creg]=0;
1474 } else if (ret_type==VOID) { 1424 } else if (ret_type==VOID) {
1475 regv[freg]=0; regv[creg]=0;
1476 } else { 1425 } else {
1477 set_creg(RET_REGISTER,0); 1426 set_creg(RET_REGISTER,0);
1478 regv[freg]=0; regv[creg]=1;
1479 } 1427 }
1480 return ret_type; 1428 return ret_type;
1481 } 1429 }
1482 1430
1483 void 1431 void
1562 if (d) { 1510 if (d) {
1563 printf("\tlw %s,%d(%s)\n", 1511 printf("\tlw %s,%d(%s)\n",
1564 dregister_name0(dreg),offset,crn); 1512 dregister_name0(dreg),offset,crn);
1565 printf("\tlw %s,%d(%s)\n", 1513 printf("\tlw %s,%d(%s)\n",
1566 dregister_name1(dreg),offset+size_of_int,crn); 1514 dregister_name1(dreg),offset+size_of_int,crn);
1567 regv[creg]=0; regv[dreg]=1;
1568 creg = dreg; 1515 creg = dreg;
1569 return DOUBLE; 1516 return DOUBLE;
1570 } else { 1517 } else {
1571 printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn); 1518 printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
1572 regv[creg]=0; regv[freg]=1;
1573 creg = freg; 1519 creg = freg;
1574 return FLOAT; 1520 return FLOAT;
1575 } 1521 }
1576 } 1522 }
1577 #endif 1523 #endif
1632 } else if (byte==size_of_short) { 1578 } else if (byte==size_of_short) {
1633 printf("\tsh %s,0(%s)\n",crn,drn); 1579 printf("\tsh %s,0(%s)\n",crn,drn);
1634 } else { 1580 } else {
1635 printf("\tsw %s,0(%s)\n",crn,drn); 1581 printf("\tsw %s,0(%s)\n",crn,drn);
1636 } 1582 }
1637 regv[creg]=1;
1638 } 1583 }
1639 1584
1640 1585
1641 void 1586 void
1642 code_register_assop(int e2,int op,int byte) { 1587 code_register_assop(int e2,int op,int byte) {
1645 creg = reg = e2; 1590 creg = reg = e2;
1646 tosop(op,xreg); 1591 tosop(op,xreg);
1647 creg = xreg; 1592 creg = xreg;
1648 if (creg!=reg) 1593 if (creg!=reg)
1649 printf("\tmove %s,%s\n",register_name(creg),register_name(reg)); 1594 printf("\tmove %s,%s\n",register_name(creg),register_name(reg));
1650 regv[creg]=1;
1651 } 1595 }
1652 1596
1653 1597
1654 void 1598 void
1655 code_assop(int op,int byte,int sign) { 1599 code_assop(int op,int byte,int sign) {
1656 char *xrn,*crn,*drn; 1600 char *xrn,*crn,*drn;
1657 int xreg; 1601 int xreg;
1658 int edx = get_register(); if(!edx) error(-1); 1602 int edx = get_register(); if(!edx) error(-1);
1659 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ 1603 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
1660 regv[xreg]=regs[xreg]=1; 1604 regs[xreg]=1;
1661 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg)); 1605 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
1662 regv[edx]=1;
1663 ld_indexx(byte,0,edx,sign); 1606 ld_indexx(byte,0,edx,sign);
1664 tosop(op,xreg); 1607 tosop(op,xreg);
1665 crn = register_name(creg); 1608 crn = register_name(creg);
1666 drn = register_name(edx); 1609 drn = register_name(edx);
1667 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn); 1610 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn);
1668 free_register(edx); 1611 free_register(edx);
1669 emit_pop_free(xreg); 1612 emit_pop_free(xreg);
1670 regv[creg]=1;
1671 } 1613 }
1672 1614
1673 1615
1674 void 1616 void
1675 tosop(int op,int oreg) 1617 tosop(int op,int oreg)
1681 error(-1); 1623 error(-1);
1682 } else if (oreg<= -REG_LVAR_OFFSET) { 1624 } else if (oreg<= -REG_LVAR_OFFSET) {
1683 dx = get_register(); if (dx<0) error(-1); 1625 dx = get_register(); if (dx<0) error(-1);
1684 code_rlvar(oreg+REG_LVAR_OFFSET,dx); 1626 code_rlvar(oreg+REG_LVAR_OFFSET,dx);
1685 oreg = dx; 1627 oreg = dx;
1686 regv[oreg]=1;
1687 } 1628 }
1688 1629
1689 switch(op) { 1630 switch(op) {
1690 case LSHIFT: 1631 case LSHIFT:
1691 case ULSHIFT: 1632 case ULSHIFT:
1692 shift("sll",oreg); 1633 shift("sll",oreg);
1693 regv[creg]=1;
1694 return; 1634 return;
1695 case RSHIFT: 1635 case RSHIFT:
1696 shift("srl",oreg); 1636 shift("srl",oreg);
1697 regv[creg]=1;
1698 return; 1637 return;
1699 case URSHIFT: 1638 case URSHIFT:
1700 shift("sra",oreg); 1639 shift("sra",oreg);
1701 regv[creg]=1;
1702 return; 1640 return;
1703 } 1641 }
1704 orn = register_name(oreg); 1642 orn = register_name(oreg);
1705 crn = register_name(creg); 1643 crn = register_name(creg);
1706 switch(op) { 1644 switch(op) {
1742 break; 1680 break;
1743 default: 1681 default:
1744 error(-1); 1682 error(-1);
1745 } 1683 }
1746 if(oreg!=creg) free_register(oreg); 1684 if(oreg!=creg) free_register(oreg);
1747 regv[creg]=1;
1748 } 1685 }
1749 1686
1750 1687
1751 void 1688 void
1752 shift(char *op, int reg) 1689 shift(char *op, int reg)
1789 /* used in dosiwtch() */ 1726 /* used in dosiwtch() */
1790 if(chk) return; 1727 if(chk) return;
1791 creg = use_int(creg); 1728 creg = use_int(creg);
1792 printf("\tli %s,%d\n",register_name(creg),e); 1729 printf("\tli %s,%d\n",register_name(creg),e);
1793 cmpreg = csreg; 1730 cmpreg = csreg;
1794 regv[cmpreg]=2; /* prevent from freeing */
1795 } 1731 }
1796 1732
1797 void 1733 void
1798 code_opening(char *s) 1734 code_opening(char *s)
1799 { 1735 {
1857 if (cmpreg==-1) error(-1); 1793 if (cmpreg==-1) error(-1);
1858 printf("\tb%s %s,%s,L_%d\n", 1794 printf("\tb%s %s,%s,L_%d\n",
1859 cond?"ne":"eq", 1795 cond?"ne":"eq",
1860 register_name(creg),register_name(cmpreg), 1796 register_name(creg),register_name(cmpreg),
1861 l); 1797 l);
1862 if (regv[cmpreg]==1) { 1798 free_register(cmpreg); cmpreg = -1;
1863 free_register(cmpreg); cmpreg = -1;
1864 }
1865 regv[creg]=0;
1866 } 1799 }
1867 1800
1868 void 1801 void
1869 jmp(int l) 1802 jmp(int l)
1870 { 1803 {
2318 } else { 2251 } else {
2319 if (!is_float_reg(e2)) error(-1); 2252 if (!is_float_reg(e2)) error(-1);
2320 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2)); 2253 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
2321 } 2254 }
2322 } 2255 }
2323 regv[freg]=1;
2324 } 2256 }
2325 2257
2326 void code_dassign_gvar(int e2,int freg,int d) 2258 void code_dassign_gvar(int e2,int freg,int d)
2327 { 2259 {
2328 NMTBL *n = (NMTBL*)cadr(e2); 2260 NMTBL *n = (NMTBL*)cadr(e2);
2331 printf("\tsw %s,0(%s)\n",dregister_name0(freg),n->nm); 2263 printf("\tsw %s,0(%s)\n",dregister_name0(freg),n->nm);
2332 printf("\tsw %s,0(%s)\n",dregister_name1(freg),n->nm); 2264 printf("\tsw %s,0(%s)\n",dregister_name1(freg),n->nm);
2333 } else { 2265 } else {
2334 printf("\ts.s %s,0(%s)\n",fregister_name(freg),n->nm); 2266 printf("\ts.s %s,0(%s)\n",fregister_name(freg),n->nm);
2335 } 2267 }
2336 regv[freg]=1;
2337 } 2268 }
2338 2269
2339 void code_dassign_lvar(int e2,int freg,int d) 2270 void code_dassign_lvar(int e2,int freg,int d)
2340 { 2271 {
2341 if (d) { 2272 if (d) {
2346 e2 += size_of_double/2; 2277 e2 += size_of_double/2;
2347 } else { 2278 } else {
2348 printf("\ts.s %s,",fregister_name(freg)); 2279 printf("\ts.s %s,",fregister_name(freg));
2349 } 2280 }
2350 lvar(e2); 2281 lvar(e2);
2351 regv[freg]=1;
2352 } 2282 }
2353 2283
2354 void code_dassign(int e2,int freg,int d) 2284 void code_dassign(int e2,int freg,int d)
2355 { 2285 {
2356 if (d) { 2286 if (d) {
2358 printf("\tsw %s,0(%s)\n",dregister_name0(freg),register_name(e2)); 2288 printf("\tsw %s,0(%s)\n",dregister_name0(freg),register_name(e2));
2359 printf("\tsw %s,4(%s)\n",dregister_name1(freg),register_name(e2)); 2289 printf("\tsw %s,4(%s)\n",dregister_name1(freg),register_name(e2));
2360 } else { 2290 } else {
2361 printf("\ts.s %s,0(%s)\n",fregister_name(freg),register_name(e2)); 2291 printf("\ts.s %s,0(%s)\n",fregister_name(freg),register_name(e2));
2362 } 2292 }
2363 regv[freg]=1;
2364 } 2293 }
2365 2294
2366 void 2295 void
2367 code_dassign_dregister(int e2,int d,int freg) { 2296 code_dassign_dregister(int e2,int d,int freg) {
2368 /* これってさ、code_dregister と同じ? */ 2297 /* これってさ、code_dregister と同じ? */
2410 printf("\tli.d %s,%g\n",dregister_name0(freg),value); 2339 printf("\tli.d %s,%g\n",dregister_name0(freg),value);
2411 } else { 2340 } else {
2412 frn = fregister_name(freg); 2341 frn = fregister_name(freg);
2413 printf("\tli.s %s,%g\n",frn,value); 2342 printf("\tli.s %s,%g\n",frn,value);
2414 } 2343 }
2415 regv[freg]=1;
2416 } 2344 }
2417 2345
2418 2346
2419 void code_dneg(int freg,int d) 2347 void code_dneg(int freg,int d)
2420 { 2348 {
2434 { 2362 {
2435 code_save_stacks(); 2363 code_save_stacks();
2436 set_dreg(RET_DREGISTER,1); 2364 set_dreg(RET_DREGISTER,1);
2437 code_dpfunc("dptoli"); 2365 code_dpfunc("dptoli");
2438 set_creg(RET_REGISTER,0); 2366 set_creg(RET_REGISTER,0);
2439 regv[freg]=0;
2440 regv[creg]=1;
2441 } 2367 }
2442 2368
2443 void code_i2d(int creg0) 2369 void code_i2d(int creg0)
2444 { 2370 {
2445 code_save_stacks(); 2371 code_save_stacks();
2446 set_creg(RET_REGISTER,1); 2372 set_creg(RET_REGISTER,1);
2447 code_dpfunc("litodp"); 2373 code_dpfunc("litodp");
2448 set_dreg(RET_DREGISTER,0); 2374 set_dreg(RET_DREGISTER,0);
2449 regv[freg]=1;
2450 regv[creg]=0;
2451 } 2375 }
2452 2376
2453 void code_d2u(int freg0) 2377 void code_d2u(int freg0)
2454 { 2378 {
2455 code_save_stacks(); 2379 code_save_stacks();
2456 set_dreg(RET_DREGISTER,1); 2380 set_dreg(RET_DREGISTER,1);
2457 code_dpfunc("dptoul"); 2381 code_dpfunc("dptoul");
2458 set_creg(RET_REGISTER,0); 2382 set_creg(RET_REGISTER,0);
2459 regv[freg]=1;
2460 } 2383 }
2461 2384
2462 void code_u2d(int creg0) 2385 void code_u2d(int creg0)
2463 { 2386 {
2464 code_save_stacks(); 2387 code_save_stacks();
2465 set_creg(RET_REGISTER,1); 2388 set_creg(RET_REGISTER,1);
2466 code_dpfunc("ultodp"); 2389 code_dpfunc("ultodp");
2467 set_dreg(RET_DREGISTER,0); 2390 set_dreg(RET_DREGISTER,0);
2468 regv[freg]=1;
2469 } 2391 }
2470 2392
2471 void code_d2f(int freg) { 2393 void code_d2f(int freg) {
2472 code_save_stacks(); 2394 code_save_stacks();
2473 set_dreg(RET_DREGISTER,1); 2395 set_dreg(RET_DREGISTER,1);
2511 printf("\tlw %s,%s\n",dregister_name0(freg),name); 2433 printf("\tlw %s,%s\n",dregister_name0(freg),name);
2512 printf("\tlw %s,%s\n",dregister_name1(freg),name); 2434 printf("\tlw %s,%s\n",dregister_name1(freg),name);
2513 } else { 2435 } else {
2514 printf("\tl.s %s,%s\n",fregister_name(freg),name); 2436 printf("\tl.s %s,%s\n",fregister_name(freg),name);
2515 } 2437 }
2516 regv[freg]=1;
2517 } 2438 }
2518 2439
2519 2440
2520 void code_drlvar(int e2,int d,int freg) 2441 void code_drlvar(int e2,int d,int freg)
2521 { 2442 {
2523 printf("\tlw %s,",dregister_name0(freg)); lvar(e2); 2444 printf("\tlw %s,",dregister_name0(freg)); lvar(e2);
2524 printf("\tlw %s,",dregister_name1(freg)); lvar(e2+size_of_double/2); 2445 printf("\tlw %s,",dregister_name1(freg)); lvar(e2+size_of_double/2);
2525 } else { 2446 } else {
2526 printf("\tl.s %s,",fregister_name(freg)); lvar(e2); 2447 printf("\tl.s %s,",fregister_name(freg)); lvar(e2);
2527 } 2448 }
2528 regv[freg]=1;
2529 } 2449 }
2530 2450
2531 void code_cmp_drgvar(int e2,int d) 2451 void code_cmp_drgvar(int e2,int d)
2532 { 2452 {
2533 char *frn; 2453 char *frn;
2535 if (d) { 2455 if (d) {
2536 code_save_stacks(); 2456 code_save_stacks();
2537 set_dreg(RET_DREGISTER,1); 2457 set_dreg(RET_DREGISTER,1);
2538 code_drgvar(e2,d,RET_DREGISTER+2); 2458 code_drgvar(e2,d,RET_DREGISTER+2);
2539 code_dpfunc("dcmp"); 2459 code_dpfunc("dcmp");
2540 regv[dreg]=0;
2541 } else { 2460 } else {
2542 frn=fregister_name(freg); 2461 frn=fregister_name(freg);
2543 g=get_dregister(d); 2462 g=get_dregister(d);
2544 code_drgvar(e2,d,g); 2463 code_drgvar(e2,d,g);
2545 printf("\tfc.eq.s %s,%s\n",frn,fregister_name(g)); 2464 printf("\tfc.eq.s %s,%s\n",frn,fregister_name(g));
2546 free_register(g); 2465 free_register(g);
2547 regv[freg]=0;
2548 } 2466 }
2549 } 2467 }
2550 2468
2551 void code_cmp_drlvar(int e2,int d) 2469 void code_cmp_drlvar(int e2,int d)
2552 { 2470 {
2555 if (d) { 2473 if (d) {
2556 code_save_stacks(); 2474 code_save_stacks();
2557 set_dreg(RET_DREGISTER,1); 2475 set_dreg(RET_DREGISTER,1);
2558 code_drgvar(e2,d,RET_DREGISTER+2); 2476 code_drgvar(e2,d,RET_DREGISTER+2);
2559 code_dpfunc("dcmp"); 2477 code_dpfunc("dcmp");
2560 regv[dreg]=0;
2561 } else { 2478 } else {
2562 g=get_dregister(d); 2479 g=get_dregister(d);
2563 code_drlvar(e2,d,g); 2480 code_drlvar(e2,d,g);
2564 printf("\tc.eq.s %s,%s\n",frn,fregister_name(g)); 2481 printf("\tc.eq.s %s,%s\n",frn,fregister_name(g));
2565 free_register(g); 2482 free_register(g);
2566 regv[freg]=0;
2567 } 2483 }
2568 } 2484 }
2569 2485
2570 static void 2486 static void
2571 dtosop0(char *opn,int e1,int d,int cmp) 2487 dtosop0(char *opn,int e1,int d,int cmp)
2590 } 2506 }
2591 2507
2592 2508
2593 void dtosop(int op,int e1) 2509 void dtosop(int op,int e1)
2594 { 2510 {
2595 regv[freg]=1;
2596 switch(op) { 2511 switch(op) {
2597 case FADD: dtosop0("fadd",e1,0,0); return; 2512 case FADD: dtosop0("fadd",e1,0,0); return;
2598 case DADD: dtosop0("dpadd",e1,1,0); return; 2513 case DADD: dtosop0("dpadd",e1,1,0); return;
2599 case FSUB: dtosop0("fadd",e1,0,0); return; 2514 case FSUB: dtosop0("fadd",e1,0,0); return;
2600 case DSUB: dtosop0("dpsub",e1,1,0); return; 2515 case DSUB: dtosop0("dpsub",e1,1,0); return;
2636 dtosop(op,xreg); 2551 dtosop(op,xreg);
2637 printf("\ts.s %s,0(%s)\n",frn,crn); 2552 printf("\ts.s %s,0(%s)\n",frn,crn);
2638 emit_dpop_free(xreg,d); 2553 emit_dpop_free(xreg,d);
2639 creg = freg; 2554 creg = freg;
2640 } 2555 }
2641 regv[creg]=1;
2642 } 2556 }
2643 2557
2644 2558
2645 void 2559 void
2646 code_dpreinc(int e1,int e2,int d,int reg) { 2560 code_dpreinc(int e1,int e2,int d,int reg) {
2680 printf("\tfsub %s,%s,%s\n",frn,frn,grn); 2594 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
2681 printf("\ts.s %s,0(%s)\n",frn,crn); 2595 printf("\ts.s %s,0(%s)\n",frn,crn);
2682 free_register(g); 2596 free_register(g);
2683 creg = freg; 2597 creg = freg;
2684 } 2598 }
2685 regv[creg]=1;
2686 } 2599 }
2687 2600
2688 void 2601 void
2689 code_dpostinc(int e1,int e2,int d,int reg) { 2602 code_dpostinc(int e1,int e2,int d,int reg) {
2690 char *frn; 2603 char *frn;
2725 printf("\tfsub %s,%s,%s\n",frn,frn,grn); 2638 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
2726 printf("\ts.s %s,0(%s)\n",grn,crn); 2639 printf("\ts.s %s,0(%s)\n",grn,crn);
2727 free_register(g); 2640 free_register(g);
2728 creg = freg; 2641 creg = freg;
2729 } 2642 }
2730 regv[creg]=1;
2731 2643
2732 } 2644 }
2733 2645
2734 void 2646 void
2735 drexpr(int e1, int e2,int l1, int op) 2647 drexpr(int e1, int e2,int l1, int op)
2772 xreg=pop_fregister(); 2684 xreg=pop_fregister();
2773 if (xreg<= -REG_LVAR_OFFSET) { 2685 if (xreg<= -REG_LVAR_OFFSET) {
2774 reg = get_dregister(d); 2686 reg = get_dregister(d);
2775 code_drlvar(REG_LVAR_OFFSET+xreg,d,reg); 2687 code_drlvar(REG_LVAR_OFFSET+xreg,d,reg);
2776 free_lvar(REG_LVAR_OFFSET+xreg); 2688 free_lvar(REG_LVAR_OFFSET+xreg);
2777 regv[reg]=1; xreg=reg; 2689 xreg=reg;
2778 } 2690 }
2779 return xreg; 2691 return xreg;
2780 } 2692 }
2781 2693
2782 void emit_dpop_free(int e1,int d) 2694 void emit_dpop_free(int e1,int d)
2790 if (freg_sp>MAX_MAX) error(-1); 2702 if (freg_sp>MAX_MAX) error(-1);
2791 new_reg = get_dregister(d); 2703 new_reg = get_dregister(d);
2792 if (d) { 2704 if (d) {
2793 dreg_stack[dreg_sp++] = dreg; /* push するかわりにレジスタを使う */ 2705 dreg_stack[dreg_sp++] = dreg; /* push するかわりにレジスタを使う */
2794 creg = dreg = new_reg; 2706 creg = dreg = new_reg;
2795 regv[dreg]=1;
2796 } else { 2707 } else {
2797 freg_stack[freg_sp++] = freg; /* push するかわりにレジスタを使う */ 2708 freg_stack[freg_sp++] = freg; /* push するかわりにレジスタを使う */
2798 creg = freg = new_reg; 2709 creg = freg = new_reg;
2799 regv[freg]=1;
2800 } 2710 }
2801 } 2711 }
2802 2712
2803 #endif 2713 #endif
2804 2714