reorganize backend headers (kill some _t variants in favor of a be_types.h)
[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_t.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                 const arch_register_class_t *reg_class = &ia32_reg_classes[CLASS_ia32_vfp];
2461                 ir_node *vfisttp = new_bd_ia32_vfisttp(dbgi, block, base, index, mem, val);
2462                 ir_node *value   = new_r_Proj(block, vfisttp, mode_E, pn_ia32_vfisttp_res);
2463                 be_new_Keep(reg_class, block, 1, &value);
2464
2465                 new_node = new_r_Proj(block, vfisttp, mode_M, pn_ia32_vfisttp_M);
2466                 *fist    = vfisttp;
2467         } else {
2468                 ir_node *trunc_mode = ia32_new_Fpu_truncate(env_cg);
2469
2470                 /* do a fist */
2471                 new_node = new_bd_ia32_vfist(dbgi, block, base, index, mem, val, trunc_mode);
2472                 *fist    = new_node;
2473         }
2474         return new_node;
2475 }
2476 /**
2477  * Transforms a general (no special case) Store.
2478  *
2479  * @return the created ia32 Store node
2480  */
2481 static ir_node *gen_general_Store(ir_node *node)
2482 {
2483         ir_node  *val       = get_Store_value(node);
2484         ir_mode  *mode      = get_irn_mode(val);
2485         ir_node  *block     = get_nodes_block(node);
2486         ir_node  *new_block = be_transform_node(block);
2487         ir_node  *ptr       = get_Store_ptr(node);
2488         ir_node  *mem       = get_Store_mem(node);
2489         dbg_info *dbgi      = get_irn_dbg_info(node);
2490         ir_node  *new_val, *new_node, *store;
2491         ia32_address_t addr;
2492
2493         /* check for destination address mode */
2494         new_node = try_create_dest_am(node);
2495         if (new_node != NULL)
2496                 return new_node;
2497
2498         /* construct store address */
2499         memset(&addr, 0, sizeof(addr));
2500         ia32_create_address_mode(&addr, ptr, 0);
2501
2502         if (addr.base == NULL) {
2503                 addr.base = noreg_GP;
2504         } else {
2505                 addr.base = be_transform_node(addr.base);
2506         }
2507
2508         if (addr.index == NULL) {
2509                 addr.index = noreg_GP;
2510         } else {
2511                 addr.index = be_transform_node(addr.index);
2512         }
2513         addr.mem = be_transform_node(mem);
2514
2515         if (mode_is_float(mode)) {
2516                 /* Convs (and strict-Convs) before stores are unnecessary if the mode
2517                    is the same. */
2518                 while (is_Conv(val) && mode == get_irn_mode(val)) {
2519                         ir_node *op = get_Conv_op(val);
2520                         if (!mode_is_float(get_irn_mode(op)))
2521                                 break;
2522                         val = op;
2523                 }
2524                 new_val = be_transform_node(val);
2525                 if (ia32_cg_config.use_sse2) {
2526                         new_node = new_bd_ia32_xStore(dbgi, new_block, addr.base,
2527                                                       addr.index, addr.mem, new_val);
2528                 } else {
2529                         new_node = new_bd_ia32_vfst(dbgi, new_block, addr.base,
2530                                                     addr.index, addr.mem, new_val, mode);
2531                 }
2532                 store = new_node;
2533         } else if (!ia32_cg_config.use_sse2 && is_float_to_int_conv(val)) {
2534                 val = get_Conv_op(val);
2535
2536                 /* TODO: is this optimisation still necessary at all (middleend)? */
2537                 /* We can skip ALL float->float up-Convs (and strict-up-Convs) before stores. */
2538                 while (is_Conv(val)) {
2539                         ir_node *op = get_Conv_op(val);
2540                         if (!mode_is_float(get_irn_mode(op)))
2541                                 break;
2542                         if (get_mode_size_bits(get_irn_mode(op)) > get_mode_size_bits(get_irn_mode(val)))
2543                                 break;
2544                         val = op;
2545                 }
2546                 new_val  = be_transform_node(val);
2547                 new_node = gen_vfist(dbgi, new_block, addr.base, addr.index, addr.mem, new_val, &store);
2548         } else {
2549                 new_val = create_immediate_or_transform(val, 0);
2550                 assert(mode != mode_b);
2551
2552                 if (get_mode_size_bits(mode) == 8) {
2553                         new_node = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
2554                                                          addr.index, addr.mem, new_val);
2555                 } else {
2556                         new_node = new_bd_ia32_Store(dbgi, new_block, addr.base,
2557                                                      addr.index, addr.mem, new_val);
2558                 }
2559                 store = new_node;
2560         }
2561
2562         set_irn_pinned(store, get_irn_pinned(node));
2563         set_ia32_op_type(store, ia32_AddrModeD);
2564         set_ia32_ls_mode(store, mode);
2565
2566         set_address(store, &addr);
2567         SET_IA32_ORIG_NODE(store, node);
2568
2569         return new_node;
2570 }
2571
2572 /**
2573  * Transforms a Store.
2574  *
2575  * @return the created ia32 Store node
2576  */
2577 static ir_node *gen_Store(ir_node *node)
2578 {
2579         ir_node  *val  = get_Store_value(node);
2580         ir_mode  *mode = get_irn_mode(val);
2581
2582         if (mode_is_float(mode) && is_Const(val)) {
2583                 /* We can transform every floating const store
2584                    into a sequence of integer stores.
2585                    If the constant is already in a register,
2586                    it would be better to use it, but we don't
2587                    have this information here. */
2588                 return gen_float_const_Store(node, val);
2589         }
2590         return gen_general_Store(node);
2591 }
2592
2593 /**
2594  * Transforms a Switch.
2595  *
2596  * @return the created ia32 SwitchJmp node
2597  */
2598 static ir_node *create_Switch(ir_node *node)
2599 {
2600         dbg_info *dbgi       = get_irn_dbg_info(node);
2601         ir_node  *block      = be_transform_node(get_nodes_block(node));
2602         ir_node  *sel        = get_Cond_selector(node);
2603         ir_node  *new_sel    = be_transform_node(sel);
2604         long      switch_min = LONG_MAX;
2605         long      switch_max = LONG_MIN;
2606         long      default_pn = get_Cond_default_proj(node);
2607         ir_node  *new_node;
2608         const ir_edge_t *edge;
2609
2610         assert(get_mode_size_bits(get_irn_mode(sel)) == 32);
2611
2612         /* determine the smallest switch case value */
2613         foreach_out_edge(node, edge) {
2614                 ir_node *proj = get_edge_src_irn(edge);
2615                 long     pn   = get_Proj_proj(proj);
2616                 if (pn == default_pn)
2617                         continue;
2618
2619                 if (pn < switch_min)
2620                         switch_min = pn;
2621                 if (pn > switch_max)
2622                         switch_max = pn;
2623         }
2624
2625         if ((unsigned long) (switch_max - switch_min) > 256000) {
2626                 panic("Size of switch %+F bigger than 256000", node);
2627         }
2628
2629         if (switch_min != 0) {
2630                 /* if smallest switch case is not 0 we need an additional sub */
2631                 new_sel = new_bd_ia32_Lea(dbgi, block, new_sel, noreg_GP);
2632                 add_ia32_am_offs_int(new_sel, -switch_min);
2633                 set_ia32_op_type(new_sel, ia32_AddrModeS);
2634
2635                 SET_IA32_ORIG_NODE(new_sel, node);
2636         }
2637
2638         new_node = new_bd_ia32_SwitchJmp(dbgi, block, new_sel, default_pn);
2639         SET_IA32_ORIG_NODE(new_node, node);
2640
2641         return new_node;
2642 }
2643
2644 /**
2645  * Transform a Cond node.
2646  */
2647 static ir_node *gen_Cond(ir_node *node)
2648 {
2649         ir_node  *block     = get_nodes_block(node);
2650         ir_node  *new_block = be_transform_node(block);
2651         dbg_info *dbgi      = get_irn_dbg_info(node);
2652         ir_node  *sel       = get_Cond_selector(node);
2653         ir_mode  *sel_mode  = get_irn_mode(sel);
2654         ir_node  *flags     = NULL;
2655         ir_node  *new_node;
2656         pn_Cmp    pnc;
2657
2658         if (sel_mode != mode_b) {
2659                 return create_Switch(node);
2660         }
2661
2662         /* we get flags from a Cmp */
2663         flags = get_flags_node(sel, &pnc);
2664
2665         new_node = new_bd_ia32_Jcc(dbgi, new_block, flags, pnc);
2666         SET_IA32_ORIG_NODE(new_node, node);
2667
2668         return new_node;
2669 }
2670
2671 /**
2672  * Transform a be_Copy.
2673  */
2674 static ir_node *gen_be_Copy(ir_node *node)
2675 {
2676         ir_node *new_node = be_duplicate_node(node);
2677         ir_mode *mode     = get_irn_mode(new_node);
2678
2679         if (ia32_mode_needs_gp_reg(mode)) {
2680                 set_irn_mode(new_node, mode_Iu);
2681         }
2682
2683         return new_node;
2684 }
2685
2686 static ir_node *create_Fucom(ir_node *node)
2687 {
2688         dbg_info *dbgi      = get_irn_dbg_info(node);
2689         ir_node  *block     = get_nodes_block(node);
2690         ir_node  *new_block = be_transform_node(block);
2691         ir_node  *left      = get_Cmp_left(node);
2692         ir_node  *new_left  = be_transform_node(left);
2693         ir_node  *right     = get_Cmp_right(node);
2694         ir_node  *new_right;
2695         ir_node  *new_node;
2696
2697         if (ia32_cg_config.use_fucomi) {
2698                 new_right = be_transform_node(right);
2699                 new_node  = new_bd_ia32_vFucomi(dbgi, new_block, new_left,
2700                                                 new_right, 0);
2701                 set_ia32_commutative(new_node);
2702                 SET_IA32_ORIG_NODE(new_node, node);
2703         } else {
2704                 if (ia32_cg_config.use_ftst && is_Const_0(right)) {
2705                         new_node = new_bd_ia32_vFtstFnstsw(dbgi, new_block, new_left, 0);
2706                 } else {
2707                         new_right = be_transform_node(right);
2708                         new_node  = new_bd_ia32_vFucomFnstsw(dbgi, new_block, new_left, new_right, 0);
2709                 }
2710
2711                 set_ia32_commutative(new_node);
2712
2713                 SET_IA32_ORIG_NODE(new_node, node);
2714
2715                 new_node = new_bd_ia32_Sahf(dbgi, new_block, new_node);
2716                 SET_IA32_ORIG_NODE(new_node, node);
2717         }
2718
2719         return new_node;
2720 }
2721
2722 static ir_node *create_Ucomi(ir_node *node)
2723 {
2724         dbg_info *dbgi      = get_irn_dbg_info(node);
2725         ir_node  *src_block = get_nodes_block(node);
2726         ir_node  *new_block = be_transform_node(src_block);
2727         ir_node  *left      = get_Cmp_left(node);
2728         ir_node  *right     = get_Cmp_right(node);
2729         ir_node  *new_node;
2730         ia32_address_mode_t  am;
2731         ia32_address_t      *addr = &am.addr;
2732
2733         match_arguments(&am, src_block, left, right, NULL,
2734                         match_commutative | match_am);
2735
2736         new_node = new_bd_ia32_Ucomi(dbgi, new_block, addr->base, addr->index,
2737                                      addr->mem, am.new_op1, am.new_op2,
2738                                      am.ins_permuted);
2739         set_am_attributes(new_node, &am);
2740
2741         SET_IA32_ORIG_NODE(new_node, node);
2742
2743         new_node = fix_mem_proj(new_node, &am);
2744
2745         return new_node;
2746 }
2747
2748 /**
2749  * helper function: checks whether all Cmp projs are Lg or Eq which is needed
2750  * to fold an and into a test node
2751  */
2752 static bool can_fold_test_and(ir_node *node)
2753 {
2754         const ir_edge_t *edge;
2755
2756         /** we can only have eq and lg projs */
2757         foreach_out_edge(node, edge) {
2758                 ir_node *proj = get_edge_src_irn(edge);
2759                 pn_Cmp   pnc  = get_Proj_proj(proj);
2760                 if (pnc != pn_Cmp_Eq && pnc != pn_Cmp_Lg)
2761                         return false;
2762         }
2763
2764         return true;
2765 }
2766
2767 /**
2768  * returns true if it is assured, that the upper bits of a node are "clean"
2769  * which means for a 16 or 8 bit value, that the upper bits in the register
2770  * are 0 for unsigned and a copy of the last significant bit for signed
2771  * numbers.
2772  */
2773 static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode)
2774 {
2775         assert(ia32_mode_needs_gp_reg(mode));
2776         if (get_mode_size_bits(mode) >= 32)
2777                 return true;
2778
2779         if (is_Proj(transformed_node))
2780                 return upper_bits_clean(get_Proj_pred(transformed_node), mode);
2781
2782         switch (get_ia32_irn_opcode(transformed_node)) {
2783                 case iro_ia32_Conv_I2I:
2784                 case iro_ia32_Conv_I2I8Bit: {
2785                         ir_mode *smaller_mode = get_ia32_ls_mode(transformed_node);
2786                         if (mode_is_signed(smaller_mode) != mode_is_signed(mode))
2787                                 return false;
2788                         if (get_mode_size_bits(smaller_mode) > get_mode_size_bits(mode))
2789                                 return false;
2790
2791                         return true;
2792                 }
2793
2794                 case iro_ia32_Shr:
2795                         if (mode_is_signed(mode)) {
2796                                 return false; /* TODO handle signed modes */
2797                         } else {
2798                                 ir_node *right = get_irn_n(transformed_node, n_ia32_Shr_count);
2799                                 if (is_ia32_Immediate(right) || is_ia32_Const(right)) {
2800                                         const ia32_immediate_attr_t *attr
2801                                                 = get_ia32_immediate_attr_const(right);
2802                                         if (attr->symconst == 0 &&
2803                                                         (unsigned)attr->offset >= 32 - get_mode_size_bits(mode)) {
2804                                                 return true;
2805                                         }
2806                                 }
2807                                 return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Shr_val), mode);
2808                         }
2809
2810                 case iro_ia32_Sar:
2811                         /* TODO too conservative if shift amount is constant */
2812                         return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Sar_val), mode);
2813
2814                 case iro_ia32_And:
2815                         if (!mode_is_signed(mode)) {
2816                                 return
2817                                         upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_right), mode) ||
2818                                         upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_left),  mode);
2819                         }
2820                         /* TODO if one is known to be zero extended, then || is sufficient */
2821                         /* FALLTHROUGH */
2822                 case iro_ia32_Or:
2823                 case iro_ia32_Xor:
2824                         return
2825                                 upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_right), mode) &&
2826                                 upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_left),  mode);
2827
2828                 case iro_ia32_Const:
2829                 case iro_ia32_Immediate: {
2830                         const ia32_immediate_attr_t *attr =
2831                                 get_ia32_immediate_attr_const(transformed_node);
2832                         if (mode_is_signed(mode)) {
2833                                 long shifted = attr->offset >> (get_mode_size_bits(mode) - 1);
2834                                 return shifted == 0 || shifted == -1;
2835                         } else {
2836                                 unsigned long shifted = (unsigned long)attr->offset;
2837                                 shifted >>= get_mode_size_bits(mode);
2838                                 return shifted == 0;
2839                         }
2840                 }
2841
2842                 default:
2843                         return false;
2844         }
2845 }
2846
2847 /**
2848  * Generate code for a Cmp.
2849  */
2850 static ir_node *gen_Cmp(ir_node *node)
2851 {
2852         dbg_info *dbgi      = get_irn_dbg_info(node);
2853         ir_node  *block     = get_nodes_block(node);
2854         ir_node  *new_block = be_transform_node(block);
2855         ir_node  *left      = get_Cmp_left(node);
2856         ir_node  *right     = get_Cmp_right(node);
2857         ir_mode  *cmp_mode  = get_irn_mode(left);
2858         ir_node  *new_node;
2859         ia32_address_mode_t  am;
2860         ia32_address_t      *addr = &am.addr;
2861         int                  cmp_unsigned;
2862
2863         if (mode_is_float(cmp_mode)) {
2864                 if (ia32_cg_config.use_sse2) {
2865                         return create_Ucomi(node);
2866                 } else {
2867                         return create_Fucom(node);
2868                 }
2869         }
2870
2871         assert(ia32_mode_needs_gp_reg(cmp_mode));
2872
2873         /* Prefer the Test instruction, when encountering (x & y) ==/!= 0 */
2874         cmp_unsigned = !mode_is_signed(cmp_mode);
2875         if (is_Const_0(right)          &&
2876             is_And(left)               &&
2877             get_irn_n_edges(left) == 1 &&
2878             can_fold_test_and(node)) {
2879                 /* Test(and_left, and_right) */
2880                 ir_node *and_left  = get_And_left(left);
2881                 ir_node *and_right = get_And_right(left);
2882
2883                 /* matze: code here used mode instead of cmd_mode, I think it is always
2884                  * the same as cmp_mode, but I leave this here to see if this is really
2885                  * true...
2886                  */
2887                 assert(get_irn_mode(and_left) == cmp_mode);
2888
2889                 match_arguments(&am, block, and_left, and_right, NULL,
2890                                                                                 match_commutative |
2891                                                                                 match_am | match_8bit_am | match_16bit_am |
2892                                                                                 match_am_and_immediates | match_immediate);
2893
2894                 /* use 32bit compare mode if possible since the opcode is smaller */
2895                 if (upper_bits_clean(am.new_op1, cmp_mode) &&
2896                     upper_bits_clean(am.new_op2, cmp_mode)) {
2897                         cmp_mode = mode_is_signed(cmp_mode) ? mode_Is : mode_Iu;
2898                 }
2899
2900                 if (get_mode_size_bits(cmp_mode) == 8) {
2901                         new_node = new_bd_ia32_Test8Bit(dbgi, new_block, addr->base,
2902                                         addr->index, addr->mem, am.new_op1, am.new_op2, am.ins_permuted,
2903                                         cmp_unsigned);
2904                 } else {
2905                         new_node = new_bd_ia32_Test(dbgi, new_block, addr->base, addr->index,
2906                                         addr->mem, am.new_op1, am.new_op2, am.ins_permuted, cmp_unsigned);
2907                 }
2908         } else {
2909                 /* Cmp(left, right) */
2910                 match_arguments(&am, block, left, right, NULL,
2911                                 match_commutative | match_am | match_8bit_am |
2912                                 match_16bit_am | match_am_and_immediates |
2913                                 match_immediate);
2914                 /* use 32bit compare mode if possible since the opcode is smaller */
2915                 if (upper_bits_clean(am.new_op1, cmp_mode) &&
2916                     upper_bits_clean(am.new_op2, cmp_mode)) {
2917                         cmp_mode = mode_is_signed(cmp_mode) ? mode_Is : mode_Iu;
2918                 }
2919
2920                 if (get_mode_size_bits(cmp_mode) == 8) {
2921                         new_node = new_bd_ia32_Cmp8Bit(dbgi, new_block, addr->base,
2922                                                        addr->index, addr->mem, am.new_op1,
2923                                                        am.new_op2, am.ins_permuted,
2924                                                        cmp_unsigned);
2925                 } else {
2926                         new_node = new_bd_ia32_Cmp(dbgi, new_block, addr->base, addr->index,
2927                                         addr->mem, am.new_op1, am.new_op2, am.ins_permuted, cmp_unsigned);
2928                 }
2929         }
2930         set_am_attributes(new_node, &am);
2931         set_ia32_ls_mode(new_node, cmp_mode);
2932
2933         SET_IA32_ORIG_NODE(new_node, node);
2934
2935         new_node = fix_mem_proj(new_node, &am);
2936
2937         return new_node;
2938 }
2939
2940 static ir_node *create_CMov(ir_node *node, ir_node *flags, ir_node *new_flags,
2941                             pn_Cmp pnc)
2942 {
2943         dbg_info            *dbgi          = get_irn_dbg_info(node);
2944         ir_node             *block         = get_nodes_block(node);
2945         ir_node             *new_block     = be_transform_node(block);
2946         ir_node             *val_true      = get_Mux_true(node);
2947         ir_node             *val_false     = get_Mux_false(node);
2948         ir_node             *new_node;
2949         ia32_address_mode_t  am;
2950         ia32_address_t      *addr;
2951
2952         assert(ia32_cg_config.use_cmov);
2953         assert(ia32_mode_needs_gp_reg(get_irn_mode(val_true)));
2954
2955         addr = &am.addr;
2956
2957         match_arguments(&am, block, val_false, val_true, flags,
2958                         match_commutative | match_am | match_16bit_am | match_mode_neutral);
2959
2960         new_node = new_bd_ia32_CMov(dbgi, new_block, addr->base, addr->index,
2961                                     addr->mem, am.new_op1, am.new_op2, new_flags,
2962                                     am.ins_permuted, pnc);
2963         set_am_attributes(new_node, &am);
2964
2965         SET_IA32_ORIG_NODE(new_node, node);
2966
2967         new_node = fix_mem_proj(new_node, &am);
2968
2969         return new_node;
2970 }
2971
2972 /**
2973  * Creates a ia32 Setcc instruction.
2974  */
2975 static ir_node *create_set_32bit(dbg_info *dbgi, ir_node *new_block,
2976                                  ir_node *flags, pn_Cmp pnc, ir_node *orig_node,
2977                                  int ins_permuted)
2978 {
2979         ir_mode *mode  = get_irn_mode(orig_node);
2980         ir_node *new_node;
2981
2982         new_node = new_bd_ia32_Set(dbgi, new_block, flags, pnc, ins_permuted);
2983         SET_IA32_ORIG_NODE(new_node, orig_node);
2984
2985         /* we might need to conv the result up */
2986         if (get_mode_size_bits(mode) > 8) {
2987                 new_node = new_bd_ia32_Conv_I2I8Bit(dbgi, new_block, noreg_GP, noreg_GP,
2988                                                     nomem, new_node, mode_Bu);
2989                 SET_IA32_ORIG_NODE(new_node, orig_node);
2990         }
2991
2992         return new_node;
2993 }
2994
2995 /**
2996  * Create instruction for an unsigned Difference or Zero.
2997  */
2998 static ir_node *create_Doz(ir_node *psi, ir_node *a, ir_node *b)
2999 {
3000         ir_mode  *mode  = get_irn_mode(psi);
3001         ir_node  *new_node, *sub, *sbb, *eflags, *block;
3002
3003         dbg_info *dbgi;
3004
3005         new_node = gen_binop(psi, a, b, new_bd_ia32_Sub,
3006                 match_mode_neutral | match_am | match_immediate | match_two_users);
3007
3008         block = get_nodes_block(new_node);
3009
3010         if (is_Proj(new_node)) {
3011                 sub = get_Proj_pred(new_node);
3012                 assert(is_ia32_Sub(sub));
3013         } else {
3014                 sub = new_node;
3015                 set_irn_mode(sub, mode_T);
3016                 new_node = new_rd_Proj(NULL, block, sub, mode, pn_ia32_res);
3017         }
3018         eflags = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_Sub_flags);
3019
3020         dbgi   = get_irn_dbg_info(psi);
3021         sbb    = new_bd_ia32_Sbb0(dbgi, block, eflags);
3022
3023         new_node = new_bd_ia32_And(dbgi, block, noreg_GP, noreg_GP, nomem, new_node, sbb);
3024         set_ia32_commutative(new_node);
3025         return new_node;
3026 }
3027
3028 /**
3029  * Create an const array of two float consts.
3030  *
3031  * @param c0        the first constant
3032  * @param c1        the second constant
3033  * @param new_mode  IN/OUT for the mode of the constants, if NULL
3034  *                  smallest possible mode will be used
3035  */
3036 static ir_entity *ia32_create_const_array(ir_node *c0, ir_node *c1, ir_mode **new_mode) {
3037         ir_entity        *ent;
3038         ir_mode          *mode = *new_mode;
3039         ir_type          *tp;
3040         ir_initializer_t *initializer;
3041         tarval           *tv0 = get_Const_tarval(c0);
3042         tarval           *tv1 = get_Const_tarval(c1);
3043
3044         if (mode == NULL) {
3045                 /* detect the best mode for the constants */
3046                 mode = get_tarval_mode(tv0);
3047
3048                 if (mode != mode_F) {
3049                         if (tarval_ieee754_can_conv_lossless(tv0, mode_F) &&
3050                             tarval_ieee754_can_conv_lossless(tv1, mode_F)) {
3051                                 mode = mode_F;
3052                                 tv0 = tarval_convert_to(tv0, mode);
3053                                 tv1 = tarval_convert_to(tv1, mode);
3054                         } else if (mode != mode_D) {
3055                                 if (tarval_ieee754_can_conv_lossless(tv0, mode_D) &&
3056                                     tarval_ieee754_can_conv_lossless(tv1, mode_D)) {
3057                                         mode = mode_D;
3058                                         tv0 = tarval_convert_to(tv0, mode);
3059                                         tv1 = tarval_convert_to(tv1, mode);
3060                                 }
3061                         }
3062                 }
3063
3064         }
3065
3066         tp = ia32_create_float_type(mode, 4);
3067         tp = ia32_create_float_array(tp);
3068
3069         ent = new_entity(get_glob_type(), ia32_unique_id(".LC%u"), tp);
3070
3071         set_entity_ld_ident(ent, get_entity_ident(ent));
3072         set_entity_visibility(ent, visibility_local);
3073         set_entity_variability(ent, variability_constant);
3074         set_entity_allocation(ent, allocation_static);
3075
3076         initializer = create_initializer_compound(2);
3077
3078         set_initializer_compound_value(initializer, 0, create_initializer_tarval(tv0));
3079         set_initializer_compound_value(initializer, 1, create_initializer_tarval(tv1));
3080
3081         set_entity_initializer(ent, initializer);
3082
3083         *new_mode = mode;
3084         return ent;
3085 }
3086
3087 /**
3088  * Transforms a Mux node into some code sequence.
3089  *
3090  * @return The transformed node.
3091  */
3092 static ir_node *gen_Mux(ir_node *node)
3093 {
3094         dbg_info *dbgi        = get_irn_dbg_info(node);
3095         ir_node  *block       = get_nodes_block(node);
3096         ir_node  *new_block   = be_transform_node(block);
3097         ir_node  *mux_true    = get_Mux_true(node);
3098         ir_node  *mux_false   = get_Mux_false(node);
3099         ir_node  *cond        = get_Mux_sel(node);
3100         ir_mode  *mode        = get_irn_mode(node);
3101         ir_node  *flags;
3102         ir_node  *new_node;
3103         pn_Cmp   pnc;
3104
3105         assert(get_irn_mode(cond) == mode_b);
3106
3107         /* Note: a Mux node uses a Load two times IFF it's used in the compare AND in the result */
3108         if (mode_is_float(mode)) {
3109                 ir_node  *cmp         = get_Proj_pred(cond);
3110                 ir_node  *cmp_left    = get_Cmp_left(cmp);
3111                 ir_node  *cmp_right   = get_Cmp_right(cmp);
3112                 pn_Cmp   pnc          = get_Proj_proj(cond);
3113
3114                 if (ia32_cg_config.use_sse2) {
3115                         if (pnc == pn_Cmp_Lt || pnc == pn_Cmp_Le) {
3116                                 if (cmp_left == mux_true && cmp_right == mux_false) {
3117                                         /* Mux(a <= b, a, b) => MIN */
3118                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMin,
3119                                          match_commutative | match_am | match_two_users);
3120                                 } else if (cmp_left == mux_false && cmp_right == mux_true) {
3121                                         /* Mux(a <= b, b, a) => MAX */
3122                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMax,
3123                                          match_commutative | match_am | match_two_users);
3124                                 }
3125                         } else if (pnc == pn_Cmp_Gt || pnc == pn_Cmp_Ge) {
3126                                 if (cmp_left == mux_true && cmp_right == mux_false) {
3127                                         /* Mux(a >= b, a, b) => MAX */
3128                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMax,
3129                                          match_commutative | match_am | match_two_users);
3130                                 } else if (cmp_left == mux_false && cmp_right == mux_true) {
3131                                         /* Mux(a >= b, b, a) => MIN */
3132                                         return gen_binop(node, cmp_left, cmp_right, new_bd_ia32_xMin,
3133                                          match_commutative | match_am | match_two_users);
3134                                 }
3135                         }
3136                 }
3137                 if (is_Const(mux_true) && is_Const(mux_false)) {
3138                         ia32_address_mode_t am;
3139                         ir_node             *load;
3140                         ir_mode             *new_mode;
3141                         unsigned            scale;
3142
3143                         flags    = get_flags_node(cond, &pnc);
3144                         new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_premuted=*/0);
3145
3146                         if (ia32_cg_config.use_sse2) {
3147                                 /* cannot load from different mode on SSE */
3148                                 new_mode = mode;
3149                         } else {
3150                                 /* x87 can load any mode */
3151                                 new_mode = NULL;
3152                         }
3153
3154                         am.addr.symconst_ent = ia32_create_const_array(mux_false, mux_true, &new_mode);
3155
3156                         switch (get_mode_size_bytes(new_mode)) {
3157                         case 4:
3158                                 scale = 2;
3159                                 break;
3160                         case 8:
3161                                 scale = 3;
3162                                 break;
3163                         case 10:
3164                                 /* use 2 * 5 */
3165                                 scale = 1;
3166                                 new_node = new_bd_ia32_Lea(dbgi, new_block, new_node, new_node);
3167                                 set_ia32_am_scale(new_node, 2);
3168                                 break;
3169                         case 12:
3170                                 /* use 4 * 3 */
3171                                 scale = 2;
3172                                 new_node = new_bd_ia32_Lea(dbgi, new_block, new_node, new_node);
3173                                 set_ia32_am_scale(new_node, 1);
3174                                 break;
3175                         case 16:
3176                                 /* arg, shift 16 NOT supported */
3177                                 scale = 3;
3178                                 new_node = new_bd_ia32_Add(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_node, new_node);
3179                                 break;
3180                         default:
3181                                 panic("Unsupported constant size");
3182                         }
3183
3184                         am.ls_mode            = new_mode;
3185                         am.addr.base          = noreg_GP;
3186                         am.addr.index         = new_node;
3187                         am.addr.mem           = nomem;
3188                         am.addr.offset        = 0;
3189                         am.addr.scale         = scale;
3190                         am.addr.use_frame     = 0;
3191                         am.addr.frame_entity  = NULL;
3192                         am.addr.symconst_sign = 0;
3193                         am.mem_proj           = am.addr.mem;
3194                         am.op_type            = ia32_AddrModeS;
3195                         am.new_op1            = NULL;
3196                         am.new_op2            = NULL;
3197                         am.pinned             = op_pin_state_floats;
3198                         am.commutative        = 1;
3199                         am.ins_permuted       = 0;
3200
3201                         if (ia32_cg_config.use_sse2)
3202                                 load = new_bd_ia32_xLoad(dbgi, block, am.addr.base, am.addr.index, am.addr.mem, new_mode);
3203                         else
3204                                 load = new_bd_ia32_vfld(dbgi, block, am.addr.base, am.addr.index, am.addr.mem, new_mode);
3205                         set_am_attributes(load, &am);
3206
3207                         return new_rd_Proj(NULL, block, load, mode_vfp, pn_ia32_res);
3208                 }
3209                 panic("cannot transform floating point Mux");
3210
3211         } else {
3212                 assert(ia32_mode_needs_gp_reg(mode));
3213
3214                 if (is_Proj(cond)) {
3215                         ir_node *cmp = get_Proj_pred(cond);
3216                         if (is_Cmp(cmp)) {
3217                                 ir_node  *cmp_left    = get_Cmp_left(cmp);
3218                                 ir_node  *cmp_right   = get_Cmp_right(cmp);
3219                                 pn_Cmp   pnc          = get_Proj_proj(cond);
3220
3221                                 /* check for unsigned Doz first */
3222                                 if ((pnc & pn_Cmp_Gt) && !mode_is_signed(mode) &&
3223                                         is_Const_0(mux_false) && is_Sub(mux_true) &&
3224                                         get_Sub_left(mux_true) == cmp_left && get_Sub_right(mux_true) == cmp_right) {
3225                                         /* Mux(a >=u b, a - b, 0) unsigned Doz */
3226                                         return create_Doz(node, cmp_left, cmp_right);
3227                                 } else if ((pnc & pn_Cmp_Lt) && !mode_is_signed(mode) &&
3228                                         is_Const_0(mux_true) && is_Sub(mux_false) &&
3229                                         get_Sub_left(mux_false) == cmp_left && get_Sub_right(mux_false) == cmp_right) {
3230                                         /* Mux(a <=u b, 0, a - b) unsigned Doz */
3231                                         return create_Doz(node, cmp_left, cmp_right);
3232                                 }
3233                         }
3234                 }
3235
3236                 flags = get_flags_node(cond, &pnc);
3237
3238                 if (is_Const(mux_true) && is_Const(mux_false)) {
3239                         /* both are const, good */
3240                         if (is_Const_1(mux_true) && is_Const_0(mux_false)) {
3241                                 new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_premuted=*/0);
3242                         } else if (is_Const_0(mux_true) && is_Const_1(mux_false)) {
3243                                 new_node = create_set_32bit(dbgi, new_block, flags, pnc, node, /*is_premuted=*/1);
3244                         } else {
3245                                 /* Not that simple. */
3246                                 goto need_cmov;
3247                         }
3248                 } else {
3249 need_cmov:
3250                         new_node = create_CMov(node, cond, flags, pnc);
3251                 }
3252                 return new_node;
3253         }
3254 }
3255
3256
3257 /**
3258  * Create a conversion from x87 state register to general purpose.
3259  */
3260 static ir_node *gen_x87_fp_to_gp(ir_node *node)
3261 {
3262         ir_node         *block      = be_transform_node(get_nodes_block(node));
3263         ir_node         *op         = get_Conv_op(node);
3264         ir_node         *new_op     = be_transform_node(op);
3265         ir_graph        *irg        = current_ir_graph;
3266         dbg_info        *dbgi       = get_irn_dbg_info(node);
3267         ir_mode         *mode       = get_irn_mode(node);
3268         ir_node         *fist, *load, *mem;
3269
3270         mem = gen_vfist(dbgi, block, get_irg_frame(irg), noreg_GP, nomem, new_op, &fist);
3271         set_irn_pinned(fist, op_pin_state_floats);
3272         set_ia32_use_frame(fist);
3273         set_ia32_op_type(fist, ia32_AddrModeD);
3274
3275         assert(get_mode_size_bits(mode) <= 32);
3276         /* exception we can only store signed 32 bit integers, so for unsigned
3277            we store a 64bit (signed) integer and load the lower bits */
3278         if (get_mode_size_bits(mode) == 32 && !mode_is_signed(mode)) {
3279                 set_ia32_ls_mode(fist, mode_Ls);
3280         } else {
3281                 set_ia32_ls_mode(fist, mode_Is);
3282         }
3283         SET_IA32_ORIG_NODE(fist, node);
3284
3285         /* do a Load */
3286         load = new_bd_ia32_Load(dbgi, block, get_irg_frame(irg), noreg_GP, mem);
3287
3288         set_irn_pinned(load, op_pin_state_floats);
3289         set_ia32_use_frame(load);
3290         set_ia32_op_type(load, ia32_AddrModeS);
3291         set_ia32_ls_mode(load, mode_Is);
3292         if (get_ia32_ls_mode(fist) == mode_Ls) {
3293                 ia32_attr_t *attr = get_ia32_attr(load);
3294                 attr->data.need_64bit_stackent = 1;
3295         } else {
3296                 ia32_attr_t *attr = get_ia32_attr(load);
3297                 attr->data.need_32bit_stackent = 1;
3298         }
3299         SET_IA32_ORIG_NODE(load, node);
3300
3301         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
3302 }
3303
3304 /**
3305  * Creates a x87 strict Conv by placing a Store and a Load
3306  */
3307 static ir_node *gen_x87_strict_conv(ir_mode *tgt_mode, ir_node *node)
3308 {
3309         ir_node  *block    = get_nodes_block(node);
3310         ir_graph *irg      = get_Block_irg(block);
3311         dbg_info *dbgi     = get_irn_dbg_info(node);
3312         ir_node  *frame    = get_irg_frame(irg);
3313         ir_node  *store, *load;
3314         ir_node  *new_node;
3315
3316         store = new_bd_ia32_vfst(dbgi, block, frame, noreg_GP, nomem, node, tgt_mode);
3317         set_ia32_use_frame(store);
3318         set_ia32_op_type(store, ia32_AddrModeD);
3319         SET_IA32_ORIG_NODE(store, node);
3320
3321         load = new_bd_ia32_vfld(dbgi, block, frame, noreg_GP, store, tgt_mode);
3322         set_ia32_use_frame(load);
3323         set_ia32_op_type(load, ia32_AddrModeS);
3324         SET_IA32_ORIG_NODE(load, node);
3325
3326         new_node = new_r_Proj(block, load, mode_E, pn_ia32_vfld_res);
3327         return new_node;
3328 }
3329
3330 static ir_node *create_Conv_I2I(dbg_info *dbgi, ir_node *block, ir_node *base,
3331                 ir_node *index, ir_node *mem, ir_node *val, ir_mode *mode)
3332 {
3333         ir_node *(*func)(dbg_info*, ir_node*, ir_node*, ir_node*, ir_node*, ir_node*, ir_mode*);
3334
3335         func = get_mode_size_bits(mode) == 8 ?
3336                 new_bd_ia32_Conv_I2I8Bit : new_bd_ia32_Conv_I2I;
3337         return func(dbgi, block, base, index, mem, val, mode);
3338 }
3339
3340 /**
3341  * Create a conversion from general purpose to x87 register
3342  */
3343 static ir_node *gen_x87_gp_to_fp(ir_node *node, ir_mode *src_mode)
3344 {
3345         ir_node  *src_block = get_nodes_block(node);
3346         ir_node  *block     = be_transform_node(src_block);
3347         ir_graph *irg       = get_Block_irg(block);
3348         dbg_info *dbgi      = get_irn_dbg_info(node);
3349         ir_node  *op        = get_Conv_op(node);
3350         ir_node  *new_op    = NULL;
3351         ir_mode  *mode;
3352         ir_mode  *store_mode;
3353         ir_node  *fild;
3354         ir_node  *store;
3355         ir_node  *new_node;
3356
3357         /* fild can use source AM if the operand is a signed 16bit or 32bit integer */
3358         if (possible_int_mode_for_fp(src_mode)) {
3359                 ia32_address_mode_t am;
3360
3361                 match_arguments(&am, src_block, NULL, op, NULL, match_am | match_try_am | match_16bit_am);
3362                 if (am.op_type == ia32_AddrModeS) {
3363                         ia32_address_t *addr = &am.addr;
3364
3365                         fild     = new_bd_ia32_vfild(dbgi, block, addr->base, addr->index, addr->mem);
3366                         new_node = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
3367
3368                         set_am_attributes(fild, &am);
3369                         SET_IA32_ORIG_NODE(fild, node);
3370
3371                         fix_mem_proj(fild, &am);
3372
3373                         return new_node;
3374                 }
3375         }
3376         if (new_op == NULL) {
3377                 new_op = be_transform_node(op);
3378         }
3379
3380         mode = get_irn_mode(op);
3381
3382         /* first convert to 32 bit signed if necessary */
3383         if (get_mode_size_bits(src_mode) < 32) {
3384                 if (!upper_bits_clean(new_op, src_mode)) {
3385                         new_op = create_Conv_I2I(dbgi, block, noreg_GP, noreg_GP, nomem, new_op, src_mode);
3386                         SET_IA32_ORIG_NODE(new_op, node);
3387                 }
3388                 mode = mode_Is;
3389         }
3390
3391         assert(get_mode_size_bits(mode) == 32);
3392
3393         /* do a store */
3394         store = new_bd_ia32_Store(dbgi, block, get_irg_frame(irg), noreg_GP, nomem, new_op);
3395
3396         set_ia32_use_frame(store);
3397         set_ia32_op_type(store, ia32_AddrModeD);
3398         set_ia32_ls_mode(store, mode_Iu);
3399
3400         /* exception for 32bit unsigned, do a 64bit spill+load */
3401         if (!mode_is_signed(mode)) {
3402                 ir_node *in[2];
3403                 /* store a zero */
3404                 ir_node *zero_const = ia32_create_Immediate(NULL, 0, 0);
3405
3406                 ir_node *zero_store = new_bd_ia32_Store(dbgi, block, get_irg_frame(irg),
3407                                                         noreg_GP, nomem, zero_const);
3408
3409                 set_ia32_use_frame(zero_store);
3410                 set_ia32_op_type(zero_store, ia32_AddrModeD);
3411                 add_ia32_am_offs_int(zero_store, 4);
3412                 set_ia32_ls_mode(zero_store, mode_Iu);
3413
3414                 in[0] = zero_store;
3415                 in[1] = store;
3416
3417                 store      = new_rd_Sync(dbgi, block, 2, in);
3418                 store_mode = mode_Ls;
3419         } else {
3420                 store_mode = mode_Is;
3421         }
3422
3423         /* do a fild */
3424         fild = new_bd_ia32_vfild(dbgi, block, get_irg_frame(irg), noreg_GP, store);
3425
3426         set_ia32_use_frame(fild);
3427         set_ia32_op_type(fild, ia32_AddrModeS);
3428         set_ia32_ls_mode(fild, store_mode);
3429
3430         new_node = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
3431
3432         return new_node;
3433 }
3434
3435 /**
3436  * Create a conversion from one integer mode into another one
3437  */
3438 static ir_node *create_I2I_Conv(ir_mode *src_mode, ir_mode *tgt_mode,
3439                                 dbg_info *dbgi, ir_node *block, ir_node *op,
3440                                 ir_node *node)
3441 {
3442         ir_node             *new_block = be_transform_node(block);
3443         ir_node             *new_node;
3444         ir_mode             *smaller_mode;
3445         ia32_address_mode_t  am;
3446         ia32_address_t      *addr = &am.addr;
3447
3448         (void) node;
3449         if (get_mode_size_bits(src_mode) < get_mode_size_bits(tgt_mode)) {
3450                 smaller_mode = src_mode;
3451         } else {
3452                 smaller_mode = tgt_mode;
3453         }
3454
3455 #ifdef DEBUG_libfirm
3456         if (is_Const(op)) {
3457                 ir_fprintf(stderr, "Optimisation warning: conv after constant %+F\n",
3458                            op);
3459         }
3460 #endif
3461
3462         match_arguments(&am, block, NULL, op, NULL,
3463                         match_am | match_8bit_am | match_16bit_am);
3464
3465         if (upper_bits_clean(am.new_op2, smaller_mode)) {
3466                 /* unnecessary conv. in theory it shouldn't have been AM */
3467                 assert(is_ia32_NoReg_GP(addr->base));
3468                 assert(is_ia32_NoReg_GP(addr->index));
3469                 assert(is_NoMem(addr->mem));
3470                 assert(am.addr.offset == 0);
3471                 assert(am.addr.symconst_ent == NULL);
3472                 return am.new_op2;
3473         }
3474
3475         new_node = create_Conv_I2I(dbgi, new_block, addr->base, addr->index,
3476                         addr->mem, am.new_op2, smaller_mode);
3477         set_am_attributes(new_node, &am);
3478         /* match_arguments assume that out-mode = in-mode, this isn't true here
3479          * so fix it */
3480         set_ia32_ls_mode(new_node, smaller_mode);
3481         SET_IA32_ORIG_NODE(new_node, node);
3482         new_node = fix_mem_proj(new_node, &am);
3483         return new_node;
3484 }
3485
3486 /**
3487  * Transforms a Conv node.
3488  *
3489  * @return The created ia32 Conv node
3490  */
3491 static ir_node *gen_Conv(ir_node *node)
3492 {
3493         ir_node  *block     = get_nodes_block(node);
3494         ir_node  *new_block = be_transform_node(block);
3495         ir_node  *op        = get_Conv_op(node);
3496         ir_node  *new_op    = NULL;
3497         dbg_info *dbgi      = get_irn_dbg_info(node);
3498         ir_mode  *src_mode  = get_irn_mode(op);
3499         ir_mode  *tgt_mode  = get_irn_mode(node);
3500         int       src_bits  = get_mode_size_bits(src_mode);
3501         int       tgt_bits  = get_mode_size_bits(tgt_mode);
3502         ir_node  *res       = NULL;
3503
3504         assert(!mode_is_int(src_mode) || src_bits <= 32);
3505         assert(!mode_is_int(tgt_mode) || tgt_bits <= 32);
3506
3507         if (src_mode == mode_b) {
3508                 assert(mode_is_int(tgt_mode) || mode_is_reference(tgt_mode));
3509                 /* nothing to do, we already model bools as 0/1 ints */
3510                 return be_transform_node(op);
3511         }
3512
3513         if (src_mode == tgt_mode) {
3514                 if (get_Conv_strict(node)) {
3515                         if (ia32_cg_config.use_sse2) {
3516                                 /* when we are in SSE mode, we can kill all strict no-op conversion */
3517                                 return be_transform_node(op);
3518                         }
3519                 } else {
3520                         /* this should be optimized already, but who knows... */
3521                         DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: conv %+F is pointless\n", node));
3522                         DB((dbg, LEVEL_1, "killed Conv(mode, mode) ..."));
3523                         return be_transform_node(op);
3524                 }
3525         }
3526
3527         if (mode_is_float(src_mode)) {
3528                 new_op = be_transform_node(op);
3529                 /* we convert from float ... */
3530                 if (mode_is_float(tgt_mode)) {
3531 #if 0
3532                         /* Matze: I'm a bit unsure what the following is for? seems wrong
3533                          * to me... */
3534                         if (src_mode == mode_E && tgt_mode == mode_D
3535                                         && !get_Conv_strict(node)) {
3536                                 DB((dbg, LEVEL_1, "killed Conv(mode, mode) ..."));
3537                                 return new_op;
3538                         }
3539 #endif
3540
3541                         /* ... to float */
3542                         if (ia32_cg_config.use_sse2) {
3543                                 DB((dbg, LEVEL_1, "create Conv(float, float) ..."));
3544                                 res = new_bd_ia32_Conv_FP2FP(dbgi, new_block, noreg_GP, noreg_GP,
3545                                                              nomem, new_op);
3546                                 set_ia32_ls_mode(res, tgt_mode);
3547                         } else {
3548                                 if (get_Conv_strict(node)) {
3549                                         /* if fp_no_float_fold is not set then we assume that we
3550                                          * don't have any float operations in a non
3551                                          * mode_float_arithmetic mode and can skip strict upconvs */
3552                                         if (src_bits < tgt_bits
3553                                                         && !(get_irg_fp_model(current_ir_graph) & fp_no_float_fold)) {
3554                                                 DB((dbg, LEVEL_1, "killed Conv(float, float) ..."));
3555                                                 return new_op;
3556                                         } else {
3557                                                 res = gen_x87_strict_conv(tgt_mode, new_op);
3558                                                 SET_IA32_ORIG_NODE(get_Proj_pred(res), node);
3559                                                 return res;
3560                                         }
3561                                 }
3562                                 DB((dbg, LEVEL_1, "killed Conv(float, float) ..."));
3563                                 return new_op;
3564                         }
3565                 } else {
3566                         /* ... to int */
3567                         DB((dbg, LEVEL_1, "create Conv(float, int) ..."));
3568                         if (ia32_cg_config.use_sse2) {
3569                                 res = new_bd_ia32_Conv_FP2I(dbgi, new_block, noreg_GP, noreg_GP,
3570                                                             nomem, new_op);
3571                                 set_ia32_ls_mode(res, src_mode);
3572                         } else {
3573                                 return gen_x87_fp_to_gp(node);
3574                         }
3575                 }
3576         } else {
3577                 /* we convert from int ... */
3578                 if (mode_is_float(tgt_mode)) {
3579                         /* ... to float */
3580                         DB((dbg, LEVEL_1, "create Conv(int, float) ..."));
3581                         if (ia32_cg_config.use_sse2) {
3582                                 new_op = be_transform_node(op);
3583                                 res = new_bd_ia32_Conv_I2FP(dbgi, new_block, noreg_GP, noreg_GP,
3584                                                             nomem, new_op);
3585                                 set_ia32_ls_mode(res, tgt_mode);
3586                         } else {
3587                                 unsigned int_mantissa   = get_mode_size_bits(src_mode) - (mode_is_signed(src_mode) ? 1 : 0);
3588                                 unsigned float_mantissa = tarval_ieee754_get_mantissa_size(tgt_mode);
3589                                 res = gen_x87_gp_to_fp(node, src_mode);
3590
3591                                 /* we need a strict-Conv, if the int mode has more bits than the
3592                                  * float mantissa */
3593                                 if (float_mantissa < int_mantissa) {
3594                                         res = gen_x87_strict_conv(tgt_mode, res);
3595                                         SET_IA32_ORIG_NODE(get_Proj_pred(res), node);
3596                                 }
3597                                 return res;
3598                         }
3599                 } else if (tgt_mode == mode_b) {
3600                         /* mode_b lowering already took care that we only have 0/1 values */
3601                         DB((dbg, LEVEL_1, "omitting unnecessary Conv(%+F, %+F) ...",
3602                             src_mode, tgt_mode));
3603                         return be_transform_node(op);
3604                 } else {
3605                         /* to int */
3606                         if (src_bits == tgt_bits) {
3607                                 DB((dbg, LEVEL_1, "omitting unnecessary Conv(%+F, %+F) ...",
3608                                     src_mode, tgt_mode));
3609                                 return be_transform_node(op);
3610                         }
3611
3612                         res = create_I2I_Conv(src_mode, tgt_mode, dbgi, block, op, node);
3613                         return res;
3614                 }
3615         }
3616
3617         return res;
3618 }
3619
3620 static ir_node *create_immediate_or_transform(ir_node *node,
3621                                               char immediate_constraint_type)
3622 {
3623         ir_node *new_node = try_create_Immediate(node, immediate_constraint_type);
3624         if (new_node == NULL) {
3625                 new_node = be_transform_node(node);
3626         }
3627         return new_node;
3628 }
3629
3630 /**
3631  * Transforms a FrameAddr into an ia32 Add.
3632  */
3633 static ir_node *gen_be_FrameAddr(ir_node *node)
3634 {
3635         ir_node  *block  = be_transform_node(get_nodes_block(node));
3636         ir_node  *op     = be_get_FrameAddr_frame(node);
3637         ir_node  *new_op = be_transform_node(op);
3638         dbg_info *dbgi   = get_irn_dbg_info(node);
3639         ir_node  *new_node;
3640
3641         new_node = new_bd_ia32_Lea(dbgi, block, new_op, noreg_GP);
3642         set_ia32_frame_ent(new_node, arch_get_frame_entity(node));
3643         set_ia32_use_frame(new_node);
3644
3645         SET_IA32_ORIG_NODE(new_node, node);
3646
3647         return new_node;
3648 }
3649
3650 /**
3651  * In case SSE is used we need to copy the result from XMM0 to FPU TOS before return.
3652  */
3653 static ir_node *gen_be_Return(ir_node *node)
3654 {
3655         ir_graph  *irg     = current_ir_graph;
3656         ir_node   *ret_val = get_irn_n(node, be_pos_Return_val);
3657         ir_node   *ret_mem = get_irn_n(node, be_pos_Return_mem);
3658         ir_entity *ent     = get_irg_entity(irg);
3659         ir_type   *tp      = get_entity_type(ent);
3660         dbg_info  *dbgi;
3661         ir_node   *block;
3662         ir_type   *res_type;
3663         ir_mode   *mode;
3664         ir_node   *frame, *sse_store, *fld, *mproj, *barrier;
3665         ir_node   *new_barrier, *new_ret_val, *new_ret_mem;
3666         ir_node   **in;
3667         int       pn_ret_val, pn_ret_mem, arity, i;
3668
3669         assert(ret_val != NULL);
3670         if (be_Return_get_n_rets(node) < 1 || ! ia32_cg_config.use_sse2) {
3671                 return be_duplicate_node(node);
3672         }
3673
3674         res_type = get_method_res_type(tp, 0);
3675
3676         if (! is_Primitive_type(res_type)) {
3677                 return be_duplicate_node(node);
3678         }
3679
3680         mode = get_type_mode(res_type);
3681         if (! mode_is_float(mode)) {
3682                 return be_duplicate_node(node);
3683         }
3684
3685         assert(get_method_n_ress(tp) == 1);
3686
3687         pn_ret_val = get_Proj_proj(ret_val);
3688         pn_ret_mem = get_Proj_proj(ret_mem);
3689
3690         /* get the Barrier */
3691         barrier = get_Proj_pred(ret_val);
3692
3693         /* get result input of the Barrier */
3694         ret_val     = get_irn_n(barrier, pn_ret_val);
3695         new_ret_val = be_transform_node(ret_val);
3696
3697         /* get memory input of the Barrier */
3698         ret_mem     = get_irn_n(barrier, pn_ret_mem);
3699         new_ret_mem = be_transform_node(ret_mem);
3700
3701         frame = get_irg_frame(irg);
3702
3703         dbgi  = get_irn_dbg_info(barrier);
3704         block = be_transform_node(get_nodes_block(barrier));
3705
3706         /* store xmm0 onto stack */
3707         sse_store = new_bd_ia32_xStoreSimple(dbgi, block, frame, noreg_GP,
3708                                              new_ret_mem, new_ret_val);
3709         set_ia32_ls_mode(sse_store, mode);
3710         set_ia32_op_type(sse_store, ia32_AddrModeD);
3711         set_ia32_use_frame(sse_store);
3712
3713         /* load into x87 register */
3714         fld = new_bd_ia32_vfld(dbgi, block, frame, noreg_GP, sse_store, mode);
3715         set_ia32_op_type(fld, ia32_AddrModeS);
3716         set_ia32_use_frame(fld);
3717
3718         mproj = new_r_Proj(block, fld, mode_M, pn_ia32_vfld_M);
3719         fld   = new_r_Proj(block, fld, mode_vfp, pn_ia32_vfld_res);
3720
3721         /* create a new barrier */
3722         arity = get_irn_arity(barrier);
3723         in    = ALLOCAN(ir_node*, arity);
3724         for (i = 0; i < arity; ++i) {
3725                 ir_node *new_in;
3726
3727                 if (i == pn_ret_val) {
3728                         new_in = fld;
3729                 } else if (i == pn_ret_mem) {
3730                         new_in = mproj;
3731                 } else {
3732                         ir_node *in = get_irn_n(barrier, i);
3733                         new_in = be_transform_node(in);
3734                 }
3735                 in[i] = new_in;
3736         }
3737
3738         new_barrier = new_ir_node(dbgi, irg, block,
3739                                   get_irn_op(barrier), get_irn_mode(barrier),
3740                                   arity, in);
3741         copy_node_attr(barrier, new_barrier);
3742         be_duplicate_deps(barrier, new_barrier);
3743         be_set_transformed_node(barrier, new_barrier);
3744
3745         /* transform normally */
3746         return be_duplicate_node(node);
3747 }
3748
3749 /**
3750  * Transform a be_AddSP into an ia32_SubSP.
3751  */
3752 static ir_node *gen_be_AddSP(ir_node *node)
3753 {
3754         ir_node  *sz = get_irn_n(node, be_pos_AddSP_size);
3755         ir_node  *sp = get_irn_n(node, be_pos_AddSP_old_sp);
3756
3757         return gen_binop(node, sp, sz, new_bd_ia32_SubSP,
3758                          match_am | match_immediate);
3759 }
3760
3761 /**
3762  * Transform a be_SubSP into an ia32_AddSP
3763  */
3764 static ir_node *gen_be_SubSP(ir_node *node)
3765 {
3766         ir_node  *sz = get_irn_n(node, be_pos_SubSP_size);
3767         ir_node  *sp = get_irn_n(node, be_pos_SubSP_old_sp);
3768
3769         return gen_binop(node, sp, sz, new_bd_ia32_AddSP,
3770                          match_am | match_immediate);
3771 }
3772
3773 /**
3774  * Change some phi modes
3775  */
3776 static ir_node *gen_Phi(ir_node *node)
3777 {
3778         ir_node  *block = be_transform_node(get_nodes_block(node));
3779         ir_graph *irg   = current_ir_graph;
3780         dbg_info *dbgi  = get_irn_dbg_info(node);
3781         ir_mode  *mode  = get_irn_mode(node);
3782         ir_node  *phi;
3783
3784         if (ia32_mode_needs_gp_reg(mode)) {
3785                 /* we shouldn't have any 64bit stuff around anymore */
3786                 assert(get_mode_size_bits(mode) <= 32);
3787                 /* all integer operations are on 32bit registers now */
3788                 mode = mode_Iu;
3789         } else if (mode_is_float(mode)) {
3790                 if (ia32_cg_config.use_sse2) {
3791                         mode = mode_xmm;
3792                 } else {
3793                         mode = mode_vfp;
3794                 }
3795         }
3796
3797         /* phi nodes allow loops, so we use the old arguments for now
3798          * and fix this later */
3799         phi = new_ir_node(dbgi, irg, block, op_Phi, mode, get_irn_arity(node),
3800                           get_irn_in(node) + 1);
3801         copy_node_attr(node, phi);
3802         be_duplicate_deps(node, phi);
3803
3804         be_enqueue_preds(node);
3805
3806         return phi;
3807 }
3808
3809 /**
3810  * Transform IJmp
3811  */
3812 static ir_node *gen_IJmp(ir_node *node)
3813 {
3814         ir_node  *block     = get_nodes_block(node);
3815         ir_node  *new_block = be_transform_node(block);
3816         dbg_info *dbgi      = get_irn_dbg_info(node);
3817         ir_node  *op        = get_IJmp_target(node);
3818         ir_node  *new_node;
3819         ia32_address_mode_t  am;
3820         ia32_address_t      *addr = &am.addr;
3821
3822         assert(get_irn_mode(op) == mode_P);
3823
3824         match_arguments(&am, block, NULL, op, NULL, match_am | match_immediate);
3825
3826         new_node = new_bd_ia32_IJmp(dbgi, new_block, addr->base, addr->index,
3827                         addr->mem, am.new_op2);
3828         set_am_attributes(new_node, &am);
3829         SET_IA32_ORIG_NODE(new_node, node);
3830
3831         new_node = fix_mem_proj(new_node, &am);
3832
3833         return new_node;
3834 }
3835
3836 /**
3837  * Transform a Bound node.
3838  */
3839 static ir_node *gen_Bound(ir_node *node)
3840 {
3841         ir_node  *new_node;
3842         ir_node  *lower = get_Bound_lower(node);
3843         dbg_info *dbgi  = get_irn_dbg_info(node);
3844
3845         if (is_Const_0(lower)) {
3846                 /* typical case for Java */
3847                 ir_node  *sub, *res, *flags, *block;
3848
3849                 res = gen_binop(node, get_Bound_index(node), get_Bound_upper(node),
3850                         new_bd_ia32_Sub, match_mode_neutral     | match_am | match_immediate);
3851
3852                 block = get_nodes_block(res);
3853                 if (! is_Proj(res)) {
3854                         sub = res;
3855                         set_irn_mode(sub, mode_T);
3856                         res = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_res);
3857                 } else {
3858                         sub = get_Proj_pred(res);
3859                 }
3860                 flags = new_rd_Proj(NULL, block, sub, mode_Iu, pn_ia32_Sub_flags);
3861                 new_node = new_bd_ia32_Jcc(dbgi, block, flags, pn_Cmp_Lt | ia32_pn_Cmp_unsigned);
3862                 SET_IA32_ORIG_NODE(new_node, node);
3863         } else {
3864                 panic("generic Bound not supported in ia32 Backend");
3865         }
3866         return new_node;
3867 }
3868
3869
3870 static ir_node *gen_ia32_l_ShlDep(ir_node *node)
3871 {
3872         ir_node *left  = get_irn_n(node, n_ia32_l_ShlDep_val);
3873         ir_node *right = get_irn_n(node, n_ia32_l_ShlDep_count);
3874
3875         return gen_shift_binop(node, left, right, new_bd_ia32_Shl,
3876                                match_immediate | match_mode_neutral);
3877 }
3878
3879 static ir_node *gen_ia32_l_ShrDep(ir_node *node)
3880 {
3881         ir_node *left  = get_irn_n(node, n_ia32_l_ShrDep_val);
3882         ir_node *right = get_irn_n(node, n_ia32_l_ShrDep_count);
3883         return gen_shift_binop(node, left, right, new_bd_ia32_Shr,
3884                                match_immediate);
3885 }
3886
3887 static ir_node *gen_ia32_l_SarDep(ir_node *node)
3888 {
3889         ir_node *left  = get_irn_n(node, n_ia32_l_SarDep_val);
3890         ir_node *right = get_irn_n(node, n_ia32_l_SarDep_count);
3891         return gen_shift_binop(node, left, right, new_bd_ia32_Sar,
3892                                match_immediate);
3893 }
3894
3895 static ir_node *gen_ia32_l_Add(ir_node *node)
3896 {
3897         ir_node *left    = get_irn_n(node, n_ia32_l_Add_left);
3898         ir_node *right   = get_irn_n(node, n_ia32_l_Add_right);
3899         ir_node *lowered = gen_binop(node, left, right, new_bd_ia32_Add,
3900                         match_commutative | match_am | match_immediate |
3901                         match_mode_neutral);
3902
3903         if (is_Proj(lowered)) {
3904                 lowered = get_Proj_pred(lowered);
3905         } else {
3906                 assert(is_ia32_Add(lowered));
3907                 set_irn_mode(lowered, mode_T);
3908         }
3909
3910         return lowered;
3911 }
3912
3913 static ir_node *gen_ia32_l_Adc(ir_node *node)
3914 {
3915         return gen_binop_flags(node, new_bd_ia32_Adc,
3916                         match_commutative | match_am | match_immediate |
3917                         match_mode_neutral);
3918 }
3919
3920 /**
3921  * Transforms a l_MulS into a "real" MulS node.
3922  *
3923  * @return the created ia32 Mul node
3924  */
3925 static ir_node *gen_ia32_l_Mul(ir_node *node)
3926 {
3927         ir_node *left  = get_binop_left(node);
3928         ir_node *right = get_binop_right(node);
3929
3930         return gen_binop(node, left, right, new_bd_ia32_Mul,
3931                          match_commutative | match_am | match_mode_neutral);
3932 }
3933
3934 /**
3935  * Transforms a l_IMulS into a "real" IMul1OPS node.
3936  *
3937  * @return the created ia32 IMul1OP node
3938  */
3939 static ir_node *gen_ia32_l_IMul(ir_node *node)
3940 {
3941         ir_node  *left  = get_binop_left(node);
3942         ir_node  *right = get_binop_right(node);
3943
3944         return gen_binop(node, left, right, new_bd_ia32_IMul1OP,
3945                          match_commutative | match_am | match_mode_neutral);
3946 }
3947
3948 static ir_node *gen_ia32_l_Sub(ir_node *node)
3949 {
3950         ir_node *left    = get_irn_n(node, n_ia32_l_Sub_minuend);
3951         ir_node *right   = get_irn_n(node, n_ia32_l_Sub_subtrahend);
3952         ir_node *lowered = gen_binop(node, left, right, new_bd_ia32_Sub,
3953                         match_am | match_immediate | match_mode_neutral);
3954
3955         if (is_Proj(lowered)) {
3956                 lowered = get_Proj_pred(lowered);
3957         } else {
3958                 assert(is_ia32_Sub(lowered));
3959                 set_irn_mode(lowered, mode_T);
3960         }
3961
3962         return lowered;
3963 }
3964
3965 static ir_node *gen_ia32_l_Sbb(ir_node *node)
3966 {
3967         return gen_binop_flags(node, new_bd_ia32_Sbb,
3968                         match_am | match_immediate | match_mode_neutral);
3969 }
3970
3971 /**
3972  * Transforms a l_ShlD/l_ShrD into a ShlD/ShrD. Those nodes have 3 data inputs:
3973  * op1 - target to be shifted
3974  * op2 - contains bits to be shifted into target
3975  * op3 - shift count
3976  * Only op3 can be an immediate.
3977  */
3978 static ir_node *gen_lowered_64bit_shifts(ir_node *node, ir_node *high,
3979                                          ir_node *low, ir_node *count)
3980 {
3981         ir_node  *block     = get_nodes_block(node);
3982         ir_node  *new_block = be_transform_node(block);
3983         dbg_info *dbgi      = get_irn_dbg_info(node);
3984         ir_node  *new_high  = be_transform_node(high);
3985         ir_node  *new_low   = be_transform_node(low);
3986         ir_node  *new_count;
3987         ir_node  *new_node;
3988
3989         /* the shift amount can be any mode that is bigger than 5 bits, since all
3990          * other bits are ignored anyway */
3991         while (is_Conv(count)              &&
3992                get_irn_n_edges(count) == 1 &&
3993                mode_is_int(get_irn_mode(count))) {
3994                 assert(get_mode_size_bits(get_irn_mode(count)) >= 5);
3995                 count = get_Conv_op(count);
3996         }
3997         new_count = create_immediate_or_transform(count, 0);
3998
3999         if (is_ia32_l_ShlD(node)) {
4000                 new_node = new_bd_ia32_ShlD(dbgi, new_block, new_high, new_low,
4001                                             new_count);
4002         } else {
4003                 new_node = new_bd_ia32_ShrD(dbgi, new_block, new_high, new_low,
4004                                             new_count);
4005         }
4006         SET_IA32_ORIG_NODE(new_node, node);
4007
4008         return new_node;
4009 }
4010
4011 static ir_node *gen_ia32_l_ShlD(ir_node *node)
4012 {
4013         ir_node *high  = get_irn_n(node, n_ia32_l_ShlD_val_high);
4014         ir_node *low   = get_irn_n(node, n_ia32_l_ShlD_val_low);
4015         ir_node *count = get_irn_n(node, n_ia32_l_ShlD_count);
4016         return gen_lowered_64bit_shifts(node, high, low, count);
4017 }
4018
4019 static ir_node *gen_ia32_l_ShrD(ir_node *node)
4020 {
4021         ir_node *high  = get_irn_n(node, n_ia32_l_ShrD_val_high);
4022         ir_node *low   = get_irn_n(node, n_ia32_l_ShrD_val_low);
4023         ir_node *count = get_irn_n(node, n_ia32_l_ShrD_count);
4024         return gen_lowered_64bit_shifts(node, high, low, count);
4025 }
4026
4027 static ir_node *gen_ia32_l_LLtoFloat(ir_node *node)
4028 {
4029         ir_node  *src_block    = get_nodes_block(node);
4030         ir_node  *block        = be_transform_node(src_block);
4031         ir_graph *irg          = current_ir_graph;
4032         dbg_info *dbgi         = get_irn_dbg_info(node);
4033         ir_node  *frame        = get_irg_frame(irg);
4034         ir_node  *val_low      = get_irn_n(node, n_ia32_l_LLtoFloat_val_low);
4035         ir_node  *val_high     = get_irn_n(node, n_ia32_l_LLtoFloat_val_high);
4036         ir_node  *new_val_low  = be_transform_node(val_low);
4037         ir_node  *new_val_high = be_transform_node(val_high);
4038         ir_node  *in[2];
4039         ir_node  *sync, *fild, *res;
4040         ir_node  *store_low, *store_high;
4041
4042         if (ia32_cg_config.use_sse2) {
4043                 panic("ia32_l_LLtoFloat not implemented for SSE2");
4044         }
4045
4046         /* do a store */
4047         store_low = new_bd_ia32_Store(dbgi, block, frame, noreg_GP, nomem,
4048                                       new_val_low);
4049         store_high = new_bd_ia32_Store(dbgi, block, frame, noreg_GP, nomem,
4050                                        new_val_high);
4051         SET_IA32_ORIG_NODE(store_low,  node);
4052         SET_IA32_ORIG_NODE(store_high, node);
4053
4054         set_ia32_use_frame(store_low);
4055         set_ia32_use_frame(store_high);
4056         set_ia32_op_type(store_low, ia32_AddrModeD);
4057         set_ia32_op_type(store_high, ia32_AddrModeD);
4058         set_ia32_ls_mode(store_low, mode_Iu);
4059         set_ia32_ls_mode(store_high, mode_Is);
4060         add_ia32_am_offs_int(store_high, 4);
4061
4062         in[0] = store_low;
4063         in[1] = store_high;
4064         sync  = new_rd_Sync(dbgi, block, 2, in);
4065
4066         /* do a fild */
4067         fild = new_bd_ia32_vfild(dbgi, block, frame, noreg_GP, sync);
4068
4069         set_ia32_use_frame(fild);
4070         set_ia32_op_type(fild, ia32_AddrModeS);
4071         set_ia32_ls_mode(fild, mode_Ls);
4072
4073         SET_IA32_ORIG_NODE(fild, node);
4074
4075         res = new_r_Proj(block, fild, mode_vfp, pn_ia32_vfild_res);
4076
4077         if (! mode_is_signed(get_irn_mode(val_high))) {
4078                 ia32_address_mode_t  am;
4079
4080                 ir_node *count = ia32_create_Immediate(NULL, 0, 31);
4081                 ir_node *fadd;
4082
4083                 am.addr.base          = noreg_GP;
4084                 am.addr.index         = new_bd_ia32_Shr(dbgi, block, new_val_high, count);
4085                 am.addr.mem           = nomem;
4086                 am.addr.offset        = 0;
4087                 am.addr.scale         = 2;
4088                 am.addr.symconst_ent  = ia32_gen_fp_known_const(ia32_ULLBIAS);
4089                 am.addr.use_frame     = 0;
4090                 am.addr.frame_entity  = NULL;
4091                 am.addr.symconst_sign = 0;
4092                 am.ls_mode            = mode_F;
4093                 am.mem_proj           = nomem;
4094                 am.op_type            = ia32_AddrModeS;
4095                 am.new_op1            = res;
4096                 am.new_op2            = ia32_new_NoReg_vfp(env_cg);
4097                 am.pinned             = op_pin_state_floats;
4098                 am.commutative        = 1;
4099                 am.ins_permuted       = 0;
4100
4101                 fadd  = new_bd_ia32_vfadd(dbgi, block, am.addr.base, am.addr.index, am.addr.mem,
4102                         am.new_op1, am.new_op2, get_fpcw());
4103                 set_am_attributes(fadd, &am);
4104
4105                 set_irn_mode(fadd, mode_T);
4106                 res = new_rd_Proj(NULL, block, fadd, mode_vfp, pn_ia32_res);
4107         }
4108         return res;
4109 }
4110
4111 static ir_node *gen_ia32_l_FloattoLL(ir_node *node)
4112 {
4113         ir_node  *src_block  = get_nodes_block(node);
4114         ir_node  *block      = be_transform_node(src_block);
4115         ir_graph *irg        = get_Block_irg(block);
4116         dbg_info *dbgi       = get_irn_dbg_info(node);
4117         ir_node  *frame      = get_irg_frame(irg);
4118         ir_node  *val        = get_irn_n(node, n_ia32_l_FloattoLL_val);
4119         ir_node  *new_val    = be_transform_node(val);
4120         ir_node  *fist, *mem;
4121
4122         mem = gen_vfist(dbgi, block, frame, noreg_GP, nomem, new_val, &fist);
4123         SET_IA32_ORIG_NODE(fist, node);
4124         set_ia32_use_frame(fist);
4125         set_ia32_op_type(fist, ia32_AddrModeD);
4126         set_ia32_ls_mode(fist, mode_Ls);
4127
4128         return mem;
4129 }
4130
4131 /**
4132  * the BAD transformer.
4133  */
4134 static ir_node *bad_transform(ir_node *node)
4135 {
4136         panic("No transform function for %+F available.", node);
4137         return NULL;
4138 }
4139
4140 static ir_node *gen_Proj_l_FloattoLL(ir_node *node)
4141 {
4142         ir_node  *block    = be_transform_node(get_nodes_block(node));
4143         ir_graph *irg      = get_Block_irg(block);
4144         ir_node  *pred     = get_Proj_pred(node);
4145         ir_node  *new_pred = be_transform_node(pred);
4146         ir_node  *frame    = get_irg_frame(irg);
4147         dbg_info *dbgi     = get_irn_dbg_info(node);
4148         long      pn       = get_Proj_proj(node);
4149         ir_node  *load;
4150         ir_node  *proj;
4151         ia32_attr_t *attr;
4152
4153         load = new_bd_ia32_Load(dbgi, block, frame, noreg_GP, new_pred);
4154         SET_IA32_ORIG_NODE(load, node);
4155         set_ia32_use_frame(load);
4156         set_ia32_op_type(load, ia32_AddrModeS);
4157         set_ia32_ls_mode(load, mode_Iu);
4158         /* we need a 64bit stackslot (fist stores 64bit) even though we only load
4159          * 32 bit from it with this particular load */
4160         attr = get_ia32_attr(load);
4161         attr->data.need_64bit_stackent = 1;
4162
4163         if (pn == pn_ia32_l_FloattoLL_res_high) {
4164                 add_ia32_am_offs_int(load, 4);
4165         } else {
4166                 assert(pn == pn_ia32_l_FloattoLL_res_low);
4167         }
4168
4169         proj = new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4170
4171         return proj;
4172 }
4173
4174 /**
4175  * Transform the Projs of an AddSP.
4176  */
4177 static ir_node *gen_Proj_be_AddSP(ir_node *node)
4178 {
4179         ir_node  *block    = be_transform_node(get_nodes_block(node));
4180         ir_node  *pred     = get_Proj_pred(node);
4181         ir_node  *new_pred = be_transform_node(pred);
4182         dbg_info *dbgi     = get_irn_dbg_info(node);
4183         long     proj      = get_Proj_proj(node);
4184
4185         if (proj == pn_be_AddSP_sp) {
4186                 ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4187                                            pn_ia32_SubSP_stack);
4188                 arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
4189                 return res;
4190         } else if (proj == pn_be_AddSP_res) {
4191                 return new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4192                                    pn_ia32_SubSP_addr);
4193         } else if (proj == pn_be_AddSP_M) {
4194                 return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_SubSP_M);
4195         }
4196
4197         panic("No idea how to transform proj->AddSP");
4198 }
4199
4200 /**
4201  * Transform the Projs of a SubSP.
4202  */
4203 static ir_node *gen_Proj_be_SubSP(ir_node *node)
4204 {
4205         ir_node  *block    = be_transform_node(get_nodes_block(node));
4206         ir_node  *pred     = get_Proj_pred(node);
4207         ir_node  *new_pred = be_transform_node(pred);
4208         dbg_info *dbgi     = get_irn_dbg_info(node);
4209         long     proj      = get_Proj_proj(node);
4210
4211         if (proj == pn_be_SubSP_sp) {
4212                 ir_node *res = new_rd_Proj(dbgi, block, new_pred, mode_Iu,
4213                                            pn_ia32_AddSP_stack);
4214                 arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
4215                 return res;
4216         } else if (proj == pn_be_SubSP_M) {
4217                 return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_AddSP_M);
4218         }
4219
4220         panic("No idea how to transform proj->SubSP");
4221 }
4222
4223 /**
4224  * Transform and renumber the Projs from a Load.
4225  */
4226 static ir_node *gen_Proj_Load(ir_node *node)
4227 {
4228         ir_node  *new_pred;
4229         ir_node  *block    = be_transform_node(get_nodes_block(node));
4230         ir_node  *pred     = get_Proj_pred(node);
4231         dbg_info *dbgi     = get_irn_dbg_info(node);
4232         long     proj      = get_Proj_proj(node);
4233
4234         /* loads might be part of source address mode matches, so we don't
4235          * transform the ProjMs yet (with the exception of loads whose result is
4236          * not used)
4237          */
4238         if (is_Load(pred) && proj == pn_Load_M && get_irn_n_edges(pred) > 1) {
4239                 ir_node *res;
4240                 ir_node *old_block = get_nodes_block(node);
4241
4242                 /* this is needed, because sometimes we have loops that are only
4243                    reachable through the ProjM */
4244                 be_enqueue_preds(node);
4245                 /* do it in 2 steps, to silence firm verifier */
4246                 res = new_rd_Proj(dbgi, old_block, pred, mode_M, pn_Load_M);
4247                 set_Proj_proj(res, pn_ia32_mem);
4248                 return res;
4249         }
4250
4251         /* renumber the proj */
4252         new_pred = be_transform_node(pred);
4253         if (is_ia32_Load(new_pred)) {
4254                 switch (proj) {
4255                 case pn_Load_res:
4256                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Load_res);
4257                 case pn_Load_M:
4258                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Load_M);
4259                 case pn_Load_X_regular:
4260                         return new_rd_Jmp(dbgi, block);
4261                 case pn_Load_X_except:
4262                         /* This Load might raise an exception. Mark it. */
4263                         set_ia32_exc_label(new_pred, 1);
4264                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Load_X_exc);
4265                 default:
4266                         break;
4267                 }
4268         } else if (is_ia32_Conv_I2I(new_pred) ||
4269                    is_ia32_Conv_I2I8Bit(new_pred)) {
4270                 set_irn_mode(new_pred, mode_T);
4271                 if (proj == pn_Load_res) {
4272                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_res);
4273                 } else if (proj == pn_Load_M) {
4274                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_mem);
4275                 }
4276         } else if (is_ia32_xLoad(new_pred)) {
4277                 switch (proj) {
4278                 case pn_Load_res:
4279                         return new_rd_Proj(dbgi, block, new_pred, mode_xmm, pn_ia32_xLoad_res);
4280                 case pn_Load_M:
4281                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_xLoad_M);
4282                 case pn_Load_X_regular:
4283                         return new_rd_Jmp(dbgi, block);
4284                 case pn_Load_X_except:
4285                         /* This Load might raise an exception. Mark it. */
4286                         set_ia32_exc_label(new_pred, 1);
4287                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_xLoad_X_exc);
4288                 default:
4289                         break;
4290                 }
4291         } else if (is_ia32_vfld(new_pred)) {
4292                 switch (proj) {
4293                 case pn_Load_res:
4294                         return new_rd_Proj(dbgi, block, new_pred, mode_vfp, pn_ia32_vfld_res);
4295                 case pn_Load_M:
4296                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_vfld_M);
4297                 case pn_Load_X_regular:
4298                         return new_rd_Jmp(dbgi, block);
4299                 case pn_Load_X_except:
4300                         /* This Load might raise an exception. Mark it. */
4301                         set_ia32_exc_label(new_pred, 1);
4302                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_xLoad_X_exc);
4303                 default:
4304                         break;
4305                 }
4306         } else {
4307                 /* can happen for ProJMs when source address mode happened for the
4308                    node */
4309
4310                 /* however it should not be the result proj, as that would mean the
4311                    load had multiple users and should not have been used for
4312                    SourceAM */
4313                 if (proj != pn_Load_M) {
4314                         panic("internal error: transformed node not a Load");
4315                 }
4316                 return new_rd_Proj(dbgi, block, new_pred, mode_M, 1);
4317         }
4318
4319         panic("No idea how to transform proj");
4320 }
4321
4322 /**
4323  * Transform and renumber the Projs from a DivMod like instruction.
4324  */
4325 static ir_node *gen_Proj_DivMod(ir_node *node)
4326 {
4327         ir_node  *block    = be_transform_node(get_nodes_block(node));
4328         ir_node  *pred     = get_Proj_pred(node);
4329         ir_node  *new_pred = be_transform_node(pred);
4330         dbg_info *dbgi     = get_irn_dbg_info(node);
4331         long     proj      = get_Proj_proj(node);
4332
4333         assert(is_ia32_Div(new_pred) || is_ia32_IDiv(new_pred));
4334
4335         switch (get_irn_opcode(pred)) {
4336         case iro_Div:
4337                 switch (proj) {
4338                 case pn_Div_M:
4339                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4340                 case pn_Div_res:
4341                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_div_res);
4342                 case pn_Div_X_regular:
4343                         return new_rd_Jmp(dbgi, block);
4344                 case pn_Div_X_except:
4345                         set_ia32_exc_label(new_pred, 1);
4346                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4347                 default:
4348                         break;
4349                 }
4350                 break;
4351         case iro_Mod:
4352                 switch (proj) {
4353                 case pn_Mod_M:
4354                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4355                 case pn_Mod_res:
4356                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_mod_res);
4357                 case pn_Mod_X_except:
4358                         set_ia32_exc_label(new_pred, 1);
4359                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4360                 default:
4361                         break;
4362                 }
4363                 break;
4364         case iro_DivMod:
4365                 switch (proj) {
4366                 case pn_DivMod_M:
4367                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_Div_M);
4368                 case pn_DivMod_res_div:
4369                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_div_res);
4370                 case pn_DivMod_res_mod:
4371                         return new_rd_Proj(dbgi, block, new_pred, mode_Iu, pn_ia32_Div_mod_res);
4372                 case pn_DivMod_X_regular:
4373                         return new_rd_Jmp(dbgi, block);
4374                 case pn_DivMod_X_except:
4375                         set_ia32_exc_label(new_pred, 1);
4376                         return new_rd_Proj(dbgi, block, new_pred, mode_X, pn_ia32_Div_X_exc);
4377                 default:
4378                         break;
4379                 }
4380                 break;
4381         default:
4382                 break;
4383         }
4384
4385         panic("No idea how to transform proj->DivMod");
4386 }
4387
4388 /**
4389  * Transform and renumber the Projs from a CopyB.
4390  */
4391 static ir_node *gen_Proj_CopyB(ir_node *node)
4392 {
4393         ir_node  *block    = be_transform_node(get_nodes_block(node));
4394         ir_node  *pred     = get_Proj_pred(node);
4395         ir_node  *new_pred = be_transform_node(pred);
4396         dbg_info *dbgi     = get_irn_dbg_info(node);
4397         long     proj      = get_Proj_proj(node);
4398
4399         switch (proj) {
4400         case pn_CopyB_M_regular:
4401                 if (is_ia32_CopyB_i(new_pred)) {
4402                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_CopyB_i_M);
4403                 } else if (is_ia32_CopyB(new_pred)) {
4404                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_CopyB_M);
4405                 }
4406                 break;
4407         default:
4408                 break;
4409         }
4410
4411         panic("No idea how to transform proj->CopyB");
4412 }
4413
4414 /**
4415  * Transform and renumber the Projs from a Quot.
4416  */
4417 static ir_node *gen_Proj_Quot(ir_node *node)
4418 {
4419         ir_node  *block    = be_transform_node(get_nodes_block(node));
4420         ir_node  *pred     = get_Proj_pred(node);
4421         ir_node  *new_pred = be_transform_node(pred);
4422         dbg_info *dbgi     = get_irn_dbg_info(node);
4423         long     proj      = get_Proj_proj(node);
4424
4425         switch (proj) {
4426         case pn_Quot_M:
4427                 if (is_ia32_xDiv(new_pred)) {
4428                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_xDiv_M);
4429                 } else if (is_ia32_vfdiv(new_pred)) {
4430                         return new_rd_Proj(dbgi, block, new_pred, mode_M, pn_ia32_vfdiv_M);
4431                 }
4432                 break;
4433         case pn_Quot_res:
4434                 if (is_ia32_xDiv(new_pred)) {
4435                         return new_rd_Proj(dbgi, block, new_pred, mode_xmm, pn_ia32_xDiv_res);
4436                 } else if (is_ia32_vfdiv(new_pred)) {
4437                         return new_rd_Proj(dbgi, block, new_pred, mode_vfp, pn_ia32_vfdiv_res);
4438                 }
4439                 break;
4440         case pn_Quot_X_regular:
4441         case pn_Quot_X_except:
4442         default:
4443                 break;
4444         }
4445
4446         panic("No idea how to transform proj->Quot");
4447 }
4448
4449 static ir_node *gen_be_Call(ir_node *node)
4450 {
4451         dbg_info       *const dbgi      = get_irn_dbg_info(node);
4452         ir_node        *const src_block = get_nodes_block(node);
4453         ir_node        *const block     = be_transform_node(src_block);
4454         ir_node        *const src_mem   = get_irn_n(node, be_pos_Call_mem);
4455         ir_node        *const src_sp    = get_irn_n(node, be_pos_Call_sp);
4456         ir_node        *const sp        = be_transform_node(src_sp);
4457         ir_node        *const src_ptr   = get_irn_n(node, be_pos_Call_ptr);
4458         ia32_address_mode_t   am;
4459         ia32_address_t *const addr      = &am.addr;
4460         ir_node        *      mem;
4461         ir_node        *      call;
4462         int                   i;
4463         ir_node        *      fpcw;
4464         ir_node        *      eax       = noreg_GP;
4465         ir_node        *      ecx       = noreg_GP;
4466         ir_node        *      edx       = noreg_GP;
4467         unsigned        const pop       = be_Call_get_pop(node);
4468         ir_type        *const call_tp   = be_Call_get_type(node);
4469         int                   old_no_pic_adjust;
4470
4471         /* Run the x87 simulator if the call returns a float value */
4472         if (get_method_n_ress(call_tp) > 0) {
4473                 ir_type *const res_type = get_method_res_type(call_tp, 0);
4474                 ir_mode *const res_mode = get_type_mode(res_type);
4475
4476                 if (res_mode != NULL && mode_is_float(res_mode)) {
4477                         env_cg->do_x87_sim = 1;
4478                 }
4479         }
4480
4481         /* We do not want be_Call direct calls */
4482         assert(be_Call_get_entity(node) == NULL);
4483
4484         /* special case for PIC trampoline calls */
4485         old_no_pic_adjust = no_pic_adjust;
4486         no_pic_adjust     = env_cg->birg->main_env->options->pic;
4487
4488         match_arguments(&am, src_block, NULL, src_ptr, src_mem,
4489                         match_am | match_immediate);
4490
4491         no_pic_adjust = old_no_pic_adjust;
4492
4493         i    = get_irn_arity(node) - 1;
4494         fpcw = be_transform_node(get_irn_n(node, i--));
4495         for (; i >= be_pos_Call_first_arg; --i) {
4496                 arch_register_req_t const *const req = arch_get_register_req(node, i);
4497                 ir_node *const reg_parm = be_transform_node(get_irn_n(node, i));
4498
4499                 assert(req->type == arch_register_req_type_limited);
4500                 assert(req->cls == &ia32_reg_classes[CLASS_ia32_gp]);
4501
4502                 switch (*req->limited) {
4503                         case 1 << REG_EAX: assert(eax == noreg_GP); eax = reg_parm; break;
4504                         case 1 << REG_ECX: assert(ecx == noreg_GP); ecx = reg_parm; break;
4505                         case 1 << REG_EDX: assert(edx == noreg_GP); edx = reg_parm; break;
4506                         default: panic("Invalid GP register for register parameter");
4507                 }
4508         }
4509
4510         mem  = transform_AM_mem(block, src_ptr, src_mem, addr->mem);
4511         call = new_bd_ia32_Call(dbgi, block, addr->base, addr->index, mem,
4512                                 am.new_op2, sp, fpcw, eax, ecx, edx, pop, call_tp);
4513         set_am_attributes(call, &am);
4514         call = fix_mem_proj(call, &am);
4515
4516         if (get_irn_pinned(node) == op_pin_state_pinned)
4517                 set_irn_pinned(call, op_pin_state_pinned);
4518
4519         SET_IA32_ORIG_NODE(call, node);
4520
4521         if (ia32_cg_config.use_sse2) {
4522                 /* remember this call for post-processing */
4523                 ARR_APP1(ir_node *, call_list, call);
4524                 ARR_APP1(ir_type *, call_types, be_Call_get_type(node));
4525         }
4526
4527         return call;
4528 }
4529
4530 /**
4531  * Transform Builtin trap
4532  */
4533 static ir_node *gen_trap(ir_node *node) {
4534         dbg_info *dbgi  = get_irn_dbg_info(node);
4535         ir_node *block  = be_transform_node(get_nodes_block(node));
4536         ir_node *mem    = be_transform_node(get_Builtin_mem(node));
4537
4538         return new_bd_ia32_UD2(dbgi, block, mem);
4539 }
4540
4541 /**
4542  * Transform Builtin debugbreak
4543  */
4544 static ir_node *gen_debugbreak(ir_node *node) {
4545         dbg_info *dbgi  = get_irn_dbg_info(node);
4546         ir_node *block  = be_transform_node(get_nodes_block(node));
4547         ir_node *mem    = be_transform_node(get_Builtin_mem(node));
4548
4549         return new_bd_ia32_Breakpoint(dbgi, block, mem);
4550 }
4551
4552 /**
4553  * Transform Builtin return_address
4554  */
4555 static ir_node *gen_return_address(ir_node *node) {
4556         ir_node *param      = get_Builtin_param(node, 0);
4557         ir_node *frame      = get_Builtin_param(node, 1);
4558         dbg_info *dbgi      = get_irn_dbg_info(node);
4559         tarval  *tv         = get_Const_tarval(param);
4560         unsigned long value = get_tarval_long(tv);
4561
4562         ir_node *block  = be_transform_node(get_nodes_block(node));
4563         ir_node *ptr    = be_transform_node(frame);
4564         ir_node *load;
4565
4566         if (value > 0) {
4567                 ir_node *cnt = new_bd_ia32_ProduceVal(dbgi, block);
4568                 ir_node *res = new_bd_ia32_ProduceVal(dbgi, block);
4569                 ptr = new_bd_ia32_ClimbFrame(dbgi, block, ptr, cnt, res, value);
4570         }
4571
4572         /* load the return address from this frame */
4573         load = new_bd_ia32_Load(dbgi, block, ptr, noreg_GP, nomem);
4574
4575         set_irn_pinned(load, get_irn_pinned(node));
4576         set_ia32_op_type(load, ia32_AddrModeS);
4577         set_ia32_ls_mode(load, mode_Iu);
4578
4579         set_ia32_am_offs_int(load, 0);
4580         set_ia32_use_frame(load);
4581         set_ia32_frame_ent(load, ia32_get_return_address_entity());
4582
4583         if (get_irn_pinned(node) == op_pin_state_floats) {
4584                 assert(pn_ia32_xLoad_res == pn_ia32_vfld_res
4585                                 && pn_ia32_vfld_res == pn_ia32_Load_res
4586                                 && pn_ia32_Load_res == pn_ia32_res);
4587                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
4588         }
4589
4590         SET_IA32_ORIG_NODE(load, node);
4591         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4592 }
4593
4594 /**
4595  * Transform Builtin frame_address
4596  */
4597 static ir_node *gen_frame_address(ir_node *node) {
4598         ir_node *param      = get_Builtin_param(node, 0);
4599         ir_node *frame      = get_Builtin_param(node, 1);
4600         dbg_info *dbgi      = get_irn_dbg_info(node);
4601         tarval  *tv         = get_Const_tarval(param);
4602         unsigned long value = get_tarval_long(tv);
4603
4604         ir_node *block  = be_transform_node(get_nodes_block(node));
4605         ir_node *ptr    = be_transform_node(frame);
4606         ir_node *load;
4607         ir_entity *ent;
4608
4609         if (value > 0) {
4610                 ir_node *cnt = new_bd_ia32_ProduceVal(dbgi, block);
4611                 ir_node *res = new_bd_ia32_ProduceVal(dbgi, block);
4612                 ptr = new_bd_ia32_ClimbFrame(dbgi, block, ptr, cnt, res, value);
4613         }
4614
4615         /* load the frame address from this frame */
4616         load = new_bd_ia32_Load(dbgi, block, ptr, noreg_GP, nomem);
4617
4618         set_irn_pinned(load, get_irn_pinned(node));
4619         set_ia32_op_type(load, ia32_AddrModeS);
4620         set_ia32_ls_mode(load, mode_Iu);
4621
4622         ent = ia32_get_frame_address_entity();
4623         if (ent != NULL) {
4624                 set_ia32_am_offs_int(load, 0);
4625                 set_ia32_use_frame(load);
4626                 set_ia32_frame_ent(load, ent);
4627         } else {
4628                 /* will fail anyway, but gcc does this: */
4629                 set_ia32_am_offs_int(load, 0);
4630         }
4631
4632         if (get_irn_pinned(node) == op_pin_state_floats) {
4633                 assert(pn_ia32_xLoad_res == pn_ia32_vfld_res
4634                                 && pn_ia32_vfld_res == pn_ia32_Load_res
4635                                 && pn_ia32_Load_res == pn_ia32_res);
4636                 arch_irn_add_flags(load, arch_irn_flags_rematerializable);
4637         }
4638
4639         SET_IA32_ORIG_NODE(load, node);
4640         return new_r_Proj(block, load, mode_Iu, pn_ia32_Load_res);
4641 }
4642
4643 /**
4644  * Transform Builtin frame_address
4645  */
4646 static ir_node *gen_prefetch(ir_node *node) {
4647         dbg_info       *dbgi;
4648         ir_node        *ptr, *block, *mem, *base, *index;
4649         ir_node        *param,  *new_node;
4650         long           rw, locality;
4651         tarval         *tv;
4652         ia32_address_t addr;
4653
4654         if (!ia32_cg_config.use_sse_prefetch && !ia32_cg_config.use_3dnow_prefetch) {
4655                 /* no prefetch at all, route memory */
4656                 return be_transform_node(get_Builtin_mem(node));
4657         }
4658
4659         param = get_Builtin_param(node, 1);
4660         tv    = get_Const_tarval(param);
4661         rw    = get_tarval_long(tv);
4662
4663         /* construct load address */
4664         memset(&addr, 0, sizeof(addr));
4665         ptr = get_Builtin_param(node, 0);
4666         ia32_create_address_mode(&addr, ptr, 0);
4667         base  = addr.base;
4668         index = addr.index;
4669
4670         if (base == NULL) {
4671                 base = noreg_GP;
4672         } else {
4673                 base = be_transform_node(base);
4674         }
4675
4676         if (index == NULL) {
4677                 index = noreg_GP;
4678         } else {
4679                 index = be_transform_node(index);
4680         }
4681
4682         dbgi     = get_irn_dbg_info(node);
4683         block    = be_transform_node(get_nodes_block(node));
4684         mem      = be_transform_node(get_Builtin_mem(node));
4685
4686         if (rw == 1 && ia32_cg_config.use_3dnow_prefetch) {
4687                 /* we have 3DNow!, this was already checked above */
4688                 new_node = new_bd_ia32_PrefetchW(dbgi, block, base, index, mem);
4689         } else if (ia32_cg_config.use_sse_prefetch) {
4690                 /* note: rw == 1 is IGNORED in that case */
4691                 param    = get_Builtin_param(node, 2);
4692                 tv       = get_Const_tarval(param);
4693                 locality = get_tarval_long(tv);
4694
4695                 /* SSE style prefetch */
4696                 switch (locality) {
4697                 case 0:
4698                         new_node = new_bd_ia32_PrefetchNTA(dbgi, block, base, index, mem);
4699                         break;
4700                 case 1:
4701                         new_node = new_bd_ia32_Prefetch2(dbgi, block, base, index, mem);
4702                         break;
4703                 case 2:
4704                         new_node = new_bd_ia32_Prefetch1(dbgi, block, base, index, mem);
4705                         break;
4706                 default:
4707                         new_node = new_bd_ia32_Prefetch0(dbgi, block, base, index, mem);
4708                         break;
4709                 }
4710         } else {
4711                 assert(ia32_cg_config.use_3dnow_prefetch);
4712                 /* 3DNow! style prefetch */
4713                 new_node = new_bd_ia32_Prefetch(dbgi, block, base, index, mem);
4714         }
4715
4716         set_irn_pinned(new_node, get_irn_pinned(node));
4717         set_ia32_op_type(new_node, ia32_AddrModeS);
4718         set_ia32_ls_mode(new_node, mode_Bu);
4719         set_address(new_node, &addr);
4720
4721         SET_IA32_ORIG_NODE(new_node, node);
4722
4723         be_dep_on_frame(new_node);
4724         return new_r_Proj(block, new_node, mode_M, pn_ia32_Prefetch_M);
4725 }
4726
4727 /**
4728  * Transform bsf like node
4729  */
4730 static ir_node *gen_unop_AM(ir_node *node, construct_binop_dest_func *func)
4731 {
4732         ir_node *param     = get_Builtin_param(node, 0);
4733         dbg_info *dbgi     = get_irn_dbg_info(node);
4734
4735         ir_node *block     = get_nodes_block(node);
4736         ir_node *new_block = be_transform_node(block);
4737
4738         ia32_address_mode_t  am;
4739         ia32_address_t      *addr = &am.addr;
4740         ir_node             *cnt;
4741
4742         match_arguments(&am, block, NULL, param, NULL, match_am);
4743
4744         cnt = func(dbgi, new_block, addr->base, addr->index, addr->mem, am.new_op2);
4745         set_am_attributes(cnt, &am);
4746         set_ia32_ls_mode(cnt, get_irn_mode(param));
4747
4748         SET_IA32_ORIG_NODE(cnt, node);
4749         return fix_mem_proj(cnt, &am);
4750 }
4751
4752 /**
4753  * Transform builtin ffs.
4754  */
4755 static ir_node *gen_ffs(ir_node *node)
4756 {
4757         ir_node  *bsf   = gen_unop_AM(node, new_bd_ia32_Bsf);
4758         ir_node  *real  = skip_Proj(bsf);
4759         dbg_info *dbgi  = get_irn_dbg_info(real);
4760         ir_node  *block = get_nodes_block(real);
4761         ir_node  *flag, *set, *conv, *neg, *or;
4762
4763         /* bsf x */
4764         if (get_irn_mode(real) != mode_T) {
4765                 set_irn_mode(real, mode_T);
4766                 bsf = new_r_Proj(block, real, mode_Iu, pn_ia32_res);
4767         }
4768
4769         flag = new_r_Proj(block, real, mode_b, pn_ia32_flags);
4770
4771         /* sete */
4772         set = new_bd_ia32_Set(dbgi, block, flag, pn_Cmp_Eq, 0);
4773         SET_IA32_ORIG_NODE(set, node);
4774
4775         /* conv to 32bit */
4776         conv = new_bd_ia32_Conv_I2I8Bit(dbgi, block, noreg_GP, noreg_GP, nomem, set, mode_Bu);
4777         SET_IA32_ORIG_NODE(conv, node);
4778
4779         /* neg */
4780         neg = new_bd_ia32_Neg(dbgi, block, conv);
4781
4782         /* or */
4783         or = new_bd_ia32_Or(dbgi, block, noreg_GP, noreg_GP, nomem, bsf, neg);
4784         set_ia32_commutative(or);
4785
4786         /* add 1 */
4787         return new_bd_ia32_Add(dbgi, block, noreg_GP, noreg_GP, nomem, or, ia32_create_Immediate(NULL, 0, 1));
4788 }
4789
4790 /**
4791  * Transform builtin clz.
4792  */
4793 static ir_node *gen_clz(ir_node *node)
4794 {
4795         ir_node  *bsr   = gen_unop_AM(node, new_bd_ia32_Bsr);
4796         ir_node  *real  = skip_Proj(bsr);
4797         dbg_info *dbgi  = get_irn_dbg_info(real);
4798         ir_node  *block = get_nodes_block(real);
4799         ir_node  *imm   = ia32_create_Immediate(NULL, 0, 31);
4800
4801         return new_bd_ia32_Xor(dbgi, block, noreg_GP, noreg_GP, nomem, bsr, imm);
4802 }
4803
4804 /**
4805  * Transform builtin ctz.
4806  */
4807 static ir_node *gen_ctz(ir_node *node)
4808 {
4809         return gen_unop_AM(node, new_bd_ia32_Bsf);
4810 }
4811
4812 /**
4813  * Transform builtin parity.
4814  */
4815 static ir_node *gen_parity(ir_node *node)
4816 {
4817         ir_node *param      = get_Builtin_param(node, 0);
4818         dbg_info *dbgi      = get_irn_dbg_info(node);
4819
4820         ir_node *block      = get_nodes_block(node);
4821
4822         ir_node *new_block  = be_transform_node(block);
4823         ir_node *imm, *cmp, *new_node;
4824
4825         ia32_address_mode_t am;
4826         ia32_address_t      *addr = &am.addr;
4827
4828
4829         /* cmp param, 0 */
4830         match_arguments(&am, block, NULL, param, NULL, match_am);
4831         imm = ia32_create_Immediate(NULL, 0, 0);
4832         cmp = new_bd_ia32_Cmp(dbgi, new_block, addr->base, addr->index,
4833                               addr->mem, imm, am.new_op2, am.ins_permuted, 0);
4834         set_am_attributes(cmp, &am);
4835         set_ia32_ls_mode(cmp, mode_Iu);
4836
4837         SET_IA32_ORIG_NODE(cmp, node);
4838
4839         cmp = fix_mem_proj(cmp, &am);
4840
4841         /* setp */
4842         new_node = new_bd_ia32_Set(dbgi, new_block, cmp, ia32_pn_Cmp_parity, 0);
4843         SET_IA32_ORIG_NODE(new_node, node);
4844
4845         /* conv to 32bit */
4846         new_node = new_bd_ia32_Conv_I2I8Bit(dbgi, new_block, noreg_GP, noreg_GP,
4847                                             nomem, new_node, mode_Bu);
4848         SET_IA32_ORIG_NODE(new_node, node);
4849         return new_node;
4850 }
4851
4852 /**
4853  * Transform builtin popcount
4854  */
4855 static ir_node *gen_popcount(ir_node *node) {
4856         ir_node *param     = get_Builtin_param(node, 0);
4857         dbg_info *dbgi     = get_irn_dbg_info(node);
4858
4859         ir_node *block     = get_nodes_block(node);
4860         ir_node *new_block = be_transform_node(block);
4861
4862         ir_node *new_param;
4863         ir_node *imm, *simm, *m1, *s1, *s2, *s3, *s4, *s5, *m2, *m3, *m4, *m5, *m6, *m7, *m8, *m9, *m10, *m11, *m12, *m13;
4864
4865         /* check for SSE4.2 or SSE4a and use the popcnt instruction */
4866         if (ia32_cg_config.use_popcnt) {
4867                 ia32_address_mode_t am;
4868                 ia32_address_t      *addr = &am.addr;
4869                 ir_node             *cnt;
4870
4871                 match_arguments(&am, block, NULL, param, NULL, match_am | match_16bit_am);
4872
4873                 cnt = new_bd_ia32_Popcnt(dbgi, new_block, addr->base, addr->index, addr->mem, am.new_op2);
4874                 set_am_attributes(cnt, &am);
4875                 set_ia32_ls_mode(cnt, get_irn_mode(param));
4876
4877                 SET_IA32_ORIG_NODE(cnt, node);
4878                 return fix_mem_proj(cnt, &am);
4879         }
4880
4881         new_param = be_transform_node(param);
4882
4883         /* do the standard popcount algo */
4884
4885         /* m1 = x & 0x55555555 */
4886         imm = ia32_create_Immediate(NULL, 0, 0x55555555);
4887         m1 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_param, imm);
4888
4889         /* s1 = x >> 1 */
4890         simm = ia32_create_Immediate(NULL, 0, 1);
4891         s1 = new_bd_ia32_Shl(dbgi, new_block, new_param, simm);
4892
4893         /* m2 = s1 & 0x55555555 */
4894         m2 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s1, imm);
4895
4896         /* m3 = m1 + m2 */
4897         m3 = new_bd_ia32_Lea(dbgi, new_block, m2, m1);
4898
4899         /* m4 = m3 & 0x33333333 */
4900         imm = ia32_create_Immediate(NULL, 0, 0x33333333);
4901         m4 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m3, imm);
4902
4903         /* s2 = m3 >> 2 */
4904         simm = ia32_create_Immediate(NULL, 0, 2);
4905         s2 = new_bd_ia32_Shl(dbgi, new_block, m3, simm);
4906
4907         /* m5 = s2 & 0x33333333 */
4908         m5 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s2, imm);
4909
4910         /* m6 = m4 + m5 */
4911         m6 = new_bd_ia32_Lea(dbgi, new_block, m4, m5);
4912
4913         /* m7 = m6 & 0x0F0F0F0F */
4914         imm = ia32_create_Immediate(NULL, 0, 0x0F0F0F0F);
4915         m7 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m6, imm);
4916
4917         /* s3 = m6 >> 4 */
4918         simm = ia32_create_Immediate(NULL, 0, 4);
4919         s3 = new_bd_ia32_Shl(dbgi, new_block, m6, simm);
4920
4921         /* m8 = s3 & 0x0F0F0F0F */
4922         m8 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s3, imm);
4923
4924         /* m9 = m7 + m8 */
4925         m9 = new_bd_ia32_Lea(dbgi, new_block, m7, m8);
4926
4927         /* m10 = m9 & 0x00FF00FF */
4928         imm = ia32_create_Immediate(NULL, 0, 0x00FF00FF);
4929         m10 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m9, imm);
4930
4931         /* s4 = m9 >> 8 */
4932         simm = ia32_create_Immediate(NULL, 0, 8);
4933         s4 = new_bd_ia32_Shl(dbgi, new_block, m9, simm);
4934
4935         /* m11 = s4 & 0x00FF00FF */
4936         m11 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s4, imm);
4937
4938         /* m12 = m10 + m11 */
4939         m12 = new_bd_ia32_Lea(dbgi, new_block, m10, m11);
4940
4941         /* m13 = m12 & 0x0000FFFF */
4942         imm = ia32_create_Immediate(NULL, 0, 0x0000FFFF);
4943         m13 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, m12, imm);
4944
4945         /* s5 = m12 >> 16 */
4946         simm = ia32_create_Immediate(NULL, 0, 16);
4947         s5 = new_bd_ia32_Shl(dbgi, new_block, m12, simm);
4948
4949         /* res = m13 + s5 */
4950         return new_bd_ia32_Lea(dbgi, new_block, m13, s5);
4951 }
4952
4953 /**
4954  * Transform builtin byte swap.
4955  */
4956 static ir_node *gen_bswap(ir_node *node) {
4957         ir_node *param     = be_transform_node(get_Builtin_param(node, 0));
4958         dbg_info *dbgi     = get_irn_dbg_info(node);
4959
4960         ir_node *block     = get_nodes_block(node);
4961         ir_node *new_block = be_transform_node(block);
4962         ir_mode *mode      = get_irn_mode(param);
4963         unsigned size      = get_mode_size_bits(mode);
4964         ir_node  *m1, *m2, *m3, *m4, *s1, *s2, *s3, *s4;
4965
4966         switch (size) {
4967         case 32:
4968                 if (ia32_cg_config.use_i486) {
4969                         /* swap available */
4970                         return new_bd_ia32_Bswap(dbgi, new_block, param);
4971                 }
4972                 s1 = new_bd_ia32_Shl(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 24));
4973                 s2 = new_bd_ia32_Shl(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 8));
4974
4975                 m1 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s2, ia32_create_Immediate(NULL, 0, 0xFF00));
4976                 m2 = new_bd_ia32_Lea(dbgi, new_block, s1, m1);
4977
4978                 s3 = new_bd_ia32_Shr(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 8));
4979
4980                 m3 = new_bd_ia32_And(dbgi, new_block, noreg_GP, noreg_GP, nomem, s3, ia32_create_Immediate(NULL, 0, 0xFF0000));
4981                 m4 = new_bd_ia32_Lea(dbgi, new_block, m2, m3);
4982
4983                 s4 = new_bd_ia32_Shr(dbgi, new_block, param, ia32_create_Immediate(NULL, 0, 24));
4984                 return new_bd_ia32_Lea(dbgi, new_block, m4, s4);
4985
4986         case 16:
4987                 /* swap16 always available */
4988                 return new_bd_ia32_Bswap16(dbgi, new_block, param);
4989
4990         default:
4991                 panic("Invalid bswap size (%d)", size);
4992         }
4993 }
4994
4995 /**
4996  * Transform builtin outport.
4997  */
4998 static ir_node *gen_outport(ir_node *node) {
4999         ir_node *port  = create_immediate_or_transform(get_Builtin_param(node, 0), 0);
5000         ir_node *oldv  = get_Builtin_param(node, 1);
5001         ir_mode *mode  = get_irn_mode(oldv);
5002         ir_node *value = be_transform_node(oldv);
5003         ir_node *block = be_transform_node(get_nodes_block(node));
5004         ir_node *mem   = be_transform_node(get_Builtin_mem(node));
5005         dbg_info *dbgi = get_irn_dbg_info(node);
5006
5007         ir_node *res = new_bd_ia32_Outport(dbgi, block, port, value, mem);
5008         set_ia32_ls_mode(res, mode);
5009         return res;
5010 }
5011
5012 /**
5013  * Transform builtin inport.
5014  */
5015 static ir_node *gen_inport(ir_node *node) {
5016         ir_type *tp    = get_Builtin_type(node);
5017         ir_type *rstp  = get_method_res_type(tp, 0);
5018         ir_mode *mode  = get_type_mode(rstp);
5019         ir_node *port  = create_immediate_or_transform(get_Builtin_param(node, 0), 0);
5020         ir_node *block = be_transform_node(get_nodes_block(node));
5021         ir_node *mem   = be_transform_node(get_Builtin_mem(node));
5022         dbg_info *dbgi = get_irn_dbg_info(node);
5023
5024         ir_node *res = new_bd_ia32_Inport(dbgi, block, port, mem);
5025         set_ia32_ls_mode(res, mode);
5026
5027         /* check for missing Result Proj */
5028         return res;
5029 }
5030
5031 /**
5032  * Transform a builtin inner trampoline
5033  */
5034 static ir_node *gen_inner_trampoline(ir_node *node) {
5035         ir_node  *ptr       = get_Builtin_param(node, 0);
5036         ir_node  *callee    = get_Builtin_param(node, 1);
5037         ir_node  *env       = be_transform_node(get_Builtin_param(node, 2));
5038         ir_node  *mem       = get_Builtin_mem(node);
5039         ir_node  *block     = get_nodes_block(node);
5040         ir_node  *new_block = be_transform_node(block);
5041         ir_node  *val;
5042         ir_node  *store;
5043         ir_node  *rel;
5044         ir_node  *trampoline;
5045         ir_node  *in[2];
5046         dbg_info *dbgi      = get_irn_dbg_info(node);
5047         ia32_address_t addr;
5048
5049         /* construct store address */
5050         memset(&addr, 0, sizeof(addr));
5051         ia32_create_address_mode(&addr, ptr, 0);
5052
5053         if (addr.base == NULL) {
5054                 addr.base = noreg_GP;
5055         } else {
5056                 addr.base = be_transform_node(addr.base);
5057         }
5058
5059         if (addr.index == NULL) {
5060                 addr.index = noreg_GP;
5061         } else {
5062                 addr.index = be_transform_node(addr.index);
5063         }
5064         addr.mem = be_transform_node(mem);
5065
5066         /* mov  ecx, <env> */
5067         val   = ia32_create_Immediate(NULL, 0, 0xB9);
5068         store = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
5069                                       addr.index, addr.mem, val);
5070         set_irn_pinned(store, get_irn_pinned(node));
5071         set_ia32_op_type(store, ia32_AddrModeD);
5072         set_ia32_ls_mode(store, mode_Bu);
5073         set_address(store, &addr);
5074         addr.mem = store;
5075         addr.offset += 1;
5076
5077         store = new_bd_ia32_Store(dbgi, new_block, addr.base,
5078                                   addr.index, addr.mem, env);
5079         set_irn_pinned(store, get_irn_pinned(node));
5080         set_ia32_op_type(store, ia32_AddrModeD);
5081         set_ia32_ls_mode(store, mode_Iu);
5082         set_address(store, &addr);
5083         addr.mem = store;
5084         addr.offset += 4;
5085
5086         /* jmp rel <callee> */
5087         val   = ia32_create_Immediate(NULL, 0, 0xE9);
5088         store = new_bd_ia32_Store8Bit(dbgi, new_block, addr.base,
5089                                      addr.index, addr.mem, val);
5090         set_irn_pinned(store, get_irn_pinned(node));
5091         set_ia32_op_type(store, ia32_AddrModeD);
5092         set_ia32_ls_mode(store, mode_Bu);
5093         set_address(store, &addr);
5094         addr.mem = store;
5095         addr.offset += 1;
5096
5097         trampoline = be_transform_node(ptr);
5098
5099         /* the callee is typically an immediate */
5100         if (is_SymConst(callee)) {
5101                 rel = new_bd_ia32_Const(dbgi, new_block, get_SymConst_entity(callee), 0, 0, -10);
5102         } else {
5103                 rel = new_bd_ia32_Lea(dbgi, new_block, be_transform_node(callee), ia32_create_Immediate(NULL, 0, -10));
5104         }
5105         rel = new_bd_ia32_Sub(dbgi, new_block, noreg_GP, noreg_GP, nomem, rel, trampoline);
5106
5107         store = new_bd_ia32_Store(dbgi, new_block, addr.base,
5108                                   addr.index, addr.mem, rel);
5109         set_irn_pinned(store, get_irn_pinned(node));
5110         set_ia32_op_type(store, ia32_AddrModeD);
5111         set_ia32_ls_mode(store, mode_Iu);
5112         set_address(store, &addr);
5113
5114         in[0] = store;
5115         in[1] = trampoline;
5116
5117         return new_r_Tuple(new_block, 2, in);
5118 }
5119
5120 /**
5121  * Transform Builtin node.
5122  */
5123 static ir_node *gen_Builtin(ir_node *node) {
5124         ir_builtin_kind kind = get_Builtin_kind(node);
5125
5126         switch (kind) {
5127         case ir_bk_trap:
5128                 return gen_trap(node);
5129         case ir_bk_debugbreak:
5130                 return gen_debugbreak(node);
5131         case ir_bk_return_address:
5132                 return gen_return_address(node);
5133         case ir_bk_frame_address:
5134                 return gen_frame_address(node);
5135         case ir_bk_prefetch:
5136                 return gen_prefetch(node);
5137         case ir_bk_ffs:
5138                 return gen_ffs(node);
5139         case ir_bk_clz:
5140                 return gen_clz(node);
5141         case ir_bk_ctz:
5142                 return gen_ctz(node);
5143         case ir_bk_parity:
5144                 return gen_parity(node);
5145         case ir_bk_popcount:
5146                 return gen_popcount(node);
5147         case ir_bk_bswap:
5148                 return gen_bswap(node);
5149         case ir_bk_outport:
5150                 return gen_outport(node);
5151         case ir_bk_inport:
5152                 return gen_inport(node);
5153         case ir_bk_inner_trampoline:
5154                 return gen_inner_trampoline(node);
5155         }
5156         panic("Builtin %s not implemented in IA32", get_builtin_kind_name(kind));
5157 }
5158
5159 /**
5160  * Transform Proj(Builtin) node.
5161  */
5162 static ir_node *gen_Proj_Builtin(ir_node *proj) {
5163         ir_node         *node     = get_Proj_pred(proj);
5164         ir_node         *new_node = be_transform_node(node);
5165         ir_builtin_kind kind      = get_Builtin_kind(node);
5166
5167         switch (kind) {
5168         case ir_bk_return_address:
5169         case ir_bk_frame_address:
5170         case ir_bk_ffs:
5171         case ir_bk_clz:
5172         case ir_bk_ctz:
5173         case ir_bk_parity:
5174         case ir_bk_popcount:
5175         case ir_bk_bswap:
5176                 assert(get_Proj_proj(proj) == pn_Builtin_1_result);
5177                 return new_node;
5178         case ir_bk_trap:
5179         case ir_bk_debugbreak:
5180         case ir_bk_prefetch:
5181         case ir_bk_outport:
5182                 assert(get_Proj_proj(proj) == pn_Builtin_M);
5183                 return new_node;
5184         case ir_bk_inport:
5185                 if (get_Proj_proj(proj) == pn_Builtin_1_result) {
5186                         return new_r_Proj(get_nodes_block(new_node),
5187                                           new_node, get_irn_mode(proj), pn_ia32_Inport_res);
5188                 } else {
5189                         assert(get_Proj_proj(proj) == pn_Builtin_M);
5190                         return new_r_Proj(get_nodes_block(new_node),
5191                                 new_node, mode_M, pn_ia32_Inport_M);
5192                 }
5193         case ir_bk_inner_trampoline:
5194                 if (get_Proj_proj(proj) == pn_Builtin_1_result) {
5195                         return get_Tuple_pred(new_node, 1);
5196                 } else {
5197                         assert(get_Proj_proj(proj) == pn_Builtin_M);
5198                         return get_Tuple_pred(new_node, 0);
5199                 }
5200         }
5201         panic("Builtin %s not implemented in IA32", get_builtin_kind_name(kind));
5202 }
5203
5204 static ir_node *gen_be_IncSP(ir_node *node)
5205 {
5206         ir_node *res = be_duplicate_node(node);
5207         arch_irn_add_flags(res, arch_irn_flags_modify_flags);
5208
5209         return res;
5210 }
5211
5212 /**
5213  * Transform the Projs from a be_Call.
5214  */
5215 static ir_node *gen_Proj_be_Call(ir_node *node)
5216 {
5217         ir_node  *block       = be_transform_node(get_nodes_block(node));
5218         ir_node  *call        = get_Proj_pred(node);
5219         ir_node  *new_call    = be_transform_node(call);
5220         dbg_info *dbgi        = get_irn_dbg_info(node);
5221         long      proj        = get_Proj_proj(node);
5222         ir_mode  *mode        = get_irn_mode(node);
5223         ir_node  *res;
5224
5225         if (proj == pn_be_Call_M_regular) {
5226                 return new_rd_Proj(dbgi, block, new_call, mode_M, n_ia32_Call_mem);
5227         }
5228         /* transform call modes */
5229         if (mode_is_data(mode)) {
5230                 const arch_register_class_t *cls = arch_get_irn_reg_class_out(node);
5231                 mode = cls->mode;
5232         }
5233
5234         /* Map from be_Call to ia32_Call proj number */
5235         if (proj == pn_be_Call_sp) {
5236                 proj = pn_ia32_Call_stack;
5237         } else if (proj == pn_be_Call_M_regular) {
5238                 proj = pn_ia32_Call_M;
5239         } else {
5240                 arch_register_req_t const *const req    = arch_get_register_req_out(node);
5241                 int                        const n_outs = arch_irn_get_n_outs(new_call);
5242                 int                              i;
5243
5244                 assert(proj      >= pn_be_Call_first_res);
5245                 assert(req->type & arch_register_req_type_limited);
5246
5247                 for (i = 0; i < n_outs; ++i) {
5248                         arch_register_req_t const *const new_req = get_ia32_out_req(new_call, i);
5249
5250                         if (!(new_req->type & arch_register_req_type_limited) ||
5251                             new_req->cls      != req->cls                     ||
5252                             *new_req->limited != *req->limited)
5253                                 continue;
5254
5255                         proj = i;
5256                         break;
5257                 }
5258                 assert(i < n_outs);
5259         }
5260
5261         res = new_rd_Proj(dbgi, block, new_call, mode, proj);
5262
5263         /* TODO arch_set_irn_register() only operates on Projs, need variant with index */
5264         switch (proj) {
5265                 case pn_ia32_Call_stack:
5266                         arch_set_irn_register(res, &ia32_gp_regs[REG_ESP]);
5267                         break;
5268
5269                 case pn_ia32_Call_fpcw:
5270                         arch_set_irn_register(res, &ia32_fp_cw_regs[REG_FPCW]);
5271                         break;
5272         }
5273
5274         return res;
5275 }
5276
5277 /**
5278  * Transform the Projs from a Cmp.
5279  */
5280 static ir_node *gen_Proj_Cmp(ir_node *node)
5281 {
5282         /* this probably means not all mode_b nodes were lowered... */
5283         panic("trying to directly transform Proj_Cmp %+F (mode_b not lowered?)",
5284               node);
5285 }
5286
5287 /**
5288  * Transform the Projs from a Bound.
5289  */
5290 static ir_node *gen_Proj_Bound(ir_node *node)
5291 {
5292         ir_node *new_node, *block;
5293         ir_node *pred = get_Proj_pred(node);
5294
5295         switch (get_Proj_proj(node)) {
5296         case pn_Bound_M:
5297                 return be_transform_node(get_Bound_mem(pred));
5298         case pn_Bound_X_regular:
5299                 new_node = be_transform_node(pred);
5300                 block    = get_nodes_block(new_node);
5301                 return new_r_Proj(block, new_node, mode_X, pn_ia32_Jcc_true);
5302         case pn_Bound_X_except:
5303                 new_node = be_transform_node(pred);
5304                 block    = get_nodes_block(new_node);
5305                 return new_r_Proj(block, new_node, mode_X, pn_ia32_Jcc_false);
5306         case pn_Bound_res:
5307                 return be_transform_node(get_Bound_index(pred));
5308         default:
5309                 panic("unsupported Proj from Bound");
5310         }
5311 }
5312
5313 static ir_node *gen_Proj_ASM(ir_node *node)
5314 {
5315         ir_mode *mode     = get_irn_mode(node);
5316         ir_node *pred     = get_Proj_pred(node);
5317         ir_node *new_pred = be_transform_node(pred);
5318         ir_node *block    = get_nodes_block(new_pred);
5319         long     pos      = get_Proj_proj(node);
5320
5321         if (mode == mode_M) {
5322                 pos = arch_irn_get_n_outs(new_pred) + 1;
5323         } else if (mode_is_int(mode) || mode_is_reference(mode)) {
5324                 mode = mode_Iu;
5325         } else if (mode_is_float(mode)) {
5326                 mode = mode_E;
5327         } else {
5328                 panic("unexpected proj mode at ASM");
5329         }
5330
5331         return new_r_Proj(block, new_pred, mode, pos);
5332 }
5333
5334 /**
5335  * Transform and potentially renumber Proj nodes.
5336  */
5337 static ir_node *gen_Proj(ir_node *node)
5338 {
5339         ir_node *pred = get_Proj_pred(node);
5340         long    proj;
5341
5342         switch (get_irn_opcode(pred)) {
5343         case iro_Store:
5344                 proj = get_Proj_proj(node);
5345                 if (proj == pn_Store_M) {
5346                         return be_transform_node(pred);
5347                 } else {
5348                         panic("No idea how to transform proj->Store");
5349                 }
5350         case iro_Load:
5351                 return gen_Proj_Load(node);
5352         case iro_ASM:
5353                 return gen_Proj_ASM(node);
5354         case iro_Builtin:
5355                 return gen_Proj_Builtin(node);
5356         case iro_Div:
5357         case iro_Mod:
5358         case iro_DivMod:
5359                 return gen_Proj_DivMod(node);
5360         case iro_CopyB:
5361                 return gen_Proj_CopyB(node);
5362         case iro_Quot:
5363                 return gen_Proj_Quot(node);
5364         case beo_SubSP:
5365                 return gen_Proj_be_SubSP(node);
5366         case beo_AddSP:
5367                 return gen_Proj_be_AddSP(node);
5368         case beo_Call:
5369                 return gen_Proj_be_Call(node);
5370         case iro_Cmp:
5371                 return gen_Proj_Cmp(node);
5372         case iro_Bound:
5373                 return gen_Proj_Bound(node);
5374         case iro_Start:
5375                 proj = get_Proj_proj(node);
5376                 switch (proj) {
5377                         case pn_Start_X_initial_exec: {
5378                                 ir_node  *block     = get_nodes_block(pred);
5379                                 ir_node  *new_block = be_transform_node(block);
5380                                 dbg_info *dbgi      = get_irn_dbg_info(node);
5381                                 /* we exchange the ProjX with a jump */
5382                                 ir_node  *jump      = new_rd_Jmp(dbgi, new_block);
5383
5384                                 return jump;
5385                         }
5386
5387                         case pn_Start_P_tls:
5388                                 return gen_Proj_tls(node);
5389                 }
5390                 break;
5391
5392         default:
5393                 if (is_ia32_l_FloattoLL(pred)) {
5394                         return gen_Proj_l_FloattoLL(node);
5395 #ifdef FIRM_EXT_GRS
5396                 } else if (!is_ia32_irn(pred)) { // Quick hack for SIMD optimization
5397 #else
5398                 } else {
5399 #endif
5400                         ir_mode *mode = get_irn_mode(node);
5401                         if (ia32_mode_needs_gp_reg(mode)) {
5402                                 ir_node *new_pred = be_transform_node(pred);
5403                                 ir_node *block    = be_transform_node(get_nodes_block(node));
5404                                 ir_node *new_proj = new_r_Proj(block, new_pred,
5405                                                                                            mode_Iu, get_Proj_proj(node));
5406                                 new_proj->node_nr = node->node_nr;
5407                                 return new_proj;
5408                         }
5409                 }
5410         }
5411         return be_duplicate_node(node);
5412 }
5413
5414 /**
5415  * Enters all transform functions into the generic pointer
5416  */
5417 static void register_transformers(void)
5418 {
5419         /* first clear the generic function pointer for all ops */
5420         clear_irp_opcodes_generic_func();
5421
5422 #define GEN(a)   { be_transform_func *func = gen_##a; op_##a->ops.generic = (op_func) func; }
5423 #define BAD(a)   op_##a->ops.generic = (op_func)bad_transform
5424
5425         GEN(Add);
5426         GEN(Sub);
5427         GEN(Mul);
5428         GEN(Mulh);
5429         GEN(And);
5430         GEN(Or);
5431         GEN(Eor);
5432
5433         GEN(Shl);
5434         GEN(Shr);
5435         GEN(Shrs);
5436         GEN(Rotl);
5437
5438         GEN(Quot);
5439
5440         GEN(Div);
5441         GEN(Mod);
5442         GEN(DivMod);
5443
5444         GEN(Minus);
5445         GEN(Conv);
5446         GEN(Abs);
5447         GEN(Not);
5448
5449         GEN(Load);
5450         GEN(Store);
5451         GEN(Cond);
5452
5453         GEN(Cmp);
5454         GEN(ASM);
5455         GEN(CopyB);
5456         GEN(Mux);
5457         GEN(Proj);
5458         GEN(Phi);
5459         GEN(IJmp);
5460         GEN(Bound);
5461
5462         /* transform ops from intrinsic lowering */
5463         GEN(ia32_l_Add);
5464         GEN(ia32_l_Adc);
5465         GEN(ia32_l_Mul);
5466         GEN(ia32_l_IMul);
5467         GEN(ia32_l_ShlDep);
5468         GEN(ia32_l_ShrDep);
5469         GEN(ia32_l_SarDep);
5470         GEN(ia32_l_ShlD);
5471         GEN(ia32_l_ShrD);
5472         GEN(ia32_l_Sub);
5473         GEN(ia32_l_Sbb);
5474         GEN(ia32_l_LLtoFloat);
5475         GEN(ia32_l_FloattoLL);
5476
5477         GEN(Const);
5478         GEN(SymConst);
5479         GEN(Unknown);
5480
5481         /* we should never see these nodes */
5482         BAD(Raise);
5483         BAD(Sel);
5484         BAD(InstOf);
5485         BAD(Cast);
5486         BAD(Free);
5487         BAD(Tuple);
5488         BAD(Id);
5489         //BAD(Bad);
5490         BAD(Confirm);
5491         BAD(Filter);
5492         BAD(CallBegin);
5493         BAD(EndReg);
5494         BAD(EndExcept);
5495
5496         /* handle builtins */
5497         GEN(Builtin);
5498
5499         /* handle generic backend nodes */
5500         GEN(be_FrameAddr);
5501         GEN(be_Call);
5502         GEN(be_IncSP);
5503         GEN(be_Return);
5504         GEN(be_AddSP);
5505         GEN(be_SubSP);
5506         GEN(be_Copy);
5507
5508 #undef GEN
5509 #undef BAD
5510 }
5511
5512 /**
5513  * Pre-transform all unknown and noreg nodes.
5514  */
5515 static void ia32_pretransform_node(void)
5516 {
5517         ia32_code_gen_t *cg = env_cg;
5518
5519         cg->unknown_gp  = be_pre_transform_node(cg->unknown_gp);
5520         cg->unknown_vfp = be_pre_transform_node(cg->unknown_vfp);
5521         cg->unknown_xmm = be_pre_transform_node(cg->unknown_xmm);
5522         cg->noreg_gp    = be_pre_transform_node(cg->noreg_gp);
5523         cg->noreg_vfp   = be_pre_transform_node(cg->noreg_vfp);
5524         cg->noreg_xmm   = be_pre_transform_node(cg->noreg_xmm);
5525
5526         nomem    = get_irg_no_mem(current_ir_graph);
5527         noreg_GP = ia32_new_NoReg_gp(cg);
5528
5529         get_fpcw();
5530 }
5531
5532 /**
5533  * Walker, checks if all ia32 nodes producing more than one result have their
5534  * Projs, otherwise creates new Projs and keeps them using a be_Keep node.
5535  */
5536 static void add_missing_keep_walker(ir_node *node, void *data)
5537 {
5538         int              n_outs, i;
5539         unsigned         found_projs = 0;
5540         const ir_edge_t *edge;
5541         ir_mode         *mode = get_irn_mode(node);
5542         ir_node         *last_keep;
5543         (void) data;
5544         if (mode != mode_T)
5545                 return;
5546         if (!is_ia32_irn(node))
5547                 return;
5548
5549         n_outs = arch_irn_get_n_outs(node);
5550         if (n_outs <= 0)
5551                 return;
5552         if (is_ia32_SwitchJmp(node))
5553                 return;
5554
5555         assert(n_outs < (int) sizeof(unsigned) * 8);
5556         foreach_out_edge(node, edge) {
5557                 ir_node *proj = get_edge_src_irn(edge);
5558                 int      pn;
5559
5560                 /* The node could be kept */
5561                 if (is_End(proj))
5562                         continue;
5563
5564                 if (get_irn_mode(proj) == mode_M)
5565                         continue;
5566
5567                 pn = get_Proj_proj(proj);
5568                 assert(pn < n_outs);
5569                 found_projs |= 1 << pn;
5570         }
5571
5572
5573         /* are keeps missing? */
5574         last_keep = NULL;
5575         for (i = 0; i < n_outs; ++i) {
5576                 ir_node                     *block;
5577                 ir_node                     *in[1];
5578                 const arch_register_req_t   *req;
5579                 const arch_register_class_t *cls;
5580
5581                 if (found_projs & (1 << i)) {
5582                         continue;
5583                 }
5584
5585                 req = get_ia32_out_req(node, i);
5586                 cls = req->cls;
5587                 if (cls == NULL) {
5588                         continue;
5589                 }
5590                 if (cls == &ia32_reg_classes[CLASS_ia32_flags]) {
5591                         continue;
5592                 }
5593
5594                 block = get_nodes_block(node);
5595                 in[0] = new_r_Proj(block, node, arch_register_class_mode(cls), i);
5596                 if (last_keep != NULL) {
5597                         be_Keep_add_node(last_keep, cls, in[0]);
5598                 } else {
5599                         last_keep = be_new_Keep(cls, block, 1, in);
5600                         if (sched_is_scheduled(node)) {
5601                                 sched_add_after(node, last_keep);
5602                         }
5603                 }
5604         }
5605 }
5606
5607 /**
5608  * Adds missing keeps to nodes. Adds missing Proj nodes for unused outputs
5609  * and keeps them.
5610  */
5611 void ia32_add_missing_keeps(ia32_code_gen_t *cg)
5612 {
5613         ir_graph *irg = be_get_birg_irg(cg->birg);
5614         irg_walk_graph(irg, add_missing_keep_walker, NULL, NULL);
5615 }
5616
5617 /**
5618  * Post-process all calls if we are in SSE mode.
5619  * The ABI requires that the results are in st0, copy them
5620  * to a xmm register.
5621  */
5622 static void postprocess_fp_call_results(void) {
5623         int i;
5624
5625         for (i = ARR_LEN(call_list) - 1; i >= 0; --i) {
5626                 ir_node *call = call_list[i];
5627                 ir_type *mtp  = call_types[i];
5628                 int     j;
5629
5630                 for (j = get_method_n_ress(mtp) - 1; j >= 0; --j) {
5631                         ir_type *res_tp = get_method_res_type(mtp, j);
5632                         ir_node *res, *new_res;
5633                         const ir_edge_t *edge, *next;
5634                         ir_mode *mode;
5635
5636                         if (! is_atomic_type(res_tp)) {
5637                                 /* no floating point return */
5638                                 continue;
5639                         }
5640                         mode = get_type_mode(res_tp);
5641                         if (! mode_is_float(mode)) {
5642                                 /* no floating point return */
5643                                 continue;
5644                         }
5645
5646                         res     = be_get_Proj_for_pn(call, pn_ia32_Call_vf0 + j);
5647                         new_res = NULL;
5648
5649                         /* now patch the users */
5650                         foreach_out_edge_safe(res, edge, next) {
5651                                 ir_node *succ = get_edge_src_irn(edge);
5652
5653                                 /* ignore Keeps */
5654                                 if (be_is_Keep(succ))
5655                                         continue;
5656
5657                                 if (is_ia32_xStore(succ)) {
5658                                         /* an xStore can be patched into an vfst */
5659                                         dbg_info *db    = get_irn_dbg_info(succ);
5660                                         ir_node  *block = get_nodes_block(succ);
5661                                         ir_node  *base  = get_irn_n(succ, n_ia32_xStore_base);
5662                                         ir_node  *index = get_irn_n(succ, n_ia32_xStore_index);
5663                                         ir_node  *mem   = get_irn_n(succ, n_ia32_xStore_mem);
5664                                         ir_node  *value = get_irn_n(succ, n_ia32_xStore_val);
5665                                         ir_mode  *mode  = get_ia32_ls_mode(succ);
5666
5667                                         ir_node  *st = new_bd_ia32_vfst(db, block, base, index, mem, value, mode);
5668                                         set_ia32_am_offs_int(st, get_ia32_am_offs_int(succ));
5669                                         if (is_ia32_use_frame(succ))
5670                                                 set_ia32_use_frame(st);
5671                                         set_ia32_frame_ent(st, get_ia32_frame_ent(succ));
5672                                         set_irn_pinned(st, get_irn_pinned(succ));
5673                                         set_ia32_op_type(st, ia32_AddrModeD);
5674
5675                                         exchange(succ, st);
5676                                 } else {
5677                                         if (new_res == NULL) {
5678                                                 dbg_info *db       = get_irn_dbg_info(call);
5679                                                 ir_node  *block    = get_nodes_block(call);
5680                                                 ir_node  *frame    = get_irg_frame(current_ir_graph);
5681                                                 ir_node  *old_mem  = be_get_Proj_for_pn(call, pn_ia32_Call_M);
5682                                                 ir_node  *call_mem = new_r_Proj(block, call, mode_M, pn_ia32_Call_M);
5683                                                 ir_node  *vfst, *xld, *new_mem;
5684
5685                                                 /* store st(0) on stack */
5686                                                 vfst = new_bd_ia32_vfst(db, block, frame, noreg_GP, call_mem, res, mode);
5687                                                 set_ia32_op_type(vfst, ia32_AddrModeD);
5688                                                 set_ia32_use_frame(vfst);
5689
5690                                                 /* load into SSE register */
5691                                                 xld = new_bd_ia32_xLoad(db, block, frame, noreg_GP, vfst, mode);
5692                                                 set_ia32_op_type(xld, ia32_AddrModeS);
5693                                                 set_ia32_use_frame(xld);
5694
5695                                                 new_res = new_r_Proj(block, xld, mode, pn_ia32_xLoad_res);
5696                                                 new_mem = new_r_Proj(block, xld, mode_M, pn_ia32_xLoad_M);
5697
5698                                                 if (old_mem != NULL) {
5699                                                         edges_reroute(old_mem, new_mem, current_ir_graph);
5700                                                         kill_node(old_mem);
5701                                                 }
5702                                         }
5703                                         set_irn_n(succ, get_edge_src_pos(edge), new_res);
5704                                 }
5705                         }
5706                 }
5707         }
5708 }
5709
5710 /* do the transformation */
5711 void ia32_transform_graph(ia32_code_gen_t *cg)
5712 {
5713         int cse_last;
5714
5715         register_transformers();
5716         env_cg        = cg;
5717         initial_fpcw  = NULL;
5718         no_pic_adjust = 0;
5719
5720         BE_TIMER_PUSH(t_heights);
5721         heights      = heights_new(cg->irg);
5722         BE_TIMER_POP(t_heights);
5723         ia32_calculate_non_address_mode_nodes(cg->birg);
5724
5725         /* the transform phase is not safe for CSE (yet) because several nodes get
5726          * attributes set after their creation */
5727         cse_last = get_opt_cse();
5728         set_opt_cse(0);
5729
5730         call_list  = NEW_ARR_F(ir_node *, 0);
5731         call_types = NEW_ARR_F(ir_type *, 0);
5732         be_transform_graph(cg->birg, ia32_pretransform_node);
5733
5734         if (ia32_cg_config.use_sse2)
5735                 postprocess_fp_call_results();
5736         DEL_ARR_F(call_types);
5737         DEL_ARR_F(call_list);
5738
5739         set_opt_cse(cse_last);
5740
5741         ia32_free_non_address_mode_nodes();
5742         heights_free(heights);
5743         heights = NULL;
5744 }
5745
5746 void ia32_init_transform(void)
5747 {
5748         FIRM_DBG_REGISTER(dbg, "firm.be.ia32.transform");
5749 }