7888d4c3e8bc317e4a410cfd7eab2338c55879af
[libfirm] / ir / be / ia32 / ia32_emitter.c
1 /**
2  * @file
3  * @brief   This file implements the node emitter.
4  * @author  Christian Wuerdig, Matthias Braun
5  * @version $Id$
6  */
7 #ifdef HAVE_CONFIG_H
8 #include "config.h"
9 #endif
10
11 #include <limits.h>
12
13 #include "xmalloc.h"
14 #include "tv.h"
15 #include "iredges.h"
16 #include "debug.h"
17 #include "irgwalk.h"
18 #include "irprintf.h"
19 #include "irop_t.h"
20 #include "irargs_t.h"
21 #include "irprog_t.h"
22 #include "iredges_t.h"
23 #include "execfreq.h"
24 #include "error.h"
25 #include "raw_bitset.h"
26
27 #include "../besched_t.h"
28 #include "../benode_t.h"
29 #include "../beabi.h"
30 #include "../be_dbgout.h"
31 #include "../beemitter.h"
32 #include "../begnuas.h"
33
34 #include "ia32_emitter.h"
35 #include "gen_ia32_emitter.h"
36 #include "gen_ia32_regalloc_if.h"
37 #include "ia32_nodes_attr.h"
38 #include "ia32_new_nodes.h"
39 #include "ia32_map_regs.h"
40 #include "bearch_ia32_t.h"
41
42 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
43
44 #define BLOCK_PREFIX ".L"
45
46 #define SNPRINTF_BUF_LEN 128
47
48 /**
49  * Returns the register at in position pos.
50  */
51 static
52 const arch_register_t *get_in_reg(ia32_emit_env_t *env, const ir_node *irn,
53                                   int pos)
54 {
55         const arch_env_t       *arch_env = env->arch_env;
56         ir_node                *op;
57         const arch_register_t  *reg = NULL;
58
59         assert(get_irn_arity(irn) > pos && "Invalid IN position");
60
61         /* The out register of the operator at position pos is the
62            in register we need. */
63         op = get_irn_n(irn, pos);
64
65         reg = arch_get_irn_register(arch_env, op);
66
67         assert(reg && "no in register found");
68
69         /* in case of a joker register: just return a valid register */
70         if (arch_register_type_is(reg, joker)) {
71                 const arch_register_req_t *req;
72
73                 /* ask for the requirements */
74                 req = arch_get_register_req(arch_env, irn, pos);
75
76                 if (arch_register_req_is(req, limited)) {
77                         /* in case of limited requirements: get the first allowed register */
78                         unsigned idx = rbitset_next(req->limited, 0, 1);
79                         reg = arch_register_for_index(req->cls, idx);
80                 } else {
81                         /* otherwise get first register in class */
82                         reg = arch_register_for_index(req->cls, 0);
83                 }
84         }
85
86         return reg;
87 }
88
89 /**
90  * Returns the register at out position pos.
91  */
92 static
93 const arch_register_t *get_out_reg(ia32_emit_env_t *env, const ir_node *irn,
94                                    int pos)
95 {
96         const arch_env_t      *arch_env = env->arch_env;
97         ir_node               *proj;
98         const arch_register_t *reg = NULL;
99
100         /* 1st case: irn is not of mode_T, so it has only                 */
101         /*           one OUT register -> good                             */
102         /* 2nd case: irn is of mode_T -> collect all Projs and ask the    */
103         /*           Proj with the corresponding projnum for the register */
104
105         if (get_irn_mode(irn) != mode_T) {
106                 reg = arch_get_irn_register(arch_env, irn);
107         } else if (is_ia32_irn(irn)) {
108                 reg = get_ia32_out_reg(irn, pos);
109         } else {
110                 const ir_edge_t *edge;
111
112                 foreach_out_edge(irn, edge) {
113                         proj = get_edge_src_irn(edge);
114                         assert(is_Proj(proj) && "non-Proj from mode_T node");
115                         if (get_Proj_proj(proj) == pos) {
116                                 reg = arch_get_irn_register(arch_env, proj);
117                                 break;
118                         }
119                 }
120         }
121
122         assert(reg && "no out register found");
123         return reg;
124 }
125
126 /**
127  * Returns an ident for the given tarval tv.
128  */
129 static
130 ident *get_ident_for_tv(tarval *tv) {
131         char buf[256];
132         tarval_snprintf(buf, sizeof(buf), tv);
133         return new_id_from_str(buf);
134 }
135
136 /**
137  * Determine the gnu assembler suffix that indicates a mode
138  */
139 static
140 char get_mode_suffix(const ir_mode *mode) {
141         if(mode_is_float(mode)) {
142                 switch(get_mode_size_bits(mode)) {
143                 case 32:
144                         return 's';
145                 case 64:
146                         return 'l';
147                 case 80:
148                         return 't';
149                 }
150         } else {
151                 assert(mode_is_int(mode) || mode_is_reference(mode));
152                 switch(get_mode_size_bits(mode)) {
153                 case 64:
154                         return 'q';
155                 case 32:
156                         return 'l';
157                 case 16:
158                         return 'w';
159                 case 8:
160                         return 'b';
161                 }
162         }
163         panic("Can't output mode_suffix for %+F\n", mode);
164 }
165
166 static
167 int produces_result(const ir_node *node) {
168         return !(is_ia32_St(node) ||
169                 is_ia32_Store8Bit(node) ||
170                 is_ia32_CondJmp(node) ||
171                 is_ia32_xCondJmp(node) ||
172                 is_ia32_CmpSet(node) ||
173                 is_ia32_xCmpSet(node) ||
174                 is_ia32_SwitchJmp(node));
175 }
176
177 static
178 const char *ia32_get_reg_name_for_mode(ia32_emit_env_t *env, ir_mode *mode,
179                                        const arch_register_t *reg) {
180         switch(get_mode_size_bits(mode)) {
181                 case 8:
182                         return ia32_get_mapped_reg_name(env->isa->regs_8bit, reg);
183                 case 16:
184                         return ia32_get_mapped_reg_name(env->isa->regs_16bit, reg);
185                 default:
186                         return (char *)arch_register_get_name(reg);
187         }
188 }
189
190 /**
191  * Add a number to a prefix. This number will not be used a second time.
192  */
193 static
194 char *get_unique_label(char *buf, size_t buflen, const char *prefix) {
195         static unsigned long id = 0;
196         snprintf(buf, buflen, "%s%lu", prefix, ++id);
197         return buf;
198 }
199
200 /*************************************************************
201  *             _       _    __   _          _
202  *            (_)     | |  / _| | |        | |
203  *  _ __  _ __ _ _ __ | |_| |_  | |__   ___| |_ __   ___ _ __
204  * | '_ \| '__| | '_ \| __|  _| | '_ \ / _ \ | '_ \ / _ \ '__|
205  * | |_) | |  | | | | | |_| |   | | | |  __/ | |_) |  __/ |
206  * | .__/|_|  |_|_| |_|\__|_|   |_| |_|\___|_| .__/ \___|_|
207  * | |                                       | |
208  * |_|                                       |_|
209  *************************************************************/
210
211 // we have no C++ and can't define an implicit ia32_emit_env_t* cast to
212 // be_emit_env_t* so we cheat a bit...
213 #define be_emit_char(env,c)             be_emit_char(env->emit,c)
214 #define be_emit_string(env,s)           be_emit_string(env->emit,s)
215 #undef be_emit_cstring
216 #define be_emit_cstring(env,x)          { be_emit_string_len(env->emit, x, sizeof(x)-1); }
217 #define be_emit_ident(env,i)            be_emit_ident(env->emit,i)
218 #define be_emit_write_line(env)         be_emit_write_line(env->emit)
219 #define be_emit_finish_line_gas(env,n)  be_emit_finish_line_gas(env->emit,n)
220 #define be_emit_pad_comment(env)        be_emit_pad_comment(env->emit)
221
222 void ia32_emit_source_register(ia32_emit_env_t *env, const ir_node *node, int pos)
223 {
224         const arch_register_t *reg = get_in_reg(env, node, pos);
225         const char *reg_name = arch_register_get_name(reg);
226
227         assert(pos < get_irn_arity(node));
228
229         be_emit_char(env, '%');
230         be_emit_string(env, reg_name);
231 }
232
233 void ia32_emit_dest_register(ia32_emit_env_t *env, const ir_node *node, int pos) {
234         const arch_register_t *reg = get_out_reg(env, node, pos);
235         const char *reg_name = arch_register_get_name(reg);
236
237         be_emit_char(env, '%');
238         be_emit_string(env, reg_name);
239 }
240
241 void ia32_emit_x87_name(ia32_emit_env_t *env, const ir_node *node, int pos)
242 {
243         ia32_attr_t *attr = get_ia32_attr(node);
244
245         assert(pos < 3);
246         be_emit_char(env, '%');
247         be_emit_string(env, attr->x87[pos]->name);
248 }
249
250 void ia32_emit_immediate(ia32_emit_env_t *env, const ir_node *node)
251 {
252         tarval *tv;
253         ir_entity *ent;
254         ident *id;
255
256         switch(get_ia32_immop_type(node)) {
257         case ia32_ImmConst:
258                 tv = get_ia32_Immop_tarval(node);
259                 id = get_ident_for_tv(tv);
260                 break;
261         case ia32_ImmSymConst:
262                 ent = get_ia32_Immop_symconst(node);
263                 mark_entity_visited(ent);
264                 id = get_entity_ld_ident(ent);
265                 break;
266         default:
267                 assert(0);
268                 be_emit_string(env, "BAD");
269                 return;
270         }
271
272         be_emit_ident(env, id);
273 }
274
275 void ia32_emit_mode_suffix(ia32_emit_env_t *env, const ir_mode *mode)
276 {
277         be_emit_char(env, get_mode_suffix(mode));
278 }
279
280 void ia32_emit_x87_mode_suffix(ia32_emit_env_t *env, const ir_node *node)
281 {
282         ir_mode *mode = get_ia32_ls_mode(node);
283         if(mode != NULL)
284                 ia32_emit_mode_suffix(env, mode);
285 }
286
287 static
288 char get_xmm_mode_suffix(ir_mode *mode)
289 {
290         assert(mode_is_float(mode));
291         switch(get_mode_size_bits(mode)) {
292         case 32:
293                 return 's';
294         case 64:
295                 return 'd';
296         default:
297                 assert(0);
298         }
299         return '%';
300 }
301
302 void ia32_emit_xmm_mode_suffix(ia32_emit_env_t *env, const ir_node *node)
303 {
304         ir_mode *mode = get_ia32_ls_mode(node);
305         assert(mode != NULL);
306         be_emit_char(env, 's');
307         be_emit_char(env, get_xmm_mode_suffix(mode));
308 }
309
310 void ia32_emit_xmm_mode_suffix_s(ia32_emit_env_t *env, const ir_node *node)
311 {
312         ir_mode *mode = get_ia32_ls_mode(node);
313         assert(mode != NULL);
314         be_emit_char(env, get_xmm_mode_suffix(mode));
315 }
316
317 void ia32_emit_extend_suffix(ia32_emit_env_t *env, const ir_mode *mode)
318 {
319         if(get_mode_size_bits(mode) == 32)
320                 return;
321         if(mode_is_signed(mode)) {
322                 be_emit_char(env, 's');
323         } else {
324                 be_emit_char(env, 'z');
325         }
326 }
327
328 static
329 void ia32_emit_function_object(ia32_emit_env_t *env, const char *name)
330 {
331         switch (be_gas_flavour) {
332         case GAS_FLAVOUR_NORMAL:
333                 be_emit_cstring(env, "\t.type\t");
334                 be_emit_string(env, name);
335                 be_emit_cstring(env, ", @function\n");
336                 be_emit_write_line(env);
337                 break;
338         case GAS_FLAVOUR_MINGW:
339                 be_emit_cstring(env, "\t.def\t");
340                 be_emit_string(env, name);
341                 be_emit_cstring(env, ";\t.scl\t2;\t.type\t32;\t.endef\n");
342                 be_emit_write_line(env);
343                 break;
344         default:
345                 break;
346         }
347 }
348
349 static
350 void ia32_emit_function_size(ia32_emit_env_t *env, const char *name)
351 {
352         switch (be_gas_flavour) {
353         case GAS_FLAVOUR_NORMAL:
354                 be_emit_cstring(env, "\t.size\t");
355                 be_emit_string(env, name);
356                 be_emit_cstring(env, ", .-");
357                 be_emit_string(env, name);
358                 be_emit_char(env, '\n');
359                 be_emit_write_line(env);
360                 break;
361         default:
362                 break;
363         }
364 }
365
366
367
368 /**
369  * Emits registers and/or address mode of a binary operation.
370  */
371 void ia32_emit_binop(ia32_emit_env_t *env, const ir_node *node) {
372         switch(get_ia32_op_type(node)) {
373                 case ia32_Normal:
374                         if (is_ia32_ImmConst(node) || is_ia32_ImmSymConst(node)) {
375                                 be_emit_char(env, '$');
376                                 ia32_emit_immediate(env, node);
377                                 be_emit_cstring(env, ", ");
378                                 ia32_emit_source_register(env, node, 2);
379                         } else {
380                                 const arch_register_t *in1 = get_in_reg(env, node, 2);
381                                 const arch_register_t *in2 = get_in_reg(env, node, 3);
382                                 const arch_register_t *out = produces_result(node) ? get_out_reg(env, node, 0) : NULL;
383                                 const arch_register_t *in;
384                                 const char            *in_name;
385
386                                 in      = out ? (REGS_ARE_EQUAL(out, in2) ? in1 : in2) : in2;
387                                 out     = out ? out : in1;
388                                 in_name = arch_register_get_name(in);
389
390                                 if (is_ia32_emit_cl(node)) {
391                                         assert(REGS_ARE_EQUAL(&ia32_gp_regs[REG_ECX], in) && "shift operation needs ecx");
392                                         in_name = "cl";
393                                 }
394
395                                 be_emit_char(env, '%');
396                                 be_emit_string(env, in_name);
397                                 be_emit_cstring(env, ", %");
398                                 be_emit_string(env, arch_register_get_name(out));
399                         }
400                         break;
401                 case ia32_AddrModeS:
402                         if (is_ia32_ImmConst(node) || is_ia32_ImmSymConst(node)) {
403                                 assert(!produces_result(node) && "Source AM with Const must not produce result");
404                                 ia32_emit_am(env, node);
405                                 be_emit_cstring(env, ", $");
406                                 ia32_emit_immediate(env, node);
407                         } else if (produces_result(node)) {
408                                 ia32_emit_am(env, node);
409                                 be_emit_cstring(env, ", ");
410                                 ia32_emit_dest_register(env, node, 0);
411                         } else {
412                                 ia32_emit_am(env, node);
413                                 be_emit_cstring(env, ", ");
414                                 ia32_emit_source_register(env, node, 2);
415                         }
416                         break;
417                 case ia32_AddrModeD:
418                         if (is_ia32_ImmConst(node) || is_ia32_ImmSymConst(node)) {
419                                 be_emit_char(env, '$');
420                                 ia32_emit_immediate(env, node);
421                                 be_emit_cstring(env, ", ");
422                                 ia32_emit_am(env, node);
423                         } else {
424                                 const arch_register_t *in1 = get_in_reg(env, node,
425                                                                         get_irn_arity(node) == 5 ? 3 : 2);
426                                 ir_mode               *mode = get_ia32_ls_mode(node);
427                                 const char            *in_name;
428
429                                 in_name = ia32_get_reg_name_for_mode(env, mode, in1);
430
431                                 if (is_ia32_emit_cl(node)) {
432                                         assert(REGS_ARE_EQUAL(&ia32_gp_regs[REG_ECX], in1) && "shift operation needs ecx");
433                                         in_name = "cl";
434                                 }
435
436                                 be_emit_char(env, '%');
437                                 be_emit_string(env, in_name);
438                                 be_emit_cstring(env, ", ");
439                                 ia32_emit_am(env, node);
440                         }
441                         break;
442                 default:
443                         assert(0 && "unsupported op type");
444         }
445 }
446
447 /**
448  * Emits registers and/or address mode of a binary operation.
449  */
450 void ia32_emit_x87_binop(ia32_emit_env_t *env, const ir_node *node) {
451         switch(get_ia32_op_type(node)) {
452                 case ia32_Normal:
453                         if (is_ia32_ImmConst(node) || is_ia32_ImmSymConst(node)) {
454                                 // should not happen...
455                                 assert(0);
456                         } else {
457                                 ia32_attr_t *attr = get_ia32_attr(node);
458                                 const arch_register_t *in1 = attr->x87[0];
459                                 const arch_register_t *in2 = attr->x87[1];
460                                 const arch_register_t *out = attr->x87[2];
461                                 const arch_register_t *in;
462
463                                 in  = out ? (REGS_ARE_EQUAL(out, in2) ? in1 : in2) : in2;
464                                 out = out ? out : in1;
465
466                                 be_emit_char(env, '%');
467                                 be_emit_string(env, arch_register_get_name(in));
468                                 be_emit_cstring(env, ", %");
469                                 be_emit_string(env, arch_register_get_name(out));
470                         }
471                         break;
472                 case ia32_AddrModeS:
473                 case ia32_AddrModeD:
474                         ia32_emit_am(env, node);
475                         break;
476                 default:
477                         assert(0 && "unsupported op type");
478         }
479 }
480
481 /**
482  * Emits registers and/or address mode of a unary operation.
483  */
484 void ia32_emit_unop(ia32_emit_env_t *env, const ir_node *node) {
485         switch(get_ia32_op_type(node)) {
486                 case ia32_Normal:
487                         if (is_ia32_ImmConst(node) || is_ia32_ImmSymConst(node)) {
488                                 be_emit_char(env, '$');
489                                 ia32_emit_immediate(env, node);
490                         } else {
491                                 if (is_ia32_Mul(node) || is_ia32_IMul1OP(node)) {
492                                         ia32_emit_source_register(env, node, 3);
493                                 } else if(is_ia32_IDiv(node) || is_ia32_Div(node)) {
494                                         ia32_emit_source_register(env, node, 4);
495                                 } else if(is_ia32_Push(node)) {
496                                         ia32_emit_source_register(env, node, 2);
497                                 } else if(is_ia32_Pop(node)) {
498                                         ia32_emit_dest_register(env, node, 1);
499                                 } else {
500                                         ia32_emit_dest_register(env, node, 0);
501                                 }
502                         }
503                         break;
504                 case ia32_AddrModeS:
505                 case ia32_AddrModeD:
506                         ia32_emit_am(env, node);
507                         break;
508                 default:
509                         assert(0 && "unsupported op type");
510         }
511 }
512
513 /**
514  * Emits address mode.
515  */
516 void ia32_emit_am(ia32_emit_env_t *env, const ir_node *node) {
517         ia32_am_flavour_t am_flav = get_ia32_am_flavour(node);
518         ir_entity *ent = get_ia32_am_sc(node);
519         int offs = get_ia32_am_offs_int(node);
520
521         /* just to be sure... */
522         assert(!is_ia32_use_frame(node) || get_ia32_frame_ent(node) != NULL);
523
524         /* emit offset */
525         if (ent != NULL) {
526                 ident *id;
527
528                 mark_entity_visited(ent);
529                 id = get_entity_ld_ident(ent);
530                 if (is_ia32_am_sc_sign(node))
531                         be_emit_char(env, '-');
532                 be_emit_ident(env, id);
533         }
534
535         if(offs != 0) {
536                 if(ent != NULL) {
537                         be_emit_irprintf(env->emit, "%+d", offs);
538                 } else {
539                         be_emit_irprintf(env->emit, "%d", offs);
540                 }
541         }
542
543         if (am_flav & (ia32_B | ia32_I)) {
544                 be_emit_char(env, '(');
545
546                 /* emit base */
547                 if (am_flav & ia32_B) {
548                         ia32_emit_source_register(env, node, 0);
549                 }
550
551                 /* emit index + scale */
552                 if (am_flav & ia32_I) {
553                         be_emit_char(env, ',');
554                         ia32_emit_source_register(env, node, 1);
555
556                         if (am_flav & ia32_S) {
557                                 be_emit_irprintf(env->emit, ",%d", 1 << get_ia32_am_scale(node));
558                         }
559                 }
560                 be_emit_char(env, ')');
561         }
562 }
563
564 /*************************************************
565  *                 _ _                         _
566  *                (_) |                       | |
567  *   ___ _ __ ___  _| |_    ___ ___  _ __   __| |
568  *  / _ \ '_ ` _ \| | __|  / __/ _ \| '_ \ / _` |
569  * |  __/ | | | | | | |_  | (_| (_) | | | | (_| |
570  *  \___|_| |_| |_|_|\__|  \___\___/|_| |_|\__,_|
571  *
572  *************************************************/
573
574 #undef IA32_DO_EMIT
575 #define IA32_DO_EMIT(irn) ia32_fprintf_format(F, irn, cmd_buf, cmnt_buf)
576
577 /*
578  * coding of conditions
579  */
580 struct cmp2conditon_t {
581         const char *name;
582         pn_Cmp      num;
583 };
584
585 /*
586  * positive conditions for signed compares
587  */
588 static
589 const struct cmp2conditon_t cmp2condition_s[] = {
590         { NULL,              pn_Cmp_False },  /* always false */
591         { "e",               pn_Cmp_Eq },     /* == */
592         { "l",               pn_Cmp_Lt },     /* < */
593         { "le",              pn_Cmp_Le },     /* <= */
594         { "g",               pn_Cmp_Gt },     /* > */
595         { "ge",              pn_Cmp_Ge },     /* >= */
596         { "ne",              pn_Cmp_Lg },     /* != */
597         { NULL,              pn_Cmp_Leg},     /* Floating point: ordered */
598         { NULL,              pn_Cmp_Uo },     /* Floating point: unordered */
599         { "e",               pn_Cmp_Ue },     /* Floating point: unordered or == */
600         { "b",               pn_Cmp_Ul },     /* Floating point: unordered or < */
601         { "be",              pn_Cmp_Ule },    /* Floating point: unordered or <= */
602         { "a",               pn_Cmp_Ug },     /* Floating point: unordered or > */
603         { "ae",              pn_Cmp_Uge },    /* Floating point: unordered or >= */
604         { "ne",              pn_Cmp_Ne },     /* Floating point: unordered or != */
605         { NULL,              pn_Cmp_True },   /* always true */
606 };
607
608 /*
609  * positive conditions for unsigned compares
610  */
611 static
612 const struct cmp2conditon_t cmp2condition_u[] = {
613         { NULL,              pn_Cmp_False },  /* always false */
614         { "e",               pn_Cmp_Eq },     /* == */
615         { "b",               pn_Cmp_Lt },     /* < */
616         { "be",              pn_Cmp_Le },     /* <= */
617         { "a",               pn_Cmp_Gt },     /* > */
618         { "ae",              pn_Cmp_Ge },     /* >= */
619         { "ne",              pn_Cmp_Lg },     /* != */
620         { NULL,              pn_Cmp_True },   /* always true */
621 };
622
623 /*
624  * returns the condition code
625  */
626 static
627 const char *get_cmp_suffix(int cmp_code)
628 {
629         assert( (cmp2condition_s[cmp_code & 15].num) == (cmp_code & 15));
630         assert( (cmp2condition_u[cmp_code & 7].num) == (cmp_code & 7));
631
632         if((cmp_code & ia32_pn_Cmp_Unsigned)) {
633                 return cmp2condition_u[cmp_code & 7].name;
634         } else {
635                 return cmp2condition_s[cmp_code & 15].name;
636         }
637 }
638
639 void ia32_emit_cmp_suffix(ia32_emit_env_t *env, long pnc)
640 {
641         be_emit_string(env, get_cmp_suffix(pnc));
642 }
643
644
645 /**
646  * Returns the target block for a control flow node.
647  */
648 static
649 ir_node *get_cfop_target_block(const ir_node *irn) {
650         return get_irn_link(irn);
651 }
652
653 /**
654  * Returns the target label for a control flow node.
655  */
656 void ia32_emit_cfop_target(ia32_emit_env_t * env, const ir_node *node) {
657         ir_node *block = get_cfop_target_block(node);
658
659         be_emit_cstring(env, BLOCK_PREFIX);
660         be_emit_irprintf(env->emit, "%d", get_irn_node_nr(block));
661 }
662
663 /** Return the next block in Block schedule */
664 static ir_node *next_blk_sched(const ir_node *block) {
665         return get_irn_link(block);
666 }
667
668 /**
669  * Returns the Proj with projection number proj and NOT mode_M
670  */
671 static
672 ir_node *get_proj(const ir_node *node, long proj) {
673         const ir_edge_t *edge;
674         ir_node         *src;
675
676         assert(get_irn_mode(node) == mode_T && "expected mode_T node");
677
678         foreach_out_edge(node, edge) {
679                 src = get_edge_src_irn(edge);
680
681                 assert(is_Proj(src) && "Proj expected");
682                 if (get_irn_mode(src) == mode_M)
683                         continue;
684
685                 if (get_Proj_proj(src) == proj)
686                         return src;
687         }
688         return NULL;
689 }
690
691 /**
692  * Emits the jump sequence for a conditional jump (cmp + jmp_true + jmp_false)
693  */
694 static
695 void finish_CondJmp(ia32_emit_env_t *env, const ir_node *node, ir_mode *mode,
696                     long pnc) {
697         const ir_node *proj_true;
698         const ir_node *proj_false;
699         const ir_node *block;
700         const ir_node *next_block;
701         int flipped = 0;
702
703         /* get both Proj's */
704         proj_true = get_proj(node, pn_Cond_true);
705         assert(proj_true && "CondJmp without true Proj");
706
707         proj_false = get_proj(node, pn_Cond_false);
708         assert(proj_false && "CondJmp without false Proj");
709
710         /* for now, the code works for scheduled and non-schedules blocks */
711         block = get_nodes_block(node);
712
713         /* we have a block schedule */
714         next_block = next_blk_sched(block);
715
716         if (get_cfop_target_block(proj_true) == next_block) {
717                 /* exchange both proj's so the second one can be omitted */
718                 const ir_node *t = proj_true;
719
720                 proj_true  = proj_false;
721                 proj_false = t;
722                 flipped    = 1;
723                 pnc        = get_negated_pnc(pnc, mode);
724         }
725
726         /* in case of unordered compare, check for parity */
727         if (pnc & pn_Cmp_Uo) {
728                 be_emit_cstring(env, "\tjp ");
729                 ia32_emit_cfop_target(env, proj_true);
730                 be_emit_finish_line_gas(env, proj_true);
731         }
732
733         be_emit_cstring(env, "\tj");
734         ia32_emit_cmp_suffix(env, pnc);
735         be_emit_char(env, ' ');
736         ia32_emit_cfop_target(env, proj_true);
737         be_emit_finish_line_gas(env, proj_true);
738
739         /* the second Proj might be a fallthrough */
740         if (get_cfop_target_block(proj_false) != next_block) {
741                 be_emit_cstring(env, "\tjmp ");
742                 ia32_emit_cfop_target(env, proj_false);
743                 be_emit_finish_line_gas(env, proj_false);
744         } else {
745                 be_emit_cstring(env, "\t/* fallthrough to");
746                 ia32_emit_cfop_target(env, proj_false);
747                 be_emit_cstring(env, " */");
748                 be_emit_finish_line_gas(env, proj_false);
749         }
750 }
751
752 /**
753  * Emits code for conditional jump.
754  */
755 static
756 void CondJmp_emitter(ia32_emit_env_t *env, const ir_node *node) {
757         be_emit_cstring(env, "\tcmp ");
758         ia32_emit_binop(env, node);
759         be_emit_finish_line_gas(env, node);
760
761         finish_CondJmp(env, node, mode_Iu, get_ia32_pncode(node));
762 }
763
764 /**
765  * Emits code for conditional jump with two variables.
766  */
767 static
768 void emit_ia32_CondJmp(ia32_emit_env_t *env, const ir_node *node) {
769         CondJmp_emitter(env, node);
770 }
771
772 /**
773  * Emits code for conditional test and jump.
774  */
775 static
776 void TestJmp_emitter(ia32_emit_env_t *env, const ir_node *node) {
777         if(is_ia32_ImmSymConst(node) || is_ia32_ImmConst(node)) {
778                 be_emit_cstring(env, "\ttest $");
779                 ia32_emit_immediate(env, node);
780                 be_emit_cstring(env, ", ");
781                 ia32_emit_source_register(env, node, 0);
782                 be_emit_finish_line_gas(env, node);
783         } else {
784                 be_emit_cstring(env, "\ttest ");
785                 ia32_emit_source_register(env, node, 1);
786                 be_emit_cstring(env, ", ");
787                 ia32_emit_source_register(env, node, 0);
788                 be_emit_finish_line_gas(env, node);
789         }
790         finish_CondJmp(env, node, mode_Iu, get_ia32_pncode(node));
791 }
792
793 /**
794  * Emits code for conditional test and jump with two variables.
795  */
796 static
797 void emit_ia32_TestJmp(ia32_emit_env_t *env, const ir_node *node) {
798         TestJmp_emitter(env, node);
799 }
800
801 static
802 void emit_ia32_CJmp(ia32_emit_env_t *env, const ir_node *node) {
803         be_emit_cstring(env, "/* omitted redundant test */");
804         be_emit_finish_line_gas(env, node);
805
806         finish_CondJmp(env, node, mode_Is, get_ia32_pncode(node));
807 }
808
809 static
810 void emit_ia32_CJmpAM(ia32_emit_env_t *env, const ir_node *node) {
811         be_emit_cstring(env, "/* omitted redundant test/cmp */");
812         be_emit_finish_line_gas(env, node);
813
814         finish_CondJmp(env, node, mode_Is, get_ia32_pncode(node));
815 }
816
817 /**
818  * Emits code for conditional SSE floating point jump with two variables.
819  */
820 static
821 void emit_ia32_xCondJmp(ia32_emit_env_t *env, const ir_node *node) {
822         be_emit_cstring(env, "\tucomi");
823         ia32_emit_xmm_mode_suffix(env, node);
824         be_emit_char(env, ' ');
825         ia32_emit_binop(env, node);
826         be_emit_finish_line_gas(env, node);
827
828         finish_CondJmp(env, node, mode_F, get_ia32_pncode(node));
829 }
830
831 /**
832  * Emits code for conditional x87 floating point jump with two variables.
833  */
834 static
835 void emit_ia32_x87CondJmp(ia32_emit_env_t *env, const ir_node *node) {
836         ia32_attr_t *attr = get_ia32_attr(node);
837         const char *reg = attr->x87[1]->name;
838         long pnc = get_ia32_pncode(node);
839
840         switch (get_ia32_irn_opcode(node)) {
841         case iro_ia32_fcomrJmp:
842                 pnc = get_inversed_pnc(pnc);
843                 reg = attr->x87[0]->name;
844         case iro_ia32_fcomJmp:
845         default:
846                 be_emit_cstring(env, "\tfucom ");
847                 break;
848         case iro_ia32_fcomrpJmp:
849                 pnc = get_inversed_pnc(pnc);
850                 reg = attr->x87[0]->name;
851         case iro_ia32_fcompJmp:
852                 be_emit_cstring(env, "\tfucomp ");
853                 break;
854         case iro_ia32_fcomrppJmp:
855                 pnc = get_inversed_pnc(pnc);
856         case iro_ia32_fcomppJmp:
857                 be_emit_cstring(env, "\tfucompp ");
858                 reg = "";
859                 break;
860         }
861
862         if(reg[0] != '\0') {
863                 be_emit_char(env, '%');
864                 be_emit_string(env, reg);
865         }
866         be_emit_finish_line_gas(env, node);
867
868         be_emit_cstring(env, "\tfnstsw %ax");
869         be_emit_finish_line_gas(env, node);
870         be_emit_cstring(env, "\tsahf");
871         be_emit_finish_line_gas(env, node);
872
873         finish_CondJmp(env, node, mode_E, pnc);
874 }
875
876 static
877 void CMov_emitter(ia32_emit_env_t *env, const ir_node *node) {
878         long pnc = get_ia32_pncode(node);
879         int is_PsiCondCMov = is_ia32_PsiCondCMov(node);
880         int idx_left  = 2 - is_PsiCondCMov;
881         int idx_right = 3 - is_PsiCondCMov;
882         const arch_register_t *in1, *in2, *out;
883
884         out = arch_get_irn_register(env->arch_env, node);
885         in1 = arch_get_irn_register(env->arch_env, get_irn_n(node, idx_left));
886         in2 = arch_get_irn_register(env->arch_env, get_irn_n(node, idx_right));
887
888         /* we have to emit the cmp first, because the destination register */
889         /* could be one of the compare registers                           */
890         if (is_ia32_CmpCMov(node)) {
891                 be_emit_cstring(env, "\tcmp ");
892                 ia32_emit_source_register(env, node, 1);
893                 be_emit_cstring(env, ", ");
894                 ia32_emit_source_register(env, node, 0);
895         } else if (is_ia32_xCmpCMov(node)) {
896                 be_emit_cstring(env, "\tucomis");
897                 ia32_emit_mode_suffix(env, get_irn_mode(node));
898                 be_emit_char(env, ' ');
899                 ia32_emit_source_register(env, node, 1);
900                 be_emit_cstring(env, ", ");
901                 ia32_emit_source_register(env, node, 0);
902         } else if (is_PsiCondCMov) {
903                 /* omit compare because flags are already set by And/Or */
904                 be_emit_cstring(env, "\ttest ");
905                 ia32_emit_source_register(env, node, 0);
906                 be_emit_cstring(env, ", ");
907                 ia32_emit_source_register(env, node, 0);
908         } else {
909                 assert(0 && "unsupported CMov");
910         }
911         be_emit_finish_line_gas(env, node);
912
913         if (REGS_ARE_EQUAL(out, in2)) {
914                 /* best case: default in == out -> do nothing */
915         } else if (REGS_ARE_EQUAL(out, in1)) {
916                 ir_node *n = (ir_node*) node;
917                 /* true in == out -> need complement compare and exchange true and default in */
918                 ir_node *t = get_irn_n(n, idx_left);
919                 set_irn_n(n, idx_left, get_irn_n(n, idx_right));
920                 set_irn_n(n, idx_right, t);
921
922                 pnc = get_negated_pnc(pnc, get_irn_mode(node));
923         } else {
924                 /* out is different from in: need copy default -> out */
925                 if (is_PsiCondCMov) {
926                         be_emit_cstring(env, "\tmovl ");
927                         ia32_emit_dest_register(env, node, 2);
928                         be_emit_cstring(env, ", ");
929                         ia32_emit_dest_register(env, node, 0);
930                 } else {
931                         be_emit_cstring(env, "\tmovl ");
932                         ia32_emit_source_register(env, node, 3);
933                         be_emit_cstring(env, ", ");
934                         ia32_emit_dest_register(env, node, 0);
935                 }
936                 be_emit_finish_line_gas(env, node);
937         }
938
939         if (is_PsiCondCMov) {
940                 be_emit_cstring(env, "\tcmov");
941                 ia32_emit_cmp_suffix(env, pnc);
942                 be_emit_cstring(env, "l ");
943                 ia32_emit_source_register(env, node, 1);
944                 be_emit_cstring(env, ", ");
945                 ia32_emit_dest_register(env, node, 0);
946         } else {
947                 be_emit_cstring(env, "\tcmov");
948                 ia32_emit_cmp_suffix(env, pnc);
949                 be_emit_cstring(env, "l ");
950                 ia32_emit_source_register(env, node, 2);
951                 be_emit_cstring(env, ", ");
952                 ia32_emit_dest_register(env, node, 0);
953         }
954         be_emit_finish_line_gas(env, node);
955 }
956
957 static
958 void emit_ia32_CmpCMov(ia32_emit_env_t *env, const ir_node *node) {
959         CMov_emitter(env, node);
960 }
961
962 static
963 void emit_ia32_PsiCondCMov(ia32_emit_env_t *env, const ir_node *node) {
964         CMov_emitter(env, node);
965 }
966
967 static
968 void emit_ia32_xCmpCMov(ia32_emit_env_t *env, const ir_node *node) {
969         CMov_emitter(env, node);
970 }
971
972 static
973 void Set_emitter(ia32_emit_env_t *env, const ir_node *node, ir_mode *mode) {
974         int pnc = get_ia32_pncode(node);
975         const char *reg8bit;
976         const arch_register_t *out;
977
978         out     = arch_get_irn_register(env->arch_env, node);
979         reg8bit = ia32_get_mapped_reg_name(env->isa->regs_8bit, out);
980
981         if (is_ia32_CmpSet(node)) {
982                 be_emit_cstring(env, "\tcmp ");
983                 ia32_emit_binop(env, node);
984         } else if (is_ia32_xCmpSet(node)) {
985                 be_emit_cstring(env, "\tucomis");
986                 ia32_emit_mode_suffix(env, get_irn_mode(get_irn_n(node, 2)));
987                 be_emit_char(env, ' ');
988                 ia32_emit_binop(env, node);
989         } else if (is_ia32_PsiCondSet(node)) {
990                 be_emit_cstring(env, "\tcmp $0, ");
991                 ia32_emit_source_register(env, node, 0);
992         } else {
993                 assert(0 && "unsupported Set");
994         }
995         be_emit_finish_line_gas(env, node);
996
997         /* use mov to clear target because it doesn't affect the eflags */
998         be_emit_cstring(env, "\tmovl $0, %");
999         be_emit_string(env, arch_register_get_name(out));
1000         be_emit_finish_line_gas(env, node);
1001
1002         be_emit_cstring(env, "\tset");
1003         ia32_emit_cmp_suffix(env, pnc);
1004         be_emit_cstring(env, " %");
1005         be_emit_string(env, reg8bit);
1006         be_emit_finish_line_gas(env, node);
1007 }
1008
1009 static
1010 void emit_ia32_CmpSet(ia32_emit_env_t *env, const ir_node *node) {
1011         Set_emitter(env, node, get_irn_mode(get_irn_n(node, 2)));
1012 }
1013
1014 static
1015 void emit_ia32_PsiCondSet(ia32_emit_env_t *env, const ir_node *node) {
1016         Set_emitter(env, node, get_irn_mode(get_irn_n(node, 0)));
1017 }
1018
1019 static
1020 void emit_ia32_xCmpSet(ia32_emit_env_t *env, const ir_node *node) {
1021         Set_emitter(env, node, get_irn_mode(get_irn_n(node, 2)));
1022 }
1023
1024 static
1025 void emit_ia32_xCmp(ia32_emit_env_t *env, const ir_node *node) {
1026         int  sse_pnc  = -1;
1027         long pnc      = get_ia32_pncode(node);
1028         long unord    = pnc & pn_Cmp_Uo;
1029
1030         assert( (pnc & ia32_pn_Cmp_Unsigned) == 0);
1031
1032         switch (pnc) {
1033                 case pn_Cmp_Leg: /* odered */
1034                         sse_pnc = 7;
1035                         break;
1036                 case pn_Cmp_Uo:  /* unordered */
1037                         sse_pnc = 3;
1038                         break;
1039                 case pn_Cmp_Ue:
1040                 case pn_Cmp_Eq:  /* == */
1041                         sse_pnc = 0;
1042                         break;
1043                 case pn_Cmp_Ul:
1044                 case pn_Cmp_Lt:  /* < */
1045                         sse_pnc = 1;
1046                         break;
1047                 case pn_Cmp_Ule:
1048                 case pn_Cmp_Le: /* <= */
1049                         sse_pnc = 2;
1050                         break;
1051                 case pn_Cmp_Ug:
1052                 case pn_Cmp_Gt:  /* > */
1053                         sse_pnc = 6;
1054                         break;
1055                 case pn_Cmp_Uge:
1056                 case pn_Cmp_Ge: /* >= */
1057                         sse_pnc = 5;
1058                         break;
1059                 case pn_Cmp_Ne:
1060                 case pn_Cmp_Lg:  /* != */
1061                         sse_pnc = 4;
1062                         break;
1063         }
1064
1065         assert(sse_pnc >= 0 && "unsupported compare");
1066
1067         if (unord && sse_pnc != 3) {
1068                 /*
1069                         We need a separate compare against unordered.
1070                         Quick and Dirty solution:
1071                         - get some memory on stack
1072                         - compare
1073                         - store result
1074                         - compare
1075                         - and result and stored result
1076                     - cleanup stack
1077                 */
1078                 be_emit_cstring(env, "\tsubl $8, %esp");
1079                 be_emit_finish_line_gas(env, node);
1080
1081                 be_emit_cstring(env, "\tcmpsd $3, ");
1082                 ia32_emit_binop(env, node);
1083                 be_emit_finish_line_gas(env, node);
1084
1085                 be_emit_cstring(env, "\tmovsd ");
1086                 ia32_emit_dest_register(env, node, 0);
1087                 be_emit_cstring(env, ", (%esp)");
1088                 be_emit_finish_line_gas(env, node);
1089         }
1090
1091         be_emit_cstring(env, "\tcmpsd ");
1092         be_emit_irprintf(env->emit, "%d, ", sse_pnc);
1093         ia32_emit_binop(env, node);
1094         be_emit_finish_line_gas(env, node);
1095
1096         if (unord && sse_pnc != 3) {
1097                 be_emit_cstring(env, "\tandpd (%esp), ");
1098                 ia32_emit_dest_register(env, node, 0);
1099                 be_emit_finish_line_gas(env, node);
1100
1101                 be_emit_cstring(env, "\taddl $8, %esp");
1102                 be_emit_finish_line_gas(env, node);
1103         }
1104 }
1105
1106 /*********************************************************
1107  *                 _ _       _
1108  *                (_) |     (_)
1109  *   ___ _ __ ___  _| |_     _ _   _ _ __ ___  _ __  ___
1110  *  / _ \ '_ ` _ \| | __|   | | | | | '_ ` _ \| '_ \/ __|
1111  * |  __/ | | | | | | |_    | | |_| | | | | | | |_) \__ \
1112  *  \___|_| |_| |_|_|\__|   | |\__,_|_| |_| |_| .__/|___/
1113  *                         _/ |               | |
1114  *                        |__/                |_|
1115  *********************************************************/
1116
1117 /* jump table entry (target and corresponding number) */
1118 typedef struct _branch_t {
1119         ir_node *target;
1120         int      value;
1121 } branch_t;
1122
1123 /* jump table for switch generation */
1124 typedef struct _jmp_tbl_t {
1125         ir_node  *defProj;         /**< default target */
1126         int       min_value;       /**< smallest switch case */
1127         int       max_value;       /**< largest switch case */
1128         int       num_branches;    /**< number of jumps */
1129         char     *label;           /**< label of the jump table */
1130         branch_t *branches;        /**< jump array */
1131 } jmp_tbl_t;
1132
1133 /**
1134  * Compare two variables of type branch_t. Used to sort all switch cases
1135  */
1136 static
1137 int ia32_cmp_branch_t(const void *a, const void *b) {
1138         branch_t *b1 = (branch_t *)a;
1139         branch_t *b2 = (branch_t *)b;
1140
1141         if (b1->value <= b2->value)
1142                 return -1;
1143         else
1144                 return 1;
1145 }
1146
1147 /**
1148  * Emits code for a SwitchJmp (creates a jump table if
1149  * possible otherwise a cmp-jmp cascade). Port from
1150  * cggg ia32 backend
1151  */
1152 static
1153 void emit_ia32_SwitchJmp(ia32_emit_env_t *env, const ir_node *node) {
1154         unsigned long       interval;
1155         int                 last_value, i;
1156         long                pnc;
1157         jmp_tbl_t           tbl;
1158         ir_node            *proj;
1159         const ir_edge_t    *edge;
1160
1161         /* fill the table structure */
1162         tbl.label        = xmalloc(SNPRINTF_BUF_LEN);
1163         tbl.label        = get_unique_label(tbl.label, SNPRINTF_BUF_LEN, ".TBL_");
1164         tbl.defProj      = NULL;
1165         tbl.num_branches = get_irn_n_edges(node);
1166         tbl.branches     = xcalloc(tbl.num_branches, sizeof(tbl.branches[0]));
1167         tbl.min_value    = INT_MAX;
1168         tbl.max_value    = INT_MIN;
1169
1170         i = 0;
1171         /* go over all proj's and collect them */
1172         foreach_out_edge(node, edge) {
1173                 proj = get_edge_src_irn(edge);
1174                 assert(is_Proj(proj) && "Only proj allowed at SwitchJmp");
1175
1176                 pnc = get_Proj_proj(proj);
1177
1178                 /* create branch entry */
1179                 tbl.branches[i].target = proj;
1180                 tbl.branches[i].value  = pnc;
1181
1182                 tbl.min_value = pnc < tbl.min_value ? pnc : tbl.min_value;
1183                 tbl.max_value = pnc > tbl.max_value ? pnc : tbl.max_value;
1184
1185                 /* check for default proj */
1186                 if (pnc == get_ia32_pncode(node)) {
1187                         assert(tbl.defProj == NULL && "found two defProjs at SwitchJmp");
1188                         tbl.defProj = proj;
1189                 }
1190
1191                 i++;
1192         }
1193
1194         /* sort the branches by their number */
1195         qsort(tbl.branches, tbl.num_branches, sizeof(tbl.branches[0]), ia32_cmp_branch_t);
1196
1197         /* two-complement's magic make this work without overflow */
1198         interval = tbl.max_value - tbl.min_value;
1199
1200         /* emit the table */
1201         be_emit_cstring(env, "\tcmpl $");
1202         be_emit_irprintf(env->emit, "%u, ", interval);
1203         ia32_emit_source_register(env, node, 0);
1204         be_emit_finish_line_gas(env, node);
1205
1206         be_emit_cstring(env, "\tja ");
1207         ia32_emit_cfop_target(env, tbl.defProj);
1208         be_emit_finish_line_gas(env, node);
1209
1210         if (tbl.num_branches > 1) {
1211                 /* create table */
1212                 be_emit_cstring(env, "\tjmp *");
1213                 be_emit_string(env, tbl.label);
1214                 be_emit_cstring(env, "(,");
1215                 ia32_emit_source_register(env, node, 0);
1216                 be_emit_cstring(env, ",4)");
1217                 be_emit_finish_line_gas(env, node);
1218
1219                 be_gas_emit_switch_section(env->emit, GAS_SECTION_RODATA);
1220                 be_emit_cstring(env, "\t.align 4\n");
1221                 be_emit_write_line(env);
1222
1223                 be_emit_string(env, tbl.label);
1224                 be_emit_cstring(env, ":\n");
1225                 be_emit_write_line(env);
1226
1227                 be_emit_cstring(env, ".long ");
1228                 ia32_emit_cfop_target(env, tbl.branches[0].target);
1229                 be_emit_finish_line_gas(env, NULL);
1230
1231                 last_value = tbl.branches[0].value;
1232                 for (i = 1; i < tbl.num_branches; ++i) {
1233                         while (++last_value < tbl.branches[i].value) {
1234                                 be_emit_cstring(env, ".long ");
1235                                 ia32_emit_cfop_target(env, tbl.defProj);
1236                                 be_emit_finish_line_gas(env, NULL);
1237                         }
1238                         be_emit_cstring(env, ".long ");
1239                         ia32_emit_cfop_target(env, tbl.branches[i].target);
1240                         be_emit_finish_line_gas(env, NULL);
1241                 }
1242                 be_gas_emit_switch_section(env->emit, GAS_SECTION_TEXT);
1243         } else {
1244                 /* one jump is enough */
1245                 be_emit_cstring(env, "\tjmp ");
1246                 ia32_emit_cfop_target(env, tbl.branches[0].target);
1247                 be_emit_finish_line_gas(env, node);
1248         }
1249
1250         if (tbl.label)
1251                 free(tbl.label);
1252         if (tbl.branches)
1253                 free(tbl.branches);
1254 }
1255
1256 /**
1257  * Emits code for a unconditional jump.
1258  */
1259 static
1260 void emit_Jmp(ia32_emit_env_t *env, const ir_node *node) {
1261         ir_node *block, *next_block;
1262
1263         /* for now, the code works for scheduled and non-schedules blocks */
1264         block = get_nodes_block(node);
1265
1266         /* we have a block schedule */
1267         next_block = next_blk_sched(block);
1268         if (get_cfop_target_block(node) != next_block) {
1269                 be_emit_cstring(env, "\tjmp ");
1270                 ia32_emit_cfop_target(env, node);
1271         } else {
1272                 be_emit_cstring(env, "\t/* fallthrough to ");
1273                 ia32_emit_cfop_target(env, node);
1274                 be_emit_cstring(env, " */");
1275         }
1276         be_emit_finish_line_gas(env, node);
1277 }
1278
1279 /**********************************
1280  *   _____                  ____
1281  *  / ____|                |  _ \
1282  * | |     ___  _ __  _   _| |_) |
1283  * | |    / _ \| '_ \| | | |  _ <
1284  * | |___| (_) | |_) | |_| | |_) |
1285  *  \_____\___/| .__/ \__, |____/
1286  *             | |     __/ |
1287  *             |_|    |___/
1288  **********************************/
1289
1290 /**
1291  * Emit movsb/w instructions to make mov count divideable by 4
1292  */
1293 static
1294 void emit_CopyB_prolog(ia32_emit_env_t *env, int rem) {
1295         be_emit_cstring(env, "\tcld");
1296         be_emit_finish_line_gas(env, NULL);
1297
1298         switch(rem) {
1299         case 1:
1300                 be_emit_cstring(env, "\tmovsb");
1301                 be_emit_finish_line_gas(env, NULL);
1302                 break;
1303         case 2:
1304                 be_emit_cstring(env, "\tmovsw");
1305                 be_emit_finish_line_gas(env, NULL);
1306                 break;
1307         case 3:
1308                 be_emit_cstring(env, "\tmovsb");
1309                 be_emit_finish_line_gas(env, NULL);
1310                 be_emit_cstring(env, "\tmovsw");
1311                 be_emit_finish_line_gas(env, NULL);
1312                 break;
1313         }
1314 }
1315
1316 /**
1317  * Emit rep movsd instruction for memcopy.
1318  */
1319 static
1320 void emit_ia32_CopyB(ia32_emit_env_t *env, const ir_node *node) {
1321         tarval *tv = get_ia32_Immop_tarval(node);
1322         int    rem = get_tarval_long(tv);
1323
1324         emit_CopyB_prolog(env, rem);
1325
1326         be_emit_cstring(env, "\trep movsd");
1327         be_emit_finish_line_gas(env, node);
1328 }
1329
1330 /**
1331  * Emits unrolled memcopy.
1332  */
1333 static
1334 void emit_ia32_CopyB_i(ia32_emit_env_t *env, const ir_node *node) {
1335         tarval *tv   = get_ia32_Immop_tarval(node);
1336         int     size = get_tarval_long(tv);
1337
1338         emit_CopyB_prolog(env, size & 0x3);
1339
1340         size >>= 2;
1341         while (size--) {
1342                 be_emit_cstring(env, "\tmovsd");
1343                 be_emit_finish_line_gas(env, NULL);
1344         }
1345 }
1346
1347
1348
1349 /***************************
1350  *   _____
1351  *  / ____|
1352  * | |     ___  _ ____   __
1353  * | |    / _ \| '_ \ \ / /
1354  * | |___| (_) | | | \ V /
1355  *  \_____\___/|_| |_|\_/
1356  *
1357  ***************************/
1358
1359 /**
1360  * Emit code for conversions (I, FP), (FP, I) and (FP, FP).
1361  */
1362 static
1363 void emit_ia32_Conv_with_FP(ia32_emit_env_t *env, const ir_node *node) {
1364         ir_mode            *ls_mode = get_ia32_ls_mode(node);
1365         int                 ls_bits = get_mode_size_bits(ls_mode);
1366
1367         be_emit_cstring(env, "\tcvt");
1368
1369         if(is_ia32_Conv_I2FP(node)) {
1370                 if(ls_bits == 32) {
1371                         be_emit_cstring(env, "si2ss");
1372                 } else {
1373                         be_emit_cstring(env, "si2sd");
1374                 }
1375         } else if(is_ia32_Conv_FP2I(node)) {
1376                 if(ls_bits == 32) {
1377                         be_emit_cstring(env, "ss2si");
1378                 } else {
1379                         be_emit_cstring(env, "sd2si");
1380                 }
1381         } else {
1382                 assert(is_ia32_Conv_FP2FP(node));
1383                 if(ls_bits == 32) {
1384                         be_emit_cstring(env, "sd2ss");
1385                 } else {
1386                         be_emit_cstring(env, "ss2sd");
1387                 }
1388         }
1389         be_emit_char(env, ' ');
1390
1391         switch(get_ia32_op_type(node)) {
1392                 case ia32_Normal:
1393                         ia32_emit_source_register(env, node, 2);
1394                         be_emit_cstring(env, ", ");
1395                         ia32_emit_dest_register(env, node, 0);
1396                         break;
1397                 case ia32_AddrModeS:
1398                         ia32_emit_dest_register(env, node, 0);
1399                         be_emit_cstring(env, ", ");
1400                         ia32_emit_am(env, node);
1401                         break;
1402                 default:
1403                         assert(0 && "unsupported op type for Conv");
1404         }
1405         be_emit_finish_line_gas(env, node);
1406 }
1407
1408 static
1409 void emit_ia32_Conv_I2FP(ia32_emit_env_t *env, const ir_node *node) {
1410         emit_ia32_Conv_with_FP(env, node);
1411 }
1412
1413 static
1414 void emit_ia32_Conv_FP2I(ia32_emit_env_t *env, const ir_node *node) {
1415         emit_ia32_Conv_with_FP(env, node);
1416 }
1417
1418 static
1419 void emit_ia32_Conv_FP2FP(ia32_emit_env_t *env, const ir_node *node) {
1420         emit_ia32_Conv_with_FP(env, node);
1421 }
1422
1423 /**
1424  * Emits code for an Int conversion.
1425  */
1426 static
1427 void emit_ia32_Conv_I2I(ia32_emit_env_t *env, const ir_node *node) {
1428         const char *sign_suffix;
1429         ir_mode *smaller_mode = get_ia32_ls_mode(node);
1430         int smaller_bits = get_mode_size_bits(smaller_mode);
1431         int signed_mode;
1432         const arch_register_t *in_reg, *out_reg;
1433
1434         assert(!mode_is_float(smaller_mode));
1435         assert(smaller_bits == 8 || smaller_bits == 16 || smaller_bits == 32);
1436
1437         signed_mode = mode_is_signed(smaller_mode);
1438         if(smaller_bits == 32) {
1439                 // this should not happen as it's no convert
1440                 assert(0);
1441                 sign_suffix = "";
1442         } else {
1443                 sign_suffix = signed_mode ? "s" : "z";
1444         }
1445
1446         switch(get_ia32_op_type(node)) {
1447                 case ia32_Normal:
1448                         in_reg  = get_in_reg(env, node, 2);
1449                         out_reg = get_out_reg(env, node, 0);
1450
1451                         if (REGS_ARE_EQUAL(in_reg, &ia32_gp_regs[REG_EAX]) &&
1452                                 REGS_ARE_EQUAL(out_reg, in_reg)                &&
1453                                 signed_mode)
1454                         {
1455                                 /* argument and result are both in EAX and */
1456                                 /* signedness is ok: -> use converts       */
1457                                 if (smaller_bits == 8) {
1458                                         be_emit_cstring(env, "\tcbtw");
1459                                 } else if (smaller_bits == 16) {
1460                                         be_emit_cstring(env, "\tcwtl");
1461                                 } else {
1462                                         assert(0);
1463                                 }
1464                         } else if (REGS_ARE_EQUAL(out_reg, in_reg) && !signed_mode) {
1465                                 /* argument and result are in the same register */
1466                                 /* and signedness is ok: -> use and with mask   */
1467                                 int mask = (1 << smaller_bits) - 1;
1468                                 be_emit_cstring(env, "\tandl $0x");
1469                                 be_emit_irprintf(env->emit, "%x, ", mask);
1470                                 ia32_emit_dest_register(env, node, 0);
1471                         } else {
1472                                 const char *sreg = ia32_get_reg_name_for_mode(env, smaller_mode, in_reg);
1473
1474                                 be_emit_cstring(env, "\tmov");
1475                                 be_emit_string(env, sign_suffix);
1476                                 ia32_emit_mode_suffix(env, smaller_mode);
1477                                 be_emit_cstring(env, "l %");
1478                                 be_emit_string(env, sreg);
1479                                 be_emit_cstring(env, ", ");
1480                                 ia32_emit_dest_register(env, node, 0);
1481                         }
1482                         break;
1483                 case ia32_AddrModeS: {
1484                         be_emit_cstring(env, "\tmov");
1485                         be_emit_string(env, sign_suffix);
1486                         ia32_emit_mode_suffix(env, smaller_mode);
1487                         be_emit_cstring(env, "l %");
1488                         ia32_emit_am(env, node);
1489                         be_emit_cstring(env, ", ");
1490                         ia32_emit_dest_register(env, node, 0);
1491                         break;
1492                 }
1493                 default:
1494                         assert(0 && "unsupported op type for Conv");
1495         }
1496         be_emit_finish_line_gas(env, node);
1497 }
1498
1499 /**
1500  * Emits code for an 8Bit Int conversion.
1501  */
1502 void emit_ia32_Conv_I2I8Bit(ia32_emit_env_t *env, const ir_node *node) {
1503         emit_ia32_Conv_I2I(env, node);
1504 }
1505
1506
1507 /*******************************************
1508  *  _                          _
1509  * | |                        | |
1510  * | |__   ___ _ __   ___   __| | ___  ___
1511  * | '_ \ / _ \ '_ \ / _ \ / _` |/ _ \/ __|
1512  * | |_) |  __/ | | | (_) | (_| |  __/\__ \
1513  * |_.__/ \___|_| |_|\___/ \__,_|\___||___/
1514  *
1515  *******************************************/
1516
1517 /**
1518  * Emits a backend call
1519  */
1520 static
1521 void emit_be_Call(ia32_emit_env_t *env, const ir_node *node) {
1522         ir_entity *ent = be_Call_get_entity(node);
1523
1524         be_emit_cstring(env, "\tcall ");
1525         if (ent) {
1526                 mark_entity_visited(ent);
1527                 be_emit_string(env, get_entity_ld_name(ent));
1528         } else {
1529                 be_emit_char(env, '*');
1530                 ia32_emit_dest_register(env, get_irn_n(node, be_pos_Call_ptr), 0);
1531         }
1532         be_emit_finish_line_gas(env, node);
1533 }
1534
1535 /**
1536  * Emits code to increase stack pointer.
1537  */
1538 static
1539 void emit_be_IncSP(ia32_emit_env_t *env, const ir_node *node) {
1540         int offs = be_get_IncSP_offset(node);
1541
1542         if (offs == 0)
1543                 return;
1544
1545         if (offs > 0) {
1546                 be_emit_cstring(env, "\tsubl $");
1547                 be_emit_irprintf(env->emit, "%u, ", offs);
1548                 ia32_emit_source_register(env, node, 0);
1549         } else {
1550                 be_emit_cstring(env, "\taddl $");
1551                 be_emit_irprintf(env->emit, "%u, ", -offs);
1552                 ia32_emit_source_register(env, node, 0);
1553         }
1554         be_emit_finish_line_gas(env, node);
1555 }
1556
1557 /**
1558  * Emits code to set stack pointer.
1559  */
1560 static
1561 void emit_be_SetSP(ia32_emit_env_t *env, const ir_node *node) {
1562         be_emit_cstring(env, "\tmovl ");
1563         ia32_emit_source_register(env, node, 2);
1564         be_emit_cstring(env, ", ");
1565         ia32_emit_dest_register(env, node, 0);
1566         be_emit_finish_line_gas(env, node);
1567 }
1568
1569 /**
1570  * Emits code for Copy/CopyKeep.
1571  */
1572 static
1573 void Copy_emitter(ia32_emit_env_t *env, const ir_node *node, const ir_node *op)
1574 {
1575         const arch_env_t *aenv = env->arch_env;
1576
1577         if (REGS_ARE_EQUAL(arch_get_irn_register(aenv, node), arch_get_irn_register(aenv, op)) ||
1578                 arch_register_type_is(arch_get_irn_register(aenv, op), virtual))
1579                 return;
1580
1581         if (mode_is_float(get_irn_mode(node))) {
1582                 be_emit_cstring(env, "\tmovsd ");
1583                 ia32_emit_source_register(env, node, 0);
1584                 be_emit_cstring(env, ", ");
1585                 ia32_emit_dest_register(env, node, 0);
1586         } else {
1587                 be_emit_cstring(env, "\tmovl ");
1588                 ia32_emit_source_register(env, node, 0);
1589                 be_emit_cstring(env, ", ");
1590                 ia32_emit_dest_register(env, node, 0);
1591         }
1592         be_emit_finish_line_gas(env, node);
1593 }
1594
1595 static
1596 void emit_be_Copy(ia32_emit_env_t *env, const ir_node *node) {
1597         Copy_emitter(env, node, be_get_Copy_op(node));
1598 }
1599
1600 static
1601 void emit_be_CopyKeep(ia32_emit_env_t *env, const ir_node *node) {
1602         Copy_emitter(env, node, be_get_CopyKeep_op(node));
1603 }
1604
1605 /**
1606  * Emits code for exchange.
1607  */
1608 static
1609 void emit_be_Perm(ia32_emit_env_t *env, const ir_node *node) {
1610         const arch_register_t *in1, *in2;
1611         const arch_register_class_t *cls1, *cls2;
1612
1613         in1 = arch_get_irn_register(env->arch_env, get_irn_n(node, 0));
1614         in2 = arch_get_irn_register(env->arch_env, get_irn_n(node, 1));
1615
1616         cls1 = arch_register_get_class(in1);
1617         cls2 = arch_register_get_class(in2);
1618
1619         assert(cls1 == cls2 && "Register class mismatch at Perm");
1620
1621         if (cls1 == &ia32_reg_classes[CLASS_ia32_gp]) {
1622                 be_emit_cstring(env, "\txchg ");
1623                 ia32_emit_source_register(env, node, 1);
1624                 be_emit_cstring(env, ", ");
1625                 ia32_emit_source_register(env, node, 0);
1626                 be_emit_finish_line_gas(env, node);
1627         } else if (cls1 == &ia32_reg_classes[CLASS_ia32_xmm]) {
1628                 be_emit_cstring(env, "\txorpd ");
1629                 ia32_emit_source_register(env, node, 1);
1630                 be_emit_cstring(env, ", ");
1631                 ia32_emit_source_register(env, node, 0);
1632                 be_emit_finish_line_gas(env, NULL);
1633
1634                 be_emit_cstring(env, "\txorpd ");
1635                 ia32_emit_source_register(env, node, 0);
1636                 be_emit_cstring(env, ", ");
1637                 ia32_emit_source_register(env, node, 1);
1638                 be_emit_finish_line_gas(env, NULL);
1639
1640                 be_emit_cstring(env, "\txorpd ");
1641                 ia32_emit_source_register(env, node, 1);
1642                 be_emit_cstring(env, ", ");
1643                 ia32_emit_source_register(env, node, 0);
1644                 be_emit_finish_line_gas(env, node);
1645         } else if (cls1 == &ia32_reg_classes[CLASS_ia32_vfp]) {
1646                 /* is a NOP */
1647         } else if (cls1 == &ia32_reg_classes[CLASS_ia32_st]) {
1648                 /* is a NOP */
1649         }
1650 }
1651
1652 /**
1653  * Emits code for Constant loading.
1654  */
1655 static
1656 void emit_ia32_Const(ia32_emit_env_t *env, const ir_node *node) {
1657         ia32_immop_type_t imm_tp = get_ia32_immop_type(node);
1658
1659         if (imm_tp == ia32_ImmSymConst) {
1660                 be_emit_cstring(env, "\tmovl $");
1661                 ia32_emit_immediate(env, node);
1662                 be_emit_cstring(env, ", ");
1663                 ia32_emit_dest_register(env, node, 0);
1664         } else {
1665                 tarval *tv = get_ia32_Immop_tarval(node);
1666                 assert(get_irn_mode(node) == mode_Iu);
1667                 /* beware: in some rare cases mode is mode_b which has no tarval_null() */
1668                 if (tarval_is_null(tv)) {
1669                         if (env->isa->opt_arch == arch_pentium_4) {
1670                                 /* P4 prefers sub r, r, others xor r, r */
1671                                 be_emit_cstring(env, "\tsubl ");
1672                         } else {
1673                                 be_emit_cstring(env, "\txorl ");
1674                         }
1675                         ia32_emit_dest_register(env, node, 0);
1676                         be_emit_cstring(env, ", ");
1677                         ia32_emit_dest_register(env, node, 0);
1678                 } else {
1679                         be_emit_cstring(env, "\tmovl $");
1680                         ia32_emit_immediate(env, node);
1681                         be_emit_cstring(env, ", ");
1682                         ia32_emit_dest_register(env, node, 0);
1683                 }
1684         }
1685         be_emit_finish_line_gas(env, node);
1686 }
1687
1688 /**
1689  * Emits code to load the TLS base
1690  */
1691 static
1692 void emit_ia32_LdTls(ia32_emit_env_t *env, const ir_node *node) {
1693         be_emit_cstring(env, "\tmovl %gs:0, ");
1694         ia32_emit_dest_register(env, node, 0);
1695         be_emit_finish_line_gas(env, node);
1696 }
1697
1698 static
1699 void emit_be_Return(ia32_emit_env_t *env, const ir_node *node) {
1700         be_emit_cstring(env, "\tret");
1701         be_emit_finish_line_gas(env, node);
1702 }
1703
1704 static
1705 void emit_Nothing(ia32_emit_env_t *env, const ir_node *node) {
1706 }
1707
1708
1709 /***********************************************************************************
1710  *                  _          __                                             _
1711  *                 (_)        / _|                                           | |
1712  *  _ __ ___   __ _ _ _ __   | |_ _ __ __ _ _ __ ___   _____      _____  _ __| | __
1713  * | '_ ` _ \ / _` | | '_ \  |  _| '__/ _` | '_ ` _ \ / _ \ \ /\ / / _ \| '__| |/ /
1714  * | | | | | | (_| | | | | | | | | | | (_| | | | | | |  __/\ V  V / (_) | |  |   <
1715  * |_| |_| |_|\__,_|_|_| |_| |_| |_|  \__,_|_| |_| |_|\___| \_/\_/ \___/|_|  |_|\_\
1716  *
1717  ***********************************************************************************/
1718
1719 /**
1720  * Enters the emitter functions for handled nodes into the generic
1721  * pointer of an opcode.
1722  */
1723 static
1724 void ia32_register_emitters(void) {
1725
1726 #define IA32_EMIT2(a,b) op_ia32_##a->ops.generic = (op_func)emit_ia32_##b
1727 #define IA32_EMIT(a)    IA32_EMIT2(a,a)
1728 #define EMIT(a)         op_##a->ops.generic = (op_func)emit_##a
1729 #define IGN(a)                  op_##a->ops.generic = (op_func)emit_Nothing
1730 #define BE_EMIT(a)      op_be_##a->ops.generic = (op_func)emit_be_##a
1731 #define BE_IGN(a)               op_be_##a->ops.generic = (op_func)emit_Nothing
1732
1733         /* first clear the generic function pointer for all ops */
1734         clear_irp_opcodes_generic_func();
1735
1736         /* register all emitter functions defined in spec */
1737         ia32_register_spec_emitters();
1738
1739         /* other ia32 emitter functions */
1740         IA32_EMIT(CondJmp);
1741         IA32_EMIT(TestJmp);
1742         IA32_EMIT(CJmp);
1743         IA32_EMIT(CJmpAM);
1744         IA32_EMIT(CmpCMov);
1745         IA32_EMIT(PsiCondCMov);
1746         IA32_EMIT(CmpSet);
1747         IA32_EMIT(PsiCondSet);
1748         IA32_EMIT(SwitchJmp);
1749         IA32_EMIT(CopyB);
1750         IA32_EMIT(CopyB_i);
1751         IA32_EMIT(Conv_I2FP);
1752         IA32_EMIT(Conv_FP2I);
1753         IA32_EMIT(Conv_FP2FP);
1754         IA32_EMIT(Conv_I2I);
1755         IA32_EMIT(Conv_I2I8Bit);
1756         IA32_EMIT(Const);
1757         IA32_EMIT(LdTls);
1758         IA32_EMIT(xCmp);
1759         IA32_EMIT(xCmpSet);
1760         IA32_EMIT(xCmpCMov);
1761         IA32_EMIT(xCondJmp);
1762         IA32_EMIT2(fcomJmp, x87CondJmp);
1763         IA32_EMIT2(fcompJmp, x87CondJmp);
1764         IA32_EMIT2(fcomppJmp, x87CondJmp);
1765         IA32_EMIT2(fcomrJmp, x87CondJmp);
1766         IA32_EMIT2(fcomrpJmp, x87CondJmp);
1767         IA32_EMIT2(fcomrppJmp, x87CondJmp);
1768
1769         /* benode emitter */
1770         BE_EMIT(Call);
1771         BE_EMIT(IncSP);
1772         BE_EMIT(SetSP);
1773         BE_EMIT(Copy);
1774         BE_EMIT(CopyKeep);
1775         BE_EMIT(Perm);
1776         BE_EMIT(Return);
1777
1778         BE_IGN(RegParams);
1779         BE_IGN(Barrier);
1780         BE_IGN(Keep);
1781
1782         /* firm emitter */
1783         EMIT(Jmp);
1784         IGN(Proj);
1785         IGN(Phi);
1786         IGN(Start);
1787
1788 #undef BE_EMIT
1789 #undef EMIT
1790 #undef IGN
1791 #undef IA32_EMIT2
1792 #undef IA32_EMIT
1793 }
1794
1795 static const char *last_name = NULL;
1796 static unsigned last_line = -1;
1797 static unsigned num = -1;
1798
1799 /**
1800  * Emit the debug support for node node.
1801  */
1802 static
1803 void ia32_emit_dbg(ia32_emit_env_t *env, const ir_node *node) {
1804         dbg_info *db = get_irn_dbg_info(node);
1805         unsigned lineno;
1806         const char *fname = be_retrieve_dbg_info(db, &lineno);
1807
1808         if (! env->cg->birg->main_env->options->stabs_debug_support)
1809                 return;
1810
1811         if (fname) {
1812                 if (last_name != fname) {
1813                         last_line = -1;
1814                         be_dbg_include_begin(env->cg->birg->main_env->db_handle, fname);
1815                         last_name = fname;
1816                 }
1817                 if (last_line != lineno) {
1818                         char name[64];
1819
1820                         snprintf(name, sizeof(name), ".LM%u", ++num);
1821                         last_line = lineno;
1822                         be_dbg_line(env->cg->birg->main_env->db_handle, lineno, name);
1823                         be_emit_string(env, name);
1824                         be_emit_cstring(env, ":\n");
1825                         be_emit_write_line(env);
1826                 }
1827         }
1828 }
1829
1830 typedef void (*emit_func_ptr) (ia32_emit_env_t *, const ir_node *);
1831
1832 /**
1833  * Emits code for a node.
1834  */
1835 static
1836 void ia32_emit_node(ia32_emit_env_t *env, const ir_node *node) {
1837         ir_op *op = get_irn_op(node);
1838
1839         DBG((dbg, LEVEL_1, "emitting code for %+F\n", node));
1840
1841         if (op->ops.generic) {
1842                 emit_func_ptr func = (emit_func_ptr) op->ops.generic;
1843                 ia32_emit_dbg(env, node);
1844                 (*func) (env, node);
1845         } else {
1846                 emit_Nothing(env, node);
1847                 ir_fprintf(stderr, "Warning: No emit handler for node %+F (%+G)\n", node, node);
1848         }
1849 }
1850
1851 /**
1852  * Emits gas alignment directives
1853  */
1854 static
1855 void ia32_emit_alignment(ia32_emit_env_t *env, unsigned align, unsigned skip) {
1856         be_emit_cstring(env, "\t.p2align ");
1857         be_emit_irprintf(env->emit, "%u,,%u\n", align, skip);
1858         be_emit_write_line(env);
1859 }
1860
1861 /**
1862  * Emits gas alignment directives for Functions depended on cpu architecture.
1863  */
1864 static
1865 void ia32_emit_align_func(ia32_emit_env_t *env, cpu_support cpu) {
1866         unsigned align;
1867         unsigned maximum_skip;
1868
1869         switch (cpu) {
1870                 case arch_i386:
1871                         align = 2;
1872                         break;
1873                 case arch_i486:
1874                         align = 4;
1875                         break;
1876                 case arch_k6:
1877                         align = 5;
1878                         break;
1879                 default:
1880                         align = 4;
1881         }
1882         maximum_skip = (1 << align) - 1;
1883         ia32_emit_alignment(env, align, maximum_skip);
1884 }
1885
1886 /**
1887  * Emits gas alignment directives for Labels depended on cpu architecture.
1888  */
1889 static
1890 void ia32_emit_align_label(ia32_emit_env_t *env, cpu_support cpu) {
1891         unsigned align; unsigned maximum_skip;
1892
1893         switch (cpu) {
1894                 case arch_i386:
1895                         align = 2;
1896                         break;
1897                 case arch_i486:
1898                         align = 4;
1899                         break;
1900                 case arch_k6:
1901                         align = 5;
1902                         break;
1903                 default:
1904                         align = 4;
1905         }
1906         maximum_skip = (1 << align) - 1;
1907         ia32_emit_alignment(env, align, maximum_skip);
1908 }
1909
1910 static
1911 int is_first_loop_block(ia32_emit_env_t *env, ir_node *block, ir_node *prev_block) {
1912         ir_exec_freq *exec_freq = env->cg->birg->exec_freq;
1913         double block_freq, prev_freq;
1914         static const double DELTA = .0001;
1915         cpu_support cpu = env->isa->opt_arch;
1916
1917         if(exec_freq == NULL)
1918                 return 0;
1919         if(cpu == arch_i386 || cpu == arch_i486)
1920                 return 0;
1921
1922         block_freq = get_block_execfreq(exec_freq, block);
1923         prev_freq = get_block_execfreq(exec_freq, prev_block);
1924
1925         if(block_freq < DELTA || prev_freq < DELTA)
1926                 return 0;
1927
1928         block_freq /= prev_freq;
1929
1930         switch (cpu) {
1931                 case arch_athlon:
1932                 case arch_athlon_64:
1933                 case arch_k6:
1934                         return block_freq > 3;
1935                 default:
1936                         break;
1937         }
1938
1939         return block_freq > 2;
1940 }
1941
1942 /**
1943  * Walks over the nodes in a block connected by scheduling edges
1944  * and emits code for each node.
1945  */
1946 static
1947 void ia32_gen_block(ia32_emit_env_t *env, ir_node *block, ir_node *last_block) {
1948         ir_graph      *irg         = get_irn_irg(block);
1949         ir_node       *start_block = get_irg_start_block(irg);
1950         int           need_label   = 1;
1951         const ir_node *node;
1952         int           i;
1953
1954         assert(is_Block(block));
1955
1956         if (block == start_block)
1957                 need_label = 0;
1958
1959         if (need_label && get_irn_arity(block) == 1) {
1960                 ir_node *pred_block = get_Block_cfgpred_block(block, 0);
1961
1962                 if (pred_block == last_block && get_irn_n_edges_kind(pred_block, EDGE_KIND_BLOCK) <= 2)
1963                         need_label = 0;
1964         }
1965
1966         /* special case: if one of our cfg preds is a switch-jmp we need a label, */
1967         /*               otherwise there might be jump table entries jumping to   */
1968         /*               non-existent (omitted) labels                            */
1969         for (i = get_Block_n_cfgpreds(block) - 1; i >= 0; --i) {
1970                 ir_node *pred = get_Block_cfgpred(block, i);
1971
1972                 if (is_Proj(pred)) {
1973                         assert(get_irn_mode(pred) == mode_X);
1974                         if (is_ia32_SwitchJmp(get_Proj_pred(pred))) {
1975                                 need_label = 1;
1976                                 break;
1977                         }
1978                 }
1979         }
1980
1981         if (need_label) {
1982                 int i, arity;
1983                 int align = 1;
1984                 ir_exec_freq *exec_freq = env->cg->birg->exec_freq;
1985
1986                 /* align the loop headers */
1987                 if (! is_first_loop_block(env, block, last_block)) {
1988                         /* align blocks where the previous block has no fallthrough */
1989                         arity = get_irn_arity(block);
1990
1991                         for (i = 0; i < arity; ++i) {
1992                                 ir_node *predblock = get_Block_cfgpred_block(block, i);
1993
1994                                 if (predblock == last_block) {
1995                                         align = 0;
1996                                         break;
1997                                 }
1998                         }
1999                 }
2000
2001                 if (align)
2002                         ia32_emit_align_label(env, env->isa->opt_arch);
2003
2004                 be_emit_cstring(env, BLOCK_PREFIX);
2005                 be_emit_irprintf(env->emit, "%d:", get_irn_node_nr(block));
2006                 be_emit_pad_comment(env);
2007                 be_emit_cstring(env, "   /* preds:");
2008
2009                 /* emit list of pred blocks in comment */
2010                 arity = get_irn_arity(block);
2011                 for (i = 0; i < arity; ++i) {
2012                         ir_node *predblock = get_Block_cfgpred_block(block, i);
2013                         be_emit_irprintf(env->emit, " %d", get_irn_node_nr(predblock));
2014                 }
2015
2016                 if (exec_freq != NULL) {
2017                         be_emit_irprintf(env->emit, " freq: %f", get_block_execfreq(exec_freq, block));
2018                 }
2019                 be_emit_cstring(env, " */\n");
2020                 be_emit_write_line(env);
2021         }
2022
2023         /* emit the contents of the block */
2024         ia32_emit_dbg(env, block);
2025         sched_foreach(block, node) {
2026                 ia32_emit_node(env, node);
2027         }
2028 }
2029
2030 /**
2031  * Emits code for function start.
2032  */
2033 static
2034 void ia32_emit_func_prolog(ia32_emit_env_t *env, ir_graph *irg) {
2035         ir_entity  *irg_ent  = get_irg_entity(irg);
2036         const char *irg_name = get_entity_ld_name(irg_ent);
2037         cpu_support cpu      = env->isa->opt_arch;
2038         const be_irg_t *birg = env->cg->birg;
2039
2040         be_emit_write_line(env);
2041         be_gas_emit_switch_section(env->emit, GAS_SECTION_TEXT);
2042         be_dbg_method_begin(birg->main_env->db_handle, irg_ent, be_abi_get_stack_layout(birg->abi));
2043         ia32_emit_align_func(env, cpu);
2044         if (get_entity_visibility(irg_ent) == visibility_external_visible) {
2045                 be_emit_cstring(env, ".global ");
2046                 be_emit_string(env, irg_name);
2047                 be_emit_char(env, '\n');
2048                 be_emit_write_line(env);
2049         }
2050         ia32_emit_function_object(env, irg_name);
2051         be_emit_string(env, irg_name);
2052         be_emit_cstring(env, ":\n");
2053         be_emit_write_line(env);
2054 }
2055
2056 /**
2057  * Emits code for function end
2058  */
2059 static
2060 void ia32_emit_func_epilog(ia32_emit_env_t *env, ir_graph *irg) {
2061         const char *irg_name = get_entity_ld_name(get_irg_entity(irg));
2062         const be_irg_t *birg = env->cg->birg;
2063
2064         ia32_emit_function_size(env, irg_name);
2065         be_dbg_method_end(birg->main_env->db_handle);
2066         be_emit_char(env, '\n');
2067         be_emit_write_line(env);
2068 }
2069
2070 /**
2071  * Block-walker:
2072  * Sets labels for control flow nodes (jump target)
2073  */
2074 static
2075 void ia32_gen_labels(ir_node *block, void *data) {
2076         ir_node *pred;
2077         int n = get_Block_n_cfgpreds(block);
2078
2079         for (n--; n >= 0; n--) {
2080                 pred = get_Block_cfgpred(block, n);
2081                 set_irn_link(pred, block);
2082         }
2083 }
2084
2085 /**
2086  * Main driver. Emits the code for one routine.
2087  */
2088 void ia32_gen_routine(ia32_code_gen_t *cg, ir_graph *irg) {
2089         ia32_emit_env_t env;
2090         ir_node *block;
2091         ir_node *last_block = NULL;
2092         int i, n;
2093
2094         env.isa      = (ia32_isa_t *)cg->arch_env->isa;
2095         env.emit     = &env.isa->emit;
2096         env.arch_env = cg->arch_env;
2097         env.cg       = cg;
2098
2099         /* we mark referenced global entities */
2100         inc_master_type_visited();
2101
2102         ia32_register_emitters();
2103
2104         ia32_emit_func_prolog(&env, irg);
2105         irg_block_walk_graph(irg, ia32_gen_labels, NULL, &env);
2106
2107         n = ARR_LEN(cg->blk_sched);
2108         for (i = 0; i < n;) {
2109                 ir_node *next_bl;
2110
2111                 block   = cg->blk_sched[i];
2112                 ++i;
2113                 next_bl = i < n ? cg->blk_sched[i] : NULL;
2114
2115                 /* set here the link. the emitter expects to find the next block here */
2116                 set_irn_link(block, next_bl);
2117                 ia32_gen_block(&env, block, last_block);
2118                 last_block = block;
2119         }
2120
2121         ia32_emit_func_epilog(&env, irg);
2122 }
2123
2124 void ia32_init_emitter(void)
2125 {
2126         FIRM_DBG_REGISTER(dbg, "firm.be.ia32.emitter");
2127 }