From 59a22d59a20a472af772fce62c606209e99a5af0 Mon Sep 17 00:00:00 2001 From: jiang <30155751@qq.com> Date: Thu, 1 May 2014 20:58:43 +0800 Subject: update for x86_64-gen.c --- tccgen.c | 74 ++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 25 deletions(-) (limited to 'tccgen.c') diff --git a/tccgen.c b/tccgen.c index a4881e0..0844d40 100644 --- a/tccgen.c +++ b/tccgen.c @@ -520,7 +520,7 @@ ST_FUNC void vpushv(SValue *v) *vtop = *v; } -static void vdup(void) +ST_FUNC void vdup(void) { vpushv(vtop); } @@ -682,7 +682,7 @@ static void move_reg(int r, int s, int t) } /* get address of vtop (vtop MUST BE an lvalue) */ -static void gaddrof(void) +ST_FUNC void gaddrof(void) { if (vtop->r & VT_REF) gv(RC_INT); @@ -2531,31 +2531,55 @@ ST_FUNC void vstore(void) /* structure assignment : generate memcpy */ /* XXX: optimize if small size */ if (!nocode_wanted) { - size = type_size(&vtop->type, &align); - - /* destination */ - vswap(); - vtop->type.t = VT_PTR; - gaddrof(); - - /* address of memcpy() */ + SValue ret; + int ret_nregs, ret_align; + ret_nregs = gfunc_sret(&vtop->type, func_var, &ret.type, &ret_align); + if(0){ + vswap(); + vpushv(vtop - 1); + vtop[0].type = ret.type; + vtop[-1].type = ret.type; + vstore_im(); + vtop -=2; + }else{ + size = type_size(&vtop->type, &align); #ifdef TCC_ARM_EABI - if(!(align & 7)) - vpush_global_sym(&func_old_type, TOK_memcpy8); - else if(!(align & 3)) - vpush_global_sym(&func_old_type, TOK_memcpy4); - else + /* destination */ + vswap(); + vtop->type.t = VT_PTR; + gaddrof(); + + /* address of memcpy() */ + if(!(align & 7)) + vpush_global_sym(&func_old_type, TOK_memcpy8); + else if(!(align & 3)) + vpush_global_sym(&func_old_type, TOK_memcpy4); + else + vpush_global_sym(&func_old_type, TOK_memcpy); + + vswap(); + /* source */ + vpushv(vtop - 2); + vtop->type.t = VT_PTR; + gaddrof(); + /* type size */ + vpushi(size); + gfunc_call(3); +#else + /* destination */ + vswap(); + vtop->type.t = VT_PTR; + gaddrof(); + /* source */ + vpushv(vtop - 1); + vtop->type.t = VT_PTR; + gaddrof(); + /* size */ + vpushi(size); + struct_copy(&vtop[-2], &vtop[-1], &vtop[0]); + vtop -=3; #endif - vpush_global_sym(&func_old_type, TOK_memcpy); - - vswap(); - /* source */ - vpushv(vtop - 2); - vtop->type.t = VT_PTR; - gaddrof(); - /* type size */ - vpushi(size); - gfunc_call(3); + } } else { vswap(); vpop(); -- cgit v1.3.1