- if (reverse)
- set_ia32_pncode(irn, (long)get_inversed_pnc(get_ia32_pncode(irn)));
-
- snprintf(cmd_buf, SNPRINTF_BUF_LEN, "%s %s%s", instr, reg[0] == '\0' ? "" : "%", reg);
- lc_esnprintf(ia32_get_arg_env(), cmnt_buf, SNPRINTF_BUF_LEN, "/* %+F */", irn);
- IA32_DO_EMIT(irn);
- lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "fnstsw %%ax", irn);
- snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* Store x87 FPU Control Word */");
- IA32_DO_EMIT(irn);
- snprintf(cmd_buf, SNPRINTF_BUF_LEN, "sahf");
- snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* Store ah into flags */");
- IA32_DO_EMIT(irn);
-
- /* the compare flags must be evaluated using carry , ie unsigned */
- finish_CondJmp(F, irn, mode_Iu);
-}
-
-static void CMov_emitter(ir_node *irn, ia32_emit_env_t *env) {
- FILE *F = env->out;
- const lc_arg_env_t *arg_env = ia32_get_arg_env();
- ir_mode *mode = get_irn_mode(get_irn_n(irn, 0));
- int is_unsigned = mode_is_float(mode) || ! mode_is_signed(mode);
- const char *cmp_suffix = get_cmp_suffix(get_ia32_pncode(irn), is_unsigned);
- int is_PsiCondCMov = is_ia32_PsiCondCMov(irn);
- int idx_left = 2 - is_PsiCondCMov;
- int idx_right = 3 - is_PsiCondCMov;
-
- char cmd_buf[SNPRINTF_BUF_LEN];
- char cmnt_buf[SNPRINTF_BUF_LEN];
- const arch_register_t *in1, *in2, *out;
-
- out = arch_get_irn_register(env->arch_env, irn);
- in1 = arch_get_irn_register(env->arch_env, get_irn_n(irn, idx_left));
- in2 = arch_get_irn_register(env->arch_env, get_irn_n(irn, idx_right));
-
- /* we have to emit the cmp first, because the destination register */
- /* could be one of the compare registers */
- if (is_ia32_CmpCMov(irn)) {
- lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "cmp %1S, %2S", irn, irn);
- }
- else if (is_ia32_xCmpCMov(irn)) {
- lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "ucomis%M %1S, %2S", get_irn_n(irn, 0), irn, irn);
- }
- else if (is_PsiCondCMov) {
- /* omit compare because flags are already set by And/Or */
- lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "test %1S, %1S", irn, irn);
- }
- else {
- assert(0 && "unsupported CMov");
- }
- snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* Psi condition */" );
- IA32_DO_EMIT(irn);
-
- if (REGS_ARE_EQUAL(out, in2)) {
- /* best case: default in == out -> do nothing */
- }
- else if (REGS_ARE_EQUAL(out, in1)) {
- /* true in == out -> need complement compare and exchange true and default in */
- ir_node *t = get_irn_n(irn, idx_left);
- set_irn_n(irn, idx_left, get_irn_n(irn, idx_right));
- set_irn_n(irn, idx_right, t);
-
- cmp_suffix = get_cmp_suffix(get_negated_pnc(get_ia32_pncode(irn), get_irn_mode(irn)), is_unsigned);
-
- }
- else {
- /* out is different from in: need copy default -> out */
- if (is_PsiCondCMov)
- lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "mov %1D, %3S", irn, irn);
- else
- lc_esnprintf(arg_env, cmd_buf, SNPRINTF_BUF_LEN, "mov %1D, %4S", irn, irn);
-
- lc_esnprintf(arg_env, cmnt_buf, SNPRINTF_BUF_LEN, "/* copy default -> out */" );
- IA32_DO_EMIT(irn);