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