gen_putz () and struct_copy (), is to reduce the third-party call that

generates faster code tcc
Now only for x86-64
parse_number also to reduce the reliance on third-party libraries, allowing
faster analysis tcc
This commit is contained in:
jiang 2014-05-02 09:42:33 +08:00
parent ee99fd45ab
commit 5b52a44b52

View File

@ -2543,30 +2543,32 @@ ST_FUNC void vstore(void)
vtop -=2; vtop -=2;
}else{ }else{
size = type_size(&vtop->type, &align); size = type_size(&vtop->type, &align);
#ifdef TCC_ARM_EABI #ifndef TCC_TARGET_X86_64
/* destination */ /* destination */
vswap(); vswap();
vtop->type.t = VT_PTR; vtop->type.t = VT_PTR;
gaddrof(); gaddrof();
/* address of memcpy() */ /* address of memcpy() */
if(!(align & 7)) # ifdef TCC_ARM_EABI
vpush_global_sym(&func_old_type, TOK_memcpy8); if(!(align & 7))
else if(!(align & 3)) vpush_global_sym(&func_old_type, TOK_memcpy8);
vpush_global_sym(&func_old_type, TOK_memcpy4); else if(!(align & 3))
else vpush_global_sym(&func_old_type, TOK_memcpy4);
vpush_global_sym(&func_old_type, TOK_memcpy); else
# endif
vpush_global_sym(&func_old_type, TOK_memcpy);
vswap(); vswap();
/* source */ /* source */
vpushv(vtop - 2); vpushv(vtop - 2);
vtop->type.t = VT_PTR; vtop->type.t = VT_PTR;
gaddrof(); gaddrof();
/* type size */ /* type size */
vpushi(size); vpushi(size);
gfunc_call(3); gfunc_call(3);
#else #else
/* destination */ /* destination */
vswap(); vswap();
vtop->type.t = VT_PTR; vtop->type.t = VT_PTR;
gaddrof(); gaddrof();
@ -5239,14 +5241,19 @@ static void init_putz(CType *t, Section *sec, unsigned long c, int size)
if (sec) { if (sec) {
/* nothing to do because globals are already set to zero */ /* nothing to do because globals are already set to zero */
} else { } else {
#ifdef TCC_TARGET_ARM #ifndef TCC_TARGET_X86_64
vpush_global_sym(&func_old_type, TOK_memset); vpush_global_sym(&func_old_type, TOK_memset);
vseti(VT_LOCAL, c); vseti(VT_LOCAL, c);
#ifdef TCC_TARGET_ARM
vpushs(size); vpushs(size);
vpushi(0); vpushi(0);
#else
vpushi(0);
vpushs(size);
#endif
gfunc_call(3); gfunc_call(3);
#else #else
vseti(VT_LOCAL, c); vseti(VT_LOCAL, c);
gen_putz(vtop, size); gen_putz(vtop, size);
vtop--; vtop--;
#endif #endif