nwe*_*hof 4 sse simd cpu-registers
将整数SSE寄存器中的较高或较低64位移动到另一个寄存器的最快方法是什么?使用SSE 4.1,可以使用单个pblendw指令(_mm_blend_epi16)完成.但是旧的SSE版本呢?转移和拆包?AND和OR?movsd尽管有旁路延迟?
密切相关的问题:最好的方式来洗牌两个__m128i的64位部分
要将低64位从src移到dst,保留dst的高64位:
movsd dst, src
Run Code Online (Sandbox Code Playgroud)
要将高64位从src移到dst,保留dst的低64位:
shufps dst, src, E4h
Run Code Online (Sandbox Code Playgroud)
绕过延迟通常只会增加延迟,而不是调度或执行或退出资源,因此在比较其他等效序列时通常只是一个问题(即如果有一个单指令等效保留在整数域中,您更愿意使用它用于整数运算).
Agner Fog的优化装配指南提供了一套很好的各种数据移动指令表.(第13.3条).
要将两个注册表中的数据合并为一个,您的选项包括:
MOVLHPS # SSE. Low qword unchanged, high qword from low of source
MOVHLPS # SSE. Low qword from high of source, high qword unchanged
MOVSD # SSE2. Low qword from source (register only), high qword unchanged
# memory-source-only insns:
MOVLPS/D # SSE1/2. Low qword from memory, high qword unchanged
MOVHPS/D # SSE1/2. High qword from memory, low qword unchanged
SHUFPD # SSE2. Low qword from any position of destination. high qword from any position of source
PUNPCKLQDQ # SSE2. Low qword unchanged, high qword from low of source
PUNPCKHQDQ # SSE2. Low qword from high of destination, high qword from high of source
MOVQ # SSE2. Low qword from source, high qword set to zero
PBLENDW # SSE4.1
PINSRQ # SSE4.1 (only takes the low64 of src)
Run Code Online (Sandbox Code Playgroud)
描述复制/粘贴在Agner Fog的桌子上,他拥有版权.
所以shufpd看起来你最喜欢从另一个reg插入high64.其他选项要求它在src的low64中(for punpcklqdq或movlhps).
| 归档时间: |
|
| 查看次数: |
1546 次 |
| 最近记录: |