相关疑难解决方法(0)

为什么XCHG reg,注册了关于现代英特尔架构的3微操作指令?

我正在对代码的性能关键部分进行微优化,并且遇到了指令序列(在AT&T语法中):

add %rax, %rbx
mov %rdx, %rax
mov %rbx, %rdx
Run Code Online (Sandbox Code Playgroud)

我以为我终于有一个用例xchg可以让我刮一个指令并写:

add  %rbx, %rax
xchg %rax, %rdx
Run Code Online (Sandbox Code Playgroud)

然而,根据Agner Fog的指令表,我发现这xchg是一个3微操作指令,在Sandy Bridge,Ivy Bridge,Broadwell,Haswell甚至Skylake上有2个周期延迟.3个完整的微操作和2个周期的延迟!3微操作抛出了我的4-1-1-1的节奏和2周期延迟使得它比在最好的情况下原来的,因为在原来的并行执行可能最后2条指令差.

现在......我得知CPU可能会将指令分解为相当于以下内容的微操作:

mov %rax, %tmp
mov %rdx, %rax
mov %tmp, %rdx 
Run Code Online (Sandbox Code Playgroud)

哪里tmp是匿名内部寄存器,我想最后两个微操作可以并行运行,因此延迟是2个周期.

鉴于寄存器重命名发生在这些微架构上,但对我来说这是以这种方式完成的.为什么寄存器重命名器不会交换标签?理论上,这将只有1个周期(可能是0?)的延迟,并且可以表示为单个微操作,因此它会便宜得多.

performance x86 assembly intel

11
推荐指数
1
解决办法
1907
查看次数

为什么使用 MOV 指令将 XOR 交换优化为普通交换?

在围绕Compiler Explorer进行测试时,我尝试了以下无溢出函数来计算 2 个无符号 32 位整数的平均值:

uint32_t average_1(uint32_t a, uint32_t b)
{
    if(a < b){
        a ^= b;
        b ^= a;
        a ^= b;
    }
    return b + (a - b) / 2;
}
Run Code Online (Sandbox Code Playgroud)

被编译成这样:(与激活的-O1, -O2,-O3优化相同)

average_1:
        cmp     edi, esi
        jnb     .L2
        mov     eax, edi
        mov     edi, esi
        mov     esi, eax
.L2:
        sub     edi, esi
        shr     edi
        lea     eax, [rdi+rsi]
        ret
Run Code Online (Sandbox Code Playgroud)

其中代码的交换部分经过优化,可以使用mov具有 1 个附加寄存器的指令。

我已经阅读了这些问题:

人们为什么不使用异或交换?
通过 mov、xor 交换变量的成本

并得到:

  • 使用 XOR …

c optimization gcc swap x86-64

8
推荐指数
1
解决办法
843
查看次数

xchg 如何在英特尔汇编语言中工作

有人可以解释一下 xchg 在这段代码中是如何工作的吗?鉴于 arrayD 是一个 1,2,3 的 DWORD 数组。

mov eax, arrayD ; eax=1
xchg eax, [arrayD+4]; eax=2 arrayD=2,1,3
Run Code Online (Sandbox Code Playgroud)

为什么 xchg 之后的数组不是 1,1,3?

x86 assembly

5
推荐指数
1
解决办法
9001
查看次数

为什么C中没有内置交换功能但是汇编中有xchg?

最近我遇到了汇编语言.x86程序集有一个xchg指令,用于交换两个寄存器的内容.

由于每个C代码都首先转换为汇编代码,如果在C中像在标题中一样内置了交换函数,那就太好了stdio.h.然后,只要编译器检测到交换函数,它就可以在汇编文件中添加xchg指令.

那么为什么这个交换功能没有在C中实现呢?

c assembly

4
推荐指数
3
解决办法
486
查看次数

标签 统计

assembly ×3

c ×2

x86 ×2

gcc ×1

intel ×1

optimization ×1

performance ×1

swap ×1

x86-64 ×1