求一份SSE指令的说明文档.
解决方案 »
- 有经验的人进来看看吧,有人注意到这个问题吗?
- 关于数据库的问题
- 在打印主从报表时,只打印主表中的一条记录所相关的所有从表的信息
- 我的dbgird表中序号排列是1.10.11··2.20.21.22.23··3.30.31,我想让它排成1.2.3.4.5.6按大小,怎么搞!!谢谢了
- 怎样生成Delphi语言的webservice代理类
- 小问题,在线等待,请帮忙
- 请问当拖动标题栏是的事件怎么处理
- sql server2000 很简单的问题 ??
- 难道真的没有人知道吗?109分哟!
- 我是弱智,帮忙看一下这个问题。
- 急,执行一个存储过程时,老是提示:已超过了锁请求超时时段!有代码
- 关于在delphi中对sql执行update的问题。急急急
大部分涉及到128位内存变量操作的,内存变量首地址必须要对齐16字节,也就是内存地址低4位为0,否则会引起CPU异常,导致指令执行失败,此错误编译器不检查.
SSE1:
主要是单精度浮点运算
SSE有8个128位独立寄存器(XMM1~XMM7).
MM指64位MMX寄存器
XMM指XMM寄存器
m128指128位内存变量
movaps XMM,XMM/m128 movaps XMM/128,XMM
把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节,也就是内存地址低4位为0.
﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋
movups XMM,XMM/m128 movaps XMM/128,XMM
把源存储器内容值送入目的寄存器,但不必对齐内存16字节.
﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋
movlps XMM,m64
把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节.
movhps XMM,m64
把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.
movhlps XMM,XMM
把源寄存器高64位送入目的寄存器低64位,高64位不变.
movlhps XMM,XMM
把源寄存器低64位送入目的寄存器高64位,低64位不变.
movss XMM,m32/XMM
原操作数为m32时:
dest[31-00] <== m32
dest[127-32] <== 0
原操作数为XMM时:
dest[31-00] <== src[31-00]
dest[127-32]不变
movmskpd r32,XMM
r32[0] <== XMM[63]
r32[1] <== XMM[127]
r32[31-2] <== 0
movmskps r32,XMM
r32[0] <== XMM[31]
r32[1] <== XMM[63]
r32[2] <== XMM[95]
r32[3] <== XMM[127]
r32[31-4] <== 0
pmovmskb r32,XMM
r[0] <== XMM[7]
r[1] <== XMM[15]
r[2] <== XMM[23]
r[3] <== XMM[31]
r[4] <== XMM[39]
r[5] <== XMM[47]
r[6] <== XMM[55]
r[7] <== XMM[63]
r[8] <== XMM[71]
r[9] <== XMM[79]
r[10] <== XMM[87]
r[11] <== XMM[95]
r[12] <== XMM[103]
r[13] <== XMM[111]
r[14] <== XMM[119]
r[15] <== XMM[127]
r[31-16] <== 0
movntps m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.
movntpd m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.
movnti m32,r32
m32 <== r32 把32寄存器的值送入m32,不经过cache.
addps XMM,XMM/m128
源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相加,结果送入目的寄存器,内存变量必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addps XMM0,XMM1
则XMM0 = 045992000 44350ccd 4a5b52e0 3c59018e h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2 'xEy'指x * 10^y,如 1.0E2 = 100,1.0E-2 = 0.01,
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4 当中'E'不是16进制中的'e',而是指数'EXP'
结果XMM0 = 4.9E3 7.242E2 3.5934E6 1.3245E-2
addss XMM,XMM/m32
源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相加,结果送入目的寄存器的低32位
高96位不变,内存变量不必对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c517e000 44290000 46b6d000 3c59018e h
subps XMM,XMM/m128
源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相减(目的减去源),结果送入目的寄存器,
内存变量必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c6188000 441cf333 ca5877a0 3c3a0a52 h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = -9.76E3 6.278E2 -3.5466E6 1.1355E-2
subss XMM,XMM/m32
源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相减(目的减去源),
结果送入目的寄存器的低32位,高96位不变,内存变量不必对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c517e000 44290000 46b6d000 3c3a0a52 h
maxps XMM,XMM/m128
源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较大数放入对应目的寄存器,内存变量必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行maxps XMM0,XMM1
则XMM0 = 045e51000 44290000 4a59e540 3c4985f0 h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = 7.33E3 6.76E2 3.57E6 1.23E-2
maxss XMM,XMM/m32
源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较大数放入目的寄存器低32位,高96位不变
内存变量不必对齐内存16字节.
例:
当XMM0 = 045e51000 4240cccd 4a59e540 3a77b9e0 h
XMM1 = 0c517e000 44290000 46b6d000 3c4985f0 h,当执行maxss XMM0,XMM1
则XMM0 = 045e51000 4240cccd 4a59e540 3c4985f0 h
minps XMM,XMM/m128
源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较小数放入对应目的寄存器,内存变量必须对齐内存16字节.
minss XMM,XMM/m32
源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较小数放入目的寄存器低32位,高96位不变
内存变量不必对齐内存16字节.
cmpps XMM0,XMM1,imm8 imm8是立即数范围是0~7
根据imm8的值进行4对单精度浮点数的比较,符合imm8的就置目的寄存器对应的32位全1,否则全0
当imm8 = 0时,目的寄存器等于原寄存器数时,置目的寄存器对应的32位全1,否则全0
imm8 = 1 时,目的寄存器小于原寄存器数时,置目的寄存器对应的32位全1,否则全0
imm8 = 2 时,目的寄存器小于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0
imm8 = 4 时,目的寄存器不等于原寄存器数时,置目的寄存器对应的32位全1,否则全0
imm8 = 5 时,目的寄存器大于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0
imm8 = 6 时,目的寄存器大于原寄存器数时,置目的寄存器对应的32位全1,否则全0
rcpps XMM,XMM/m128
源存储器4个单精度浮点数的倒数放入对应目的寄存器,内存变量必须对齐内存16字节.
注:比如2.0E0的倒数为1÷2.0E0 = 5.0E-1
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rcpps XMM0,XMM1
则XMM0 = 0390f0800 3ca9f800 34966000 44844800 h
因为XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = 1.36E-4 2.075E-2 2.8E-7 1.06E3
这操作只有12bit的精度.
用这种方法可以提高精度到23bit(牛顿-拉弗森方法):
x0 = RCPSS(d)
x1 = x0 * (2 - d * x0) = 2*x0 - d * x0 * x0
x0是直接用倒数指令得到的除数d的倒数的逼近;x1则是更精确的逼近。
以下操作:XMM0=DIVIDENDS / DIVISORS(这种方法比直接用divps更快速)
MOVAPS XMM1,[DIVISORS];载入除数
RCPPS XMM0,XMM1;求得倒数的逼近
MULPS XMM1,XMM0;牛顿-Raphson公式
MULPS XMM1,XMM0
ADDPS XMM0,XMM0
SUBPS XMM0,XMM1
MULPS XMM0,[DIVIDENDS];结果在XMM0中
rcpss XMM,XMM/32
源存储器低32位1个单精度浮点数的倒数放入目的寄存器低32位,高96位不变
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rcpss XMM0,XMM1
则XMM0 = 045e51000 4240cccd 4a59e540 44844800 h
精度同rcpps
rsqrtps XMM,XMM/m128
源存储器4个单精度浮点数的开方的倒数放入对应目的寄存器,内存变量必须对齐内存16字节.
内存到暂存器/暂存器到内存/暂存器之间的资料搬移
标量 – MOVSS
包裹式 – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
数学运算
标量 – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
包裹式 – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
比较
标量 – CMPSS, COMISS, UCOMISS
包裹式 – CMPPS
资料拆包(unpack)与随机搬移(shuffle)
包裹式 – SHUFPS, UNPCKHPS, UNPCKLPS
资料型态转换
标量 – CVTSI2SS, CVTSS2SI, CVTTSS2SI
包裹式 – CVTPI2PS, CVTPS2PI, CVTTPS2PI
逐位逻辑运算
包裹式 – ANDPS, ORPS, XORPS, ANDNPS整数指令:
数学运算
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
资料搬移
PEXTRW, PINSRW
其他
PMOVMSKB, PSHUFW其他指令:
MXCSR 管理
LDMXCSR, STMXCSR
快取与内存管理
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE