相关疑难解决方法(0)

使用ymm寄存器作为"类似内存"的存储位置

考虑x86中的以下循环:

; on entry, rdi has the number of iterations
.top:
; some magic happens here to calculate a result in rax
mov [array + rdi * 8], rax ; store result in output array
dec rdi
jnz .top
Run Code Online (Sandbox Code Playgroud)

它很简单:有些东西计算结果rax(未显示)然后我们将结果存储到数组中,与我们索引时的顺序相反rdi.

我想转换上面的循环而不是对内存进行任何写入(我们可以假设未显示的计算不会写入内存).

只要循环计数rdi有限,我就可以使用ymmregs 提供的充足空间(512字节)来保存值,但实际上这样做似乎很尴尬,因为你不能"索引"任意寄存器.

一种方法是始终将ymm一个元素的整个"数组" 寄存器混洗,然后将元素插入新释放的位置.

像这样的东西:

vpermq  ymm3, ymm3, 10_01_00_11b ; left rotate ymm by qword
vpermq  ymm2, ymm2, 10_01_00_11b ; left rotate ymm by qword
vpermq  ymm1, ymm1, 10_01_00_11b …
Run Code Online (Sandbox Code Playgroud)

x86 assembly sse avx

7
推荐指数
1
解决办法
398
查看次数

标签 统计

assembly ×1

avx ×1

sse ×1

x86 ×1