MOVQ / PINSRQ与VMOV一起填充XMM(一个起作用,另一个不起作用)

问题描述 投票:0回答:1

在学习过程中,我开始尝试使用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的数量,...

assembly x86-64 nasm
1个回答
1
投票

[我只是想在阅读更多文档并且不做困难的工作后,发布有效的代码:

© www.soinside.com 2019 - 2024. All rights reserved.