diff mc-code-powerpc.c @ 577:7e0076617c76

env switch continue..
author kono
date Sun, 15 Jan 2006 18:28:39 +0900 (2006-01-15)
parents 388baa7d4bee
children dbde3b869a0f
line wrap: on
line diff
--- a/mc-code-powerpc.c	Sun Jan 15 12:03:37 2006 +0900
+++ b/mc-code-powerpc.c	Sun Jan 15 18:28:39 2006 +0900
@@ -83,8 +83,8 @@
 static int  lreg_sp;  /* longlong  REGister Stack-Pointer */
 static int lreg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
 
-#define REG_fp   1
-#define REG_sp   30
+#define REG_sp   1
+#define REG_fp   30
 #define REG_VAR_BASE 29
 #define REG_VAR_MIN  18
 #define MIN_TMP_REG 3
@@ -322,6 +322,8 @@
     // int r1_offsetv = -disp+max_func_args*SIZE_OF_INT-reg_save+r1_offset;
     int r1_offsetv = lvar_offsetv-reg_save+12;
     printf(".set L_%d,%d\n",lvar_offset_label,r1_offsetv-lvar_offsetv);
+    if (r1_offsetv-lvar_offsetv > 65000) error(-1);
+	// too large function arguments?
     printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
     if (max_func_arg_label) {
 	printf(".set L_%d,%d\n",max_func_arg_label,max_func_args*SIZE_OF_INT+24);
@@ -1395,7 +1397,7 @@
     printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,retcont,code_base,crn);
 }
 
-#define R1SAVE 1
+#define R1SAVE 0
 
 void
 code_environment(int creg) {
@@ -1404,9 +1406,10 @@
 #if R1SAVE
     printf("\tlwz %s,0(r1)\n",register_name(creg));
 #else
-    int l = 0;
-    printf("\tla %s,",register_name(creg));
-    printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
+    printf("\tmr %s,r30\n",register_name(creg));
+//    int l = 0;
+//    printf("\tla %s,",register_name(creg));
+//    printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
 #endif
 }
 
@@ -2274,6 +2277,11 @@
 #endif
 }
 
+int
+code_frame_pointer_register()
+{
+    return list2(REGISTER,REG_fp);
+}
 
 void
 code_fix_frame_pointer(int disp_offset) {
@@ -2888,7 +2896,11 @@
 void
 leave(int control, char *name)
 {
+#if R1SAVE
     int retcont1=0,sz;
+#else
+    int sz;
+#endif
 
     if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3; 
     reg_save = reg_save_offset();
@@ -2898,13 +2910,16 @@
     }
     if (retcont) { 
 	if (control) jmp(retlabel);
+#if R1SAVE
 	retcont1 = fwdlabel();
+#endif
 	fwddef(retcont);
 	if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
 	    printf("\tfmr f1,f31\n");
 	} else if (cadr(fnptr->ty)>0&&(
 	    car(cadr(fnptr->ty))==STRUCT ||
 	    car(cadr(fnptr->ty))==UNION)) {
+	    // test routine?
 	    sz = size(cadr(fnptr->ty));
 	    printf("\tli r7,%d\n",sz);
 	    printf("\tsubl r6,r7,r30\n");
@@ -2913,17 +2928,23 @@
 	} else if (cadr(fnptr->ty)!=VOID) {
 	    printf("\tmr r3,r29\n");
 	}
-#if !R1SAVE
-	printf("\tla r1,lo16(%d)(r30)\n",
-	    -reg_save+my_func_args*SIZE_OF_INT);
+#if R1SAVE
+	// printf("\tb L_%d\n",retcont1);
+	jmp(retcont1);
+#else
+//	printf("\tla r1,lo16(%d)(r30)\n",
+//	    -reg_save+my_func_args*SIZE_OF_INT);
 #endif
-	printf("\tb L_%d\n",retcont1);
     }
     fwddef(retlabel);
+#if R1SAVE
     printf("\tlwz r1,0(r1)\n");
     if (retcont) {
 	fwddef(retcont1);
     }
+#else
+    printf("\taddi r1,r30,lo16(L_%d)\n",lvar_offset_label);
+#endif
     if (max_freg_var>=0) {
 	printf("\tlmw r%d,%d(r1)\n",
 			REG_VAR_BASE-max_reg_var,reg_save);