2007-06-07 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 7 Jun 2007 15:16:40 +0000 (15:16 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 7 Jun 2007 15:16:40 +0000 (15:16 -0000)
* mini-amd64.c (peephole_pass): Merge some small changes from the linear-ir
branch.

* cpu-amd64.md: Add long_and/or/xor opcodes.

svn path=/trunk/mono/; revision=78847

mono/mini/ChangeLog
mono/mini/cpu-amd64.md
mono/mini/mini-amd64.c

index 217fba63d74d2442df62b1b9890d8be8f93a0d3c..6339e12a139711c7413d3065b763c385609b662f 100644 (file)
@@ -1,3 +1,10 @@
+2007-06-07  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-amd64.c (peephole_pass): Merge some small changes from the linear-ir 
+       branch.
+
+       * cpu-amd64.md: Add long_and/or/xor opcodes.
+
 2007-06-06  Wade Berrier  <wberrier@novell.com>
 
        * cpu-s390x.md (shr_imm): Correct the length of shr_imm instruction.
index 4191ae497b454663a992c052f2090fc8cae4d4c3..23e09f73c8dcc71e4a43e26c5b68e522b1b09bfb 100644 (file)
@@ -214,6 +214,7 @@ cond_exc_c: len:8
 cond_exc_nc: len:8
 cond_exc_iov: len:8
 cond_exc_ic: len:8
+
 long_add: dest:i src1:i src2:i len:3 clob:1
 long_mul: dest:i src1:i src2:i clob:1 len:4
 long_mul_imm: dest:i src1:i clob:1 len:12
@@ -221,9 +222,13 @@ long_div: dest:a src1:a src2:i len:16 clob:d
 long_div_un: dest:a src1:a src2:i len:16 clob:d
 long_rem: dest:d src1:a src2:i len:16 clob:a
 long_rem_un: dest:d src1:a src2:i len:16 clob:a
+long_and: dest:i src1:i src2:i len:3 clob:1
+long_or: dest:i src1:i src2:i len:3 clob:1
+long_xor: dest:i src1:i src2:i len:3 clob:1
 long_shl: dest:i src1:i src2:s clob:1 len:31
 long_shr: dest:i src1:i src2:s clob:1 len:32
 long_shr_un: dest:i src1:i src2:s clob:1 len:32
+
 long_conv_to_r4: dest:f src1:i len:8
 long_conv_to_r8: dest:f src1:i len:8
 long_conv_to_ovf_i: dest:i src1:i src2:i len:40
@@ -233,6 +238,7 @@ long_conv_to_r_un: dest:f src1:i src2:i len:48
 long_shr_imm: dest:i src1:i clob:1 len:11
 long_shr_un_imm: dest:i src1:i clob:1 len:11
 long_shl_imm: dest:i src1:i clob:1 len:11
+
 float_beq: len:13
 float_bne_un: len:18
 float_blt: len:13
index 96c1cf164d185cd27adab8854b32d09d43254c47..661e3189c4733f1b94e94c6510670078994d1ded 100644 (file)
@@ -1797,8 +1797,8 @@ peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_I8CONST:
                        /* reg = 0 -> XOR (reg, reg) */
                        /* XOR sets cflags on x86, so we cant do it always */
-                       if (ins->inst_c0 == 0 && (ins->next && INST_IGNORES_CFLAGS (ins->next->opcode))) {
-                               ins->opcode = CEE_XOR;
+                       if (ins->inst_c0 == 0 && (!ins->next || (ins->next && INST_IGNORES_CFLAGS (ins->next->opcode)))) {
+                               ins->opcode = OP_LXOR;
                                ins->sreg1 = ins->dreg;
                                ins->sreg2 = ins->dreg;
                                /* Fall through */
@@ -1806,6 +1806,7 @@ peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb)
                        else
                                break;
                case CEE_XOR:
+               case OP_LXOR:
                        if ((ins->sreg1 == ins->sreg2) && (ins->sreg1 == ins->dreg)) {
                                MonoInst *ins2;
 
@@ -1830,6 +1831,14 @@ peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb)
                                }
                        }
                        break;
+               case OP_IADD_IMM:
+                       if ((ins->inst_imm == 1) && (ins->dreg == ins->sreg1))
+                               ins->opcode = OP_X86_INC_REG;
+                       break;
+               case OP_ISUB_IMM:
+                       if ((ins->inst_imm == 1) && (ins->dreg == ins->sreg1))
+                               ins->opcode = OP_X86_DEC_REG;
+                       break;
                case OP_MUL_IMM: 
                        /* remove unnecessary multiplication with 1 */
                        if (ins->inst_imm == 1) {
@@ -2861,6 +2870,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        amd64_alu_reg_imm (code, X86_OR, ins->sreg1, ins->inst_imm);
                        break;
                case CEE_XOR:
+               case OP_LXOR:
                        amd64_alu_reg_reg (code, X86_XOR, ins->sreg1, ins->sreg2);
                        break;
                case OP_XOR_IMM: