aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
authorjiang <30155751@qq.com>2014-05-01 20:58:43 +0800
committerjiang <30155751@qq.com>2014-05-01 20:58:43 +0800
commit59a22d59a20a472af772fce62c606209e99a5af0 (patch)
treeaa50a0c54c60d71790e952e46aaad4793030e8b7 /tccgen.c
parent2742fbcf95c25a36af23fcfa63ba6c78bc20abcc (diff)
downloadtinycc-59a22d59a20a472af772fce62c606209e99a5af0.tar.gz
tinycc-59a22d59a20a472af772fce62c606209e99a5af0.tar.bz2
update for x86_64-gen.c
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c72
1 files changed, 48 insertions, 24 deletions
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);
+ 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();