Mercurial > hg > CbC > old > device
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;