Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Expose the ConvertToIntegerNative APIs - #100993

Merged
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe
Apr 24, 2024
Merged

Expose the ConvertToIntegerNative APIs#100993
carlossanlop merged 6 commits into
dotnet:mainfrom
tannergooding:convert-unsafe

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#61885

@ghost

Copy link
Copy Markdown

Note regarding the new-api-needs-documentation label:

This serves as a reminder for when your PR is modifying a ref *.cs file and adding/modifying public APIs, please make sure the API implementation in the src *.cs file is documented with triple slash comments, so the PR reviewers can sign off that change.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib, @dotnet/avx512-contrib

This exposes the APIs that allow people to opt-in to the platform specific floating-point conversion behavior. It is a continuation of #97529

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Ping @dotnet/jit-contrib

@JulieLeeMSFTJulieLeeMSFT added this to the 9.0.0 milestone Apr 18, 2024
@JulieLeeMSFT

Copy link
Copy Markdown
Member

@BruceForstall, @anthonycanino, PTAL.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

It'd be nice to get this in before the snap tomorrow, so that we have a complete experience for the standardization around floating-point conversions that was done and users have the escape hatch to get access to the prior behavior.

@DeepakRajendrakumaranDeepakRajendrakumaran left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@kunalspathakkunalspathak left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

JIT changes LGTM, with some questions.


if (!varTypeIsArithmetic(retType))
{
assert((intrinsic == NI_PRIMITIVE_ConvertToInteger) || (intrinsic == NI_PRIMITIVE_ConvertToIntegerNative));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I am not too familiar with "named intrinsics", but aren't there more intrinsics like ConvertToInt64 that returns VectorT, although not sure why its entry is not in namedintrinsiclist.h. Can you please explain?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

They are, they are just included indirectly via the tables. That's what this region is for: https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/namedintrinsiclist.h#L140-L164

We basically just have 6 categories within the list:

  • NI_SYSTEM_MATH
  • NI_HW_INTRINSIC
  • NI_SIMD_AS_HWINTRINSIC
  • NI_SRCS_UNSAFE
  • NI_PRIMITIVE
  • general intrinsics not in another list

Each of the first 5 categories are just groups of intrinsics that generally get handled together via some central function for that group.

So the ConvertToInt64 for Vector<T> is handled by NI_SIMD_AS_HWINTRINSIC and won't hit this path.


var_types tgtType = JitType2PreciseVarType(sig->retType);
retType = genActualType(retType);
bool uns = varTypeIsUnsigned(tgtType) && !varTypeIsSmall(tgtType);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why we do not set this for varTypeIsSmall(tgtType)?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That's just how IL importation works for conversions in general (see CEE_CONV in importer.cpp) and we're matching that.

I imagine it has to do with the fact that the "evaluation stack" type is never a small type.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

Rerunning CI one more time before merging. Not expecting any changes

@carlossanlop

Copy link
Copy Markdown
Contributor

We need this change included in the Preview4 snap and the merge-on-green restriction is blocking us because a couple of failures are not getting linked to KnownBuildError issues as expected. @tannergooding has confirmed the failures are all unrelated, so I will bypass the requirements and merge it.

cc @JulieLeeMSFT

@carlossanlop
carlossanlop merged commit f55c5a8 into dotnet:mainApr 24, 2024
@tannergooding
tannergooding deleted the convert-unsafe branch April 24, 2024 01:17
matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
michaelgsharp pushed a commit to michaelgsharp/runtime that referenced this pull request May 9, 2024
* Expose the ConvertToIntegerNative APIs for the floating-point types
* Accelerate the ConvertToInteger and related APIs
* Applying formatting patch
* Fixing some tests for x86 and skipping some tests on Mono
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 24, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update the runtime to have deterministic floating-point to integer conversions

5 participants

@tannergooding@JulieLeeMSFT@carlossanlop@kunalspathak@DeepakRajendrakumaran