Fixed some problems due to refactoring in previous revisions.
[libfirm] / ir / be / ia32 / ia32_transform.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 IR transformation from firm into
23  *              ia32-Firm.
24  * @author      Christian Wuerdig, Matthias Braun
25  * @version     $Id$
26  */
27 #include "config.h"
28
29 #include <limits.h>
30 #include <stdbool.h>
31
32 #include "irargs_t.h"
33 #include "irnode_t.h"
34 #include "irgraph_t.h"
35 #include "irmode_t.h"
36 #include "iropt_t.h"
37 #include "irop_t.h"
38 #include "irprog_t.h"
39 #include "iredges_t.h"
40 #include "irgmod.h"
41 #include "irvrfy.h"
42 #include "ircons.h"
43 #include "irgwalk.h"
44 #include "irprintf.h"
45 #include "debug.h"
46 #include "irdom.h"
47 #include "error.h"
48 #include "array_t.h"
49 #include "height.h"
50
51 #include "../benode.h"
52 #include "../besched.h"
53 #include "../beabi.h"
54 #include "../beutil.h"
55 #include "../beirg.h"
56 #include "../betranshlp.h"
57 #include "../be_t.h"
58
59 #include "bearch_ia32_t.h"
60 #include "ia32_common_transform.h"
61 #include "ia32_nodes_attr.h"
62 #include "ia32_transform.h"
63 #include "ia32_new_nodes.h"
64 #include "ia32_map_regs.h"
65 #include "ia32_dbg_stat.h"
66 #include "ia32_optimize.h"
67 #include "ia32_util.h"
68 #include "ia32_address_mode.h"
69 #include "ia32_architecture.h"
70
71 #include "gen_ia32_regalloc_if.h"
72
73 /* define this to construct SSE constants instead of load them */
74 #undef CONSTRUCT_SSE_CONST
75
76
77 #define SFP_SIGN   "0x80000000"
78 #define DFP_SIGN   "0x8000000000000000"
79 #define SFP_ABS    "0x7FFFFFFF"
80 #define DFP_ABS    "0x7FFFFFFFFFFFFFFF"
81 #define DFP_INTMAX "9223372036854775807"
82 #define ULL_BIAS   "18446744073709551616"
83
84 #define ENT_SFP_SIGN ".LC_ia32_sfp_sign"
85 #define ENT_DFP_SIGN ".LC_ia32_dfp_sign"
86 #define ENT_SFP_ABS  ".LC_ia32_sfp_abs"
87 #define ENT_DFP_ABS  ".LC_ia32_dfp_abs"
88 #define ENT_ULL_BIAS ".LC_ia32_ull_bias"
89
90 #define mode_vfp        (ia32_reg_classes[CLASS_ia32_vfp].mode)
91 #define mode_xmm    (ia32_reg_classes[CLASS_ia32_xmm].mode)
92
93 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
94
95 static ir_node         *initial_fpcw = NULL;
96 int                     no_pic_adjust;
97
98 typedef ir_node *construct_binop_func(dbg_info *db, ir_node *block,
99         ir_node *base, ir_node *index, ir_node *mem, ir_node *op1,
100         ir_node *op2);
101
102 typedef ir_node *construct_binop_flags_func(dbg_info *db, ir_node *block,
103         ir_node *base, ir_node *index, ir_node *mem, ir_node *op1, ir_node *op2,
104         ir_node *flags);
105
106 typedef ir_node *construct_shift_func(dbg_info *db, ir_node *block,
107         ir_node *op1, ir_node *op2);
108
109 typedef ir_node *construct_binop_dest_func(dbg_info *db, ir_node *block,
110         ir_node *base, ir_node *index, ir_node *mem, ir_node *op);
111
112 typedef ir_node *construct_unop_dest_func(dbg_info *db, ir_node *block,
113         ir_node *base, ir_node *index, ir_node *mem);
114
115 typedef ir_node *construct_binop_float_func(dbg_info *db, ir_node *block,
116         ir_node *base, ir_node *index, ir_node *mem, ir_node *op1, ir_node *op2,
117         ir_node *fpcw);
118
119 typedef ir_node *construct_unop_func(dbg_info *db, ir_node *block, ir_node *op);
120
121 static ir_node *create_immediate_or_transform(ir_node *node,
122                                               char immediate_constraint_type);
123
124 static ir_node *create_I2I_Conv(ir_mode *src_mode, ir_mode *tgt_mode,
125                                 dbg_info *dbgi, ir_node *block,
126                                 ir_node *op, ir_node *orig_node);
127
128 /* its enough to have those once */
129 static ir_node *nomem, *noreg_GP;
130
131 /** a list to postprocess all calls */
132 static ir_node **call_list;
133 static ir_type **call_types;
134
135 /** Return non-zero is a node represents the 0 constant. */
136 static bool is_Const_0(ir_node *node)
137 {
138         return is_Const(node) && is_Const_null(node);
139 }
140
141 /** Return non-zero is a node represents the 1 constant. */
142 static bool is_Const_1(ir_node *node)
143 {
144         return is_Const(node) && is_Const_one(node);
145 }
146
147 /** Return non-zero is a node represents the -1 constant. */
148 static bool is_Const_Minus_1(ir_node *node)
149 {
150         return is_Const(node) && is_Const_all_one(node);
151 }
152
153 /**
154  * returns true if constant can be created with a simple float command
155  */
156 static bool is_simple_x87_Const(ir_node *node)
157 {
158         tarval *tv = get_Const_tarval(node);
159         if (tarval_is_null(tv) || tarval_is_one(tv))
160                 return true;
161
162         /* TODO: match all the other float constants */
163         return false;
164 }
165
166 /**
167  * returns true if constant can be created with a simple float command
168  */
169 static bool is_simple_sse_Const(ir_node *node)
170 {
171         tarval  *tv   = get_Const_tarval(node);
172         ir_mode *mode = get_tarval_mode(tv);
173
174         if (mode == mode_F)
175                 return true;
176
177         if (tarval_is_null(tv)
178 #ifdef CONSTRUCT_SSE_CONST
179             || tarval_is_one(tv)
180 #endif
181            )
182                 return true;
183 #ifdef CONSTRUCT_SSE_CONST
184         if (mode == mode_D) {
185                 unsigned val = get_tarval_sub_bits(tv, 0) |
186                         (get_tarval_sub_bits(tv, 1) << 8) |
187                         (get_tarval_sub_bits(tv, 2) << 16) |
188                         (get_tarval_sub_bits(tv, 3) << 24);
189                 if (val == 0)
190                         /* lower 32bit are zero, really a 32bit constant */
191                         return true;
192         }
193 #endif /* CONSTRUCT_SSE_CONST */
194         /* TODO: match all the other float constants */
195         return false;
196 }
197
198 /**
199  * Transforms a Const.
200  */
201 static ir_node *gen_Const(ir_node *node)
202 {
203         ir_node  *old_block = get_nodes_block(node);
204         ir_node  *block     = be_transform_node(old_block);
205         dbg_info *dbgi      = get_irn_dbg_info(node);
206         ir_mode  *mode      = get_irn_mode(node);
207
208         assert(is_Const(node));
209
210         if (mode_is_float(mode)) {
211                 ir_node   *res   = NULL;
212                 ir_node   *load;
213                 ir_entity *floatent;
214
215                 if (ia32_cg_config.use_sse2) {
216                         tarval *tv = get_Const_tarval(node);
217                         if (tarval_is_null(tv)) {
218                                 load = new_bd_ia32_xZero(dbgi, block);
219                                 set_ia32_ls_mode(load, mode);
220                                 res  = load;
221 #ifdef CONSTRUCT_SSE_CONST
222                         } else if (tarval_is_one(tv)) {
223                                 int     cnst  = mode == mode_F ? 26 : 55;
224                                 ir_node *imm1 = ia32_create_Immediate(NULL, 0, cnst);
225                                 ir_node *imm2 = ia32_create_Immediate(NULL, 0, 2);
226                                 ir_node *pslld, *psrld;
227
228                                 load = new_bd_ia32_xAllOnes(dbgi, block);
229                                 set_ia32_ls_mode(load, mode);
230                                 pslld = new_bd_ia32_xPslld(dbgi, block, load, imm1);
231                                 set_ia32_ls_mode(pslld, mode);
232                                 psrld = new_bd_ia32_xPsrld(dbgi, block, pslld, imm2);
233                                 set_ia32_ls_mode(psrld, mode);
234                                 res = psrld;
235 #endif /* CONSTRUCT_SSE_CONST */
236                         } else if (mode == mode_F) {
237                                 /* we can place any 32bit constant by using a movd gp, sse */
238                                 unsigned val = get_tarval_sub_bits(tv, 0) |
239                                                (get_tarval_sub_bits(tv, 1) << 8) |
240                                                (get_tarval_sub_bits(tv, 2) << 16) |
241                                                (get_tarval_sub_bits(tv, 3) << 24);
242                                 ir_node *cnst = new_bd_ia32_Const(dbgi, block, NULL, 0, 0, val);
243                                 load = new_bd_ia32_xMovd(dbgi, block, cnst);
244                                 set_ia32_ls_mode(load, mode);
245                                 res = load;
246                         } else {
247 #ifdef CONSTRUCT_SSE_CONST
248                                 if (mode == mode_D) {
249                                         unsigned val = get_tarval_sub_bits(tv, 0) |
250                                                 (get_tarval_sub_bits(tv, 1) << 8) |
251                                                 (get_tarval_sub_bits(tv, 2) << 16) |
252                                                 (get_tarval_sub_bits(tv, 3) << 24);
253                                         if (val == 0) {
254                                                 ir_node *imm32 = ia32_create_Immediate(NULL, 0, 32);
255                                                 ir_node *cnst, *psllq;
256
257                                                 /* fine, lower 32bit are zero, produce 32bit value */
258                                                 val = get_tarval_sub_bits(tv, 4) |
259                                                         (get_tarval_sub_bits(tv, 5) << 8) |
260                                                         (get_tarval_sub_bits(tv, 6) << 16) |
261                                                         (get_tarval_sub_bits(tv, 7) << 24);
262                                                 cnst = new_bd_ia32_Const(dbgi, block, NULL, 0, 0, val);
263                                                 load = new_bd_ia32_xMovd(dbgi, block, cnst);
264                                                 set_ia32_ls_mode(load, mode);
265                                                 psllq = new_bd_ia32_xPsllq(dbgi, block, load, imm32);
266                                                 set_ia32_ls_mode(psllq, mode);
267                                                 res = psllq;
268                                                 goto end;
269                                         }
270                                 }
271 #endif /* CONSTRUCT_SSE_CONST */
272                                 floatent = create_float_const_entity(node);
273
274                                 load     = new_bd_ia32_xLoad(dbgi, block, noreg_GP, noreg_GP, nomem, mode);
275                                 set_ia32_op_type(load, ia32_AddrModeS);
276                                 set_ia32_am_sc(load, floatent);
277                                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
278                                 res = new_r_Proj(block, load, mode_xmm, pn_ia32_xLoad_res);
279                         }
280                 } else {
281                         if (is_Const_null(node)) {
282                                 load = new_bd_ia32_vfldz(dbgi, block);
283                                 res  = load;
284                                 set_ia32_ls_mode(load, mode);
285                         } else if (is_Const_one(node)) {
286                                 load = new_bd_ia32_vfld1(dbgi, block);
287                                 res  = load;
288                                 set_ia32_ls_mode(load, mode);
289                         } else {
290                                 ir_mode *ls_mode;
291
292                                 floatent = create_float_const_entity(node);
293                                 /* create_float_const_ent is smart and sometimes creates
294                                    smaller entities */
295                                 ls_mode  = get_type_mode(get_entity_type(floatent));
296
297                                 load     = new_bd_ia32_vfld(dbgi, block, noreg_GP, noreg_GP, nomem,
298                                                             ls_mode);
299                                 set_ia32_op_type(load, ia32_AddrModeS);
300                                 set_ia32_am_sc(load, floatent);
301                                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
302                                 res = new_r_Proj(block, load, mode_vfp, pn_ia32_vfld_res);
303                         }
304                 }
305 #ifdef CONSTRUCT_SSE_CONST
306 end:
307 #endif /* CONSTRUCT_SSE_CONST */
308                 SET_IA32_ORIG_NODE(load, node);
309
310                 be_dep_on_frame(load);
311                 return res;
312         } else { /* non-float mode */
313                 ir_node *cnst;
314                 tarval  *tv = get_Const_tarval(node);
315                 long     val;
316
317                 tv = tarval_convert_to(tv, mode_Iu);
318
319                 if (tv == get_tarval_bad() || tv == get_tarval_undefined() ||
320                     tv == NULL) {
321                         panic("couldn't convert constant tarval (%+F)", node);
322                 }
323                 val = get_tarval_long(tv);
324
325                 cnst = new_bd_ia32_Const(dbgi, block, NULL, 0, 0, val);
326                 SET_IA32_ORIG_NODE(cnst, node);
327
328                 be_dep_on_frame(cnst);
329                 return cnst;
330         }
331 }
332
333 /**
334  * Transforms a SymConst.
335  */
336 static ir_node *gen_SymConst(ir_node *node)
337 {
338         ir_node  *old_block = get_nodes_block(node);
339         ir_node  *block = be_transform_node(old_block);
340         dbg_info *dbgi  = get_irn_dbg_info(node);
341         ir_mode  *mode  = get_irn_mode(node);
342         ir_node  *cnst;
343
344         if (mode_is_float(mode)) {
345                 if (ia32_cg_config.use_sse2)
346                         cnst = new_bd_ia32_xLoad(dbgi, block, noreg_GP, noreg_GP, nomem, mode_E);
347                 else
348                         cnst = new_bd_ia32_vfld(dbgi, block, noreg_GP, noreg_GP, nomem, mode_E);
349                 set_ia32_am_sc(cnst, get_SymConst_entity(node));
350                 set_ia32_use_frame(cnst);
351         } else {
352                 ir_entity *entity;
353
354                 if (get_SymConst_kind(node) != symconst_addr_ent) {
355                         panic("backend only support symconst_addr_ent (at %+F)", node);
356                 }
357                 entity = get_SymConst_entity(node);
358                 cnst = new_bd_ia32_Const(dbgi, block, entity, 0, 0, 0);
359         }
360
361         SET_IA32_ORIG_NODE(cnst, node);
362
363         be_dep_on_frame(cnst);
364         return cnst;
365 }
366
367 /**
368  * Create a float type for the given mode and cache it.
369  *
370  * @param mode   the mode for the float type (might be integer mode for SSE2 types)
371  * @param align  alignment
372  */
373 static ir_type *ia32_create_float_type(ir_mode *mode, unsigned align) {
374         char    buf[32];
375         ir_type *tp;
376
377         assert(align <= 16);
378
379         if (mode == mode_Iu) {
380                 static ir_type *int_Iu[16] = {NULL, };
381
382                 if (int_Iu[align] == NULL) {
383                         snprintf(buf, sizeof(buf), "int_Iu_%u", align);
384                         int_Iu[align] = tp = new_type_primitive(new_id_from_str(buf), mode);
385                         /* set the specified alignment */
386                         set_type_alignment_bytes(tp, align);
387                 }
388                 return int_Iu[align];
389         } else if (mode == mode_Lu) {
390                 static ir_type *int_Lu[16] = {NULL, };
391
392                 if (int_Lu[align] == NULL) {
393                         snprintf(buf, sizeof(buf), "int_Lu_%u", align);
394                         int_Lu[align] = tp = new_type_primitive(new_id_from_str(buf), mode);
395                         /* set the specified alignment */
396                         set_type_alignment_bytes(tp, align);
397                 }
398                 return int_Lu[align];
399         } else if (mode == mode_F) {
400                 static ir_type *float_F[16] = {NULL, };
401
402                 if (float_F[align] == NULL) {
403                         snprintf(buf, sizeof(buf), "float_F_%u", align);
404                         float_F[align] = tp = new_type_primitive(new_id_from_str(buf), mode);
405                         /* set the specified alignment */
406                         set_type_alignment_bytes(tp, align);
407                 }
408                 return float_F[align];
409         } else if (mode == mode_D) {
410                 static ir_type *float_D[16] = {NULL, };
411
412                 if (float_D[align] == NULL) {
413                         snprintf(buf, sizeof(buf), "float_D_%u", align);
414                         float_D[align] = tp = new_type_primitive(new_id_from_str(buf), mode);
415                         /* set the specified alignment */
416                         set_type_alignment_bytes(tp, align);
417                 }
418                 return float_D[align];
419         } else {
420                 static ir_type *float_E[16] = {NULL, };
421
422                 if (float_E[align] == NULL) {
423                         snprintf(buf, sizeof(buf), "float_E_%u", align);
424                         float_E[align] = tp = new_type_primitive(new_id_from_str(buf), mode);
425                         /* set the specified alignment */
426                         set_type_alignment_bytes(tp, align);
427                 }
428                 return float_E[align];
429         }
430 }
431
432 /**
433  * Create a float[2] array type for the given atomic type.
434  *
435  * @param tp  the atomic type
436  */
437 static ir_type *ia32_create_float_array(ir_type *tp) {
438         char     buf[32];
439         ir_mode  *mode = get_type_mode(tp);
440         unsigned align = get_type_alignment_bytes(tp);
441         ir_type  *arr;
442
443         assert(align <= 16);
444
445         if (mode == mode_F) {
446                 static ir_type *float_F[16] = {NULL, };
447
448                 if (float_F[align] != NULL)
449                         return float_F[align];
450                 snprintf(buf, sizeof(buf), "arr_float_F_%u", align);
451                 arr = float_F[align] = new_type_array(new_id_from_str(buf), 1, tp);
452         } else if (mode == mode_D) {
453                 static ir_type *float_D[16] = {NULL, };
454
455                 if (float_D[align] != NULL)
456                         return float_D[align];
457                 snprintf(buf, sizeof(buf), "arr_float_D_%u", align);
458                 arr = float_D[align] = new_type_array(new_id_from_str(buf), 1, tp);
459         } else {
460                 static ir_type *float_E[16] = {NULL, };
461
462                 if (float_E[align] != NULL)
463                         return float_E[align];
464                 snprintf(buf, sizeof(buf), "arr_float_E_%u", align);
465                 arr = float_E[align] = new_type_array(new_id_from_str(buf), 1, tp);
466         }
467         set_type_alignment_bytes(arr, align);
468         set_type_size_bytes(arr, 2 * get_type_size_bytes(tp));
469         set_type_state(arr, layout_fixed);
470         return arr;
471 }
472
473 /* Generates an entity for a known FP const (used for FP Neg + Abs) */
474 ir_entity *ia32_gen_fp_known_const(ia32_known_const_t kct)
475 {
476         static const struct {
477                 const char *ent_name;
478                 const char *cnst_str;
479                 char mode;
480                 unsigned char align;
481         } names [ia32_known_const_max] = {
482                 { ENT_SFP_SIGN, SFP_SIGN,   0, 16 }, /* ia32_SSIGN */
483                 { ENT_DFP_SIGN, DFP_SIGN,   1, 16 }, /* ia32_DSIGN */
484                 { ENT_SFP_ABS,  SFP_ABS,    0, 16 }, /* ia32_SABS */
485                 { ENT_DFP_ABS,  DFP_ABS,    1, 16 }, /* ia32_DABS */
486                 { ENT_ULL_BIAS, ULL_BIAS,   2, 4 }   /* ia32_ULLBIAS */
487         };
488         static ir_entity *ent_cache[ia32_known_const_max];
489
490         const char    *ent_name, *cnst_str;
491         ir_type       *tp;
492         ir_entity     *ent;
493         tarval        *tv;
494         ir_mode       *mode;
495
496         ent_name = names[kct].ent_name;
497         if (! ent_cache[kct]) {
498                 cnst_str = names[kct].cnst_str;
499
500                 switch (names[kct].mode) {
501                 case 0:  mode = mode_Iu; break;
502                 case 1:  mode = mode_Lu; break;
503                 default: mode = mode_F;  break;
504                 }
505                 tv  = new_tarval_from_str(cnst_str, strlen(cnst_str), mode);
506                 tp  = ia32_create_float_type(mode, names[kct].align);
507
508                 if (kct == ia32_ULLBIAS)
509                         tp = ia32_create_float_array(tp);
510                 ent = new_entity(get_glob_type(), new_id_from_str(ent_name), tp);
511
512                 set_entity_ld_ident(ent, get_entity_ident(ent));
513                 set_entity_visibility(ent, visibility_local);
514                 set_entity_variability(ent, variability_constant);
515                 set_entity_allocation(ent, allocation_static);
516
517                 if (kct == ia32_ULLBIAS) {
518                         ir_initializer_t *initializer = create_initializer_compound(2);
519
520                         set_initializer_compound_value(initializer, 0,
521                                 create_initializer_tarval(get_tarval_null(mode)));
522                         set_initializer_compound_value(initializer, 1,
523                                 create_initializer_tarval(tv));
524
525                         set_entity_initializer(ent, initializer);
526                 } else {
527                         set_entity_initializer(ent, create_initializer_tarval(tv));
528                 }
529
530                 /* cache the entry */
531                 ent_cache[kct] = ent;
532         }
533
534         return ent_cache[kct];
535 }
536
537 /**
538  * return true if the node is a Proj(Load) and could be used in source address
539  * mode for another node. Will return only true if the @p other node is not
540  * dependent on the memory of the Load (for binary operations use the other
541  * input here, for unary operations use NULL).
542  */
543 static int ia32_use_source_address_mode(ir_node *block, ir_node *node,
544                                         ir_node *other, ir_node *other2, match_flags_t flags)
545 {
546         ir_node *load;
547         long     pn;
548
549         /* float constants are always available */
550         if (is_Const(node)) {
551                 ir_mode *mode = get_irn_mode(node);
552                 if (mode_is_float(mode)) {
553                         if (ia32_cg_config.use_sse2) {
554                                 if (is_simple_sse_Const(node))
555                                         return 0;
556                         } else {
557                                 if (is_simple_x87_Const(node))
558                                         return 0;
559                         }
560                         if (get_irn_n_edges(node) > 1)
561                                 return 0;
562                         return 1;
563                 }
564         }
565
566         if (!is_Proj(node))
567                 return 0;
568         load = get_Proj_pred(node);
569         pn   = get_Proj_proj(node);
570         if (!is_Load(load) || pn != pn_Load_res)
571                 return 0;
572         if (get_nodes_block(load) != block)
573                 return 0;
574         /* we only use address mode if we're the only user of the load */
575         if (get_irn_n_edges(node) != (flags & match_two_users ? 2 : 1))
576                 return 0;
577         /* in some edge cases with address mode we might reach the load normally
578          * and through some AM sequence, if it is already materialized then we
579          * can't create an AM node from it */
580         if (be_is_transformed(node))
581                 return 0;
582
583         /* don't do AM if other node inputs depend on the load (via mem-proj) */
584         if (other != NULL && prevents_AM(block, load, other))
585                 return 0;
586
587         if (other2 != NULL && prevents_AM(block, load, other2))
588                 return 0;
589
590         return 1;
591 }
592
593 typedef struct ia32_address_mode_t ia32_address_mode_t;
594 struct ia32_address_mode_t {
595         ia32_address_t  addr;
596         ir_mode        *ls_mode;
597         ir_node        *mem_proj;
598         ir_node        *am_node;
599         ia32_op_type_t  op_type;
600         ir_node        *new_op1;
601         ir_node        *new_op2;
602         op_pin_state    pinned;
603         unsigned        commutative  : 1;
604         unsigned        ins_permuted : 1;
605 };
606
607 static void build_address_ptr(ia32_address_t *addr, ir_node *ptr, ir_node *mem)
608 {
609         /* construct load address */
610         memset(addr, 0, sizeof(addr[0]));
611         ia32_create_address_mode(addr, ptr, 0);
612
613         addr->base  = addr->base  ? be_transform_node(addr->base)  : noreg_GP;
614         addr->index = addr->index ? be_transform_node(addr->index) : noreg_GP;
615         addr->mem   = be_transform_node(mem);
616 }
617
618 static void build_address(ia32_address_mode_t *am, ir_node *node,
619                           ia32_create_am_flags_t flags)
620 {
621         ia32_address_t *addr = &am->addr;
622         ir_node        *load;
623         ir_node        *ptr;
624         ir_node        *mem;
625         ir_node        *new_mem;
626
627         if (is_Const(node)) {
628                 ir_entity *entity  = create_float_const_entity(node);
629                 addr->base         = noreg_GP;
630                 addr->index        = noreg_GP;
631                 addr->mem          = nomem;
632                 addr->symconst_ent = entity;
633                 addr->use_frame    = 1;
634                 am->ls_mode        = get_type_mode(get_entity_type(entity));
635                 am->pinned         = op_pin_state_floats;
636                 return;
637         }
638
639         load         = get_Proj_pred(node);
640         ptr          = get_Load_ptr(load);
641         mem          = get_Load_mem(load);
642         new_mem      = be_transform_node(mem);
643         am->pinned   = get_irn_pinned(load);
644         am->ls_mode  = get_Load_mode(load);
645         am->mem_proj = be_get_Proj_for_pn(load, pn_Load_M);
646         am->am_node  = node;
647
648         /* construct load address */
649         ia32_create_address_mode(addr, ptr, flags);
650
651         addr->base  = addr->base  ? be_transform_node(addr->base)  : noreg_GP;
652         addr->index = addr->index ? be_transform_node(addr->index) : noreg_GP;
653         addr->mem   = new_mem;
654 }
655
656 static void set_address(ir_node *node, const ia32_address_t *addr)
657 {
658         set_ia32_am_scale(node, addr->scale);
659         set_ia32_am_sc(node, addr->symconst_ent);
660         set_ia32_am_offs_int(node, addr->offset);
661         if (addr->symconst_sign)
662                 set_ia32_am_sc_sign(node);
663         if (addr->use_frame)
664                 set_ia32_use_frame(node);
665         set_ia32_frame_ent(node, addr->frame_entity);
666 }
667
668 /**
669  * Apply attributes of a given address mode to a node.
670  */
671 static void set_am_attributes(ir_node *node, const ia32_address_mode_t *am)
672 {
673         set_address(node, &am->addr);
674
675         set_ia32_op_type(node, am->op_type);
676         set_ia32_ls_mode(node, am->ls_mode);
677         if (am->pinned == op_pin_state_pinned) {
678                 /* beware: some nodes are already pinned and did not allow to change the state */
679                 if (get_irn_pinned(node) != op_pin_state_pinned)
680                         set_irn_pinned(node, op_pin_state_pinned);
681         }
682         if (am->commutative)
683                 set_ia32_commutative(node);
684 }
685
686 /**
687  * Check, if a given node is a Down-Conv, ie. a integer Conv
688  * from a mode with a mode with more bits to a mode with lesser bits.
689  * Moreover, we return only true if the node has not more than 1 user.
690  *
691  * @param node   the node
692  * @return non-zero if node is a Down-Conv
693  */
694 static int is_downconv(const ir_node *node)
695 {
696         ir_mode *src_mode;
697         ir_mode *dest_mode;
698
699         if (!is_Conv(node))
700                 return 0;
701
702         /* we only want to skip the conv when we're the only user
703          * (not optimal but for now...)
704          */
705         if (get_irn_n_edges(node) > 1)
706                 return 0;
707
708         src_mode  = get_irn_mode(get_Conv_op(node));
709         dest_mode = get_irn_mode(node);
710         return
711                 ia32_mode_needs_gp_reg(src_mode)  &&
712                 ia32_mode_needs_gp_reg(dest_mode) &&
713                 get_mode_size_bits(dest_mode) <= get_mode_size_bits(src_mode);
714 }
715
716 /* Skip all Down-Conv's on a given node and return the resulting node. */
717 ir_node *ia32_skip_downconv(ir_node *node)
718 {
719         while (is_downconv(node))
720                 node = get_Conv_op(node);
721
722         return node;
723 }
724
725 static ir_node *create_upconv(ir_node *node, ir_node *orig_node)
726 {
727         ir_mode  *mode = get_irn_mode(node);
728         ir_node  *block;
729         ir_mode  *tgt_mode;
730         dbg_info *dbgi;
731
732         if (mode_is_signed(mode)) {
733                 tgt_mode = mode_Is;
734         } else {
735                 tgt_mode = mode_Iu;
736         }
737         block = get_nodes_block(node);
738         dbgi  = get_irn_dbg_info(node);
739
740         return create_I2I_Conv(mode, tgt_mode, dbgi, block, node, orig_node);
741 }
742
743 /**
744  * matches operands of a node into ia32 addressing/operand modes. This covers
745  * usage of source address mode, immediates, operations with non 32-bit modes,
746  * ...
747  * The resulting data is filled into the @p am struct. block is the block
748  * of the node whose arguments are matched. op1, op2 are the first and second
749  * input that are matched (op1 may be NULL). other_op is another unrelated
750  * input that is not matched! but which is needed sometimes to check if AM
751  * for op1/op2 is legal.
752  * @p flags describes the supported modes of the operation in detail.
753  */
754 static void match_arguments(ia32_address_mode_t *am, ir_node *block,
755                             ir_node *op1, ir_node *op2, ir_node *other_op,
756                             match_flags_t flags)
757 {
758         ia32_address_t *addr      = &am->addr;
759         ir_mode        *mode      = get_irn_mode(op2);
760         int             mode_bits = get_mode_size_bits(mode);
761         ir_node        *new_op1, *new_op2;
762         int             use_am;
763         unsigned        commutative;
764         int             use_am_and_immediates;
765         int             use_immediate;
766
767         memset(am, 0, sizeof(am[0]));
768
769         commutative           = (flags & match_commutative) != 0;
770         use_am_and_immediates = (flags & match_am_and_immediates) != 0;
771         use_am                = (flags & match_am) != 0;
772         use_immediate         = (flags & match_immediate) != 0;
773         assert(!use_am_and_immediates || use_immediate);
774
775         assert(op2 != NULL);
776         assert(!commutative || op1 != NULL);
777         assert(use_am || !(flags & match_8bit_am));
778         assert(use_am || !(flags & match_16bit_am));
779
780         if ((mode_bits ==  8 && !(flags & match_8bit_am)) ||
781             (mode_bits == 16 && !(flags & match_16bit_am))) {
782                 use_am = 0;
783         }
784
785         /* we can simply skip downconvs for mode neutral nodes: the upper bits
786          * can be random for these operations */
787         if (flags & match_mode_neutral) {
788                 op2 = ia32_skip_downconv(op2);
789                 if (op1 != NULL) {
790                         op1 = ia32_skip_downconv(op1);
791                 }
792         }
793
794         /* match immediates. firm nodes are normalized: constants are always on the
795          * op2 input */
796         new_op2 = NULL;
797         if (!(flags & match_try_am) && use_immediate) {
798                 new_op2 = try_create_Immediate(op2, 0);
799         }
800
801         if (new_op2 == NULL &&
802             use_am && ia32_use_source_address_mode(block, op2, op1, other_op, flags)) {
803                 build_address(am, op2, 0);
804                 new_op1     = (op1 == NULL ? NULL : be_transform_node(op1));
805                 if (mode_is_float(mode)) {
806                         new_op2 = ia32_new_NoReg_vfp(env_cg);
807                 } else {
808                         new_op2 = noreg_GP;
809                 }
810                 am->op_type = ia32_AddrModeS;
811         } else if (commutative && (new_op2 == NULL || use_am_and_immediates) &&
812                        use_am &&
813                        ia32_use_source_address_mode(block, op1, op2, other_op, flags)) {
814                 ir_node *noreg;
815                 build_address(am, op1, 0);
816
817                 if (mode_is_float(mode)) {
818                         noreg = ia32_new_NoReg_vfp(env_cg);
819                 } else {
820                         noreg = noreg_GP;
821                 }
822
823                 if (new_op2 != NULL) {
824                         new_op1 = noreg;
825                 } else {
826                         new_op1 = be_transform_node(op2);
827                         new_op2 = noreg;
828                         am->ins_permuted = 1;
829                 }
830                 am->op_type = ia32_AddrModeS;
831         } else {
832                 am->op_type = ia32_Normal;
833
834                 if (flags & match_try_am) {
835                         am->new_op1 = NULL;
836                         am->new_op2 = NULL;
837                         return;
838                 }
839
840                 new_op1 = (op1 == NULL ? NULL : be_transform_node(op1));
841                 if (new_op2 == NULL)
842                         new_op2 = be_transform_node(op2);
843                 am->ls_mode =
844                         (flags & match_mode_neutral ? mode_Iu : get_irn_mode(op2));
845         }
846         if (addr->base == NULL)
847                 addr->base = noreg_GP;
848         if (addr->index == NULL)
849                 addr->index = noreg_GP;
850         if (addr->mem == NULL)
851                 addr->mem = nomem;
852
853         am->new_op1     = new_op1;
854         am->new_op2     = new_op2;
855         am->commutative = commutative;
856 }
857
858 /**
859  * "Fixes" a node that uses address mode by turning it into mode_T
860  * and returning a pn_ia32_res Proj.
861  *
862  * @param node  the node
863  * @param am    its address mode
864  *
865  * @return a Proj(pn_ia32_res) if a memory address mode is used,
866  *         node else
867  */
868 static ir_node *fix_mem_proj(ir_node *node, ia32_address_mode_t *am)
869 {
870         ir_mode  *mode;
871         ir_node  *load;
872
873         if (am->mem_proj == NULL)
874                 return node;
875
876         /* we have to create a mode_T so the old MemProj can attach to us */
877         mode = get_irn_mode(node);
878         load = get_Proj_pred(am->mem_proj);
879
880         be_set_transformed_node(load, node);
881
882         if (mode != mode_T) {
883                 set_irn_mode(node, mode_T);
884                 return new_rd_Proj(NULL, get_nodes_block(node), node, mode, pn_ia32_res);
885         } else {
886                 return node;
887         }
888 }
889
890 /**
891  * Construct a standard binary operation, set AM and immediate if required.
892  *
893  * @param node  The original node for which the binop is created
894  * @param op1   The first operand
895  * @param op2   The second operand
896  * @param func  The node constructor function
897  * @return The constructed ia32 node.
898  */
899 static ir_node *gen_binop(ir_node *node, ir_node *op1, ir_node *op2,
900                           construct_binop_func *func, match_flags_t flags)
901 {
902         dbg_info            *dbgi;
903         ir_node             *block, *new_block, *new_node;
904         ia32_address_mode_t  am;
905         ia32_address_t      *addr = &am.addr;
906
907         block = get_nodes_block(node);
908         match_arguments(&am, block, op1, op2, NULL, flags);
909
910         dbgi      = get_irn_dbg_info(node);
911         new_block = be_transform_node(block);
912         new_node  = func(dbgi, new_block, addr->base, addr->index, addr->mem,
913                         am.new_op1, am.new_op2);
914         set_am_attributes(new_node, &am);
915         /* we can't use source address mode anymore when using immediates */
916         if (!(flags & match_am_and_immediates) &&
917             (is_ia32_Immediate(am.new_op1) || is_ia32_Immediate(am.new_op2)))
918                 set_ia32_am_support(new_node, ia32_am_none);
919         SET_IA32_ORIG_NODE(new_node, node);
920
921         new_node = fix_mem_proj(new_node, &am);
922
923         return new_node;
924 }
925
926 /**
927  * Generic names for the inputs of an ia32 binary op.
928  */
929 enum {
930         n_ia32_l_binop_left,  /**< ia32 left input */
931         n_ia32_l_binop_right, /**< ia32 right input */
932         n_ia32_l_binop_eflags /**< ia32 eflags input */
933 };
934 COMPILETIME_ASSERT(n_ia32_l_binop_left   == n_ia32_l_Adc_left,       n_Adc_left)
935 COMPILETIME_ASSERT(n_ia32_l_binop_right  == n_ia32_l_Adc_right,      n_Adc_right)
936 COMPILETIME_ASSERT(n_ia32_l_binop_eflags == n_ia32_l_Adc_eflags,     n_Adc_eflags)
937 COMPILETIME_ASSERT(n_ia32_l_binop_left   == n_ia32_l_Sbb_minuend,    n_Sbb_minuend)
938 COMPILETIME_ASSERT(n_ia32_l_binop_right  == n_ia32_l_Sbb_subtrahend, n_Sbb_subtrahend)
939 COMPILETIME_ASSERT(n_ia32_l_binop_eflags == n_ia32_l_Sbb_eflags,     n_Sbb_eflags)
940
941 /**
942  * Construct a binary operation which also consumes the eflags.
943  *
944  * @param node  The node to transform
945  * @param func  The node constructor function
946  * @param flags The match flags
947  * @return      The constructor ia32 node
948  */
949 static ir_node *gen_binop_flags(ir_node *node, construct_binop_flags_func *func,
950                                 match_flags_t flags)
951 {
952         ir_node             *src_block  = get_nodes_block(node);
953         ir_node             *op1        = get_irn_n(node, n_ia32_l_binop_left);
954         ir_node             *op2        = get_irn_n(node, n_ia32_l_binop_right);
955         ir_node             *eflags     = get_irn_n(node, n_ia32_l_binop_eflags);
956         dbg_info            *dbgi;
957         ir_node             *block, *new_node, *new_eflags;
958         ia32_address_mode_t  am;
959         ia32_address_t      *addr       = &am.addr;
960
961         match_arguments(&am, src_block, op1, op2, eflags, flags);
962
963         dbgi       = get_irn_dbg_info(node);
964         block      = be_transform_node(src_block);
965         new_eflags = be_transform_node(eflags);
966         new_node   = func(dbgi, block, addr->base, addr->index, addr->mem,
967                           am.new_op1, am.new_op2, new_eflags);
968         set_am_attributes(new_node, &am);
969         /* we can't use source address mode anymore when using immediates */
970         if (!(flags & match_am_and_immediates) &&
971             (is_ia32_Immediate(am.new_op1) || is_ia32_Immediate(am.new_op2)))
972                 set_ia32_am_support(new_node, ia32_am_none);
973         SET_IA32_ORIG_NODE(new_node, node);
974
975         new_node = fix_mem_proj(new_node, &am);
976
977         return new_node;
978 }
979
980 static ir_node *get_fpcw(void)
981 {
982         ir_node *fpcw;
983         if (initial_fpcw != NULL)
984                 return initial_fpcw;
985
986         fpcw         = be_abi_get_ignore_irn(env_cg->birg->abi,
987                                              &ia32_fp_cw_regs[REG_FPCW]);
988         initial_fpcw = be_transform_node(fpcw);
989
990         return initial_fpcw;
991 }
992
993 /**
994  * Construct a standard binary operation, set AM and immediate if required.
995  *
996  * @param op1   The first operand
997  * @param op2   The second operand
998  * @param func  The node constructor function
999  * @return The constructed ia32 node.
1000  */
1001 static ir_node *gen_binop_x87_float(ir_node *node, ir_node *op1, ir_node *op2,
1002                                     construct_binop_float_func *func)
1003 {
1004         ir_mode             *mode = get_irn_mode(node);
1005         dbg_info            *dbgi;
1006         ir_node             *block, *new_block, *new_node;
1007         ia32_address_mode_t  am;
1008         ia32_address_t      *addr = &am.addr;
1009         ia32_x87_attr_t     *attr;
1010         /* All operations are considered commutative, because there are reverse
1011          * variants */
1012         match_flags_t        flags = match_commutative;
1013
1014         /* happens for div nodes... */
1015         if (mode == mode_T)
1016                 mode = get_divop_resmod(node);
1017
1018         /* cannot use address mode with long double on x87 */
1019         if (get_mode_size_bits(mode) <= 64)
1020                 flags |= match_am;
1021
1022         block = get_nodes_block(node);
1023         match_arguments(&am, block, op1, op2, NULL, flags);
1024
1025         dbgi      = get_irn_dbg_info(node);
1026         new_block = be_transform_node(block);
1027         new_node  = func(dbgi, new_block, addr->base, addr->index, addr->mem,
1028                          am.new_op1, am.new_op2, get_fpcw());
1029         set_am_attributes(new_node, &am);
1030
1031         attr = get_ia32_x87_attr(new_node);
1032         attr->attr.data.ins_permuted = am.ins_permuted;
1033
1034         SET_IA32_ORIG_NODE(new_node, node);
1035
1036         new_node = fix_mem_proj(new_node, &am);
1037
1038         return new_node;
1039 }
1040
1041 /**
1042  * Construct a shift/rotate binary operation, sets AM and immediate if required.
1043  *
1044  * @param op1   The first operand
1045  * @param op2   The second operand
1046  * @param func  The node constructor function
1047  * @return The constructed ia32 node.
1048  */
1049 static ir_node *gen_shift_binop(ir_node *node, ir_node *op1, ir_node *op2,
1050                                 construct_shift_func *func,
1051                                 match_flags_t flags)
1052 {
1053         dbg_info *dbgi;
1054         ir_node  *block, *new_block, *new_op1, *new_op2, *new_node;
1055
1056         assert(! mode_is_float(get_irn_mode(node)));
1057         assert(flags & match_immediate);
1058         assert((flags & ~(match_mode_neutral | match_immediate)) == 0);
1059
1060         if (flags & match_mode_neutral) {
1061                 op1     = ia32_skip_downconv(op1);
1062                 new_op1 = be_transform_node(op1);
1063         } else if (get_mode_size_bits(get_irn_mode(node)) != 32) {
1064                 new_op1 = create_upconv(op1, node);
1065         } else {
1066                 new_op1 = be_transform_node(op1);
1067         }
1068
1069         /* the shift amount can be any mode that is bigger than 5 bits, since all
1070          * other bits are ignored anyway */
1071         while (is_Conv(op2) && get_irn_n_edges(op2) == 1) {
1072                 ir_node *const op = get_Conv_op(op2);
1073                 if (mode_is_float(get_irn_mode(op)))
1074                         break;
1075                 op2 = op;
1076                 assert(get_mode_size_bits(get_irn_mode(op2)) >= 5);
1077         }
1078         new_op2 = create_immediate_or_transform(op2, 0);
1079
1080         dbgi      = get_irn_dbg_info(node);
1081         block     = get_nodes_block(node);
1082         new_block = be_transform_node(block);
1083         new_node  = func(dbgi, new_block, new_op1, new_op2);
1084         SET_IA32_ORIG_NODE(new_node, node);
1085
1086         /* lowered shift instruction may have a dependency operand, handle it here */
1087         if (get_irn_arity(node) == 3) {
1088                 /* we have a dependency */
1089                 ir_node *new_dep = be_transform_node(get_irn_n(node, 2));
1090                 add_irn_dep(new_node, new_dep);
1091         }
1092
1093         return new_node;
1094 }
1095
1096
1097 /**
1098  * Construct a standard unary operation, set AM and immediate if required.
1099  *
1100  * @param op    The operand
1101  * @param func  The node constructor function
1102  * @return The constructed ia32 node.
1103  */
1104 static ir_node *gen_unop(ir_node *node, ir_node *op, construct_unop_func *func,
1105                          match_flags_t flags)
1106 {
1107         dbg_info *dbgi;
1108         ir_node  *block, *new_block, *new_op, *new_node;
1109
1110         assert(flags == 0 || flags == match_mode_neutral);
1111         if (flags & match_mode_neutral) {
1112                 op = ia32_skip_downconv(op);
1113         }
1114
1115         new_op    = be_transform_node(op);
1116         dbgi      = get_irn_dbg_info(node);
1117         block     = get_nodes_block(node);
1118         new_block = be_transform_node(block);
1119         new_node  = func(dbgi, new_block, new_op);
1120
1121         SET_IA32_ORIG_NODE(new_node, node);
1122
1123         return new_node;
1124 }
1125
1126 static ir_node *create_lea_from_address(dbg_info *dbgi, ir_node *block,
1127                                         ia32_address_t *addr)
1128 {
1129         ir_node *base, *index, *res;
1130
1131         base = addr->base;
1132         if (base == NULL) {
1133                 base = noreg_GP;
1134         } else {
1135                 base = be_transform_node(base);
1136         }
1137
1138         index = addr->index;
1139         if (index == NULL) {
1140                 index = noreg_GP;
1141         } else {
1142                 index = be_transform_node(index);
1143         }
1144
1145         res = new_bd_ia32_Lea(dbgi, block, base, index);
1146         set_address(res, addr);
1147
1148         return res;
1149 }
1150
1151 /**
1152  * Returns non-zero if a given address mode has a symbolic or
1153  * numerical offset != 0.
1154  */
1155 static int am_has_immediates(const ia32_address_t *addr)
1156 {
1157         return addr->offset != 0 || addr->symconst_ent != NULL
1158                 || addr->frame_entity || addr->use_frame;
1159 }
1160
1161 /**
1162  * Creates an ia32 Add.
1163  *
1164  * @return the created ia32 Add node
1165  */
1166 static ir_node *gen_Add(ir_node *node)
1167 {
1168         ir_mode  *mode = get_irn_mode(node);
1169         ir_node  *op1  = get_Add_left(node);
1170         ir_node  *op2  = get_Add_right(node);
1171         dbg_info *dbgi;
1172         ir_node  *block, *new_block, *new_node, *add_immediate_op;
1173         ia32_address_t       addr;
1174         ia32_address_mode_t  am;
1175
1176         if (mode_is_float(mode)) {
1177                 if (ia32_cg_config.use_sse2)
1178                         return gen_binop(node, op1, op2, new_bd_ia32_xAdd,
1179                                          match_commutative | match_am);
1180                 else
1181                         return gen_binop_x87_float(node, op1, op2, new_bd_ia32_vfadd);
1182         }
1183
1184         ia32_mark_non_am(node);
1185
1186         op2 = ia32_skip_downconv(op2);
1187         op1 = ia32_skip_downconv(op1);
1188
1189         /**
1190          * Rules for an Add:
1191          *   0. Immediate Trees (example Add(Symconst, Const) -> Const)
1192          *   1. Add with immediate -> Lea
1193          *   2. Add with possible source address mode -> Add
1194          *   3. Otherwise -> Lea
1195          */
1196         memset(&addr, 0, sizeof(addr));
1197         ia32_create_address_mode(&addr, node, ia32_create_am_force);
1198         add_immediate_op = NULL;
1199
1200         dbgi      = get_irn_dbg_info(node);
1201         block     = get_nodes_block(node);
1202         new_block = be_transform_node(block);
1203
1204         /* a constant? */
1205         if (addr.base == NULL && addr.index == NULL) {
1206                 new_node = new_bd_ia32_Const(dbgi, new_block, addr.symconst_ent,
1207                                              addr.symconst_sign, 0, addr.offset);
1208                 be_dep_on_frame(new_node);
1209                 SET_IA32_ORIG_NODE(new_node, node);
1210                 return new_node;
1211         }
1212         /* add with immediate? */
1213         if (addr.index == NULL) {
1214                 add_immediate_op = addr.base;
1215         } else if (addr.base == NULL && addr.scale == 0) {
1216                 add_immediate_op = addr.index;
1217         }
1218
1219         if (add_immediate_op != NULL) {
1220                 if (!am_has_immediates(&addr)) {
1221 #ifdef DEBUG_libfirm
1222                         ir_fprintf(stderr, "Optimisation warning Add x,0 (%+F) found\n",
1223                                            node);
1224 #endif
1225                         return be_transform_node(add_immediate_op);
1226                 }
1227
1228                 new_node = create_lea_from_address(dbgi, new_block, &addr);
1229                 SET_IA32_ORIG_NODE(new_node, node);
1230                 return new_node;
1231         }
1232
1233         /* test if we can use source address mode */
1234         match_arguments(&am, block, op1, op2, NULL, match_commutative
1235                         | match_mode_neutral | match_am | match_immediate | match_try_am);
1236
1237         /* construct an Add with source address mode */
1238         if (am.op_type == ia32_AddrModeS) {
1239                 ia32_address_t *am_addr = &am.addr;
1240                 new_node = new_bd_ia32_Add(dbgi, new_block, am_addr->base,
1241                                          am_addr->index, am_addr->mem, am.new_op1,
1242                                          am.new_op2);
1243                 set_am_attributes(new_node, &am);
1244                 SET_IA32_ORIG_NODE(new_node, node);
1245
1246                 new_node = fix_mem_proj(new_node, &am);
1247
1248                 return new_node;
1249         }
1250
1251         /* otherwise construct a lea */
1252         new_node = create_lea_from_address(dbgi, new_block, &addr);
1253         SET_IA32_ORIG_NODE(new_node, node);
1254         return new_node;
1255 }
1256
1257 /**
1258  * Creates an ia32 Mul.
1259  *
1260  * @return the created ia32 Mul node
1261  */
1262 static ir_node *gen_Mul(ir_node *node)
1263 {
1264         ir_node *op1  = get_Mul_left(node);
1265         ir_node *op2  = get_Mul_right(node);
1266         ir_mode *mode = get_irn_mode(node);
1267
1268         if (mode_is_float(mode)) {
1269                 if (ia32_cg_config.use_sse2)
1270                         return gen_binop(node, op1, op2, new_bd_ia32_xMul,
1271                                          match_commutative | match_am);
1272                 else
1273                         return gen_binop_x87_float(node, op1, op2, new_bd_ia32_vfmul);
1274         }
1275         return gen_binop(node, op1, op2, new_bd_ia32_IMul,
1276                          match_commutative | match_am | match_mode_neutral |
1277                          match_immediate | match_am_and_immediates);
1278 }
1279
1280 /**
1281  * Creates an ia32 Mulh.
1282  * Note: Mul produces a 64Bit result and Mulh returns the upper 32 bit of
1283  * this result while Mul returns the lower 32 bit.
1284  *
1285  * @return the created ia32 Mulh node
1286  */
1287 static ir_node *gen_Mulh(ir_node *node)
1288 {
1289         ir_node              *block     = get_nodes_block(node);
1290         ir_node              *new_block = be_transform_node(block);
1291         dbg_info             *dbgi      = get_irn_dbg_info(node);
1292         ir_node              *op1       = get_Mulh_left(node);
1293         ir_node              *op2       = get_Mulh_right(node);
1294         ir_mode              *mode      = get_irn_mode(node);
1295         ir_node              *new_node;
1296         ir_node              *proj_res_high;
1297
1298         if (mode_is_signed(mode)) {
1299                 new_node = gen_binop(node, op1, op2, new_bd_ia32_IMul1OP, match_commutative | match_am);
1300                 proj_res_high = new_rd_Proj(dbgi, new_block, new_node, mode_Iu, pn_ia32_IMul1OP_res_high);
1301         } else {
1302                 new_node = gen_binop(node, op1, op2, new_bd_ia32_Mul, match_commutative | match_am);
1303                 proj_res_high = new_rd_Proj(dbgi, new_block, new_node, mode_Iu, pn_ia32_Mul_res_high);
1304         }
1305         return proj_res_high;
1306 }
1307
1308 /**
1309  * Creates an ia32 And.
1310  *
1311  * @return The created ia32 And node
1312  */
1313 static ir_node *gen_And(ir_node *node)
1314 {
1315         ir_node *op1 = get_And_left(node);
1316         ir_node *op2 = get_And_right(node);
1317         assert(! mode_is_float(get_irn_mode(node)));
1318
1319         /* is it a zero extension? */
1320         if (is_Const(op2)) {
1321                 tarval   *tv    = get_Const_tarval(op2);
1322                 long      v     = get_tarval_long(tv);
1323
1324                 if (v == 0xFF || v == 0xFFFF) {
1325                         dbg_info *dbgi   = get_irn_dbg_info(node);
1326                         ir_node  *block  = get_nodes_block(node);
1327                         ir_mode  *src_mode;
1328                         ir_node  *res;
1329
1330                         if (v == 0xFF) {
1331                                 src_mode = mode_Bu;
1332                         } else {
1333                                 assert(v == 0xFFFF);
1334                                 src_mode = mode_Hu;
1335                         }
1336                         res = create_I2I_Conv(src_mode, mode_Iu, dbgi, block, op1, node);
1337
1338                         return res;
1339                 }
1340         }
1341         return gen_binop(node, op1, op2, new_bd_ia32_And,
1342                         match_commutative | match_mode_neutral | match_am | match_immediate);
1343 }
1344
1345
1346
1347 /**
1348  * Creates an ia32 Or.
1349  *
1350  * @return The created ia32 Or node
1351  */
1352 static ir_node *gen_Or(ir_node *node)
1353 {
1354         ir_node *op1 = get_Or_left(node);
1355         ir_node *op2 = get_Or_right(node);
1356
1357         assert (! mode_is_float(get_irn_mode(node)));
1358         return gen_binop(node, op1, op2, new_bd_ia32_Or, match_commutative
1359                         | match_mode_neutral | match_am | match_immediate);
1360 }
1361
1362
1363
1364 /**
1365  * Creates an ia32 Eor.
1366  *
1367  * @return The created ia32 Eor node
1368  */
1369 static ir_node *gen_Eor(ir_node *node)
1370 {
1371         ir_node *op1 = get_Eor_left(node);
1372         ir_node *op2 = get_Eor_right(node);
1373
1374         assert(! mode_is_float(get_irn_mode(node)));
1375         return gen_binop(node, op1, op2, new_bd_ia32_Xor, match_commutative
1376                         | match_mode_neutral | match_am | match_immediate);
1377 }
1378
1379
1380 /**
1381  * Creates an ia32 Sub.
1382  *
1383  * @return The created ia32 Sub node
1384  */
1385 static ir_node *gen_Sub(ir_node *node)
1386 {
1387         ir_node  *op1  = get_Sub_left(node);
1388         ir_node  *op2  = get_Sub_right(node);
1389         ir_mode  *mode = get_irn_mode(node);
1390
1391         if (mode_is_float(mode)) {
1392                 if (ia32_cg_config.use_sse2)
1393                         return gen_binop(node, op1, op2, new_bd_ia32_xSub, match_am);
1394                 else
1395                         return gen_binop_x87_float(node, op1, op2, new_bd_ia32_vfsub);
1396         }
1397
1398         if (is_Const(op2)) {
1399                 ir_fprintf(stderr, "Optimisation warning: found sub with const (%+F)\n",
1400                            node);
1401         }
1402
1403         return gen_binop(node, op1, op2, new_bd_ia32_Sub, match_mode_neutral
1404                         | match_am | match_immediate);
1405 }
1406
1407 static ir_node *transform_AM_mem(ir_node *const block,
1408                                  ir_node  *const src_val,
1409                                  ir_node  *const src_mem,
1410                                  ir_node  *const am_mem)
1411 {
1412         if (is_NoMem(am_mem)) {
1413                 return be_transform_node(src_mem);
1414         } else if (is_Proj(src_val) &&
1415                    is_Proj(src_mem) &&
1416                    get_Proj_pred(src_val) == get_Proj_pred(src_mem)) {
1417                 /* avoid memory loop */
1418                 return am_mem;
1419         } else if (is_Proj(src_val) && is_Sync(src_mem)) {
1420                 ir_node  *const ptr_pred = get_Proj_pred(src_val);
1421                 int       const arity    = get_Sync_n_preds(src_mem);
1422                 int             n        = 0;
1423                 ir_node **      ins;
1424                 int             i;
1425
1426                 NEW_ARR_A(ir_node*, ins, arity + 1);
1427
1428                 /* NOTE: This sometimes produces dead-code because the old sync in
1429                  * src_mem might not be used anymore, we should detect this case
1430                  * and kill the sync... */
1431                 for (i = arity - 1; i >= 0; --i) {
1432                         ir_node *const pred = get_Sync_pred(src_mem, i);
1433
1434                         /* avoid memory loop */
1435                         if (is_Proj(pred) && get_Proj_pred(pred) == ptr_pred)
1436                                 continue;
1437
1438                         ins[n++] = be_transform_node(pred);
1439                 }
1440
1441                 ins[n++] = am_mem;
1442
1443                 return new_r_Sync(block, n, ins);
1444         } else {
1445                 ir_node *ins[2];
1446
1447                 ins[0] = be_transform_node(src_mem);
1448                 ins[1] = am_mem;
1449                 return new_r_Sync(block, 2, ins);
1450         }
1451 }
1452
1453 /**
1454  * Create a 32bit to 64bit signed extension.
1455  *
1456  * @param dbgi   debug info
1457  * @param block  the block where node nodes should be placed
1458  * @param val    the value to extend
1459  * @param orig   the original node
1460  */
1461 static ir_node *create_sex_32_64(dbg_info *dbgi, ir_node *block,
1462                                  ir_node *val, const ir_node *orig)
1463 {
1464         ir_node *res;
1465
1466         (void)orig;
1467         if (ia32_cg_config.use_short_sex_eax) {
1468                 ir_node *pval = new_bd_ia32_ProduceVal(dbgi, block);
1469                 be_dep_on_frame(pval);
1470                 res = new_bd_ia32_Cltd(dbgi, block, val, pval);
1471         } else {
1472                 ir_node *imm31 = ia32_create_Immediate(NULL, 0, 31);
1473                 res = new_bd_ia32_Sar(dbgi, block, val, imm31);
1474         }
1475         SET_IA32_ORIG_NODE(res, orig);
1476         return res;
1477 }
1478
1479 /**
1480  * Generates an ia32 DivMod with additional infrastructure for the
1481  * register allocator if needed.
1482  */
1483 static ir_node *create_Div(ir_node *node)
1484 {
1485         dbg_info *dbgi      = get_irn_dbg_info(node);
1486         ir_node  *block     = get_nodes_block(node);
1487         ir_node  *new_block = be_transform_node(block);
1488         ir_node  *mem;
1489         ir_node  *new_mem;
1490         ir_node  *op1;
1491         ir_node  *op2;
1492         ir_node  *new_node;
1493         ir_mode  *mode;
1494         ir_node  *sign_extension;
1495         ia32_address_mode_t  am;
1496         ia32_address_t      *addr = &am.addr;
1497
1498         /* the upper bits have random contents for smaller modes */
1499         switch (get_irn_opcode(node)) {
1500         case iro_Div:
1501                 op1     = get_Div_left(node);
1502                 op2     = get_Div_right(node);
1503                 mem     = get_Div_mem(node);
1504                 mode    = get_Div_resmode(node);
1505                 break;
1506         case iro_Mod:
1507                 op1     = get_Mod_left(node);
1508                 op2     = get_Mod_right(node);
1509                 mem     = get_Mod_mem(node);
1510                 mode    = get_Mod_resmode(node);
1511                 break;
1512         case iro_DivMod:
1513                 op1     = get_DivMod_left(node);
1514                 op2     = get_DivMod_right(node);
1515                 mem     = get_DivMod_mem(node);
1516                 mode    = get_DivMod_resmode(node);
1517                 break;
1518         default:
1519                 panic("invalid divmod node %+F", node);
1520         }
1521
1522         match_arguments(&am, block, op1, op2, NULL, match_am);
1523
1524         /* Beware: We don't need a Sync, if the memory predecessor of the Div node
1525            is the memory of the consumed address. We can have only the second op as address
1526            in Div nodes, so check only op2. */
1527         new_mem = transform_AM_mem(block, op2, mem, addr->mem);
1528
1529         if (mode_is_signed(mode)) {
1530                 sign_extension = create_sex_32_64(dbgi, new_block, am.new_op1, node);
1531                 new_node       = new_bd_ia32_IDiv(dbgi, new_block, addr->base,
1532                                 addr->index, new_mem, am.new_op2, am.new_op1, sign_extension);
1533         } else {
1534                 sign_extension = new_bd_ia32_Const(dbgi, new_block, NULL, 0, 0, 0);
1535                 be_dep_on_frame(sign_extension);
1536
1537                 new_node = new_bd_ia32_Div(dbgi, new_block, addr->base,
1538                                            addr->index, new_mem, am.new_op2,
1539                                            am.new_op1, sign_extension);
1540         }
1541
1542         set_irn_pinned(new_node, get_irn_pinned(node));
1543
1544         set_am_attributes(new_node, &am);
1545         SET_IA32_ORIG_NODE(new_node, node);
1546
1547         new_node = fix_mem_proj(new_node, &am);
1548
1549         return new_node;
1550 }
1551
1552 /**
1553  * Generates an ia32 Mod.
1554  */
1555 static ir_node *gen_Mod(ir_node *node)
1556 {
1557         return create_Div(node);
1558 }
1559
1560 /**
1561  * Generates an ia32 Div.
1562  */
1563 static ir_node *gen_Div(ir_node *node)
1564 {
1565         return create_Div(node);
1566 }
1567
1568 /**
1569  * Generates an ia32 DivMod.
1570  */
1571 static ir_node *gen_DivMod(ir_node *node)
1572 {
1573         return create_Div(node);
1574 }
1575
1576
1577
1578 /**
1579  * Creates an ia32 floating Div.
1580  *
1581  * @return The created ia32 xDiv node
1582  */
1583 static ir_node *gen_Quot(ir_node *node)
1584 {
1585         ir_node *op1 = get_Quot_left(node);
1586         ir_node *op2 = get_Quot_right(node);
1587
1588         if (ia32_cg_config.use_sse2) {
1589                 return gen_binop(node, op1, op2, new_bd_ia32_xDiv, match_am);
1590         } else {
1591                 return gen_binop_x87_float(node, op1, op2, new_bd_ia32_vfdiv);
1592         }
1593 }
1594
1595
1596 /**
1597  * Creates an ia32 Shl.
1598  *
1599  * @return The created ia32 Shl node
1600  */
1601 static ir_node *gen_Shl(ir_node *node)
1602 {
1603         ir_node *left  = get_Shl_left(node);
1604         ir_node *right = get_Shl_right(node);
1605
1606         return gen_shift_binop(node, left, right, new_bd_ia32_Shl,
1607                                match_mode_neutral | match_immediate);
1608 }
1609
1610 /**
1611  * Creates an ia32 Shr.
1612  *
1613  * @return The created ia32 Shr node
1614  */
1615 static ir_node *gen_Shr(ir_node *node)
1616 {
1617         ir_node *left  = get_Shr_left(node);
1618         ir_node *right = get_Shr_right(node);
1619
1620         return gen_shift_binop(node, left, right, new_bd_ia32_Shr, match_immediate);
1621 }
1622
1623
1624
1625 /**
1626  * Creates an ia32 Sar.
1627  *
1628  * @return The created ia32 Shrs node
1629  */
1630 static ir_node *gen_Shrs(ir_node *node)
1631 {
1632         ir_node *left  = get_Shrs_left(node);
1633         ir_node *right = get_Shrs_right(node);
1634
1635         if (is_Const(right)) {
1636                 tarval *tv = get_Const_tarval(right);
1637                 long val = get_tarval_long(tv);
1638                 if (val == 31) {
1639                         /* this is a sign extension */
1640                         dbg_info *dbgi   = get_irn_dbg_info(node);
1641                         ir_node  *block  = be_transform_node(get_nodes_block(node));
1642                         ir_node  *new_op = be_transform_node(left);
1643
1644                         return create_sex_32_64(dbgi, block, new_op, node);
1645                 }
1646         }
1647
1648         /* 8 or 16 bit sign extension? */
1649         if (is_Const(right) && is_Shl(left)) {
1650                 ir_node *shl_left  = get_Shl_left(left);
1651                 ir_node *shl_right = get_Shl_right(left);
1652                 if (is_Const(shl_right)) {
1653                         tarval *tv1 = get_Const_tarval(right);
1654                         tarval *tv2 = get_Const_tarval(shl_right);
1655                         if (tv1 == tv2 && tarval_is_long(tv1)) {
1656                                 long val = get_tarval_long(tv1);
1657                                 if (val == 16 || val == 24) {
1658                                         dbg_info *dbgi   = get_irn_dbg_info(node);
1659                                         ir_node  *block  = get_nodes_block(node);
1660                                         ir_mode  *src_mode;
1661                                         ir_node  *res;
1662
1663                                         if (val == 24) {
1664                                                 src_mode = mode_Bs;
1665                                         } else {
1666                                                 assert(val == 16);
1667                                                 src_mode = mode_Hs;
1668                                         }
1669                                         res = create_I2I_Conv(src_mode, mode_Is, dbgi, block,
1670                                                               shl_left, node);
1671
1672                                         return res;
1673                                 }
1674                         }
1675                 }
1676         }
1677
1678         return gen_shift_binop(node, left, right, new_bd_ia32_Sar, match_immediate);
1679 }
1680
1681
1682
1683 /**
1684  * Creates an ia32 Rol.
1685  *
1686  * @param op1   The first operator
1687  * @param op2   The second operator
1688  * @return The created ia32 RotL node
1689  */
1690 static ir_node *gen_Rol(ir_node *node, ir_node *op1, ir_node *op2)
1691 {
1692         return gen_shift_binop(node, op1, op2, new_bd_ia32_Rol, match_immediate);
1693 }
1694
1695
1696
1697 /**
1698  * Creates an ia32 Ror.
1699  * NOTE: There is no RotR with immediate because this would always be a RotL
1700  *       "imm-mode_size_bits" which can be pre-calculated.
1701  *
1702  * @param op1   The first operator
1703  * @param op2   The second operator
1704  * @return The created ia32 RotR node
1705  */
1706 static ir_node *gen_Ror(ir_node *node, ir_node *op1, ir_node *op2)
1707 {
1708         return gen_shift_binop(node, op1, op2, new_bd_ia32_Ror, match_immediate);
1709 }
1710
1711
1712
1713 /**
1714  * Creates an ia32 RotR or RotL (depending on the found pattern).
1715  *
1716  * @return The created ia32 RotL or RotR node
1717  */
1718 static ir_node *gen_Rotl(ir_node *node)
1719 {
1720         ir_node *rotate = NULL;
1721         ir_node *op1    = get_Rotl_left(node);
1722         ir_node *op2    = get_Rotl_right(node);
1723
1724         /* Firm has only RotL, so we are looking for a right (op2)
1725                  operand "-e+mode_size_bits" (it's an already modified "mode_size_bits-e",
1726                  that means we can create a RotR instead of an Add and a RotL */
1727
1728         if (is_Add(op2)) {
1729                 ir_node *add = op2;
1730                 ir_node *left = get_Add_left(add);
1731                 ir_node *right = get_Add_right(add);
1732                 if (is_Const(right)) {
1733                         tarval  *tv   = get_Const_tarval(right);
1734                         ir_mode *mode = get_irn_mode(node);
1735                         long     bits = get_mode_size_bits(mode);
1736
1737                         if (is_Minus(left) &&
1738                             tarval_is_long(tv)       &&
1739                             get_tarval_long(tv) == bits &&
1740                             bits                == 32)
1741                         {
1742                                 DB((dbg, LEVEL_1, "RotL into RotR ... "));
1743                                 rotate = gen_Ror(node, op1, get_Minus_op(left));
1744                         }
1745                 }
1746         }
1747
1748         if (rotate == NULL) {
1749                 rotate = gen_Rol(node, op1, op2);
1750         }
1751
1752         return rotate;
1753 }
1754
1755
1756
1757 /**
1758  * Transforms a Minus node.
1759  *
1760  * @return The created ia32 Minus node
1761  */
1762 static ir_node *gen_Minus(ir_node *node)
1763 {
1764         ir_node   *op    = get_Minus_op(node);
1765         ir_node   *block = be_transform_node(get_nodes_block(node));
1766         dbg_info  *dbgi  = get_irn_dbg_info(node);
1767         ir_mode   *mode  = get_irn_mode(node);
1768         ir_entity *ent;
1769         ir_node   *new_node;
1770         int        size;
1771
1772         if (mode_is_float(mode)) {
1773                 ir_node *new_op = be_transform_node(op);
1774                 if (ia32_cg_config.use_sse2) {
1775                         /* TODO: non-optimal... if we have many xXors, then we should
1776                          * rather create a load for the const and use that instead of
1777                          * several AM nodes... */
1778                         ir_node *noreg_xmm = ia32_new_NoReg_xmm(env_cg);
1779
1780                         new_node = new_bd_ia32_xXor(dbgi, block, noreg_GP, noreg_GP,
1781                                                     nomem, new_op, noreg_xmm);
1782
1783                         size = get_mode_size_bits(mode);
1784                         ent  = ia32_gen_fp_known_const(size == 32 ? ia32_SSIGN : ia32_DSIGN);
1785
1786                         set_ia32_am_sc(new_node, ent);
1787                         set_ia32_op_type(new_node, ia32_AddrModeS);
1788                         set_ia32_ls_mode(new_node, mode);
1789                 } else {
1790                         new_node = new_bd_ia32_vfchs(dbgi, block, new_op);
1791                 }
1792         } else {
1793                 new_node = gen_unop(node, op, new_bd_ia32_Neg, match_mode_neutral);
1794         }
1795
1796         SET_IA32_ORIG_NODE(new_node, node);
1797
1798         return new_node;
1799 }
1800
1801 /**
1802  * Transforms a Not node.
1803  *
1804  * @return The created ia32 Not node
1805  */
1806 static ir_node *gen_Not(ir_node *node)
1807 {
1808         ir_node *op   = get_Not_op(node);
1809
1810         assert(get_irn_mode(node) != mode_b); /* should be lowered already */
1811         assert (! mode_is_float(get_irn_mode(node)));
1812
1813         return gen_unop(node, op, new_bd_ia32_Not, match_mode_neutral);
1814 }
1815
1816
1817
1818 /**
1819  * Transforms an Abs node.
1820  *
1821  * @return The created ia32 Abs node
1822  */
1823 static ir_node *gen_Abs(ir_node *node)
1824 {
1825         ir_node   *block     = get_nodes_block(node);
1826         ir_node   *new_block = be_transform_node(block);
1827         ir_node   *op        = get_Abs_op(node);
1828         dbg_info  *dbgi      = get_irn_dbg_info(node);
1829         ir_mode   *mode      = get_irn_mode(node);
1830         ir_node   *new_op;
1831         ir_node   *new_node;
1832         int        size;
1833         ir_entity *ent;
1834
1835         if (mode_is_float(mode)) {
1836                 new_op = be_transform_node(op);
1837
1838                 if (ia32_cg_config.use_sse2) {
1839                         ir_node *noreg_fp = ia32_new_NoReg_xmm(env_cg);
1840                         new_node = new_bd_ia32_xAnd(dbgi, new_block, noreg_GP, noreg_GP,
1841                                                     nomem, new_op, noreg_fp);
1842
1843                         size = get_mode_size_bits(mode);
1844                         ent  = ia32_gen_fp_known_const(size == 32 ? ia32_SABS : ia32_DABS);
1845
1846                         set_ia32_am_sc(new_node, ent);
1847
1848                         SET_IA32_ORIG_NODE(new_node, node);
1849
1850                         set_ia32_op_type(new_node, ia32_AddrModeS);
1851                         set_ia32_ls_mode(new_node, mode);
1852                 } else {
1853                         new_node = new_bd_ia32_vfabs(dbgi, new_block, new_op);
1854                         SET_IA32_ORIG_NODE(new_node, node);
1855                 }
1856         } else {
1857                 ir_node *xor, *sign_extension;
1858
1859                 if (get_mode_size_bits(mode) == 32) {
1860                         new_op = be_transform_node(op);
1861                 } else {
1862                         new_op = create_I2I_Conv(mode, mode_Is, dbgi, block, op, node);
1863                 }
1864
1865                 sign_extension = create_sex_32_64(dbgi, new_block, new_op, node);
1866
1867                 xor = new_bd_ia32_Xor(dbgi, new_block, noreg_GP, noreg_GP,
1868                                       nomem, new_op, sign_extension);
1869                 SET_IA32_ORIG_NODE(xor, node);
1870
1871                 new_node = new_bd_ia32_Sub(dbgi, new_block, noreg_GP, noreg_GP,
1872                                            nomem, xor, sign_extension);
1873                 SET_IA32_ORIG_NODE(new_node, node);
1874         }
1875
1876         return new_node;
1877 }
1878
1879 /**
1880  * Create a bt instruction for x & (1 << n) and place it into the block of cmp.
1881  */
1882 static ir_node *gen_bt(ir_node *cmp, ir_node *x, ir_node *n)
1883 {
1884         dbg_info *dbgi      = get_irn_dbg_info(cmp);
1885         ir_node  *block     = get_nodes_block(cmp);
1886         ir_node  *new_block = be_transform_node(block);
1887         ir_node  *op1       = be_transform_node(x);
1888         ir_node  *op2       = be_transform_node(n);
1889
1890         return new_bd_ia32_Bt(dbgi, new_block, op1, op2);
1891 }
1892
1893 /**
1894  * Transform a node returning a "flag" result.
1895  *
1896  * @param node     the node to transform
1897  * @param pnc_out  the compare mode to use
1898  */
1899 static ir_node *get_flags_node(ir_node *node, pn_Cmp *pnc_out)
1900 {
1901         ir_node  *flags;
1902         ir_node  *new_op;
1903         ir_node  *new_block;
1904         dbg_info *dbgi;
1905
1906         /* we have a Cmp as input */
1907         if (is_Proj(node)) {
1908                 ir_node *pred = get_Proj_pred(node);
1909                 if (is_Cmp(pred)) {
1910                         pn_Cmp pnc = get_Proj_proj(node);
1911                         if (ia32_cg_config.use_bt && (pnc == pn_Cmp_Lg || pnc == pn_Cmp_Eq)) {
1912                                 ir_node *l = get_Cmp_left(pred);
1913                                 ir_node *r = get_Cmp_right(pred);
1914                                 if (is_And(l)) {
1915                                         ir_node *la = get_And_left(l);
1916                                         ir_node *ra = get_And_right(l);
1917                                         if (is_Shl(la)) {
1918                                                 ir_node *c = get_Shl_left(la);
1919                                                 if (is_Const_1(c) && (is_Const_0(r) || r == la)) {
1920                                                         /* (1 << n) & ra) */
1921                                                         ir_node *n = get_Shl_right(la);
1922                                                         flags    = gen_bt(pred, ra, n);
1923                                                         /* we must generate a Jc/Jnc jump */
1924                                                         pnc = pnc == pn_Cmp_Lg ? pn_Cmp_Lt : pn_Cmp_Ge;
1925                                                         if (r == la)
1926                                                                 pnc ^= pn_Cmp_Leg;
1927                                                         *pnc_out = ia32_pn_Cmp_unsigned | pnc;
1928                                                         return flags;
1929                                                 }
1930                                         }
1931                                         if (is_Shl(ra)) {
1932                                                 ir_node *c = get_Shl_left(ra);
1933                                                 if (is_Const_1(c) && (is_Const_0(r) || r == ra)) {
1934                                                         /* la & (1 << n)) */
1935                                                         ir_node *n = get_Shl_right(ra);
1936                                                         flags    = gen_bt(pred, la, n);
1937                                                         /* we must generate a Jc/Jnc jump */
1938                                                         pnc = pnc == pn_Cmp_Lg ? pn_Cmp_Lt : pn_Cmp_Ge;
1939                                                         if (r == ra)
1940                                                                 pnc ^= pn_Cmp_Leg;
1941                                                         *pnc_out = ia32_pn_Cmp_unsigned | pnc;
1942                                                         return flags;
1943                                                 }
1944                                         }
1945                                 }
1946                         }
1947                         flags    = be_transform_node(pred);
1948                         *pnc_out = pnc;
1949                         return flags;
1950                 }
1951         }
1952
1953         /* a mode_b value, we have to compare it against 0 */
1954         dbgi      = get_irn_dbg_info(node);
1955         new_block = be_transform_node(get_nodes_block(node));
1956         new_op    = be_transform_node(node);
1957         flags     = new_bd_ia32_Test(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_op,
1958                                      new_op, /*is_permuted=*/0, /*cmp_unsigned=*/0);
1959         *pnc_out  = pn_Cmp_Lg;
1960         return flags;
1961 }
1962
1963 /**
1964  * Transforms a Load.
1965  *
1966  * @return the created ia32 Load node
1967  */
1968 static ir_node *gen_Load(ir_node *node)
1969 {
1970         ir_node  *old_block = get_nodes_block(node);
1971         ir_node  *block   = be_transform_node(old_block);
1972         ir_node  *ptr     = get_Load_ptr(node);
1973         ir_node  *mem     = get_Load_mem(node);
1974         ir_node  *new_mem = be_transform_node(mem);
1975         ir_node  *base;
1976         ir_node  *index;
1977         dbg_info *dbgi    = get_irn_dbg_info(node);
1978         ir_mode  *mode    = get_Load_mode(node);
1979         ir_mode  *res_mode;
1980         ir_node  *new_node;
1981         ia32_address_t addr;
1982
1983         /* construct load address */
1984         memset(&addr, 0, sizeof(addr));
1985         ia32_create_address_mode(&addr, ptr, 0);
1986         base  = addr.base;
1987         index = addr.index;
1988
1989         if (base == NULL) {
1990                 base = noreg_GP;
1991         } else {
1992                 base = be_transform_node(base);
1993         }
1994
1995         if (index == NULL) {
1996                 index = noreg_GP;
1997         } else {
1998                 index = be_transform_node(index);
1999         }
2000
2001         if (mode_is_float(mode)) {
2002                 if (ia32_cg_config.use_sse2) {
2003                         new_node = new_bd_ia32_xLoad(dbgi, block, base, index, new_mem,
2004                                                      mode);
2005                         res_mode = mode_xmm;
2006                 } else {
2007                         new_node = new_bd_ia32_vfld(dbgi, block, base, index, new_mem,
2008                                                     mode);
2009                         res_mode = mode_vfp;
2010                 }
2011         } else {
2012                 assert(mode != mode_b);
2013
2014                 /* create a conv node with address mode for smaller modes */
2015                 if (get_mode_size_bits(mode) < 32) {
2016                         new_node = new_bd_ia32_Conv_I2I(dbgi, block, base, index,
2017                                                         new_mem, noreg_GP, mode);
2018                 } else {
2019                         new_node = new_bd_ia32_Load(dbgi, block, base, index, new_mem);
2020                 }
2021                 res_mode = mode_Iu;
2022         }
2023
2024         set_irn_pinned(new_node, get_irn_pinned(node));
2025         set_ia32_op_type(new_node, ia32_AddrModeS);
2026         set_ia32_ls_mode(new_node, mode);
2027         set_address(new_node, &addr);
2028
2029         if (get_irn_pinned(node) == op_pin_state_floats) {
2030                 assert(pn_ia32_xLoad_res == pn_ia32_vfld_res
2031                                 && pn_ia32_vfld_res == pn_ia32_Load_res
2032                                 && pn_ia32_Load_res == pn_ia32_res);
2033                 arch_irn_add_flags(new_node, arch_irn_flags_rematerializable);
2034         }
2035
2036         SET_IA32_ORIG_NODE(new_node, node);
2037
2038         be_dep_on_frame(new_node);
2039         return new_node;
2040 }
2041
2042 static int use_dest_am(ir_node *block, ir_node *node, ir_node *mem,
2043                        ir_node *ptr, ir_node *other)
2044 {
2045         ir_node *load;
2046
2047         if (!is_Proj(node))
2048                 return 0;
2049
2050         /* we only use address mode if we're the only user of the load */
2051         if (get_irn_n_edges(node) > 1)
2052                 return 0;
2053
2054         load = get_Proj_pred(node);
2055         if (!is_Load(load))
2056                 return 0;
2057         if (get_nodes_block(load) != block)
2058                 return 0;
2059
2060         /* store should have the same pointer as the load */
2061         if (get_Load_ptr(load) != ptr)
2062                 return 0;
2063
2064         /* don't do AM if other node inputs depend on the load (via mem-proj) */
2065         if (other != NULL                   &&
2066             get_nodes_block(other) == block &&
2067             heights_reachable_in_block(heights, other, load)) {
2068                 return 0;
2069         }
2070
2071         if (prevents_AM(block, load, mem))
2072                 return 0;
2073         /* Store should be attached to the load via mem */
2074         assert(heights_reachable_in_block(heights, mem, load));
2075
2076         return 1;
2077 }
2078
2079 static ir_node *dest_am_binop(ir_node *node, ir_node *op1, ir_node *op2,
2080                               ir_node *mem, ir_node *ptr, ir_mode *mode,
2081                               construct_binop_dest_func *func,
2082                               construct_binop_dest_func *func8bit,
2083                                                           match_flags_t flags)
2084 {
2085         ir_node  *src_block = get_nodes_block(node);
2086         ir_node  *block;
2087         dbg_info *dbgi;
2088         ir_node  *new_mem;
2089         ir_node  *new_node;
2090         ir_node  *new_op;
2091         ir_node  *mem_proj;
2092         int       commutative;
2093         ia32_address_mode_t  am;
2094         ia32_address_t      *addr = &am.addr;
2095         memset(&am, 0, sizeof(am));
2096
2097         assert(flags & match_immediate); /* there is no destam node without... */
2098         commutative = (flags & match_commutative) != 0;
2099
2100         if (use_dest_am(src_block, op1, mem, ptr, op2)) {
2101                 build_address(&am, op1, ia32_create_am_double_use);
2102                 new_op = create_immediate_or_transform(op2, 0);
2103         } else if (commutative && use_dest_am(src_block, op2, mem, ptr, op1)) {
2104                 build_address(&am, op2, ia32_create_am_double_use);
2105                 new_op = create_immediate_or_transform(op1, 0);
2106         } else {
2107                 return NULL;
2108         }
2109
2110         if (addr->base == NULL)
2111                 addr->base = noreg_GP;
2112         if (addr->index == NULL)
2113                 addr->index = noreg_GP;
2114         if (addr->mem == NULL)
2115                 addr->mem = nomem;
2116
2117         dbgi    = get_irn_dbg_info(node);
2118         block   = be_transform_node(src_block);
2119         new_mem = transform_AM_mem(block, am.am_node, mem, addr->mem);
2120
2121         if (get_mode_size_bits(mode) == 8) {
2122                 new_node = func8bit(dbgi, block, addr->base, addr->index, new_mem, new_op);
2123         } else {
2124                 new_node = func(dbgi, block, addr->base, addr->index, new_mem, new_op);
2125         }
2126         set_address(new_node, addr);
2127         set_ia32_op_type(new_node, ia32_AddrModeD);
2128         set_ia32_ls_mode(new_node, mode);
2129         SET_IA32_ORIG_NODE(new_node, node);
2130
2131         be_set_transformed_node(get_Proj_pred(am.mem_proj), new_node);
2132         mem_proj = be_transform_node(am.mem_proj);
2133         be_set_transformed_node(mem_proj ? mem_proj : am.mem_proj, new_node);
2134
2135         return new_node;
2136 }
2137
2138 static ir_node *dest_am_unop(ir_node *node, ir_node *op, ir_node *mem,
2139                              ir_node *ptr, ir_mode *mode,
2140                              construct_unop_dest_func *func)
2141 {
2142         ir_node  *src_block = get_nodes_block(node);
2143         ir_node  *block;
2144         dbg_info *dbgi;
2145         ir_node  *new_mem;
2146         ir_node  *new_node;
2147         ir_node  *mem_proj;
2148         ia32_address_mode_t  am;
2149         ia32_address_t *addr = &am.addr;
2150
2151         if (!use_dest_am(src_block, op, mem, ptr, NULL))
2152                 return NULL;
2153
2154         memset(&am, 0, sizeof(am));
2155         build_address(&am, op, ia32_create_am_double_use);
2156
2157         dbgi     = get_irn_dbg_info(node);
2158         block    = be_transform_node(src_block);
2159         new_mem  = transform_AM_mem(block, am.am_node, mem, addr->mem);
2160         new_node = func(dbgi, block, addr->base, addr->index, new_mem);
2161         set_address(new_node, addr);
2162         set_ia32_op_type(new_node, ia32_AddrModeD);
2163         set_ia32_ls_mode(new_node, mode);
2164         SET_IA32_ORIG_NODE(new_node, node);
2165
2166         be_set_transformed_node(get_Proj_pred(am.mem_proj), new_node);
2167         mem_proj = be_transform_node(am.mem_proj);
2168         be_set_transformed_node(mem_proj ? mem_proj : am.mem_proj, new_node);
2169
2170         return new_node;
2171 }
2172
2173 static ir_node *try_create_SetMem(ir_node *node, ir_node *ptr, ir_node *mem)
2174 {
2175         ir_mode  *mode        = get_irn_mode(node);
2176         ir_node  *mux_true    = get_Mux_true(node);
2177         ir_node  *mux_false   = get_Mux_false(node);
2178         ir_node  *cond;
2179         ir_node  *new_mem;
2180         dbg_info *dbgi;
2181         ir_node  *block;
2182         ir_node  *new_block;
2183         ir_node  *flags;
2184         ir_node  *new_node;
2185         int       negated;
2186         pn_Cmp    pnc;
2187         ia32_address_t addr;
2188
2189         if (get_mode_size_bits(mode) != 8)
2190                 return NULL;
2191
2192         if (is_Const_1(mux_true) && is_Const_0(mux_false)) {
2193                 negated = 0;
2194         } else if (is_Const_0(mux_true) && is_Const_1(mux_false)) {
2195                 negated = 1;
2196         } else {
2197                 return NULL;
2198         }
2199
2200         build_address_ptr(&addr, ptr, mem);
2201
2202         dbgi      = get_irn_dbg_info(node);
2203         block     = get_nodes_block(node);
2204         new_block = be_transform_node(block);
2205         cond      = get_Mux_sel(node);
2206         flags     = get_flags_node(cond, &pnc);
2207         new_mem   = be_transform_node(mem);
2208         new_node  = new_bd_ia32_SetMem(dbgi, new_block, addr.base,
2209                                        addr.index, addr.mem, flags, pnc, negated);
2210         set_address(new_node, &addr);
2211         set_ia32_op_type(new_node, ia32_AddrModeD);
2212         set_ia32_ls_mode(new_node, mode);
2213         SET_IA32_ORIG_NODE(new_node, node);
2214
2215         return new_node;
2216 }
2217
2218 static ir_node *try_create_dest_am(ir_node *node)
2219 {
2220         ir_node  *val  = get_Store_value(node);
2221         ir_node  *mem  = get_Store_mem(node);
2222         ir_node  *ptr  = get_Store_ptr(node);
2223         ir_mode  *mode = get_irn_mode(val);
2224         unsigned  bits = get_mode_size_bits(mode);
2225         ir_node  *op1;
2226         ir_node  *op2;
2227         ir_node  *new_node;
2228
2229         /* handle only GP modes for now... */
2230         if (!ia32_mode_needs_gp_reg(mode))
2231                 return NULL;
2232
2233         for (;;) {
2234                 /* store must be the only user of the val node */
2235                 if (get_irn_n_edges(val) > 1)
2236                         return NULL;
2237                 /* skip pointless convs */
2238                 if (is_Conv(val)) {
2239                         ir_node *conv_op   = get_Conv_op(val);
2240                         ir_mode *pred_mode = get_irn_mode(conv_op);
2241                         if (!ia32_mode_needs_gp_reg(pred_mode))
2242                                 break;
2243                         if (pred_mode == mode_b || bits <= get_mode_size_bits(pred_mode)) {
2244                                 val = conv_op;
2245                                 continue;
2246                         }
2247                 }
2248                 break;
2249         }
2250
2251         /* value must be in the same block */
2252         if (get_nodes_block(node) != get_nodes_block(val))
2253                 return NULL;
2254
2255         switch (get_irn_opcode(val)) {
2256         case iro_Add:
2257                 op1      = get_Add_left(val);
2258                 op2      = get_Add_right(val);
2259                 if (ia32_cg_config.use_incdec) {
2260                         if (is_Const_1(op2)) {
2261                                 new_node = dest_am_unop(val, op1, mem, ptr, mode, new_bd_ia32_IncMem);
2262                                 break;
2263                         } else if (is_Const_Minus_1(op2)) {
2264                                 new_node = dest_am_unop(val, op1, mem, ptr, mode, new_bd_ia32_DecMem);
2265                                 break;
2266                         }
2267                 }
2268                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2269                                          new_bd_ia32_AddMem, new_bd_ia32_AddMem8Bit,
2270                                          match_commutative | match_immediate);
2271                 break;
2272         case iro_Sub:
2273                 op1      = get_Sub_left(val);
2274                 op2      = get_Sub_right(val);
2275                 if (is_Const(op2)) {
2276                         ir_fprintf(stderr, "Optimisation warning: not-normalized sub ,C found\n");
2277                 }
2278                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2279                                          new_bd_ia32_SubMem, new_bd_ia32_SubMem8Bit,
2280                                          match_immediate);
2281                 break;
2282         case iro_And:
2283                 op1      = get_And_left(val);
2284                 op2      = get_And_right(val);
2285                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2286                                          new_bd_ia32_AndMem, new_bd_ia32_AndMem8Bit,
2287                                          match_commutative | match_immediate);
2288                 break;
2289         case iro_Or:
2290                 op1      = get_Or_left(val);
2291                 op2      = get_Or_right(val);
2292                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2293                                          new_bd_ia32_OrMem, new_bd_ia32_OrMem8Bit,
2294                                          match_commutative | match_immediate);
2295                 break;
2296         case iro_Eor:
2297                 op1      = get_Eor_left(val);
2298                 op2      = get_Eor_right(val);
2299                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2300                                          new_bd_ia32_XorMem, new_bd_ia32_XorMem8Bit,
2301                                          match_commutative | match_immediate);
2302                 break;
2303         case iro_Shl:
2304                 op1      = get_Shl_left(val);
2305                 op2      = get_Shl_right(val);
2306                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2307                                          new_bd_ia32_ShlMem, new_bd_ia32_ShlMem,
2308                                          match_immediate);
2309                 break;
2310         case iro_Shr:
2311                 op1      = get_Shr_left(val);
2312                 op2      = get_Shr_right(val);
2313                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2314                                          new_bd_ia32_ShrMem, new_bd_ia32_ShrMem,
2315                                          match_immediate);
2316                 break;
2317         case iro_Shrs:
2318                 op1      = get_Shrs_left(val);
2319                 op2      = get_Shrs_right(val);
2320                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2321                                          new_bd_ia32_SarMem, new_bd_ia32_SarMem,
2322                                          match_immediate);
2323                 break;
2324         case iro_Rotl:
2325                 op1      = get_Rotl_left(val);
2326                 op2      = get_Rotl_right(val);
2327                 new_node = dest_am_binop(val, op1, op2, mem, ptr, mode,
2328                                          new_bd_ia32_RolMem, new_bd_ia32_RolMem,
2329                                          match_immediate);
2330                 break;
2331         /* TODO: match ROR patterns... */
2332         case iro_Mux:
2333                 new_node = try_create_SetMem(val, ptr, mem);
2334                 break;
2335         case iro_Minus:
2336                 op1      = get_Minus_op(val);
2337                 new_node = dest_am_unop(val, op1, mem, ptr, mode, new_bd_ia32_NegMem);
2338                 break;
2339         case iro_Not:
2340                 /* should be lowered already */
2341                 assert(mode != mode_b);
2342                 op1      = get_Not_op(val);
2343                 new_node = dest_am_unop(val, op1, mem, ptr, mode, new_bd_ia32_NotMem);
2344                 break;
2345         default:
2346                 return NULL;
2347         }
2348
2349         if (new_node != NULL) {
2350                 if (get_irn_pinned(new_node) != op_pin_state_pinned &&
2351                                 get_irn_pinned(node) == op_pin_state_pinned) {
2352                         set_irn_pinned(new_node, op_pin_state_pinned);
2353                 }
2354         }
2355
2356         return new_node;
2357 }
2358
2359 static bool possible_int_mode_for_fp(ir_mode *mode)
2360 {
2361         unsigned size;
2362
2363         if (!mode_is_signed(mode))
2364                 return false;
2365         size = get_mode_size_bits(mode);
2366         if (size != 16 && size != 32)
2367                 return false;
2368         return true;
2369 }
2370
2371 static int is_float_to_int_conv(const ir_node *node)
2372 {
2373         ir_mode  *mode = get_irn_mode(node);
2374         ir_node  *conv_op;
2375         ir_mode  *conv_mode;
2376
2377         if (!possible_int_mode_for_fp(mode))
2378                 return 0;
2379
2380         if (!is_Conv(node))
2381                 return 0;
2382         conv_op   = get_Conv_op(node);
2383         conv_mode = get_irn_mode(conv_op);
2384
2385         if (!mode_is_float(conv_mode))
2386                 return 0;
2387
2388         return 1;
2389 }
2390
2391 /**
2392  * Transform a Store(floatConst) into a sequence of
2393  * integer stores.
2394  *
2395  * @return the created ia32 Store node
2396  */
2397 static ir_node *gen_float_const_Store(ir_node *node, ir_node *cns)
2398 {
2399         ir_mode        *mode      = get_irn_mode(cns);
2400         unsigned        size      = get_mode_size_bytes(mode);
2401         tarval         *tv        = get_Const_tarval(cns);
2402         ir_node        *block     = get_nodes_block(node);
2403         ir_node        *new_block = be_transform_node(block);
2404         ir_node        *ptr       = get_Store_ptr(node);
2405         ir_node        *mem       = get_Store_mem(node);
2406         dbg_info       *dbgi      = get_irn_dbg_info(node);
2407         int             ofs       = 0;
2408         size_t          i         = 0;
2409         ir_node        *ins[4];
2410         ia32_address_t  addr;
2411
2412         assert(size % 4 ==  0);
2413         assert(size     <= 16);
2414
2415         build_address_ptr(&addr, ptr, mem);
2416
2417         do {
2418                 unsigned val =
2419                          get_tarval_sub_bits(tv, ofs)            |
2420                         (get_tarval_sub_bits(tv, ofs + 1) <<  8) |
2421                         (get_tarval_sub_bits(tv, ofs + 2) << 16) |
2422                         (get_tarval_sub_bits(tv, ofs + 3) << 24);
2423                 ir_node *imm = ia32_create_Immediate(NULL, 0, val);
2424
2425                 ir_node *new_node = new_bd_ia32_Store(dbgi, new_block, addr.base,
2426                         addr.index, addr.mem, imm);
2427
2428                 set_irn_pinned(new_node, get_irn_pinned(node));
2429                 set_ia32_op_type(new_node, ia32_AddrModeD);
2430                 set_ia32_ls_mode(new_node, mode_Iu);
2431                 set_address(new_node, &addr);
2432                 SET_IA32_ORIG_NODE(new_node, node);
2433
2434                 assert(i < 4);
2435                 ins[i++] = new_node;
2436
2437                 size        -= 4;
2438                 ofs         += 4;
2439                 addr.offset += 4;
2440         } while (size != 0);
2441
2442         if (i > 1) {
2443                 return new_rd_Sync(dbgi, new_block, i, ins);
2444         } else {
2445                 return ins[0];
2446         }
2447 }
2448
2449 /**
2450  * Generate a vfist or vfisttp instruction.
2451  */
2452 static ir_node *gen_vfist(dbg_info *dbgi, ir_node *block, ir_node *base, ir_node *index,
2453                           ir_node *mem,  ir_node *val, ir_node **fist)
2454 {
2455         ir_node *new_node;
2456
2457         if (ia32_cg_config.use_fisttp) {
2458                 /* Note: fisttp ALWAYS pop the tos. We have to ensure here that the value is copied
2459                 if other users exists */
2460                 ir_node *vfisttp = new_bd_ia32_vfisttp(dbgi, block, base, index, mem, val);
2461                 ir_node *value   = new_r_Proj(block, vfisttp, mode_E, pn_ia32_vfisttp_res);
2462                 be_new_Keep(block, 1, &value);
2463
2464                 new_node = new_r_Proj(block, vfisttp, mode_M, pn_ia32_vfisttp_M);
2465                 *fist    = vfisttp;
2466         } else {
2467                 ir_node *trunc_mode = ia32_new_Fpu_truncate(env_cg);
2468
2469                 /* do a fist */
2470                 new_node = new_bd_ia32_vfist(dbgi, block, base, index, mem, val, trunc_mode);
2471                 *fist    = new_node;
2472         }
2473         return new_node;
2474 }
2475 /**
2476  * Transforms a general (no special case) Store.
2477  *
2478  * @return the created ia32 Store node
2479  */
2480 static ir_node *gen_general_Store(ir_node *node)
2481 {
2482         ir_node  *val       = get_Store_value(node);
2483         ir_mode  *mode      = get_irn_mode(val);
2484         ir_node  *block     = get_nodes_block(node);
2485         ir_node  *new_block = be_transform_node(block);
2486         ir_node  *ptr       = get_Store_ptr(node);
2487         ir_node  *mem       = get_Store_mem(node);
2488         dbg_info *dbgi      = get_irn_dbg_info(node);
2489         ir_node  *new_val, *new_node, *store;
2490         ia32_address_t addr;
2491
2492         /* check for destination address mode */
2493         new_node = try_create_dest_am(node);
2494         if (new_node != NULL)
2495                 return new_node;
2496
2497         /* construct store address */
2498         memset(&addr, 0, sizeof(addr));
2499         ia32_create_address_mode(&addr, ptr, 0);
2500
2501         if (addr.base == NULL) {
2502                 addr.base = noreg_GP;
2503         } else {
2504                 addr.base = be_transform_node(addr.base);
2505         }
2506
2507         if (addr.index == NULL) {
2508                 addr.index = noreg_GP;
2509         } else {
2510                 addr.index = be_transform_node(addr.index);
2511         }
2512         addr.mem = be_transform_node(mem);
2513
2514         if (mode_is_float(mode)) {
2515                 /* Convs (and strict-Convs) before stores are unnecessary if the mode
2516                    is the same. */
2517                 while (is_Conv(val) && mode == get_irn_mode(val)) {
2518                         ir_node *op = get_Conv_op(val);
2519                         if (!mode_is_float(get_irn_mode(op)))
2520                                 break;
2521                         val = op;
2522                 }
2523                 new_val = be_transform_node(val);
2524                 if (ia32_cg_config.use_sse2) {
2525                         new_node = new_bd_ia32_xStore(dbgi, new_block, addr.base,
2526                                                       addr.index, addr.mem, new_val);
2527                 } else {
2528                         new_node = new_bd_ia32_vfst(dbgi, new_block, addr.base,
2529                                                     addr.index, addr.mem, new_val, mode);
2530                 }
2531                 store = new_node;
2532         } else if (!ia32_cg_config.use_sse2 && is_float_to_int_conv(val)) {
2533                 val = get_Conv_op(val);
2534
2535                 /* TODO: is this optimisation still necessary at all (middleend)? */
2536                 /* We can skip ALL float->float up-Convs (and strict-up-Convs) before stores. */
2537                 while (is_Conv(val)) {
2538                         ir_node *op = get_Conv_op(val);
2539                         if (!mode_is_float(get_irn_mode(op)))
2540                                 break;
2541                         if (get_mode_size_bits(get_irn_mode(op)) > get_mode_size_bits(get_irn_mode(val)))
2542                                 break;
2543                         val = op;
2544                 }
2545                 new_val  = be_transform_node(val);
2546                 new_node = gen_vfist(dbgi, new_block, addr.base, addr.index, addr.mem, new_val, &store);
2547         } else {
2548                 new_val = create_immediate_or_transform(val, 0);
2549                 assert(mode != mode_b);
2550
2551                 if (get_mode_size_bits(mode) == 8) {
2552                         new_node = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
2553                                                          addr.index, addr.mem, new_val);
2554                 } else {
2555                         new_node = new_bd_ia32_Store(dbgi, new_block, addr.base,
2556                                                      addr.index, addr.mem, new_val);
2557                 }
2558                 store = new_node;
2559         }
2560
2561         set_irn_pinned(store, get_irn_pinned(node));
2562         set_ia32_op_type(store, ia32_AddrModeD);
2563         set_ia32_ls_mode(store, mode);
2564
2565         set_address(store, &addr);
2566         SET_IA32_ORIG_NODE(store, node);
2567
2568         return new_node;
2569 }
2570
2571 /**
2572  * Transforms a Store.
2573  *
2574  * @return the created ia32 Store node
2575  */
2576 static ir_node *gen_Store(ir_node *node)
2577 {
2578         ir_node  *val  = get_Store_value(node);
2579         ir_mode  *mode = get_irn_mode(val);
2580
2581         if (mode_is_float(mode) && is_Const(val)) {
2582                 /* We can transform every floating const store
2583                    into a sequence of integer stores.
2584                    If the constant is already in a register,
2585                    it would be better to use it, but we don't
2586                    have this information here. */
2587                 return gen_float_const_Store(node, val);
2588         }
2589         return gen_general_Store(node);
2590 }
2591
2592 /**
2593  * Transforms a Switch.
2594  *
2595  * @return the created ia32 SwitchJmp node
2596  */
2597 static ir_node *create_Switch(ir_node *node)
2598 {
2599         dbg_info *dbgi       = get_irn_dbg_info(node);
2600         ir_node  *block      = be_transform_node(get_nodes_block(node));
2601         ir_node  *sel        = get_Cond_selector(node);
2602         ir_node  *new_sel    = be_transform_node(sel);
2603         long      switch_min = LONG_MAX;
2604         long      switch_max = LONG_MIN;
2605         long      default_pn = get_Cond_default_proj(node);
2606         ir_node  *new_node;
2607         const ir_edge_t *edge;
2608
2609         assert(get_mode_size_bits(get_irn_mode(sel)) == 32);
2610
2611         /* determine the smallest switch case value */
2612         foreach_out_edge(node, edge) {
2613                 ir_node *proj = get_edge_src_irn(edge);
2614                 long     pn   = get_Proj_proj(proj);
2615                 if (pn == default_pn)
2616                         continue;
2617
2618                 if (pn < switch_min)
2619                         switch_min = pn;
2620                 if (pn > switch_max)
2621                         switch_max = pn;
2622         }
2623
2624         if ((unsigned long) (switch_max - switch_min) > 128000) {
2625                 panic("Size of switch %+F bigger than 128000", node);
2626         }
2627
2628         if (switch_min != 0) {
2629                 /* if smallest switch case is not 0 we need an additional sub */
2630                 new_sel = new_bd_ia32_Lea(dbgi, block, new_sel, noreg_GP);
2631                 add_ia32_am_offs_int(new_sel, -switch_min);
2632                 set_ia32_op_type(new_sel, ia32_AddrModeS);
2633
2634                 SET_IA32_ORIG_NODE(new_sel, node);
2635         }
2636
2637         new_node = new_bd_ia32_SwitchJmp(dbgi, block, new_sel, default_pn);
2638         SET_IA32_ORIG_NODE(new_node, node);
2639
2640         return new_node;
2641 }
2642
2643 /**
2644  * Transform a Cond node.
2645  */
2646 static ir_node *gen_Cond(ir_node *node)
2647 {
2648         ir_node  *block     = get_nodes_block(node);
2649         ir_node  *new_block = be_transform_node(block);
2650         dbg_info *dbgi      = get_irn_dbg_info(node);
2651         ir_node  *sel       = get_Cond_selector(node);
2652         ir_mode  *sel_mode  = get_irn_mode(sel);
2653         ir_node  *flags     = NULL;
2654         ir_node  *new_node;
2655         pn_Cmp    pnc;
2656
2657         if (sel_mode != mode_b) {
2658                 return create_Switch(node);
2659         }
2660
2661         /* we get flags from a Cmp */
2662         flags = get_flags_node(sel, &pnc);
2663
2664         new_node = new_bd_ia32_Jcc(dbgi, new_block, flags, pnc);
2665         SET_IA32_ORIG_NODE(new_node, node);
2666
2667         return new_node;
2668 }
2669
2670 /**
2671  * Transform a be_Copy.
2672  */
2673 static ir_node *gen_be_Copy(ir_node *node)
2674 {
2675         ir_node *new_node = be_duplicate_node(node);
2676         ir_mode *mode     = get_irn_mode(new_node);
2677
2678         if (ia32_mode_needs_gp_reg(mode)) {
2679                 set_irn_mode(new_node, mode_Iu);
2680         }
2681
2682         return new_node;
2683 }
2684
2685 static ir_node *create_Fucom(ir_node *node)
2686 {
2687         dbg_info *dbgi      = get_irn_dbg_info(node);
2688         ir_node  *block     = get_nodes_block(node);
2689         ir_node  *new_block = be_transform_node(block);
2690         ir_node  *left      = get_Cmp_left(node);
2691         ir_node  *new_left  = be_transform_node(left);
2692         ir_node  *right     = get_Cmp_right(node);
2693         ir_node  *new_right;
2694         ir_node  *new_node;
2695
2696         if (ia32_cg_config.use_fucomi) {
2697                 new_right = be_transform_node(right);
2698                 new_node  = new_bd_ia32_vFucomi(dbgi, new_block, new_left,
2699                                                 new_right, 0);
2700                 set_ia32_commutative(new_node);
2701                 SET_IA32_ORIG_NODE(new_node, node);
2702         } else {
2703                 if (ia32_cg_config.use_ftst && is_Const_0(right)) {
2704                         new_node = new_bd_ia32_vFtstFnstsw(dbgi, new_block, new_left, 0);
2705                 } else {
2706                         new_right = be_transform_node(right);
2707                         new_node  = new_bd_ia32_vFucomFnstsw(dbgi, new_block, new_left, new_right, 0);
2708                 }
2709
2710                 set_ia32_commutative(new_node);
2711
2712                 SET_IA32_ORIG_NODE(new_node, node);
2713
2714                 new_node = new_bd_ia32_Sahf(dbgi, new_block, new_node);
2715                 SET_IA32_ORIG_NODE(new_node, node);
2716         }
2717
2718         return new_node;
2719 }
2720
2721 static ir_node *create_Ucomi(ir_node *node)
2722 {
2723         dbg_info *dbgi      = get_irn_dbg_info(node);
2724         ir_node  *src_block = get_nodes_block(node);
2725         ir_node  *new_block = be_transform_node(src_block);
2726         ir_node  *left      = get_Cmp_left(node);
2727         ir_node  *right     = get_Cmp_right(node);
2728         ir_node  *new_node;
2729         ia32_address_mode_t  am;
2730         ia32_address_t      *addr = &am.addr;
2731
2732         match_arguments(&am, src_block, left, right, NULL,
2733                         match_commutative | match_am);
2734
2735         new_node = new_bd_ia32_Ucomi(dbgi, new_block, addr->base, addr->index,
2736                                      addr->mem, am.new_op1, am.new_op2,
2737                                      am.ins_permuted);
2738         set_am_attributes(new_node, &am);
2739
2740         SET_IA32_ORIG_NODE(new_node, node);
2741
2742         new_node = fix_mem_proj(new_node, &am);
2743
2744         return new_node;
2745 }
2746
2747 /**
2748  * helper function: checks whether all Cmp projs are Lg or Eq which is needed
2749  * to fold an and into a test node
2750  */
2751 static bool can_fold_test_and(ir_node *node)
2752 {
2753         const ir_edge_t *edge;
2754
2755         /** we can only have eq and lg projs */
2756         foreach_out_edge(node, edge) {
2757                 ir_node *proj = get_edge_src_irn(edge);
2758                 pn_Cmp   pnc  = get_Proj_proj(proj);
2759                 if (pnc != pn_Cmp_Eq && pnc != pn_Cmp_Lg)
2760                         return false;
2761         }
2762
2763         return true;
2764 }
2765
2766 /**
2767  * returns true if it is assured, that the upper bits of a node are "clean"
2768  * which means for a 16 or 8 bit value, that the upper bits in the register
2769  * are 0 for unsigned and a copy of the last significant bit for signed
2770  * numbers.
2771  */
2772 static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode)
2773 {
2774         assert(ia32_mode_needs_gp_reg(mode));
2775         if (get_mode_size_bits(mode) >= 32)
2776                 return true;
2777
2778         if (is_Proj(transformed_node))
2779                 return upper_bits_clean(get_Proj_pred(transformed_node), mode);
2780
2781         switch (get_ia32_irn_opcode(transformed_node)) {
2782                 case iro_ia32_Conv_I2I:
2783                 case iro_ia32_Conv_I2I8Bit: {
2784                         ir_mode *smaller_mode = get_ia32_ls_mode(transformed_node);
2785                         if (mode_is_signed(smaller_mode) != mode_is_signed(mode))
2786                                 return false;
2787                         if (get_mode_size_bits(smaller_mode) > get_mode_size_bits(mode))
2788                                 return false;
2789
2790                         return true;
2791                 }
2792
2793                 case iro_ia32_Shr:
2794                         if (mode_is_signed(mode)) {
2795                                 return false; /* TODO handle signed modes */
2796                         } else {
2797                                 ir_node *right = get_irn_n(transformed_node, n_ia32_Shr_count);
2798                                 if (is_ia32_Immediate(right) || is_ia32_Const(right)) {
2799                                         const ia32_immediate_attr_t *attr
2800                                                 = get_ia32_immediate_attr_const(right);
2801                                         if (attr->symconst == 0 &&
2802                                                         (unsigned)attr->offset >= 32 - get_mode_size_bits(mode)) {
2803                                                 return true;
2804                                         }
2805                                 }
2806                                 return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Shr_val), mode);
2807                         }
2808
2809                 case iro_ia32_Sar:
2810                         /* TODO too conservative if shift amount is constant */
2811                         return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Sar_val), mode);
2812
2813                 case iro_ia32_And:
2814                         if (!mode_is_signed(mode)) {
2815                                 return
2816                                         upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_right), mode) ||
2817                                         upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_left),  mode);
2818                         }
2819                         /* TODO if one is known to be zero extended, then || is sufficient */
2820                         /* FALLTHROUGH */
2821                 case iro_ia32_Or:
2822                 case iro_ia32_Xor:
2823                         return
2824                                 upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_right), mode) &&
2825                                 upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_left),  mode);
2826
2827                 case iro_ia32_Const:
2828                 case iro_ia32_Immediate: {
2829                         const ia32_immediate_attr_t *attr =
2830                                 get_ia32_immediate_attr_const(transformed_node);
2831                         if (mode_is_signed(mode)) {
2832                                 long shifted = attr->offset >> (get_mode_size_bits(mode) - 1);
2833                                 return shifted == 0 || shifted == -1;
2834                         } else {
2835                                 unsigned long shifted = (unsigned long)attr->offset;
2836                                 shifted >>= get_mode_size_bits(mode);
2837                                 return shifted == 0;
2838                         }
2839                 }
2840
2841                 default:
2842                         return false;
2843         }
2844 }
2845
2846 /**
2847  * Generate code for a Cmp.
2848  */
2849 static ir_node *gen_Cmp(ir_node *node)
2850 {
2851         dbg_info *dbgi      = get_irn_dbg_info(node);
2852         ir_node  *block     = get_nodes_block(node);
2853         ir_node  *new_block = be_transform_node(block);
2854         ir_node  *left      = get_Cmp_left(node);
2855         ir_node  *right     = get_Cmp_right(node);
2856         ir_mode  *cmp_mode  = get_irn_mode(left);
2857         ir_node  *new_node;
2858         ia32_address_mode_t  am;
2859         ia32_address_t      *addr = &am.addr;
2860         int                  cmp_unsigned;
2861
2862         if (mode_is_float(cmp_mode)) {
2863                 if (ia32_cg_config.use_sse2) {
2864                         return create_Ucomi(node);
2865                 } else {
2866                         return create_Fucom(node);
2867                 }
2868         }
2869
2870         assert(ia32_mode_needs_gp_reg(cmp_mode));
2871
2872         /* Prefer the Test instruction, when encountering (x & y) ==/!= 0 */
2873         cmp_unsigned = !mode_is_signed(cmp_mode);
2874         if (is_Const_0(right)          &&
2875             is_And(left)               &&
2876             get_irn_n_edges(left) == 1 &&
2877             can_fold_test_and(node)) {
2878                 /* Test(and_left, and_right) */
2879                 ir_node *and_left  = get_And_left(left);
2880                 ir_node *and_right = get_And_right(left);
2881
2882                 /* matze: code here used mode instead of cmd_mode, I think it is always
2883                  * the same as cmp_mode, but I leave this here to see if this is really
2884                  * true...
2885                  */
2886                 assert(get_irn_mode(and_left) == cmp_mode);
2887
2888                 match_arguments(&am, block, and_left, and_right, NULL,
2889                                                                                 match_commutative |
2890                                                                                 match_am | match_8bit_am | match_16bit_am |
2891                                                                                 match_am_and_immediates | match_immediate);
2892
2893                 /* use 32bit compare mode if possible since the opcode is smaller */
2894                 if (upper_bits_clean(am.new_op1, cmp_mode) &&
2895                     upper_bits_clean(am.new_op2, cmp_mode)) {
2896                         cmp_mode = mode_is_signed(cmp_mode) ? mode_Is : mode_Iu;
2897                 }
2898
2899                 if (get_mode_size_bits(cmp_mode) == 8) {
2900                         new_node = new_bd_ia32_Test8Bit(dbgi, new_block, addr->base,
2901                                         addr->index, addr->mem, am.new_op1, am.new_op2, am.ins_permuted,
2902                                         cmp_unsigned);
2903                 } else {
2904                         new_node = new_bd_ia32_Test(dbgi, new_block, addr->base, addr->index,
2905                                         addr->mem, am.new_op1, am.new_op2, am.ins_permuted, cmp_unsigned);
2906                 }
2907         } else {
2908                 /* Cmp(left, right) */
2909                 match_arguments(&am, block, left, right, NULL,
2910                                 match_commutative | match_am | match_8bit_am |
2911                                 match_16bit_am | match_am_and_immediates |
2912                                 match_immediate);
2913                 /* use 32bit compare mode if possible since the opcode is smaller */
2914                 if (upper_bits_clean(am.new_op1, cmp_mode) &&
2915                     upper_bits_clean(am.new_op2, cmp_mode)) {
2916                         cmp_mode = mode_is_signed(cmp_mode) ? mode_Is : mode_Iu;
2917                 }
2918
2919                 if (get_mode_size_bits(cmp_mode) == 8) {
2920                         new_node = new_bd_ia32_Cmp8Bit(dbgi, new_block, addr->base,
2921                                                        addr->index, addr->mem, am.new_op1,
2922                                                        am.new_op2, am.ins_permuted,
2923                                                        cmp_unsigned);
2924                 } else {
2925                         new_node = new_bd_ia32_Cmp(dbgi, new_block, addr->base, addr->index,
2926                                         addr->mem, am.new_op1, am.new_op2, am.ins_permuted, cmp_unsigned);
2927                 }
2928         }
2929         set_am_attributes(new_node, &am);
2930         set_ia32_ls_mode(new_node, cmp_mode);
2931
2932         SET_IA32_ORIG_NODE(new_node, node);
2933
2934         new_node = fix_mem_proj(new_node, &am);
2935
2936         return new_node;
2937 }
2938
2939 static ir_node *create_CMov(ir_node *node, ir_node *flags, ir_node *new_flags,
2940                             pn_Cmp pnc)
2941 {
2942         dbg_info            *dbgi          = get_irn_dbg_info(node);
2943         ir_node             *block         = get_nodes_block(node);
2944         ir_node             *new_block     = be_transform_node(block);
2945         ir_node             *val_true      = get_Mux_true(node);
2946         ir_node             *val_false     = get_Mux_false(node);
2947         ir_node             *new_node;
2948         ia32_address_mode_t  am;
2949         ia32_address_t      *addr;
2950
2951         assert(ia32_cg_config.use_cmov);
2952         assert(ia32_mode_needs_gp_reg(get_irn_mode(val_true)));
2953
2954         addr = &am.addr;
2955
2956         match_arguments(&am, block, val_false, val_true, flags,
2957                         match_commutative | match_am | match_16bit_am | match_mode_neutral);
2958
2959         new_node = new_bd_ia32_CMov(dbgi, new_block, addr->base, addr->index,
2960                                     addr->mem, am.new_op1, am.new_op2, new_flags,
2961                                     am.ins_permuted, pnc);
2962         set_am_attributes(new_node, &am);
2963
2964         SET_IA32_ORIG_NODE(new_node, node);
2965
2966         new_node = fix_mem_proj(new_node, &am);
2967
2968         return new_node;
2969 }
2970
2971 /**
2972  * Creates a ia32 Setcc instruction.
2973  */
2974 static ir_node *create_set_32bit(dbg_info *dbgi, ir_node *new_block,
2975                                  ir_node *flags, pn_Cmp pnc, ir_node *orig_node,
2976                                  int ins_permuted)
2977 {
2978         ir_mode *mode  = get_irn_mode(orig_node);
2979         ir_node *new_node;
2980
2981         new_node = new_bd_ia32_Set(dbgi, new_block, flags, pnc, ins_permuted);
2982         SET_IA32_ORIG_NODE(new_node, orig_node);
2983
2984         /* we might need to conv the result up */
2985         if (get_mode_size_bits(mode) > 8) {
2986                 new_node = new_bd_ia32_Conv_I2I8Bit(dbgi, new_block, noreg_GP, noreg_GP,
2987                                                     nomem, new_node, mode_Bu);
2988                 SET_IA32_ORIG_NODE(new_node, orig_node);
2989         }
2990
2991         return new_node;
2992 }
2993
2994 /**
2995  * Create instruction for an unsigned Difference or Zero.
2996  */
2997 static ir_node *create_Doz(ir_node *psi, ir_node *a, ir_node *b)
2998 {
2999         ir_mode  *mode  = get_irn_mode(psi);
3000         ir_node  *new_node, *sub, *sbb, *eflags, *block;
3001
3002         dbg_info *dbgi;
3003
3004         new_node = gen_binop(psi, a, b, new_bd_ia32_Sub,
3005                 match_mode_neutral | match_am | match_immediate | match_two_users);
3006
3007         block = get_nodes_block(new_node);
3008
3009         if (is_Proj(new_node)) {
3010                 sub = get_Proj_pred(new_node);
3011                 assert(is_ia32_Sub(sub));
3012         } else {
3013                 sub = new_node;
3014                 set_irn_mode(sub, mode_T);
3015                 new_node = new_rd_Proj(NULL, block, sub, mode, pn_ia32_res);
3016         }
3017         eflags = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_Sub_flags);
3018
3019         dbgi   = get_irn_dbg_info(psi);
3020         sbb    = new_bd_ia32_Sbb0(dbgi, block, eflags);
3021
3022         new_node = new_bd_ia32_And(dbgi, block, noreg_GP, noreg_GP, nomem, new_node, sbb);
3023         set_ia32_commutative(new_node);
3024         return new_node;
3025 }
3026
3027 /**
3028  * Create an const array of two float consts.
3029  *
3030  * @param c0        the first constant
3031  * @param c1        the second constant
3032  * @param new_mode  IN/OUT for the mode of the constants, if NULL
3033  *                  smallest possible mode will be used
3034  */
3035 static ir_entity *ia32_create_const_array(ir_node *c0, ir_node *c1, ir_mode **new_mode) {
3036         ir_entity        *ent;
3037         ir_mode          *mode = *new_mode;
3038         ir_type          *tp;
3039         ir_initializer_t *initializer;
3040         tarval           *tv0 = get_Const_tarval(c0);
3041         tarval           *tv1 = get_Const_tarval(c1);
3042
3043         if (mode == NULL) {
3044                 /* detect the best mode for the constants */
3045                 mode = get_tarval_mode(tv0);
3046
3047                 if (mode != mode_F) {
3048                         if (tarval_ieee754_can_conv_lossless(tv0, mode_F) &&
3049                             tarval_ieee754_can_conv_lossless(tv1, mode_F)) {
3050                                 mode = mode_F;
3051                                 tv0 = tarval_convert_to(tv0, mode);
3052                                 tv1 = tarval_convert_to(tv1, mode);
3053                         } else if (mode != mode_D) {
3054                                 if (tarval_ieee754_can_conv_lossless(tv0, mode_D) &&
3055                                     tarval_ieee754_can_conv_lossless(tv1, mode_D)) {
3056                                         mode = mode_D;
3057                                         tv0 = tarval_convert_to(tv0, mode);
3058                                         tv1 = tarval_convert_to(tv1, mode);
3059                                 }
3060                         }
3061                 }
3062
3063         }
3064
3065         tp = ia32_create_float_type(mode, 4);
3066         tp = ia32_create_float_array(tp);
3067
3068         ent = new_entity(get_glob_type(), ia32_unique_id(".LC%u"), tp);
3069
3070         set_entity_ld_ident(ent, get_entity_ident(ent));
3071         set_entity_visibility(ent, visibility_local);
3072         set_entity_variability(ent, variability_constant);
3073         set_entity_allocation(ent, allocation_static);
3074
3075         initializer = create_initializer_compound(2);
3076
3077         set_initializer_compound_value(initializer, 0, create_initializer_tarval(tv0));
3078         set_initializer_compound_value(initializer, 1, create_initializer_tarval(tv1));
3079
3080         set_entity_initializer(ent, initializer);
3081
3082         *new_mode = mode;
3083         return ent;
3084 }
3085
3086 /**
3087  * Transforms a Mux node into some code sequence.
3088  *
3089  * @return The transformed node.
3090  */
3091 static ir_node *gen_Mux(ir_node *node)
3092 {
3093         dbg_info *dbgi        = get_irn_dbg_info(node);
3094         ir_node  *block       = get_nodes_block(node);
3095         ir_node  *new_block   = be_transform_node(block);
3096         ir_node  *mux_true    = get_Mux_true(node);
3097         ir_node  *mux_false   = get_Mux_false(node);
3098         ir_node  *cond        = get_Mux_sel(node);
3099         ir_mode  *mode        = get_irn_mode(node);
3100         ir_node  *flags;
3101         ir_node  *new_node;
3102         pn_Cmp   pnc;
3103
3104         assert(get_irn_mode(cond) == mode_b);
3105
3106         /* Note: a Mux node uses a Load two times IFF it's used in the compare AND in the result */
3107         if (mode_is_float(mode)) {
3108                 ir_node  *cmp         = get_Proj_pred(cond);
3109                 ir_node  *cmp_left    = get_Cmp_left(cmp);
3110                 ir_node  *cmp_right   = get_Cmp_right(cmp);
3111                 pn_Cmp   pnc          = get_Proj_proj(cond);
3112
3113                 if (ia32_cg_config.use_sse2) {
3114                         if (pnc == pn_Cmp_Lt || pnc == pn_Cmp_Le) {
3115                                 if (cmp_left == mux_true && cmp_right == mux_false) {
3116                                         /* Mux(a <= b, a, b) => MIN */
3117                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMin,
3118                                          match_commutative | match_am | match_two_users);
3119                                 } else if (cmp_left == mux_false && cmp_right == mux_true) {
3120                                         /* Mux(a <= b, b, a) => MAX */
3121                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMax,
3122                                          match_commutative | match_am | match_two_users);
3123                                 }
3124                         } else if (pnc == pn_Cmp_Gt || pnc == pn_Cmp_Ge) {
3125                                 if (cmp_left == mux_true && cmp_right == mux_false) {
3126                                         /* Mux(a >= b, a, b) => MAX */
3127                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMax,
3128                                          match_commutative | match_am | match_two_users);
3129                                 } else if (cmp_left == mux_false && cmp_right == mux_true) {
3130                                         /* Mux(a >= b, b, a) => MIN */
3131                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMin,
3132                                          match_commutative | match_am | match_two_users);
3133                                 }
3134                         }
3135                 }
3136                 if (is_Const(mux_true) && is_Const(mux_false)) {
3137                         ia32_address_mode_t am;
3138                         ir_node             *load;
3139                         ir_mode             *new_mode;
3140                         unsigned            scale;
3141
3142                         flags    = get_flags_node(cond, &pnc);
3143                         new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_permuted=*/0);
3144
3145                         if (ia32_cg_config.use_sse2) {
3146                                 /* cannot load from different mode on SSE */
3147                                 new_mode = mode;
3148                         } else {
3149                                 /* x87 can load any mode */
3150                                 new_mode = NULL;
3151                         }
3152
3153                         am.addr.symconst_ent = ia32_create_const_array(mux_false, mux_true, &new_mode);
3154
3155                         switch (get_mode_size_bytes(new_mode)) {
3156                         case 4:
3157                                 scale = 2;
3158                                 break;
3159                         case 8:
3160                                 scale = 3;
3161                                 break;
3162                         case 10:
3163                                 /* use 2 * 5 */
3164                                 scale = 1;
3165                                 new_node = new_bd_ia32_Lea(dbgi, new_block, new_node, new_node);
3166                                 set_ia32_am_scale(new_node, 2);
3167                                 break;
3168                         case 12:
3169                                 /* use 4 * 3 */
3170                                 scale = 2;
3171                                 new_node = new_bd_ia32_Lea(dbgi, new_block, new_node, new_node);
3172                                 set_ia32_am_scale(new_node, 1);
3173                                 break;
3174                         case 16:
3175                                 /* arg, shift 16 NOT supported */
3176                                 scale = 3;
3177                                 new_node = new_bd_ia32_Add(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_node, new_node);
3178                                 break;
3179                         default:
3180                                 panic("Unsupported constant size");
3181                         }
3182
3183                         am.ls_mode            = new_mode;
3184                         am.addr.base          = noreg_GP;
3185                         am.addr.index         = new_node;
3186                         am.addr.mem           = nomem;
3187                         am.addr.offset        = 0;
3188                         am.addr.scale         = scale;
3189                         am.addr.use_frame     = 0;
3190                         am.addr.frame_entity  = NULL;
3191                         am.addr.symconst_sign = 0;
3192                         am.mem_proj           = am.addr.mem;
3193                         am.op_type            = ia32_AddrModeS;
3194                         am.new_op1            = NULL;
3195                         am.new_op2            = NULL;
3196                         am.pinned             = op_pin_state_floats;
3197                         am.commutative        = 1;
3198                         am.ins_permuted       = 0;
3199
3200                         if (ia32_cg_config.use_sse2)
3201                                 load = new_bd_ia32_xLoad(dbgi, block, am.addr.base, am.addr.index, am.addr.mem, new_mode);
3202                         else
3203                                 load = new_bd_ia32_vfld(dbgi, block, am.addr.base, am.addr.index, am.addr.mem, new_mode);
3204                         set_am_attributes(load, &am);
3205
3206                         return new_rd_Proj(NULL, block, load, mode_vfp, pn_ia32_res);
3207                 }
3208                 panic("cannot transform floating point Mux");
3209
3210         } else {
3211                 assert(ia32_mode_needs_gp_reg(mode));
3212
3213                 if (is_Proj(cond)) {
3214                         ir_node *cmp = get_Proj_pred(cond);
3215                         if (is_Cmp(cmp)) {
3216                                 ir_node  *cmp_left    = get_Cmp_left(cmp);
3217                                 ir_node  *cmp_right   = get_Cmp_right(cmp);
3218                                 pn_Cmp   pnc          = get_Proj_proj(cond);
3219
3220                                 /* check for unsigned Doz first */
3221                                 if ((pnc & pn_Cmp_Gt) && !mode_is_signed(mode) &&
3222                                         is_Const_0(mux_false) && is_Sub(mux_true) &&
3223                                         get_Sub_left(mux_true) == cmp_left && get_Sub_right(mux_true) == cmp_right) {
3224                                         /* Mux(a >=u b, a - b, 0) unsigned Doz */
3225                                         return create_Doz(node, cmp_left, cmp_right);
3226                                 } else if ((pnc & pn_Cmp_Lt) && !mode_is_signed(mode) &&
3227                                         is_Const_0(mux_true) && is_Sub(mux_false) &&
3228                                         get_Sub_left(mux_false) == cmp_left && get_Sub_right(mux_false) == cmp_right) {
3229                                         /* Mux(a <=u b, 0, a - b) unsigned Doz */
3230                                         return create_Doz(node, cmp_left, cmp_right);
3231                                 }
3232                         }
3233                 }
3234
3235                 flags = get_flags_node(cond, &pnc);
3236
3237                 if (is_Const(mux_true) && is_Const(mux_false)) {
3238                         /* both are const, good */
3239                         if (is_Const_1(mux_true) && is_Const_0(mux_false)) {
3240                                 new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_premuted=*/0);
3241                         } else if (is_Const_0(mux_true) && is_Const_1(mux_false)) {
3242                                 new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_premuted=*/1);
3243                         } else {
3244                                 /* Not that simple. */
3245                                 goto need_cmov;
3246                         }
3247                 } else {
3248 need_cmov:
3249                         new_node = create_CMov(node, cond, flags, pnc);
3250                 }
3251                 return new_node;
3252         }
3253 }
3254
3255
3256 /**
3257  * Create a conversion from x87 state register to general purpose.
3258  */
3259 static ir_node *gen_x87_fp_to_gp(ir_node *node)
3260 {
3261         ir_node         *block      = be_transform_node(get_nodes_block(node));
3262         ir_node         *op         = get_Conv_op(node);
3263         ir_node         *new_op     = be_transform_node(op);
3264         ir_graph        *irg        = current_ir_graph;
3265         dbg_info        *dbgi       = get_irn_dbg_info(node);
3266         ir_mode         *mode       = get_irn_mode(node);
3267         ir_node         *fist, *load, *mem;
3268
3269         mem = gen_vfist(dbgi, block, get_irg_frame(irg), noreg_GP, nomem, new_op, &fist);
3270         set_irn_pinned(fist, op_pin_state_floats);
3271         set_ia32_use_frame(fist);
3272         set_ia32_op_type(fist, ia32_AddrModeD);
3273
3274         assert(get_mode_size_bits(mode) <= 32);
3275         /* exception we can only store signed 32 bit integers, so for unsigned
3276            we store a 64bit (signed) integer and load the lower bits */
3277         if (get_mode_size_bits(mode) == 32 && !mode_is_signed(mode)) {
3278                 set_ia32_ls_mode(fist, mode_Ls);
3279         } else {
3280                 set_ia32_ls_mode(fist, mode_Is);
3281         }
3282         SET_IA32_ORIG_NODE(fist, node);
3283
3284         /* do a Load */
3285         load = new_bd_ia32_Load(dbgi, block, get_irg_frame(irg), noreg_GP, mem);
3286
3287         set_irn_pinned(load, op_pin_state_floats);
3288         set_ia32_use_frame(load);
3289         set_ia32_op_type(load, ia32_AddrModeS);
3290         set_ia32_ls_mode(load, mode_Is);
3291         if (get_ia32_ls_mode(fist) == mode_Ls) {
3292                 ia32_attr_t *attr = get_ia32_attr(load);
3293                 attr->data.need_64bit_stackent = 1;
3294         } else {
3295                 ia32_attr_t *attr = get_ia32_attr(load);
3296                 attr->data.need_32bit_stackent = 1;
3297         }
3298         SET_IA32_ORIG_NODE(load, node);
3299
3300         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
3301 }
3302
3303 /**
3304  * Creates a x87 strict Conv by placing a Store and a Load
3305  */
3306 static ir_node *gen_x87_strict_conv(ir_mode *tgt_mode, ir_node *node)
3307 {
3308         ir_node  *block    = get_nodes_block(node);
3309         ir_graph *irg      = get_Block_irg(block);
3310         dbg_info *dbgi     = get_irn_dbg_info(node);
3311         ir_node  *frame    = get_irg_frame(irg);
3312         ir_node  *store, *load;
3313         ir_node  *new_node;
3314
3315         store = new_bd_ia32_vfst(dbgi, block, frame, noreg_GP, nomem, node, tgt_mode);
3316         set_ia32_use_frame(store);
3317         set_ia32_op_type(store, ia32_AddrModeD);
3318         SET_IA32_ORIG_NODE(store, node);
3319
3320         load = new_bd_ia32_vfld(dbgi, block, frame, noreg_GP, store, tgt_mode);
3321         set_ia32_use_frame(load);
3322         set_ia32_op_type(load, ia32_AddrModeS);
3323         SET_IA32_ORIG_NODE(load, node);
3324
3325         new_node = new_r_Proj(block, load, mode_E, pn_ia32_vfld_res);
3326         return new_node;
3327 }
3328
3329 static ir_node *create_Conv_I2I(dbg_info *dbgi, ir_node *block, ir_node *base,
3330                 ir_node *index, ir_node *mem, ir_node *val, ir_mode *mode)
3331 {
3332         ir_node *(*func)(dbg_info*, ir_node*, ir_node*, ir_node*, ir_node*, ir_node*, ir_mode*);
3333
3334         func = get_mode_size_bits(mode) == 8 ?
3335                 new_bd_ia32_Conv_I2I8Bit : new_bd_ia32_Conv_I2I;
3336         return func(dbgi, block, base, index, mem, val, mode);
3337 }
3338
3339 /**
3340  * Create a conversion from general purpose to x87 register
3341  */
3342 static ir_node *gen_x87_gp_to_fp(ir_node *node, ir_mode *src_mode)
3343 {
3344         ir_node  *src_block = get_nodes_block(node);
3345         ir_node  *block     = be_transform_node(src_block);
3346         ir_graph *irg       = get_Block_irg(block);
3347         dbg_info *dbgi      = get_irn_dbg_info(node);
3348         ir_node  *op        = get_Conv_op(node);
3349         ir_node  *new_op    = NULL;
3350         ir_mode  *mode;
3351         ir_mode  *store_mode;
3352         ir_node  *fild;
3353         ir_node  *store;
3354         ir_node  *new_node;
3355
3356         /* fild can use source AM if the operand is a signed 16bit or 32bit integer */
3357         if (possible_int_mode_for_fp(src_mode)) {
3358                 ia32_address_mode_t am;
3359
3360                 match_arguments(&am, src_block, NULL, op, NULL, match_am | match_try_am | match_16bit_am);
3361                 if (am.op_type == ia32_AddrModeS) {
3362                         ia32_address_t *addr = &am.addr;
3363
3364                         fild     = new_bd_ia32_vfild(dbgi, block, addr->base, addr->index, addr->mem);
3365                         new_node = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
3366
3367                         set_am_attributes(fild, &am);
3368                         SET_IA32_ORIG_NODE(fild, node);
3369
3370                         fix_mem_proj(fild, &am);
3371
3372                         return new_node;
3373                 }
3374         }
3375         if (new_op == NULL) {
3376                 new_op = be_transform_node(op);
3377         }
3378
3379         mode = get_irn_mode(op);
3380
3381         /* first convert to 32 bit signed if necessary */
3382         if (get_mode_size_bits(src_mode) < 32) {
3383                 if (!upper_bits_clean(new_op, src_mode)) {
3384                         new_op = create_Conv_I2I(dbgi, block, noreg_GP, noreg_GP, nomem, new_op, src_mode);
3385                         SET_IA32_ORIG_NODE(new_op, node);
3386                 }
3387                 mode = mode_Is;
3388         }
3389
3390         assert(get_mode_size_bits(mode) == 32);
3391
3392         /* do a store */
3393         store = new_bd_ia32_Store(dbgi, block, get_irg_frame(irg), noreg_GP, nomem, new_op);
3394
3395         set_ia32_use_frame(store);
3396         set_ia32_op_type(store, ia32_AddrModeD);
3397         set_ia32_ls_mode(store, mode_Iu);
3398
3399         /* exception for 32bit unsigned, do a 64bit spill+load */
3400         if (!mode_is_signed(mode)) {
3401                 ir_node *in[2];
3402                 /* store a zero */
3403                 ir_node *zero_const = ia32_create_Immediate(NULL, 0, 0);
3404
3405                 ir_node *zero_store = new_bd_ia32_Store(dbgi, block, get_irg_frame(irg),
3406                                                         noreg_GP, nomem, zero_const);
3407
3408                 set_ia32_use_frame(zero_store);
3409                 set_ia32_op_type(zero_store, ia32_AddrModeD);
3410                 add_ia32_am_offs_int(zero_store, 4);
3411                 set_ia32_ls_mode(zero_store, mode_Iu);
3412
3413                 in[0] = zero_store;
3414                 in[1] = store;
3415
3416                 store      = new_rd_Sync(dbgi, block, 2, in);
3417                 store_mode = mode_Ls;
3418         } else {
3419                 store_mode = mode_Is;
3420         }
3421
3422         /* do a fild */
3423         fild = new_bd_ia32_vfild(dbgi, block, get_irg_frame(irg), noreg_GP, store);
3424
3425         set_ia32_use_frame(fild);
3426         set_ia32_op_type(fild, ia32_AddrModeS);
3427         set_ia32_ls_mode(fild, store_mode);
3428
3429         new_node = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
3430
3431         return new_node;
3432 }
3433
3434 /**
3435  * Create a conversion from one integer mode into another one
3436  */
3437 static ir_node *create_I2I_Conv(ir_mode *src_mode, ir_mode *tgt_mode,
3438                                 dbg_info *dbgi, ir_node *block, ir_node *op,
3439                                 ir_node *node)
3440 {
3441         ir_node             *new_block = be_transform_node(block);
3442         ir_node             *new_node;
3443         ir_mode             *smaller_mode;
3444         ia32_address_mode_t  am;
3445         ia32_address_t      *addr = &am.addr;
3446
3447         (void) node;
3448         if (get_mode_size_bits(src_mode) < get_mode_size_bits(tgt_mode)) {
3449                 smaller_mode = src_mode;
3450         } else {
3451                 smaller_mode = tgt_mode;
3452         }
3453
3454 #ifdef DEBUG_libfirm
3455         if (is_Const(op)) {
3456                 ir_fprintf(stderr, "Optimisation warning: conv after constant %+F\n",
3457                            op);
3458         }
3459 #endif
3460
3461         match_arguments(&am, block, NULL, op, NULL,
3462                         match_am | match_8bit_am | match_16bit_am);
3463
3464         if (upper_bits_clean(am.new_op2, smaller_mode)) {
3465                 /* unnecessary conv. in theory it shouldn't have been AM */
3466                 assert(is_ia32_NoReg_GP(addr->base));
3467                 assert(is_ia32_NoReg_GP(addr->index));
3468                 assert(is_NoMem(addr->mem));
3469                 assert(am.addr.offset == 0);
3470                 assert(am.addr.symconst_ent == NULL);
3471                 return am.new_op2;
3472         }
3473
3474         new_node = create_Conv_I2I(dbgi, new_block, addr->base, addr->index,
3475                         addr->mem, am.new_op2, smaller_mode);
3476         set_am_attributes(new_node, &am);
3477         /* match_arguments assume that out-mode = in-mode, this isn't true here
3478          * so fix it */
3479         set_ia32_ls_mode(new_node, smaller_mode);
3480         SET_IA32_ORIG_NODE(new_node, node);
3481         new_node = fix_mem_proj(new_node, &am);
3482         return new_node;
3483 }
3484
3485 /**
3486  * Transforms a Conv node.
3487  *
3488  * @return The created ia32 Conv node
3489  */
3490 static ir_node *gen_Conv(ir_node *node)
3491 {
3492         ir_node  *block     = get_nodes_block(node);
3493         ir_node  *new_block = be_transform_node(block);
3494         ir_node  *op        = get_Conv_op(node);
3495         ir_node  *new_op    = NULL;
3496         dbg_info *dbgi      = get_irn_dbg_info(node);
3497         ir_mode  *src_mode  = get_irn_mode(op);
3498         ir_mode  *tgt_mode  = get_irn_mode(node);
3499         int       src_bits  = get_mode_size_bits(src_mode);
3500         int       tgt_bits  = get_mode_size_bits(tgt_mode);
3501         ir_node  *res       = NULL;
3502
3503         assert(!mode_is_int(src_mode) || src_bits <= 32);
3504         assert(!mode_is_int(tgt_mode) || tgt_bits <= 32);
3505
3506         if (src_mode == mode_b) {
3507                 assert(mode_is_int(tgt_mode) || mode_is_reference(tgt_mode));
3508                 /* nothing to do, we already model bools as 0/1 ints */
3509                 return be_transform_node(op);
3510         }
3511
3512         if (src_mode == tgt_mode) {
3513                 if (get_Conv_strict(node)) {
3514                         if (ia32_cg_config.use_sse2) {
3515                                 /* when we are in SSE mode, we can kill all strict no-op conversion */
3516                                 return be_transform_node(op);
3517                         }
3518                 } else {
3519                         /* this should be optimized already, but who knows... */
3520                         DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: conv %+F is pointless\n", node));
3521                         DB((dbg, LEVEL_1, "killed Conv(mode, mode) ..."));
3522                         return be_transform_node(op);
3523                 }
3524         }
3525
3526         if (mode_is_float(src_mode)) {
3527                 new_op = be_transform_node(op);
3528                 /* we convert from float ... */
3529                 if (mode_is_float(tgt_mode)) {
3530 #if 0
3531                         /* Matze: I'm a bit unsure what the following is for? seems wrong
3532                          * to me... */
3533                         if (src_mode == mode_E && tgt_mode == mode_D
3534                                         && !get_Conv_strict(node)) {
3535                                 DB((dbg, LEVEL_1, "killed Conv(mode, mode) ..."));
3536                                 return new_op;
3537                         }
3538 #endif
3539
3540                         /* ... to float */
3541                         if (ia32_cg_config.use_sse2) {
3542                                 DB((dbg, LEVEL_1, "create Conv(float, float) ..."));
3543                                 res = new_bd_ia32_Conv_FP2FP(dbgi, new_block, noreg_GP, noreg_GP,
3544                                                              nomem, new_op);
3545                                 set_ia32_ls_mode(res, tgt_mode);
3546                         } else {
3547                                 if (get_Conv_strict(node)) {
3548                                         /* if fp_no_float_fold is not set then we assume that we
3549                                          * don't have any float operations in a non
3550                                          * mode_float_arithmetic mode and can skip strict upconvs */
3551                                         if (src_bits < tgt_bits
3552                                                         && !(get_irg_fp_model(current_ir_graph) & fp_no_float_fold)) {
3553                                                 DB((dbg, LEVEL_1, "killed Conv(float, float) ..."));
3554                                                 return new_op;
3555                                         } else {
3556                                                 res = gen_x87_strict_conv(tgt_mode, new_op);
3557                                                 SET_IA32_ORIG_NODE(get_Proj_pred(res), node);
3558                                                 return res;
3559                                         }
3560                                 }
3561                                 DB((dbg, LEVEL_1, "killed Conv(float, float) ..."));
3562                                 return new_op;
3563                         }
3564                 } else {
3565                         /* ... to int */
3566                         DB((dbg, LEVEL_1, "create Conv(float, int) ..."));
3567                         if (ia32_cg_config.use_sse2) {
3568                                 res = new_bd_ia32_Conv_FP2I(dbgi, new_block, noreg_GP, noreg_GP,
3569                                                             nomem, new_op);
3570                                 set_ia32_ls_mode(res, src_mode);
3571                         } else {
3572                                 return gen_x87_fp_to_gp(node);
3573                         }
3574                 }
3575         } else {
3576                 /* we convert from int ... */
3577                 if (mode_is_float(tgt_mode)) {
3578                         /* ... to float */
3579                         DB((dbg, LEVEL_1, "create Conv(int, float) ..."));
3580                         if (ia32_cg_config.use_sse2) {
3581                                 new_op = be_transform_node(op);
3582                                 res = new_bd_ia32_Conv_I2FP(dbgi, new_block, noreg_GP, noreg_GP,
3583                                                             nomem, new_op);
3584                                 set_ia32_ls_mode(res, tgt_mode);
3585                         } else {
3586                                 unsigned int_mantissa   = get_mode_size_bits(src_mode) - (mode_is_signed(src_mode) ? 1 : 0);
3587                                 unsigned float_mantissa = tarval_ieee754_get_mantissa_size(tgt_mode);
3588                                 res = gen_x87_gp_to_fp(node, src_mode);
3589
3590                                 /* we need a strict-Conv, if the int mode has more bits than the
3591                                  * float mantissa */
3592                                 if (float_mantissa < int_mantissa) {
3593                                         res = gen_x87_strict_conv(tgt_mode, res);
3594                                         SET_IA32_ORIG_NODE(get_Proj_pred(res), node);
3595                                 }
3596                                 return res;
3597                         }
3598                 } else if (tgt_mode == mode_b) {
3599                         /* mode_b lowering already took care that we only have 0/1 values */
3600                         DB((dbg, LEVEL_1, "omitting unnecessary Conv(%+F, %+F) ...",
3601                             src_mode, tgt_mode));
3602                         return be_transform_node(op);
3603                 } else {
3604                         /* to int */
3605                         if (src_bits == tgt_bits) {
3606                                 DB((dbg, LEVEL_1, "omitting unnecessary Conv(%+F, %+F) ...",
3607                                     src_mode, tgt_mode));
3608                                 return be_transform_node(op);
3609                         }
3610
3611                         res = create_I2I_Conv(src_mode, tgt_mode, dbgi, block, op, node);
3612                         return res;
3613                 }
3614         }
3615
3616         return res;
3617 }
3618
3619 static ir_node *create_immediate_or_transform(ir_node *node,
3620                                               char immediate_constraint_type)
3621 {
3622         ir_node *new_node = try_create_Immediate(node, immediate_constraint_type);
3623         if (new_node == NULL) {
3624                 new_node = be_transform_node(node);
3625         }
3626         return new_node;
3627 }
3628
3629 /**
3630  * Transforms a FrameAddr into an ia32 Add.
3631  */
3632 static ir_node *gen_be_FrameAddr(ir_node *node)
3633 {
3634         ir_node  *block  = be_transform_node(get_nodes_block(node));
3635         ir_node  *op     = be_get_FrameAddr_frame(node);
3636         ir_node  *new_op = be_transform_node(op);
3637         dbg_info *dbgi   = get_irn_dbg_info(node);
3638         ir_node  *new_node;
3639
3640         new_node = new_bd_ia32_Lea(dbgi, block, new_op, noreg_GP);
3641         set_ia32_frame_ent(new_node, arch_get_frame_entity(node));
3642         set_ia32_use_frame(new_node);
3643
3644         SET_IA32_ORIG_NODE(new_node, node);
3645
3646         return new_node;
3647 }
3648
3649 /**
3650  * In case SSE is used we need to copy the result from XMM0 to FPU TOS before return.
3651  */
3652 static ir_node *gen_be_Return(ir_node *node)
3653 {
3654         ir_graph  *irg     = current_ir_graph;
3655         ir_node   *ret_val = get_irn_n(node, be_pos_Return_val);
3656         ir_node   *ret_mem = get_irn_n(node, be_pos_Return_mem);
3657         ir_entity *ent     = get_irg_entity(irg);
3658         ir_type   *tp      = get_entity_type(ent);
3659         dbg_info  *dbgi;
3660         ir_node   *block;
3661         ir_type   *res_type;
3662         ir_mode   *mode;
3663         ir_node   *frame, *sse_store, *fld, *mproj, *barrier;
3664         ir_node   *new_barrier, *new_ret_val, *new_ret_mem;
3665         ir_node   **in;
3666         int       pn_ret_val, pn_ret_mem, arity, i;
3667
3668         assert(ret_val != NULL);
3669         if (be_Return_get_n_rets(node) < 1 || ! ia32_cg_config.use_sse2) {
3670                 return be_duplicate_node(node);
3671         }
3672
3673         res_type = get_method_res_type(tp, 0);
3674
3675         if (! is_Primitive_type(res_type)) {
3676                 return be_duplicate_node(node);
3677         }
3678
3679         mode = get_type_mode(res_type);
3680         if (! mode_is_float(mode)) {
3681                 return be_duplicate_node(node);
3682         }
3683
3684         assert(get_method_n_ress(tp) == 1);
3685
3686         pn_ret_val = get_Proj_proj(ret_val);
3687         pn_ret_mem = get_Proj_proj(ret_mem);
3688
3689         /* get the Barrier */
3690         barrier = get_Proj_pred(ret_val);
3691
3692         /* get result input of the Barrier */
3693         ret_val     = get_irn_n(barrier, pn_ret_val);
3694         new_ret_val = be_transform_node(ret_val);
3695
3696         /* get memory input of the Barrier */
3697         ret_mem     = get_irn_n(barrier, pn_ret_mem);
3698         new_ret_mem = be_transform_node(ret_mem);
3699
3700         frame = get_irg_frame(irg);
3701
3702         dbgi  = get_irn_dbg_info(barrier);
3703         block = be_transform_node(get_nodes_block(barrier));
3704
3705         /* store xmm0 onto stack */
3706         sse_store = new_bd_ia32_xStoreSimple(dbgi, block, frame, noreg_GP,
3707                                              new_ret_mem, new_ret_val);
3708         set_ia32_ls_mode(sse_store, mode);
3709         set_ia32_op_type(sse_store, ia32_AddrModeD);
3710         set_ia32_use_frame(sse_store);
3711
3712         /* load into x87 register */
3713         fld = new_bd_ia32_vfld(dbgi, block, frame, noreg_GP, sse_store, mode);
3714         set_ia32_op_type(fld, ia32_AddrModeS);
3715         set_ia32_use_frame(fld);
3716
3717         mproj = new_r_Proj(block, fld, mode_M, pn_ia32_vfld_M);
3718         fld   = new_r_Proj(block, fld, mode_vfp, pn_ia32_vfld_res);
3719
3720         /* create a new barrier */
3721         arity = get_irn_arity(barrier);
3722         in    = ALLOCAN(ir_node*, arity);
3723         for (i = 0; i < arity; ++i) {
3724                 ir_node *new_in;
3725
3726                 if (i == pn_ret_val) {
3727                         new_in = fld;
3728                 } else if (i == pn_ret_mem) {
3729                         new_in = mproj;
3730                 } else {
3731                         ir_node *in = get_irn_n(barrier, i);
3732                         new_in = be_transform_node(in);
3733                 }
3734                 in[i] = new_in;
3735         }
3736
3737         new_barrier = new_ir_node(dbgi, irg, block,
3738                                   get_irn_op(barrier), get_irn_mode(barrier),
3739                                   arity, in);
3740         copy_node_attr(barrier, new_barrier);
3741         be_duplicate_deps(barrier, new_barrier);
3742         be_set_transformed_node(barrier, new_barrier);
3743
3744         /* transform normally */
3745         return be_duplicate_node(node);
3746 }
3747
3748 /**
3749  * Transform a be_AddSP into an ia32_SubSP.
3750  */
3751 static ir_node *gen_be_AddSP(ir_node *node)
3752 {
3753         ir_node  *sz = get_irn_n(node, be_pos_AddSP_size);
3754         ir_node  *sp = get_irn_n(node, be_pos_AddSP_old_sp);
3755
3756         return gen_binop(node, sp, sz, new_bd_ia32_SubSP,
3757                          match_am | match_immediate);
3758 }
3759
3760 /**
3761  * Transform a be_SubSP into an ia32_AddSP
3762  */
3763 static ir_node *gen_be_SubSP(ir_node *node)
3764 {
3765         ir_node  *sz = get_irn_n(node, be_pos_SubSP_size);
3766         ir_node  *sp = get_irn_n(node, be_pos_SubSP_old_sp);
3767
3768         return gen_binop(node, sp, sz, new_bd_ia32_AddSP,
3769                          match_am | match_immediate);
3770 }
3771
3772 /**
3773  * Change some phi modes
3774  */
3775 static ir_node *gen_Phi(ir_node *node)
3776 {
3777         ir_node  *block = be_transform_node(get_nodes_block(node));
3778         ir_graph *irg   = current_ir_graph;
3779         dbg_info *dbgi  = get_irn_dbg_info(node);
3780         ir_mode  *mode  = get_irn_mode(node);
3781         ir_node  *phi;
3782
3783         if (ia32_mode_needs_gp_reg(mode)) {
3784                 /* we shouldn't have any 64bit stuff around anymore */
3785                 assert(get_mode_size_bits(mode) <= 32);
3786                 /* all integer operations are on 32bit registers now */
3787                 mode = mode_Iu;
3788         } else if (mode_is_float(mode)) {
3789                 if (ia32_cg_config.use_sse2) {
3790                         mode = mode_xmm;
3791                 } else {
3792                         mode = mode_vfp;
3793                 }
3794         }
3795
3796         /* phi nodes allow loops, so we use the old arguments for now
3797          * and fix this later */
3798         phi = new_ir_node(dbgi, irg, block, op_Phi, mode, get_irn_arity(node),
3799                           get_irn_in(node) + 1);
3800         copy_node_attr(node, phi);
3801         be_duplicate_deps(node, phi);
3802
3803         be_enqueue_preds(node);
3804
3805         return phi;
3806 }
3807
3808 /**
3809  * Transform IJmp
3810  */
3811 static ir_node *gen_IJmp(ir_node *node)
3812 {
3813         ir_node  *block     = get_nodes_block(node);
3814         ir_node  *new_block = be_transform_node(block);
3815         dbg_info *dbgi      = get_irn_dbg_info(node);
3816         ir_node  *op        = get_IJmp_target(node);
3817         ir_node  *new_node;
3818         ia32_address_mode_t  am;
3819         ia32_address_t      *addr = &am.addr;
3820
3821         assert(get_irn_mode(op) == mode_P);
3822
3823         match_arguments(&am, block, NULL, op, NULL, match_am | match_immediate);
3824
3825         new_node = new_bd_ia32_IJmp(dbgi, new_block, addr->base, addr->index,
3826                         addr->mem, am.new_op2);
3827         set_am_attributes(new_node, &am);
3828         SET_IA32_ORIG_NODE(new_node, node);
3829
3830         new_node = fix_mem_proj(new_node, &am);
3831
3832         return new_node;
3833 }
3834
3835 /**
3836  * Transform a Bound node.
3837  */
3838 static ir_node *gen_Bound(ir_node *node)
3839 {
3840         ir_node  *new_node;
3841         ir_node  *lower = get_Bound_lower(node);
3842         dbg_info *dbgi  = get_irn_dbg_info(node);
3843
3844         if (is_Const_0(lower)) {
3845                 /* typical case for Java */
3846                 ir_node  *sub, *res, *flags, *block;
3847
3848                 res = gen_binop(node, get_Bound_index(node), get_Bound_upper(node),
3849                         new_bd_ia32_Sub, match_mode_neutral     | match_am | match_immediate);
3850
3851                 block = get_nodes_block(res);
3852                 if (! is_Proj(res)) {
3853                         sub = res;
3854                         set_irn_mode(sub, mode_T);
3855                         res = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_res);
3856                 } else {
3857                         sub = get_Proj_pred(res);
3858                 }
3859                 flags = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_Sub_flags);
3860                 new_node = new_bd_ia32_Jcc(dbgi, block, flags, pn_Cmp_Lt | ia32_pn_Cmp_unsigned);
3861                 SET_IA32_ORIG_NODE(new_node, node);
3862         } else {
3863                 panic("generic Bound not supported in ia32 Backend");
3864         }
3865         return new_node;
3866 }
3867
3868
3869 static ir_node *gen_ia32_l_ShlDep(ir_node *node)
3870 {
3871         ir_node *left  = get_irn_n(node, n_ia32_l_ShlDep_val);
3872         ir_node *right = get_irn_n(node, n_ia32_l_ShlDep_count);
3873
3874         return gen_shift_binop(node, left, right, new_bd_ia32_Shl,
3875                                match_immediate | match_mode_neutral);
3876 }
3877
3878 static ir_node *gen_ia32_l_ShrDep(ir_node *node)
3879 {
3880         ir_node *left  = get_irn_n(node, n_ia32_l_ShrDep_val);
3881         ir_node *right = get_irn_n(node, n_ia32_l_ShrDep_count);
3882         return gen_shift_binop(node, left, right, new_bd_ia32_Shr,
3883                                match_immediate);
3884 }
3885
3886 static ir_node *gen_ia32_l_SarDep(ir_node *node)
3887 {
3888         ir_node *left  = get_irn_n(node, n_ia32_l_SarDep_val);
3889         ir_node *right = get_irn_n(node, n_ia32_l_SarDep_count);
3890         return gen_shift_binop(node, left, right, new_bd_ia32_Sar,
3891                                match_immediate);
3892 }
3893
3894 static ir_node *gen_ia32_l_Add(ir_node *node)
3895 {
3896         ir_node *left    = get_irn_n(node, n_ia32_l_Add_left);
3897         ir_node *right   = get_irn_n(node, n_ia32_l_Add_right);
3898         ir_node *lowered = gen_binop(node, left, right, new_bd_ia32_Add,
3899                         match_commutative | match_am | match_immediate |
3900                         match_mode_neutral);
3901
3902         if (is_Proj(lowered)) {
3903                 lowered = get_Proj_pred(lowered);
3904         } else {
3905                 assert(is_ia32_Add(lowered));
3906                 set_irn_mode(lowered, mode_T);
3907         }
3908
3909         return lowered;
3910 }
3911
3912 static ir_node *gen_ia32_l_Adc(ir_node *node)
3913 {
3914         return gen_binop_flags(node, new_bd_ia32_Adc,
3915                         match_commutative | match_am | match_immediate |
3916                         match_mode_neutral);
3917 }
3918
3919 /**
3920  * Transforms a l_MulS into a "real" MulS node.
3921  *
3922  * @return the created ia32 Mul node
3923  */
3924 static ir_node *gen_ia32_l_Mul(ir_node *node)
3925 {
3926         ir_node *left  = get_binop_left(node);
3927         ir_node *right = get_binop_right(node);
3928
3929         return gen_binop(node, left, right, new_bd_ia32_Mul,
3930                          match_commutative | match_am | match_mode_neutral);
3931 }
3932
3933 /**
3934  * Transforms a l_IMulS into a "real" IMul1OPS node.
3935  *
3936  * @return the created ia32 IMul1OP node
3937  */
3938 static ir_node *gen_ia32_l_IMul(ir_node *node)
3939 {
3940         ir_node  *left  = get_binop_left(node);
3941         ir_node  *right = get_binop_right(node);
3942
3943         return gen_binop(node, left, right, new_bd_ia32_IMul1OP,
3944                          match_commutative | match_am | match_mode_neutral);
3945 }
3946
3947 static ir_node *gen_ia32_l_Sub(ir_node *node)
3948 {
3949         ir_node *left    = get_irn_n(node, n_ia32_l_Sub_minuend);
3950         ir_node *right   = get_irn_n(node, n_ia32_l_Sub_subtrahend);
3951         ir_node *lowered = gen_binop(node, left, right, new_bd_ia32_Sub,
3952                         match_am | match_immediate | match_mode_neutral);
3953
3954         if (is_Proj(lowered)) {
3955                 lowered = get_Proj_pred(lowered);
3956         } else {
3957                 assert(is_ia32_Sub(lowered));
3958                 set_irn_mode(lowered, mode_T);
3959         }
3960
3961         return lowered;
3962 }
3963
3964 static ir_node *gen_ia32_l_Sbb(ir_node *node)
3965 {
3966         return gen_binop_flags(node, new_bd_ia32_Sbb,
3967                         match_am | match_immediate | match_mode_neutral);
3968 }
3969
3970 /**
3971  * Transforms a l_ShlD/l_ShrD into a ShlD/ShrD. Those nodes have 3 data inputs:
3972  * op1 - target to be shifted
3973  * op2 - contains bits to be shifted into target
3974  * op3 - shift count
3975  * Only op3 can be an immediate.
3976  */
3977 static ir_node *gen_lowered_64bit_shifts(ir_node *node, ir_node *high,
3978                                          ir_node *low, ir_node *count)
3979 {
3980         ir_node  *block     = get_nodes_block(node);
3981         ir_node  *new_block = be_transform_node(block);
3982         dbg_info *dbgi      = get_irn_dbg_info(node);
3983         ir_node  *new_high  = be_transform_node(high);
3984         ir_node  *new_low   = be_transform_node(low);
3985         ir_node  *new_count;
3986         ir_node  *new_node;
3987
3988         /* the shift amount can be any mode that is bigger than 5 bits, since all
3989          * other bits are ignored anyway */
3990         while (is_Conv(count)              &&
3991                get_irn_n_edges(count) == 1 &&
3992                mode_is_int(get_irn_mode(count))) {
3993                 assert(get_mode_size_bits(get_irn_mode(count)) >= 5);
3994                 count = get_Conv_op(count);
3995         }
3996         new_count = create_immediate_or_transform(count, 0);
3997
3998         if (is_ia32_l_ShlD(node)) {
3999                 new_node = new_bd_ia32_ShlD(dbgi, new_block, new_high, new_low,
4000                                             new_count);
4001         } else {
4002                 new_node = new_bd_ia32_ShrD(dbgi, new_block, new_high, new_low,
4003                                             new_count);
4004         }
4005         SET_IA32_ORIG_NODE(new_node, node);
4006
4007         return new_node;
4008 }
4009
4010 static ir_node *gen_ia32_l_ShlD(ir_node *node)
4011 {
4012         ir_node *high  = get_irn_n(node, n_ia32_l_ShlD_val_high);
4013         ir_node *low   = get_irn_n(node, n_ia32_l_ShlD_val_low);
4014         ir_node *count = get_irn_n(node, n_ia32_l_ShlD_count);
4015         return gen_lowered_64bit_shifts(node, high, low, count);
4016 }
4017
4018 static ir_node *gen_ia32_l_ShrD(ir_node *node)
4019 {
4020         ir_node *high  = get_irn_n(node, n_ia32_l_ShrD_val_high);
4021         ir_node *low   = get_irn_n(node, n_ia32_l_ShrD_val_low);
4022         ir_node *count = get_irn_n(node, n_ia32_l_ShrD_count);
4023         return gen_lowered_64bit_shifts(node, high, low, count);
4024 }
4025
4026 static ir_node *gen_ia32_l_LLtoFloat(ir_node *node)
4027 {
4028         ir_node  *src_block    = get_nodes_block(node);
4029         ir_node  *block        = be_transform_node(src_block);
4030         ir_graph *irg          = current_ir_graph;
4031         dbg_info *dbgi         = get_irn_dbg_info(node);
4032         ir_node  *frame        = get_irg_frame(irg);
4033         ir_node  *val_low      = get_irn_n(node, n_ia32_l_LLtoFloat_val_low);
4034         ir_node  *val_high     = get_irn_n(node, n_ia32_l_LLtoFloat_val_high);
4035         ir_node  *new_val_low  = be_transform_node(val_low);
4036         ir_node  *new_val_high = be_transform_node(val_high);
4037         ir_node  *in[2];
4038         ir_node  *sync, *fild, *res;
4039         ir_node  *store_low, *store_high;
4040
4041         if (ia32_cg_config.use_sse2) {
4042                 panic("ia32_l_LLtoFloat not implemented for SSE2");
4043         }
4044
4045         /* do a store */
4046         store_low = new_bd_ia32_Store(dbgi, block, frame, noreg_GP, nomem,
4047                                       new_val_low);
4048         store_high = new_bd_ia32_Store(dbgi, block, frame, noreg_GP, nomem,
4049                                        new_val_high);
4050         SET_IA32_ORIG_NODE(store_low,  node);
4051         SET_IA32_ORIG_NODE(store_high, node);
4052
4053         set_ia32_use_frame(store_low);
4054         set_ia32_use_frame(store_high);
4055         set_ia32_op_type(store_low, ia32_AddrModeD);
4056         set_ia32_op_type(store_high, ia32_AddrModeD);
4057         set_ia32_ls_mode(store_low, mode_Iu);
4058         set_ia32_ls_mode(store_high, mode_Is);
4059         add_ia32_am_offs_int(store_high, 4);
4060
4061         in[0] = store_low;
4062         in[1] = store_high;
4063         sync  = new_rd_Sync(dbgi, block, 2, in);
4064
4065         /* do a fild */
4066         fild = new_bd_ia32_vfild(dbgi, block, frame, noreg_GP, sync);
4067
4068         set_ia32_use_frame(fild);
4069         set_ia32_op_type(fild, ia32_AddrModeS);
4070         set_ia32_ls_mode(fild, mode_Ls);
4071
4072         SET_IA32_ORIG_NODE(fild, node);
4073
4074         res = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
4075
4076         if (! mode_is_signed(get_irn_mode(val_high))) {
4077                 ia32_address_mode_t  am;
4078
4079                 ir_node *count = ia32_create_Immediate(NULL, 0, 31);
4080                 ir_node *fadd;
4081
4082                 am.addr.base          = noreg_GP;
4083                 am.addr.index         = new_bd_ia32_Shr(dbgi, block, new_val_high, count);
4084                 am.addr.mem           = nomem;
4085                 am.addr.offset        = 0;
4086                 am.addr.scale         = 2;
4087                 am.addr.symconst_ent  = ia32_gen_fp_known_const(ia32_ULLBIAS);
4088                 am.addr.use_frame     = 0;
4089                 am.addr.frame_entity  = NULL;
4090                 am.addr.symconst_sign = 0;
4091                 am.ls_mode            = mode_F;
4092                 am.mem_proj           = nomem;
4093                 am.op_type            = ia32_AddrModeS;
4094                 am.new_op1            = res;
4095                 am.new_op2            = ia32_new_NoReg_vfp(env_cg);
4096                 am.pinned             = op_pin_state_floats;
4097                 am.commutative        = 1;
4098                 am.ins_permuted       = 0;
4099
4100                 fadd  = new_bd_ia32_vfadd(dbgi, block, am.addr.base, am.addr.index, am.addr.mem,
4101                         am.new_op1, am.new_op2, get_fpcw());
4102                 set_am_attributes(fadd, &am);
4103
4104                 set_irn_mode(fadd, mode_T);
4105                 res = new_rd_Proj(NULL, block, fadd, mode_vfp, pn_ia32_res);
4106         }
4107         return res;
4108 }
4109
4110 static ir_node *gen_ia32_l_FloattoLL(ir_node *node)
4111 {
4112         ir_node  *src_block  = get_nodes_block(node);
4113         ir_node  *block      = be_transform_node(src_block);
4114         ir_graph *irg        = get_Block_irg(block);
4115         dbg_info *dbgi       = get_irn_dbg_info(node);
4116         ir_node  *frame      = get_irg_frame(irg);
4117         ir_node  *val        = get_irn_n(node, n_ia32_l_FloattoLL_val);
4118         ir_node  *new_val    = be_transform_node(val);
4119         ir_node  *fist, *mem;
4120
4121         mem = gen_vfist(dbgi, block, frame, noreg_GP, nomem, new_val, &fist);
4122         SET_IA32_ORIG_NODE(fist, node);
4123         set_ia32_use_frame(fist);
4124         set_ia32_op_type(fist, ia32_AddrModeD);
4125         set_ia32_ls_mode(fist, mode_Ls);
4126
4127         return mem;
4128 }
4129
4130 /**
4131  * the BAD transformer.
4132  */
4133 static ir_node *bad_transform(ir_node *node)
4134 {
4135         panic("No transform function for %+F available.", node);
4136         return NULL;
4137 }
4138
4139 static ir_node *gen_Proj_l_FloattoLL(ir_node *node)
4140 {
4141         ir_node  *block    = be_transform_node(get_nodes_block(node));
4142         ir_graph *irg      = get_Block_irg(block);
4143         ir_node  *pred     = get_Proj_pred(node);
4144         ir_node  *new_pred = be_transform_node(pred);
4145         ir_node  *frame    = get_irg_frame(irg);
4146         dbg_info *dbgi     = get_irn_dbg_info(node);
4147         long      pn       = get_Proj_proj(node);
4148         ir_node  *load;
4149         ir_node  *proj;
4150         ia32_attr_t *attr;
4151
4152         load = new_bd_ia32_Load(dbgi, block, frame, noreg_GP, new_pred);
4153         SET_IA32_ORIG_NODE(load, node);
4154         set_ia32_use_frame(load);
4155         set_ia32_op_type(load, ia32_AddrModeS);
4156         set_ia32_ls_mode(load, mode_Iu);
4157         /* we need a 64bit stackslot (fist stores 64bit) even though we only load
4158          * 32 bit from it with this particular load */
4159         attr = get_ia32_attr(load);
4160         attr->data.need_64bit_stackent = 1;
4161
4162         if (pn == pn_ia32_l_FloattoLL_res_high) {
4163                 add_ia32_am_offs_int(load, 4);
4164         } else {
4165                 assert(pn == pn_ia32_l_FloattoLL_res_low);
4166         }
4167
4168         proj = new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4169
4170         return proj;
4171 }
4172
4173 /**
4174  * Transform the Projs of an AddSP.
4175  */
4176 static ir_node *gen_Proj_be_AddSP(ir_node *node)
4177 {
4178         ir_node  *block    = be_transform_node(get_nodes_block(node));
4179         ir_node  *pred     = get_Proj_pred(node);
4180         ir_node  *new_pred = be_transform_node(pred);
4181         dbg_info *dbgi     = get_irn_dbg_info(node);
4182         long     proj      = get_Proj_proj(node);
4183
4184         if (proj == pn_be_AddSP_sp) {
4185                 ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4186                                            pn_ia32_SubSP_stack);
4187                 arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
4188                 return res;
4189         } else if (proj == pn_be_AddSP_res) {
4190                 return new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4191                                    pn_ia32_SubSP_addr);
4192         } else if (proj == pn_be_AddSP_M) {
4193                 return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_SubSP_M);
4194         }
4195
4196         panic("No idea how to transform proj->AddSP");
4197 }
4198
4199 /**
4200  * Transform the Projs of a SubSP.
4201  */
4202 static ir_node *gen_Proj_be_SubSP(ir_node *node)
4203 {
4204         ir_node  *block    = be_transform_node(get_nodes_block(node));
4205         ir_node  *pred     = get_Proj_pred(node);
4206         ir_node  *new_pred = be_transform_node(pred);
4207         dbg_info *dbgi     = get_irn_dbg_info(node);
4208         long     proj      = get_Proj_proj(node);
4209
4210         if (proj == pn_be_SubSP_sp) {
4211                 ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4212                                            pn_ia32_AddSP_stack);
4213                 arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
4214                 return res;
4215         } else if (proj == pn_be_SubSP_M) {
4216                 return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_AddSP_M);
4217         }
4218
4219         panic("No idea how to transform proj->SubSP");
4220 }
4221
4222 /**
4223  * Transform and renumber the Projs from a Load.
4224  */
4225 static ir_node *gen_Proj_Load(ir_node *node)
4226 {
4227         ir_node  *new_pred;
4228         ir_node  *block    = be_transform_node(get_nodes_block(node));
4229         ir_node  *pred     = get_Proj_pred(node);
4230         dbg_info *dbgi     = get_irn_dbg_info(node);
4231         long     proj      = get_Proj_proj(node);
4232
4233         /* loads might be part of source address mode matches, so we don't
4234          * transform the ProjMs yet (with the exception of loads whose result is
4235          * not used)
4236          */
4237         if (is_Load(pred) && proj == pn_Load_M && get_irn_n_edges(pred) > 1) {
4238                 ir_node *res;
4239                 ir_node *old_block = get_nodes_block(node);
4240
4241                 /* this is needed, because sometimes we have loops that are only
4242                    reachable through the ProjM */
4243                 be_enqueue_preds(node);
4244                 /* do it in 2 steps, to silence firm verifier */
4245                 res = new_rd_Proj(dbgi, old_block, pred, mode_M, pn_Load_M);
4246                 set_Proj_proj(res, pn_ia32_mem);
4247                 return res;
4248         }
4249
4250         /* renumber the proj */
4251         new_pred = be_transform_node(pred);
4252         if (is_ia32_Load(new_pred)) {
4253                 switch (proj) {
4254                 case pn_Load_res:
4255                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Load_res);
4256                 case pn_Load_M:
4257                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Load_M);
4258                 case pn_Load_X_regular:
4259                         return new_rd_Jmp(dbgi, block);
4260                 case pn_Load_X_except:
4261                         /* This Load might raise an exception. Mark it. */
4262                         set_ia32_exc_label(new_pred, 1);
4263                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Load_X_exc);
4264                 default:
4265                         break;
4266                 }
4267         } else if (is_ia32_Conv_I2I(new_pred) ||
4268                    is_ia32_Conv_I2I8Bit(new_pred)) {
4269                 set_irn_mode(new_pred, mode_T);
4270                 if (proj == pn_Load_res) {
4271                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_res);
4272                 } else if (proj == pn_Load_M) {
4273                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_mem);
4274                 }
4275         } else if (is_ia32_xLoad(new_pred)) {
4276                 switch (proj) {
4277                 case pn_Load_res:
4278                         return new_rd_Proj(dbgi, block, new_pred, mode_xmm, pn_ia32_xLoad_res);
4279                 case pn_Load_M:
4280                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_xLoad_M);
4281                 case pn_Load_X_regular:
4282                         return new_rd_Jmp(dbgi, block);
4283                 case pn_Load_X_except:
4284                         /* This Load might raise an exception. Mark it. */
4285                         set_ia32_exc_label(new_pred, 1);
4286                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_xLoad_X_exc);
4287                 default:
4288                         break;
4289                 }
4290         } else if (is_ia32_vfld(new_pred)) {
4291                 switch (proj) {
4292                 case pn_Load_res:
4293                         return new_rd_Proj(dbgi, block, new_pred, mode_vfp, pn_ia32_vfld_res);
4294                 case pn_Load_M:
4295                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_vfld_M);
4296                 case pn_Load_X_regular:
4297                         return new_rd_Jmp(dbgi, block);
4298                 case pn_Load_X_except:
4299                         /* This Load might raise an exception. Mark it. */
4300                         set_ia32_exc_label(new_pred, 1);
4301                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_vfld_X_exc);
4302                 default:
4303                         break;
4304                 }
4305         } else {
4306                 /* can happen for ProJMs when source address mode happened for the
4307                    node */
4308
4309                 /* however it should not be the result proj, as that would mean the
4310                    load had multiple users and should not have been used for
4311                    SourceAM */
4312                 if (proj != pn_Load_M) {
4313                         panic("internal error: transformed node not a Load");
4314                 }
4315                 return new_rd_Proj(dbgi, block, new_pred, mode_M, 1);
4316         }
4317
4318         panic("No idea how to transform proj");
4319 }
4320
4321 /**
4322  * Transform and renumber the Projs from a DivMod like instruction.
4323  */
4324 static ir_node *gen_Proj_DivMod(ir_node *node)
4325 {
4326         ir_node  *block    = be_transform_node(get_nodes_block(node));
4327         ir_node  *pred     = get_Proj_pred(node);
4328         ir_node  *new_pred = be_transform_node(pred);
4329         dbg_info *dbgi     = get_irn_dbg_info(node);
4330         long     proj      = get_Proj_proj(node);
4331
4332         assert(is_ia32_Div(new_pred) || is_ia32_IDiv(new_pred));
4333
4334         switch (get_irn_opcode(pred)) {
4335         case iro_Div:
4336                 switch (proj) {
4337                 case pn_Div_M:
4338                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4339                 case pn_Div_res:
4340                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_div_res);
4341                 case pn_Div_X_regular:
4342                         return new_rd_Jmp(dbgi, block);
4343                 case pn_Div_X_except:
4344                         set_ia32_exc_label(new_pred, 1);
4345                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4346                 default:
4347                         break;
4348                 }
4349                 break;
4350         case iro_Mod:
4351                 switch (proj) {
4352                 case pn_Mod_M:
4353                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4354                 case pn_Mod_res:
4355                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_mod_res);
4356                 case pn_Mod_X_except:
4357                         set_ia32_exc_label(new_pred, 1);
4358                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4359                 default:
4360                         break;
4361                 }
4362                 break;
4363         case iro_DivMod:
4364                 switch (proj) {
4365                 case pn_DivMod_M:
4366                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4367                 case pn_DivMod_res_div:
4368                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_div_res);
4369                 case pn_DivMod_res_mod:
4370                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_mod_res);
4371                 case pn_DivMod_X_regular:
4372                         return new_rd_Jmp(dbgi, block);
4373                 case pn_DivMod_X_except:
4374                         set_ia32_exc_label(new_pred, 1);
4375                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4376                 default:
4377                         break;
4378                 }
4379                 break;
4380         default:
4381                 break;
4382         }
4383
4384         panic("No idea how to transform proj->DivMod");
4385 }
4386
4387 /**
4388  * Transform and renumber the Projs from a CopyB.
4389  */
4390 static ir_node *gen_Proj_CopyB(ir_node *node)
4391 {
4392         ir_node  *block    = be_transform_node(get_nodes_block(node));
4393         ir_node  *pred     = get_Proj_pred(node);
4394         ir_node  *new_pred = be_transform_node(pred);
4395         dbg_info *dbgi     = get_irn_dbg_info(node);
4396         long     proj      = get_Proj_proj(node);
4397
4398         switch (proj) {
4399         case pn_CopyB_M_regular:
4400                 if (is_ia32_CopyB_i(new_pred)) {
4401                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_CopyB_i_M);
4402                 } else if (is_ia32_CopyB(new_pred)) {
4403                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_CopyB_M);
4404                 }
4405                 break;
4406         default:
4407                 break;
4408         }
4409
4410         panic("No idea how to transform proj->CopyB");
4411 }
4412
4413 /**
4414  * Transform and renumber the Projs from a Quot.
4415  */
4416 static ir_node *gen_Proj_Quot(ir_node *node)
4417 {
4418         ir_node  *block    = be_transform_node(get_nodes_block(node));
4419         ir_node  *pred     = get_Proj_pred(node);
4420         ir_node  *new_pred = be_transform_node(pred);
4421         dbg_info *dbgi     = get_irn_dbg_info(node);
4422         long     proj      = get_Proj_proj(node);
4423
4424         switch (proj) {
4425         case pn_Quot_M:
4426                 if (is_ia32_xDiv(new_pred)) {
4427                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_xDiv_M);
4428                 } else if (is_ia32_vfdiv(new_pred)) {
4429                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_vfdiv_M);
4430                 }
4431                 break;
4432         case pn_Quot_res:
4433                 if (is_ia32_xDiv(new_pred)) {
4434                         return new_rd_Proj(dbgi, block, new_pred, mode_xmm, pn_ia32_xDiv_res);
4435                 } else if (is_ia32_vfdiv(new_pred)) {
4436                         return new_rd_Proj(dbgi, block, new_pred, mode_vfp, pn_ia32_vfdiv_res);
4437                 }
4438                 break;
4439         case pn_Quot_X_regular:
4440         case pn_Quot_X_except:
4441         default:
4442                 break;
4443         }
4444
4445         panic("No idea how to transform proj->Quot");
4446 }
4447
4448 static ir_node *gen_be_Call(ir_node *node)
4449 {
4450         dbg_info       *const dbgi      = get_irn_dbg_info(node);
4451         ir_node        *const src_block = get_nodes_block(node);
4452         ir_node        *const block     = be_transform_node(src_block);
4453         ir_node        *const src_mem   = get_irn_n(node, be_pos_Call_mem);
4454         ir_node        *const src_sp    = get_irn_n(node, be_pos_Call_sp);
4455         ir_node        *const sp        = be_transform_node(src_sp);
4456         ir_node        *const src_ptr   = get_irn_n(node, be_pos_Call_ptr);
4457         ia32_address_mode_t   am;
4458         ia32_address_t *const addr      = &am.addr;
4459         ir_node        *      mem;
4460         ir_node        *      call;
4461         int                   i;
4462         ir_node        *      fpcw;
4463         ir_node        *      eax       = noreg_GP;
4464         ir_node        *      ecx       = noreg_GP;
4465         ir_node        *      edx       = noreg_GP;
4466         unsigned        const pop       = be_Call_get_pop(node);
4467         ir_type        *const call_tp   = be_Call_get_type(node);
4468         int                   old_no_pic_adjust;
4469
4470         /* Run the x87 simulator if the call returns a float value */
4471         if (get_method_n_ress(call_tp) > 0) {
4472                 ir_type *const res_type = get_method_res_type(call_tp, 0);
4473                 ir_mode *const res_mode = get_type_mode(res_type);
4474
4475                 if (res_mode != NULL && mode_is_float(res_mode)) {
4476                         env_cg->do_x87_sim = 1;
4477                 }
4478         }
4479
4480         /* We do not want be_Call direct calls */
4481         assert(be_Call_get_entity(node) == NULL);
4482
4483         /* special case for PIC trampoline calls */
4484         old_no_pic_adjust = no_pic_adjust;
4485         no_pic_adjust     = env_cg->birg->main_env->options->pic;
4486
4487         match_arguments(&am, src_block, NULL, src_ptr, src_mem,
4488                         match_am | match_immediate);
4489
4490         no_pic_adjust = old_no_pic_adjust;
4491
4492         i    = get_irn_arity(node) - 1;
4493         fpcw = be_transform_node(get_irn_n(node, i--));
4494         for (; i >= be_pos_Call_first_arg; --i) {
4495                 arch_register_req_t const *const req = arch_get_register_req(node, i);
4496                 ir_node *const reg_parm = be_transform_node(get_irn_n(node, i));
4497
4498                 assert(req->type == arch_register_req_type_limited);
4499                 assert(req->cls == &ia32_reg_classes[CLASS_ia32_gp]);
4500
4501                 switch (*req->limited) {
4502                         case 1 << REG_EAX: assert(eax == noreg_GP); eax = reg_parm; break;
4503                         case 1 << REG_ECX: assert(ecx == noreg_GP); ecx = reg_parm; break;
4504                         case 1 << REG_EDX: assert(edx == noreg_GP); edx = reg_parm; break;
4505                         default: panic("Invalid GP register for register parameter");
4506                 }
4507         }
4508
4509         mem  = transform_AM_mem(block, src_ptr, src_mem, addr->mem);
4510         call = new_bd_ia32_Call(dbgi, block, addr->base, addr->index, mem,
4511                                 am.new_op2, sp, fpcw, eax, ecx, edx, pop, call_tp);
4512         set_am_attributes(call, &am);
4513         call = fix_mem_proj(call, &am);
4514
4515         if (get_irn_pinned(node) == op_pin_state_pinned)
4516                 set_irn_pinned(call, op_pin_state_pinned);
4517
4518         SET_IA32_ORIG_NODE(call, node);
4519
4520         if (ia32_cg_config.use_sse2) {
4521                 /* remember this call for post-processing */
4522                 ARR_APP1(ir_node *, call_list, call);
4523                 ARR_APP1(ir_type *, call_types, be_Call_get_type(node));
4524         }
4525
4526         return call;
4527 }
4528
4529 /**
4530  * Transform Builtin trap
4531  */
4532 static ir_node *gen_trap(ir_node *node) {
4533         dbg_info *dbgi  = get_irn_dbg_info(node);
4534         ir_node *block  = be_transform_node(get_nodes_block(node));
4535         ir_node *mem    = be_transform_node(get_Builtin_mem(node));
4536
4537         return new_bd_ia32_UD2(dbgi, block, mem);
4538 }
4539
4540 /**
4541  * Transform Builtin debugbreak
4542  */
4543 static ir_node *gen_debugbreak(ir_node *node) {
4544         dbg_info *dbgi  = get_irn_dbg_info(node);
4545         ir_node *block  = be_transform_node(get_nodes_block(node));
4546         ir_node *mem    = be_transform_node(get_Builtin_mem(node));
4547
4548         return new_bd_ia32_Breakpoint(dbgi, block, mem);
4549 }
4550
4551 /**
4552  * Transform Builtin return_address
4553  */
4554 static ir_node *gen_return_address(ir_node *node) {
4555         ir_node *param      = get_Builtin_param(node, 0);
4556         ir_node *frame      = get_Builtin_param(node, 1);
4557         dbg_info *dbgi      = get_irn_dbg_info(node);
4558         tarval  *tv         = get_Const_tarval(param);
4559         unsigned long value = get_tarval_long(tv);
4560
4561         ir_node *block  = be_transform_node(get_nodes_block(node));
4562         ir_node *ptr    = be_transform_node(frame);
4563         ir_node *load;
4564
4565         if (value > 0) {
4566                 ir_node *cnt = new_bd_ia32_ProduceVal(dbgi, block);
4567                 ir_node *res = new_bd_ia32_ProduceVal(dbgi, block);
4568                 ptr = new_bd_ia32_ClimbFrame(dbgi, block, ptr, cnt, res, value);
4569         }
4570
4571         /* load the return address from this frame */
4572         load = new_bd_ia32_Load(dbgi, block, ptr, noreg_GP, nomem);
4573
4574         set_irn_pinned(load, get_irn_pinned(node));
4575         set_ia32_op_type(load, ia32_AddrModeS);
4576         set_ia32_ls_mode(load, mode_Iu);
4577
4578         set_ia32_am_offs_int(load, 0);
4579         set_ia32_use_frame(load);
4580         set_ia32_frame_ent(load, ia32_get_return_address_entity());
4581
4582         if (get_irn_pinned(node) == op_pin_state_floats) {
4583                 assert(pn_ia32_xLoad_res == pn_ia32_vfld_res
4584                                 && pn_ia32_vfld_res == pn_ia32_Load_res
4585                                 && pn_ia32_Load_res == pn_ia32_res);
4586                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
4587         }
4588
4589         SET_IA32_ORIG_NODE(load, node);
4590         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4591 }
4592
4593 /**
4594  * Transform Builtin frame_address
4595  */
4596 static ir_node *gen_frame_address(ir_node *node) {
4597         ir_node *param      = get_Builtin_param(node, 0);
4598         ir_node *frame      = get_Builtin_param(node, 1);
4599         dbg_info *dbgi      = get_irn_dbg_info(node);
4600         tarval  *tv         = get_Const_tarval(param);
4601         unsigned long value = get_tarval_long(tv);
4602
4603         ir_node *block  = be_transform_node(get_nodes_block(node));
4604         ir_node *ptr    = be_transform_node(frame);
4605         ir_node *load;
4606         ir_entity *ent;
4607
4608         if (value > 0) {
4609                 ir_node *cnt = new_bd_ia32_ProduceVal(dbgi, block);
4610                 ir_node *res = new_bd_ia32_ProduceVal(dbgi, block);
4611                 ptr = new_bd_ia32_ClimbFrame(dbgi, block, ptr, cnt, res, value);
4612         }
4613
4614         /* load the frame address from this frame */
4615         load = new_bd_ia32_Load(dbgi, block, ptr, noreg_GP, nomem);
4616
4617         set_irn_pinned(load, get_irn_pinned(node));
4618         set_ia32_op_type(load, ia32_AddrModeS);
4619         set_ia32_ls_mode(load, mode_Iu);
4620
4621         ent = ia32_get_frame_address_entity();
4622         if (ent != NULL) {
4623                 set_ia32_am_offs_int(load, 0);
4624                 set_ia32_use_frame(load);
4625                 set_ia32_frame_ent(load, ent);
4626         } else {
4627                 /* will fail anyway, but gcc does this: */
4628                 set_ia32_am_offs_int(load, 0);
4629         }
4630
4631         if (get_irn_pinned(node) == op_pin_state_floats) {
4632                 assert(pn_ia32_xLoad_res == pn_ia32_vfld_res
4633                                 && pn_ia32_vfld_res == pn_ia32_Load_res
4634                                 && pn_ia32_Load_res == pn_ia32_res);
4635                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
4636         }
4637
4638         SET_IA32_ORIG_NODE(load, node);
4639         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4640 }
4641
4642 /**
4643  * Transform Builtin frame_address
4644  */
4645 static ir_node *gen_prefetch(ir_node *node) {
4646         dbg_info       *dbgi;
4647         ir_node        *ptr, *block, *mem, *base, *index;
4648         ir_node        *param,  *new_node;
4649         long           rw, locality;
4650         tarval         *tv;
4651         ia32_address_t addr;
4652
4653         if (!ia32_cg_config.use_sse_prefetch && !ia32_cg_config.use_3dnow_prefetch) {
4654                 /* no prefetch at all, route memory */
4655                 return be_transform_node(get_Builtin_mem(node));
4656         }
4657
4658         param = get_Builtin_param(node, 1);
4659         tv    = get_Const_tarval(param);
4660         rw    = get_tarval_long(tv);
4661
4662         /* construct load address */
4663         memset(&addr, 0, sizeof(addr));
4664         ptr = get_Builtin_param(node, 0);
4665         ia32_create_address_mode(&addr, ptr, 0);
4666         base  = addr.base;
4667         index = addr.index;
4668
4669         if (base == NULL) {
4670                 base = noreg_GP;
4671         } else {
4672                 base = be_transform_node(base);
4673         }
4674
4675         if (index == NULL) {
4676                 index = noreg_GP;
4677         } else {
4678                 index = be_transform_node(index);
4679         }
4680
4681         dbgi     = get_irn_dbg_info(node);
4682         block    = be_transform_node(get_nodes_block(node));
4683         mem      = be_transform_node(get_Builtin_mem(node));
4684
4685         if (rw == 1 && ia32_cg_config.use_3dnow_prefetch) {
4686                 /* we have 3DNow!, this was already checked above */
4687                 new_node = new_bd_ia32_PrefetchW(dbgi, block, base, index, mem);
4688         } else if (ia32_cg_config.use_sse_prefetch) {
4689                 /* note: rw == 1 is IGNORED in that case */
4690                 param    = get_Builtin_param(node, 2);
4691                 tv       = get_Const_tarval(param);
4692                 locality = get_tarval_long(tv);
4693
4694                 /* SSE style prefetch */
4695                 switch (locality) {
4696                 case 0:
4697                         new_node = new_bd_ia32_PrefetchNTA(dbgi, block, base, index, mem);
4698                         break;
4699                 case 1:
4700                         new_node = new_bd_ia32_Prefetch2(dbgi, block, base, index, mem);
4701                         break;
4702                 case 2:
4703                         new_node = new_bd_ia32_Prefetch1(dbgi, block, base, index, mem);
4704                         break;
4705                 default:
4706                         new_node = new_bd_ia32_Prefetch0(dbgi, block, base, index, mem);
4707                         break;
4708                 }
4709         } else {
4710                 assert(ia32_cg_config.use_3dnow_prefetch);
4711                 /* 3DNow! style prefetch */
4712                 new_node = new_bd_ia32_Prefetch(dbgi, block, base, index, mem);
4713         }
4714
4715         set_irn_pinned(new_node, get_irn_pinned(node));
4716         set_ia32_op_type(new_node, ia32_AddrModeS);
4717         set_ia32_ls_mode(new_node, mode_Bu);
4718         set_address(new_node, &addr);
4719
4720         SET_IA32_ORIG_NODE(new_node, node);
4721
4722         be_dep_on_frame(new_node);
4723         return new_r_Proj(block, new_node, mode_M, pn_ia32_Prefetch_M);
4724 }
4725
4726 /**
4727  * Transform bsf like node
4728  */
4729 static ir_node *gen_unop_AM(ir_node *node, construct_binop_dest_func *func)
4730 {
4731         ir_node *param     = get_Builtin_param(node, 0);
4732         dbg_info *dbgi     = get_irn_dbg_info(node);
4733
4734         ir_node *block     = get_nodes_block(node);
4735         ir_node *new_block = be_transform_node(block);
4736
4737         ia32_address_mode_t  am;
4738         ia32_address_t      *addr = &am.addr;
4739         ir_node             *cnt;
4740
4741         match_arguments(&am, block, NULL, param, NULL, match_am);
4742
4743         cnt = func(dbgi, new_block, addr->base, addr->index, addr->mem, am.new_op2);
4744         set_am_attributes(cnt, &am);
4745         set_ia32_ls_mode(cnt, get_irn_mode(param));
4746
4747         SET_IA32_ORIG_NODE(cnt, node);
4748         return fix_mem_proj(cnt, &am);
4749 }
4750
4751 /**
4752  * Transform builtin ffs.
4753  */
4754 static ir_node *gen_ffs(ir_node *node)
4755 {
4756         ir_node  *bsf   = gen_unop_AM(node, new_bd_ia32_Bsf);
4757         ir_node  *real  = skip_Proj(bsf);
4758         dbg_info *dbgi  = get_irn_dbg_info(real);
4759         ir_node  *block = get_nodes_block(real);
4760         ir_node  *flag, *set, *conv, *neg, *or;
4761
4762         /* bsf x */
4763         if (get_irn_mode(real) != mode_T) {
4764                 set_irn_mode(real, mode_T);
4765                 bsf = new_r_Proj(block, real, mode_Iu, pn_ia32_res);
4766         }
4767
4768         flag = new_r_Proj(block, real, mode_b, pn_ia32_flags);
4769
4770         /* sete */
4771         set = new_bd_ia32_Set(dbgi, block, flag, pn_Cmp_Eq, 0);
4772         SET_IA32_ORIG_NODE(set, node);
4773
4774         /* conv to 32bit */
4775         conv = new_bd_ia32_Conv_I2I8Bit(dbgi, block, noreg_GP, noreg_GP, nomem, set, mode_Bu);
4776         SET_IA32_ORIG_NODE(conv, node);
4777
4778         /* neg */
4779         neg = new_bd_ia32_Neg(dbgi, block, conv);
4780
4781         /* or */
4782         or = new_bd_ia32_Or(dbgi, block, noreg_GP, noreg_GP, nomem, bsf, neg);
4783         set_ia32_commutative(or);
4784
4785         /* add 1 */
4786         return new_bd_ia32_Add(dbgi, block, noreg_GP, noreg_GP, nomem, or, ia32_create_Immediate(NULL, 0, 1));
4787 }
4788
4789 /**
4790  * Transform builtin clz.
4791  */
4792 static ir_node *gen_clz(ir_node *node)
4793 {
4794         ir_node  *bsr   = gen_unop_AM(node, new_bd_ia32_Bsr);
4795         ir_node  *real  = skip_Proj(bsr);
4796         dbg_info *dbgi  = get_irn_dbg_info(real);
4797         ir_node  *block = get_nodes_block(real);
4798         ir_node  *imm   = ia32_create_Immediate(NULL, 0, 31);
4799
4800         return new_bd_ia32_Xor(dbgi, block, noreg_GP, noreg_GP, nomem, bsr, imm);
4801 }
4802
4803 /**
4804  * Transform builtin ctz.
4805  */
4806 static ir_node *gen_ctz(ir_node *node)
4807 {
4808         return gen_unop_AM(node, new_bd_ia32_Bsf);
4809 }
4810
4811 /**
4812  * Transform builtin parity.
4813  */
4814 static ir_node *gen_parity(ir_node *node)
4815 {
4816         ir_node *param      = get_Builtin_param(node, 0);
4817         dbg_info *dbgi      = get_irn_dbg_info(node);
4818
4819         ir_node *block      = get_nodes_block(node);
4820
4821         ir_node *new_block  = be_transform_node(block);
4822         ir_node *imm, *cmp, *new_node;
4823
4824         ia32_address_mode_t am;
4825         ia32_address_t      *addr = &am.addr;
4826
4827
4828         /* cmp param, 0 */
4829         match_arguments(&am, block, NULL, param, NULL, match_am);
4830         imm = ia32_create_Immediate(NULL, 0, 0);
4831         cmp = new_bd_ia32_Cmp(dbgi, new_block, addr->base, addr->index,
4832                               addr->mem, imm, am.new_op2, am.ins_permuted, 0);
4833         set_am_attributes(cmp, &am);
4834         set_ia32_ls_mode(cmp, mode_Iu);
4835
4836         SET_IA32_ORIG_NODE(cmp, node);
4837
4838         cmp = fix_mem_proj(cmp, &am);
4839
4840         /* setp */
4841         new_node = new_bd_ia32_Set(dbgi, new_block, cmp, ia32_pn_Cmp_parity, 0);
4842         SET_IA32_ORIG_NODE(new_node, node);
4843
4844         /* conv to 32bit */
4845         new_node = new_bd_ia32_Conv_I2I8Bit(dbgi, new_block, noreg_GP, noreg_GP,
4846                                             nomem, new_node, mode_Bu);
4847         SET_IA32_ORIG_NODE(new_node, node);
4848         return new_node;
4849 }
4850
4851 /**
4852  * Transform builtin popcount
4853  */
4854 static ir_node *gen_popcount(ir_node *node) {
4855         ir_node *param     = get_Builtin_param(node, 0);
4856         dbg_info *dbgi     = get_irn_dbg_info(node);
4857
4858         ir_node *block     = get_nodes_block(node);
4859         ir_node *new_block = be_transform_node(block);
4860
4861         ir_node *new_param;
4862         ir_node *imm, *simm, *m1, *s1, *s2, *s3, *s4, *s5, *m2, *m3, *m4, *m5, *m6, *m7, *m8, *m9, *m10, *m11, *m12, *m13;
4863
4864         /* check for SSE4.2 or SSE4a and use the popcnt instruction */
4865         if (ia32_cg_config.use_popcnt) {
4866                 ia32_address_mode_t am;
4867                 ia32_address_t      *addr = &am.addr;
4868                 ir_node             *cnt;
4869
4870                 match_arguments(&am, block, NULL, param, NULL, match_am | match_16bit_am);
4871
4872                 cnt = new_bd_ia32_Popcnt(dbgi, new_block, addr->base, addr->index, addr->mem, am.new_op2);
4873                 set_am_attributes(cnt, &am);
4874                 set_ia32_ls_mode(cnt, get_irn_mode(param));
4875
4876                 SET_IA32_ORIG_NODE(cnt, node);
4877                 return fix_mem_proj(cnt, &am);
4878         }
4879
4880         new_param = be_transform_node(param);
4881
4882         /* do the standard popcount algo */
4883
4884         /* m1 = x & 0x55555555 */
4885         imm = ia32_create_Immediate(NULL, 0, 0x55555555);
4886         m1 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_param, imm);
4887
4888         /* s1 = x >> 1 */
4889         simm = ia32_create_Immediate(NULL, 0, 1);
4890         s1 = new_bd_ia32_Shl(dbgi, new_block, new_param, simm);
4891
4892         /* m2 = s1 & 0x55555555 */
4893         m2 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s1, imm);
4894
4895         /* m3 = m1 + m2 */
4896         m3 = new_bd_ia32_Lea(dbgi, new_block, m2, m1);
4897
4898         /* m4 = m3 & 0x33333333 */
4899         imm = ia32_create_Immediate(NULL, 0, 0x33333333);
4900         m4 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m3, imm);
4901
4902         /* s2 = m3 >> 2 */
4903         simm = ia32_create_Immediate(NULL, 0, 2);
4904         s2 = new_bd_ia32_Shl(dbgi, new_block, m3, simm);
4905
4906         /* m5 = s2 & 0x33333333 */
4907         m5 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s2, imm);
4908
4909         /* m6 = m4 + m5 */
4910         m6 = new_bd_ia32_Lea(dbgi, new_block, m4, m5);
4911
4912         /* m7 = m6 & 0x0F0F0F0F */
4913         imm = ia32_create_Immediate(NULL, 0, 0x0F0F0F0F);
4914         m7 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m6, imm);
4915
4916         /* s3 = m6 >> 4 */
4917         simm = ia32_create_Immediate(NULL, 0, 4);
4918         s3 = new_bd_ia32_Shl(dbgi, new_block, m6, simm);
4919
4920         /* m8 = s3 & 0x0F0F0F0F */
4921         m8 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s3, imm);
4922
4923         /* m9 = m7 + m8 */
4924         m9 = new_bd_ia32_Lea(dbgi, new_block, m7, m8);
4925
4926         /* m10 = m9 & 0x00FF00FF */
4927         imm = ia32_create_Immediate(NULL, 0, 0x00FF00FF);
4928         m10 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m9, imm);
4929
4930         /* s4 = m9 >> 8 */
4931         simm = ia32_create_Immediate(NULL, 0, 8);
4932         s4 = new_bd_ia32_Shl(dbgi, new_block, m9, simm);
4933
4934         /* m11 = s4 & 0x00FF00FF */
4935         m11 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s4, imm);
4936
4937         /* m12 = m10 + m11 */
4938         m12 = new_bd_ia32_Lea(dbgi, new_block, m10, m11);
4939
4940         /* m13 = m12 & 0x0000FFFF */
4941         imm = ia32_create_Immediate(NULL, 0, 0x0000FFFF);
4942         m13 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m12, imm);
4943
4944         /* s5 = m12 >> 16 */
4945         simm = ia32_create_Immediate(NULL, 0, 16);
4946         s5 = new_bd_ia32_Shl(dbgi, new_block, m12, simm);
4947
4948         /* res = m13 + s5 */
4949         return new_bd_ia32_Lea(dbgi, new_block, m13, s5);
4950 }
4951
4952 /**
4953  * Transform builtin byte swap.
4954  */
4955 static ir_node *gen_bswap(ir_node *node) {
4956         ir_node *param     = be_transform_node(get_Builtin_param(node, 0));
4957         dbg_info *dbgi     = get_irn_dbg_info(node);
4958
4959         ir_node *block     = get_nodes_block(node);
4960         ir_node *new_block = be_transform_node(block);
4961         ir_mode *mode      = get_irn_mode(param);
4962         unsigned size      = get_mode_size_bits(mode);
4963         ir_node  *m1, *m2, *m3, *m4, *s1, *s2, *s3, *s4;
4964
4965         switch (size) {
4966         case 32:
4967                 if (ia32_cg_config.use_i486) {
4968                         /* swap available */
4969                         return new_bd_ia32_Bswap(dbgi, new_block, param);
4970                 }
4971                 s1 = new_bd_ia32_Shl(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 24));
4972                 s2 = new_bd_ia32_Shl(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 8));
4973
4974                 m1 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s2, ia32_create_Immediate(NULL, 0, 0xFF00));
4975                 m2 = new_bd_ia32_Lea(dbgi, new_block, s1, m1);
4976
4977                 s3 = new_bd_ia32_Shr(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 8));
4978
4979                 m3 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s3, ia32_create_Immediate(NULL, 0, 0xFF0000));
4980                 m4 = new_bd_ia32_Lea(dbgi, new_block, m2, m3);
4981
4982                 s4 = new_bd_ia32_Shr(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 24));
4983                 return new_bd_ia32_Lea(dbgi, new_block, m4, s4);
4984
4985         case 16:
4986                 /* swap16 always available */
4987                 return new_bd_ia32_Bswap16(dbgi, new_block, param);
4988
4989         default:
4990                 panic("Invalid bswap size (%d)", size);
4991         }
4992 }
4993
4994 /**
4995  * Transform builtin outport.
4996  */
4997 static ir_node *gen_outport(ir_node *node) {
4998         ir_node *port  = create_immediate_or_transform(get_Builtin_param(node, 0), 0);
4999         ir_node *oldv  = get_Builtin_param(node, 1);
5000         ir_mode *mode  = get_irn_mode(oldv);
5001         ir_node *value = be_transform_node(oldv);
5002         ir_node *block = be_transform_node(get_nodes_block(node));
5003         ir_node *mem   = be_transform_node(get_Builtin_mem(node));
5004         dbg_info *dbgi = get_irn_dbg_info(node);
5005
5006         ir_node *res = new_bd_ia32_Outport(dbgi, block, port, value, mem);
5007         set_ia32_ls_mode(res, mode);
5008         return res;
5009 }
5010
5011 /**
5012  * Transform builtin inport.
5013  */
5014 static ir_node *gen_inport(ir_node *node) {
5015         ir_type *tp    = get_Builtin_type(node);
5016         ir_type *rstp  = get_method_res_type(tp, 0);
5017         ir_mode *mode  = get_type_mode(rstp);
5018         ir_node *port  = create_immediate_or_transform(get_Builtin_param(node, 0), 0);
5019         ir_node *block = be_transform_node(get_nodes_block(node));
5020         ir_node *mem   = be_transform_node(get_Builtin_mem(node));
5021         dbg_info *dbgi = get_irn_dbg_info(node);
5022
5023         ir_node *res = new_bd_ia32_Inport(dbgi, block, port, mem);
5024         set_ia32_ls_mode(res, mode);
5025
5026         /* check for missing Result Proj */
5027         return res;
5028 }
5029
5030 /**
5031  * Transform a builtin inner trampoline
5032  */
5033 static ir_node *gen_inner_trampoline(ir_node *node) {
5034         ir_node  *ptr       = get_Builtin_param(node, 0);
5035         ir_node  *callee    = get_Builtin_param(node, 1);
5036         ir_node  *env       = be_transform_node(get_Builtin_param(node, 2));
5037         ir_node  *mem       = get_Builtin_mem(node);
5038         ir_node  *block     = get_nodes_block(node);
5039         ir_node  *new_block = be_transform_node(block);
5040         ir_node  *val;
5041         ir_node  *store;
5042         ir_node  *rel;
5043         ir_node  *trampoline;
5044         ir_node  *in[2];
5045         dbg_info *dbgi      = get_irn_dbg_info(node);
5046         ia32_address_t addr;
5047
5048         /* construct store address */
5049         memset(&addr, 0, sizeof(addr));
5050         ia32_create_address_mode(&addr, ptr, 0);
5051
5052         if (addr.base == NULL) {
5053                 addr.base = noreg_GP;
5054         } else {
5055                 addr.base = be_transform_node(addr.base);
5056         }
5057
5058         if (addr.index == NULL) {
5059                 addr.index = noreg_GP;
5060         } else {
5061                 addr.index = be_transform_node(addr.index);
5062         }
5063         addr.mem = be_transform_node(mem);
5064
5065         /* mov  ecx, <env> */
5066         val   = ia32_create_Immediate(NULL, 0, 0xB9);
5067         store = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
5068                                       addr.index, addr.mem, val);
5069         set_irn_pinned(store, get_irn_pinned(node));
5070         set_ia32_op_type(store, ia32_AddrModeD);
5071         set_ia32_ls_mode(store, mode_Bu);
5072         set_address(store, &addr);
5073         addr.mem = store;
5074         addr.offset += 1;
5075
5076         store = new_bd_ia32_Store(dbgi, new_block, addr.base,
5077                                   addr.index, addr.mem, env);
5078         set_irn_pinned(store, get_irn_pinned(node));
5079         set_ia32_op_type(store, ia32_AddrModeD);
5080         set_ia32_ls_mode(store, mode_Iu);
5081         set_address(store, &addr);
5082         addr.mem = store;
5083         addr.offset += 4;
5084
5085         /* jmp rel <callee> */
5086         val   = ia32_create_Immediate(NULL, 0, 0xE9);
5087         store = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
5088                                      addr.index, addr.mem, val);
5089         set_irn_pinned(store, get_irn_pinned(node));
5090         set_ia32_op_type(store, ia32_AddrModeD);
5091         set_ia32_ls_mode(store, mode_Bu);
5092         set_address(store, &addr);
5093         addr.mem = store;
5094         addr.offset += 1;
5095
5096         trampoline = be_transform_node(ptr);
5097
5098         /* the callee is typically an immediate */
5099         if (is_SymConst(callee)) {
5100                 rel = new_bd_ia32_Const(dbgi, new_block, get_SymConst_entity(callee), 0, 0, -10);
5101         } else {
5102                 rel = new_bd_ia32_Lea(dbgi, new_block, be_transform_node(callee), ia32_create_Immediate(NULL, 0, -10));
5103         }
5104         rel = new_bd_ia32_Sub(dbgi, new_block, noreg_GP, noreg_GP, nomem, rel, trampoline);
5105
5106         store = new_bd_ia32_Store(dbgi, new_block, addr.base,
5107                                   addr.index, addr.mem, rel);
5108         set_irn_pinned(store, get_irn_pinned(node));
5109         set_ia32_op_type(store, ia32_AddrModeD);
5110         set_ia32_ls_mode(store, mode_Iu);
5111         set_address(store, &addr);
5112
5113         in[0] = store;
5114         in[1] = trampoline;
5115
5116         return new_r_Tuple(new_block, 2, in);
5117 }
5118
5119 /**
5120  * Transform Builtin node.
5121  */
5122 static ir_node *gen_Builtin(ir_node *node) {
5123         ir_builtin_kind kind = get_Builtin_kind(node);
5124
5125         switch (kind) {
5126         case ir_bk_trap:
5127                 return gen_trap(node);
5128         case ir_bk_debugbreak:
5129                 return gen_debugbreak(node);
5130         case ir_bk_return_address:
5131                 return gen_return_address(node);
5132         case ir_bk_frame_address:
5133                 return gen_frame_address(node);
5134         case ir_bk_prefetch:
5135                 return gen_prefetch(node);
5136         case ir_bk_ffs:
5137                 return gen_ffs(node);
5138         case ir_bk_clz:
5139                 return gen_clz(node);
5140         case ir_bk_ctz:
5141                 return gen_ctz(node);
5142         case ir_bk_parity:
5143                 return gen_parity(node);
5144         case ir_bk_popcount:
5145                 return gen_popcount(node);
5146         case ir_bk_bswap:
5147                 return gen_bswap(node);
5148         case ir_bk_outport:
5149                 return gen_outport(node);
5150         case ir_bk_inport:
5151                 return gen_inport(node);
5152         case ir_bk_inner_trampoline:
5153                 return gen_inner_trampoline(node);
5154         }
5155         panic("Builtin %s not implemented in IA32", get_builtin_kind_name(kind));
5156 }
5157
5158 /**
5159  * Transform Proj(Builtin) node.
5160  */
5161 static ir_node *gen_Proj_Builtin(ir_node *proj) {
5162         ir_node         *node     = get_Proj_pred(proj);
5163         ir_node         *new_node = be_transform_node(node);
5164         ir_builtin_kind kind      = get_Builtin_kind(node);
5165
5166         switch (kind) {
5167         case ir_bk_return_address:
5168         case ir_bk_frame_address:
5169         case ir_bk_ffs:
5170         case ir_bk_clz:
5171         case ir_bk_ctz:
5172         case ir_bk_parity:
5173         case ir_bk_popcount:
5174         case ir_bk_bswap:
5175                 assert(get_Proj_proj(proj) == pn_Builtin_1_result);
5176                 return new_node;
5177         case ir_bk_trap:
5178         case ir_bk_debugbreak:
5179         case ir_bk_prefetch:
5180         case ir_bk_outport:
5181                 assert(get_Proj_proj(proj) == pn_Builtin_M);
5182                 return new_node;
5183         case ir_bk_inport:
5184                 if (get_Proj_proj(proj) == pn_Builtin_1_result) {
5185                         return new_r_Proj(get_nodes_block(new_node),
5186                                           new_node, get_irn_mode(proj), pn_ia32_Inport_res);
5187                 } else {
5188                         assert(get_Proj_proj(proj) == pn_Builtin_M);
5189                         return new_r_Proj(get_nodes_block(new_node),
5190                                 new_node, mode_M, pn_ia32_Inport_M);
5191                 }
5192         case ir_bk_inner_trampoline:
5193                 if (get_Proj_proj(proj) == pn_Builtin_1_result) {
5194                         return get_Tuple_pred(new_node, 1);
5195                 } else {
5196                         assert(get_Proj_proj(proj) == pn_Builtin_M);
5197                         return get_Tuple_pred(new_node, 0);
5198                 }
5199         }
5200         panic("Builtin %s not implemented in IA32", get_builtin_kind_name(kind));
5201 }
5202
5203 static ir_node *gen_be_IncSP(ir_node *node)
5204 {
5205         ir_node *res = be_duplicate_node(node);
5206         arch_irn_add_flags(res, arch_irn_flags_modify_flags);
5207
5208         return res;
5209 }
5210
5211 /**
5212  * Transform the Projs from a be_Call.
5213  */
5214 static ir_node *gen_Proj_be_Call(ir_node *node)
5215 {
5216         ir_node  *block       = be_transform_node(get_nodes_block(node));
5217         ir_node  *call        = get_Proj_pred(node);
5218         ir_node  *new_call    = be_transform_node(call);
5219         dbg_info *dbgi        = get_irn_dbg_info(node);
5220         long      proj        = get_Proj_proj(node);
5221         ir_mode  *mode        = get_irn_mode(node);
5222         ir_node  *res;
5223
5224         if (proj == pn_be_Call_M_regular) {
5225                 return new_rd_Proj(dbgi, block, new_call, mode_M, n_ia32_Call_mem);
5226         }
5227         /* transform call modes */
5228         if (mode_is_data(mode)) {
5229                 const arch_register_class_t *cls = arch_get_irn_reg_class_out(node);
5230                 mode = cls->mode;
5231         }
5232
5233         /* Map from be_Call to ia32_Call proj number */
5234         if (proj == pn_be_Call_sp) {
5235                 proj = pn_ia32_Call_stack;
5236         } else if (proj == pn_be_Call_M_regular) {
5237                 proj = pn_ia32_Call_M;
5238         } else {
5239                 arch_register_req_t const *const req    = arch_get_register_req_out(node);
5240                 int                        const n_outs = arch_irn_get_n_outs(new_call);
5241                 int                              i;
5242
5243                 assert(proj      >= pn_be_Call_first_res);
5244                 assert(req->type & arch_register_req_type_limited);
5245
5246                 for (i = 0; i < n_outs; ++i) {
5247                         arch_register_req_t const *const new_req = get_ia32_out_req(new_call, i);
5248
5249                         if (!(new_req->type & arch_register_req_type_limited) ||
5250                             new_req->cls      != req->cls                     ||
5251                             *new_req->limited != *req->limited)
5252                                 continue;
5253
5254                         proj = i;
5255                         break;
5256                 }
5257                 assert(i < n_outs);
5258         }
5259
5260         res = new_rd_Proj(dbgi, block, new_call, mode, proj);
5261
5262         /* TODO arch_set_irn_register() only operates on Projs, need variant with index */
5263         switch (proj) {
5264                 case pn_ia32_Call_stack:
5265                         arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
5266                         break;
5267
5268                 case pn_ia32_Call_fpcw:
5269                         arch_set_irn_register(res, &ia32_fp_cw_regs[REG_FPCW]);
5270                         break;
5271         }
5272
5273         return res;
5274 }
5275
5276 /**
5277  * Transform the Projs from a Cmp.
5278  */
5279 static ir_node *gen_Proj_Cmp(ir_node *node)
5280 {
5281         /* this probably means not all mode_b nodes were lowered... */
5282         panic("trying to directly transform Proj_Cmp %+F (mode_b not lowered?)",
5283               node);
5284 }
5285
5286 /**
5287  * Transform the Projs from a Bound.
5288  */
5289 static ir_node *gen_Proj_Bound(ir_node *node)
5290 {
5291         ir_node *new_node, *block;
5292         ir_node *pred = get_Proj_pred(node);
5293
5294         switch (get_Proj_proj(node)) {
5295         case pn_Bound_M:
5296                 return be_transform_node(get_Bound_mem(pred));
5297         case pn_Bound_X_regular:
5298                 new_node = be_transform_node(pred);
5299                 block    = get_nodes_block(new_node);
5300                 return new_r_Proj(block, new_node, mode_X, pn_ia32_Jcc_true);
5301         case pn_Bound_X_except:
5302                 new_node = be_transform_node(pred);
5303                 block    = get_nodes_block(new_node);
5304                 return new_r_Proj(block, new_node, mode_X, pn_ia32_Jcc_false);
5305         case pn_Bound_res:
5306                 return be_transform_node(get_Bound_index(pred));
5307         default:
5308                 panic("unsupported Proj from Bound");
5309         }
5310 }
5311
5312 static ir_node *gen_Proj_ASM(ir_node *node)
5313 {
5314         ir_mode *mode     = get_irn_mode(node);
5315         ir_node *pred     = get_Proj_pred(node);
5316         ir_node *new_pred = be_transform_node(pred);
5317         ir_node *block    = get_nodes_block(new_pred);
5318         long     pos      = get_Proj_proj(node);
5319
5320         if (mode == mode_M) {
5321                 pos = arch_irn_get_n_outs(new_pred)-1;
5322         } else if (mode_is_int(mode) || mode_is_reference(mode)) {
5323                 mode = mode_Iu;
5324         } else if (mode_is_float(mode)) {
5325                 mode = mode_E;
5326         } else {
5327                 panic("unexpected proj mode at ASM");
5328         }
5329
5330         return new_r_Proj(block, new_pred, mode, pos);
5331 }
5332
5333 /**
5334  * Transform and potentially renumber Proj nodes.
5335  */
5336 static ir_node *gen_Proj(ir_node *node)
5337 {
5338         ir_node *pred = get_Proj_pred(node);
5339         long    proj;
5340
5341         switch (get_irn_opcode(pred)) {
5342         case iro_Store:
5343                 proj = get_Proj_proj(node);
5344                 if (proj == pn_Store_M) {
5345                         return be_transform_node(pred);
5346                 } else {
5347                         panic("No idea how to transform proj->Store");
5348                 }
5349         case iro_Load:
5350                 return gen_Proj_Load(node);
5351         case iro_ASM:
5352                 return gen_Proj_ASM(node);
5353         case iro_Builtin:
5354                 return gen_Proj_Builtin(node);
5355         case iro_Div:
5356         case iro_Mod:
5357         case iro_DivMod:
5358                 return gen_Proj_DivMod(node);
5359         case iro_CopyB:
5360                 return gen_Proj_CopyB(node);
5361         case iro_Quot:
5362                 return gen_Proj_Quot(node);
5363         case beo_SubSP:
5364                 return gen_Proj_be_SubSP(node);
5365         case beo_AddSP:
5366                 return gen_Proj_be_AddSP(node);
5367         case beo_Call:
5368                 return gen_Proj_be_Call(node);
5369         case iro_Cmp:
5370                 return gen_Proj_Cmp(node);
5371         case iro_Bound:
5372                 return gen_Proj_Bound(node);
5373         case iro_Start:
5374                 proj = get_Proj_proj(node);
5375                 switch (proj) {
5376                         case pn_Start_X_initial_exec: {
5377                                 ir_node  *block     = get_nodes_block(pred);
5378                                 ir_node  *new_block = be_transform_node(block);
5379                                 dbg_info *dbgi      = get_irn_dbg_info(node);
5380                                 /* we exchange the ProjX with a jump */
5381                                 ir_node  *jump      = new_rd_Jmp(dbgi, new_block);
5382
5383                                 return jump;
5384                         }
5385
5386                         case pn_Start_P_tls:
5387                                 return gen_Proj_tls(node);
5388                 }
5389                 break;
5390
5391         default:
5392                 if (is_ia32_l_FloattoLL(pred)) {
5393                         return gen_Proj_l_FloattoLL(node);
5394 #ifdef FIRM_EXT_GRS
5395                 } else if (!is_ia32_irn(pred)) { // Quick hack for SIMD optimization
5396 #else
5397                 } else {
5398 #endif
5399                         ir_mode *mode = get_irn_mode(node);
5400                         if (ia32_mode_needs_gp_reg(mode)) {
5401                                 ir_node *new_pred = be_transform_node(pred);
5402                                 ir_node *block    = be_transform_node(get_nodes_block(node));
5403                                 ir_node *new_proj = new_r_Proj(block, new_pred,
5404                                                                                            mode_Iu, get_Proj_proj(node));
5405                                 new_proj->node_nr = node->node_nr;
5406                                 return new_proj;
5407                         }
5408                 }
5409         }
5410         return be_duplicate_node(node);
5411 }
5412
5413 /**
5414  * Enters all transform functions into the generic pointer
5415  */
5416 static void register_transformers(void)
5417 {
5418         /* first clear the generic function pointer for all ops */
5419         clear_irp_opcodes_generic_func();
5420
5421 #define GEN(a)   { be_transform_func *func = gen_##a; op_##a->ops.generic = (op_func) func; }
5422 #define BAD(a)   op_##a->ops.generic = (op_func)bad_transform
5423
5424         GEN(Add);
5425         GEN(Sub);
5426         GEN(Mul);
5427         GEN(Mulh);
5428         GEN(And);
5429         GEN(Or);
5430         GEN(Eor);
5431
5432         GEN(Shl);
5433         GEN(Shr);
5434         GEN(Shrs);
5435         GEN(Rotl);
5436
5437         GEN(Quot);
5438
5439         GEN(Div);
5440         GEN(Mod);
5441         GEN(DivMod);
5442
5443         GEN(Minus);
5444         GEN(Conv);
5445         GEN(Abs);
5446         GEN(Not);
5447
5448         GEN(Load);
5449         GEN(Store);
5450         GEN(Cond);
5451
5452         GEN(Cmp);
5453         GEN(ASM);
5454         GEN(CopyB);
5455         GEN(Mux);
5456         GEN(Proj);
5457         GEN(Phi);
5458         GEN(IJmp);
5459         GEN(Bound);
5460
5461         /* transform ops from intrinsic lowering */
5462         GEN(ia32_l_Add);
5463         GEN(ia32_l_Adc);
5464         GEN(ia32_l_Mul);
5465         GEN(ia32_l_IMul);
5466         GEN(ia32_l_ShlDep);
5467         GEN(ia32_l_ShrDep);
5468         GEN(ia32_l_SarDep);
5469         GEN(ia32_l_ShlD);
5470         GEN(ia32_l_ShrD);
5471         GEN(ia32_l_Sub);
5472         GEN(ia32_l_Sbb);
5473         GEN(ia32_l_LLtoFloat);
5474         GEN(ia32_l_FloattoLL);
5475
5476         GEN(Const);
5477         GEN(SymConst);
5478         GEN(Unknown);
5479
5480         /* we should never see these nodes */
5481         BAD(Raise);
5482         BAD(Sel);
5483         BAD(InstOf);
5484         BAD(Cast);
5485         BAD(Free);
5486         BAD(Tuple);
5487         BAD(Id);
5488         //BAD(Bad);
5489         BAD(Confirm);
5490         BAD(Filter);
5491         BAD(CallBegin);
5492         BAD(EndReg);
5493         BAD(EndExcept);
5494
5495         /* handle builtins */
5496         GEN(Builtin);
5497
5498         /* handle generic backend nodes */
5499         GEN(be_FrameAddr);
5500         GEN(be_Call);
5501         GEN(be_IncSP);
5502         GEN(be_Return);
5503         GEN(be_AddSP);
5504         GEN(be_SubSP);
5505         GEN(be_Copy);
5506
5507 #undef GEN
5508 #undef BAD
5509 }
5510
5511 /**
5512  * Pre-transform all unknown and noreg nodes.
5513  */
5514 static void ia32_pretransform_node(void)
5515 {
5516         ia32_code_gen_t *cg = env_cg;
5517
5518         cg->unknown_gp  = be_pre_transform_node(cg->unknown_gp);
5519         cg->unknown_vfp = be_pre_transform_node(cg->unknown_vfp);
5520         cg->unknown_xmm = be_pre_transform_node(cg->unknown_xmm);
5521         cg->noreg_gp    = be_pre_transform_node(cg->noreg_gp);
5522         cg->noreg_vfp   = be_pre_transform_node(cg->noreg_vfp);
5523         cg->noreg_xmm   = be_pre_transform_node(cg->noreg_xmm);
5524
5525         nomem    = get_irg_no_mem(current_ir_graph);
5526         noreg_GP = ia32_new_NoReg_gp(cg);
5527
5528         get_fpcw();
5529 }
5530
5531 /**
5532  * Walker, checks if all ia32 nodes producing more than one result have their
5533  * Projs, otherwise creates new Projs and keeps them using a be_Keep node.
5534  */
5535 static void add_missing_keep_walker(ir_node *node, void *data)
5536 {
5537         int              n_outs, i;
5538         unsigned         found_projs = 0;
5539         const ir_edge_t *edge;
5540         ir_mode         *mode = get_irn_mode(node);
5541         ir_node         *last_keep;
5542         (void) data;
5543         if (mode != mode_T)
5544                 return;
5545         if (!is_ia32_irn(node))
5546                 return;
5547
5548         n_outs = arch_irn_get_n_outs(node);
5549         if (n_outs <= 0)
5550                 return;
5551         if (is_ia32_SwitchJmp(node))
5552                 return;
5553
5554         assert(n_outs < (int) sizeof(unsigned) * 8);
5555         foreach_out_edge(node, edge) {
5556                 ir_node *proj = get_edge_src_irn(edge);
5557                 int      pn;
5558
5559                 /* The node could be kept */
5560                 if (is_End(proj))
5561                         continue;
5562
5563                 if (get_irn_mode(proj) == mode_M)
5564                         continue;
5565
5566                 pn = get_Proj_proj(proj);
5567                 assert(pn < n_outs);
5568                 found_projs |= 1 << pn;
5569         }
5570
5571
5572         /* are keeps missing? */
5573         last_keep = NULL;
5574         for (i = 0; i < n_outs; ++i) {
5575                 ir_node                     *block;
5576                 ir_node                     *in[1];
5577                 const arch_register_req_t   *req;
5578                 const arch_register_class_t *cls;
5579
5580                 if (found_projs & (1 << i)) {
5581                         continue;
5582                 }
5583
5584                 req = get_ia32_out_req(node, i);
5585                 cls = req->cls;
5586                 if (cls == NULL) {
5587                         continue;
5588                 }
5589                 if (cls == &ia32_reg_classes[CLASS_ia32_flags]) {
5590                         continue;
5591                 }
5592
5593                 block = get_nodes_block(node);
5594                 in[0] = new_r_Proj(block, node, arch_register_class_mode(cls), i);
5595                 if (last_keep != NULL) {
5596                         be_Keep_add_node(last_keep, cls, in[0]);
5597                 } else {
5598                         last_keep = be_new_Keep(block, 1, in);
5599                         if (sched_is_scheduled(node)) {
5600                                 sched_add_after(node, last_keep);
5601                         }
5602                 }
5603         }
5604 }
5605
5606 /**
5607  * Adds missing keeps to nodes. Adds missing Proj nodes for unused outputs
5608  * and keeps them.
5609  */
5610 void ia32_add_missing_keeps(ia32_code_gen_t *cg)
5611 {
5612         ir_graph *irg = be_get_birg_irg(cg->birg);
5613         irg_walk_graph(irg, add_missing_keep_walker, NULL, NULL);
5614 }
5615
5616 /**
5617  * Post-process all calls if we are in SSE mode.
5618  * The ABI requires that the results are in st0, copy them
5619  * to a xmm register.
5620  */
5621 static void postprocess_fp_call_results(void) {
5622         int i;
5623
5624         for (i = ARR_LEN(call_list) - 1; i >= 0; --i) {
5625                 ir_node *call = call_list[i];
5626                 ir_type *mtp  = call_types[i];
5627                 int     j;
5628
5629                 for (j = get_method_n_ress(mtp) - 1; j >= 0; --j) {
5630                         ir_type *res_tp = get_method_res_type(mtp, j);
5631                         ir_node *res, *new_res;
5632                         const ir_edge_t *edge, *next;
5633                         ir_mode *mode;
5634
5635                         if (! is_atomic_type(res_tp)) {
5636                                 /* no floating point return */
5637                                 continue;
5638                         }
5639                         mode = get_type_mode(res_tp);
5640                         if (! mode_is_float(mode)) {
5641                                 /* no floating point return */
5642                                 continue;
5643                         }
5644
5645                         res     = be_get_Proj_for_pn(call, pn_ia32_Call_vf0 + j);
5646                         new_res = NULL;
5647
5648                         /* now patch the users */
5649                         foreach_out_edge_safe(res, edge, next) {
5650                                 ir_node *succ = get_edge_src_irn(edge);
5651
5652                                 /* ignore Keeps */
5653                                 if (be_is_Keep(succ))
5654                                         continue;
5655
5656                                 if (is_ia32_xStore(succ)) {
5657                                         /* an xStore can be patched into an vfst */
5658                                         dbg_info *db    = get_irn_dbg_info(succ);
5659                                         ir_node  *block = get_nodes_block(succ);
5660                                         ir_node  *base  = get_irn_n(succ, n_ia32_xStore_base);
5661                                         ir_node  *index = get_irn_n(succ, n_ia32_xStore_index);
5662                                         ir_node  *mem   = get_irn_n(succ, n_ia32_xStore_mem);
5663                                         ir_node  *value = get_irn_n(succ, n_ia32_xStore_val);
5664                                         ir_mode  *mode  = get_ia32_ls_mode(succ);
5665
5666                                         ir_node  *st = new_bd_ia32_vfst(db, block, base, index, mem, value, mode);
5667                                         set_ia32_am_offs_int(st, get_ia32_am_offs_int(succ));
5668                                         if (is_ia32_use_frame(succ))
5669                                                 set_ia32_use_frame(st);
5670                                         set_ia32_frame_ent(st, get_ia32_frame_ent(succ));
5671                                         set_irn_pinned(st, get_irn_pinned(succ));
5672                                         set_ia32_op_type(st, ia32_AddrModeD);
5673
5674                                         exchange(succ, st);
5675                                 } else {
5676                                         if (new_res == NULL) {
5677                                                 dbg_info *db       = get_irn_dbg_info(call);
5678                                                 ir_node  *block    = get_nodes_block(call);
5679                                                 ir_node  *frame    = get_irg_frame(current_ir_graph);
5680                                                 ir_node  *old_mem  = be_get_Proj_for_pn(call, pn_ia32_Call_M);
5681                                                 ir_node  *call_mem = new_r_Proj(block, call, mode_M, pn_ia32_Call_M);
5682                                                 ir_node  *vfst, *xld, *new_mem;
5683
5684                                                 /* store st(0) on stack */
5685                                                 vfst = new_bd_ia32_vfst(db, block, frame, noreg_GP, call_mem, res, mode);
5686                                                 set_ia32_op_type(vfst, ia32_AddrModeD);
5687                                                 set_ia32_use_frame(vfst);
5688
5689                                                 /* load into SSE register */
5690                                                 xld = new_bd_ia32_xLoad(db, block, frame, noreg_GP, vfst, mode);
5691                                                 set_ia32_op_type(xld, ia32_AddrModeS);
5692                                                 set_ia32_use_frame(xld);
5693
5694                                                 new_res = new_r_Proj(block, xld, mode, pn_ia32_xLoad_res);
5695                                                 new_mem = new_r_Proj(block, xld, mode_M, pn_ia32_xLoad_M);
5696
5697                                                 if (old_mem != NULL) {
5698                                                         edges_reroute(old_mem, new_mem, current_ir_graph);
5699                                                         kill_node(old_mem);
5700                                                 }
5701                                         }
5702                                         set_irn_n(succ, get_edge_src_pos(edge), new_res);
5703                                 }
5704                         }
5705                 }
5706         }
5707 }
5708
5709 /* do the transformation */
5710 void ia32_transform_graph(ia32_code_gen_t *cg)
5711 {
5712         int cse_last;
5713
5714         register_transformers();
5715         env_cg        = cg;
5716         initial_fpcw  = NULL;
5717         no_pic_adjust = 0;
5718
5719         BE_TIMER_PUSH(t_heights);
5720         heights      = heights_new(cg->irg);
5721         BE_TIMER_POP(t_heights);
5722         ia32_calculate_non_address_mode_nodes(cg->birg);
5723
5724         /* the transform phase is not safe for CSE (yet) because several nodes get
5725          * attributes set after their creation */
5726         cse_last = get_opt_cse();
5727         set_opt_cse(0);
5728
5729         call_list  = NEW_ARR_F(ir_node *, 0);
5730         call_types = NEW_ARR_F(ir_type *, 0);
5731         be_transform_graph(cg->birg, ia32_pretransform_node);
5732
5733         if (ia32_cg_config.use_sse2)
5734                 postprocess_fp_call_results();
5735         DEL_ARR_F(call_types);
5736         DEL_ARR_F(call_list);
5737
5738         set_opt_cse(cse_last);
5739
5740         ia32_free_non_address_mode_nodes();
5741         heights_free(heights);
5742         heights = NULL;
5743 }
5744
5745 void ia32_init_transform(void)
5746 {
5747         FIRM_DBG_REGISTER(dbg, "firm.be.ia32.transform");
5748 }