标签: instructions

mtune实际上是如何工作的?

有这个相关的问题:海湾合作委员会:游行与mtune有何不同?

但是,现有答案并没有比GCC手册本身更进一步.我们最多得到:

如果您使用-mtune,那么编译器将生成适用于其中任何一个的代码,但将支持在您指定的特定CPU上运行速度最快的指令序列.

-mtune=Y选项调整生成的代码以在Y上运行得比在其可能运行的其他CPU上运行得更快.

但是GCC 如何支持一个特定的体系结构,在构建时,同时仍然能够在其他(通常是较旧的)体系结构上运行构建,虽然速度较慢?

我只知道有一件事(但我不是计算机科学家)才能做到这一点,而且那是一个CPU调度员.但是,(对我来说)似乎并不是mtune在幕后生成调度程序,而是其他一些机制可能正在生效.

我觉得这样做有两个原因:

  1. 搜索"gcc mtune cpu dispatcher"找不到任何相关内容; 和
  2. 如果它基于调度程序,我认为它可以更智能(即使通过除了之外的某些选项mtune)并测试cpuid在运行时检测支持的指令,而不是依赖于在构建时提供的命名体系结构.

那么它如何运作呢?

optimization gcc instruction-set cpu-architecture instructions

10
推荐指数
1
解决办法
1359
查看次数

汇编编程 - WinAsm 与 Visual Studio 2017

我是来问你一些关于 VS2017 的东西的。
过去,我曾将 WinAsm 用于 MASM,但从未遇到过问题。

然而,当我尝试在 VS2017 中使用 MASM 做一些事情时,我总是会遇到问题和东西......
我已经检查了整个互联网关于“如何为 MASM 设置 VS”,但没有任何帮助我,因为我总是遇到麻烦...

有没有什么方法可以将 Visual Studio 2017 用于 MASM32/64 位而不会感到头疼?

有人可以给我设置 VS2017 进行汇编编程的终极指南吗?

非常感谢您,并为我的英语不好而感到抱歉。

ide assembly masm instructions visual-studio-2017

10
推荐指数
1
解决办法
4242
查看次数

指令解码器如何在32位模式下区分EVEX前缀和BOUND操作码?

在32位模式下,英特尔通过反转寄存器扩展的高位来解决VEX前缀与LDS/LES冲突,因为ModRM字节的mod字段不能为11b

VEX前缀的初始字节值C4h和C5h与LDS和LES指令的操作码相同.64位模式不支持这些指令.为了在32位模式下解决模糊性,VEX的规范利用了合法的LDS或LES的ModRM字节不能是11xxxxxx(它将指定寄存器操作数)的事实.VEX前缀的第二个字节中的各个位字段被反转,以确保该字节在32位模式下始终为此形式.

https://en.wikipedia.org/wiki/VEX_prefix#Technical_description

但是在EVEX中,R和X位不反转,导致mod = 00b,这也表示BOUND指令中的内存操作数

来自REX前缀的四位R,X,B和W. W将操作数大小扩展为64位或作为附加操作码,R扩展reg,B扩展r/m或reg,X和B扩展索引和SIB字节中的基址.与VEX前缀相比,RXB以非反转形式提供,就像在REX前缀中一样.

https://en.wikipedia.org/wiki/EVEX_prefix

那么他们如何能够干净地解码该指令?


我查看了英特尔手册,他们似乎只提到了VEX中的位反转,而不是EVEX.

OTOH表中的沙堆说,在这些EVEX RxB位也应该被反转.

哪一项是正确的?

x86 assembly opcode instructions

9
推荐指数
1
解决办法
358
查看次数

为什么LLVM为同一个程序添加了两条额外的指令?

我正在编译这个C程序并比较生成的汇编代码:

int main(){ return 0; }
Run Code Online (Sandbox Code Playgroud)

GCC给出了这个主要功能(cc hello.c -S):

_main:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    $0, %eax
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

LLVM提供了这个主要功能(clang hello.c -S):

_main:
Leh_func_begin0:
    pushq   %rbp
Ltmp0:
    movq    %rsp, %rbp
Ltmp1:
    movl    $0, %eax
    movl    $0, -4(%rbp)
    popq    %rbp
    ret
Leh_func_end0:
Run Code Online (Sandbox Code Playgroud)

什么movl $0, -4(%rbp)popq %rbp需要?在堆栈上移动东西然后直接弹出它对我来说似乎毫无用处.

c assembly gcc llvm instructions

8
推荐指数
2
解决办法
822
查看次数

指令和微操作之间的区别

机器指令和微操作有什么区别?我在这里找到了以下定义:

一个小的基本指令,串联使用以组成高级机器指令

这是我在维基百科上发现的

在计算机中央处理单元中,微操作(也称为微操作或微操作)是在一些设计中用于实现复杂机器指令的详细低级指令(在此上下文中有时称为宏指令)

我是否理解微操作是在给定周期中执行的处理器指令.比如和ADD,SUB,MUL,ST,LD一样.我错过了什么吗?

任何帮助表示赞赏.

assembly instructions machine-instruction

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

7
推荐指数
1
解决办法
1万
查看次数

使用具有相同寄存器的TEST指令

这是一些C,在我正在学习的教科书中找到:

...
do {
    ...
    n--;
} while (n > 0)
...
Run Code Online (Sandbox Code Playgroud)

我假设n是在%edx.

生成的汇编代码是:

testl %edx, %edx 
jle .L5
Run Code Online (Sandbox Code Playgroud)

我明白jle测试小于或等于(SF ^ OF) | ZF.但是我不确定这条指令是如何对应的n > 0.有谁能解释一下?

x86 assembly instructions x86-16

7
推荐指数
1
解决办法
9491
查看次数

对于无符号数和有符号数的补码,哪些算术运算是相同的?

我正在设计一个简单的玩具指令集和随附的模拟器,并且正在尝试找出支持哪些指令。在算术方面,我目前有无符号加法、减法、乘法和除法。但是,我似乎无法找到以下问题的明确答案:哪些算术运算符需要签名版本,哪些算术运算符的无符号和补码签名版本等效?

例如,1111 的补码等于 -1。如果你加 1 并假装它是一个无符号数,你会得到 0000,即使将其视为 -1,这也是正确的。然而,这对所有数字都适用吗?那么其他三个运算(减法、乘法、除法)呢?

binary instruction-set instructions twos-complement

7
推荐指数
2
解决办法
2458
查看次数

长跳跃和短跳的区别(x86)

我已经读过,当地址中的相对跳跃小于124时,将使用短跳跃,否则应该使用长跳跃.

在x86上两种类型的跳转之间在CPU /性能方面执行操作有何不同?

cpu x86 assembly instructions machine-instruction

7
推荐指数
1
解决办法
1万
查看次数

整数除法主要用于什么?

https://ridiculousfish.com/blog/posts/benchmarking-libdivide-m1-avx512.html的分析发现,新的 Apple CPU 花费了大量资源使整数除法速度大大加快。

这是一件令人惊讶的事情。根据我的经验,整数除法并没有真正使用,除非在除以编译时间常数的情况下,可以用移位或乘法代替。

更令人惊讶的是在https://news.ycombinator.com/item?id=27133804的讨论中有人说

当我一直在对性能关键代码进行微优化时,整数除法经常作为一个热点出现。

现在我真的很好奇:人们在做什么,使整数除法成为瓶颈?我正在考虑可以在哪里使用它。我见过的案例:

  • 浮点模拟。但是现在,唯一没有硬件浮点的 CPU 是微型微控制器,无论如何也不会有硬件整数除法。

  • 带有桶数的哈希表是素数,以获得一点额外的随机性。但是人们早就知道这不是最好的做事方式。如果您不相信您的散列函数提供足够的随机性,请获得更好的散列函数。

  • 使用固定点坐标的早期 3D,如 PlayStation 1。但是现在每个人都在做浮点 3D。

那么所有这些整数除法究竟是用来做什么的呢?

performance cpu-architecture division integer-division instructions

7
推荐指数
0
解决办法
90
查看次数