[mini] Apply the dreg != sreg1 optimization to OP_(F)MOVE in all backends.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 4 Feb 2015 11:02:21 +0000 (12:02 +0100)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 4 Feb 2015 11:05:58 +0000 (12:05 +0100)
mono/mini/mini-amd64.c
mono/mini/mini-arm.c
mono/mini/mini-ppc.c
mono/mini/mini-x86.c

index dccd61c1cf8bb533813a5d33bfbbdf8fa21c8261..ef32a643d4dbf1f3955dd8ffa43a347800ac76cf 100755 (executable)
@@ -4657,7 +4657,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        amd64_mov_reg_imm_size (code, ins->dreg, 0, 8);
                        break;
                case OP_MOVE:
-                       amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof(mgreg_t));
+                       if (ins->dreg != ins->sreg1)
+                               amd64_mov_reg_reg (code, ins->dreg, ins->sreg1, sizeof(mgreg_t));
                        break;
                case OP_AMD64_SET_XMMREG_R4: {
                        amd64_sse_cvtsd2ss_reg_reg (code, ins->dreg, ins->sreg1);
index 812380e37a1557455187e5233f3ebcc9906a40a4..8341550ea5d17e961699a6a14f77cb487dd3a0a2 100644 (file)
@@ -4830,7 +4830,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                }
                case OP_FMOVE:
-                       if (IS_VFP)
+                       if (IS_VFP && ins->dreg != ins->sreg1)
                                ARM_CPYD (code, ins->dreg, ins->sreg1);
                        break;
                case OP_FCONV_TO_R4:
index 907fe766c9c1219742d862bc1844896111d358b8..80a6c8af2481f1850e4fb7ebb3befd1125f774b3 100644 (file)
@@ -3709,7 +3709,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                CASE_PPC32 (OP_ICONV_TO_I4)
                CASE_PPC32 (OP_ICONV_TO_U4)
                case OP_MOVE:
-                       ppc_mr (code, ins->dreg, ins->sreg1);
+                       if (ins->dreg != ins->sreg1)
+                               ppc_mr (code, ins->dreg, ins->sreg1);
                        break;
                case OP_SETLRET: {
                        int saved = ins->sreg1;
@@ -3724,7 +3725,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                }
                case OP_FMOVE:
-                       ppc_fmr (code, ins->dreg, ins->sreg1);
+                       if (ins->dreg != ins->sreg1)
+                               ppc_fmr (code, ins->dreg, ins->sreg1);
                        break;
                case OP_FCONV_TO_R4:
                        ppc_frsp (code, ins->dreg, ins->sreg1);
index 027bb055052a44b8cd5426f37ebb76af12eef646..9a70cd926a34585211228f59be826f88d9f090f7 100644 (file)
@@ -3174,7 +3174,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        x86_push_membase (code, ins->inst_basereg, 0xf0f0f0f0);
                        break;
                case OP_MOVE:
-                       x86_mov_reg_reg (code, ins->dreg, ins->sreg1, 4);
+                       if (ins->dreg != ins->sreg1)
+                               x86_mov_reg_reg (code, ins->dreg, ins->sreg1, 4);
                        break;
                case OP_TAILCALL: {
                        MonoCallInst *call = (MonoCallInst*)ins;