Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Molaro <lupus@oddwiz.org>2004-09-09 21:53:54 +0400
committerPaolo Molaro <lupus@oddwiz.org>2004-09-09 21:53:54 +0400
commit99a49e2835eb312e190bd1b56c77d69650d5bf19 (patch)
tree88e236212d470a7d3ccc6563e43559c595113591
parentf622d2f2fcebde3678d1739a23a6414a95e534f3 (diff)
Thu Sep 9 20:57:53 CEST 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. svn path=/branches/mono-1-0/mono/; revision=33663
-rw-r--r--mono/mini/ChangeLog8
-rw-r--r--mono/mini/basic-long.cs6
-rw-r--r--mono/mini/cpu-g4.md2
-rw-r--r--mono/mini/cpu-pentium.md2
-rw-r--r--mono/mini/cpu-s390.md2
-rw-r--r--mono/mini/cpu-sparc.md2
-rw-r--r--mono/mini/inssel-long32.brg4
-rw-r--r--mono/mini/mini-ops.h2
-rw-r--r--mono/mini/mini-ppc.c14
-rw-r--r--mono/mini/mini-s390.c2
-rw-r--r--mono/mini/mini-sparc.c2
-rw-r--r--mono/mini/mini-x86.c2
12 files changed, 45 insertions, 3 deletions
diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog
index 297d31ca1af..a9a7c7de6fa 100644
--- a/mono/mini/ChangeLog
+++ b/mono/mini/ChangeLog
@@ -1,3 +1,11 @@
+
+Thu Sep 9 20:57:53 CEST 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-02 Zoltan Varga <vargaz@freemail.hu>
* inssel-long32.brg: Fix OP_LCONV_TO_OVF_I1 rule. Fixes #64578.
diff --git a/mono/mini/basic-long.cs b/mono/mini/basic-long.cs
index f16f9f5dcb1..4b321017ce7 100644
--- a/mono/mini/basic-long.cs
+++ b/mono/mini/basic-long.cs
@@ -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;
diff --git a/mono/mini/cpu-g4.md b/mono/mini/cpu-g4.md
index 7d76db87792..638fb2828bc 100644
--- a/mono/mini/cpu-g4.md
+++ b/mono/mini/cpu-g4.md
@@ -545,6 +545,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
diff --git a/mono/mini/cpu-pentium.md b/mono/mini/cpu-pentium.md
index 2568eac81f6..e48ba96540e 100644
--- a/mono/mini/cpu-pentium.md
+++ b/mono/mini/cpu-pentium.md
@@ -354,7 +354,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
diff --git a/mono/mini/cpu-s390.md b/mono/mini/cpu-s390.md
index 256bf4aa609..3cc63d770d1 100644
--- a/mono/mini/cpu-s390.md
+++ b/mono/mini/cpu-s390.md
@@ -349,7 +349,9 @@ loadu4_mem: dest:i len:8
move: dest:i src1:i len:4
fmove: dest:f src1:f len:4
add_imm: dest:i src1:i len:18
+addcc_imm: dest:i src1:i len:18
sub_imm: dest:i src1:i len:18
+subcc_imm: dest:i src1:i len:18
mul_imm: dest:i src1:i len:18
# there is no actual support for division or reminder by immediate
# we simulate them, though (but we need to change the burg rules
diff --git a/mono/mini/cpu-sparc.md b/mono/mini/cpu-sparc.md
index 8f9280a222b..6fef70d713d 100644
--- a/mono/mini/cpu-sparc.md
+++ b/mono/mini/cpu-sparc.md
@@ -356,7 +356,9 @@ loadr8_membase: dest:f src1:b len:20
loadu4_mem: dest:i len:8
move: dest:i src1:i len:4
add_imm: dest:i src1:i len:12
+addcc_imm: dest:i src1:i len:64
sub_imm: dest:i src1:i len:12
+subcc_imm: dest:i src1:i len:64
mul_imm: dest:i src1:i len:12
div_imm: dest:a src1:i src2:i len:28
div_un_imm: dest:a src1:i src2:i len:12
diff --git a/mono/mini/inssel-long32.brg b/mono/mini/inssel-long32.brg
index e6cf9f681a7..2ebeb3c27b7 100644
--- a/mono/mini/inssel-long32.brg
+++ b/mono/mini/inssel-long32.brg
@@ -108,7 +108,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);
}
@@ -118,7 +118,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);
}
diff --git a/mono/mini/mini-ops.h b/mono/mini/mini-ops.h
index 32b6eb5f35e..98da133d3fa 100644
--- a/mono/mini/mini-ops.h
+++ b/mono/mini/mini-ops.h
@@ -297,7 +297,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")
diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c
index 537cefb50a7..92bef163894 100644
--- a/mono/mini/mini-ppc.c
+++ b/mono/mini/mini-ppc.c
@@ -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));
diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c
index 0a7db247fa2..6d7f7ce718b 100644
--- a/mono/mini/mini-s390.c
+++ b/mono/mini/mini-s390.c
@@ -3228,6 +3228,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)) {
@@ -3293,6 +3294,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) {
diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c
index d0f58dc84cf..1552e50c16e 100644
--- a/mono/mini/mini-sparc.c
+++ b/mono/mini/mini-sparc.c
@@ -2652,6 +2652,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case CEE_ADD:
sparc_add (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg);
break;
+ case OP_ADDCC_IMM:
case OP_ADD_IMM:
/* according to inssel-long32.brg, this should set cc */
EMIT_ALU_IMM (ins, add, TRUE);
@@ -2669,6 +2670,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
case CEE_SUB:
sparc_sub (code, FALSE, ins->sreg1, ins->sreg2, ins->dreg);
break;
+ case OP_SUBCC_IMM:
case OP_SUB_IMM:
/* according to inssel-long32.brg, this should set cc */
EMIT_ALU_IMM (ins, sub, TRUE);
diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c
index 4f5842f8750..dc098a1c26b 100644
--- a/mono/mini/mini-x86.c
+++ b/mono/mini/mini-x86.c
@@ -2326,6 +2326,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;
@@ -2339,6 +2340,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;