4 char *get_dest_reg_name(ir_node *n, int num) {
8 char *get_source_reg_name(ir_node *n, int num) {
12 char *node_const_to_str(ir_node *n) {
16 char *node_offset_to_str(ir_node *n) {
20 void equalize_dest_src(ir_node *n) {
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));
28 * coding of conditions
30 struct cmp2conditon_t {
36 * positive conditions for signed compares
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 */
58 * positive conditions for unsigned compares
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 */
80 * returns the condition code
82 const char *get_cmp_suffix(int cmp_code, int unsigned_cmp)
84 assert(cmp2condition_s[cmp_code].num == cmp_code);
85 assert(cmp2condition_u[cmp_code].num == cmp_code);
87 return unsigned_cmp ? cmp2condition_u[cmp_code & 7].name : cmp2condition_s[cmp_code & 7].name;
90 void emit_ia32_Proj_Cond(FILE *F, ir_node *n, ir_node *cond) {
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);
96 assert(succ_block && "Target block of Proj_Cond missing!");
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)),
105 nr == pn_Cond_true ? "" : "!");