第40部分-Linux x86 64位汇编 Intel向量指令历史
SIMD主要是四种技术:
多媒体扩展(MMX, Multimedia Extension)
流化SIMD扩展(SSE,Streaming SIMD Extension)
流化SIMD扩展第二实现(SSE2, Streaming SIMD Extension Second Implementation)
流化SIMD扩展第三年实现(SSE3,Streaming SIMD Extension Third Implement)
SIMD的主要好处是使用单一指令执行并行数据操作的能力。
MMX和SSE架构可以保存打包数据的附加寄存器。
发展历史如下:
MMX
MMX提供3种整数值类型:
- 64位打包字节整数(8个单字节整数值)/64位打包整数(4个字整数值)/64位打包双字整数(2个双字整数值)
MMX整数数据类型需要使用FPU寄存器来保存执行数学操作。MMX寄存器被命名为MM0到MM7。
MMX寄存器直接映射到FPU寄存器。但是不能当做堆栈使用。直接映射到FPU的R0到R7寄存器。
所以,FPU寄存器既用于保存MMX数据,也保存FPU数据,两者容易混乱。
MMX模式下使用这些寄存器处理MMX数据,在FPU模式下使用这些寄存器处理一般的FPU扩展双精度浮点数据。
在MMX模式下使用FPU寄存器时,FPU的标记寄存器会被破坏。最后的办法是将FPU寄存器的指令和MMX寄存器的指令分开。
SSE
SSE主要是对浮点数据执行SIMD操作。新的数据类型:128位打包的单精度浮点数据类型。
SSE2
SSE2扩展了SSE核心架构。
128位打包的双精度浮点值(2个双精度值)
128位打包字节整数值(16个单字节整数值)
128位打包字整数值(8个字整数值)
128位打包双字整数值(4个双字整数值)
128位打包四字整数值(2个四字整数值)
SSE3没有添加新的数据类型,增加了数据高级处理指令。
向量指令支持检测
通过调用cpuid值,将eax寄存器赋值为1.
可以获取处理器签名信息。
使用test指令进行比较判断。
.section .data
gotmmx:
.asciz "Supports MMX"
gotsse:
.asciz "Supports SSE"
gotsse2:
.asciz "Supports SSE2"
gotsse3:
.asciz "Supports SSE3"
output:
.asciz "%s\n"
.section .bss
.lcomm ecxdata, 4
.lcomm edxdata, 4
.section .text
.globl _start
_start:
nop
movl $1, %eax;//CPUID的1号功能
cpuid
movl %ecx, ecxdata
movl %edx, edxdata
test $0x00800000, %edx
jz done
movq $output,%rdi
movq $gotmmx,%rsi
call printf
movl edxdata, %edx
test $0x02000000, %edx
jz done
movq $output,%rdi
movq $gotsse,%rsi
call printf
movl edxdata, %edx
test $0x04000000, %edx
jz done
movq $output,%rdi
movq $gotsse2,%rsi
call printf
movl ecxdata, %ecx
test $0x00000001, %ecx
jz done
movq $output,%rdi
movq $gotsse3,%rsi
call printf
done:
movq $60,%rax
call exit
as -g -o features.o features.s
ld -o features features.o -lc -I /lib64/ld-linux-x86-64.so.2