Mercurial > hg > CbC > old > device
diff mc-code-ia32.c @ 669:1530b1a636ac
ato mouchotto...
author | kono |
---|---|
date | Wed, 02 May 2007 15:31:38 +0900 (2007-05-02) |
parents | adbb9c25eb1a |
children | bce312f3c0cb |
line wrap: on
line diff
--- a/mc-code-ia32.c Tue May 01 16:46:21 2007 +0900 +++ b/mc-code-ia32.c Wed May 02 15:31:38 2007 +0900 @@ -318,12 +318,7 @@ */ static int arg_offset; -int disp_offset = -12; -#define func_disp_offset (-12) -#define code_disp_offset (-12) - static int code_disp_label; -static int func_disp_label; #ifdef __APPLE__ static int goffset_label; @@ -414,21 +409,50 @@ #define round4(i) ((i+0x3)&~0x3) -#define arg_offset 24 -#define arg_offset1 24 +int disp_offset = -12; +#define func_disp_offset (8) +#define code_disp_offset (8) + +#define arg_offset 8 +#define arg_offset1 0 #define ARG_LVAR_OFFSET 0x10000000 #define code_disp_offset0 (0) #define CODE_LVAR(l) ((l)+code_disp_offset0) #define CODE_CALLER_ARG(l) ((l)+arg_offset1) -#define FUNC_LVAR(l) ((l)+disp_offset) +#define FUNC_LVAR(l) ((l)-func_disp_offset) #define CALLER_ARG(l) ((l)+arg_offset1) #define CALLEE_ARG(l) ((l)+arg_offset) static int r1_offset_label; static const char lpfx[] = "_"; -static int lvar_offset_label; +// static int lvar_offset_label; static int max_func_args,max_func_arg_label; + +/* + function call stack frame + prev esp + <-------r1_offset------------------------------> + <----- ebp--> <----- esp + r+ +------------+---+---------------+----------+-------------------+ - + callee arg xx register save local caller arg + reg_save disp max_func_args*SIZE_OF_INT + lvar>0 lvar<0 lvar>0x1000 0000 + +code segment stack frame + + * goto��ƤӽФ����ؿ���r1 ! r1(goto����r1) + # * esp <---r1_offset---------> r1 +r+ +----------+--+----------+----------------+-----------+----------+----+ + cousin arg xx reg save !callee arg !code local caller arg xx + r20-r29 lvar>0 lvar<0 lvar>0x1000 000 + f20-f31 <-my_func_args--><--disp-----><-max_func_arg-> + *SIZE_OF_INT *SIZE_OF_INT + + %esp should be alignment 16 + + */ + void code_offset_set() { @@ -436,15 +460,16 @@ int l; #endif int lvar_offsetv = - round16(-disp+max_func_args*SIZE_OF_INT+func_disp_offset); - int r1_offsetv = round16(lvar_offsetv); - printf(".set %s%d,%d\n",lpfx,lvar_offset_label,r1_offsetv-lvar_offsetv); + round16(-disp); + int r1_offsetv = round16(lvar_offsetv+max_func_args*SIZE_OF_INT+func_disp_offset)+8; + // +8 makes esp alignment 16 +// printf(".set %s%d,%d\n",lpfx,lvar_offset_label,lvar_offsetv); if (r1_offsetv-lvar_offsetv > 65000) error(-1); // too large function arguments? printf(".set %s%d,%d\n",lpfx,r1_offset_label,r1_offsetv); if (max_func_arg_label) { printf(".set %s%d,%d\n",lpfx,max_func_arg_label, - round16(max_func_args*SIZE_OF_INT)+24); + round16(max_func_args*SIZE_OF_INT)); max_func_arg_label = 0; } @@ -479,7 +504,7 @@ } else printf("%d(%%ebp)",CODE_LVAR(l)); } else if (l<0) { /* local variable */ - printf("%d+_%d(%%ebp)",FUNC_LVAR(l),lvar_offset_label); + printf("%d(%%ebp)",FUNC_LVAR(l)); } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ printf("%d(%%esp)",CALLER_ARG(l-ARG_LVAR_OFFSET)); } else { /* callee's arguments */ @@ -1887,8 +1912,13 @@ { char *crn; - g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); - use_int(reg); + if (!is_const(e1)) { + g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); + use_int(reg); + } else { + use_int(reg); + code_const(round16(cadr(e1)),reg); + } crn = register_name(reg,0); printf("\tsubl\t%s, %%esp\n",crn); if (!max_func_arg_label) max_func_arg_label = fwdlabel(); @@ -2415,7 +2445,7 @@ printf("_%s:\n",name); #endif - lvar_offset_label = fwdlabel(); +// lvar_offset_label = fwdlabel(); r1_offset_label = fwdlabel(); max_func_args = 0; @@ -2424,8 +2454,7 @@ printf("\tpushl %%ebx\n"); printf("\tpushl %%esi\n"); printf("\tpushl %%edi\n"); - func_disp_label=fwdlabel(); - printf("\tlea _%d(%%ebp),%%esp\n",func_disp_label); + printf("\tlea -%s%d(%%ebp),%%esp\n",lpfx,r1_offset_label); #ifdef __APPLE__ printf("\tcall\t___i686.get_pc_thunk.bx\n"); printf("_%d:\n",labelno); @@ -2492,13 +2521,12 @@ fwddef(retlabel); code_offset_set(fnptr); - printf("\tlea %d(%%ebp),%%esp\n",disp_offset); + printf("\tlea %d(%%ebp),%%esp\n",-12); printf("\tpopl %%edi\n"); printf("\tpopl %%esi\n"); printf("\tpopl %%ebx\n"); printf("\tleave\n"); printf("\tret\n"); - printf("\t.set _%d,%d\n",func_disp_label,disp+disp_offset); #ifndef __APPLE__ printf("_%d:\n",labelno); printf("\t.size\t%s,_%d-%s\n",name,labelno,name);