c语言替换avx指令集,普及一下,关于SB的AVX指令集
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指令集相关推荐
- 断言工具的编写_编写干净的测试–用特定领域的语言替换断言
断言工具的编写 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义也适用于 ...
- 编写干净的测试–用特定领域的语言替换断言
很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 干净的代码易于阅读. 这可能会让您感到有些惊讶,但是我认为该定义也适用于测试代码. 使 ...
- c语言替换字符串中的子串
c语言替换字符串中的子串 #include #include int checkStr(char *s1, char *s2) //匹配字符串相不相等 { for (int i = 0; i & ...
- 哪些服务器支持avx指令,至强E3特性:AVX指令集功能强大
至强E3特性:AVX指令集功能强大 对于Sandy Bridge处理器而言,另一个最改进是增加了全新的AVX指令集,即高级矢量扩展.这个指令集的增加是X86处理器中的重要内容,不仅仅是提供了更为良好的 ...
- c语言 替换字符串中的子串,字符串中的子串替换
在很多编程语言中,都封装了字符串替换的操作,那么我们这里自己用C语言来实现一个字符串替换的函数.具体需求为:Replace(String S,String T,String V),用V替换主串S中出现 ...
- AVX application for Linux | Linux中使用AVX指令集编程踩坑
背景:学习使用SIMD AVX指令集,已经完成了一份代码,在Windows中能正常运行,想迁移到Linux中,结果却出现两个问题,最终逐渐排坑至可以正常运行. 环境:windows 10, ubunt ...
- swift语言java_用Swift语言替换#ifdef
回答(15) 2 years ago Swift编译器不包含预处理器 . 相反,它利用编译时属性,构建配置和语言功能来实现相同的功能 . 因此,预处理程序指令不会在Swift中导入 . 我已经通过使用 ...
- c语言文件替换字符串,C语言替换字符串
#include #include #include /** * * @author: cnscn@163.com * @reference: lovesnow1314@http://communit ...
- R语言替换某一列中某个特定数值
我想把Gender列中的F替换成W: data2$Gender[which(data2$Gender =='F')] <- 'W'
最新文章
- qtcreator cannot find -lts
- PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本
- 087_html5表单元素
- java类获取声明,获取用于MethodInvocation的实际类而不是声明类 - java
- Winform中设置ZedGraph的X轴的刻度根据曲线获取
- nfs上安装oracle,使用NFS安装oracle软件
- Spring Cloud Alibaba迁移指南(三):极简的 Config
- java图片转换为数据流_OpenCV 读取数据流图片
- Web服务器处理连接请求的四种架构方式
- Sybase Adaptive Server Anywhere ISQL 8.0 绿色汉化版发布
- 淘宝天猫获取商品类目信息api接口数据获取
- IVS-163/167雷达距离测量的误差处理
- 应用安全设计规范--模板
- Hibernate事务与并发问题处理(乐观锁与悲观锁)【转】
- RAID磁盘阵列与配置(详细)
- matlab离散系统的频率响应,离散系统频率响应和零极点分布实验报告
- 解决POI事件驱动模式读取不到Java代码创建的Excel表格数据问题
- 【Multisim仿真】全波整流电路仿真
- css 汉堡菜单_使用CSS构建变形汉堡包菜单
- 移动开发者必须了解的55个APP运营推广工具!
热门文章
- 2021年中国聚氯乙烯(PVC)行业市场现状分析:产量进一步扩大,出口数量大幅增加,价格高位运行[图]
- 部标808协议 java_基于部标JT/T 808协议及数据格式的GPS服务器 开发
- TMP75和TMP175 //LM92(温度传感器) datasheet翻译
- Windows10下VS2015下载安装详解【附“安装包丢失或损坏“ 错误解决方法】
- 如何修改el-popper或el-tooltip提示框箭头样式
- C语言:函数指针与指针函数
- memset and ZeroMemory
- 加入学校计算机竞赛班申请书,大学加入部门申请书
- 推介几款 windows 下非常好用的工具
- 排序不等式 AcWing 913. 排队打水