- flipped = 1;
- pnc = get_negated_pnc(pnc, mode);
- }
-
- /* in case of unordered compare, check for parity */
- if (pnc & pn_Cmp_Uo) {
- be_emit_cstring(env, "\tjp ");
- ia32_emit_cfop_target(env, proj_true);
- be_emit_finish_line_gas(env, proj_true);
- }
-
- be_emit_cstring(env, "\tj");
- ia32_emit_cmp_suffix(env, pnc);
- be_emit_char(env, ' ');
- ia32_emit_cfop_target(env, proj_true);
- be_emit_finish_line_gas(env, proj_true);
-
- /* the second Proj might be a fallthrough */
- if (get_cfop_target_block(proj_false) != next_block) {
- be_emit_cstring(env, "\tjmp ");
- ia32_emit_cfop_target(env, proj_false);
- be_emit_finish_line_gas(env, proj_false);
- } else {
- be_emit_cstring(env, "\t/* fallthrough to ");
- ia32_emit_cfop_target(env, proj_false);
- be_emit_cstring(env, " */");
- be_emit_finish_line_gas(env, proj_false);
- }
-}
-
-/**
- * Emits code for conditional jump.
- */
-static
-void CondJmp_emitter(ia32_emit_env_t *env, const ir_node *node) {
- be_emit_cstring(env, "\tcmp ");
- ia32_emit_binop(env, node);
- be_emit_finish_line_gas(env, node);
-
- finish_CondJmp(env, node, mode_Iu, get_ia32_pncode(node));
-}
-
-/**
- * Emits code for conditional jump with two variables.
- */
-static
-void emit_ia32_CondJmp(ia32_emit_env_t *env, const ir_node *node) {
- CondJmp_emitter(env, node);
-}
-
-/**
- * Emits code for conditional test and jump.
- */
-static
-void TestJmp_emitter(ia32_emit_env_t *env, const ir_node *node) {
- if(is_ia32_ImmSymConst(node) || is_ia32_ImmConst(node)) {
- be_emit_cstring(env, "\ttest ");
- ia32_emit_immediate(env, node);
- be_emit_cstring(env, ", ");
- ia32_emit_source_register(env, node, 0);
- be_emit_finish_line_gas(env, node);
- } else {
- be_emit_cstring(env, "\ttest ");
- ia32_emit_source_register(env, node, 1);
- be_emit_cstring(env, ", ");
- ia32_emit_source_register(env, node, 0);
- be_emit_finish_line_gas(env, node);
- }
- finish_CondJmp(env, node, mode_Iu, get_ia32_pncode(node));
-}
-
-/**
- * Emits code for conditional test and jump with two variables.
- */
-static
-void emit_ia32_TestJmp(ia32_emit_env_t *env, const ir_node *node) {
- TestJmp_emitter(env, node);
-}
-
-static
-void emit_ia32_CJmp(ia32_emit_env_t *env, const ir_node *node) {
- be_emit_cstring(env, "/* omitted redundant test */");
- be_emit_finish_line_gas(env, node);
-
- finish_CondJmp(env, node, mode_Is, get_ia32_pncode(node));
-}
-
-static
-void emit_ia32_CJmpAM(ia32_emit_env_t *env, const ir_node *node) {
- be_emit_cstring(env, "/* omitted redundant test/cmp */");
- be_emit_finish_line_gas(env, node);
-
- finish_CondJmp(env, node, mode_Is, get_ia32_pncode(node));
-}
-
-/**
- * Emits code for conditional SSE floating point jump with two variables.
- */
-static
-void emit_ia32_xCondJmp(ia32_emit_env_t *env, const ir_node *node) {
- be_emit_cstring(env, "\tucomi");
- ia32_emit_xmm_mode_suffix(env, node);
- be_emit_char(env, ' ');
- ia32_emit_binop(env, node);
- be_emit_finish_line_gas(env, node);
-
- finish_CondJmp(env, node, mode_F, get_ia32_pncode(node));
-}
-
-/**
- * Emits code for conditional x87 floating point jump with two variables.
- */
-static
-void emit_ia32_x87CondJmp(ia32_emit_env_t *env, const ir_node *node) {
- ia32_attr_t *attr = get_ia32_attr(node);
- const char *reg = attr->x87[1]->name;
- long pnc = get_ia32_pncode(node);
-
- switch (get_ia32_irn_opcode(node)) {
- case iro_ia32_fcomrJmp:
- pnc = get_inversed_pnc(pnc);
- reg = attr->x87[0]->name;
- case iro_ia32_fcomJmp:
- default:
- be_emit_cstring(env, "\tfucom ");
- break;
- case iro_ia32_fcomrpJmp:
- pnc = get_inversed_pnc(pnc);
- reg = attr->x87[0]->name;
- case iro_ia32_fcompJmp:
- be_emit_cstring(env, "\tfucomp ");
- break;
- case iro_ia32_fcomrppJmp:
- pnc = get_inversed_pnc(pnc);
- case iro_ia32_fcomppJmp:
- be_emit_cstring(env, "\tfucompp ");
- reg = "";
- break;