5、operands 的寻址

AVX 能够支持到 4 个 operands。因此,operands 寻址依靠以下几个域来提供:

* VEX.vvvv:提供对 dest、src1 以及 src2 寄存器操作数的寻址。

* ModRM.reg:也可提供对 dest、src1 以及 src2 寄存器操作数的寻址。

* ModRM.r/m:除了提供对 dest、src1 以及 src2 的寄存器操作数寻址外,还可提供对内存操作数的寻址。

* imme[7:4]:提供对第 4 个寄存器操作数的寻址(也就是 src3 寄存器操作数)

-------------------------------------------------------------------------------------------

所有的 operands 寻址就是依靠这几个域的组合,这 4 个域提供了丰富的组合模式。imme 字节的 bit7 ~ bit4 被用来提供额外的 第 4 个寄存器操作数。

值得注意的是:

在 AVX 指令中寄存器 ID 值都是与原来的寄存器 ID 相反的。

编码            AVX 指令         原来指令

--------------------------------------------------

1111    =>    xmm0/ymm0        xmm15

1110    =>    xmm1/ymm1        xmm14

... ...

0001    =>    xmm14/ymm14       xmm1

0000    =>    xmm15/ymm15       xmm0

----------------------------------------------------------------------------------------

1、以下面指令为例,这是一条全 4 个 operands 的指令。

指令:

vblendvpd ymm1, ymm2, ymm3/m256, ymm4

----------------------------------------------------------

这条指令的描述为:

VEX.NDS.256.66.0F3A 4B /r /is4

2、AVX.vvvv 提供的寻址

这条指令 AVX.vvvv 提供的寻址是 VEX.NDS,也就是 AVX.vvvv 提供 src1 (第 1 个源操作数),即:第 2 个操作数。

上面指令中的 ymm2 由 AVX.vvvv 负责提供。

3、ModRM.reg 提供的寻址

上面指令中的 ymm1 由 ModRM.reg 提供。当 AVX.vvvv 提供 src1 的寻址,dest 的寻址由 ModRM.reg 提供。

4、ModRM.r/m 提供的寻址

上面指令中的 src2 操作数是 ymm3/m256 寻址,它可以是 registers 或者 memory 操作数。因此,它必须由 ModRM.r/m 提供。

5、imme[7:4] 提供的寻址

最后一个操作数 ymm4 必须由 imme[7:4] 提供。

总结:

例1:

vblendvpd    ymm1,  ymm2,  ymm3/m256,  ymm4

-----   ------   ------------  ------

|          |            |              |

+-------+--------+----------+----------->  dest: ModRM.reg(registers)

|           |               |

+--------+----------+----------->  src1: VEX.vvvv(VEX.NDS)

|               |

+----------+----------->  src2:ModRM.r/m(register/memory)

|

+----------->  src3:imme[7:4](registers)

vblendvpd 的操作数是 VEX.NDS (VEX.vvvv 作为第 1 个源操作数),因此 VEX.vvvv 提供 src1 操作数,而 src2 操作数是 ymm3/m256,是一个 registers/memory 类型,因此由 ModRM.r/m 提供。那么 dest 则由 ModRM.reg 提供,最后 1 个操作数则由 imme[7:4] 来提供。

例2:  vpslldq   xmm1,  xmm2,  imm8

------  ------  -----

|         |        |

+------+------+-------------------> dest: VEX.vvvv(VEX.NDD)

|         |

+------+-------------------> src1: ModRM.r/m

|

+------------------>  src2:  imm8(immediate)

vpslldq 指令的操作数表述为 VEX.NDD(VEX.vvvv 作为 dest 操作数),因此 VEX.vvvv 提供 dest 操作数,而 src1 由 ModRM.r/m 提供,是因为 ModRM.reg 要对 vpslldq 指令的 opcode 进行补充定义。ModRM.reg 不提供操作数寻址。

最后一个操作数是个立即数寻址,即 1 byte 的 immediate 。

vpslldq xmm1,xmm2,imm8 的指令描述如下:

* VEX.NDD.128.66.0F 73 /7 ib

-------------------------------------

意即:VEX.vvvv 提供 dest 寻址,属于 VEX.128(VEX.L = 0)128 位操作数,66 是 SIMD prefix,escape prefix 是 0F。

opcode 是 73 ,但是要由 ModRM.reg 来补充定义,也就是 /7 表示:ModRM.reg = 111(/7)。

ib 是最后操作数,它是一个立即数,imme8

例3:  vlddqu  ymm1,   m256

------   ------

|           |

+-------+-----------------> dest: ModRM.reg(registers)

|

+-----------------> src1: ModRM.r/m (memory)

vlddqu 指令的描述是:

* VEX.256.F2.0F F0 /r

---------------------------------

此时,VEX.vvvv 不提供任何操作数的寻址(无 NDS、NDS 以及 DDS),那么 VEX.vvvv 必须为 1111,否则会产生 #UD 异常。

VEX.256 (VEX.L = 1)操作数为 256 位。SIMD prefix 为 F2,escape prefix 为 0F

opcode 为 F0。

这条指令的 dest 则要由 ModRM.reg 来寻址,src 则要由 ModRM.r/m 来寻址。

c语言替换avx指令集,普及一下,关于SB的AVX指令集相关推荐

  1. 断言工具的编写_编写干净的测试–用特定领域的语言替换断言

    断言工具的编写 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义也适用于 ...

  2. 编写干净的测试–用特定领域的语言替换断言

    很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 干净的代码易于阅读. 这可能会让您感到有些惊讶,但是我认为该定义也适用于测试代码. 使 ...

  3. c语言替换字符串中的子串

    c语言替换字符串中的子串 #include #include int checkStr(char *s1, char *s2) //匹配字符串相不相等 {    for (int i = 0; i & ...

  4. 哪些服务器支持avx指令,至强E3特性:AVX指令集功能强大

    至强E3特性:AVX指令集功能强大 对于Sandy Bridge处理器而言,另一个最改进是增加了全新的AVX指令集,即高级矢量扩展.这个指令集的增加是X86处理器中的重要内容,不仅仅是提供了更为良好的 ...

  5. c语言 替换字符串中的子串,字符串中的子串替换

    在很多编程语言中,都封装了字符串替换的操作,那么我们这里自己用C语言来实现一个字符串替换的函数.具体需求为:Replace(String S,String T,String V),用V替换主串S中出现 ...

  6. AVX application for Linux | Linux中使用AVX指令集编程踩坑

    背景:学习使用SIMD AVX指令集,已经完成了一份代码,在Windows中能正常运行,想迁移到Linux中,结果却出现两个问题,最终逐渐排坑至可以正常运行. 环境:windows 10, ubunt ...

  7. swift语言java_用Swift语言替换#ifdef

    回答(15) 2 years ago Swift编译器不包含预处理器 . 相反,它利用编译时属性,构建配置和语言功能来实现相同的功能 . 因此,预处理程序指令不会在Swift中导入 . 我已经通过使用 ...

  8. c语言文件替换字符串,C语言替换字符串

    #include #include #include /** * * @author: cnscn@163.com * @reference: lovesnow1314@http://communit ...

  9. R语言替换某一列中某个特定数值

    我想把Gender列中的F替换成W: data2$Gender[which(data2$Gender =='F')] <- 'W'

最新文章

  1. qtcreator cannot find -lts
  2. PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本
  3. 087_html5表单元素
  4. java类获取声明,获取用于MethodInvocation的实际类而不是声明类 - java
  5. Winform中设置ZedGraph的X轴的刻度根据曲线获取
  6. nfs上安装oracle,使用NFS安装oracle软件
  7. Spring Cloud Alibaba迁移指南(三):极简的 Config
  8. java图片转换为数据流_OpenCV 读取数据流图片
  9. Web服务器处理连接请求的四种架构方式
  10. Sybase Adaptive Server Anywhere ISQL 8.0 绿色汉化版发布
  11. 淘宝天猫获取商品类目信息api接口数据获取
  12. IVS-163/167雷达距离测量的误差处理
  13. 应用安全设计规范--模板
  14. Hibernate事务与并发问题处理(乐观锁与悲观锁)【转】
  15. RAID磁盘阵列与配置(详细)
  16. matlab离散系统的频率响应,离散系统频率响应和零极点分布实验报告
  17. 解决POI事件驱动模式读取不到Java代码创建的Excel表格数据问题
  18. 【Multisim仿真】全波整流电路仿真
  19. css 汉堡菜单_使用CSS构建变形汉堡包菜单
  20. 移动开发者必须了解的55个APP运营推广工具!

热门文章

  1. 2021年中国聚氯乙烯(PVC)行业市场现状分析:产量进一步扩大,出口数量大幅增加,价格高位运行[图]
  2. 部标808协议 java_基于部标JT/T 808协议及数据格式的GPS服务器 开发
  3. TMP75和TMP175 //LM92(温度传感器) datasheet翻译
  4. Windows10下VS2015下载安装详解【附“安装包丢失或损坏“ 错误解决方法】
  5. 如何修改el-popper或el-tooltip提示框箭头样式
  6. C语言:函数指针与指针函数
  7. memset and ZeroMemory
  8. 加入学校计算机竞赛班申请书,大学加入部门申请书
  9. 推介几款 windows 下非常好用的工具
  10. 排序不等式 AcWing 913. 排队打水