diff options
author | Dietmar Maurer <dietmar@mono-cvs.ximian.com> | 2002-02-01 15:04:34 +0300 |
---|---|---|
committer | Dietmar Maurer <dietmar@mono-cvs.ximian.com> | 2002-02-01 15:04:34 +0300 |
commit | 7a638319b46f518d2c5cbca74c4b0961bbcea952 (patch) | |
tree | 50e6e1e45176e29e0e76f3a1ab24940f4df981b7 | |
parent | 4163d85e9598b783774634fa63dcc94f0fb93fba (diff) |
SHR/SHL impl.
svn path=/trunk/mono/; revision=2224
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | doc/pending-classes.in | 6 | ||||
-rw-r--r-- | mono/arch/x86/x86-codegen.h | 32 | ||||
-rw-r--r-- | mono/jit/ChangeLog | 4 | ||||
-rw-r--r-- | mono/jit/jit.c | 27 | ||||
-rw-r--r-- | mono/jit/x86.brg | 116 | ||||
-rw-r--r-- | mono/metadata/unicode.c | 3 | ||||
-rw-r--r-- | mono/tests/jit-long.cs | 27 | ||||
-rw-r--r-- | web/pending-classes.in | 6 |
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
|