3,19 → 3,19 |
* |
* Copyright (c) 2002 Fabrice Bellard |
* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 2 of the License, or |
* (at your option) any later version. |
* This library is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Lesser General Public |
* License as published by the Free Software Foundation; either |
* version 2 of the License, or (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* This library is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
* Lesser General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
* You should have received a copy of the GNU Lesser General Public |
* License along with this library; if not, write to the Free Software |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
*/ |
|
/* number of available registers */ |
41,7 → 41,7 |
REG_ST2, |
}; |
|
int reg_classes[NB_REGS] = { |
const int reg_classes[NB_REGS] = { |
/* ST0 */ RC_ST | RC_ST0, |
/* ST1 */ RC_ST | RC_ST1, |
/* ST2 */ RC_ST, |
53,11 → 53,11 |
#define REG_FRET REG_ST0 /* float return register */ |
|
/* defined if function parameters must be evaluated in reverse order */ |
//#define INVERT_FUNC_PARAMS |
/* #define INVERT_FUNC_PARAMS */ |
|
/* defined if structures are passed as pointers. Otherwise structures |
are directly pushed on stack. */ |
//#define FUNC_STRUCT_PARAM_AS_PTR |
/* #define FUNC_STRUCT_PARAM_AS_PTR */ |
|
/* pointer size, in bytes */ |
#define PTR_SIZE 4 |
193,7 → 193,7 |
pstrcat(buf, buf_size, tstr); |
break; |
case VT_STRUCT: |
error("structures not handled yet"); |
tcc_error("structures not handled yet"); |
break; |
case VT_FUNC: |
s = sym_find((unsigned)t >> VT_STRUCT_SHIFT); |
387,7 → 387,7 |
void gfunc_param(GFuncContext *c) |
{ |
if ((vtop->t & VT_BTYPE) == VT_STRUCT) { |
error("structures passed as value not handled yet"); |
tcc_error("structures passed as value not handled yet"); |
} else { |
/* simply push on stack */ |
gv(RC_ST0); |
441,6 → 441,7 |
/* if the function returns a structure, then add an |
implicit pointer parameter */ |
func_vt = sym->t; |
func_var = (sym->c == FUNC_ELLIPSIS); |
if ((func_vt & VT_BTYPE) == VT_STRUCT) { |
func_vc = addr; |
addr++; |
449,7 → 450,7 |
while ((sym = sym->next) != NULL) { |
u = sym->t; |
sym_push(sym->v & ~SYM_FIELD, u, |
VT_LOCAL | VT_LVAL, addr); |
VT_LOCAL | lvalue_type(sym->type.t), addr); |
addr++; |
} |
} |
528,20 → 529,7 |
t = gjmp(t); |
gsym(vtop->c.i); |
} |
} else { |
if (is_float(vtop->t)) { |
vpushi(0); |
gen_op(TOK_NE); |
} |
if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_FORWARD)) == VT_CONST) { |
/* constant jmp optimization */ |
if ((vtop->c.i != 0) != inv) |
t = gjmp(t); |
} else { |
v = gv(RC_INT); |
t = out_opj(IL_OP_BRTRUE - inv, t); |
} |
} |
vtop--; |
return t; |
} |