changeset 227:ed92cef127f1

*** empty log message ***
author kono
date Tue, 27 Apr 2004 18:32:28 +0900
parents a31e1d24c097
children 21b311266011
files Changes mc-code-powerpc.c test/code-gen.c
diffstat 3 files changed, 124 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Tue Apr 27 10:32:32 2004 +0900
+++ b/Changes	Tue Apr 27 18:32:28 2004 +0900
@@ -4056,3 +4056,6 @@
 まぁ、ia32 は、eax,edx にlong,long を積んで、あとは、
 対メモリで計算するわけね。そうだろうな。むしろ、
 やさしいかも。
+
+あぁ、そうか、long の引数の渡し方は、
+r10 はレジスタ、残りはメモリに入るわけね。
--- a/mc-code-powerpc.c	Tue Apr 27 10:32:32 2004 +0900
+++ b/mc-code-powerpc.c	Tue Apr 27 18:32:28 2004 +0900
@@ -696,10 +696,10 @@
     ll = get_lregister0();
     if (i!=-1) {
 	if (is_code) {
-	    if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0;
+	    if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
 	    i = REG_VAR_BASE-i;
 	} else {
-	    if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0;
+	    if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
 	    i = i+MIN_TMP_REG;
 	}
 	regv_h(ll)=i;
@@ -1691,8 +1691,16 @@
 	    nargs ++ ; reg_arg++;
 	    continue;
 	} else if (t==LONGLONG||t==ULONGLONG) {
-	    if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) { 
+	    if (reg_arg>=MAX_INPUT_REGISTER_VAR) { 
 		arg = list2(LVAR,caller_arg_offset_v(nargs));
+	    } else if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) { 
+		// half register, half memory case
+		// put whole long long anyway
+		arg = list2(LVAR,caller_arg_offset_v(nargs));
+		arg_assign = list2(
+		    assign_expr0(get_input_register_var(reg_arg,0,0),
+			arg,INT,INT),
+		    arg_assign);
 	    } else if (!simple_args(e3) && cadr(e3)) {
 		arg = get_lregister_var(0); 
 		arg_assign = list2(
@@ -3186,8 +3194,8 @@
     switch(op) {
 	case DOP+GE:
 	case FOP+GE:
-	    printf("\tcror 2,29,30\n");
-	    printf("\tbne\tcr0,L_%d\n",l1);
+	    printf("\tcrnor 30,29,30\n");
+	    printf("\tbeq\tcr0,L_%d\n",l1);
 	    break;
 	case DOP+GT:
 	case FOP+GT:
@@ -3243,7 +3251,14 @@
 static void
 lmove(int to,int from)
 {
-    if (regv_h(to)==regv_l(from)) {
+    int tmp;
+    if (regv_h(to)==regv_l(from)&&(regv_l(to)==regv_h(from))) {
+	tmp = get_register();
+	printf("\tmr %s,%s\n",lregister_name_low(tmp),lregister_name_low(from));
+	printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
+	printf("\tmr %s,%s\n",lregister_name_low(to),register_name(tmp));
+	free_register(tmp);
+    } else if (regv_h(to)==regv_l(from)) {
 	printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
 	printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
     } else {
--- a/test/code-gen.c	Tue Apr 27 10:32:32 2004 +0900
+++ b/test/code-gen.c	Tue Apr 27 18:32:28 2004 +0900
@@ -250,7 +250,8 @@
 
 // code_gt(int cond) 
 
-void code_gt()
+void
+code_gt()
 {
     if (i1>i2)
 	printf("code_gt 1\n");
@@ -259,7 +260,8 @@
 }
 
 // code_ugt(int cond) 
-void code_ugt()
+void
+code_ugt()
 {
     if (ui1>ui2)
 	printf("code_ugt 1\n");
@@ -268,7 +270,8 @@
 }
 
 // code_ge(int cond) 
-void code_ge()
+void
+code_ge()
 {
     if (i1>=i2)
 	printf("code_ge 1\n");
@@ -277,7 +280,8 @@
 }
 
 // code_uge(int cond) 
-void code_uge()
+void
+code_uge()
 {
     if (ui1>=ui2)
 	printf("code_uge 1\n");
@@ -286,7 +290,8 @@
 }
 
 // code_eq(int cond) 
-void code_eq()
+void
+code_eq()
 {
     if (ui1==ui2)
 	printf("code_eq 1\n");
@@ -303,18 +308,10 @@
 void
 code_bool()
 {
-    printf("code_bool %d %d %d %d %d %d\n",
+    printf("code_bool gvar %d %d %d %d %d %d\n",
 	i1>i2,ui1>ui2,i1>=i2,ui1>=ui2,ui1==ui2,i1!=i2);
-#if FLOAT_CODE
-    printf("code_bool float %d %d %d %d\n",
-	f0>f1,f0>=f1,f0==f1,f0!=f1);
-    printf("code_bool double %d %d %d %d\n",
-	d0>d1,d0>=d1,d0==d1,d0!=d1);
-#endif
-#if LONGLONG_CODE
-    printf("code_bool long long %d %d %d %d %d %d\n",
-	l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0);
-#endif
+    printf("code_bool gvar %d %d %d %d %d %d\n",
+	i1<i2,ui1<ui2,i1<=i2,ui1<=ui2,ui1==ui2,i1!=i2);
 }
 
 void
@@ -492,6 +489,7 @@
     pi2 = &i2;
     pui1 = &ui1;
     pui2 = &ui2;
+    printf("code_lrindirect %llx %llx %llx %llx\n",*pi1,*pi2,*pui1,*pui2);
     printf("code_lrindirect %lld %lld %llu %llu\n",*pi1,*pi2,*pui1,*pui2);
 }
 
@@ -792,7 +790,8 @@
 }
 
 // code_d2i(int freg0)
-void code_d2i()
+void
+code_d2i()
 {
     double d;
     int i;
@@ -801,7 +800,8 @@
     printf("code_d2i %d\n",i);
 }
 // code_i2d(int creg0)
-void code_i2d()
+void
+code_i2d()
 {
     double d;
     int i;
@@ -810,7 +810,8 @@
     printf("code_i2d %g\n",d);
 }
 // code_d2u(int freg0)
-void code_d2u()
+void
+code_d2u()
 {
     double d;
     unsigned int i;
@@ -819,7 +820,8 @@
     printf("code_d2u %ud\n",i);
 }
 // code_u2d(int creg0)
-void code_u2d()
+void
+code_u2d()
 {
     double d;
     unsigned int i;
@@ -828,7 +830,8 @@
     printf("code_u2d %g\n",d);
 }
 // code_f2i(int freg0)
-void code_f2i()
+void
+code_f2i()
 {
     float d;
     int i;
@@ -837,7 +840,8 @@
     printf("code_d2i %d\n",i);
 }
 // code_i2f(int creg0)
-void code_i2f()
+void
+code_i2f()
 {
     float d;
     int i;
@@ -846,7 +850,8 @@
     printf("code_i2f %g\n",d);
 }
 // code_f2u(int freg0)
-void code_f2u()
+void
+code_f2u()
 {
     float d;
     unsigned int i;
@@ -855,7 +860,8 @@
     printf("code_f2u %ud\n",i);
 }
 // code_u2f(int creg0)
-void code_u2f()
+void
+code_u2f()
 {
     float d;
     unsigned int i;
@@ -886,6 +892,14 @@
     f0 = 0.0; f1 = 0.2;
     d0 = 10; d1 = 10e10;
     printf("code_lvar float %f %f %g %g\n",f0,f1,d0,d1);
+    printf("code_bool lvar float %d %d %d %d\n",
+	f0>f1,f0>=f1,f0==f1,f0!=f1);
+    printf("code_bool lvar double %d %d %d %d\n",
+	d0>d1,d0>=d1,d0==d1,d0!=d1);
+    printf("code_bool lvar float %d %d %d %d\n",
+	f0<f1,f0<=f1,f0==f1,f0!=f1);
+    printf("code_bool lvar double %d %d %d %d\n",
+	d0<d1,d0<=d1,d0==d1,d0!=d1);
 }
 
 
@@ -1005,7 +1019,8 @@
 // 	case FOP+NEQ:
 // code_gt(int cond) 
 
-void code_dgt()
+void
+code_dgt()
 {
     if (d0>d1)
 	printf("code_gt 1\n");
@@ -1014,7 +1029,8 @@
 }
 
 // code_ugt(int cond) 
-void code_fgt()
+void
+code_fgt()
 {
     if (f0>f1)
 	printf("code_fgt 1\n");
@@ -1023,7 +1039,8 @@
 }
 
 // code_ge(int cond) 
-void code_dge()
+void
+code_dge()
 {
     if (d0>=d1)
 	printf("code_dge 1\n");
@@ -1032,7 +1049,8 @@
 }
 
 // code_uge(int cond) 
-void code_fge()
+void
+code_fge()
 {
     if (f0>=f1)
 	printf("code_fge 1\n");
@@ -1041,7 +1059,8 @@
 }
 
 // code_eq(int cond) 
-void code_deq()
+void
+code_deq()
 {
     if (f0==f1)
 	printf("code_feq 1\n");
@@ -1062,6 +1081,10 @@
 	f0>f1,f0>=f1,f0==f1,f0!=f1);
     printf("code_bool double %d %d %d %d\n",
 	d0>d1,d0>=d1,d0==d1,d0!=d1);
+    printf("code_bool float %d %d %d %d\n",
+	f0<f1,f0<=f1,f0==f1,f0!=f1);
+    printf("code_bool double %d %d %d %d\n",
+	d0<d1,d0<=d1,d0==d1,d0!=d1);
 }
 #endif
 
@@ -1073,6 +1096,8 @@
 {
     printf("code_bool long long %d %d %d %d %d %d\n",
 	l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0);
+    printf("code_bool long long %d %d %d %d %d %d\n",
+	l1<l0,ul1<ul0,l1<=l0,ul1<=ul0,ul1==ul0,l1!=l0);
 }
 
 // int lpop_register()
@@ -1189,6 +1214,10 @@
     ul0 = 123123123LL;
     ul1 = 123123123LL;
     printf("code_lvar long long %lld %lld %llu %llu\n",l0,l1,ul0,ul1);
+    printf("code_bool lvar long long %d %d %d %d %d %d\n",
+	l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0);
+    printf("code_bool lvar long long %d %d %d %d %d %d\n",
+	l1<l0,ul1<ul0,l1<=l0,ul1<=ul0,ul1==ul0,l1!=l0);
 }
 
 // ltosop(int e1,int e2)
@@ -1343,7 +1372,8 @@
 
 
 // code_i2ll(int creg)
-void code_i2ll()
+void
+code_i2ll()
 {
     long long d;
     int i;
@@ -1352,7 +1382,8 @@
     printf("code_i2ll %lld\n",d);
 }
 // code_i2ull(int creg)
-void code_i2ull()
+void
+code_i2ull()
 {
     unsigned long long d;
     int i;
@@ -1361,7 +1392,8 @@
     printf("code_i2ull %lld\n",d);
 }
 // code_u2ll(int creg)
-void code_u2ll()
+void
+code_u2ll()
 {
     long long d;
     unsigned int i;
@@ -1370,7 +1402,8 @@
     printf("code_u2ll %lld\n",d);
 }
 // code_u2ull(int creg)
-void code_u2ull()
+void
+code_u2ull()
 {
     unsigned long long d;
     unsigned int i;
@@ -1379,7 +1412,8 @@
     printf("code_u2ull %llu\n",d);
 }
 // code_ll2i(int creg)
-void code_ll2i()
+void
+code_ll2i()
 {
     long long d;
     int i;
@@ -1388,7 +1422,8 @@
     printf("code_ll2i %d\n",i);
 }
 // code_ll2u(int creg)
-void code_ll2u()
+void
+code_ll2u()
 {
     long long d;
     unsigned int i;
@@ -1397,7 +1432,8 @@
     printf("code_ll2i %ud\n",i);
 }
 // code_ull2i(int creg)
-void code_ull2i()
+void
+code_ull2i()
 {
     unsigned long long d;
     int i;
@@ -1406,7 +1442,8 @@
     printf("code_ull2i %d\n",i);
 }
 // code_ull2u(int creg)
-void code_ull2u()
+void
+code_ull2u()
 {
     unsigned long long d;
     unsigned int i;
@@ -1416,7 +1453,8 @@
 }
 #if FLOAT_CODE
 // code_d2ll(int creg)
-void code_d2ll()
+void
+code_d2ll()
 {
     long long d;
     double i;
@@ -1425,7 +1463,8 @@
     printf("code_d2ll %lld\n",d);
 }
 // code_d2ull(int creg)
-void code_d2ull()
+void
+code_d2ull()
 {
     unsigned long long d;
     double i;
@@ -1434,7 +1473,8 @@
     printf("code_d2ll %llu\n",d);
 }
 // code_f2ll(int creg)
-void code_f2ll()
+void
+code_f2ll()
 {
     long long d;
     float i;
@@ -1443,7 +1483,8 @@
     printf("code_d2ll %lld\n",d);
 }
 // code_f2ull(int creg)
-void code_f2ull()
+void
+code_f2ull()
 {
     unsigned long long d;
     float i;
@@ -1452,7 +1493,8 @@
     printf("code_d2ll %llu\n",d);
 }
 // code_ll2d(int creg)
-void code_ll2d()
+void
+code_ll2d()
 {
     long long d;
     double i;
@@ -1461,7 +1503,8 @@
     printf("code_d2ll %g\n",i);
 }
 // code_ll2f(int creg)
-void code_ll2f()
+void
+code_ll2f()
 {
     long long d;
     float i;
@@ -1470,7 +1513,8 @@
     printf("code_d2ll %g\n",i);
 }
 // code_ull2d(int creg)
-void code_ull2d()
+void
+code_ull2d()
 {
     long long d;
     double i;
@@ -1479,7 +1523,8 @@
     printf("code_d2ll %g\n",i);
 }
 // code_ull2f(int creg)
-void code_ull2f()
+void
+code_ull2f()
 {
     long long d;
     float i;
@@ -1625,7 +1670,8 @@
 
 // code_lgt(int cond) 
 
-void code_lgt()
+void
+code_lgt()
 {
     if (l0>l1)
 	printf("code_lgt 1\n");
@@ -1634,7 +1680,8 @@
 }
 
 // code_lugt(int cond) 
-void code_lugt()
+void
+code_lugt()
 {
     if (ul0>ul1)
 	printf("code_lugt 1\n");
@@ -1643,7 +1690,8 @@
 }
 
 // code_lge(int cond) 
-void code_lge()
+void
+code_lge()
 {
     if (l0>=l1)
 	printf("code_lge 1\n");
@@ -1652,7 +1700,8 @@
 }
 
 // code_luge(int cond) 
-void code_luge()
+void
+code_luge()
 {
     if (ul0>=ul1)
 	printf("code_luge 1\n");
@@ -1661,7 +1710,8 @@
 }
 
 // code_leq(int cond) 
-void code_leq()
+void
+code_leq()
 {
     if (ul0==ul1)
 	printf("code_leq 1\n");