changeset 226:a31e1d24c097

*** empty log message ***
author kono
date Tue, 27 Apr 2004 10:32:32 +0900
parents 8675ea3d2c7f
children ed92cef127f1
files Changes mc-code-powerpc.c
diffstat 2 files changed, 28 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Apr 26 14:07:43 2004 +0900
+++ b/Changes	Tue Apr 27 10:32:32 2004 +0900
@@ -4052,3 +4052,7 @@
 構造体の戻値を持つ場合に、引数がないとうまくいかない。
 
 #include "" は、今読んでいるファイルのcurrent directry も探す。
+
+まぁ、ia32 は、eax,edx にlong,long を積んで、あとは、
+対メモリで計算するわけね。そうだろうな。むしろ、
+やさしいかも。
--- a/mc-code-powerpc.c	Mon Apr 26 14:07:43 2004 +0900
+++ b/mc-code-powerpc.c	Tue Apr 27 10:32:32 2004 +0900
@@ -155,7 +155,7 @@
     int i = creg;
     if (!is_longlong_reg(i)) {
 	if (ireg) { free_register(ireg); ireg=0; }
-	if (!lreg) lreg = get_lregister();
+	if (!lreg||!regs[lreg]) lreg = get_lregister();
 	// else if (lreg!=i) free_register(i);
 	i = lreg;
     }
@@ -671,8 +671,8 @@
     if (is_longlong_reg(i)) {
 	regs[regv_l(i)]=0;
 	regs[regv_h(i)]=0;
-	regv_l(i)=0;
-	regv_h(i)=0;
+	//regv_l(i)=0;
+	//regv_h(i)=0;
     }
 }
 
@@ -771,7 +771,11 @@
     int i;
 // printf("# free_all register\n");
 #if LONGLONG_CODE
-    for(i=0;i<REAL_MAX_LREGISTER;i++) { regs[i+LREG_OFFSET]=0; }
+    for(i=0;i<REAL_MAX_LREGISTER;i++) {
+	regs[i+LREG_OFFSET]=0; 
+	regv_l(i+LREG_OFFSET) = 0;
+	regv_h(i+LREG_OFFSET) = 0;
+    }
     lreg = 0;
     // set_lreg(LREG_LREGISTER,0);
 #endif
@@ -1504,16 +1508,16 @@
     }
     if (!is_longlong_reg(reg)) error(-1);
     if (reg!=creg) {
-	free_register(creg);
 	if (lreg && reg!=lreg) {
-	    free_register(lreg);
 	    if (mode) {
 		printf("\tmr %s,%s\n",
 		    lregister_name_low(reg),lregister_name_low(lreg));
 		printf("\tmr %s,%s\n",
 		    lregister_name_high(reg),lregister_name_high(lreg));
 	    }
+	    free_register(lreg);
 	}
+	free_register(creg);
 	regs[reg]=USING_REG;
 	clear_ptr_cache_reg(regv_l(reg));
 	regs[regv_l(reg)]=USING_REG;
@@ -3239,8 +3243,13 @@
 static void
 lmove(int to,int from)
 {
-    printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
-    printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
+    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 {
+	printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
+	printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
+    }
 }
 
 static void
@@ -3373,8 +3382,13 @@
     crn_h = lregister_name_high(creg);
     crn_l = lregister_name_low(creg);
 
-    printf("\tstw %s,0(%s)\n",crn_h,drn);
-    printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn);
+    if (e2==regv_h(creg)) {
+	printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn);
+	printf("\tstw %s,0(%s)\n",crn_h,drn);
+    } else {
+	printf("\tstw %s,0(%s)\n",crn_h,drn);
+	printf("\tstw %s,%d(%s)\n",crn_l,size_of_int,drn);
+    }
 }
 
 void