2a60119f29cf215f20d77aa952b5267d568a1277
[libfirm] / ir / be / ia32 / ia32_x87.c
1 /*
2  * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief       This file implements the x87 support and virtual to stack
23  *              register translation for the ia32 backend.
24  * @author      Michael Beck
25  * @version     $Id$
26  */
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30
31 #include <assert.h>
32
33 #include "irnode_t.h"
34 #include "irop_t.h"
35 #include "irprog.h"
36 #include "iredges_t.h"
37 #include "irgmod.h"
38 #include "ircons.h"
39 #include "irgwalk.h"
40 #include "obst.h"
41 #include "pmap.h"
42 #include "pdeq.h"
43 #include "irprintf.h"
44 #include "debug.h"
45 #include "error.h"
46
47 #include "../belive_t.h"
48 #include "../besched_t.h"
49 #include "../benode_t.h"
50 #include "ia32_new_nodes.h"
51 #include "gen_ia32_new_nodes.h"
52 #include "gen_ia32_regalloc_if.h"
53 #include "ia32_x87.h"
54
55 #define N_x87_REGS 8
56
57 /* first and second binop index */
58 #define BINOP_IDX_1 2
59 #define BINOP_IDX_2 3
60
61 /* the unop index */
62 #define UNOP_IDX 0
63
64 /* the store val index */
65 #define STORE_VAL_IDX 2
66
67 #define MASK_TOS(x)             ((x) & (N_x87_REGS - 1))
68
69 /** the debug handle */
70 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
71
72 /* Forward declaration. */
73 typedef struct _x87_simulator x87_simulator;
74
75 /**
76  * An exchange template.
77  * Note that our virtual functions have the same inputs
78  * and attributes as the real ones, so we can simple exchange
79  * their opcodes!
80  * Further, x87 supports inverse instructions, so we can handle them.
81  */
82 typedef struct _exchange_tmpl {
83         ir_op *normal_op;       /**< the normal one */
84         ir_op *reverse_op;      /**< the reverse one if exists */
85         ir_op *normal_pop_op;   /**< the normal one with tos pop */
86         ir_op *reverse_pop_op;  /**< the reverse one with tos pop */
87 } exchange_tmpl;
88
89 /**
90  * An entry on the simulated x87 stack.
91  */
92 typedef struct _st_entry {
93         int     reg_idx;        /**< the virtual register index of this stack value */
94         ir_node *node;          /**< the node that produced this value */
95 } st_entry;
96
97 /**
98  * The x87 state.
99  */
100 typedef struct _x87_state {
101         st_entry st[N_x87_REGS];  /**< the register stack */
102         int depth;                /**< the current stack depth */
103         int tos;                  /**< position of the tos */
104         x87_simulator *sim;       /**< The simulator. */
105 } x87_state;
106
107 /** An empty state, used for blocks without fp instructions. */
108 static x87_state _empty = { { {0, NULL}, }, 0, 0, NULL };
109 static x87_state *empty = (x87_state *)&_empty;
110
111 enum {
112         NO_NODE_ADDED = 0,  /**< No node was added. */
113         NODE_ADDED = 1      /**< A node was added by the simulator in the schedule. */
114 };
115
116 /**
117  * The type of an instruction simulator function.
118  *
119  * @param state  the x87 state
120  * @param n      the node to be simulated
121  *
122  * @return NODE_ADDED if a node was added AFTER n in schedule,
123  *         NO_NODE_ADDED else
124  */
125 typedef int (*sim_func)(x87_state *state, ir_node *n);
126
127 /**
128  * A block state: Every block has a x87 state at the beginning and at the end.
129  */
130 typedef struct _blk_state {
131         x87_state *begin;   /**< state at the begin or NULL if not assigned */
132         x87_state *end;     /**< state at the end or NULL if not assigned */
133 } blk_state;
134
135 #define PTR_TO_BLKSTATE(p)      ((blk_state *)(p))
136
137 /** liveness bitset for vfp registers. */
138 typedef unsigned char vfp_liveness;
139
140 /**
141  * The x87 simulator.
142  */
143 struct _x87_simulator {
144         struct obstack obst;        /**< An obstack for fast allocating. */
145         pmap *blk_states;           /**< Map blocks to states. */
146         const arch_env_t *arch_env; /**< The architecture environment. */
147         be_lv_t *lv;                /**< intrablock liveness. */
148         vfp_liveness *live;         /**< Liveness information. */
149         unsigned n_idx;             /**< The cached get_irg_last_idx() result. */
150         waitq *worklist;            /**< Worklist of blocks that must be processed. */
151 };
152
153 /**
154  * Returns the current stack depth.
155  *
156  * @param state  the x87 state
157  *
158  * @return the x87 stack depth
159  */
160 static int x87_get_depth(const x87_state *state) {
161         return state->depth;
162 }  /* x87_get_depth */
163
164 /**
165  * Return the virtual register index at st(pos).
166  *
167  * @param state  the x87 state
168  * @param pos    a stack position
169  *
170  * @return the vfp register index that produced the value at st(pos)
171  */
172 static int x87_get_st_reg(const x87_state *state, int pos) {
173         assert(pos < state->depth);
174         return state->st[MASK_TOS(state->tos + pos)].reg_idx;
175 }  /* x87_get_st_reg */
176
177 /**
178  * Return the node at st(pos).
179  *
180  * @param state  the x87 state
181  * @param pos    a stack position
182  *
183  * @return the IR node that produced the value at st(pos)
184  */
185 static ir_node *x87_get_st_node(const x87_state *state, int pos) {
186         assert(pos < state->depth);
187         return state->st[MASK_TOS(state->tos + pos)].node;
188 }  /* x87_get_st_node */
189
190 #ifdef DEBUG_libfirm
191 /**
192  * Dump the stack for debugging.
193  *
194  * @param state  the x87 state
195  */
196 static void x87_dump_stack(const x87_state *state) {
197         int i;
198
199         for (i = state->depth - 1; i >= 0; --i) {
200                 DB((dbg, LEVEL_2, "vf%d(%+F) ", x87_get_st_reg(state, i),
201                     x87_get_st_node(state, i)));
202         }
203         DB((dbg, LEVEL_2, "<-- TOS\n"));
204 }  /* x87_dump_stack */
205 #endif /* DEBUG_libfirm */
206
207 /**
208  * Set a virtual register to st(pos).
209  *
210  * @param state    the x87 state
211  * @param reg_idx  the vfp register index that should be set
212  * @param node     the IR node that produces the value of the vfp register
213  * @param pos      the stack position where the new value should be entered
214  */
215 static void x87_set_st(x87_state *state, int reg_idx, ir_node *node, int pos) {
216         assert(0 < state->depth);
217         state->st[MASK_TOS(state->tos + pos)].reg_idx = reg_idx;
218         state->st[MASK_TOS(state->tos + pos)].node    = node;
219
220         DB((dbg, LEVEL_2, "After SET_REG: "));
221         DEBUG_ONLY(x87_dump_stack(state));
222 }  /* x87_set_st */
223
224 /**
225  * Set the tos virtual register.
226  *
227  * @param state    the x87 state
228  * @param reg_idx  the vfp register index that should be set
229  * @param node     the IR node that produces the value of the vfp register
230  */
231 static void x87_set_tos(x87_state *state, int reg_idx, ir_node *node) {
232         x87_set_st(state, reg_idx, node, 0);
233 }  /* x87_set_tos */
234
235 /**
236  * Swap st(0) with st(pos).
237  *
238  * @param state    the x87 state
239  * @param pos      the stack position to change the tos with
240  */
241 static void x87_fxch(x87_state *state, int pos) {
242         st_entry entry;
243         assert(pos < state->depth);
244
245         entry = state->st[MASK_TOS(state->tos + pos)];
246         state->st[MASK_TOS(state->tos + pos)] = state->st[MASK_TOS(state->tos)];
247         state->st[MASK_TOS(state->tos)] = entry;
248
249         DB((dbg, LEVEL_2, "After FXCH: ")); DEBUG_ONLY(x87_dump_stack(state));
250 }  /* x87_fxch */
251
252 /**
253  * Convert a virtual register to the stack index.
254  *
255  * @param state    the x87 state
256  * @param reg_idx  the register vfp index
257  *
258  * @return the stack position where the register is stacked
259  *         or -1 if the virtual register was not found
260  */
261 static int x87_on_stack(const x87_state *state, int reg_idx) {
262         int i, tos = state->tos;
263
264         for (i = 0; i < state->depth; ++i)
265                 if (state->st[MASK_TOS(tos + i)].reg_idx == reg_idx)
266                         return i;
267         return -1;
268 }  /* x87_on_stack */
269
270 /**
271  * Push a virtual Register onto the stack, double pushed allowed.
272  *
273  * @param state     the x87 state
274  * @param reg_idx   the register vfp index
275  * @param node      the node that produces the value of the vfp register
276  */
277 static void x87_push_dbl(x87_state *state, int reg_idx, ir_node *node) {
278         assert(state->depth < N_x87_REGS && "stack overrun");
279
280         ++state->depth;
281         state->tos = MASK_TOS(state->tos - 1);
282         state->st[state->tos].reg_idx = reg_idx;
283         state->st[state->tos].node    = node;
284
285         DB((dbg, LEVEL_2, "After PUSH: ")); DEBUG_ONLY(x87_dump_stack(state));
286 }  /* x87_push_dbl */
287
288 /**
289  * Push a virtual Register onto the stack, double pushes are NOT allowed.
290  *
291  * @param state     the x87 state
292  * @param reg_idx   the register vfp index
293  * @param node      the node that produces the value of the vfp register
294  * @param dbl_push  if != 0 double pushes are allowed
295  */
296 static void x87_push(x87_state *state, int reg_idx, ir_node *node) {
297         assert(x87_on_stack(state, reg_idx) == -1 && "double push");
298
299         x87_push_dbl(state, reg_idx, node);
300 }  /* x87_push */
301
302 /**
303  * Pop a virtual Register from the stack.
304  *
305  * @param state     the x87 state
306  */
307 static void x87_pop(x87_state *state) {
308         assert(state->depth > 0 && "stack underrun");
309
310         --state->depth;
311         state->tos = MASK_TOS(state->tos + 1);
312
313         DB((dbg, LEVEL_2, "After POP: ")); DEBUG_ONLY(x87_dump_stack(state));
314 }  /* x87_pop */
315
316 /**
317  * Returns the block state of a block.
318  *
319  * @param sim    the x87 simulator handle
320  * @param block  the current block
321  *
322  * @return the block state
323  */
324 static blk_state *x87_get_bl_state(x87_simulator *sim, ir_node *block) {
325         pmap_entry *entry = pmap_find(sim->blk_states, block);
326
327         if (! entry) {
328                 blk_state *bl_state = obstack_alloc(&sim->obst, sizeof(*bl_state));
329                 bl_state->begin = NULL;
330                 bl_state->end   = NULL;
331
332                 pmap_insert(sim->blk_states, block, bl_state);
333                 return bl_state;
334         }
335
336         return PTR_TO_BLKSTATE(entry->value);
337 }  /* x87_get_bl_state */
338
339 /**
340  * Creates a new x87 state.
341  *
342  * @param sim    the x87 simulator handle
343  *
344  * @return a new x87 state
345  */
346 static x87_state *x87_alloc_state(x87_simulator *sim) {
347         x87_state *res = obstack_alloc(&sim->obst, sizeof(*res));
348
349         res->sim = sim;
350         return res;
351 }  /* x87_alloc_state */
352
353 /**
354  * Clone a x87 state.
355  *
356  * @param sim    the x87 simulator handle
357  * @param src    the x87 state that will be cloned
358  *
359  * @return a cloned copy of the src state
360  */
361 static x87_state *x87_clone_state(x87_simulator *sim, const x87_state *src) {
362         x87_state *res = x87_alloc_state(sim);
363
364         memcpy(res, src, sizeof(*res));
365         return res;
366 }  /* x87_clone_state */
367
368 /**
369  * Patch a virtual instruction into a x87 one and return
370  * the node representing the result value.
371  *
372  * @param n   the IR node to patch
373  * @param op  the x87 opcode to patch in
374  */
375 static ir_node *x87_patch_insn(ir_node *n, ir_op *op) {
376         ir_mode *mode = get_irn_mode(n);
377         ir_node *res = n;
378
379         set_irn_op(n, op);
380
381         if (mode == mode_T) {
382                 /* patch all Proj's */
383                 const ir_edge_t *edge;
384
385                 foreach_out_edge(n, edge) {
386                         ir_node *proj = get_edge_src_irn(edge);
387                         if (is_Proj(proj)) {
388                                 mode = get_irn_mode(proj);
389                                 if (mode_is_float(mode)) {
390                                         res = proj;
391                                         set_irn_mode(proj, mode_E);
392                                 }
393                         }
394                 }
395         } else if (mode_is_float(mode))
396                 set_irn_mode(n, mode_E);
397         return res;
398 }  /* x87_patch_insn */
399
400 /**
401  * Returns the first Proj of a mode_T node having a given mode.
402  *
403  * @param n  the mode_T node
404  * @param m  the desired mode of the Proj
405  * @return The first Proj of mode @p m found or NULL.
406  */
407 static ir_node *get_irn_Proj_for_mode(ir_node *n, ir_mode *m) {
408         const ir_edge_t *edge;
409
410         assert(get_irn_mode(n) == mode_T && "Need mode_T node");
411
412         foreach_out_edge(n, edge) {
413                 ir_node *proj = get_edge_src_irn(edge);
414                 if (get_irn_mode(proj) == m)
415                         return proj;
416         }
417
418         return NULL;
419 }  /* get_irn_Proj_for_mode */
420
421 /**
422  * Wrap the arch_* function here so we can check for errors.
423  */
424 static INLINE const arch_register_t *x87_get_irn_register(x87_simulator *sim, const ir_node *irn) {
425         const arch_register_t *res;
426
427         res = arch_get_irn_register(sim->arch_env, irn);
428         assert(res->reg_class->regs == ia32_vfp_regs);
429         return res;
430 }  /* x87_get_irn_register */
431
432 /* -------------- x87 perm --------------- */
433
434 /**
435  * Creates a fxch for shuffle.
436  *
437  * @param state     the x87 state
438  * @param pos       parameter for fxch
439  * @param block     the block were fxch is inserted
440  *
441  * Creates a new fxch node and reroute the user of the old node
442  * to the fxch.
443  *
444  * @return the fxch node
445  */
446 static ir_node *x87_fxch_shuffle(x87_state *state, int pos, ir_node *block) {
447         ir_node         *fxch;
448         ia32_x87_attr_t *attr;
449
450         fxch = new_rd_ia32_fxch(NULL, get_irn_irg(block), block, mode_E);
451         attr = get_ia32_x87_attr(fxch);
452         attr->x87[0] = &ia32_st_regs[pos];
453         attr->x87[2] = &ia32_st_regs[0];
454
455         keep_alive(fxch);
456
457         x87_fxch(state, pos);
458         return fxch;
459 }  /* x87_fxch_shuffle */
460
461 /**
462  * Calculate the necessary permutations to reach dst_state.
463  *
464  * These permutations are done with fxch instructions and placed
465  * at the end of the block.
466  *
467  * Note that critical edges are removed here, so we need only
468  * a shuffle if the current block has only one successor.
469  *
470  * @param sim        the simulator handle
471  * @param block      the current block
472  * @param state      the current x87 stack state, might be modified
473  * @param dst_block  the destination block
474  * @param dst_state  destination state
475  *
476  * @return state
477  */
478 static x87_state *x87_shuffle(x87_simulator *sim, ir_node *block,
479                               x87_state *state, ir_node *dst_block,
480                               const x87_state *dst_state)
481 {
482         int      i, n_cycles, k, ri;
483         unsigned cycles[4], all_mask;
484         char     cycle_idx[4][8];
485         ir_node  *fxch, *before, *after;
486         (void) sim;
487         (void) dst_block;
488
489         assert(state->depth == dst_state->depth);
490
491         /* Some mathematics here:
492            If we have a cycle of length n that includes the tos,
493            we need n-1 exchange operations.
494            We can always add the tos and restore it, so we need
495            n+1 exchange operations for a cycle not containing the tos.
496            So, the maximum of needed operations is for a cycle of 7
497            not including the tos == 8.
498            This is the same number of ops we would need for using stores,
499            so exchange is cheaper (we save the loads).
500            On the other hand, we might need an additional exchange
501            in the next block to bring one operand on top, so the
502            number of ops in the first case is identical.
503            Further, no more than 4 cycles can exists (4 x 2).
504         */
505         all_mask = (1 << (state->depth)) - 1;
506
507         for (n_cycles = 0; all_mask; ++n_cycles) {
508                 int src_idx, dst_idx;
509
510                 /* find the first free slot */
511                 for (i = 0; i < state->depth; ++i) {
512                         if (all_mask & (1 << i)) {
513                                 all_mask &= ~(1 << i);
514
515                                 /* check if there are differences here */
516                                 if (x87_get_st_reg(state, i) != x87_get_st_reg(dst_state, i))
517                                         break;
518                         }
519                 }
520
521                 if (! all_mask) {
522                         /* no more cycles found */
523                         break;
524                 }
525
526                 k = 0;
527                 cycles[n_cycles] = (1 << i);
528                 cycle_idx[n_cycles][k++] = i;
529                 for (src_idx = i; ; src_idx = dst_idx) {
530                         dst_idx = x87_on_stack(dst_state, x87_get_st_reg(state, src_idx));
531
532                         if ((all_mask & (1 << dst_idx)) == 0)
533                                 break;
534
535                         cycle_idx[n_cycles][k++] = dst_idx;
536                         cycles[n_cycles] |=  (1 << dst_idx);
537                         all_mask       &= ~(1 << dst_idx);
538                 }
539                 cycle_idx[n_cycles][k] = -1;
540         }
541
542         if (n_cycles <= 0) {
543                 /* no permutation needed */
544                 return state;
545         }
546
547         /* Hmm: permutation needed */
548         DB((dbg, LEVEL_2, "\n%+F needs permutation: from\n", block));
549         DEBUG_ONLY(x87_dump_stack(state));
550         DB((dbg, LEVEL_2, "                  to\n"));
551         DEBUG_ONLY(x87_dump_stack(dst_state));
552
553
554 #ifdef DEBUG_libfirm
555         DB((dbg, LEVEL_2, "Need %d cycles\n", n_cycles));
556         for (ri = 0; ri < n_cycles; ++ri) {
557                 DB((dbg, LEVEL_2, " Ring %d:\n ", ri));
558                 for (k = 0; cycle_idx[ri][k] != -1; ++k)
559                         DB((dbg, LEVEL_2, " st%d ->", cycle_idx[ri][k]));
560                 DB((dbg, LEVEL_2, "\n"));
561         }
562 #endif
563
564         after = NULL;
565
566         /*
567          * Find the place node must be insert.
568          * We have only one successor block, so the last instruction should
569          * be a jump.
570          */
571         before = sched_last(block);
572         assert(is_cfop(before));
573
574         /* now do the permutations */
575         for (ri = 0; ri < n_cycles; ++ri) {
576                 if ((cycles[ri] & 1) == 0) {
577                         /* this cycle does not include the tos */
578                         fxch = x87_fxch_shuffle(state, cycle_idx[ri][0], block);
579                         if (after)
580                                 sched_add_after(after, fxch);
581                         else
582                                 sched_add_before(before, fxch);
583                         after = fxch;
584                 }
585                 for (k = 1; cycle_idx[ri][k] != -1; ++k) {
586                         fxch = x87_fxch_shuffle(state, cycle_idx[ri][k], block);
587                         if (after)
588                                 sched_add_after(after, fxch);
589                         else
590                                 sched_add_before(before, fxch);
591                         after = fxch;
592                 }
593                 if ((cycles[ri] & 1) == 0) {
594                         /* this cycle does not include the tos */
595                         fxch = x87_fxch_shuffle(state, cycle_idx[ri][0], block);
596                         sched_add_after(after, fxch);
597                 }
598         }
599         return state;
600 }  /* x87_shuffle */
601
602 /**
603  * Create a fxch node before another node.
604  *
605  * @param state   the x87 state
606  * @param n       the node after the fxch
607  * @param pos     exchange st(pos) with st(0)
608  *
609  * @return the fxch
610  */
611 static ir_node *x87_create_fxch(x87_state *state, ir_node *n, int pos)
612 {
613         ir_node         *fxch;
614         ia32_x87_attr_t *attr;
615         ir_graph        *irg = get_irn_irg(n);
616         ir_node         *block = get_nodes_block(n);
617
618         x87_fxch(state, pos);
619
620         fxch = new_rd_ia32_fxch(NULL, irg, block, mode_E);
621         attr = get_ia32_x87_attr(fxch);
622         attr->x87[0] = &ia32_st_regs[pos];
623         attr->x87[2] = &ia32_st_regs[0];
624
625         keep_alive(fxch);
626
627         sched_add_before(n, fxch);
628         DB((dbg, LEVEL_1, "<<< %s %s, %s\n", get_irn_opname(fxch), attr->x87[0]->name, attr->x87[2]->name));
629         return fxch;
630 }  /* x87_create_fxch */
631
632 /**
633  * Create a fpush before node n.
634  *
635  * @param state     the x87 state
636  * @param n         the node after the fpush
637  * @param pos       push st(pos) on stack
638  * @param op_idx    replace input op_idx of n with the fpush result
639  */
640 static void x87_create_fpush(x87_state *state, ir_node *n, int pos, int op_idx) {
641         ir_node               *fpush, *pred = get_irn_n(n, op_idx);
642         ia32_x87_attr_t       *attr;
643         const arch_register_t *out = x87_get_irn_register(state->sim, pred);
644
645         x87_push_dbl(state, arch_register_get_index(out), pred);
646
647         fpush = new_rd_ia32_fpush(NULL, get_irn_irg(n), get_nodes_block(n), mode_E);
648         attr  = get_ia32_x87_attr(fpush);
649         attr->x87[0] = &ia32_st_regs[pos];
650         attr->x87[2] = &ia32_st_regs[0];
651
652         keep_alive(fpush);
653         sched_add_before(n, fpush);
654
655         DB((dbg, LEVEL_1, "<<< %s %s, %s\n", get_irn_opname(fpush), attr->x87[0]->name, attr->x87[2]->name));
656 }  /* x87_create_fpush */
657
658 /**
659  * Create a fpop before node n.
660  *
661  * @param state   the x87 state
662  * @param n       the node after the fpop
663  * @param num     pop 1 or 2 values
664  *
665  * @return the fpop node
666  */
667 static ir_node *x87_create_fpop(x87_state *state, ir_node *n, int num)
668 {
669         ir_node *fpop;
670         ia32_x87_attr_t *attr;
671
672         while (num > 0) {
673                 x87_pop(state);
674                 fpop = new_rd_ia32_fpop(NULL, get_irn_irg(n), get_nodes_block(n), mode_E);
675                 attr = get_ia32_x87_attr(fpop);
676                 attr->x87[0] = &ia32_st_regs[0];
677                 attr->x87[1] = &ia32_st_regs[0];
678                 attr->x87[2] = &ia32_st_regs[0];
679
680                 keep_alive(fpop);
681                 sched_add_before(n, fpop);
682                 DB((dbg, LEVEL_1, "<<< %s %s\n", get_irn_opname(fpop), attr->x87[0]->name));
683
684                 --num;
685         }
686         return fpop;
687 }  /* x87_create_fpop */
688
689 /**
690  * Creates an fldz before node n
691  *
692  * @param state   the x87 state
693  * @param n       the node after the fldz
694  *
695  * @return the fldz node
696  */
697 static ir_node *x87_create_fldz(x87_state *state, ir_node *n, int regidx) {
698         ir_graph *irg = get_irn_irg(n);
699         ir_node *block = get_nodes_block(n);
700         ir_node *fldz;
701
702         fldz = new_rd_ia32_fldz(NULL, irg, block, mode_E);
703
704         sched_add_before(n, fldz);
705         DB((dbg, LEVEL_1, "<<< %s\n", get_irn_opname(fldz)));
706         keep_alive(fldz);
707
708         x87_push(state, regidx, fldz);
709
710         return fldz;
711 }
712
713 /* --------------------------------- liveness ------------------------------------------ */
714
715 /**
716  * The liveness transfer function.
717  * Updates a live set over a single step from a given node to its predecessor.
718  * Everything defined at the node is removed from the set, the uses of the node get inserted.
719  *
720  * @param sim      The simulator handle.
721  * @param irn      The node at which liveness should be computed.
722  * @param live     The bitset of registers live before @p irn. This set gets modified by updating it to
723  *                 the registers live after irn.
724  *
725  * @return The live bitset.
726  */
727 static vfp_liveness vfp_liveness_transfer(x87_simulator *sim, ir_node *irn, vfp_liveness live)
728 {
729         int i, n;
730         const arch_register_class_t *cls = &ia32_reg_classes[CLASS_ia32_vfp];
731         const arch_env_t *arch_env = sim->arch_env;
732
733 #ifndef SCHEDULE_PROJS
734         if (get_irn_mode(irn) == mode_T) {
735                 const ir_edge_t *edge;
736
737                 foreach_out_edge(irn, edge) {
738                         ir_node *proj = get_edge_src_irn(edge);
739
740                         if (arch_irn_consider_in_reg_alloc(arch_env, cls, proj)) {
741                                 const arch_register_t *reg = x87_get_irn_register(sim, proj);
742                                 live &= ~(1 << arch_register_get_index(reg));
743                         }
744                 }
745         }
746 #endif
747
748         if (arch_irn_consider_in_reg_alloc(arch_env, cls, irn)) {
749                 const arch_register_t *reg = x87_get_irn_register(sim, irn);
750                 live &= ~(1 << arch_register_get_index(reg));
751         }
752
753         for (i = 0, n = get_irn_arity(irn); i < n; ++i) {
754                 ir_node *op = get_irn_n(irn, i);
755
756                 if (mode_is_float(get_irn_mode(op)) && arch_irn_consider_in_reg_alloc(arch_env, cls, op)) {
757                         const arch_register_t *reg = x87_get_irn_register(sim, op);
758                         live |= 1 << arch_register_get_index(reg);
759                 }
760         }
761         return live;
762 }  /* vfp_liveness_transfer */
763
764 /**
765  * Put all live virtual registers at the end of a block into a bitset.
766  *
767  * @param sim      the simulator handle
768  * @param lv       the liveness information
769  * @param bl       the block
770  *
771  * @return The live bitset at the end of this block
772  */
773 static vfp_liveness vfp_liveness_end_of_block(x87_simulator *sim, const ir_node *block)
774 {
775         int i;
776         vfp_liveness live = 0;
777         const arch_register_class_t *cls = &ia32_reg_classes[CLASS_ia32_vfp];
778         const arch_env_t *arch_env = sim->arch_env;
779         const be_lv_t *lv = sim->lv;
780
781         be_lv_foreach(lv, block, be_lv_state_end, i) {
782                 const arch_register_t *reg;
783                 const ir_node *node = be_lv_get_irn(lv, block, i);
784                 if (!arch_irn_consider_in_reg_alloc(arch_env, cls, node))
785                         continue;
786
787                 reg = x87_get_irn_register(sim, node);
788                 live |= 1 << arch_register_get_index(reg);
789         }
790
791         return live;
792 }  /* vfp_liveness_end_of_block */
793
794 /** get the register mask from an arch_register */
795 #define REGMASK(reg)    (1 << (arch_register_get_index(reg)))
796
797 /**
798  * Return a bitset of argument registers which are live at the end of a node.
799  *
800  * @param sim    the simulator handle
801  * @param pos    the node
802  * @param kill   kill mask for the output registers
803  *
804  * @return The live bitset.
805  */
806 static unsigned vfp_live_args_after(x87_simulator *sim, const ir_node *pos, unsigned kill)
807 {
808         unsigned idx = get_irn_idx(pos);
809
810         assert(idx < sim->n_idx);
811         return sim->live[idx] & ~kill;
812 }  /* vfp_live_args_after */
813
814 /**
815  * Calculate the liveness for a whole block and cache it.
816  *
817  * @param sim   the simulator handle
818  * @param lv    the liveness handle
819  * @param block the block
820  */
821 static void update_liveness(x87_simulator *sim, ir_node *block) {
822         vfp_liveness live = vfp_liveness_end_of_block(sim, block);
823         unsigned idx;
824         ir_node *irn;
825
826         /* now iterate through the block backward and cache the results */
827         sched_foreach_reverse(block, irn) {
828                 /* stop at the first Phi: this produces the live-in */
829                 if (is_Phi(irn))
830                         break;
831
832                 idx = get_irn_idx(irn);
833                 sim->live[idx] = live;
834
835                 live = vfp_liveness_transfer(sim, irn, live);
836         }
837         idx = get_irn_idx(block);
838         sim->live[idx] = live;
839 }  /* update_liveness */
840
841 /**
842  * Returns true if a register is live in a set.
843  *
844  * @param reg_idx  the vfp register index
845  * @param live     a live bitset
846  */
847 #define is_vfp_live(reg_idx, live) ((live) & (1 << (reg_idx)))
848
849 #ifdef DEBUG_libfirm
850 /**
851  * Dump liveness info.
852  *
853  * @param live  the live bitset
854  */
855 static void vfp_dump_live(vfp_liveness live) {
856         int i;
857
858         DB((dbg, LEVEL_2, "Live after: "));
859         for (i = 0; i < 8; ++i) {
860                 if (live & (1 << i)) {
861                         DB((dbg, LEVEL_2, "vf%d ", i));
862                 }
863         }
864         DB((dbg, LEVEL_2, "\n"));
865 }  /* vfp_dump_live */
866 #endif /* DEBUG_libfirm */
867
868 /* --------------------------------- simulators ---------------------------------------- */
869
870 #define XCHG(a, b) do { int t = (a); (a) = (b); (b) = t; } while (0)
871
872 /**
873  * Simulate a virtual binop.
874  *
875  * @param state  the x87 state
876  * @param n      the node that should be simulated (and patched)
877  * @param tmpl   the template containing the 4 possible x87 opcodes
878  *
879  * @return NO_NODE_ADDED
880  */
881 static int sim_binop(x87_state *state, ir_node *n, const exchange_tmpl *tmpl) {
882         int op2_idx = 0, op1_idx;
883         int out_idx, do_pop = 0;
884         ia32_x87_attr_t *attr;
885         ir_node *patched_insn;
886         ir_op *dst;
887         x87_simulator         *sim = state->sim;
888         const arch_register_t *op1 = x87_get_irn_register(sim, get_irn_n(n, BINOP_IDX_1));
889         const arch_register_t *op2 = x87_get_irn_register(sim, get_irn_n(n, BINOP_IDX_2));
890         const arch_register_t *out = x87_get_irn_register(sim, n);
891         int reg_index_1 = arch_register_get_index(op1);
892         int reg_index_2 = arch_register_get_index(op2);
893         vfp_liveness live = vfp_live_args_after(sim, n, REGMASK(out));
894
895         DB((dbg, LEVEL_1, ">>> %+F %s, %s -> %s\n", n,
896                 arch_register_get_name(op1), arch_register_get_name(op2),
897                 arch_register_get_name(out)));
898         DEBUG_ONLY(vfp_dump_live(live));
899         DB((dbg, LEVEL_1, "Stack before: "));
900         DEBUG_ONLY(x87_dump_stack(state));
901
902         op1_idx = x87_on_stack(state, reg_index_1);
903         assert(op1_idx >= 0);
904
905         if (reg_index_2 != REG_VFP_NOREG) {
906                 /* second operand is a vfp register */
907                 op2_idx = x87_on_stack(state, reg_index_2);
908                 assert(op2_idx >= 0);
909
910                 if (is_vfp_live(arch_register_get_index(op2), live)) {
911                         /* Second operand is live. */
912
913                         if (is_vfp_live(arch_register_get_index(op1), live)) {
914                                 /* Both operands are live: push the first one.
915                                    This works even for op1 == op2. */
916                                 x87_create_fpush(state, n, op1_idx, BINOP_IDX_2);
917                                 /* now do fxxx (tos=tos X op) */
918                                 op1_idx = 0;
919                                 op2_idx += 1;
920                                 out_idx = 0;
921                                 dst = tmpl->normal_op;
922                         } else {
923                                 /* Second live, first operand is dead here, bring it to tos. */
924                                 if (op1_idx != 0) {
925                                         x87_create_fxch(state, n, op1_idx);
926                                         if (op2_idx == 0)
927                                                 op2_idx = op1_idx;
928                                         op1_idx = 0;
929                                 }
930                                 /* now do fxxx (tos=tos X op) */
931                                 out_idx = 0;
932                                 dst = tmpl->normal_op;
933                         }
934                 } else {
935                         /* Second operand is dead. */
936                         if (is_vfp_live(arch_register_get_index(op1), live)) {
937                                 /* First operand is live: bring second to tos. */
938                                 if (op2_idx != 0) {
939                                         x87_create_fxch(state, n, op2_idx);
940                                         if (op1_idx == 0)
941                                                 op1_idx = op2_idx;
942                                         op2_idx = 0;
943                                 }
944                                 /* now do fxxxr (tos = op X tos) */
945                                 out_idx = 0;
946                                 dst = tmpl->reverse_op;
947                         } else {
948                                 /* Both operands are dead here, pop them from the stack. */
949                                 if (op2_idx == 0) {
950                                         if (op1_idx == 0) {
951                                                 /* Both are identically and on tos, no pop needed. */
952                                                 /* here fxxx (tos = tos X tos) */
953                                                 dst = tmpl->normal_op;
954                                                 out_idx = 0;
955                                         } else {
956                                                 /* now do fxxxp (op = op X tos, pop) */
957                                                 dst = tmpl->normal_pop_op;
958                                                 do_pop = 1;
959                                                 out_idx = op1_idx;
960                                         }
961                                 } else if (op1_idx == 0) {
962                                         assert(op1_idx != op2_idx);
963                                         /* now do fxxxrp (op = tos X op, pop) */
964                                         dst = tmpl->reverse_pop_op;
965                                         do_pop = 1;
966                                         out_idx = op2_idx;
967                                 } else {
968                                         /* Bring the second on top. */
969                                         x87_create_fxch(state, n, op2_idx);
970                                         if (op1_idx == op2_idx) {
971                                                 /* Both are identically and on tos now, no pop needed. */
972                                                 op1_idx = 0;
973                                                 op2_idx = 0;
974                                                 /* use fxxx (tos = tos X tos) */
975                                                 dst = tmpl->normal_op;
976                                                 out_idx = 0;
977                                         } else {
978                                                 /* op2 is on tos now */
979                                                 op2_idx = 0;
980                                                 /* use fxxxp (op = op X tos, pop) */
981                                                 dst = tmpl->normal_pop_op;
982                                                 out_idx = op1_idx;
983                                                 do_pop = 1;
984                                         }
985                                 }
986                         }
987                 }
988         } else {
989                 /* second operand is an address mode */
990                 if (is_vfp_live(arch_register_get_index(op1), live)) {
991                         /* first operand is live: push it here */
992                         x87_create_fpush(state, n, op1_idx, BINOP_IDX_1);
993                         op1_idx = 0;
994                         /* use fxxx (tos = tos X mem) */
995                         dst = tmpl->normal_op;
996                         out_idx = 0;
997                 } else {
998                         /* first operand is dead: bring it to tos */
999                         if (op1_idx != 0) {
1000                                 x87_create_fxch(state, n, op1_idx);
1001                                 op1_idx = 0;
1002                         }
1003
1004                         /* use fxxxp (tos = tos X mem) */
1005                         dst = tmpl->normal_op;
1006                         out_idx = 0;
1007                 }
1008         }
1009
1010         patched_insn = x87_patch_insn(n, dst);
1011         x87_set_st(state, arch_register_get_index(out), patched_insn, out_idx);
1012         if (do_pop) {
1013                 x87_pop(state);
1014         }
1015
1016         /* patch the operation */
1017         attr = get_ia32_x87_attr(n);
1018         attr->x87[0] = op1 = &ia32_st_regs[op1_idx];
1019         if (reg_index_2 != REG_VFP_NOREG) {
1020                 attr->x87[1] = op2 = &ia32_st_regs[op2_idx];
1021         }
1022         attr->x87[2] = out = &ia32_st_regs[out_idx];
1023
1024         if (reg_index_2 != REG_VFP_NOREG) {
1025                 DB((dbg, LEVEL_1, "<<< %s %s, %s -> %s\n", get_irn_opname(n),
1026                         arch_register_get_name(op1), arch_register_get_name(op2),
1027                         arch_register_get_name(out)));
1028         } else {
1029                 DB((dbg, LEVEL_1, "<<< %s %s, [AM] -> %s\n", get_irn_opname(n),
1030                         arch_register_get_name(op1),
1031                         arch_register_get_name(out)));
1032         }
1033
1034         return NO_NODE_ADDED;
1035 }  /* sim_binop */
1036
1037 /**
1038  * Simulate a virtual Unop.
1039  *
1040  * @param state  the x87 state
1041  * @param n      the node that should be simulated (and patched)
1042  * @param op     the x87 opcode that will replace n's opcode
1043  *
1044  * @return NO_NODE_ADDED
1045  */
1046 static int sim_unop(x87_state *state, ir_node *n, ir_op *op) {
1047         int op1_idx, out_idx;
1048         x87_simulator         *sim = state->sim;
1049         const arch_register_t *op1 = x87_get_irn_register(sim, get_irn_n(n, UNOP_IDX));
1050         const arch_register_t *out = x87_get_irn_register(sim, n);
1051         ia32_x87_attr_t *attr;
1052         unsigned live = vfp_live_args_after(sim, n, REGMASK(out));
1053
1054         DB((dbg, LEVEL_1, ">>> %+F -> %s\n", n, out->name));
1055         DEBUG_ONLY(vfp_dump_live(live));
1056
1057         op1_idx = x87_on_stack(state, arch_register_get_index(op1));
1058
1059         if (is_vfp_live(arch_register_get_index(op1), live)) {
1060                 /* push the operand here */
1061                 x87_create_fpush(state, n, op1_idx, UNOP_IDX);
1062                 op1_idx = 0;
1063         }
1064         else {
1065                 /* operand is dead, bring it to tos */
1066                 if (op1_idx != 0) {
1067                         x87_create_fxch(state, n, op1_idx);
1068                         op1_idx = 0;
1069                 }
1070         }
1071
1072         x87_set_tos(state, arch_register_get_index(out), x87_patch_insn(n, op));
1073         out_idx = 0;
1074         attr = get_ia32_x87_attr(n);
1075         attr->x87[0] = op1 = &ia32_st_regs[0];
1076         attr->x87[2] = out = &ia32_st_regs[0];
1077         DB((dbg, LEVEL_1, "<<< %s -> %s\n", get_irn_opname(n), out->name));
1078
1079         return NO_NODE_ADDED;
1080 }  /* sim_unop */
1081
1082 /**
1083  * Simulate a virtual Load instruction.
1084  *
1085  * @param state  the x87 state
1086  * @param n      the node that should be simulated (and patched)
1087  * @param op     the x87 opcode that will replace n's opcode
1088  *
1089  * @return NO_NODE_ADDED
1090  */
1091 static int sim_load(x87_state *state, ir_node *n, ir_op *op) {
1092         const arch_register_t *out = x87_get_irn_register(state->sim, n);
1093         ia32_x87_attr_t *attr;
1094
1095         DB((dbg, LEVEL_1, ">>> %+F -> %s\n", n, arch_register_get_name(out)));
1096         x87_push(state, arch_register_get_index(out), x87_patch_insn(n, op));
1097         assert(out == x87_get_irn_register(state->sim, n));
1098         attr = get_ia32_x87_attr(n);
1099         attr->x87[2] = out = &ia32_st_regs[0];
1100         DB((dbg, LEVEL_1, "<<< %s -> %s\n", get_irn_opname(n), arch_register_get_name(out)));
1101
1102         return NO_NODE_ADDED;
1103 }  /* sim_load */
1104
1105 /**
1106  * Rewire all users of @p old_val to @new_val iff they are scheduled after @p store.
1107  *
1108  * @param store   The store
1109  * @param old_val The former value
1110  * @param new_val The new value
1111  */
1112 static void collect_and_rewire_users(ir_node *store, ir_node *old_val, ir_node *new_val) {
1113         const ir_edge_t *edge, *ne;
1114
1115         foreach_out_edge_safe(old_val, edge, ne) {
1116                 ir_node *user = get_edge_src_irn(edge);
1117
1118                 if (! user || user == store)
1119                         continue;
1120
1121                 /* if the user is scheduled after the store: rewire */
1122                 if (sched_is_scheduled(user) && sched_comes_after(store, user)) {
1123                         int i;
1124                         /* find the input of the user pointing to the old value */
1125                         for (i = get_irn_arity(user) - 1; i >= 0; i--) {
1126                                 if (get_irn_n(user, i) == old_val)
1127                                         set_irn_n(user, i, new_val);
1128                         }
1129                 }
1130         }
1131 }  /* collect_and_rewire_users */
1132
1133 /**
1134  * Simulate a virtual Store.
1135  *
1136  * @param state  the x87 state
1137  * @param n      the node that should be simulated (and patched)
1138  * @param op     the x87 store opcode
1139  * @param op_p   the x87 store and pop opcode
1140  */
1141 static int sim_store(x87_state *state, ir_node *n, ir_op *op, ir_op *op_p) {
1142         x87_simulator         *sim = state->sim;
1143         ir_node               *val = get_irn_n(n, STORE_VAL_IDX);
1144         const arch_register_t *op2 = x87_get_irn_register(sim, val);
1145         unsigned              live = vfp_live_args_after(sim, n, 0);
1146         int                   insn = NO_NODE_ADDED;
1147         ia32_x87_attr_t *attr;
1148         int op2_reg_idx, op2_idx, depth;
1149         int live_after_node;
1150         ir_mode *mode;
1151
1152         op2_reg_idx = arch_register_get_index(op2);
1153         if (op2_reg_idx == REG_VFP_UKNWN) {
1154                 /* just take any value from stack */
1155                 if(state->depth > 0) {
1156                         op2_idx = 0;
1157                         DEBUG_ONLY(op2 = NULL);
1158                         live_after_node = 1;
1159                 } else {
1160                         /* produce a new value which we will consume immediately */
1161                         x87_create_fldz(state, n, op2_reg_idx);
1162                         live_after_node = 0;
1163                         op2_idx = x87_on_stack(state, op2_reg_idx);
1164                         assert(op2_idx >= 0);
1165                 }
1166         } else {
1167                 op2_idx = x87_on_stack(state, op2_reg_idx);
1168                 live_after_node = is_vfp_live(arch_register_get_index(op2), live);
1169                 DB((dbg, LEVEL_1, ">>> %+F %s ->\n", n, arch_register_get_name(op2)));
1170                 assert(op2_idx >= 0);
1171         }
1172
1173         mode  = get_ia32_ls_mode(n);
1174         depth = x87_get_depth(state);
1175
1176         if (live_after_node) {
1177                 /*
1178                         Problem: fst doesn't support mode_E (spills), only fstp does
1179                         Solution:
1180                                 - stack not full: push value and fstp
1181                                 - stack full: fstp value and load again
1182                 */
1183                 if (mode == mode_E) {
1184                         if (depth < N_x87_REGS) {
1185                                 /* ok, we have a free register: push + fstp */
1186                                 x87_create_fpush(state, n, op2_idx, STORE_VAL_IDX);
1187                                 x87_pop(state);
1188                                 x87_patch_insn(n, op_p);
1189                         } else {
1190                                 ir_node  *vfld, *mem, *block, *rproj, *mproj;
1191                                 ir_graph *irg;
1192
1193                                 /* stack full here: need fstp + load */
1194                                 x87_pop(state);
1195                                 x87_patch_insn(n, op_p);
1196
1197                                 block = get_nodes_block(n);
1198                                 irg   = get_irn_irg(n);
1199                                 vfld  = new_rd_ia32_vfld(NULL, irg, block, get_irn_n(n, 0), get_irn_n(n, 1), new_rd_NoMem(irg), get_ia32_ls_mode(n));
1200
1201                                 /* copy all attributes */
1202                                 set_ia32_frame_ent(vfld, get_ia32_frame_ent(n));
1203                                 if (is_ia32_use_frame(n))
1204                                         set_ia32_use_frame(vfld);
1205                                 set_ia32_am_flavour(vfld, get_ia32_am_flavour(n));
1206                                 set_ia32_op_type(vfld, ia32_am_Source);
1207                                 add_ia32_am_offs_int(vfld, get_ia32_am_offs_int(n));
1208                                 set_ia32_am_sc(vfld, get_ia32_am_sc(n));
1209                                 set_ia32_ls_mode(vfld, get_ia32_ls_mode(n));
1210
1211                                 rproj = new_r_Proj(irg, block, vfld, get_ia32_ls_mode(vfld), pn_ia32_vfld_res);
1212                                 mproj = new_r_Proj(irg, block, vfld, mode_M, pn_ia32_vfld_M);
1213                                 mem   = get_irn_Proj_for_mode(n, mode_M);
1214
1215                                 assert(mem && "Store memory not found");
1216
1217                                 arch_set_irn_register(sim->arch_env, rproj, op2);
1218
1219                                 /* reroute all former users of the store memory to the load memory */
1220                                 edges_reroute(mem, mproj, irg);
1221                                 /* set the memory input of the load to the store memory */
1222                                 set_irn_n(vfld, 2, mem);
1223
1224                                 sched_add_after(n, vfld);
1225                                 sched_add_after(vfld, rproj);
1226
1227                                 /* rewire all users, scheduled after the store, to the loaded value */
1228                                 collect_and_rewire_users(n, val, rproj);
1229
1230                                 insn = NODE_ADDED;
1231                         }
1232                 } else {
1233                         /* we can only store the tos to memory */
1234                         if (op2_idx != 0)
1235                                 x87_create_fxch(state, n, op2_idx);
1236
1237                         /* mode != mode_E -> use normal fst */
1238                         x87_patch_insn(n, op);
1239                 }
1240         } else {
1241                 /* we can only store the tos to memory */
1242                 if (op2_idx != 0)
1243                         x87_create_fxch(state, n, op2_idx);
1244
1245                 x87_pop(state);
1246                 x87_patch_insn(n, op_p);
1247         }
1248
1249         attr = get_ia32_x87_attr(n);
1250         attr->x87[1] = op2 = &ia32_st_regs[0];
1251         DB((dbg, LEVEL_1, "<<< %s %s ->\n", get_irn_opname(n), arch_register_get_name(op2)));
1252
1253         return insn;
1254 }  /* sim_store */
1255
1256 #define _GEN_BINOP(op, rev) \
1257 static int sim_##op(x87_state *state, ir_node *n) { \
1258         exchange_tmpl tmpl = { op_ia32_##op, op_ia32_##rev, op_ia32_##op##p, op_ia32_##rev##p }; \
1259         return sim_binop(state, n, &tmpl); \
1260 }
1261
1262 #define GEN_BINOP(op)   _GEN_BINOP(op, op)
1263 #define GEN_BINOPR(op)  _GEN_BINOP(op, op##r)
1264
1265 #define GEN_LOAD2(op, nop) \
1266 static int sim_##op(x87_state *state, ir_node *n) { \
1267         return sim_load(state, n, op_ia32_##nop); \
1268 }
1269
1270 #define GEN_LOAD(op)    GEN_LOAD2(op, op)
1271
1272 #define GEN_UNOP(op) \
1273 static int sim_##op(x87_state *state, ir_node *n) { \
1274         return sim_unop(state, n, op_ia32_##op); \
1275 }
1276
1277 #define GEN_STORE(op) \
1278 static int sim_##op(x87_state *state, ir_node *n) { \
1279         return sim_store(state, n, op_ia32_##op, op_ia32_##op##p); \
1280 }
1281
1282 /* all stubs */
1283 GEN_BINOP(fadd)
1284 GEN_BINOPR(fsub)
1285 GEN_BINOP(fmul)
1286 GEN_BINOPR(fdiv)
1287 GEN_BINOP(fprem)
1288
1289 GEN_UNOP(fabs)
1290 GEN_UNOP(fchs)
1291
1292 GEN_LOAD(fld)
1293 GEN_LOAD(fild)
1294 GEN_LOAD(fldz)
1295 GEN_LOAD(fld1)
1296
1297 GEN_STORE(fst)
1298 GEN_STORE(fist)
1299
1300 /**
1301  * Simulate a fCondJmp.
1302  *
1303  * @param state  the x87 state
1304  * @param n      the node that should be simulated (and patched)
1305  *
1306  * @return NO_NODE_ADDED
1307  */
1308 static int sim_fCondJmp(x87_state *state, ir_node *n) {
1309         int op1_idx;
1310         int op2_idx = -1;
1311         int pop_cnt = 0;
1312         ia32_x87_attr_t *attr;
1313         ir_op *dst;
1314         x87_simulator         *sim = state->sim;
1315         ir_node               *op1_node = get_irn_n(n, n_ia32_vfCondJmp_left);
1316         ir_node               *op2_node = get_irn_n(n, n_ia32_vfCondJmp_right);
1317         const arch_register_t *op1      = x87_get_irn_register(sim, op1_node);
1318         const arch_register_t *op2      = x87_get_irn_register(sim, op2_node);
1319         int reg_index_1 = arch_register_get_index(op1);
1320         int reg_index_2 = arch_register_get_index(op2);
1321         unsigned live = vfp_live_args_after(sim, n, 0);
1322
1323         DB((dbg, LEVEL_1, ">>> %+F %s, %s\n", n,
1324                 arch_register_get_name(op1), arch_register_get_name(op2)));
1325         DEBUG_ONLY(vfp_dump_live(live));
1326         DB((dbg, LEVEL_1, "Stack before: "));
1327         DEBUG_ONLY(x87_dump_stack(state));
1328
1329         op1_idx = x87_on_stack(state, reg_index_1);
1330         assert(op1_idx >= 0);
1331
1332         /* BEWARE: check for comp a,a cases, they might happen */
1333         if (reg_index_2 != REG_VFP_NOREG) {
1334                 /* second operand is a vfp register */
1335                 op2_idx = x87_on_stack(state, reg_index_2);
1336                 assert(op2_idx >= 0);
1337
1338                 if (is_vfp_live(arch_register_get_index(op2), live)) {
1339                         /* second operand is live */
1340
1341                         if (is_vfp_live(arch_register_get_index(op1), live)) {
1342                                 /* both operands are live */
1343
1344                                 if (op1_idx == 0) {
1345                                         /* res = tos X op */
1346                                         dst = op_ia32_fcomJmp;
1347                                 } else if (op2_idx == 0) {
1348                                         /* res = op X tos */
1349                                         dst = op_ia32_fcomrJmp;
1350                                 } else {
1351                                         /* bring the first one to tos */
1352                                         x87_create_fxch(state, n, op1_idx);
1353                                         if (op2_idx == 0)
1354                                                 op2_idx = op1_idx;
1355                                         op1_idx = 0;
1356                                         /* res = tos X op */
1357                                         dst     = op_ia32_fcomJmp;
1358                                 }
1359                         } else {
1360                                 /* second live, first operand is dead here, bring it to tos.
1361                                    This means further, op1_idx != op2_idx. */
1362                                 assert(op1_idx != op2_idx);
1363                                 if (op1_idx != 0) {
1364                                         x87_create_fxch(state, n, op1_idx);
1365                                         if (op2_idx == 0)
1366                                                 op2_idx = op1_idx;
1367                                         op1_idx = 0;
1368                                 }
1369                                 /* res = tos X op, pop */
1370                                 dst     = op_ia32_fcompJmp;
1371                                 pop_cnt = 1;
1372                         }
1373                 } else {
1374                         /* second operand is dead */
1375                         if (is_vfp_live(arch_register_get_index(op1), live)) {
1376                                 /* first operand is live: bring second to tos.
1377                                    This means further, op1_idx != op2_idx. */
1378                                 assert(op1_idx != op2_idx);
1379                                 if (op2_idx != 0) {
1380                                         x87_create_fxch(state, n, op2_idx);
1381                                         if (op1_idx == 0)
1382                                                 op1_idx = op2_idx;
1383                                         op2_idx = 0;
1384                                 }
1385                                 /* res = op X tos, pop */
1386                                 dst     = op_ia32_fcomrpJmp;
1387                                 pop_cnt = 1;
1388                         } else {
1389                                 /* both operands are dead here, check first for identity. */
1390                                 if (op1_idx == op2_idx) {
1391                                         /* identically, one pop needed */
1392                                         if (op1_idx != 0) {
1393                                                 x87_create_fxch(state, n, op1_idx);
1394                                                 op1_idx = 0;
1395                                                 op2_idx = 0;
1396                                         }
1397                                         /* res = tos X op, pop */
1398                                         dst     = op_ia32_fcompJmp;
1399                                         pop_cnt = 1;
1400                                 }
1401                                 /* different, move them to st and st(1) and pop both.
1402                                    The tricky part is to get one into st(1).*/
1403                                 else if (op2_idx == 1) {
1404                                         /* good, second operand is already in the right place, move the first */
1405                                         if (op1_idx != 0) {
1406                                                 /* bring the first on top */
1407                                                 x87_create_fxch(state, n, op1_idx);
1408                                                 assert(op2_idx != 0);
1409                                                 op1_idx = 0;
1410                                         }
1411                                         /* res = tos X op, pop, pop */
1412                                         dst     = op_ia32_fcomppJmp;
1413                                         pop_cnt = 2;
1414                                 } else if (op1_idx == 1) {
1415                                         /* good, first operand is already in the right place, move the second */
1416                                         if (op2_idx != 0) {
1417                                                 /* bring the first on top */
1418                                                 x87_create_fxch(state, n, op2_idx);
1419                                                 assert(op1_idx != 0);
1420                                                 op2_idx = 0;
1421                                         }
1422                                         dst     = op_ia32_fcomrppJmp;
1423                                         pop_cnt = 2;
1424                                 } else {
1425                                         /* if one is already the TOS, we need two fxch */
1426                                         if (op1_idx == 0) {
1427                                                 /* first one is TOS, move to st(1) */
1428                                                 x87_create_fxch(state, n, 1);
1429                                                 assert(op2_idx != 1);
1430                                                 op1_idx = 1;
1431                                                 x87_create_fxch(state, n, op2_idx);
1432                                                 op2_idx = 0;
1433                                                 /* res = op X tos, pop, pop */
1434                                                 dst     = op_ia32_fcomrppJmp;
1435                                                 pop_cnt = 2;
1436                                         } else if (op2_idx == 0) {
1437                                                 /* second one is TOS, move to st(1) */
1438                                                 x87_create_fxch(state, n, 1);
1439                                                 assert(op1_idx != 1);
1440                                                 op2_idx = 1;
1441                                                 x87_create_fxch(state, n, op1_idx);
1442                                                 op1_idx = 0;
1443                                                 /* res = tos X op, pop, pop */
1444                                                 dst     = op_ia32_fcomppJmp;
1445                                                 pop_cnt = 2;
1446                                         } else {
1447                                                 /* none of them is either TOS or st(1), 3 fxch needed */
1448                                                 x87_create_fxch(state, n, op2_idx);
1449                                                 assert(op1_idx != 0);
1450                                                 x87_create_fxch(state, n, 1);
1451                                                 op2_idx = 1;
1452                                                 x87_create_fxch(state, n, op1_idx);
1453                                                 op1_idx = 0;
1454                                                 /* res = tos X op, pop, pop */
1455                                                 dst     = op_ia32_fcomppJmp;
1456                                                 pop_cnt = 2;
1457                                         }
1458                                 }
1459                         }
1460                 }
1461         } else {
1462                 /* second operand is an address mode */
1463                 if (is_vfp_live(arch_register_get_index(op1), live)) {
1464                         /* first operand is live: bring it to TOS */
1465                         if (op1_idx != 0) {
1466                                 x87_create_fxch(state, n, op1_idx);
1467                                 op1_idx = 0;
1468                         }
1469                         dst = op_ia32_fcomJmp;
1470                 } else {
1471                         /* first operand is dead: bring it to tos */
1472                         if (op1_idx != 0) {
1473                                 x87_create_fxch(state, n, op1_idx);
1474                                 op1_idx = 0;
1475                         }
1476                         dst = op_ia32_fcompJmp;
1477                         pop_cnt = 1;
1478                 }
1479         }
1480
1481         x87_patch_insn(n, dst);
1482         assert(pop_cnt < 3);
1483         if (pop_cnt >= 2)
1484                 x87_pop(state);
1485         if (pop_cnt >= 1)
1486                 x87_pop(state);
1487
1488         /* patch the operation */
1489         attr = get_ia32_x87_attr(n);
1490         op1 = &ia32_st_regs[op1_idx];
1491         attr->x87[0] = op1;
1492         if (op2_idx >= 0) {
1493                 op2 = &ia32_st_regs[op2_idx];
1494                 attr->x87[1] = op2;
1495         }
1496         attr->x87[2] = NULL;
1497
1498         if (op2_idx >= 0)
1499                 DB((dbg, LEVEL_1, "<<< %s %s, %s\n", get_irn_opname(n),
1500                         arch_register_get_name(op1), arch_register_get_name(op2)));
1501         else
1502                 DB((dbg, LEVEL_1, "<<< %s %s, [AM]\n", get_irn_opname(n),
1503                         arch_register_get_name(op1)));
1504
1505         return NO_NODE_ADDED;
1506 }  /* sim_fCondJmp */
1507
1508 static
1509 int sim_Keep(x87_state *state, ir_node *node)
1510 {
1511         const ir_node         *op;
1512         const arch_register_t *op_reg;
1513         int                    reg_id;
1514         int                    op_stack_idx;
1515         unsigned               live;
1516
1517         op      = get_irn_n(node, 0);
1518         op_reg  = arch_get_irn_register(state->sim->arch_env, op);
1519         if(arch_register_get_class(op_reg) != &ia32_reg_classes[CLASS_ia32_vfp])
1520                 return NO_NODE_ADDED;
1521
1522         reg_id = arch_register_get_index(op_reg);
1523         live   = vfp_live_args_after(state->sim, node, 0);
1524
1525         op_stack_idx = x87_on_stack(state, reg_id);
1526         if(op_stack_idx >= 0 && !is_vfp_live(reg_id, live)) {
1527                 x87_create_fpop(state, sched_next(node), 1);
1528                 return NODE_ADDED;
1529         }
1530
1531         return NO_NODE_ADDED;
1532 }
1533
1534 static
1535 void keep_float_node_alive(x87_state *state, ir_node *node)
1536 {
1537         ir_graph                    *irg;
1538         ir_node                     *block;
1539         ir_node                     *in[1];
1540         ir_node                     *keep;
1541         const arch_register_class_t *cls;
1542
1543         irg    = get_irn_irg(node);
1544         block  = get_nodes_block(node);
1545         cls    = arch_get_irn_reg_class(state->sim->arch_env, node, -1);
1546         in[0]  = node;
1547         keep   = be_new_Keep(cls, irg, block, 1, in);
1548
1549         assert(sched_is_scheduled(node));
1550         sched_add_after(node, keep);
1551 }
1552
1553 /**
1554  * Create a copy of a node. Recreate the node if it's a constant.
1555  *
1556  * @param state  the x87 state
1557  * @param n      the node to be copied
1558  *
1559  * @return the copy of n
1560  */
1561 static ir_node *create_Copy(x87_state *state, ir_node *n) {
1562         x87_simulator *sim = state->sim;
1563         ir_graph *irg = get_irn_irg(n);
1564         dbg_info *n_dbg = get_irn_dbg_info(n);
1565         ir_mode *mode = get_irn_mode(n);
1566         ir_node *block = get_nodes_block(n);
1567         ir_node *pred = get_irn_n(n, 0);
1568         ir_node *(*cnstr)(dbg_info *, ir_graph *, ir_node *, ir_mode *) = NULL;
1569         ir_node *res;
1570         const arch_register_t *out;
1571         const arch_register_t *op1;
1572         ia32_x87_attr_t *attr;
1573
1574         /* Do not copy constants, recreate them. */
1575         switch (get_ia32_irn_opcode(pred)) {
1576         case iro_ia32_Unknown_VFP:
1577         case iro_ia32_fldz:
1578                 cnstr = new_rd_ia32_fldz;
1579                 break;
1580         case iro_ia32_fld1:
1581                 cnstr = new_rd_ia32_fld1;
1582                 break;
1583         case iro_ia32_fldpi:
1584                 cnstr = new_rd_ia32_fldpi;
1585                 break;
1586         case iro_ia32_fldl2e:
1587                 cnstr = new_rd_ia32_fldl2e;
1588                 break;
1589         case iro_ia32_fldl2t:
1590                 cnstr = new_rd_ia32_fldl2t;
1591                 break;
1592         case iro_ia32_fldlg2:
1593                 cnstr = new_rd_ia32_fldlg2;
1594                 break;
1595         case iro_ia32_fldln2:
1596                 cnstr = new_rd_ia32_fldln2;
1597                 break;
1598         default:
1599                 break;
1600         }
1601
1602         out = x87_get_irn_register(sim, n);
1603         op1 = x87_get_irn_register(sim, pred);
1604
1605         if (cnstr != NULL) {
1606                 /* copy a constant */
1607                 res = (*cnstr)(n_dbg, irg, block, mode);
1608
1609                 x87_push(state, arch_register_get_index(out), res);
1610
1611                 attr = get_ia32_x87_attr(res);
1612                 attr->x87[2] = &ia32_st_regs[0];
1613         } else {
1614                 int op1_idx = x87_on_stack(state, arch_register_get_index(op1));
1615
1616                 res = new_rd_ia32_fpushCopy(n_dbg, irg, block, pred, mode);
1617
1618                 x87_push(state, arch_register_get_index(out), res);
1619
1620                 attr = get_ia32_x87_attr(res);
1621                 attr->x87[0] = &ia32_st_regs[op1_idx];
1622                 attr->x87[2] = &ia32_st_regs[0];
1623         }
1624         arch_set_irn_register(sim->arch_env, res, out);
1625
1626         return res;
1627 }  /* create_Copy */
1628
1629 /**
1630  * Simulate a be_Copy.
1631  *
1632  * @param state  the x87 state
1633  * @param n      the node that should be simulated (and patched)
1634  *
1635  * @return NO_NODE_ADDED
1636  */
1637 static int sim_Copy(x87_state *state, ir_node *n) {
1638         x87_simulator         *sim;
1639         ir_node               *pred;
1640         const arch_register_t *out;
1641         const arch_register_t *op1;
1642         ir_node               *node, *next;
1643         ia32_x87_attr_t       *attr;
1644         int                   op1_idx, out_idx;
1645         unsigned              live;
1646
1647         ir_mode *mode = get_irn_mode(n);
1648
1649         if (!mode_is_float(mode))
1650                 return 0;
1651
1652         sim = state->sim;
1653         pred = get_irn_n(n, 0);
1654         out = x87_get_irn_register(sim, n);
1655         op1 = x87_get_irn_register(sim, pred);
1656         live = vfp_live_args_after(sim, n, REGMASK(out));
1657
1658         DB((dbg, LEVEL_1, ">>> %+F %s -> %s\n", n,
1659                 arch_register_get_name(op1), arch_register_get_name(out)));
1660         DEBUG_ONLY(vfp_dump_live(live));
1661
1662         /* handle the infamous unknown value */
1663         if (arch_register_get_index(op1) == REG_VFP_UKNWN) {
1664                 /* Operand is still live, a real copy. We need here an fpush that can
1665                    hold a a register, so use the fpushCopy or recreate constants */
1666                 node = create_Copy(state, n);
1667
1668                 assert(is_ia32_fldz(node));
1669                 next = sched_next(n);
1670                 sched_remove(n);
1671                 exchange(n, node);
1672                 sched_add_before(next, node);
1673
1674                 DB((dbg, LEVEL_1, "<<< %+F %s -> %s\n", node, op1->name,
1675                     arch_get_irn_register(sim->arch_env, node)->name));
1676                 return NO_NODE_ADDED;
1677         }
1678
1679         op1_idx = x87_on_stack(state, arch_register_get_index(op1));
1680
1681         if (is_vfp_live(arch_register_get_index(op1), live)) {
1682                 ir_node *pred = get_irn_n(n, 0);
1683
1684                 /* Operand is still live, a real copy. We need here an fpush that can
1685                    hold a a register, so use the fpushCopy or recreate constants */
1686                 node = create_Copy(state, n);
1687
1688                 /* We have to make sure the old value doesn't go dead (which can happen
1689                  * when we recreate constants). As the simulator expected that value in
1690                  * the pred blocks. This is unfortunate as removing it would save us 1
1691                  * instruction, but we would have to rerun all the simulation to get
1692                  * this correct...
1693                  */
1694                 next = sched_next(n);
1695                 sched_remove(n);
1696                 exchange(n, node);
1697                 sched_add_before(next, node);
1698
1699                 if(get_irn_n_edges(pred) == 0) {
1700                         keep_float_node_alive(state, pred);
1701                 }
1702
1703                 DB((dbg, LEVEL_1, "<<< %+F %s -> %s\n", node, op1->name,
1704                     arch_get_irn_register(sim->arch_env, node)->name));
1705         } else {
1706                 out_idx = x87_on_stack(state, arch_register_get_index(out));
1707
1708                 if (out_idx >= 0 && out_idx != op1_idx) {
1709                         /* Matze: out already on stack? how can this happen? */
1710                         assert(0);
1711
1712                         /* op1 must be killed and placed where out is */
1713                         if (out_idx == 0) {
1714                                 /* best case, simple remove and rename */
1715                                 x87_patch_insn(n, op_ia32_Pop);
1716                                 attr = get_ia32_x87_attr(n);
1717                                 attr->x87[0] = op1 = &ia32_st_regs[0];
1718
1719                                 x87_pop(state);
1720                                 x87_set_st(state, arch_register_get_index(out), n, op1_idx - 1);
1721                         } else {
1722                                 /* move op1 to tos, store and pop it */
1723                                 if (op1_idx != 0) {
1724                                         x87_create_fxch(state, n, op1_idx);
1725                                         op1_idx = 0;
1726                                 }
1727                                 x87_patch_insn(n, op_ia32_Pop);
1728                                 attr = get_ia32_x87_attr(n);
1729                                 attr->x87[0] = op1 = &ia32_st_regs[out_idx];
1730
1731                                 x87_pop(state);
1732                                 x87_set_st(state, arch_register_get_index(out), n, out_idx - 1);
1733                         }
1734                         DB((dbg, LEVEL_1, "<<< %+F %s\n", n, op1->name));
1735                 } else {
1736                         /* just a virtual copy */
1737                         x87_set_st(state, arch_register_get_index(out), get_unop_op(n), op1_idx);
1738                         /* don't remove the node to keep the verifier quiet :),
1739                            the emitter won't emit any code for the node */
1740 #if 0
1741                         sched_remove(n);
1742                         DB((dbg, LEVEL_1, "<<< KILLED %s\n", get_irn_opname(n)));
1743                         exchange(n, get_unop_op(n));
1744 #endif
1745                 }
1746         }
1747         return NO_NODE_ADDED;
1748 }  /* sim_Copy */
1749
1750 /**
1751  * Returns the result proj of the call, or NULL if the result is not used
1752  */
1753 static ir_node *get_call_result_proj(ir_node *call) {
1754         const ir_edge_t *edge;
1755         ir_node *resproj = NULL;
1756
1757         /* search the result proj */
1758         foreach_out_edge(call, edge) {
1759                 ir_node *proj = get_edge_src_irn(edge);
1760                 long pn = get_Proj_proj(proj);
1761
1762                 if (pn == pn_be_Call_first_res) {
1763                         resproj = proj;
1764                         break;
1765                 }
1766         }
1767         if (resproj == NULL) {
1768                 return NULL;
1769         }
1770
1771         /* the result proj is connected to a Keep and maybe other nodes */
1772         foreach_out_edge(resproj, edge) {
1773                 ir_node *pred = get_edge_src_irn(edge);
1774                 if (!be_is_Keep(pred)) {
1775                         return resproj;
1776                 }
1777         }
1778
1779         /* only be_Keep found, so result is not used */
1780         return NULL;
1781 }  /* get_call_result_proj */
1782
1783 /**
1784  * Simulate a be_Call.
1785  *
1786  * @param state      the x87 state
1787  * @param n          the node that should be simulated
1788  * @param arch_env   the architecture environment
1789  *
1790  * @return NO_NODE_ADDED
1791  */
1792 static int sim_Call(x87_state *state, ir_node *n, const arch_env_t *arch_env)
1793 {
1794         ir_type *call_tp = be_Call_get_type(n);
1795         ir_type *res_type;
1796         ir_mode *mode;
1797         ir_node *resproj;
1798         const arch_register_t *reg;
1799         (void) arch_env;
1800
1801         /* at the begin of a call the x87 state should be empty */
1802         assert(state->depth == 0 && "stack not empty before call");
1803
1804         if (get_method_n_ress(call_tp) <= 0)
1805                 return NO_NODE_ADDED;
1806
1807         /*
1808          * If the called function returns a float, it is returned in st(0).
1809          * This even happens if the return value is NOT used.
1810          * Moreover, only one return result is supported.
1811          */
1812         res_type = get_method_res_type(call_tp, 0);
1813         mode     = get_type_mode(res_type);
1814
1815         if (mode == NULL || !mode_is_float(mode))
1816                 return NO_NODE_ADDED;
1817
1818         resproj = get_call_result_proj(n);
1819         if (resproj == NULL)
1820                 return NO_NODE_ADDED;
1821
1822         reg = x87_get_irn_register(state->sim, resproj);
1823         x87_push(state, arch_register_get_index(reg), resproj);
1824
1825         return NO_NODE_ADDED;
1826 }  /* sim_Call */
1827
1828 /**
1829  * Simulate a be_Spill.
1830  *
1831  * @param state  the x87 state
1832  * @param n      the node that should be simulated (and patched)
1833  *
1834  * Should not happen, spills are lowered before x87 simulator see them.
1835  */
1836 static int sim_Spill(x87_state *state, ir_node *n) {
1837         assert(0 && "Spill not lowered");
1838         return sim_fst(state, n);
1839 }  /* sim_Spill */
1840
1841 /**
1842  * Simulate a be_Reload.
1843  *
1844  * @param state  the x87 state
1845  * @param n      the node that should be simulated (and patched)
1846  *
1847  * Should not happen, reloads are lowered before x87 simulator see them.
1848  */
1849 static int sim_Reload(x87_state *state, ir_node *n) {
1850         assert(0 && "Reload not lowered");
1851         return sim_fld(state, n);
1852 }  /* sim_Reload */
1853
1854 /**
1855  * Simulate a be_Return.
1856  *
1857  * @param state  the x87 state
1858  * @param n      the node that should be simulated (and patched)
1859  *
1860  * @return NO_NODE_ADDED
1861  */
1862 static int sim_Return(x87_state *state, ir_node *n) {
1863         int n_res = be_Return_get_n_rets(n);
1864         int i, n_float_res = 0;
1865
1866         /* only floating point return values must resist on stack */
1867         for (i = 0; i < n_res; ++i) {
1868                 ir_node *res = get_irn_n(n, be_pos_Return_val + i);
1869
1870                 if (mode_is_float(get_irn_mode(res)))
1871                         ++n_float_res;
1872         }
1873         assert(x87_get_depth(state) == n_float_res);
1874
1875         /* pop them virtually */
1876         for (i = n_float_res - 1; i >= 0; --i)
1877                 x87_pop(state);
1878
1879         return NO_NODE_ADDED;
1880 }  /* sim_Return */
1881
1882 typedef struct _perm_data_t {
1883         const arch_register_t *in;
1884         const arch_register_t *out;
1885 } perm_data_t;
1886
1887 /**
1888  * Simulate a be_Perm.
1889  *
1890  * @param state  the x87 state
1891  * @param irn    the node that should be simulated (and patched)
1892  *
1893  * @return NO_NODE_ADDED
1894  */
1895 static int sim_Perm(x87_state *state, ir_node *irn) {
1896         int             i, n;
1897         x87_simulator   *sim = state->sim;
1898         ir_node         *pred = get_irn_n(irn, 0);
1899         int             *stack_pos;
1900         const ir_edge_t *edge;
1901
1902         /* handle only floating point Perms */
1903         if (! mode_is_float(get_irn_mode(pred)))
1904                 return NO_NODE_ADDED;
1905
1906         DB((dbg, LEVEL_1, ">>> %+F\n", irn));
1907
1908         /* Perm is a pure virtual instruction on x87.
1909            All inputs must be on the FPU stack and are pairwise
1910            different from each other.
1911            So, all we need to do is to permutate the stack state. */
1912         n = get_irn_arity(irn);
1913         NEW_ARR_A(int, stack_pos, n);
1914
1915         /* collect old stack positions */
1916         for (i = 0; i < n; ++i) {
1917                 const arch_register_t *inreg = x87_get_irn_register(sim, get_irn_n(irn, i));
1918                 int idx = x87_on_stack(state, arch_register_get_index(inreg));
1919
1920                 assert(idx >= 0 && "Perm argument not on x87 stack");
1921
1922                 stack_pos[i] = idx;
1923         }
1924         /* now do the permutation */
1925         foreach_out_edge(irn, edge) {
1926                 ir_node               *proj = get_edge_src_irn(edge);
1927                 const arch_register_t *out  = x87_get_irn_register(sim, proj);
1928                 long                  num   = get_Proj_proj(proj);
1929
1930                 assert(0 <= num && num < n && "More Proj's than Perm inputs");
1931                 x87_set_st(state, arch_register_get_index(out), proj, stack_pos[(unsigned)num]);
1932         }
1933         DB((dbg, LEVEL_1, "<<< %+F\n", irn));
1934
1935         return NO_NODE_ADDED;
1936 }  /* sim_Perm */
1937
1938 /**
1939  * Kill any dead registers at block start by popping them from the stack.
1940  *
1941  * @param sim          the simulator handle
1942  * @param block        the current block
1943  * @param start_state  the x87 state at the begin of the block
1944  *
1945  * @return the x87 state after dead register killed
1946  */
1947 static x87_state *x87_kill_deads(x87_simulator *sim, ir_node *block, x87_state *start_state) {
1948         x87_state *state = start_state;
1949         ir_node *first_insn = sched_first(block);
1950         ir_node *keep = NULL;
1951         unsigned live = vfp_live_args_after(sim, block, 0);
1952         unsigned kill_mask;
1953         int i, depth, num_pop;
1954
1955         kill_mask = 0;
1956         depth = x87_get_depth(state);
1957         for (i = depth - 1; i >= 0; --i) {
1958                 int reg = x87_get_st_reg(state, i);
1959
1960                 if (! is_vfp_live(reg, live))
1961                         kill_mask |= (1 << i);
1962         }
1963
1964         if (kill_mask) {
1965                 /* create a new state, will be changed */
1966                 state = x87_clone_state(sim, state);
1967
1968                 DB((dbg, LEVEL_1, "Killing deads:\n"));
1969                 DEBUG_ONLY(vfp_dump_live(live));
1970                 DEBUG_ONLY(x87_dump_stack(state));
1971
1972                 /* now kill registers */
1973                 while (kill_mask) {
1974                         /* we can only kill from TOS, so bring them up */
1975                         if (! (kill_mask & 1)) {
1976                                 /* search from behind, because we can to a double-pop */
1977                                 for (i = depth - 1; i >= 0; --i) {
1978                                         if (kill_mask & (1 << i)) {
1979                                                 kill_mask &= ~(1 << i);
1980                                                 kill_mask |= 1;
1981                                                 break;
1982                                         }
1983                                 }
1984
1985                                 if (keep)
1986                                         x87_set_st(state, -1, keep, i);
1987                                 x87_create_fxch(state, first_insn, i);
1988                         }
1989
1990                         if ((kill_mask & 3) == 3) {
1991                                 /* we can do a double-pop */
1992                                 num_pop = 2;
1993                         }
1994                         else {
1995                                 /* only a single pop */
1996                                 num_pop = 1;
1997                         }
1998
1999                         depth -= num_pop;
2000                         kill_mask >>= num_pop;
2001                         keep = x87_create_fpop(state, first_insn, num_pop);
2002                 }
2003                 keep_alive(keep);
2004         }
2005         return state;
2006 }  /* x87_kill_deads */
2007
2008 /**
2009  * If we have PhiEs with unknown operands then we have to make sure that some
2010  * value is actually put onto the stack.
2011  */
2012 static void fix_unknown_phis(x87_state *state, ir_node *block,
2013                              ir_node *pred_block, int pos)
2014 {
2015         ir_node *node, *op;
2016
2017         sched_foreach(block, node) {
2018                 ir_node               *zero;
2019                 const arch_register_t *reg;
2020                 ia32_x87_attr_t       *attr;
2021
2022                 if(!is_Phi(node))
2023                         break;
2024
2025                 op = get_Phi_pred(node, pos);
2026                 if(!is_ia32_Unknown_VFP(op))
2027                         continue;
2028
2029                 reg = arch_get_irn_register(state->sim->arch_env, node);
2030
2031                 /* create a zero at end of pred block */
2032                 zero = new_rd_ia32_fldz(NULL, current_ir_graph, pred_block, mode_E);
2033                 x87_push(state, arch_register_get_index(reg), zero);
2034
2035                 attr = get_ia32_x87_attr(zero);
2036                 attr->x87[2] = &ia32_st_regs[0];
2037
2038                 assert(is_ia32_fldz(zero));
2039                 sched_add_before(sched_last(pred_block), zero);
2040
2041                 set_Phi_pred(node, pos, zero);
2042         }
2043 }
2044
2045 /**
2046  * Run a simulation and fix all virtual instructions for a block.
2047  *
2048  * @param sim          the simulator handle
2049  * @param block        the current block
2050  */
2051 static void x87_simulate_block(x87_simulator *sim, ir_node *block) {
2052         ir_node *n, *next;
2053         blk_state *bl_state = x87_get_bl_state(sim, block);
2054         x87_state *state = bl_state->begin;
2055         const ir_edge_t *edge;
2056         ir_node *start_block;
2057
2058         assert(state != NULL);
2059         /* already processed? */
2060         if (bl_state->end != NULL)
2061                 return;
2062
2063         DB((dbg, LEVEL_1, "Simulate %+F\n", block));
2064         DB((dbg, LEVEL_2, "State at Block begin:\n "));
2065         DEBUG_ONLY(x87_dump_stack(state));
2066
2067         /* at block begin, kill all dead registers */
2068         state = x87_kill_deads(sim, block, state);
2069         /* create a new state, will be changed */
2070         state = x87_clone_state(sim, state);
2071
2072         /* beware, n might change */
2073         for (n = sched_first(block); !sched_is_end(n); n = next) {
2074                 int node_inserted;
2075                 sim_func func;
2076                 ir_op *op = get_irn_op(n);
2077
2078                 next = sched_next(n);
2079                 if (op->ops.generic == NULL)
2080                         continue;
2081
2082                 func = (sim_func)op->ops.generic;
2083
2084                 /* simulate it */
2085                 node_inserted = (*func)(state, n);
2086
2087                 /*
2088                         sim_func might have added an additional node after n,
2089                         so update next node
2090                         beware: n must not be changed by sim_func
2091                         (i.e. removed from schedule) in this case
2092                 */
2093                 if (node_inserted != NO_NODE_ADDED)
2094                         next = sched_next(n);
2095         }
2096
2097         start_block = get_irg_start_block(get_irn_irg(block));
2098
2099         DB((dbg, LEVEL_2, "State at Block end:\n ")); DEBUG_ONLY(x87_dump_stack(state));
2100
2101         /* check if the state must be shuffled */
2102         foreach_block_succ(block, edge) {
2103                 ir_node *succ = get_edge_src_irn(edge);
2104                 blk_state *succ_state;
2105
2106                 if (succ == start_block)
2107                         continue;
2108
2109                 succ_state = x87_get_bl_state(sim, succ);
2110
2111                 fix_unknown_phis(state, succ, block, get_edge_src_pos(edge));
2112
2113                 if (succ_state->begin == NULL) {
2114                         DB((dbg, LEVEL_2, "Set begin state for succ %+F:\n", succ));
2115                         DEBUG_ONLY(x87_dump_stack(state));
2116                         succ_state->begin = state;
2117
2118                         waitq_put(sim->worklist, succ);
2119                 } else {
2120                         DB((dbg, LEVEL_2, "succ %+F already has a state, shuffling\n", succ));
2121                         /* There is already a begin state for the successor, bad.
2122                            Do the necessary permutations.
2123                            Note that critical edges are removed, so this is always possible:
2124                            If the successor has more than one possible input, then it must
2125                            be the only one.
2126                          */
2127                         x87_shuffle(sim, block, state, succ, succ_state->begin);
2128                 }
2129         }
2130         bl_state->end = state;
2131 }  /* x87_simulate_block */
2132
2133 /**
2134  * Create a new x87 simulator.
2135  *
2136  * @param sim       a simulator handle, will be initialized
2137  * @param irg       the current graph
2138  * @param arch_env  the architecture environment
2139  */
2140 static void x87_init_simulator(x87_simulator *sim, ir_graph *irg,
2141                                const arch_env_t *arch_env)
2142 {
2143         obstack_init(&sim->obst);
2144         sim->blk_states = pmap_create();
2145         sim->arch_env   = arch_env;
2146         sim->n_idx      = get_irg_last_idx(irg);
2147         sim->live       = obstack_alloc(&sim->obst, sizeof(*sim->live) * sim->n_idx);
2148
2149         DB((dbg, LEVEL_1, "--------------------------------\n"
2150                 "x87 Simulator started for %+F\n", irg));
2151
2152         /* set the generic function pointer of instruction we must simulate */
2153         clear_irp_opcodes_generic_func();
2154
2155 #define ASSOC(op)       (op_ ## op)->ops.generic = (op_func)(sim_##op)
2156 #define ASSOC_IA32(op)  (op_ia32_v ## op)->ops.generic = (op_func)(sim_##op)
2157 #define ASSOC_BE(op)    (op_be_ ## op)->ops.generic = (op_func)(sim_##op)
2158         ASSOC_IA32(fld);
2159         ASSOC_IA32(fild);
2160         ASSOC_IA32(fld1);
2161         ASSOC_IA32(fldz);
2162         ASSOC_IA32(fadd);
2163         ASSOC_IA32(fsub);
2164         ASSOC_IA32(fmul);
2165         ASSOC_IA32(fdiv);
2166         ASSOC_IA32(fprem);
2167         ASSOC_IA32(fabs);
2168         ASSOC_IA32(fchs);
2169         ASSOC_IA32(fist);
2170         ASSOC_IA32(fst);
2171         ASSOC_IA32(fCondJmp);
2172         ASSOC_BE(Copy);
2173         ASSOC_BE(Call);
2174         ASSOC_BE(Spill);
2175         ASSOC_BE(Reload);
2176         ASSOC_BE(Return);
2177         ASSOC_BE(Perm);
2178         ASSOC_BE(Keep);
2179 #undef ASSOC_BE
2180 #undef ASSOC_IA32
2181 #undef ASSOC
2182 }  /* x87_init_simulator */
2183
2184 /**
2185  * Destroy a x87 simulator.
2186  *
2187  * @param sim  the simulator handle
2188  */
2189 static void x87_destroy_simulator(x87_simulator *sim) {
2190         pmap_destroy(sim->blk_states);
2191         obstack_free(&sim->obst, NULL);
2192         DB((dbg, LEVEL_1, "x87 Simulator stopped\n\n"));
2193 }  /* x87_destroy_simulator */
2194
2195 /**
2196  * Pre-block walker: calculate the liveness information for the block
2197  * and store it into the sim->live cache.
2198  */
2199 static void update_liveness_walker(ir_node *block, void *data) {
2200         x87_simulator *sim = data;
2201         update_liveness(sim, block);
2202 }  /* update_liveness_walker */
2203
2204 /**
2205  * Run a simulation and fix all virtual instructions for a graph.
2206  *
2207  * @param env       the architecture environment
2208  * @param irg       the current graph
2209  *
2210  * Needs a block-schedule.
2211  */
2212 void x87_simulate_graph(const arch_env_t *arch_env, be_irg_t *birg) {
2213         ir_node       *block, *start_block;
2214         blk_state     *bl_state;
2215         x87_simulator sim;
2216         ir_graph      *irg = be_get_birg_irg(birg);
2217
2218         /* create the simulator */
2219         x87_init_simulator(&sim, irg, arch_env);
2220
2221         start_block = get_irg_start_block(irg);
2222         bl_state = x87_get_bl_state(&sim, start_block);
2223
2224         /* start with the empty state */
2225         bl_state->begin = empty;
2226         empty->sim      = &sim;
2227
2228         sim.worklist = new_waitq();
2229         waitq_put(sim.worklist, start_block);
2230
2231         be_assure_liveness(birg);
2232         sim.lv = be_get_birg_liveness(birg);
2233 //      sim.lv = be_liveness(be_get_birg_irg(birg));
2234         be_liveness_assure_sets(sim.lv);
2235
2236         /* Calculate the liveness for all nodes. We must precalculate this info,
2237          * because the simulator adds new nodes (possible before Phi nodes) which
2238          * would let a lazy calculation fail.
2239          * On the other hand we reduce the computation amount due to
2240          * precaching from O(n^2) to O(n) at the expense of O(n) cache memory.
2241          */
2242         irg_block_walk_graph(irg, update_liveness_walker, NULL, &sim);
2243
2244         /* iterate */
2245         do {
2246                 block = waitq_get(sim.worklist);
2247                 x87_simulate_block(&sim, block);
2248         } while (! waitq_empty(sim.worklist));
2249
2250         /* kill it */
2251         del_waitq(sim.worklist);
2252         x87_destroy_simulator(&sim);
2253 }  /* x87_simulate_graph */
2254
2255 void ia32_init_x87(void) {
2256         FIRM_DBG_REGISTER(dbg, "firm.be.ia32.x87");
2257 }  /* ia32_init_x87 */