Mon Sep 6 05:50:02 PDT 2004 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Mon, 6 Sep 2004 12:59:08 +0000 (12:59 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Mon, 6 Sep 2004 12:59:08 +0000 (12:59 -0000)
* mini-*.c, mini-ops.h, inssel-long32.brg: introduced
OP_ADDCC_IMM and OP_SUBCC_IMM (add/sub immediate that will
set the carry/borrow flag). The sparc and s390 implementations
can now use optimized versions (and simplify the code). ppc bugfixes.

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

12 files changed:
mono/mini/ChangeLog
mono/mini/basic-long.cs
mono/mini/cpu-g4.md
mono/mini/cpu-pentium.md
mono/mini/cpu-s390.md
mono/mini/cpu-sparc.md
mono/mini/inssel-long32.brg
mono/mini/mini-ops.h
mono/mini/mini-ppc.c
mono/mini/mini-s390.c
mono/mini/mini-sparc.c
mono/mini/mini-x86.c

index ac0cd890b16fa0639324735040e4f07fecde5d30..22f3c5e9f990d8adf999510b7b10da924a06c6fa 100644 (file)
@@ -1,3 +1,11 @@
+
+Mon Sep 6 05:50:02 PDT 2004 Paolo Molaro <lupus@ximian.com>
+
+       * mini-*.c, mini-ops.h, inssel-long32.brg: introduced
+       OP_ADDCC_IMM and OP_SUBCC_IMM (add/sub immediate that will
+       set the carry/borrow flag). The sparc and s390 implementations
+       can now use optimized versions (and simplify the code). ppc bugfixes.
+
 2004-09-06  Zoltan Varga  <vargaz@freemail.hu>
 
        * exceptions-ppc.c (mono_arch_find_jit_info): Fix memory leak.
index 243021aa83e73b6bb62db874bd83f9b0422f262c..4293b622f7a0d41c811cb6e81516fffa27bb0e2c 100644 (file)
@@ -263,6 +263,12 @@ class Tests {
                return 1;
        }
 
+       static int test_4_addcc_imm () {
+               long a = 3;
+               long b = 0;
+               return (int)(a - b + 1);
+       }
+
        static int test_5_sub () {
                long a = 8;
                long b = 3;             
index de9c2329ece96afeee3df327ebf0171f0f0b6c20..d98263d2aaea3655a041fb9c6c44cf7870769bf4 100644 (file)
@@ -541,6 +541,8 @@ adc: dest:i src1:i src2:i len:4
 addcc: dest:i src1:i src2:i len:4
 subcc: dest:i src1:i src2:i len:4
 adc_imm: dest:i src1:i len:12
+addcc_imm: dest:i src1:i len:12
+subcc_imm: dest:i src1:i len:12
 sbb: dest:i src1:i src2:i len:4
 sbb_imm: dest:i src1:i len:12
 br_reg: src1:i len:8
index 7c79797fafc57e50695e20c99018b5dd8b93c1da..5f41e177cc8abea39ad1768bb7713d4c22e8ca1d 100644 (file)
@@ -351,7 +351,9 @@ loadr8_membase: dest:f src1:b len:6
 loadr8_spill_membase: src1:b len:8
 loadu4_mem: dest:i len:9
 move: dest:i src1:i len:2
+addcc_imm: dest:i src1:i len:6 clob:1
 add_imm: dest:i src1:i len:6 clob:1
+subcc_imm: dest:i src1:i len:6 clob:1
 sub_imm: dest:i src1:i len:6 clob:1
 mul_imm: dest:i src1:i len:6
 # there is no actual support for division or reminder by immediate
index 1f5e8381e6182954ebc4de4139d32a622c8b2d25..9a36a1cc52882ee4d099166db11e2bdeb038ed95 100644 (file)
@@ -52,6 +52,7 @@ add.ovf.un: len: 8 dest:i src1:i src2:i
 add.ovf: len: 24 dest:i src1:i src2:i
 add: dest:i src1:i src2:i len:4 clob:1
 add_imm: dest:i src1:i len:18
+addcc_imm: dest:i src1:i len:18
 add_ovf_carry: dest:i src1:1 src2:i len:28
 add_ovf_un_carry: dest:i src1:1 src2:i len:12
 addcc: dest:i src1:i src2:i len:6
@@ -508,6 +509,7 @@ sub.ovf.un: len:10 dest:i src1:i src2:i
 sub.ovf: len:24 dest:i src1:i src2:i
 sub: dest:i src1:i src2:i len:4 clob:1
 sub_imm: dest:i src1:i len:18
+subcc_imm: dest:i src1:i len:18
 sub_ovf_carry: dest:i src1:1 src2:i len:28
 sub_ovf_un_carry: dest:i src1:1 src2:i len:12
 subcc: dest:i src1:i src2:i len:6
index 37ed365fd42d7d080513daa1b03829ecc065039e..834eed8d4ddc5fde0b1a5ce7cad9d709f4b4e362 100644 (file)
@@ -360,7 +360,9 @@ loadr8_membase: dest:f src1:b len:64
 loadu4_mem: dest:i len:8
 move: dest:i src1:i len:4
 add_imm: dest:i src1:i len:64
+addcc_imm: dest:i src1:i len:64
 sub_imm: dest:i src1:i len:64
+subcc_imm: dest:i src1:i len:64
 mul_imm: dest:i src1:i len:64
 div_imm: dest:a src1:i src2:i len:64
 div_un_imm: dest:a src1:i src2:i len:64
index 3af5e68859b306e52cc062c791167833a9dba64a..099d4c3502e7a402827869588596b4b109e86d01 100644 (file)
@@ -285,7 +285,7 @@ lreg: OP_LADD_OVF_UN (lreg, lreg) {
 }
 
 lreg: OP_LADD (lreg, i8con) {
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADDCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
        MONO_EMIT_BIALU_IMM (s, tree, OP_ADC_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
 }
 
@@ -295,7 +295,7 @@ lreg: OP_LSUB (lreg, lreg) {
 }
 
 lreg: OP_LSUB (lreg, i8con) {
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_SUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_SUBCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
        MONO_EMIT_BIALU_IMM (s, tree, OP_SBB_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
 }
 
index 55071a0e4a5024b112bebc7279b6a39b750a5653..502da5bfd82e061e360072d099f4a7f5cc4cc76c 100644 (file)
@@ -362,7 +362,9 @@ MINI_OP(OP_ADC_IMM, "adc_imm")
 MINI_OP(OP_SBB,     "sbb")
 MINI_OP(OP_SBB_IMM, "sbb_imm")
 MINI_OP(OP_ADDCC,   "addcc")
+MINI_OP(OP_ADDCC_IMM,   "addcc_imm")
 MINI_OP(OP_SUBCC,   "subcc")
+MINI_OP(OP_SUBCC_IMM,   "subcc_imm")
 MINI_OP(OP_BR_REG,  "br_reg")
 MINI_OP(OP_SEXT_I1,  "sext_i1")
 MINI_OP(OP_SEXT_I2,  "sext_i2")
index f6677fafe80caf3bcd4dfcf3c532ecda354e70ba..e72d41c4df62703b3c525f8465a99560652b796b 100644 (file)
@@ -2443,6 +2443,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ADC:
                        ppc_adde (code, ins->dreg, ins->sreg1, ins->sreg2);
                        break;
+               case OP_ADDCC_IMM:
+                       if (ppc_is_imm16 (ins->inst_imm)) {
+                               ppc_addic (code, ins->dreg, ins->sreg1, ins->inst_imm);
+                       } else {
+                               ppc_load (code, ppc_r11, ins->inst_imm);
+                               ppc_addc (code, ins->dreg, ins->sreg1, ppc_r11);
+                       }
+                       break;
                case OP_ADD_IMM:
                        if (ppc_is_imm16 (ins->inst_imm)) {
                                ppc_addi (code, ins->dreg, ins->sreg1, ins->inst_imm);
@@ -2522,6 +2530,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_SUBCC:
                        ppc_subfc (code, ins->dreg, ins->sreg2, ins->sreg1);
                        break;
+               case OP_SUBCC_IMM:
+                       ppc_load (code, ppc_r11, ins->inst_imm);
+                       ppc_subfc (code, ins->dreg, ppc_r11, ins->sreg1);
+                       break;
                case CEE_SUB:
                        ppc_subf (code, ins->dreg, ins->sreg2, ins->sreg1);
                        break;
@@ -2539,7 +2551,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_SBB_IMM:
                        ppc_load (code, ppc_r11, ins->inst_imm);
-                       ppc_subfe (code, ins->dreg, ins->sreg2, ppc_r11);
+                       ppc_subfe (code, ins->dreg, ppc_r11, ins->sreg1);
                        break;
                case OP_PPC_SUBFIC:
                        g_assert (ppc_is_imm16 (ins->inst_imm));
@@ -3779,4 +3791,4 @@ MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
 MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg)
 {
        return NULL;
-}
\ No newline at end of file
+}
index 86d84c6a3583a7626282b933daf9cd24e90be652..58125ad8619da37de82d3a664e57387b673bb6c1 100644 (file)
@@ -3358,6 +3358,7 @@ guint8 cond;
                        s390_alcr (code, ins->dreg, ins->sreg2);
                }
                        break;
+               case OP_ADDCC_IMM:
                case OP_ADD_IMM: {
                        if ((ins->next) &&
                            (ins->next->opcode == OP_ADC_IMM)) {
@@ -3460,6 +3461,7 @@ guint8 cond;
                        s390_slbr (code, ins->dreg, ins->sreg2);
                }
                        break;
+               case OP_SUBCC_IMM:
                case OP_SUB_IMM: {
                        if (s390_is_imm16 (-ins->inst_imm)) {
                                if (ins->dreg != ins->sreg1) {
@@ -5238,4 +5240,4 @@ MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
 MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg)
 {
        return NULL;
-}
\ No newline at end of file
+}
index aa0fcdc9ee1b01ccf7d5df9d1f52833b7d229a56..419ec85def2aa6882c3a1bea00f7ae73b46c882b 100644 (file)
@@ -3139,6 +3139,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_IADD:
                        sparc_add (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg);
                        break;
+               case OP_ADDCC_IMM:
                case OP_ADD_IMM:
                case OP_IADD_IMM:
                        /* according to inssel-long32.brg, this should set cc */
@@ -3161,6 +3162,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ISUB:
                        sparc_sub (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg);
                        break;
+               case OP_SUBCC_IMM:
                case OP_SUB_IMM:
                case OP_ISUB_IMM:
                        /* according to inssel-long32.brg, this should set cc */
@@ -4790,4 +4792,4 @@ MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
 MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg)
 {
        return NULL;
-}
\ No newline at end of file
+}
index 24a0c11ebe6a43be88439cfa3521003e18e2735b..952916f5bedf52cbbb24c6d2dd92039b40aba788 100644 (file)
@@ -2372,6 +2372,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ADC:
                        x86_alu_reg_reg (code, X86_ADC, ins->sreg1, ins->sreg2);
                        break;
+               case OP_ADDCC_IMM:
                case OP_ADD_IMM:
                        x86_alu_reg_imm (code, X86_ADD, ins->dreg, ins->inst_imm);
                        break;
@@ -2385,6 +2386,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_SBB:
                        x86_alu_reg_reg (code, X86_SBB, ins->sreg1, ins->sreg2);
                        break;
+               case OP_SUBCC_IMM:
                case OP_SUB_IMM:
                        x86_alu_reg_imm (code, X86_SUB, ins->dreg, ins->inst_imm);
                        break;