diff options
Diffstat (limited to 'i386-gen.c')
| -rw-r--r-- | i386-gen.c | 19 |
1 files changed, 14 insertions, 5 deletions
@@ -24,6 +24,8 @@ #define NB_REGS 4 #define NB_ASM_REGS 8 +typedef int RegArgs; + /* a register can belong to several classes. The classes must be sorted from more general to more precise (see gv2() code which does assumptions on it). */ @@ -374,9 +376,14 @@ static void gcall_or_jmp(int is_jmp) static uint8_t fastcall_regs[3] = { TREG_EAX, TREG_EDX, TREG_ECX }; static uint8_t fastcallw_regs[2] = { TREG_ECX, TREG_EDX }; +ST_FUNC int regargs_nregs(RegArgs *args) +{ + return *args; +} + /* Return the number of registers needed to return the struct, or 0 if returning via struct pointer. */ -ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *ret_align, int *regsize) +ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *ret_align, int *regsize, RegArgs *args) { #ifdef TCC_TARGET_PE int size, align; @@ -385,20 +392,22 @@ ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *ret_align, int *regsize = 4; size = type_size(vt, &align); if (size > 8) { - return 0; + *args = 0; } else if (size > 4) { ret->ref = NULL; ret->t = VT_LLONG; - return 1; + *args = 1; } else { ret->ref = NULL; ret->t = VT_INT; - return 1; + *args = 1; } #else *ret_align = 1; // Never have to re-align return values for x86 - return 0; + *args = 0; #endif + + return *args != 0; } /* Generate function call. The function address is pushed first, then |
