changeset 402:cda558feec30

ARM continue..
author kono
date Sun, 17 Oct 2004 00:04:48 +0900
parents d621a113b0ca
children 562d76edddee
files .gdbinit Changes mc-code-arm.c
diffstat 3 files changed, 48 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/.gdbinit	Sat Oct 16 20:45:54 2004 +0900
+++ b/.gdbinit	Sun Oct 17 00:04:48 2004 +0900
@@ -6,8 +6,8 @@
 # run  -s -ob01.s mc-switch.c
 # run  -s l.c
 # run  -s test/const.c
-run  -s test/basic.c
-# run -s test/code-gen-all.c
+# run  -s test/basic.c
+run -s test/code-gen-all.c
 define regs 
 printf "pc =%08x lr =%08x r0 =%08x r1 =%08x r3= %08x r4= %08x\n",$pc,$lr,$r0,$r1,$r3,$r4
 printf "r10=%08x r11=%08x r12=%08x r13=%08x r14=%08x r15=%08x\n",$r10,$r11,$r12,$r13,$r14,$r15
--- a/Changes	Sat Oct 16 20:45:54 2004 +0900
+++ b/Changes	Sun Oct 17 00:04:48 2004 +0900
@@ -6066,3 +6066,39 @@
 
 cmf f4,#0が、f4 が初期化されてないと落ちるみたい。illigal instruction
 っていうけど、 f4 の値によるのか?
+
+fdecl_struct(int fntype)
+{
+   ...
+        mode=ADECL;
+            args = 0;
+            def(&str_ret);
+            struct_return = list3(list2(LVAR,str_ret.dsp),sz,type);
+            caddr(fnptr->ty) = glist2(POINTER,caddr(fnptr->ty));
+
+なんだけど、これって save_input_register されてLVARになるわけ
+だよね。def した時にはレジスタに割り当てられる可能性もあるよね。
+そういうことはないのか。
+
+で、mc-parse.c で、
+    if (struct_return) {
+       ...
+                gexpr(list4(STASS,rvalue(car(struct_return)),e,e1),0);
+
+ってなるわけだよね。
+
+で、mc-code-arm.c では、引数のdspが変更されるからだめなわけね。(スタック
+に割り当てられてないから)
+
+だから、struct_return を save_input_register で修正する必要がある。
+
+ARMでは、register割り当て分がstackに取られてないので、struct_push
+で、その分をregister にcopyしないとだめ。でも、そうすると、受け側
+はどうするの?
+        mov     ip, sp
+        sub     sp, sp, #8
+        stmfd   sp!, {r4, r5, fp, ip, lr, pc}
+        sub     fp, ip, #12
+        sub     sp, sp, #96
+あ、こんなことやってるし〜
+
--- a/mc-code-arm.c	Sat Oct 16 20:45:54 2004 +0900
+++ b/mc-code-arm.c	Sun Oct 17 00:04:48 2004 +0900
@@ -1653,7 +1653,7 @@
     int xreg;
     if (car(e2)==REGISTER) {
 	use_int(reg);
-	code_add(reg,dir,cadr(e2));
+	code_add(cadr(e2),dir,cadr(e2));
 	if (reg!=cadr(e2))
 	    code_register(cadr(e2),reg);
 	return;
@@ -1681,7 +1681,7 @@
     if (car(e2)==REGISTER) {
 	use_int(reg);
 	code_register(cadr(e2),reg);
-	code_add(reg,dir,reg);
+	code_add(cadr(e2),dir,cadr(e2));
 	return;
     } 
     g_expr(e2);
@@ -1914,8 +1914,8 @@
 	}
 	clear_ptr_cache();
 	code_save_stacks();
-	code_register(from,1);
-	code_register(to,2);
+	code_register(from,2);
+	code_register(to,1);
 	code_const(length,3);
         /* overrap must be allowed */
 	inc_inst(1);
@@ -2132,13 +2132,17 @@
 	if (!n||n==&null_nptr) error(REG_ERR);
 	if (tag==REGISTER) {
 	    /* regs[reg]==INPUT_REG case should be considered */
-	    n->dsp = new_lvar(SIZE_OF_INT); n->sc  = LVAR;
+	    if (struct_return && !cadr(args)) {
+		cadr(car(struct_return)) = n->dsp = new_lvar(SIZE_OF_INT);
+	    } else {
+		n->dsp = new_lvar(SIZE_OF_INT);
+	    }
 	    offset+=SIZE_OF_INT;
 	    t = INT;
 	    reg_var++;
 	} else if (tag==LREGISTER) {
 	    /* regs[reg]==INPUT_REG case should be considered */
-	    n->dsp = new_lvar(SIZE_OF_LONGLONG); n->sc  = LVAR;
+	    n->dsp = new_lvar(SIZE_OF_LONGLONG);
 	    // t = n->ty;
 	    t = LONGLONG;
 	    offset+=SIZE_OF_LONGLONG; reg_offset+=2;