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