[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono
, '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

[mono][jit] Fuse SIMD extract and insert on arm64 - #92714

Merged
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext
Oct 4, 2023
Merged

[mono][jit] Fuse SIMD extract and insert on arm64#92714
jandupej merged 6 commits into
dotnet:mainfrom
jandupej:arm64-fused-ins-ext

Conversation

@jandupej

Copy link
Copy Markdown
Contributor

Arm64 has the ins instruction which is capable of inserting from a specific lane into another lane. This PR takes advantage of this and fuses constant extract with constant insert (or elementwise constructor). Only float and double vectors are affected, as the appropriate mono operations for int types are missing. This change affects only mini, not LLVM.

This code:

privatestaticVector128<float>DUT1(Vector128<float>x){returnVector128.Create(Vector128.GetElement(x,1),Vector128.GetElement(x,2),Vector128.GetElement(x,3),Vector128.GetElement(x,0));}

Would compile into:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c ldr q0, [x29, #0x20]
0000000000000010 dup.4s v4, v0[1]
0000000000000014 dup.4s v3, v0[2]
0000000000000018 dup.4s v2, v0[3]
000000000000001c dup.4s v1, v0[0]
0000000000000020 eor.16b v0, v0, v0
0000000000000024 mov.s v0[0], v4[0]
0000000000000028 mov.s v0[1], v3[0]
000000000000002c mov.s v0[2], v2[0]
0000000000000030 mov.s v0[3], v1[0]
0000000000000034 str q0, [x29, #0x10]
0000000000000038 ldp x0, x1, [x29, #0x10]
000000000000003c mov sp, x29
0000000000000040 ldp x29, x30, [sp], #0x30
0000000000000044 ret

Current codegen is:

0000000000000000 stp x29, x30, [sp, #-0x30]!
0000000000000004 mov x29, sp
0000000000000008 stp x0, x1, [x29, #0x20]
000000000000000c eor.16b v0, v0, v0
0000000000000010 ldr q1, [x29, #0x20]
0000000000000014 mov.s v0[0], v1[1]
0000000000000018 mov.s v0[1], v1[2]
000000000000001c mov.s v0[2], v1[3]
0000000000000020 mov.s v0[3], v1[0]
0000000000000024 str q0, [x29, #0x10]
0000000000000028 ldp x0, x1, [x29, #0x10]
000000000000002c mov sp, x29
0000000000000030 ldp x29, x30, [sp], #0x30
0000000000000034 ret

Addresses #85166.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c
@SamMonoRT

Copy link
Copy Markdown
Member

/azp run

@azure-pipelines

Copy link
Copy Markdown
You have several pipelines (over 10) configured to build pull requests in this repository. Specify which pipelines you would like to run by using /azp run [pipelines] command. You can specify multiple pipelines using a comma separated list.

Comment threadsrc/mono/mono/mini/simd-intrinsics.c Outdated

@fanyang-monofanyang-mono left a comment

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.

LGTM!

@jandupej

Copy link
Copy Markdown
ContributorAuthor

CI failures seem unrelated. Merging.

@jandupej
jandupej merged commit 6486250 into dotnet:mainOct 4, 2023
@jandupej
jandupej deleted the arm64-fused-ins-ext branch October 4, 2023 12:49
@ghostghost locked as resolved and limited conversation to collaborators Nov 3, 2023
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.

[mono] Fuse Vector128.WithElement and Vector128.GetElement on arm64

3 participants

@jandupej@SamMonoRT@fanyang-mono