SSE
SSE这些扩展增强了IA-32处理器的性能,可用于高级2d和3d图形、运动视频、图像处理、语音识别、音频合成、电话和视频会议。
XMM registers
XMM数据寄存器有16个,单个128位,这些寄存器可以使用名称XMM0到XMM15直接访问,它们可以独立于x87 FPU和MMX寄存器和通用寄存器进行访问。
图1-1 XMM寄存器(实际为16个)
MXCSR Control and Status Register
32位MXCSR寄存器包含了Intel SSE、SSE2和SSE3 SIMD浮点操作的控制和状态信息。
图1-2 MXCSR 控制/状态 寄存器
0-5 异常标志位:无效操作,非规范性,零除,向上溢出,向下溢出,精度
6-12 可设置:非规范化,无效操作掩码,非规范化掩码,零除掩码,向上溢出掩码,精度掩码。(如果置位则忽略)
13-14:舍入控制。00:舍入最近的值。01:向负无穷舍入。10:向正无穷舍入。11:向0方向舍入(截断)。
15:归零。如果设置该位,则所有向下溢出条件将寄存器设置为0
SSE指令
访问MXCSR寄存器:
ldmxcsr mem32 ;加载到mxcsr
stmxcsr mem32 ;加载到内存
浮点移动指令:
movss xmmn,mem32
movss mem32,xmmn
movsd xmmn,mem64
movsd mem64,xmmn
movd reg32,xmmn
movd xmmn,reg32
movq reg64,xmmn
movq xmmn,reg64
浮点算术指令:addss,addsd,subss,subsd,mulss,mulsd,divss,divsd,minss,minsd,maxss,maxsd,sqrtss,sqrtsd,rcpss,rsqrtss
浮点数比较:cmpss,cmpsd(结果为全0或全1)
cmpss xmmn,xmmm/mem32,imm8
cmpsd xmmn,xmmm/mem64,imm8;imm8:0-7依次为==,<,<=,无序,不等于,>=,>,有序
浮点数转换:cvtsd2si,cvtsd2ss,cvtsi2sd,cvtsi2ss,cvtss2sd,cvtss2si,cvtsd2si,cvtss2si
代码
main.cpp
#include<iostream>
using namespace std;
extern "C"{
int cmpd(double a,double b);//a*b>a/b
}
int main(){
cout<<cmpd(2.2,4.4)<<endl;
return 0;
}
sse.asm
option casemap:none
.code
public cmpd
cmpd proc
movsd xmm3,xmm0
mulsd xmm0,xmm1
divsd xmm3,xmm1
cmpsd xmm0,xmm3,6
movd eax,xmm0
ret
cmpd endp
end
参考
[美]兰德尔·海德.64位汇编语言的编程艺术
Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4
AMD64 Architecture Programmer’s Manual Volumes 1–5