4 char *get_dest_reg_name(ir_node *n, int num) {
7 char *get_source_reg_name(ir_node *n, int num) {
10 char *node_const_to_str(ir_node *n) {
13 char *node_offset_to_str(ir_node *n) {
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));
22 * coding of conditions
24 struct cmp2conditon_t {
30 * positive conditions for signed compares
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 */
52 * positive conditions for unsigned compares
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 */
74 * returns the condition code
76 const char *get_cmp_suffix(int cmp_code, int unsigned_cmp)
78 assert(cmp2condition_s[cmp_code].num == cmp_code);
79 assert(cmp2condition_u[cmp_code].num == cmp_code);
81 return unsigned_cmp ? cmp2condition_u[cmp_code & 7].name : cmp2condition_s[cmp_code & 7].name;
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);
89 assert(succ_block && "Target block of Proj_Cond missing!");
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)),
98 nr == pn_Cond_true ? "" : "!");