Если нагрузка 16byte не будет переходить на другую страницу и неисправности, а затем использовать movups
. Высокие 4 байта будут там, где есть мусор. Причиной промаха в кеше для 4B, о котором вы не заботитесь, может быть проблема, так же как и кэш-линия.
В противном случае используйте movq
/pinsrd
(SSE4.1) или какой-либо другой способ сделать две нагрузки + перетасовку. movq
+ pinsrd
будет иметь 3 процессора с интегрированным доменом на процессорах Intel SnB, потому что pinsrd
не может быть микро-предохранителем. (И для его ALU uop требуется порт для перетасовки (p5)).
Другая возможность: AVX VMASKMOVPS xmm1, xmm2, m128
.
Условно двигается упакованные элементы данных из второго операнда источника в соответствующий элемент данных операнда назначения, в зависимости от маски бит, связанных с каждым элементом данных (MSB 1-го операнда SRC).
... Ошибки не будут происходить за счетом ссылки любой ячейки памяти, если соответствующий бит маски для этой ячейки памяти составляет 0.
Intel Haswell: 3 микрооперации слита-домена (один нагрузка и два перетасовки (P5)). 4c, одна на 2 c пропускную способность.
Это, вероятно, не очень хорошее сравнение, особенно. если окружающий код должен перетасоваться.
Ваш очень-редко принимается условный переход, который использует movups
в любое время он гарантированно не по вине также 3 слит-домен микрооперации на быстрой дорожке, и один из них может работать на port6 (не конкурирующего с векторных ALU вообще). LEA также не находится на критическом пути.
movlpd
безопасен в использовании при любых данных. Он никогда не будет ошибочным или медленным с данными, которые представляют собой NaN с плавающей точкой или что-то в этом роде. Вам нужно только беспокоиться об этом с инструкциями, которые перечислены в руководстве insn ref с непустым «Исключением с плавающей запятой SIMD». например addps
может генерировать исключения «Overflow, Underflow, Invalid, Precision, Denormal», но shufps
говорит «None».
К сожалению, я не контролирую положение или размеры входного , поэтому я не могу разобраться. «movq» и «pinsrd» - это то, что я тоже придумал; спасибо за подтверждение. – jacobsa
Спасибо также за примечание о 'movlpd'. Но тогда мой вопрос: почему он документирован как применимый к значениям с плавающей запятой, в частности? – jacobsa
@jacobsa: Если вы знаете, что есть читаемая память * до * 12B, которую вы хотите, вы можете загрузить с '[addr-4]', а затем сдвинуть ('psrldq'). Или вы можете даже замаскировать адрес, чтобы получить указатель с 16-кратным выравниванием, который покрывает некоторые нужные вам данные (и по-прежнему не может быть неисправным). –