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