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