changeset 419:5fafb50df9d4

fix mips memmove
author kono
date Wed, 27 Oct 2004 09:04:07 +0900
parents c73f013d07d7
children efbd420386c5
files Changes mc-code-arm.c mc-code-mips.c mc-codegen.c
diffstat 4 files changed, 39 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Oct 25 19:16:17 2004 +0900
+++ b/Changes	Wed Oct 27 09:04:07 2004 +0900
@@ -6263,3 +6263,27 @@
 してしまうらしい。goto 時に。で、戻ったときにerrorとなる。
 register は全部、save するので、差はわかっているので、それを
 足せば良いだけだけどね。(これ、前もやったな...)
+
+Mon Oct 25 19:36:16 JST 2004
+
+なんか、できた。
+
+まだ、レジスタ分のオフセットがcode_segmentで取られるのは直してない。
+ARM の bit field の穴塞ぎもね。
+
+あとは、
+       inline
+       CbC2C
+       C2CbC
+だけだね。
+
+Wed Oct 27 08:48:37 JST 2004
+
+MIPSのallocaは、$spを移動するので、j の後の、code segement の
+        lw      $gp,$L_41($sp)
+はまずい。が、通常は、
+        lw      $gp,$L_41($fp)
+が出る。だから、alloca で$gpを移動する必要はない。しかし、code_segment
+で alloca は使えない。$gp をswしなおせば?
+
+
--- a/mc-code-arm.c	Mon Oct 25 19:16:17 2004 +0900
+++ b/mc-code-arm.c	Wed Oct 27 09:04:07 2004 +0900
@@ -1895,7 +1895,6 @@
     char *frn;
     char *trn;
     char *drn;
-    int fix = 0;
     char *memmove = "memmove";
     int dreg = REG_ip; 
 
@@ -1947,12 +1946,11 @@
 	code_save_stacks();
 	parallel_rassign(list3(1,list3(2,0,from),to));
 	code_const(length>0?length:-length,3);
-        /* overrap must be allowed */
+        /* overlap must be allowed */
 	inc_inst(1);
 	// offset have to be ignored */
 	printf("\tbl\t%s\n",memmove);
 	extern_define(memmove,0,FUNCTION,1);
-        fix=0;
 	set_ireg(RET_REGISTER,0);
 	if (creg!=to) {
 	    free_register(to); to = creg;
@@ -1963,7 +1961,6 @@
     /* creg must point top of the destination data */
     /* this code is necessary for the value of assignment or function call */
     /* otherwise we don't need this */
-	if (fix) code_add(to,fix,to);
 	if(creg!=to) {
 	    free_register(creg); creg=to; ireg=to;
 	}
--- a/mc-code-mips.c	Mon Oct 25 19:16:17 2004 +0900
+++ b/mc-code-mips.c	Wed Oct 27 09:04:07 2004 +0900
@@ -365,6 +365,8 @@
 	round16(max_func_args*SIZE_OF_INT),
 	0
 );
+#endif
+#if 0
     printf("# mask_label $L_%d=0x%x\n",mask_label,code_mask());
     printf("# mask_offset$L_%d=%d\n",mask_offset_label,code_mask_offset());
     printf("# fmask_label $L_%d=0x%x\n",fmask_label,code_fmask());
@@ -1535,7 +1537,6 @@
     char *frn;
     char *trn;
     char *drn;
-    int fix = 0;
     char *memmove = "memmove";
     int dreg = get_register(); if (!dreg) error(-1);
 
@@ -1587,9 +1588,14 @@
 	// offset should not be used
 	printf("\tmove $4,%s\n",trn);
         /* overrap must be allowed */
-	printf("\tjal %s\n",memmove);
+	if (fnptr->sc==CODE) {
+	    printf("\tla\t$25,%s\n",memmove);
+	    printf("\tjalr\t$25\n");
+	    printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label);
+	} else {
+	    printf("\tjal %s\n",memmove);
+	}
 	extern_define(memmove,0,FUNCTION,1);
-        fix=0;
 	set_ireg(RET_REGISTER,0);
 	if (creg!=to) {
 	    free_register(to); to = creg;
@@ -1600,7 +1606,6 @@
     /* creg must point top of the destination data */
     /* this code is necessary for the value of assignment or function call */
     /* otherwise we don't need this */
-	if (fix) printf("\taddu %s,%s,%d\n",trn,trn,fix);
 	if(creg!=to) {
 	    free_register(creg); creg=to; ireg=to;
 	}
@@ -2270,17 +2275,16 @@
 void
 code_alloca(int e1,int reg)
 {
-    char *crn,*grn;
-    int g;
+    char *crn;
   
     g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); 
     use_int(reg);
-    g = get_register();
     crn = register_name(reg);
-    grn = register_name(g);
     printf("\tsubu $sp,$sp,%s\n",crn);
     printf("\taddu %s,$sp,$L_%d\n",crn,cprestore_label);
-    free_register(g);
+    if (fnptr->sc==CODE) {
+	printf("\tsw\t$gp,$L_%d($sp)\n",cprestore_label);
+    }
 }
 
 void
--- a/mc-codegen.c	Mon Oct 25 19:16:17 2004 +0900
+++ b/mc-codegen.c	Wed Oct 27 09:04:07 2004 +0900
@@ -854,7 +854,7 @@
 /*     source (after) list2(tag,disp)                       */
 /* source list    list3(e,cdr,sz)                           */
 
-#define DEBUG_PARALLEL_ASSIGN 2
+#define DEBUG_PARALLEL_ASSIGN 0
 
 static int
 overlap(int t,int sz,int source)