Это то, что _mm_undefined_ps
для (но это только на самом деле помогает коду с компилятором Intel. Другие компиляторы обычно относятся к нему аналогично _mm_setzero_ps
).
И кроме того, вы хотите загрузить movsd
два поплавка, которые нуль расширяют и ломают ложную зависимость от старого значения регистра, а не movlps
, который сливается. (Если вы не строите жесткий старый 32-разрядный процессор с SSE1, но не SSE2, как и PIII, ваш код изначально был написан для.)
Чтобы перейти к double *
и использовать _mm_load_sd
. Вы не разыгрываете это самостоятельно, только через _mm_load_sd
, поэтому я думаю, , это все еще 100-процентное строгое сглаживание. Тем не менее, это работает на современных компиляторах! Если это оказывается небезопасным, _mm_loadl_epi64
(movq
) принимает аргумент __m128i const*
(странно, потому что он загружает только младшие 64 бит, но это тип may_alias, который вы можете определенно использовать безопасно для чтения любого другого типа, например char*
.)
static inline
__m128 stride_gather(float *src) {
__m128 tmp1 = _mm_castpd_ps(_mm_load_sd((const double*)src)); // movsd
tmp1 = _mm_loadh_pi(tmp1, (const __m64*)(src+4)); // movhps
return tmp1;
}
gcc7 и позже использовать movq
вместо movsd
, что странно, но я думаю, что все в порядке. В худшем случае дополнительный цикл задержки задержки байпаса в качестве входа в movhps
для некоторых старых процессоров, но не пропускная способность.
Другие 3 основных компилятора (clang / ICC / MSVC) все компилируют этот к ожидаемому movsd
/ movhps
без ложной зависимости от старого значения xmm0. ( source + asm output в проводнике компилятора Godbolt .)
var x = document.getElementById("navy");
window.addEventListener("scroll", function(){
if(window.pageYOffset >=100){
x.classList.remove("transparent");
x.classList.add("scrolled");
}
else{
x.classList.add("transparent");
x.classList.remove("scrolled");
}
}, false)
Прежде всего, вы хотите, чтобы он был прозрачным, когда вы вернетесь к заголовку, чтобы ваши операторы if else уже были в неправильном порядке.
if(document.body.scrollTop >= 200)
{
x.classList.add("scrolled") //when its >= 200 it means the user is
x.classList.remove("transparent") //scrolling downwards
}
else
{
x.classList.add("transparent") //so I swapped your classes for you
x.classList.remove("scrolled")
}
Во-вторых, document.body.scrollTop - это еще не все, что нужно для проверки позиций прокрутки пользователей, я обнаружил, что использование комбинации из нескольких команд, как в исходном тексте скроллера, работает для меня очень хорошо.
Skrollr.prototype.getScrollTop = function() {
if(_isMobile) {
return _mobileOffset;
} else {
return window.pageYOffset || documentElement.scrollTop || body.scrollTop
|| 0;
}
};
Вот ссылка на github в исходном коде: https://github.com/Prinzhorn/skrollr/blob/b98d40820b9864be275e81af382045d72cc5a08a/src/skrollr.js#L627