Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol
, '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

Mark and expose additional Vector functions as Intrinsic - #77562

Merged
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593
Nov 2, 2022
Merged

Mark and expose additional Vector functions as Intrinsic#77562
tannergooding merged 13 commits into
dotnet:mainfrom
tannergooding:fix-76593

Conversation

@tannergooding

Copy link
Copy Markdown
Member

This resolves#76593

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI new-api-needs-documentation labels Oct 27, 2022
@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, to 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.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

This resolves #76593

Author:tannergooding
Assignees:-
Labels:

area-CodeGen-coreclr, new-api-needs-documentation

Milestone:-

@build-analysisbuild-analysisBot mentioned this pull request Oct 27, 2022
2 tasks
/// <exception cref="NotSupportedException">The type of <paramref name="value" /> (<typeparamref name="T" />) is not supported.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static Vector256<T> CreateScalar<T>(T value)
public static Vector256<T> CreateScalar<T>(T value)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Could we change this to

[MethodImpl(MethodImplOptions.AggressiveInlining)]publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct{if(Avx.IsSupported){returnVector128.CreateScalar(value).ToVector256Unsafe();}returnVector128.CreateScalar(value).ToVector256();}

I end up not using this method a lot of times because it currently emits an extra vmovaps to clear the upper lane after the scalar move, even though the scalar move will have already zeroed the upper lane with VEX encoding.

The extra vmovaps should get no-op'ed by the CPU front-end anyway, but this is a common need, so smaller codegen would be better.

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.

I'm going to update this to be a proper intrinsic in a follow up PR.

@tannergooding
tannergooding marked this pull request as ready for review October 31, 2022 16:02
@tannergooding

Copy link
Copy Markdown
MemberAuthor

CC. @dotnet/jit-contrib for the runtime side tweaks

case GT_RSH:
case GT_RSZ:
{
assert(!varTypeIsFloating(simdBaseType));

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 see that Vector*<T> is going to support shifting so it makes sense that the restriction is lifted, then you normalize the base type.


if ((simdSize != 32) || compExactlyDependsOn(InstructionSet_AVX2))
{
genTreeOps op = varTypeIsUnsigned(simdBaseType) ? GT_RSZ : GT_RSH;

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.

If the base type is unsigned, is op_RightShift basically going to be the same thing as op_UnsignedRightShift?

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.

Correct, that's how op_RightShift is expected to behave for unsigned types

@TIHanTIHan 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 side of things look good to me.

@tannergooding

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-coreclr jitstress-isas-x86, runtime-coreclr jitstress-isas-arm, runtime-coreclr outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 3 pipeline(s).

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMInew-api-needs-documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vector64/128/256/512<T> and Vector<T> Consistency/Enhancements

3 participants

@tannergooding@TIHan@saucecontrol