You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求最快实现YMMWORD中奇数索引DWORD与偶数索引DWORD相乘的方法

YMMWORD中奇偶索引DWORD相乘的最优实现

要快速完成YMM寄存器内奇数索引DWORD与对应偶数索引DWORD的相乘(即d0*d1、d2*d3、d4*d5、d6*d7),可以利用vpshufd进行向量重排,配合vpmulld批量乘法,用最少指令实现目标。以下是64位MASM代码:

; 输入:YMM0 = [d0, d1, d2, d3, d4, d5, d6, d7](d0为最低地址DWORD,对应索引0)
; 输出:YMM0低128位 = [d0*d1, d2*d3, d4*d5, d6*d7],高128位可忽略
multiply_odd_even_dwords proc
    ; 提取奇数索引DWORD到YMM1:[d1, d3, d1, d3, d5, d7, d5, d7]
    vpshufd ymm1, ymm0, 03010301h
    ; 提取偶数索引DWORD到YMM2:[d0, d2, d0, d2, d4, d6, d4, d6]
    vpshufd ymm2, ymm0, 02000200h
    ; 对应位置批量相乘,得到重复的四组乘积
    vpmulld ymm0, ymm2, ymm1
    ; 整理结果:将高128位的有效乘积移到低128位后半段,实现连续排列
    vpshufd ymm0, ymm0, 0EE44h
    ret
multiply_odd_even_dwords endp

指令说明

  1. vpshufd ymm1, ymm0, 03010301h:将YMM0拆分为两个128位子部分,分别提取奇数索引的DWORD(低128位取全局索引1、3,高128位取全局索引5、7)。
  2. vpshufd ymm2, ymm0, 02000200h:同理提取偶数索引的DWORD(全局索引0、2、4、6)。
  3. vpmulld ymm0, ymm2, ymm1:对两个向量的对应DWORD执行带符号整数乘法,得到四组重复的目标乘积。
  4. vpshufd ymm0, ymm0, 0EE44h:将高128位的d4*d5、d6*d7移到低128位的后两个位置,让四个乘积连续排列在低128位。

如果不需要结果连续排列(可接受重复的乘积),可以省略最后一条vpshufd,仅用3条指令即可完成,这是理论上的最少指令数方案。

内容的提问来源于stack exchange,提问作者user31862328

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 15:05:09