汇编 SSE3 指令简介

简介: 相对SSE2指令,引入新的指令,进一步优化优化多媒体处理和并行计算任务。另外,SSE3还改进了缓存管理方面的性能,使得处理器在特定工作负载下能够更高效地运行,主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器操作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的

 x87-FP Integer Conversion
FISTTP

FISTTP m16int
FISTTP m32int
FISTTP m64int

 Store ST(0) in m16int/m32int/m64int with truncation.

将x87 FPU(浮点运算单元)中的ST(0)寄存器中的浮点值转换为16位或32位或64位整数,并将结果存储到内存中。

Specialized 128-bit Unaligned Data Load 专用128位未对齐数据加载
LDDQU

LDDQU xmm1, mem
Load unaligned data from mem and return double quadword in xmm1.

将内存中的非对齐的128位整数值加载到xmm1寄存器中
DEST[127:0] := SRC[127:0]

Floating-Point Packed ADD/SUB Instructions 浮点压缩ADD/SUB指令
ADDSUBPS

ADDSUBPS xmm1, xmm2/m128

Add/subtract single precision floating-point values from xmm2/m128 to xmm1.

对打包的单精度浮点值执行加法和减法操作

DEST[31:0] := DEST[31:0] - SRC[31:0]
DEST[63:32] := DEST[63:32] + SRC[63:32]
DEST[95:64] := DEST[95:64] - SRC[95:64]
DEST[127:96] := DEST[127:96] + SRC[127:96]

ADDSUBPD

ADDSUBPD xmm1, xmm2/m128
Add/subtract double precision floating-point values from xmm2/m128 to xmm1.

对打包的双精度浮点值执行加法和减法操作

DEST[63:0] := DEST[63:0] - SRC[63:0]
DEST[127:64] := DEST[127:64] + SRC[127:64]

Floating-Point Horizontal ADD/SUB  Instructions 浮点水平ADD/SUB指令
HADDPS

HADDPS xmm1, xmm2/m128

        Horizontal add packed single precision floating-point values from xmm2/m128 to xmm1.

用于对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行水平相加操作

DEST[31:0] := SRC1[63:32] + SRC1[31:0]
DEST[63:32] := SRC1[127:96] + SRC1[95:64]
DEST[95:64] := SRC2[63:32] + SRC2[31:0]
DEST[127:96] := SRC2[127:96] + SRC2[95:64]

HSUBPS

HSUBPS xmm1, xmm2/m128
Horizontal subtract packed single precision floating-point values from xmm2/m128 to xmm1.

对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行水平相减操作

DEST[31:0] := SRC1[31:0] - SRC1[63:32]
DEST[63:32] := SRC1[95:64] - SRC1[127:96]
DEST[95:64] := SRC2[31:0] - SRC2[63:32]
DEST[127:96] := SRC2[95:64] - SRC2[127:96]

HADDPD

HADDPD xmm1, xmm2/m128

Horizontal add packed double precision floating-point values from xmm2/m128 to xmm1.

用于对存储在xmm1和xmm2/m128寄存器中的两组两个双精度浮点值进行水平相加操作

DEST[63:0] := SRC1[127:64] + SRC1[63:0]
DEST[127:64] := SRC2[127:64] + SRC2[63:0]

HSUBPD

HSUBPD xmm1, xmm2/m128

 Horizontal subtract packed double precision floating-point values from xmm2/m128 to xmm1.

用于对存储在xmm1和xmm2/m128寄存器中的两组两个双精度浮点值进行水平相减操作

DEST[63:0] := SRC1[63:0] - SRC1[127:64] 
DEST[127:64] := SRC2[63:0] - SRC2[127:64]

Floating-Point LOAD/MOVE/DUPLICATE Instructions
MOVSHDUP

MOVSHDUP xmm1, xmm2/m128

 Move odd index single precision floating-point values from xmm2/mem and duplicate each element into xmm1.

用于对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行操作,其中m128表示存储了四个单精度浮点值的内存位置。

DEST[31:0] := SRC[63:32]
DEST[63:32] := SRC[63:32]
DEST[95:64] := SRC[127:96]
DEST[127:96] := SRC[127:96]

MOVSLDUP

MOVSLDUP xmm1, xmm2/m128

        Move even index single precision floating-point values from xmm2/mem and duplicate each element into xmm1.

对存储在xmm1和xmm2/m128寄存器中的两组四个单精度浮点值进行操作,其中m128表示存储了四个单精度浮点值的内存位置

DEST[31:0] := SRC[31:0]
DEST[63:32] := SRC[31:0]
DEST[95:64] := SRC[95:64]
DEST[127:96] := SRC[95:64]
 

MOVDDUP

MOVDDUP xmm1, xmm2/m64
Move double precision floating-point value from xmm2/m64 and duplicate into xmm1.

对存储在xmm1和xmm2/m64寄存器中的两组两个双精度浮点值进行操作,其中m64表示存储了两个双精度浮点值的内存位置

DEST[63:0] := SRC[63:0]
DEST[127:64] := SRC[63:0]

 Agent Synchronization Instructions 代理同步指令
MONITOR

MONITOR

与MWAIT指令一起使用,用于实现基于硬件的线程同步机制

指令的目的是向处理器提供关于哪些内存位置可能被特定线程访问的提示。这使得处理器能够通过减少缓存一致性流量和避免由于虚假共享而引起的不必要延迟来优化性能

MWAIT

MWAIT
 A hint that allows the processor to stop instruction execution and enter an implementation-dependent optimized state until occurrence of a class of events.

一种提示,允许处理器停止指令执行并进入与实现相关的优化状态,直到一类事件发生

通常与英特尔高级配置与电源接口(ACPI)一起使用,以在特定处理器状态下提供节能功能。

执行MWAIT指令会导致处理器进入低功耗状态,并等待特定事件的发生

(* MWAIT takes the argument in EAX as a hint extension and is architected to take the argument in ECX as an instruction extension 
MWAIT EAX, ECX *)
{
WHILE ( (“Monitor Hardware is in armed state”)) {
implementation_dependent_optimized_state(EAX, ECX); }
Set the state of Monitor Hardware as triggered;
}

MONITOR和MWAIT是一对x86指令,用于实现基于硬件的线程同步机制。MONITOR指令用于指定处理器应该监视的内存地址范围,而MWAIT指令导致处理器进入低功耗状态,并等待在监视的地址范围内发生特定事件。结合使用时,这些指令能够通过允许线程进入低功耗状态,直到另一个线程修改了监视范围内的特定内存地址,从而实现高效的线程同步。这有助于提高多线程应用程序的整体系统性能和功耗效率。

;-------------------------MONITOR, MWAIT 例子-----------
section .data
    shared_data dd 0   ; 共享数据

section .text
global main
extern thread1, thread2

main:
    mov eax, 0          ; 初始化共享数据为0
    mov [shared_data], eax

    mov eax, 1          ; 设置监视地址范围开始位置
    mov ebx, offset shared_data
    add ebx, 4          ; 监视地址范围结束位置(共享数据的下一个地址)
    monitor             ; 设置监视地址范围

    jmp thread1         ; 启动线程1

thread1:
    mov eax, 1          ; 修改共享数据为1
    mov [shared_data], eax
    mwait               ; 线程1进入低功耗状态等待

    ; 线程1被唤醒后继续执行
    mov eax, [shared_data]
    cmp eax, 2          ; 检查共享数据是否已经被线程2修改
    je done             ; 如果是,则完成

    jmp thread1         ; 否则继续等待

thread2:
    mov eax, 2          ; 修改共享数据为2
    mov [shared_data], eax
    mwait               ; 线程2进入低功耗状态等待

    ; 线程2被唤醒后继续执行
    mov eax, [shared_data]
    cmp eax, 1          ; 检查共享数据是否已经被线程1修改
    je done             ; 如果是,则完成

    jmp thread2         ; 否则继续等待

done:
    ; 完成,退出程序
    mov eax, 1
    xor ebx, ebx
    int 0x80

在这个示例中,我们有两个线程(thread1和thread2),它们同时访问一个共享数据(shared_data)。首先,我们使用MONITOR指令设置监视地址范围,该范围从shared_data开始,到shared_data的下一个地址结束。然后,线程1将共享数据修改为1,并调用MWAIT指令进入低功耗状态等待。线程2也会修改共享数据为2,并进入低功耗状态等待。当其中一个线程修改了共享数据后,另一个线程将被唤醒并继续执行。最后,程序完成并退出。

请注意,上述示例是汇编语言代码,需要在适当的环境中进行编译和运行,例如使用NASM汇编器和链接器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值