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