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:
-rw-r--r--ChangeLog3
-rw-r--r--doc/pending-classes.in6
-rw-r--r--mono/arch/x86/x86-codegen.h32
-rw-r--r--mono/jit/ChangeLog4
-rw-r--r--mono/jit/jit.c27
-rw-r--r--mono/jit/x86.brg116
-rw-r--r--mono/metadata/unicode.c3
-rw-r--r--mono/tests/jit-long.cs27
-rw-r--r--web/pending-classes.in6
9 files changed, 212 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 81acce163c8..1c72cbc4beb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2002-02-01 Dietmar Maurer <dietmar@ximian.com>
+
+ * mono/tests/jit-long.cs: added some SHL/SHR tests
Fri Feb 1 15:32:36 CET 2002 Paolo Molaro <lupus@ximian.com>
diff --git a/doc/pending-classes.in b/doc/pending-classes.in
index b070b28ffb8..b8227f3965b 100644
--- a/doc/pending-classes.in
+++ b/doc/pending-classes.in
@@ -268,7 +268,6 @@ System.Runtime.Remoting.Metadata.W3cXsd2001.SoapToken
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYear
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYearMonth
System.Runtime.Remoting.Metadata.XmlFieldOrderOption
-System.Runtime.Remoting.ObjectHandle
System.Runtime.Remoting.Proxies.ProxyAttribute
System.Runtime.Remoting.Proxies.RealProxy
System.Runtime.Remoting.RemotingConfiguration
@@ -299,6 +298,7 @@ System.Runtime.Serialization.SerializationEntry
System.Runtime.Serialization.SerializationInfoEnumerator
System.Runtime.Serialization.SurrogateSelector
System.RuntimeArgumentHandle
+System.Security.AllowPartiallyTrustedCallersAttribute
System.Security.Cryptography.CryptoConfig
System.Security.Cryptography.DSACryptoServiceProvider
System.Security.Cryptography.HMACSHA1
@@ -351,16 +351,13 @@ System.Security.Permissions.ZoneIdentityPermission
System.Security.Policy.AllMembershipCondition
System.Security.Policy.ApplicationDirectory
System.Security.Policy.ApplicationDirectoryMembershipCondition
-System.Security.Policy.CodeGroup
System.Security.Policy.FileCodeGroup
System.Security.Policy.FirstMatchCodeGroup
System.Security.Policy.Hash
System.Security.Policy.HashMembershipCondition
System.Security.Policy.NetCodeGroup
System.Security.Policy.PermissionRequestEvidence
-System.Security.Policy.PolicyException
System.Security.Policy.PolicyStatement
-System.Security.Policy.PolicyStatementAttribute
System.Security.Policy.Publisher
System.Security.Policy.PublisherMembershipCondition
System.Security.Policy.Site
@@ -375,6 +372,7 @@ System.Security.Policy.ZoneMembershipCondition
System.Security.Principal.WindowsIdentity
System.Security.Principal.WindowsImpersonationContext
System.Security.Principal.WindowsPrincipal
+System.Threading.CompressedStack
System.Threading.IOCompletionCallback
System.Threading.ThreadStart
System.Threading.TimerCallback
diff --git a/mono/arch/x86/x86-codegen.h b/mono/arch/x86/x86-codegen.h
index affd5637a90..0bee23e436b 100644
--- a/mono/arch/x86/x86-codegen.h
+++ b/mono/arch/x86/x86-codegen.h
@@ -1,7 +1,7 @@
/* Copyright (C) 2000 Intel Corporation. All rights reserved.
Copyright (C) 2001 Ximian, Inc.
//
-// $Header: /home/miguel/third-conversion/public/mono/mono/arch/x86/x86-codegen.h,v 1.20 2002/01/14 07:00:24 lupus Exp $
+// $Header: /home/miguel/third-conversion/public/mono/mono/arch/x86/x86-codegen.h,v 1.21 2002/02/01 12:04:33 dietmar Exp $
*/
#ifndef X86_H
@@ -566,6 +566,36 @@ typedef union {
* Multi op shift missing.
*/
+#define x86_shrd_reg(inst,dreg,reg) \
+ do { \
+ *(inst)++ = (unsigned char)0x0f; \
+ *(inst)++ = (unsigned char)0xad; \
+ x86_reg_emit ((inst), (reg), (dreg)); \
+ } while (0)
+
+#define x86_shrd_reg_imm(inst,dreg,reg,shamt) \
+ do { \
+ *(inst)++ = (unsigned char)0x0f; \
+ *(inst)++ = (unsigned char)0xac; \
+ x86_reg_emit ((inst), (reg), (dreg)); \
+ x86_imm_emit8 ((inst), (shamt)); \
+ } while (0)
+
+#define x86_shld_reg(inst,dreg,reg) \
+ do { \
+ *(inst)++ = (unsigned char)0x0f; \
+ *(inst)++ = (unsigned char)0xa5; \
+ x86_reg_emit ((inst), (reg), (dreg)); \
+ } while (0)
+
+#define x86_shld_reg_imm(inst,dreg,reg,shamt) \
+ do { \
+ *(inst)++ = (unsigned char)0x0f; \
+ *(inst)++ = (unsigned char)0xa4; \
+ x86_reg_emit ((inst), (reg), (dreg)); \
+ x86_imm_emit8 ((inst), (shamt)); \
+ } while (0)
+
/*
* EDX:EAX = EAX * rm
*/
diff --git a/mono/jit/ChangeLog b/mono/jit/ChangeLog
index 83b417d985e..6701a171f2e 100644
--- a/mono/jit/ChangeLog
+++ b/mono/jit/ChangeLog
@@ -1,3 +1,7 @@
+2002-02-01 Dietmar Maurer <dietmar@ximian.com>
+
+ * x86.brg: impl. SHL/SHR/CLT for 64 bit values
+
2002-01-31 Dietmar Maurer <dietmar@ximian.com>
* x86.brg: impl. CEQ(lreg,lreg)
diff --git a/mono/jit/jit.c b/mono/jit/jit.c
index a9dfd67edd4..6f0d22189b8 100644
--- a/mono/jit/jit.c
+++ b/mono/jit/jit.c
@@ -2531,6 +2531,28 @@ mono_analyze_stack (MonoFlowGraph *cfg)
break;
}
+ case CEE_SHR: {
+ ++ip;
+ sp -= 2;
+ t1 = mono_ctree_new (mp, MB_TERM_SHR, sp [0], sp [1]);
+ PUSH_TREE (t1, sp [0]->svt);
+ break;
+ }
+ case CEE_SHR_UN: {
+ ++ip;
+ sp -= 2;
+ t1 = mono_ctree_new (mp, MB_TERM_SHR_UN, sp [0], sp [1]);
+ PUSH_TREE (t1, sp [0]->svt);
+ break;
+ }
+ case CEE_SHL: {
+ ++ip;
+ sp -= 2;
+ t1 = mono_ctree_new (mp, MB_TERM_SHL, sp [0], sp [1]);
+ PUSH_TREE (t1, sp [0]->svt);
+ break;
+ }
+
MAKE_BI_ALU (ADD)
MAKE_BI_ALU (ADD_OVF)
MAKE_BI_ALU (ADD_OVF_UN)
@@ -2540,9 +2562,6 @@ mono_analyze_stack (MonoFlowGraph *cfg)
MAKE_BI_ALU (AND)
MAKE_BI_ALU (OR)
MAKE_BI_ALU (XOR)
- MAKE_BI_ALU (SHL)
- MAKE_BI_ALU (SHR)
- MAKE_BI_ALU (SHR_UN)
MAKE_SPILLED_BI_ALU (MUL)
MAKE_SPILLED_BI_ALU (MUL_OVF)
MAKE_SPILLED_BI_ALU (MUL_OVF_UN)
@@ -2908,6 +2927,7 @@ mono_analyze_stack (MonoFlowGraph *cfg)
PUSH_TREE (t1, VAL_DOUBLE);
break;
}
+ case CEE_CONV_OVF_I:
case CEE_CONV_OVF_I4: {
++ip;
sp--;
@@ -2923,6 +2943,7 @@ mono_analyze_stack (MonoFlowGraph *cfg)
PUSH_TREE (t1, VAL_I32);
break;
}
+ case CEE_CONV_OVF_U:
case CEE_CONV_OVF_U4: {
++ip;
sp--;
diff --git a/mono/jit/x86.brg b/mono/jit/x86.brg
index c124bf59b48..376e031804a 100644
--- a/mono/jit/x86.brg
+++ b/mono/jit/x86.brg
@@ -1861,6 +1861,13 @@ lreg: CONST_I8 1 {
x86_mov_reg_imm (s->code, tree->reg2, *((gint32 *)&tree->data.p + 1));
}
+reg: CONV_I1 (lreg) {
+ x86_alu_reg_imm (s->code, X86_AND, tree->left->reg1, 0xff);
+
+ if (tree->reg1 != tree->left->reg1)
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+}
+
lreg: CONV_I8 (CONST_I4) {
x86_mov_reg_imm (s->code, tree->reg1, tree->left->data.i);
@@ -1991,6 +1998,92 @@ lreg: LDIND_I8 (addr) {
PRINT_REG ("LDIND_I8_1", tree->reg2);
}
+lreg: SHR (lreg, CONST_I4) {
+ if (tree->right->data.i < 32) {
+ x86_shrd_reg_imm (s->code, tree->left->reg1, tree->left->reg2, tree->right->data.i);
+ x86_shift_reg_imm (s->code, X86_SAR, tree->left->reg2, tree->right->data.i);
+ if (tree->reg1 != tree->left->reg1)
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+ if (tree->reg2 != tree->left->reg2)
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg2, 4);
+ } else if (tree->right->data.i < 64) {
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg2, 4);
+ x86_shift_reg_imm (s->code, X86_SAR, tree->reg2, 31);
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg2, 4);
+ x86_shift_reg_imm (s->code, X86_SAR, tree->reg1, (tree->right->data.i - 32));
+ } /* else unspecified result */
+
+}
+
+lreg: SHR (lreg, reg) {
+ guint8 *start = s->code;
+ gint32 o1, o2, i;
+
+ tree->is_jump = TRUE;
+
+ if (tree->right->reg1 != X86_ECX)
+ x86_mov_reg_reg (s->code, X86_ECX, tree->right->reg1, 4);
+
+ for (i = 0; i < 2; i ++) {
+ s->code = start;
+ x86_shrd_reg (s->code, tree->left->reg1, tree->left->reg2);
+ x86_shift_reg (s->code, X86_SAR, tree->left->reg2);
+ x86_test_reg_imm (s->code, X86_ECX, 32);
+ o1 = 2 + s->code - s->start;
+ x86_branch8 (s->code, X86_CC_EQ, o2 - o1, FALSE);
+ x86_mov_reg_reg (s->code, tree->left->reg1, tree->left->reg2, 4);
+ x86_shift_reg_imm (s->code, X86_SAR, tree->reg2, 31);
+ o2 = s->code - s->start;
+ }
+
+ if (tree->reg1 != tree->left->reg1)
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+ if (tree->reg2 != tree->left->reg2)
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg2, 4);
+}
+
+lreg: SHL (lreg, CONST_I4) {
+ if (tree->right->data.i < 32) {
+ x86_shld_reg_imm (s->code, tree->left->reg2, tree->left->reg1, tree->right->data.i);
+ x86_shift_reg_imm (s->code, X86_SHL, tree->left->reg1, tree->right->data.i);
+ if (tree->reg1 != tree->left->reg1)
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+ if (tree->reg2 != tree->left->reg2)
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg2, 4);
+ } else if (tree->right->data.i < 64) {
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg1, 4);
+ x86_shift_reg_imm (s->code, X86_SHL, tree->reg2, (tree->right->data.i - 32));
+ x86_alu_reg_reg (s->code, X86_XOR, tree->reg1, tree->reg1);
+ } /* else unspecified result */
+}
+
+lreg: SHL (lreg, reg) {
+ guint8 *start = s->code;
+ gint32 o1, o2, i;
+
+ tree->is_jump = TRUE;
+
+ if (tree->right->reg1 != X86_ECX)
+ x86_mov_reg_reg (s->code, X86_ECX, tree->right->reg1, 4);
+
+ for (i = 0; i < 2; i ++) {
+ s->code = start;
+ x86_shld_reg (s->code, tree->left->reg2, tree->left->reg1);
+ x86_shift_reg (s->code, X86_SHL, tree->left->reg1);
+ x86_test_reg_imm (s->code, X86_ECX, 32);
+ o1 = 2 + s->code - s->start;
+ x86_branch8 (s->code, X86_CC_EQ, o2 - o1, FALSE);
+ x86_mov_reg_reg (s->code, tree->left->reg2, tree->left->reg1, 4);
+ x86_alu_reg_reg (s->code, X86_XOR, tree->left->reg1, tree->left->reg1);
+ o2 = s->code - s->start;
+ }
+
+ if (tree->reg1 != tree->left->reg1)
+ x86_mov_reg_reg (s->code, tree->reg1, tree->left->reg1, 4);
+ if (tree->reg2 != tree->left->reg2)
+ x86_mov_reg_reg (s->code, tree->reg2, tree->left->reg2, 4);
+}
+
lreg: ADD (lreg, lreg) {
x86_alu_reg_reg (s->code, X86_ADD, tree->left->reg1, tree->right->reg1);
x86_alu_reg_reg (s->code, X86_ADC, tree->left->reg2, tree->right->reg2);
@@ -2330,6 +2423,29 @@ reg: CEQ (lreg, lreg) {
}
}
+reg: CLT (lreg, lreg) {
+ guint8 *start = s->code;
+ gint32 o1, o2, o3, o4, o5, i;
+
+ tree->is_jump = TRUE;
+
+ for (i = 0; i < 2; i ++) {
+ s->code = start;
+ x86_alu_reg_reg (s->code, X86_XOR, tree->reg1, tree->reg1);
+ x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg2, tree->right->reg2);
+ o1 = 2 + s->code - s->start;
+ x86_branch8 (s->code, X86_CC_GT, o5 - o1, TRUE);
+ o2 = 2 + s->code - s->start;
+ x86_branch8 (s->code, X86_CC_NE, o4 - o2, TRUE);
+ x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+ o3 = 2 + s->code - s->start;
+ x86_branch8 (s->code, X86_CC_LE, o4 - o3, FALSE);
+ o5 = s->code - s->start;
+ x86_mov_reg_imm (s->code, tree->reg1, 1);
+ o4 = s->code - s->start;
+ }
+}
+
stmt: BEQ (lreg, lreg) {
guint8 *start = s->code;
gint32 o1, o2, i;
diff --git a/mono/metadata/unicode.c b/mono/metadata/unicode.c
index 585cecb7c43..ba57a96d9d7 100644
--- a/mono/metadata/unicode.c
+++ b/mono/metadata/unicode.c
@@ -370,6 +370,9 @@ ves_icall_iconv_get_bytes (gpointer converter, MonoArray *chars, gint32 charInde
guchar *src, *dest;
int len, max_len;
+ if (!charCount)
+ return 0;
+
g_assert (cd);
g_assert (chars);
g_assert (bytes);
diff --git a/mono/tests/jit-long.cs b/mono/tests/jit-long.cs
index cf1e4c65012..2780075feeb 100644
--- a/mono/tests/jit-long.cs
+++ b/mono/tests/jit-long.cs
@@ -4,6 +4,30 @@ public class TestJit {
return a+b;
}
+ public static int test_shift ()
+ {
+ long a = 9;
+ int b = 1;
+
+ if ((a >> b) != 4)
+ return 1;
+
+ if ((a >> 63) != 0)
+ return 1;
+
+ if ((a << 1) != 18)
+ return 1;
+
+ if ((a << b) != 18)
+ return 1;
+
+ a = -9;
+ if ((a >> b) != -5)
+ return 1;
+
+ return 0;
+ }
+
public static int test_alu ()
{
long a = 9, b = 6;
@@ -67,6 +91,9 @@ public class TestJit {
public static int Main() {
int num = 1;
+ if (test_shift () != 0)
+ return num;
+ num++;
if (test_call (3, 5) != 8)
return num;
num++;
diff --git a/web/pending-classes.in b/web/pending-classes.in
index b070b28ffb8..b8227f3965b 100644
--- a/web/pending-classes.in
+++ b/web/pending-classes.in
@@ -268,7 +268,6 @@ System.Runtime.Remoting.Metadata.W3cXsd2001.SoapToken
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYear
System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYearMonth
System.Runtime.Remoting.Metadata.XmlFieldOrderOption
-System.Runtime.Remoting.ObjectHandle
System.Runtime.Remoting.Proxies.ProxyAttribute
System.Runtime.Remoting.Proxies.RealProxy
System.Runtime.Remoting.RemotingConfiguration
@@ -299,6 +298,7 @@ System.Runtime.Serialization.SerializationEntry
System.Runtime.Serialization.SerializationInfoEnumerator
System.Runtime.Serialization.SurrogateSelector
System.RuntimeArgumentHandle
+System.Security.AllowPartiallyTrustedCallersAttribute
System.Security.Cryptography.CryptoConfig
System.Security.Cryptography.DSACryptoServiceProvider
System.Security.Cryptography.HMACSHA1
@@ -351,16 +351,13 @@ System.Security.Permissions.ZoneIdentityPermission
System.Security.Policy.AllMembershipCondition
System.Security.Policy.ApplicationDirectory
System.Security.Policy.ApplicationDirectoryMembershipCondition
-System.Security.Policy.CodeGroup
System.Security.Policy.FileCodeGroup
System.Security.Policy.FirstMatchCodeGroup
System.Security.Policy.Hash
System.Security.Policy.HashMembershipCondition
System.Security.Policy.NetCodeGroup
System.Security.Policy.PermissionRequestEvidence
-System.Security.Policy.PolicyException
System.Security.Policy.PolicyStatement
-System.Security.Policy.PolicyStatementAttribute
System.Security.Policy.Publisher
System.Security.Policy.PublisherMembershipCondition
System.Security.Policy.Site
@@ -375,6 +372,7 @@ System.Security.Policy.ZoneMembershipCondition
System.Security.Principal.WindowsIdentity
System.Security.Principal.WindowsImpersonationContext
System.Security.Principal.WindowsPrincipal
+System.Threading.CompressedStack
System.Threading.IOCompletionCallback
System.Threading.ThreadStart
System.Threading.TimerCallback