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