diff options
| author | jiang <30155751@qq.com> | 2014-05-01 20:58:43 +0800 |
|---|---|---|
| committer | jiang <30155751@qq.com> | 2014-05-01 20:58:43 +0800 |
| commit | 59a22d59a20a472af772fce62c606209e99a5af0 (patch) | |
| tree | aa50a0c54c60d71790e952e46aaad4793030e8b7 /tccgen.c | |
| parent | 2742fbcf95c25a36af23fcfa63ba6c78bc20abcc (diff) | |
| download | tinycc-59a22d59a20a472af772fce62c606209e99a5af0.tar.gz tinycc-59a22d59a20a472af772fce62c606209e99a5af0.tar.bz2 | |
update for x86_64-gen.c
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 72 |
1 files changed, 48 insertions, 24 deletions
@@ -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); + 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 + /* destination */ + vswap(); + vtop->type.t = VT_PTR; + gaddrof(); - /* 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); - /* address of memcpy() */ -#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 + 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(); |
