# HG changeset patch # User kono # Date 1137320930 -32400 # Node ID dbde3b869a0fb8c9c1783b2da0a832d4e70b611a # Parent 7e0076617c76132efed31690e4e8ecfa0e6574d1 try to remove code_fix_frame_pointer(); PowerPC fixed. diff -r 7e0076617c76 -r dbde3b869a0f Changes --- a/Changes Sun Jan 15 18:28:39 2006 +0900 +++ b/Changes Sun Jan 15 19:28:50 2006 +0900 @@ -8365,6 +8365,10 @@ pointer から計算すれば良いらしい。どうして、R1SAVE することにしたのかは不明。 +function has return value but reached to the end +なんだけど、reachability のcheckが while(1) の +時とかやってないので、結構、うるさい。 + Sun Jan 15 16:06:29 JST 2006 code_fix_frame_pointer って何をやっているのだろう? @@ -8374,5 +8378,15 @@ でさ、env をさっさと計算して get_register_var に入れてしまう のが良いと思う。で、INDIRECT+offset にして代入すれば良い。 - - +PowerPC, IA32 では、disp_offset ==0 には、原理的に出来ない。 +互換性の問題だから。code_segment の code_disp_offset を disp_offset +に合わせることは出来るはず。そうすれば、mc-codegen の方で +disp_offset を見ることはないんじゃないの? + +そもそも、そうでないと parallel assignment がうまく動かない +はずだよね。 + + + + + diff -r 7e0076617c76 -r dbde3b869a0f mc-code-arm.c --- a/mc-code-arm.c Sun Jan 15 18:28:39 2006 +0900 +++ b/mc-code-arm.c Sun Jan 15 19:28:50 2006 +0900 @@ -2725,6 +2725,11 @@ #endif } +int +code_frame_pointer_register() +{ + return list2(REGISTER,REG_fp); +} void code_fix_frame_pointer(int offset) { diff -r 7e0076617c76 -r dbde3b869a0f mc-code-ia32.c --- a/mc-code-ia32.c Sun Jan 15 18:28:39 2006 +0900 +++ b/mc-code-ia32.c Sun Jan 15 19:28:50 2006 +0900 @@ -283,6 +283,7 @@ #define is_int_reg(reg) (reg 65000) error(-1); @@ -360,29 +357,29 @@ if (!large_offset_reg) { if (is_code(fnptr)) { if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("lo16(%d)(r1)\n",CODE_CALLER_ARG); + printf("lo16(%d)(r1)\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET)); } else - printf("lo16(%d)(r30)\n",CODE_LVAR); + printf("lo16(%d)(r30)\n",CODE_LVAR(l)); } else if (l<0) { /* local variable */ - printf("lo16(%d)(r30)\n",FUNC_LVAR); + printf("lo16(%d)(r30)\n",FUNC_LVAR(l)); } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("lo16(%d)(r1)\n",CALLER_ARG); + printf("lo16(%d)(r1)\n",CALLER_ARG(l-ARG_LVAR_OFFSET)); } else { /* callee's arguments */ - printf("lo16(%d+L_%d)(r30)\n",CALLEE_ARG,lvar_offset_label); + printf("lo16(%d+L_%d)(r30)\n",CALLEE_ARG(l),lvar_offset_label); } } else { rn = register_name(large_offset_reg); if (is_code(fnptr)) { if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("lo16(%d)(%s)\n",CODE_CALLER_ARG,rn); + printf("lo16(%d)(%s)\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET),rn); } else - printf("lo16(%d)(%s)\n",CODE_LVAR,rn); + printf("lo16(%d)(%s)\n",CODE_LVAR(l),rn); } else if (l<0) { /* local variable */ - printf("lo16(%d)(%s)\n",FUNC_LVAR,rn); + printf("lo16(%d)(%s)\n",FUNC_LVAR(l),rn); } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("lo16(%d)(%s)\n",CALLER_ARG,rn); + printf("lo16(%d)(%s)\n",CALLER_ARG(l-ARG_LVAR_OFFSET),rn); } else { /* callee's arguments */ - printf("lo16(%d+L_%d)(%s)\n",CALLEE_ARG,lvar_offset_label,rn); + printf("lo16(%d+L_%d)(%s)\n",CALLEE_ARG(l),lvar_offset_label,rn); } free_register(large_offset_reg); } @@ -404,31 +401,32 @@ large_offset_reg=0; if (is_code(fnptr)) { if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - if (LARGE_OFFSET(CODE_CALLER_ARG)) { + if (LARGE_OFFSET(CODE_CALLER_ARG(l-ARG_LVAR_OFFSET))) { rn=register_name(large_offset_reg=get_register()); - printf("\taddis %s,r1,ha16(%d)\n",rn,CODE_CALLER_ARG); + printf("\taddis %s,r1,ha16(%d)\n",rn, + CODE_CALLER_ARG(l-ARG_LVAR_OFFSET)); } } else { - if (LARGE_OFFSET(CODE_LVAR)) { + if (LARGE_OFFSET(CODE_LVAR(l))) { rn=register_name(large_offset_reg=get_register()); - printf("\taddis %s,r30,ha16(%d)\n",rn,CODE_LVAR); + printf("\taddis %s,r30,ha16(%d)\n",rn,CODE_LVAR(l)); } } } else if (l<0) { /* local variable */ - if (LARGE_OFFSET(FUNC_LVAR)) { + if (LARGE_OFFSET(FUNC_LVAR(l))) { rn=register_name(large_offset_reg=get_register()); - printf("\taddis %s,r30,ha16(%d)\n",rn,FUNC_LVAR); + printf("\taddis %s,r30,ha16(%d)\n",rn,FUNC_LVAR(l)); } } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - if (LARGE_OFFSET(CALLER_ARG)) { + if (LARGE_OFFSET(CALLER_ARG(l-ARG_LVAR_OFFSET))) { rn=register_name(large_offset_reg=get_register()); - printf("\taddis %s,r1,ha16(%d)\n",rn,CALLER_ARG); + printf("\taddis %s,r1,ha16(%d)\n",rn,CALLER_ARG(l-ARG_LVAR_OFFSET)); } } else { /* callee's arguments */ - if (LARGE_OFFSET(CALLEE_ARG)) { + if (LARGE_OFFSET(CALLEE_ARG(l))) { rn=register_name(large_offset_reg=get_register()); printf("\taddis %s,r30,lo16(%d+L_%d)\n", - rn,CALLEE_ARG,lvar_offset_label); + rn,CALLEE_ARG(l),lvar_offset_label); } } } @@ -1862,11 +1860,7 @@ return !contains_p(e3,not_simple_p); } -int -caller_arg_offset_v(int arg) -{ - return ARG_LVAR_OFFSET+arg*SIZE_OF_INT; -} +#define caller_arg_offset_v(arg) (ARG_LVAR_OFFSET+(arg)*SIZE_OF_INT) void use_input_reg(int reg,int mode) @@ -2285,9 +2279,10 @@ void code_fix_frame_pointer(int disp_offset) { - int l = 0; +#if 0 printf("\tla r30,"); - printf("lo16(%d)(r30)\n",FUNC_LVAR); + printf("lo16(%d)(r30)\n",FUNC_LVAR(0)-CODE_LVAR(0)); +#endif } void @@ -2817,7 +2812,7 @@ { int r1_offsetv; disp&= -SIZE_OF_INT; - r1_offsetv = -disp+max_func_args*SIZE_OF_INT +code_disp_offset +8+32; + r1_offsetv = -disp+max_func_args*SIZE_OF_INT -code_disp_offset0 +8+32; printf(".set L_%d,%d\n",code_disp_label,-r1_offsetv); if (max_func_arg_label) { diff -r 7e0076617c76 -r dbde3b869a0f mc-codegen.c --- a/mc-codegen.c Sun Jan 15 18:28:39 2006 +0900 +++ b/mc-codegen.c Sun Jan 15 19:28:50 2006 +0900 @@ -1425,7 +1425,7 @@ if(car(t0)==LVAR) { /* ここで、書込先アドレスを決める */ if (envreg) error(-1); - cadr(t0)=-arg_size; + cadr(t0)=-arg_size; // disp_offset?! } arg_size-=sz; #ifdef SAVE_ALL_NON_MEMORY