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