Skip to content

Commit ac4bd28

Browse files
committed
Move arithmetic helpers to managed code
1 parent 8b1d30a commit ac4bd28

File tree

5 files changed

+181
-223
lines changed

5 files changed

+181
-223
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/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/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

src/coreclr/vm/jithelpers.cpp

Lines changed: 1 addition & 203 deletions
Original file line numberDiff line numberDiff line change
@@ -126,208 +126,6 @@ HCIMPL2_VV(INT64, JIT_LMul, INT64 val1, INT64 val2)
126126
HCIMPLEND
127127
#endif // !TARGET_X86 || TARGET_UNIX
128128

129-
/*********************************************************************/
130-
HCIMPL2(INT32, JIT_Div, INT32 dividend, INT32 divisor)
131-
{
132-
FCALL_CONTRACT;
133-
134-
RuntimeExceptionKind ehKind;
135-
136-
if (((UINT32) (divisor + 1)) <= 1) // Unsigned test for divisor in [-1 .. 0]
137-
{
138-
if (divisor == 0)
139-
{
140-
ehKind = kDivideByZeroException;
141-
goto ThrowExcep;
142-
}
143-
else if (divisor == -1)
144-
{
145-
if (dividend == INT32_MIN)
146-
{
147-
ehKind = kOverflowException;
148-
goto ThrowExcep;
149-
}
150-
return -dividend;
151-
}
152-
}
153-
154-
return(dividend / divisor);
155-
156-
ThrowExcep:
157-
FCThrow(ehKind);
158-
}
159-
HCIMPLEND
160-
161-
/*********************************************************************/
162-
HCIMPL2(INT32, JIT_Mod, INT32 dividend, INT32 divisor)
163-
{
164-
FCALL_CONTRACT;
165-
166-
RuntimeExceptionKind ehKind;
167-
168-
if (((UINT32) (divisor + 1)) <= 1) // Unsigned test for divisor in [-1 .. 0]
169-
{
170-
if (divisor == 0)
171-
{
172-
ehKind = kDivideByZeroException;
173-
goto ThrowExcep;
174-
}
175-
else if (divisor == -1)
176-
{
177-
if (dividend == INT32_MIN)
178-
{
179-
ehKind = kOverflowException;
180-
goto ThrowExcep;
181-
}
182-
return 0;
183-
}
184-
}
185-
186-
return(dividend % divisor);
187-
188-
ThrowExcep:
189-
FCThrow(ehKind);
190-
}
191-
HCIMPLEND
192-
193-
/*********************************************************************/
194-
HCIMPL2(UINT32, JIT_UDiv, UINT32 dividend, UINT32 divisor)
195-
{
196-
FCALL_CONTRACT;
197-
198-
if (divisor == 0)
199-
FCThrow(kDivideByZeroException);
200-
201-
return(dividend / divisor);
202-
}
203-
HCIMPLEND
204-
205-
/*********************************************************************/
206-
HCIMPL2(UINT32, JIT_UMod, UINT32 dividend, UINT32 divisor)
207-
{
208-
FCALL_CONTRACT;
209-
210-
if (divisor == 0)
211-
FCThrow(kDivideByZeroException);
212-
213-
return(dividend % divisor);
214-
}
215-
HCIMPLEND
216-
217-
/*********************************************************************/
218-
HCIMPL2_VV(INT64, JIT_LDiv, INT64 dividend, INT64 divisor)
219-
{
220-
FCALL_CONTRACT;
221-
222-
RuntimeExceptionKind ehKind;
223-
224-
if (Is32BitSigned(divisor))
225-
{
226-
if ((INT32)divisor == 0)
227-
{
228-
ehKind = kDivideByZeroException;
229-
goto ThrowExcep;
230-
}
231-
232-
if ((INT32)divisor == -1)
233-
{
234-
if ((UINT64) dividend == UI64(0x8000000000000000))
235-
{
236-
ehKind = kOverflowException;
237-
goto ThrowExcep;
238-
}
239-
return -dividend;
240-
}
241-
242-
// Check for -ive or +ive numbers in the range -2**31 to 2**31
243-
if (Is32BitSigned(dividend))
244-
return((INT32)dividend / (INT32)divisor);
245-
}
246-
247-
// For all other combinations fallback to int64 div.
248-
return(dividend / divisor);
249-
250-
ThrowExcep:
251-
FCThrow(ehKind);
252-
}
253-
HCIMPLEND
254-
255-
/*********************************************************************/
256-
HCIMPL2_VV(INT64, JIT_LMod, INT64 dividend, INT64 divisor)
257-
{
258-
FCALL_CONTRACT;
259-
260-
RuntimeExceptionKind ehKind;
261-
262-
if (Is32BitSigned(divisor))
263-
{
264-
if ((INT32)divisor == 0)
265-
{
266-
ehKind = kDivideByZeroException;
267-
goto ThrowExcep;
268-
}
269-
270-
if ((INT32)divisor == -1)
271-
{
272-
// <TODO>TODO, we really should remove this as it lengthens the code path
273-
// and the spec really says that it should not throw an exception. </TODO>
274-
if ((UINT64) dividend == UI64(0x8000000000000000))
275-
{
276-
ehKind = kOverflowException;
277-
goto ThrowExcep;
278-
}
279-
return 0;
280-
}
281-
282-
// Check for -ive or +ive numbers in the range -2**31 to 2**31
283-
if (Is32BitSigned(dividend))
284-
return((INT32)dividend % (INT32)divisor);
285-
}
286-
287-
// For all other combinations fallback to int64 div.
288-
return(dividend % divisor);
289-
290-
ThrowExcep:
291-
FCThrow(ehKind);
292-
}
293-
HCIMPLEND
294-
295-
/*********************************************************************/
296-
HCIMPL2_VV(UINT64, JIT_ULDiv, UINT64 dividend, UINT64 divisor)
297-
{
298-
FCALL_CONTRACT;
299-
300-
if (Hi32Bits(divisor) == 0)
301-
{
302-
if ((UINT32)(divisor) == 0)
303-
FCThrow(kDivideByZeroException);
304-
305-
if (Hi32Bits(dividend) == 0)
306-
return((UINT32)dividend / (UINT32)divisor);
307-
}
308-
309-
return(dividend / divisor);
310-
}
311-
HCIMPLEND
312-
313-
/*********************************************************************/
314-
HCIMPL2_VV(UINT64, JIT_ULMod, UINT64 dividend, UINT64 divisor)
315-
{
316-
FCALL_CONTRACT;
317-
318-
if (Hi32Bits(divisor) == 0)
319-
{
320-
if ((UINT32)(divisor) == 0)
321-
FCThrow(kDivideByZeroException);
322-
323-
if (Hi32Bits(dividend) == 0)
324-
return((UINT32)dividend % (UINT32)divisor);
325-
}
326-
327-
return(dividend % divisor);
328-
}
329-
HCIMPLEND
330-
331129
#if !defined(HOST_64BIT) && !defined(TARGET_X86)
332130
/*********************************************************************/
333131
HCIMPL2_VV(UINT64, JIT_LLsh, UINT64 num, int shift)
@@ -4528,7 +4326,7 @@ bool IndirectionAllowedForJitHelper(CorInfoHelpFunc ftnNum)
45284326
{
45294327
return false;
45304328
}
4531-
4329+
45324330
return true;
45334331
}
45344332

0 commit comments

Comments
 (0)