fixed missing files
[libfirm] / ir / be / ia32 / emitter.c
1 #include "iredges.h"
2 #include "emitter.h"
3
4 char *get_dest_reg_name(ir_node *n, int num) {
5 }
6
7 char *get_source_reg_name(ir_node *n, int num) {
8 }
9
10 char *node_const_to_str(ir_node *n) {
11 }
12
13 char *node_offset_to_str(ir_node *n) {
14 }
15
16 void equalize_dest_src(ir_node *n) {
17   if (get_dest_reg(n, 1) != get_source_reg(n, 1))
18     fprintf("\tmovl %%%s, %%%s\t\t\t/* src -> dest for 2 address code */\n", get_source_reg_name(n, 1), get_dest_reg_name(n, 1));
19 }
20
21 /*
22  * coding of conditions
23  */
24 struct cmp2conditon_t {
25   const char    *name;
26   pn_Cmp        num;
27 };
28
29 /*
30  * positive conditions for signed compares
31  */
32 static const struct cmp2conditon_t cmp2condition_s[] = {
33   { NULL,              pn_Cmp_False },  /* always false */
34   { "e",               pn_Cmp_Eq },     /* == */
35   { "l",               pn_Cmp_Lt },     /* < */
36   { "le",              pn_Cmp_Le },     /* <= */
37   { "g",               pn_Cmp_Gt },     /* > */
38   { "ge",              pn_Cmp_Ge },     /* >= */
39   { "ne",              pn_Cmp_Lg },     /* != */
40   { "ordered",         pn_Cmp_Leg },    /* Floating point: ordered */
41   { "unordered",       pn_Cmp_Uo },     /* FLoting point: unordered */
42   { "unordered or ==", pn_Cmp_Ue },     /* Floating point: unordered or == */
43   { "unordered or <",  pn_Cmp_Ul },     /* Floating point: unordered or < */
44   { "unordered or <=", pn_Cmp_Ule },    /* Floating point: unordered or <= */
45   { "unordered or >",  pn_Cmp_Ug },     /* Floating point: unordered or > */
46   { "unordered or >=", pn_Cmp_Uge },    /* Floating point: unordered or >= */
47   { "unordered or !=", pn_Cmp_Ne },     /* Floating point: unordered or != */
48   { NULL,              pn_Cmp_True },   /* always true */
49 };
50
51 /*
52  * positive conditions for unsigned compares
53  */
54 static const struct cmp2conditon_t cmp2condition_u[] = {
55   { NULL,              pn_Cmp_False },  /* always false */
56   { "e",               pn_Cmp_Eq },     /* == */
57   { "b",               pn_Cmp_Lt },     /* < */
58   { "be",              pn_Cmp_Le },     /* <= */
59   { "a",               pn_Cmp_Gt },     /* > */
60   { "ae",              pn_Cmp_Ge },     /* >= */
61   { "ne",              pn_Cmp_Lg },     /* != */
62   { "ordered",         pn_Cmp_Leg },    /* Floating point: ordered */
63   { "unordered",       pn_Cmp_Uo },     /* FLoting point: unordered */
64   { "unordered or ==", pn_Cmp_Ue },     /* Floating point: unordered or == */
65   { "unordered or <",  pn_Cmp_Ul },     /* Floating point: unordered or < */
66   { "unordered or <=", pn_Cmp_Ule },    /* Floating point: unordered or <= */
67   { "unordered or >",  pn_Cmp_Ug },     /* Floating point: unordered or > */
68   { "unordered or >=", pn_Cmp_Uge },    /* Floating point: unordered or >= */
69   { "unordered or !=", pn_Cmp_Ne },     /* Floating point: unordered or != */
70   { NULL,              pn_Cmp_True },   /* always true */
71 };
72
73 /*
74  * returns the condition code
75  */
76 const char *get_cmp_suffix(int cmp_code, int unsigned_cmp)
77 {
78   assert(cmp2condition_s[cmp_code].num == cmp_code);
79   assert(cmp2condition_u[cmp_code].num == cmp_code);
80
81   return unsigned_cmp ? cmp2condition_u[cmp_code & 7].name : cmp2condition_s[cmp_code & 7].name;
82 }
83
84 void emit_ia32_Proj_Cond(FILE *F, ir_node *n, ir_node *cond) {
85   ir_node *succ_block = get_irn_out_edges_first(n);
86   ir_node *sel        = get_Cond_selector(cond);
87   ir_mode *sel_mode   = get_irn_mode(sel);
88
89   assert(succ_block && "Target block of Proj_Cond missing!");
90
91   if (sel_mode == mode_b) { // Boolean condition
92     int label = get_irn_node_nr(succ_block);
93     int nr    = get_Proj_proj(n);
94     fprintf(F, "j%s%s Label%d\t\t\t/* if (%sCond) goto Label */\n",
95           nr == pn_Cond_true ? "" : "n",
96           get_cmp_suffix(get_Proj_proj(sel), mode_is_signed(cmp mode)),
97           label,
98           nr == pn_Cond_true ? "" : "!");
99   }
100 }