- be_emit_cstring(env, "\tfnstsw %ax");
- be_emit_finish_line_gas(env, node);
- be_emit_cstring(env, "\tsahf");
- be_emit_finish_line_gas(env, node);
-
- finish_CondJmp(env, node, mode_E, pnc);
-}
-
-static
-void CMov_emitter(ia32_emit_env_t *env, const ir_node *node)
-{
- const arch_register_t *in1, *in2, *out;
- long pnc = get_ia32_pncode(node);
-
- out = arch_get_irn_register(env->arch_env, node);
-
- /* we have to emit the cmp first, because the destination register */
- /* could be one of the compare registers */
- if (is_ia32_xCmpCMov(node)) {
- be_emit_cstring(env, "\tucomis");
- ia32_emit_mode_suffix_mode(env, get_irn_mode(node));
- be_emit_char(env, ' ');
- ia32_emit_source_register(env, node, 1);
- be_emit_cstring(env, ", ");
- ia32_emit_source_register(env, node, 0);
-
- in1 = arch_get_irn_register(env->arch_env, get_irn_n(node, 2));
- in2 = arch_get_irn_register(env->arch_env, get_irn_n(node, 3));
- } else {
- if (is_ia32_CmpCMov(node)) {
- be_emit_cstring(env, "\tcmp ");
- } else {
- assert(is_ia32_TestCMov(node));
- be_emit_cstring(env, "\ttest ");
- }
- ia32_emit_binop(env, node);
-
- in1 = arch_get_irn_register(env->arch_env, get_irn_n(node, 5));
- in2 = arch_get_irn_register(env->arch_env, get_irn_n(node, 6));
- }
- be_emit_finish_line_gas(env, node);
-
- if (out == in2) {
- /* best case: default in == out -> do nothing */
- } else if(in2 == &ia32_gp_regs[REG_GP_UKNWN]) {
- /* also nothign to do for unknown regs */
- } else if (out == in1) {
- const arch_register_t *t;
- /* true in == out -> need complement compare and exchange true and
- * default in */
- t = in1;
- in1 = in2;
- in2 = t;
- pnc = get_negated_pnc(pnc, get_irn_mode(node));
- } else {
- /* out is different from both ins: need copy default -> out */
- be_emit_cstring(env, "\tmovl ");
- ia32_emit_register(env, in2);
- be_emit_cstring(env, ", ");
- ia32_emit_register(env, out);
- be_emit_finish_line_gas(env, node);
- }
-
- be_emit_cstring(env, "\tcmov");
- ia32_emit_cmp_suffix(env, pnc );
- be_emit_cstring(env, "l ");
- ia32_emit_register(env, in1);
- be_emit_cstring(env, ", ");
- ia32_emit_register(env, out);
-
- be_emit_finish_line_gas(env, node);
-}
-
-static
-void emit_ia32_CmpCMov(ia32_emit_env_t *env, const ir_node *node)
-{
- CMov_emitter(env, node);
-}
-
-static
-void emit_ia32_TestCMov(ia32_emit_env_t *env, const ir_node *node)
-{
- CMov_emitter(env, node);
-}
-
-static
-void emit_ia32_xCmpCMov(ia32_emit_env_t *env, const ir_node *node)
-{
- CMov_emitter(env, node);
-}
-
-static
-void Set_emitter(ia32_emit_env_t *env, const ir_node *node)
-{
- long pnc = get_ia32_pncode(node);
- const char *reg8bit;
- const arch_register_t *out;
-
- out = arch_get_irn_register(env->arch_env, node);
- reg8bit = ia32_get_mapped_reg_name(env->isa->regs_8bit, out);
-
- if(is_ia32_xCmpSet(node)) {
- be_emit_cstring(env, "\tucomis");
- ia32_emit_mode_suffix_mode(env, get_irn_mode(get_irn_n(node, 2)));
- be_emit_char(env, ' ');
- ia32_emit_binop(env, node);