求最快实现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
指令说明
vpshufd ymm1, ymm0, 03010301h:将YMM0拆分为两个128位子部分,分别提取奇数索引的DWORD(低128位取全局索引1、3,高128位取全局索引5、7)。vpshufd ymm2, ymm0, 02000200h:同理提取偶数索引的DWORD(全局索引0、2、4、6)。vpmulld ymm0, ymm2, ymm1:对两个向量的对应DWORD执行带符号整数乘法,得到四组重复的目标乘积。vpshufd ymm0, ymm0, 0EE44h:将高128位的d4*d5、d6*d7移到低128位的后两个位置,让四个乘积连续排列在低128位。
如果不需要结果连续排列(可接受重复的乘积),可以省略最后一条vpshufd,仅用3条指令即可完成,这是理论上的最少指令数方案。
内容的提问来源于stack exchange,提问作者user31862328
相关产品推荐
相关产品推荐

