在学习过程中,我开始尝试使用AVX指令,并编写了一个简单的数组乘法,只是为了使事情变得非常基础。第一个问题是xmm0和xmm1的填充,因为nasm不接受XMMWORD作为大小(yasm接受它,但是由于它不再开发,所以我不喜欢使用它),我不得不分2个64位步骤进行填充。我发现this thread显示了使用MOVQ和PINSRQ的最适合我的解决方案。(某种)有效的代码是:
section .data
array1: dd 1.0, 2.0, 3.0, 4.0 ; Declares 2 arrays of 16 bytes
array2: dd 2.0, 3.0, 4.0, 5.0
section .text
global _start
_start:
mov r8, qword array1 ; Stores the address of the 1st element
mov r9, qword array2 ; of each array in the registers
movq xmm0, r8 ; Populates the first half of xmm0
pinsrq xmm0, r8, 1 ; Populates the second half
movq xmm1, r9 ; The same for xmm1
pinsrq xmm1, r9, 1
vmulps xmm0, xmm1 ; Multiplies the arrays and save in xmm0
xor ebx, ebx
mov rax, 1
int 80h
但是在找到此解决方案之前,我尝试了:
vmovlps xmm0, qword [r8]
vmovhps xmm0, qword [r8 + 8]
这些应填充xmm0寄存器的低位,然后填充高位,但是程序在第一个vmov中崩溃。那么,你们能解释为什么这对mov不起作用,而movq / pinsrq对可以正常工作吗?如果在此简单过程中有任何可以改进的地方,请随时提出建议。
=========编辑,更新=========>
并且只是尝试将结果放回内存,以便rdi指向xmm0中保存的4个32bit值中的第一个,以防万一我想返回rdi,这会汇编但输出(由C ++程序打印)是垃圾,因此显然是不正确的方法:
vmulps xmm0, xmm1 ; Multiplies the arrays and save in xmm0
vmovdqa [rdi], xmm0 ; Assembles and doesn't crash, but no meaningful result
在学习过程中,我开始尝试使用AVX指令,并编写了一个简单的数组乘法,只是为了使事情变得非常基础。第一个问题是xmm0和xmm1的数量,...
[我只是想在阅读更多文档并且不做困难的工作后,发布有效的代码: