Skip to content

Commit 8b0448f

Browse files
committed
Move arithmetic helpers to managed code
1 parent 82256bf commit 8b0448f

File tree

11 files changed

+342
-360
lines changed

11 files changed

+342
-360
lines changed

src/coreclr/inc/jithelpers.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
JITHELPER(CORINFO_HELP_UNDEF, NULL, METHOD__NIL)
3636

3737
// Arithmetic
38-
JITHELPER(CORINFO_HELP_DIV, JIT_Div, METHOD__NIL)
39-
JITHELPER(CORINFO_HELP_MOD, JIT_Mod, METHOD__NIL)
40-
JITHELPER(CORINFO_HELP_UDIV, JIT_UDiv, METHOD__NIL)
41-
JITHELPER(CORINFO_HELP_UMOD, JIT_UMod, METHOD__NIL)
38+
DYNAMICJITHELPER(CORINFO_HELP_DIV, NULL, METHOD__MATH__DIVIDE_CHECKED)
39+
DYNAMICJITHELPER(CORINFO_HELP_MOD, NULL, METHOD__MATH__MODULUS_CHECKED)
40+
DYNAMICJITHELPER(CORINFO_HELP_UDIV, NULL, METHOD__MATH__DIVIDE_UNSIGNED)
41+
DYNAMICJITHELPER(CORINFO_HELP_UMOD, NULL, METHOD__MATH__MODULUS_UNSIGNED)
4242

4343
// CORINFO_HELP_DBL2INT, CORINFO_HELP_DBL2UINT, and CORINFO_HELP_DBL2LONG get
4444
// patched for CPUs that support SSE2 (P4 and above).
@@ -59,10 +59,10 @@
5959
DYNAMICJITHELPER(CORINFO_HELP_LMUL_OVF, NULL, METHOD__NIL)
6060
DYNAMICJITHELPER(CORINFO_HELP_ULMUL_OVF, NULL, METHOD__NIL)
6161
#endif // TARGET_64BIT
62-
JITHELPER(CORINFO_HELP_LDIV, JIT_LDiv, METHOD__NIL)
63-
JITHELPER(CORINFO_HELP_LMOD, JIT_LMod, METHOD__NIL)
64-
JITHELPER(CORINFO_HELP_ULDIV, JIT_ULDiv, METHOD__NIL)
65-
JITHELPER(CORINFO_HELP_ULMOD, JIT_ULMod, METHOD__NIL)
62+
DYNAMICJITHELPER(CORINFO_HELP_LDIV, NULL, METHOD__MATH__DIVIDE_LONGS)
63+
DYNAMICJITHELPER(CORINFO_HELP_LMOD, NULL, METHOD__MATH__MODULUS_LONGS)
64+
DYNAMICJITHELPER(CORINFO_HELP_ULDIV, NULL, METHOD__MATH__DIVIDE_ULONGS)
65+
DYNAMICJITHELPER(CORINFO_HELP_ULMOD, NULL, METHOD__MATH__MODULUS_ULONGS)
6666
JITHELPER(CORINFO_HELP_LNG2DBL, JIT_Lng2Dbl, METHOD__NIL)
6767
JITHELPER(CORINFO_HELP_ULNG2DBL, JIT_ULng2Dbl, METHOD__NIL)
6868
JITHELPER(CORINFO_HELP_DBL2INT, JIT_Dbl2Int, METHOD__NIL)

src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CompilerServices/RuntimeHelpers.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ public static int OffsetToStringData
1818

1919
[Intrinsic]
2020
public static extern void InitializeArray(Array array, RuntimeFieldHandle fldHandle);
21+
22+
public const string QCall = "*";
2123
}
2224
}

src/coreclr/nativeaot/Runtime/MathHelpers.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,25 @@ FCIMPL1_D(uint32_t, RhpDbl2UInt, double val)
5656
FCIMPLEND
5757

5858
#ifndef HOST_64BIT
59-
EXTERN_C int64_t QCALLTYPE RhpLDiv(int64_t i, int64_t j)
59+
EXTERN_C int64_t QCALLTYPE Math_ActualDivisionLong(int64_t i, int64_t j)
6060
{
6161
ASSERT(j && "Divide by zero!");
6262
return i / j;
6363
}
6464

65-
EXTERN_C uint64_t QCALLTYPE RhpULDiv(uint64_t i, uint64_t j)
65+
EXTERN_C uint64_t QCALLTYPE Math_ActualDivisionULong(uint64_t i, uint64_t j)
6666
{
6767
ASSERT(j && "Divide by zero!");
6868
return i / j;
6969
}
7070

71-
EXTERN_C int64_t QCALLTYPE RhpLMod(int64_t i, int64_t j)
71+
EXTERN_C int64_t QCALLTYPE Math_ActualModulusLong(int64_t i, int64_t j)
7272
{
7373
ASSERT(j && "Divide by zero!");
7474
return i % j;
7575
}
7676

77-
EXTERN_C uint64_t QCALLTYPE RhpULMod(uint64_t i, uint64_t j)
77+
EXTERN_C uint64_t QCALLTYPE Math_ActualModulusULong(uint64_t i, uint64_t j)
7878
{
7979
ASSERT(j && "Divide by zero!");
8080
return i % j;
@@ -95,25 +95,25 @@ FCIMPLEND
9595
#endif
9696

9797
#ifdef HOST_ARM
98-
EXTERN_C int32_t F_CALL_CONV RhpIDiv(int32_t i, int32_t j)
98+
EXTERN_C int32_t QCALLTYPE Math_ActualDivisionInt(int32_t i, int32_t j)
9999
{
100100
ASSERT(j && "Divide by zero!");
101101
return i / j;
102102
}
103103

104-
EXTERN_C uint32_t F_CALL_CONV RhpUDiv(uint32_t i, uint32_t j)
104+
EXTERN_C uint32_t QCALLTYPE Math_ActualDivisionUInt(uint32_t i, uint32_t j)
105105
{
106106
ASSERT(j && "Divide by zero!");
107107
return i / j;
108108
}
109109

110-
EXTERN_C int32_t F_CALL_CONV RhpIMod(int32_t i, int32_t j)
110+
EXTERN_C int32_t QCALLTYPE Math_ActualModulusInt(int32_t i, int32_t j)
111111
{
112112
ASSERT(j && "Divide by zero!");
113113
return i % j;
114114
}
115115

116-
EXTERN_C uint32_t F_CALL_CONV RhpUMod(uint32_t i, uint32_t j)
116+
EXTERN_C uint32_t QCALLTYPE Math_ActualModulusUInt(uint32_t i, uint32_t j)
117117
{
118118
ASSERT(j && "Divide by zero!");
119119
return i % j;

src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MathHelpers.cs

Lines changed: 0 additions & 128 deletions
This file was deleted.

src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@
116116
<Compile Include="Internal\Runtime\IDynamicInterfaceCastableSupport.cs" />
117117
<Compile Include="Internal\Runtime\MethodTable.Runtime.cs" />
118118
<Compile Include="Internal\Runtime\CompilerHelpers\ThrowHelpers.cs" />
119-
<Compile Include="Internal\Runtime\CompilerHelpers\MathHelpers.cs" />
120119
<Compile Include="Internal\Runtime\CompilerServices\FunctionPointerOps.cs" />
121120
<Compile Include="Internal\Runtime\CompilerServices\GenericMethodDescriptor.cs" />
122121
<Compile Include="Internal\Runtime\CompilerServices\RuntimeFieldHandleInfo.cs" />

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,29 +234,29 @@ public static void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id,
234234
break;
235235

236236
case ReadyToRunHelper.Mod:
237-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "IMod");
237+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("ModulusChecked", null);
238238
break;
239239
case ReadyToRunHelper.UMod:
240-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "UMod");
240+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("ModulusUnsigned", null);
241241
break;
242242
case ReadyToRunHelper.ULMod:
243-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "ULMod");
243+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("ModulusUnsignedLongs", null);
244244
break;
245245
case ReadyToRunHelper.LMod:
246-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "LMod");
246+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("ModulusLongs", null);
247247
break;
248248

249249
case ReadyToRunHelper.Div:
250-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "IDiv");
250+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("DivideChecked", null);
251251
break;
252252
case ReadyToRunHelper.UDiv:
253-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "UDiv");
253+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("DivideUnsigned", null);
254254
break;
255255
case ReadyToRunHelper.ULDiv:
256-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "ULDiv");
256+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("DivideUnsignedLongs", null);
257257
break;
258258
case ReadyToRunHelper.LDiv:
259-
methodDesc = context.GetHelperEntryPoint("MathHelpers", "LDiv");
259+
methodDesc = context.SystemModule.GetKnownType("System", "Math").GetKnownMethod("DivideLongs", null);
260260
break;
261261

262262
case ReadyToRunHelper.LRsz:

src/coreclr/vm/JitQCallHelpers.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,71 @@ extern "C" void * QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnS
2222
extern "C" CORINFO_GENERIC_HANDLE QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule);
2323
extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT);
2424

25+
#ifdef TARGET_32BIT
26+
extern "C" int32_t QCALLTYPE Math_ActualDivisionInt(int32_t i, int32_t j)
27+
{
28+
QCALL_CONTRACT_NO_GC_TRANSITION
29+
30+
ASSERT(j && "Divide by zero!");
31+
return i / j;
32+
}
33+
34+
extern "C" uint32_t QCALLTYPE Math_ActualDivisionUInt(uint32_t i, uint32_t j)
35+
{
36+
QCALL_CONTRACT_NO_GC_TRANSITION
37+
38+
ASSERT(j && "Divide by zero!");
39+
return i / j;
40+
}
41+
42+
extern "C" int32_t QCALLTYPE Math_ActualModulusInt(int32_t i, int32_t j)
43+
{
44+
QCALL_CONTRACT_NO_GC_TRANSITION
45+
46+
ASSERT(j && "Divide by zero!");
47+
return i % j;
48+
}
49+
50+
extern "C" uint32_t QCALLTYPE Math_ActualModulusUInt(uint32_t i, uint32_t j)
51+
{
52+
QCALL_CONTRACT_NO_GC_TRANSITION
53+
54+
ASSERT(j && "Divide by zero!");
55+
return i % j;
56+
}
57+
58+
extern "C" int64_t QCALLTYPE Math_ActualDivisionLong(int64_t i, int64_t j)
59+
{
60+
QCALL_CONTRACT_NO_GC_TRANSITION
61+
62+
ASSERT(j && "Divide by zero!");
63+
return i / j;
64+
}
65+
66+
extern "C" uint64_t QCALLTYPE Math_ActualDivisionULong(uint64_t i, uint64_t j)
67+
{
68+
QCALL_CONTRACT_NO_GC_TRANSITION
69+
70+
ASSERT(j && "Divide by zero!");
71+
return i / j;
72+
}
73+
74+
extern "C" int64_t QCALLTYPE Math_ActualModulusLong(int64_t i, int64_t j)
75+
{
76+
QCALL_CONTRACT_NO_GC_TRANSITION
77+
78+
ASSERT(j && "Divide by zero!");
79+
return i % j;
80+
}
81+
82+
extern "C" uint64_t QCALLTYPE Math_ActualModulusULong(uint64_t i, uint64_t j)
83+
{
84+
QCALL_CONTRACT_NO_GC_TRANSITION
85+
86+
ASSERT(j && "Divide by zero!");
87+
return i % j;
88+
}
89+
90+
#endif // TARGET_32BIT
91+
2592
#endif //_JITQCALLHELPERS_H

src/coreclr/vm/corelib.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,18 @@ DEFINE_CLASS(MATH, System, Math)
263263
DEFINE_METHOD(MATH, MULTIPLY_CHECKED_INT64, MultiplyChecked, SM_Long_Long_RetLong)
264264
DEFINE_METHOD(MATH, MULTIPLY_CHECKED_UINT64, MultiplyChecked, SM_ULong_ULong_RetULong)
265265
#endif
266-
DEFINE_METHOD(MATH, CONVERT_TO_INT32_CHECKED, ConvertToInt32Checked, NoSig)
267-
DEFINE_METHOD(MATH, CONVERT_TO_UINT32_CHECKED, ConvertToUInt32Checked, NoSig)
268-
DEFINE_METHOD(MATH, CONVERT_TO_INT64_CHECKED, ConvertToInt64Checked, NoSig)
269-
DEFINE_METHOD(MATH, CONVERT_TO_UINT64_CHECKED, ConvertToUInt64Checked, NoSig)
266+
DEFINE_METHOD(MATH, CONVERT_TO_INT32_CHECKED, ConvertToInt32Checked, NoSig)
267+
DEFINE_METHOD(MATH, CONVERT_TO_UINT32_CHECKED, ConvertToUInt32Checked, NoSig)
268+
DEFINE_METHOD(MATH, CONVERT_TO_INT64_CHECKED, ConvertToInt64Checked, NoSig)
269+
DEFINE_METHOD(MATH, CONVERT_TO_UINT64_CHECKED, ConvertToUInt64Checked, NoSig)
270+
DEFINE_METHOD(MATH, DIVIDE_CHECKED, DivideChecked, NoSig)
271+
DEFINE_METHOD(MATH, MODULUS_CHECKED, ModulusChecked, NoSig)
272+
DEFINE_METHOD(MATH, DIVIDE_UNSIGNED, DivideUnsigned, NoSig)
273+
DEFINE_METHOD(MATH, MODULUS_UNSIGNED, ModulusUnsigned, NoSig)
274+
DEFINE_METHOD(MATH, DIVIDE_LONGS, DivideLongs, NoSig)
275+
DEFINE_METHOD(MATH, MODULUS_LONGS, ModulusLongs, NoSig)
276+
DEFINE_METHOD(MATH, DIVIDE_ULONGS, DivideUnsignedLongs, NoSig)
277+
DEFINE_METHOD(MATH, MODULUS_ULONGS, ModulusUnsignedLongs, NoSig)
270278

271279
DEFINE_CLASS(DYNAMICMETHOD, ReflectionEmit, DynamicMethod)
272280

0 commit comments

Comments
 (0)