') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); chacha20: AVX2 detection by tarcieri · Pull Request #200 · RustCrypto/stream-ciphers · GitHub
Skip to content

chacha20: AVX2 detection - #200

Merged
tarcieri merged 1 commit into
masterfrom
chacha20/avx2-detection
Dec 10, 2020
Merged

chacha20: AVX2 detection#200
tarcieri merged 1 commit into
masterfrom
chacha20/avx2-detection

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Automatically detects the availability of AVX2 on x86(_64) architectures based on CPUID, and falls back to the SSE2" backend if unavailable.

@tarcieri
tarcieriforce-pushed the chacha20/avx2-detection branch from c8a52b7 to 94a31e2CompareDecember 10, 2020 17:42

@newpavlovnewpavlov 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.

I don't think this code is correct. You can not assume that SSE2 is available without checking it either via cfgs or via runtime detection. It should be quite easy to add a second token which would check SSE2 feature and will use the software fallback if it's not available for some reason. For most builds it will be replaced by true, so compiler should remove the fallback code for them. Ideally we would use "CPUID match", but it's not implemented yet, so we have no choice for now.

@tarcieri
tarcieriforce-pushed the chacha20/avx2-detection branch from 94a31e2 to 1767c76CompareDecember 10, 2020 17:57
@tarcieri

tarcieri commented Dec 10, 2020

Copy link
Copy Markdown
MemberAuthor

@newpavlov I'm trying to find a reference for it, but I believe the sse2 target feature is enabled-by-default on x86(_64) targets.

Otherwise I suppose I can gate on it.

Edit: added explicit target_feature gating in 220e346

@tarcieri
tarcieriforce-pushed the chacha20/avx2-detection branch from 1767c76 to 220e346CompareDecember 10, 2020 18:00
@newpavlov

newpavlov commented Dec 10, 2020

Copy link
Copy Markdown
Member

Yes, it is, thus my comment about second token being replaced by true at compile time for most builds. But nothing prevents users from using target-feature=-sse2.

UPD: Yeah, adding the sse2 gating is another approach, though I prefer the two-token one. But it does not have to be added in this PR. I may add it later.

@tarcieri

tarcieri commented Dec 10, 2020

Copy link
Copy Markdown
MemberAuthor

It should be quite easy to add a second token which would check SSE2 feature and will use the software fallback if it's not available for some reason.

Under what conditions would that target feature be absent, short of someone explicitly going out of their way to make it happen?

I added explicit target feature gating which handles this case the same way force-soft would. That seems like a much simpler solution.

@tarcieri
tarcieriforce-pushed the chacha20/avx2-detection branch 3 times, most recently from bb8544d to 9566953CompareDecember 10, 2020 18:13
Automatically detects the availability of AVX2 on x86(_64) architectures
based on CPUID, and falls back to the SSE2" backend if unavailable.
@tarcieri
tarcieriforce-pushed the chacha20/avx2-detection branch from 9566953 to 2b1ab7aCompareDecember 10, 2020 18:16
@tarcieri
tarcieri merged commit 3ce69d1 into masterDec 10, 2020
@tarcieri
tarcieri deleted the chacha20/avx2-detection branch December 10, 2020 18:20
@tarcieritarcieri mentioned this pull request Apr 29, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tarcieri@newpavlov