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