diff --git a/tcg/optimize.c b/tcg/optimize.c
index f95c511..b7e235e 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -641,12 +641,23 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
         CASE_OP_32_64(movcond):
             if (temps[args[1]].state == TCG_TEMP_CONST
                 && temps[args[2]].state == TCG_TEMP_CONST) {
-                gen_opc_buf[op_index] = op_to_mov(op);
                 tmp = do_constant_folding_cond(op, temps[args[1]].val,
                                                temps[args[2]].val, args[5]);
-                tcg_opt_gen_mov(gen_args, args[0], args[4-tmp],
-                                nb_temps, nb_globals);
-                gen_args += 2;
+                if ((temps[args[4-tmp]].state == TCG_TEMP_COPY
+                    && temps[args[4-tmp]].val == args[0])
+                    || args[0] == args[4-tmp]) {
+                    gen_opc_buf[op_index] = INDEX_op_nop;
+                } else if (tmp && temps[args[4-tmp]].state == TCG_TEMP_CONST) {
+                    gen_opc_buf[op_index] = op_to_movi(op);
+                    tcg_opt_gen_movi(gen_args, args[0], temps[args[4-tmp]].val,
+                                     nb_temps, nb_globals);
+                    gen_args += 2;
+                } else {
+                    gen_opc_buf[op_index] = op_to_mov(op);
+                    tcg_opt_gen_mov(gen_args, args[0], args[4-tmp],
+                                    nb_temps, nb_globals);
+                    gen_args += 2;
+                }
             } else {
                 reset_temp(args[0], nb_temps, nb_globals);
                 gen_args[0] = args[0];
