X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_x87.c;h=010efd8cab7cf67a43d574d9a4f769b0809b40dc;hb=fa4ec191e159484f0fcbea2ef044deaa2ab2d293;hp=2a032ea6d2c63a35470b29dfd0e044e634a307e0;hpb=84e0212853c864d291cc7fb23071a3560dbe0c3d;p=libfirm diff --git a/ir/be/ia32/ia32_x87.c b/ir/be/ia32/ia32_x87.c index 2a032ea6d..010efd8ca 100644 --- a/ir/be/ia32/ia32_x87.c +++ b/ir/be/ia32/ia32_x87.c @@ -33,12 +33,6 @@ #include "gen_ia32_regalloc_if.h" #include "ia32_x87.h" -#ifndef NDEBUG -#define DEBUG_ONLY(x) x -#else /* NDEBUG */ -#define DEBUG_ONLY(x) -#endif /* NDEBUG */ - #define N_x87_REGS 8 /* first and second binop index */ @@ -54,7 +48,7 @@ #define MASK_TOS(x) ((x) & (N_x87_REGS - 1)) /** the debug handle */ -static firm_dbg_module_t *dbg = NULL; +DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) /** * An exchange template. @@ -207,7 +201,7 @@ static int x87_on_stack(const x87_state *state, int reg_idx) { * Push a virtual Register onto the stack. */ static void x87_push(x87_state *state, int reg_idx, ir_node *node) { -// assert(x87_on_stack(state, reg_idx) == -1 && "double push"); + assert(x87_on_stack(state, reg_idx) == -1 && "double push"); assert(state->depth < N_x87_REGS && "stack overrun"); ++state->depth; @@ -900,7 +894,7 @@ GEN_UNOP(fcos) GEN_UNOP(fsqrt) /** - * Simulate a virtual Copy + * Simulate a be_Copy. */ static void sim_Copy(x87_state *state, ir_node *n, const arch_env_t *env) { ir_mode *mode = get_irn_mode(n); @@ -946,6 +940,50 @@ static void sim_Copy(x87_state *state, ir_node *n, const arch_env_t *env) { } } +/** + * Simulate a be_Call + */ +static void sim_Call(x87_state *state, ir_node *n, const arch_env_t *env) { + ir_type *call_tp = be_Call_get_type(n); + + /* at the begin of a call the x87 state should be empty */ + assert(state->depth == 0 && "stack not empty before call"); + + /* + * If the called function returns a float, it is returned in st(0). + * This even happens if the return value is NOT used. + * Moreover, only one return result is supported. + */ + if (get_method_n_ress(call_tp) > 0) { + ir_type *res_type = get_method_res_type(call_tp, 0); + ir_mode *mode = get_type_mode(res_type); + + if (mode && mode_is_float(mode)) { + /* + * TODO: what to push here? The result might be unused and currently + * we have no possibility to detect this :-( + */ + x87_push(state, 0, n); + } + } +} + +/** + * Simulate a be_Spill. + */ +static void sim_Spill(x87_state *state, ir_node *n, const arch_env_t *env) { + assert(0 && "Spill not lowered"); + sim_fst(state, n, env); +} + +/** + * Simulate a be_Reload + */ +static void sim_Reload(x87_state *state, ir_node *n, const arch_env_t *env) { + assert(0 && "Reload not lowered"); + sim_fld(state, n, env); +} + /** * Run a simulation and fix all virtual instructions for a block. * @@ -1026,8 +1064,10 @@ static void x87_init_simulator(x87_simulator *sim, ir_graph *irg, const arch_env sim->blk_states = pmap_create(); sim->env = env; - FIRM_DBG_REGISTER(dbg, "firm.be.ia32.x87"); + FIRM_DBG_REGISTER(dbg, "firm.be.ia32.x87"); +#ifndef DEBUG_libfirm firm_dbg_set_mask(dbg, SET_LEVEL_2); +#endif /* DEBUG_libfirm */ DB((dbg, LEVEL_1, "--------------------------------\n" "x87 Simulator started for %+F\n", irg)); @@ -1054,6 +1094,9 @@ static void x87_init_simulator(x87_simulator *sim, ir_graph *irg, const arch_env ASSOC_IA32(fsqrt); ASSOC_IA32(fst); ASSOC_BE(Copy); + ASSOC_BE(Call); + ASSOC_BE(Spill); + ASSOC_BE(Reload); ASSOC(Phi); #undef ASSOC_BE #undef ASSOC_IA32 @@ -1081,10 +1124,10 @@ void x87_simulate_graph(const arch_env_t *env, ir_graph *irg, ir_node **blk_list x87_simulator sim; int i; - /* we need liveness info for the current graph */ + /* we need liveness info for the current graph */ be_liveness(irg); - /* create the simulator */ + /* create the simulator */ x87_init_simulator(&sim, irg, env); start_block = get_irg_start_block(irg); @@ -1108,6 +1151,6 @@ void x87_simulate_graph(const arch_env_t *env, ir_graph *irg, ir_node **blk_list } } while (! pdeq_empty(worklist)); - /* kill it */ + /* kill it */ x87_destroy_simulator(&sim); }