飞腾CPU体系结构之字节序
字节序
描述数值在内存中的每一个字节排列顺序。
举例说明,以一个32位4字节为例,数值0x1234_5678的小端字节序和大端字节序描述如下:
1. 小端字节序
字节 | 3 | 2 | 1 | 0 |
0x12 | 0x34 | 0x56 | 0x78 |
2. 大端字节序
字节 | 3 | 2 | 1 | 0 |
0x78 | 0x56 | 0x34 | 0x12 |
需要注意的是:
- 字节序仅仅描述字节之间的位置关系,并不描述字节内部位序关系。
- 对于一个特定的CPU体系结构,位序和字节序保持一致。
大端字节序主要是Power体系结构和网络传输设备。那么小端字节序的CPU和网络之间的进行数据转换时,需进行字节序转换。
飞腾CPU上的字节序
飞腾CPU支持小端字节序。
飞腾CPU上的字节转换指令
飞腾CPU提供五种字节转换指令,具体操作如下
REV <Wd>, <Wn>
REV <Xd>, <Xn> // REV64 <Xd>, <Xn> 这两条指令是一样的
REV16 <Wd>, <Wn>
REV16 <Xd>, <Xn>
REV32 <Xd>, <Xn>
下面我们用一个32位0x12345678和一个64位0x01234567_89abcdef来介绍上面五种操作的效果。
1. REV <Wd>, <Wn>
字节 | 3 | 2 | 1 | 0 |
操作前 | 0x12 | 0x34 | 0x56 | 0x78 |
操作后 | 0x78 | 0x56 | 0x34 | 0x12 |
2. REV <Xd>, <Xn>
字节 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
操作前 | 0x01 | 0x23 | 0x45 | 0x67 | 0x89 | 0xab | 0xcd | 0xef |
操作后 | 0xef | 0xcd | 0xab | 0x89 | 0x67 | 0x45 | 0x23 | 0x01 |
3. REV16 <Wd>, <Wn>
字节 | 3 | 2 | 1 | 0 |
操作前 | 0x12 | 0x34 | 0x56 | 0x78 |
操作后 |
0x34 | 0x12 | 0x78 | 0x56 |
4. REV16 <Xd>, <Xn>
字节 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
操作前 | 0x01 | 0x23 | 0x45 | 0x67 | 0x89 | 0xab | 0xcd | 0xef |
操作后 | 0x23 | 0x01 | 0x67 | 0x45 | 0xab | 0x89 | 0xef | 0xcd |
5. REV32 <Xd>, <Xn>
字节 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
操作前 | 0x01 | 0x23 | 0x45 | 0x67 | 0x89 | 0xab | 0xcd | 0xef |
操作后 | 0x67 | 0x45 | 0x23 | 0x01 | 0xef | 0xcd | 0xab | 0x89 |
基于上述指令可以实现字节转换的C语言函数为
inline __attribute_const__ __u32 __arch_swab16(__u16 x)
{__asm__("rev16 %w0, %w1" : "=r" (x) : "r" (x));return x;
}inline __attribute_const__ __u32 __arch_swab32(__u32 x)
{__asm__("rev %w0, %w1" : "=r" (x) : "r" (x));return x;
}inline __attribute_const__ __u64 __arch_swab64(__u64 x)
{__asm__("rev %x0, %x1" : "=r" (x) : "r" (x));return x;
}
inline __attribute_const__ __u32 __arch_swahw32(__u32 x)
{__asm__ __volatile__ ("rev32 %x0, %x1\nrev16 %x0, %x0" : "=r" (x) : "r" (x));return x;
}
inline __attribute_const__ __u32 __arch_swahb32(__u32 x)
{__asm__("rev16 %w0, %w1" : "=r" (x) : "r" (x));return x;
}
上述函数的具体意义与下面宏分别对应
#define ___constant_swab16(x) ((__u16)( \(((__u16)(x) & (__u16)0x00ffU) << 8) | \(((__u16)(x) & (__u16)0xff00U) >> 8)))#define ___constant_swab32(x) ((__u32)( \(((__u32)(x) & (__u32)0x000000ffUL) << 24) | \(((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \(((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \(((__u32)(x) & (__u32)0xff000000UL) >> 24)))#define ___constant_swab64(x) ((__u64)( \(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \(((__u64)(x) & (__u64)0x00000000ff000000ULL) << 8) | \(((__u64)(x) & (__u64)0x000000ff00000000ULL) >> 8) | \(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56)))#define ___constant_swahw32(x) ((__u32)( \(((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \(((__u32)(x) & (__u32)0xffff0000UL) >> 16)))#define ___constant_swahb32(x) ((__u32)( \(((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \(((__u32)(x) & (__u32)0xff00ff00UL) >> 8)))
飞腾CPU体系结构之字节序相关推荐
- 飞腾CPU体系结构简单介绍(一)
第一章 飞腾CPU体系结构简介 ARM体系结构是一种精简指令集体系结构RISC,具有以下基本特点:通用寄存器数量较多:采用统一寻址模式,系统主存和外设分布在CPU物理地址空间的不同范围:采用load/ ...
- 飞腾CPU体系结构(十)
飞腾CPU体系结构(十) 1.高速缓存模型 为了优化整体性能,飞腾CPU芯片内部提供L1高速缓存和L2高速缓存,有些飞腾CPU也提供芯片内部的L3高速缓存,本节不对这个情况进行赘述. 靠近流水线的高速 ...
- 飞腾CPU体系结构(十二)
飞腾CPU体系结构(十二) 1. CPU物理地址空间 飞腾CPU支持的物理地址宽度为44位,物理地址空间实际上只有16TB.系统主存(芯片外部内存)和IO外设(例如SoC设备.PCIe设备)都在这个物 ...
- 飞腾CPU体系结构(十一)
飞腾CPU体系结构(十一) 1. 预取机制 飞腾CPU为了提升性能,支持从外部内存中预取数据到L1或L2缓存中.如果某个缓存块内容不在L1/L2缓存中,当该缓存块的某个地址单元被第一访问时,就会遇到内 ...
- 飞腾CPU体系结构(九)
飞腾CPU体系结构(九) 向量访存指令主要包括LD1/ST1. LD2/ST2.LD3/ST3和LD4/ST4四种. LD1/ST1一般针对一个向量寄存器,也有两个.三个或四个向量寄存器的模式. LD ...
- 飞腾CPU体系结构(八)
飞腾CPU体系结构(八)--标量访存指令 在阅读之前,请先查看<飞腾CPU体系结构(五)>的SIMD和浮点寄存器.飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄 ...
- 飞腾CPU体系结构之虚拟地址
飞腾CPU体系结构之虚拟地址 1. 基本概念 虚拟地址:程序运行时指令和数据对应的地址. 虚拟地址空间:一个进程运行时指令和数据能访问到的虚拟地址范围. 注意事项: 每个进程拥有自己的虚拟地址空间,进 ...
- 飞腾CPU体系结构之低功耗指令
飞腾CPU体系结构之低功耗指令 WFE和WFI指令 当飞腾CPU核执行两类指令:WFE或WFI之后,CPU核会进入低功耗状态: 一旦CPU核进入低功耗状态,就要一直保持低功耗状态直到相应的唤醒事件发生 ...
- 飞腾CPU体系结构(十四)
飞腾CPU体系结构(十四) 1. MMU原理 MMU的大致工作原理是: 64位虚拟地址首先分成虚拟页帧号和页内偏移量两部分,虚拟页帧号即页表项索引:根据页表项索引,在进程的页表里查找到对应页表项,然后 ...
最新文章
- 安装ie9提示未能完成安装_IE9浏览器无法安装怎么办?如何解决?
- CVPR 2019 | 腾讯AI Lab解读六大前沿方向及33篇入选论文
- antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...
- Memcached简介
- log4j的相关jar包总结
- java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...
- 用计算机来控制飞船在太空中运行,神舟飞船在太空中靠什么动力运行
- DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
- Monkey 命令 基本参数介绍
- 系统分析师成长之路 转
- 数字图像入门 色彩的抖动
- mac 文档 只读修改
- 为什么不能睁一只眼闭一只眼_“睁一只眼,闭一只眼”才是人生的最高境界
- OpenJ_Bailian - 3468
- SaltStack数据系统
- fastlane 上传到蒲公英和Fir 配置
- 一不小心把此电脑删了,如何把此电脑添加到桌面?
- Excel如何打开两个独立窗口
- 光纤网卡和HBA卡有什么区别
- 规模化交付OpenStack和Kubernetes,Airship成为顶级OSF项目