comparison mc-code-arm.c @ 389:68fb244e0e3c

mc-arm generates code-gen-all.s with no error, but assembler output contains errors.
author kono
date Fri, 03 Sep 2004 23:27:04 +0900
parents 245c6033683d
children 15cf97ce7db1
comparison
equal deleted inserted replaced
388:245c6033683d 389:68fb244e0e3c
81 81
82 #define REG_ip 12 82 #define REG_ip 12
83 #define REG_fp 13 83 #define REG_fp 13
84 #define REG_sp 14 84 #define REG_sp 14
85 #define REG_VAR_BASE 11 85 #define REG_VAR_BASE 11
86 #define REG_VAR_MIN 4 86 #define REG_VAR_MIN 9
87 #define MIN_TMP_REG 12 /* only one tmp register? */ 87 #define MIN_TMP_REG 2 /* only one tmp register? */
88 #define MAX_TMP_REG 12 88 #define MAX_TMP_REG 8
89 89
90 #define PTRC_REG 3 /* mark for pointer cache */ 90 #define PTRC_REG 3 /* mark for pointer cache */
91 91
92 #define FREG_VAR_BASE 7 92 #define FREG_VAR_BASE 7
93 #define FREG_VAR_MIN 4 93 #define FREG_VAR_MIN 4
495 } 495 }
496 496
497 void 497 void
498 code_gexpr(int e){ 498 code_gexpr(int e){
499 if (is_int_reg(creg) && creg!=ireg) error(-1); 499 if (is_int_reg(creg) && creg!=ireg) error(-1);
500 // register_usage("code_gexpr"); 500 // register_usage("code_gexpr");
501 } 501 }
502 502
503 503
504 void 504 void
505 code_arg_register(NMTBL *fnptr) 505 code_arg_register(NMTBL *fnptr)
618 regs[reg]=0; 618 regs[reg]=0;
619 return reg; /* その場所を表す番号を返す */ 619 return reg; /* その場所を表す番号を返す */
620 } 620 }
621 } 621 }
622 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ 622 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
623 error(HPERR); return creg; 623 error(RGERR); return creg;
624 } 624 }
625 625
626 #if 0 626 #if 0
627 int 627 int
628 get_register(void) 628 get_register(void)
670 if (i+1>max_freg_var) max_freg_var=i+1; 670 if (i+1>max_freg_var) max_freg_var=i+1;
671 return reg; /* その場所を表す番号を返す */ 671 return reg; /* その場所を表す番号を返す */
672 } 672 }
673 } 673 }
674 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ 674 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
675 error(REG_ERR); return freg; 675 error(RGERR); return freg;
676 } 676 }
677 677
678 #if 0 678 #if 0
679 int 679 int
680 get_dregister(int d) 680 get_dregister(int d)
690 { /* レジスタから値を取り出す */ 690 { /* レジスタから値を取り出す */
691 return freg_stack[--freg_sp]; 691 return freg_stack[--freg_sp];
692 } 692 }
693 #endif 693 #endif
694 694
695 // static int lreg_count;
695 int 696 int
696 get_lregister0() 697 get_lregister0()
697 { 698 {
698 int i; 699 int i;
699 for(i=LREG_OFFSET;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) { 700 for(i=LREG_OFFSET;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
700 if (regs[i]==0) { 701 if (regs[i]==0) {
701 // printf("# get_lregister %d\n",i); 702 // printf("# get_lregister %d (%d)\n",i,lreg_count++);
702 return i; 703 return i;
703 } 704 }
704 } 705 }
705 return -1; 706 return -1;
706 } 707 }
769 770
770 free_register(int i) { /* いらなくなったレジスタを開放 */ 771 free_register(int i) { /* いらなくなったレジスタを開放 */
771 // printf("# free_register %d\n",i); 772 // printf("# free_register %d\n",i);
772 regs[i]=0; 773 regs[i]=0;
773 if (is_longlong_reg(i)) { 774 if (is_longlong_reg(i)) {
775 // printf("# free lregister %d (%d)\n",i,lreg_count++);
774 regs[regv_l(i)]=0; 776 regs[regv_l(i)]=0;
775 regs[regv_h(i)]=0; 777 regs[regv_h(i)]=0;
776 //regv_l(i)=0; 778 //regv_l(i)=0;
777 //regv_h(i)=0; 779 //regv_h(i)=0;
778 } 780 }
2880 printf("\tbne\t.L%d\n",label); break; 2882 printf("\tbne\t.L%d\n",label); break;
2881 case 0: 2883 case 0:
2882 printf("\tbeq\t.L%d\n",label); break; 2884 printf("\tbeq\t.L%d\n",label); break;
2883 case LT: 2885 case LT:
2884 printf("\tblt\t.L%d\n",label); break; 2886 printf("\tblt\t.L%d\n",label); break;
2887 case GT:
2888 printf("\tbgt\t.L%d\n",label); break;
2885 default: error(-1); 2889 default: error(-1);
2886 } 2890 }
2887 if (reg!=-1) free_register(reg); 2891 if (reg!=-1) free_register(reg);
2888 } 2892 }
2889 2893
5318 edx = emit_pop(0); 5322 edx = emit_pop(0);
5319 code_lassign(edx,reg); 5323 code_lassign(edx,reg);
5320 emit_pop_free(edx); 5324 emit_pop_free(edx);
5321 if (edx0!=-1) 5325 if (edx0!=-1)
5322 free_register(edx0); 5326 free_register(edx0);
5327 if (reg!=lreg)
5328 free_register(reg);
5323 } 5329 }
5324 5330
5325 void 5331 void
5326 code_register_lassop(int reg,int op) { 5332 code_register_lassop(int reg,int op) {
5327 // reg op = pop() 5333 // reg op = pop()
5392 { 5398 {
5393 int t; 5399 int t;
5394 5400
5395 char *trn = register_name(t=get_register()); 5401 char *trn = register_name(t=get_register());
5396 5402
5397 code_add(t,csvalue,-min); 5403 code_add(t,-min,csvalue);
5398 code_cmpdimm(max-min+1,t,dlabel,GT); 5404 code_cmpdimm(max-min+1,t,dlabel,GT);
5399 switch(delta) { 5405 switch(delta) {
5400 case 1: printf("\tldrls\tpc, [pc, %s, asl #2]\n",trn); 5406 case 1: printf("\tldrls\tpc, [pc, %s, asl #2]\n",trn);
5401 inc_inst(1); 5407 inc_inst(1);
5402 break; 5408 break;