您的位置:首页 > 其它

MMX指令集系列之二----移位运算和乘法指令

2013-04-23 12:22 253 查看

4. 数据移位指令

4.1 16位并行左移指令

psllw MM,MM/m64

psllw MM,imm8

把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失.

低字移出的位不会移入高字.

例:

当MM0 = 0xffff ffff ffff ffff, 执行psllw MM0,1

则MM0 = 0xfffe fffe fffe fffe

4.2 16位并行逻辑右移指令

psrlw MM,MM/m64


psrlw MM,imm8


把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.

高字移出的位不会移入低字.

例:

当MM0 = 0xffff ffff ffff ffff, 执行psrlw MM0,1

则MM0 = 0x7fff 7fff 7fff 7fff

4.3 32位并行左移指令

pslld MM,MM/m64


pslld MM,MM imm8


把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失.

低双字移出的位不会移入高双字.

例:

当MM0 = 0xffffffff ffffffff, 执行 pslld MM0,1

则MM0 = 0xfffffffe fffffffe

4.4 32位并行逻辑右移指令

psrld MM,MM/m64

psrld MM,imm8



把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.

高双字移出的位不会移入低双字.

例:

当 MM0 = 0xffffffff ffffffff, 执行psrld MM0,1

则 MM0 = 0x7fffffff 7fffffff



4.5 64位数据逻辑左移和逻辑右移

psllq MM,imm8


[b]psrlq MM,imm8[/b]



[b]4.6 16位并行算术右移和32位并行算术右移[/b]

psraw MM,imm8

psrad MM,imm8

5. 乘法指令

pmullw MM,MM/m64

并行16位按字相乘, 取结果低16位, 放入目的寄存器的对应字.

例:

当 MM0 == 0x0000 0000 0002 acfe

MM1 == 0x0000 0000 0009 cef3, 执行 pmullw,

则MM0 = 0x0000 0000 0012 991a

2 * 9 = 18,18 = 0000 0012h,取低16位 0012 为结果.

0x0acfe == -21250,0xcef3 == -12557,-21250*-12557 = 266836250 = 0x 0fe7 991a,取低16位 991a 为结果.

pmulhw MM,MM/m64

并行16位按字相乘, 取结果高16位, 放入目的寄存器的对应字.

例:

当MM0 == 0x0000 0000 0002 acfe

MM1 == 0x0000 0000 0009 cef3, 执行 pmulhw,

则MM0 = 0x0000 0000 0000 0fe7

2 * 9 = 18,18 = 0000 0012h,取高16位 0000 为结果.

0x0acfe == -21250,0xcef3 == -12557,-21250*-12557 = 266836250 = 0x 0fe7 991a,取高16位 0fe7 为结果.

 pmaddwd MM,MM/m64

 按字对齐有符号向量点乘.

  高32位 | 低32位

 目的寄存器:     a0| a1 | a2 | a3

 源寄存器:     b0| b1 | b2 | b3

 目的寄存器结果: a0*b0+a1*b1 | a2*b2+a3*b3



小结:

1. 移位指令按照16位或32位进行并行移位.也可以直接操作整个64位数。

2. 右移指令分为逻辑右移和算术右移。左移指令没有算术左移一说。

3. 只有三种乘法指令,并行乘法的数据单位都是16位有符号数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: