Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite math jit helpers to managed code #98858

Closed
wants to merge 36 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5968f8d
Rewrite math jit helpers to managed code
MichalPetryka Feb 23, 2024
dfbcf22
Fix asserts
MichalPetryka Feb 23, 2024
c665079
Merge branch 'main' into math-helpers
MichalPetryka Feb 25, 2024
d150f78
Merge branch 'main' into math-helpers
MichalPetryka Feb 29, 2024
49c110d
Merge remote-tracking branch 'upstream/main' into math-helpers
MichalPetryka Mar 6, 2024
878b573
Cleanup changes, add comments
MichalPetryka Mar 6, 2024
ef4868b
Fix typo
MichalPetryka Mar 6, 2024
08eaa08
Fix small type overflow in the scanner
MichalPetryka Mar 7, 2024
a96f68a
Update JIT-EE GUID
MichalPetryka Mar 7, 2024
2b4b795
Remove helper
MichalPetryka Mar 7, 2024
06cd46c
Merge remote-tracking branch 'upstream/main' into math-helpers
MichalPetryka Mar 9, 2024
64b9bbc
Fully managed conversions to double
MichalPetryka Mar 10, 2024
769d5eb
Merge remote-tracking branch 'upstream/main' into math-helpers
MichalPetryka Mar 11, 2024
b4d0521
Restore one ASM helper
MichalPetryka Mar 11, 2024
ab17973
Merge remote-tracking branch 'upstream/main' into math-helpers
MichalPetryka Mar 13, 2024
6a525ee
Cleanup code, move uint cast to managed
MichalPetryka Mar 13, 2024
da0b434
Update jithelpers.h
MichalPetryka Mar 13, 2024
18565e4
Remove DoubleToUInt
MichalPetryka Mar 13, 2024
a7e114b
Move the helpers
MichalPetryka Mar 13, 2024
070bead
Remove the using
MichalPetryka Mar 13, 2024
d4fd66d
Fix typos
MichalPetryka Mar 13, 2024
8efe9eb
Rename defined and helper
MichalPetryka Mar 14, 2024
9c97f32
Merge remote-tracking branch 'upstream/main' into math-helpers
MichalPetryka Mar 14, 2024
7943ef7
Update jitinterface.h
MichalPetryka Mar 14, 2024
334838b
Rename to Checked
MichalPetryka Mar 14, 2024
1cdcf5e
Cleanup NativeAOT, fix parameter names
MichalPetryka Mar 14, 2024
e221809
Update jitinterface.cpp
MichalPetryka Mar 14, 2024
2188fe8
Cleanup throw helpers
MichalPetryka Mar 14, 2024
b4a5511
Remove the unmanaged helper from the tiering optimization
MichalPetryka Mar 15, 2024
ffabbe7
Go back to C++ helper for doubles, root things with scanner, add fmod
MichalPetryka Mar 15, 2024
68c39a4
Update MathHelpers.cpp
MichalPetryka Mar 15, 2024
02c5335
Move unused helper back to C++, restore scanner ifs
MichalPetryka Mar 15, 2024
1c36262
Update ILImporter.Scanner.cs
MichalPetryka Mar 15, 2024
8fcb99f
Update ILImporter.Scanner.cs
MichalPetryka Mar 15, 2024
f7769d7
Update src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanne…
MichalPetryka Mar 15, 2024
be4c607
Call FMod directly
MichalPetryka Mar 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ enum CorInfoHelpFunc
CORINFO_HELP_DBL2ULNG_OVF,
CORINFO_HELP_FLTREM,
CORINFO_HELP_DBLREM,
CORINFO_HELP_FLTROUND,
CORINFO_HELP_DBLROUND,
CORINFO_HELP_FLTROUND, // unused
CORINFO_HELP_DBLROUND, // unused

/* Allocating a new object. Always use ICorClassInfo::getNewHelper() to decide
which is the right helper to use to allocate an object of a given type. */
Expand Down
35 changes: 18 additions & 17 deletions src/coreclr/inc/jithelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@
JITHELPER(CORINFO_HELP_UDIV, JIT_UDiv, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_UMOD, JIT_UMod, CORINFO_HELP_SIG_8_STACK)

// CORINFO_HELP_DBL2INT, CORINFO_HELP_DBL2UINT, and CORINFO_HELP_DBL2LONG get
// patched for CPUs that support SSE2 (P4 and above).
#ifndef TARGET_64BIT
JITHELPER(CORINFO_HELP_LLSH, JIT_LLsh, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_LRSH, JIT_LRsh, CORINFO_HELP_SIG_REG_ONLY)
Expand All @@ -47,26 +45,29 @@
JITHELPER(CORINFO_HELP_LRSZ, NULL, CORINFO_HELP_SIG_CANNOT_USE_ALIGN_STUB)
#endif // TARGET_64BIT
JITHELPER(CORINFO_HELP_LMUL, JIT_LMul, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_LMUL_OVF, JIT_LMulOvf, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_ULMUL_OVF, JIT_ULMulOvf, CORINFO_HELP_SIG_16_STACK)
DYNAMICJITHELPER(CORINFO_HELP_LMUL_OVF, NULL, CORINFO_HELP_SIG_16_STACK)
MichalPetryka marked this conversation as resolved.
Show resolved Hide resolved
DYNAMICJITHELPER(CORINFO_HELP_ULMUL_OVF, NULL, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_LDIV, JIT_LDiv, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_LMOD, JIT_LMod, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_ULDIV, JIT_ULDiv, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_ULMOD, JIT_ULMod, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_LNG2DBL, JIT_Lng2Dbl, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_ULNG2DBL, JIT_ULng2Dbl, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBL2INT, JIT_Dbl2Lng, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2INT_OVF, JIT_Dbl2IntOvf, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_LNG2DBL, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_ULNG2DBL, NULL, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2INT, JIT_Dbl2Int, CORINFO_HELP_SIG_8_STACK)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What platform is this needed for?

Arm, Arm64, x86, and x64 all provide a direct instruction for double to int32 as part of the baseline ISAs we require.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's unused but can't be removed without an R2R bump. Also, Intel PRs might need it again.

DYNAMICJITHELPER(CORINFO_HELP_DBL2INT_OVF, NULL, CORINFO_HELP_SIG_8_STACK)
// CORINFO_HELP_DBL2LNG and CORINFO_HELP_DBL2UINT get patched for CPUs with SSE3 in jitinterfacex86.cpp
DYNAMICJITHELPER(CORINFO_HELP_DBL2LNG, JIT_Dbl2Lng, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2LNG_OVF, JIT_Dbl2LngOvf, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBL2LNG_OVF, NULL, CORINFO_HELP_SIG_8_STACK)
// this relies on ABI returning the lower half of long the same as an uint
// and the upper half in a caller saver register
DYNAMICJITHELPER(CORINFO_HELP_DBL2UINT, JIT_Dbl2Lng, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2UINT_OVF, JIT_Dbl2UIntOvf, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2ULNG, JIT_Dbl2ULng, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBL2ULNG_OVF, JIT_Dbl2ULngOvf, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_FLTREM, JIT_FltRem, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBLREM, JIT_DblRem, CORINFO_HELP_SIG_16_STACK)
JITHELPER(CORINFO_HELP_FLTROUND, JIT_FloatRound, CORINFO_HELP_SIG_8_STACK)
JITHELPER(CORINFO_HELP_DBLROUND, JIT_DoubleRound, CORINFO_HELP_SIG_16_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBL2UINT_OVF, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBL2ULNG, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBL2ULNG_OVF, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_FLTREM, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBLREM, NULL, CORINFO_HELP_SIG_16_STACK)
DYNAMICJITHELPER(CORINFO_HELP_FLTROUND, NULL, CORINFO_HELP_SIG_8_STACK)
DYNAMICJITHELPER(CORINFO_HELP_DBLROUND, NULL, CORINFO_HELP_SIG_16_STACK)

// Allocating a new object
JITHELPER(CORINFO_HELP_NEWFAST, JIT_New, CORINFO_HELP_SIG_REG_ONLY)
Expand Down Expand Up @@ -203,7 +204,7 @@
JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE, JIT_GetSharedNonGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR, JIT_GetSharedGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR, JIT_GetSharedNonGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedNonGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, JIT_GetSharedGCThreadStaticBaseOptimized, CORINFO_HELP_SIG_REG_ONLY)
JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, JIT_GetSharedNonGCThreadStaticBaseOptimized, CORINFO_HELP_SIG_REG_ONLY)
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5973,6 +5973,7 @@ unsigned Compiler::gtSetEvalOrder(GenTree* tree)
switch (tree->AsIntrinsic()->gtIntrinsicName)
{
case NI_System_Math_Atan2:
case NI_System_Math_FMod:
jkotas marked this conversation as resolved.
Show resolved Hide resolved
case NI_System_Math_Pow:
// These math intrinsics are actually implemented by user calls. Increase the
// Sethi 'complexity' by two to reflect the argument register requirement.
Expand Down
98 changes: 13 additions & 85 deletions src/coreclr/nativeaot/Runtime/MathHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,81 +5,13 @@
#include "CommonMacros.h"
#include "rhassert.h"

//
// Floating point and 64-bit integer math helpers.
//

FCIMPL1_D(uint64_t, RhpDbl2ULng, double val)
{
const double two63 = 2147483648.0 * 4294967296.0;
uint64_t ret;
if (val < two63)
{
ret = (int64_t)(val);
}
else
{
// subtract 0x8000000000000000, do the convert then add it back again
ret = (int64_t)(val - two63) + I64(0x8000000000000000);
}
return ret;
}
FCIMPLEND

#undef min
#undef max
#include <cmath>

FCIMPL2_FF(float, RhpFltRem, float dividend, float divisor)
{
//
// From the ECMA standard:
//
// If [divisor] is zero or [dividend] is infinity
// the result is NaN.
// If [divisor] is infinity,
// the result is [dividend] (negated for -infinity***).
//
// ***"negated for -infinity" has been removed from the spec
//

if (divisor==0 || !std::isfinite(dividend))
{
return -nanf("");
}
else if (!std::isfinite(divisor) && !std::isnan(divisor))
{
return dividend;
}
// else...
return fmodf(dividend,divisor);
}
FCIMPLEND

FCIMPL2_DD(double, RhpDblRem, double dividend, double divisor)
{
//
// From the ECMA standard:
//
// If [divisor] is zero or [dividend] is infinity
// the result is NaN.
// If [divisor] is infinity,
// the result is [dividend] (negated for -infinity***).
//
// ***"negated for -infinity" has been removed from the spec
//
if (divisor==0 || !std::isfinite(dividend))
{
return -nan("");
}
else if (!std::isfinite(divisor) && !std::isnan(divisor))
{
return dividend;
}
// else...
return(fmod(dividend,divisor));
}
FCIMPLEND
//
// Floating point and 64-bit integer math helpers.
//

#ifndef HOST_64BIT
EXTERN_C int64_t QCALLTYPE RhpLDiv(int64_t i, int64_t j)
Expand All @@ -106,12 +38,6 @@ EXTERN_C uint64_t QCALLTYPE RhpULMod(uint64_t i, uint64_t j)
return i % j;
}

FCIMPL1_D(int64_t, RhpDbl2Lng, double val)
{
return (int64_t)val;
}
FCIMPLEND

FCIMPL1_D(int32_t, RhpDbl2Int, double val)
{
return (int32_t)val;
Expand All @@ -124,15 +50,9 @@ FCIMPL1_D(uint32_t, RhpDbl2UInt, double val)
}
FCIMPLEND

FCIMPL1_L(double, RhpLng2Dbl, int64_t val)
{
return (double)val;
}
FCIMPLEND

FCIMPL1_L(double, RhpULng2Dbl, uint64_t val)
FCIMPL1_D(int64_t, RhpDbl2Lng, double val)
{
return (double)val;
return (int64_t)val;
}
FCIMPLEND

Expand Down Expand Up @@ -363,6 +283,14 @@ FCIMPL1_F(float, tanhf, float x)
return std::tanhf(x);
FCIMPLEND

FCIMPL2_DD(double, fmod, double x, double y)
return std::fmod(x, y);
FCIMPLEND

FCIMPL2_FF(float, fmodf, float x, float y)
return std::fmodf(x, y);
FCIMPLEND

FCIMPL3_DDD(double, fma, double x, double y, double z)
return std::fma(x, y, z);
FCIMPLEND
Expand Down
Loading
Loading