diff options
| author | gus knight <waddlesplash@gmail.com> | 2015-07-29 16:57:41 -0400 |
|---|---|---|
| committer | gus knight <waddlesplash@gmail.com> | 2015-07-29 16:57:41 -0400 |
| commit | ef3d38c5c9d534099aae61651da3c3aa1ad3c6ab (patch) | |
| tree | ca58efb50bb6158a52a57ce5c9279baf6c6db3ec /tccgen.c | |
| parent | 89ad24e7d63f7488c2796b30d41303f52663a8c4 (diff) | |
| download | tinycc-ef3d38c5c9d534099aae61651da3c3aa1ad3c6ab.tar.gz tinycc-ef3d38c5c9d534099aae61651da3c3aa1ad3c6ab.tar.bz2 | |
Revert "fix-mixed-struct (patch by Pip Cet)"
This reverts commit 4e04f67c94c97b4f28a4d73759a0ad38fb3a10f7. Requested by grischka.
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 86 |
1 files changed, 5 insertions, 81 deletions
@@ -525,7 +525,7 @@ ST_FUNC void vpushv(SValue *v) *vtop = *v; } -ST_FUNC void vdup(void) +static void vdup(void) { vpushv(vtop); } @@ -4200,7 +4200,6 @@ ST_FUNC void unary(void) SValue ret; Sym *sa; int nb_args, ret_nregs, ret_align, regsize, variadic; - RegArgs args; /* function call */ if ((vtop->type.t & VT_BTYPE) != VT_FUNC) { @@ -4225,10 +4224,8 @@ ST_FUNC void unary(void) /* compute first implicit argument if a structure is returned */ if ((s->type.t & VT_BTYPE) == VT_STRUCT) { variadic = (s->c == FUNC_ELLIPSIS); - gfunc_sret(&s->type, variadic, &ret.type, - &ret_align, ®size, &args); - ret_nregs = regargs_nregs(&args); - + ret_nregs = gfunc_sret(&s->type, variadic, &ret.type, + &ret_align, ®size); if (!ret_nregs) { /* get some space for the returned structure */ size = type_size(&s->type, &align); @@ -4306,10 +4303,6 @@ ST_FUNC void unary(void) /* handle packed struct return */ if (((s->type.t & VT_BTYPE) == VT_STRUCT) && ret_nregs) { int addr, offset; -#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE) - int i; -#endif - size = type_size(&s->type, &align); /* We're writing whole regs often, make sure there's enough @@ -4318,34 +4311,6 @@ ST_FUNC void unary(void) align = regsize; loc = (loc - size) & -align; addr = loc; -#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE) - for (i=0; i<REG_ARGS_MAX; i++) { - offset = args.ireg[i]; - - if (offset == -1) - break; - - ret.type.t = VT_LLONG; - vset(&ret.type, VT_LOCAL | VT_LVAL, addr + offset); - vsetc(&ret.type, i ? REG_LRET : REG_IRET, &ret.c); - vstore(); - vtop--; - vtop--; - } - for (i=0; i<REG_ARGS_MAX; i++) { - offset = args.freg[i]; - - if (offset == -1) - break; - - ret.type.t = VT_DOUBLE; - vset(&ret.type, VT_LOCAL | VT_LVAL, addr + offset); - vsetc(&ret.type, i ? REG_QRET : REG_FRET, &ret.c); - vstore(); - vtop--; - vtop--; - } -#else offset = 0; for (;;) { vset(&ret.type, VT_LOCAL | VT_LVAL, addr + offset); @@ -4356,7 +4321,6 @@ ST_FUNC void unary(void) break; offset += regsize; } -#endif vset(&s->type, VT_LOCAL | VT_LVAL, addr); } } else { @@ -4927,11 +4891,8 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, if ((func_vt.t & VT_BTYPE) == VT_STRUCT) { CType type, ret_type; int ret_align, ret_nregs, regsize; - RegArgs args; - - gfunc_sret(&func_vt, func_var, &ret_type, - &ret_align, ®size, &args); - ret_nregs = regargs_nregs(&args); + ret_nregs = gfunc_sret(&func_vt, func_var, &ret_type, + &ret_align, ®size); if (0 == ret_nregs) { /* if returning structure, must copy it to implicit first pointer arg location */ @@ -4945,9 +4906,6 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, } else { /* returning structure packed into registers */ int r, size, addr, align; -#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE) - int i; -#endif size = type_size(&func_vt,&align); if ((vtop->r != (VT_LOCAL | VT_LVAL) || (vtop->c.i & (ret_align-1))) && (align & (ret_align-1))) { @@ -4961,39 +4919,6 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, vset(&ret_type, VT_LOCAL | VT_LVAL, addr); } vtop->type = ret_type; -#if defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_PE) - for (i=0; i<REG_ARGS_MAX; i++) { - int off = args.ireg[i]; - - if (off == -1) - break; - - r = i ? RC_LRET : RC_IRET; - - vdup(); - vtop->c.i += off; - vtop->type.t = VT_LLONG; - gv(r); - vpop(); - } - for (i=0; i<REG_ARGS_MAX; i++) { - int off = args.freg[i]; - - if (off == -1) - break; - - /* We assume that when a structure is returned in multiple - registers, their classes are consecutive values of the - suite s(n) = 2^n */ - r = rc_fret(ret_type.t) << i; - - vdup(); - vtop->c.i += off; - vtop->type.t = VT_DOUBLE; - gv(r); - vpop(); - } -#else if (is_float(ret_type.t)) r = rc_fret(ret_type.t); else @@ -5010,7 +4935,6 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, vtop->c.i += regsize; vtop->r = VT_LOCAL | VT_LVAL; } -#endif } } else if (is_float(func_vt.t)) { gv(rc_fret(func_vt.t)); |
