Mercurial > hg > CbC > old > device
comparison mc-code-i64.c @ 772:37e27e0c77d0
code-gen-all test passed.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 18 Nov 2010 17:02:54 +0900 |
parents | 5e07b9804aea |
children | be917edcb671 |
comparison
equal
deleted
inserted
replaced
771:5e07b9804aea | 772:37e27e0c77d0 |
---|---|
3702 void code_i2d(int reg) | 3702 void code_i2d(int reg) |
3703 { | 3703 { |
3704 use_int(reg); | 3704 use_int(reg); |
3705 int c = reg; | 3705 int c = reg; |
3706 set_freg(get_dregister(1),0); | 3706 set_freg(get_dregister(1),0); |
3707 printf("\tsalq $32,%s\n",register_name(c,0)); | |
3708 printf("\tsarq $32,%s\n",register_name(c,0)); | |
3707 printf("\tcvtsi2sd %s,%s\n",register_name(c,0),fregister_name(freg)); | 3709 printf("\tcvtsi2sd %s,%s\n",register_name(c,0),fregister_name(freg)); |
3708 } | 3710 } |
3709 | 3711 |
3710 void code_d2u(int reg) | 3712 void code_d2u(int reg) |
3711 { | 3713 { |
3775 | 3777 |
3776 void code_i2f(int reg) { | 3778 void code_i2f(int reg) { |
3777 use_int(reg); | 3779 use_int(reg); |
3778 int c = reg; | 3780 int c = reg; |
3779 set_freg(get_dregister(0),0); | 3781 set_freg(get_dregister(0),0); |
3782 printf("\tsalq $32,%s\n",register_name(c,0)); | |
3783 printf("\tsarq $32,%s\n",register_name(c,0)); | |
3780 printf("\tcvtsi2ss %s,%s\n",register_name(c,0),fregister_name(creg)); | 3784 printf("\tcvtsi2ss %s,%s\n",register_name(c,0),fregister_name(creg)); |
3781 } | 3785 } |
3782 void code_u2f(int reg) { | 3786 void code_u2f(int reg) { |
3783 code_u2d1(reg,0); | 3787 code_u2d1(reg,0); |
3784 } | 3788 } |
3868 case FCMP: | 3872 case FCMP: |
3869 if (oreg<= -REG_LVAR_OFFSET) { | 3873 if (oreg<= -REG_LVAR_OFFSET) { |
3870 printf("\tucomiss "); lvar(oreg); | 3874 printf("\tucomiss "); lvar(oreg); |
3871 printf(",%s\n",frn); | 3875 printf(",%s\n",frn); |
3872 } else { | 3876 } else { |
3873 printf("\tucomiss %s,%s\n",frn,grn); | 3877 printf("\tucomiss %s,%s\n",grn,frn); |
3874 } | 3878 } |
3875 if (ox!=-1) free_register(ox); | 3879 if (ox!=-1) free_register(ox); |
3876 return; | 3880 return; |
3877 case DCMP: | 3881 case DCMP: |
3878 if (oreg<= -REG_LVAR_OFFSET) { | 3882 if (oreg<= -REG_LVAR_OFFSET) { |
3879 printf("\tucomisd "); lvar(oreg); | 3883 printf("\tucomisd "); lvar(oreg); |
3880 printf(",%s\n",frn); | 3884 printf(",%s\n",frn); |
3881 } else { | 3885 } else { |
3882 printf("\tucomisd %s,%s\n",frn,grn); | 3886 printf("\tucomisd %s,%s\n",grn,frn); |
3883 } | 3887 } |
3884 if (ox!=-1) free_register(ox); | 3888 if (ox!=-1) free_register(ox); |
3885 return; | 3889 return; |
3886 case DCMPGE: | 3890 case DCMPGE: |
3887 case FCMPGE: | 3891 case FCMPGE: |
3948 | 3952 |
3949 void | 3953 void |
3950 code_dpreinc(int e1,int e2,int d,int reg) { | 3954 code_dpreinc(int e1,int e2,int d,int reg) { |
3951 char *frn,*crn,*grn; | 3955 char *frn,*crn,*grn; |
3952 int g; | 3956 int g; |
3953 char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"addss"); | 3957 char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"subss"); |
3954 | 3958 |
3955 if (car(e2)==DREGISTER||car(e2)==FREGISTER) { | 3959 if (car(e2)==DREGISTER||car(e2)==FREGISTER) { |
3956 crn=fregister_name(cadr(e2)); | 3960 crn=fregister_name(cadr(e2)); |
3957 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); | 3961 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); |
3958 if (reg==USE_CREG) { | 3962 if (reg==USE_CREG) { |
3981 } | 3985 } |
3982 | 3986 |
3983 void | 3987 void |
3984 code_dpostinc(int e1,int e2,int d,int reg) { | 3988 code_dpostinc(int e1,int e2,int d,int reg) { |
3985 char *frn,*crn,*grn; | 3989 char *frn,*crn,*grn; |
3986 int g; | 3990 int g,t; |
3987 char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"addss"); | 3991 char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"subss"); |
3988 | 3992 |
3989 if (car(e2)==DREGISTER||car(e2)==FREGISTER) { | 3993 if (car(e2)==DREGISTER||car(e2)==FREGISTER) { |
3990 crn=fregister_name(cadr(e2)); | 3994 crn=fregister_name(cadr(e2)); |
3991 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); | 3995 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); |
3992 if (reg==USE_CREG) { | 3996 if (reg==USE_CREG) { |
4006 set_freg(reg,0); | 4010 set_freg(reg,0); |
4007 } | 4011 } |
4008 frn=fregister_name(reg); | 4012 frn=fregister_name(reg); |
4009 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); | 4013 grn = fregister_name(g = code_dload_1(d,get_dregister(d))); |
4010 printf("\t%s 0(%s),%s\n",fload(d),crn,frn); | 4014 printf("\t%s 0(%s),%s\n",fload(d),crn,frn); |
4011 printf("\t%s %s,%s\n",ops,frn,grn); | 4015 if (use) { |
4012 printf("\t%s %s,0(%s)\n",fstore(d),grn,crn); | 4016 t = get_dregister(d); |
4017 printf("\tmovap%s %s,%s\n",d?"d":"s",frn,fregister_name(t)); | |
4018 } | |
4019 printf("\t%s %s,%s\n",ops,grn,frn); | |
4020 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn); | |
4021 if (use) { | |
4022 set_freg(t,0); | |
4023 } | |
4013 } | 4024 } |
4014 free_register(g); | 4025 free_register(g); |
4015 } | 4026 } |
4016 | 4027 |
4017 | 4028 |
4022 | 4033 |
4023 int | 4034 int |
4024 drexpr0(int e1, int e2,int l1, int op,int cond,int reg,int mode) | 4035 drexpr0(int e1, int e2,int l1, int op,int cond,int reg,int mode) |
4025 { | 4036 { |
4026 char *s; | 4037 char *s; |
4027 if (cond) { | 4038 if (!cond) { |
4028 switch(op) { | 4039 switch(op) { |
4029 case FOP+GT: | 4040 case FOP+GT: |
4030 return drexpr0(e2,e1,l1,FOP+GE,0,reg,mode); | 4041 return drexpr0(e2,e1,l1,FOP+GE,1,reg,mode); |
4031 case FOP+GE: | 4042 case FOP+GE: |
4032 return drexpr0(e2,e1,l1,FOP+GT,0,reg,mode); | 4043 return drexpr0(e2,e1,l1,FOP+GT,1,reg,mode); |
4033 case FOP+EQ: | 4044 case FOP+EQ: |
4034 op=FOP+NEQ; break; | 4045 op=FOP+NEQ; break; |
4035 case FOP+NEQ: | 4046 case FOP+NEQ: |
4036 op=FOP+EQ; break; | 4047 op=FOP+EQ; break; |
4037 case DOP+GT: | 4048 case DOP+GT: |
4038 return drexpr0(e2,e1,l1,DOP+GE,0,reg,mode); | 4049 return drexpr0(e2,e1,l1,DOP+GE,1,reg,mode); |
4039 case DOP+GE: | 4050 case DOP+GE: |
4040 return drexpr0(e2,e1,l1,DOP+GT,0,reg,mode); | 4051 return drexpr0(e2,e1,l1,DOP+GT,1,reg,mode); |
4041 case DOP+EQ: | 4052 case DOP+EQ: |
4042 op=DOP+NEQ; break; | 4053 op=DOP+NEQ; break; |
4043 case DOP+NEQ: | 4054 case DOP+NEQ: |
4044 op=DOP+EQ; break; | 4055 op=DOP+EQ; break; |
4045 default: return 0; | 4056 default: return 0; |
4046 } | 4057 } |
4047 } | 4058 } |
4048 s = "b"; | 4059 s = "a"; |
4049 int cmp = FCMP; | 4060 int cmp = FCMP; |
4050 switch(op) { | 4061 switch(op) { |
4051 case DOP+GE: | 4062 case DOP+GE: |
4052 cmp = DCMP; | 4063 cmp = DCMP; |
4053 case FOP+GE: | 4064 case FOP+GE: |
4054 g_expr(list3(cmp,e1,e2)); | 4065 g_expr(list3(cmp,e1,e2)); |
4055 s = "be"; | 4066 s = "ae"; |
4056 break; | 4067 break; |
4057 case DOP+GT: | 4068 case DOP+GT: |
4058 cmp = DCMP; | 4069 cmp = DCMP; |
4059 case FOP+GT: | 4070 case FOP+GT: |
4060 g_expr(list3(cmp,e1,e2)); | 4071 g_expr(list3(cmp,e1,e2)); |
4086 } | 4097 } |
4087 | 4098 |
4088 int | 4099 int |
4089 drexpr(int e1, int e2,int l1, int op,int cond) | 4100 drexpr(int e1, int e2,int l1, int op,int cond) |
4090 { | 4101 { |
4091 drexpr0(e1, e2,l1, op,!cond,USE_CREG,COND_BRANCH); | 4102 drexpr0(e1, e2,l1, op,cond,USE_CREG,COND_BRANCH); |
4092 return l1; | 4103 return l1; |
4093 } | 4104 } |
4094 | 4105 |
4095 static int | 4106 static int |
4096 drexpr_bool(int e1, int reg) | 4107 drexpr_bool(int e1, int reg) |
4097 { | 4108 { |
4098 return drexpr0(cadr(e1), caddr(e1),0, car(e1),0,reg,COND_VALUE); | 4109 return drexpr0(cadr(e1), caddr(e1),0, car(e1),1,reg,COND_VALUE); |
4099 } | 4110 } |
4100 | 4111 |
4101 | 4112 |
4102 void | 4113 void |
4103 code_dregister(int e2,int freg,int d) | 4114 code_dregister(int e2,int freg,int d) |
4445 printf("\tcvtsi2sdq %s,%s\n",f,fregister_name(freg)); | 4456 printf("\tcvtsi2sdq %s,%s\n",f,fregister_name(freg)); |
4446 } | 4457 } |
4447 | 4458 |
4448 void code_ll2f(int reg) | 4459 void code_ll2f(int reg) |
4449 { | 4460 { |
4461 use_longlong(reg); | |
4462 char *f = register_name(reg,0); | |
4463 set_freg(get_dregister(1),0); | |
4464 printf("\tcvtsi2ssq %s,%s\n",f,fregister_name(freg)); | |
4465 } | |
4466 | |
4467 void code_ull2d(int reg) | |
4468 { | |
4450 code_ll2d(reg); | 4469 code_ll2d(reg); |
4451 } | 4470 } |
4452 | 4471 |
4453 void code_ull2d(int reg) | |
4454 { | |
4455 code_ll2d(reg); | |
4456 } | |
4457 | |
4458 void code_ull2f(int reg) | 4472 void code_ull2f(int reg) |
4459 { | 4473 { |
4460 code_ll2d(reg); | 4474 code_ll2f(reg); |
4461 } | 4475 } |
4462 | 4476 |
4463 #endif | 4477 #endif |
4464 | 4478 |
4465 | 4479 |
4525 | 4539 |
4526 void | 4540 void |
4527 code_register_lassop(int reg,int op) { | 4541 code_register_lassop(int reg,int op) { |
4528 use_longlong(reg); | 4542 use_longlong(reg); |
4529 int xreg = emit_lpop(); | 4543 int xreg = emit_lpop(); |
4530 ltosop(op,xreg,reg); | 4544 ltosop(op,reg,xreg); |
4531 emit_lpop_free(xreg); | 4545 emit_lpop_free(xreg); |
4532 } | 4546 } |
4533 | 4547 |
4534 | 4548 |
4535 #endif | 4549 #endif |