有这个相关的问题:海湾合作委员会:游行与mtune有何不同?
但是,现有答案并没有比GCC手册本身更进一步.我们最多得到:
如果您使用
-mtune,那么编译器将生成适用于其中任何一个的代码,但将支持在您指定的特定CPU上运行速度最快的指令序列.
和
该
-mtune=Y选项调整生成的代码以在Y上运行得比在其可能运行的其他CPU上运行得更快.
但是GCC 如何支持一个特定的体系结构,在构建时,同时仍然能够在其他(通常是较旧的)体系结构上运行构建,虽然速度较慢?
我只知道有一件事(但我不是计算机科学家)才能做到这一点,而且那是一个CPU调度员.但是,(对我来说)似乎并不是mtune在幕后生成调度程序,而是其他一些机制可能正在生效.
我觉得这样做有两个原因:
mtune)并测试cpuid在运行时检测支持的指令,而不是依赖于在构建时提供的命名体系结构.那么它如何运作呢?
optimization gcc instruction-set cpu-architecture instructions
我是来问你一些关于 VS2017 的东西的。
过去,我曾将 WinAsm 用于 MASM,但从未遇到过问题。
然而,当我尝试在 VS2017 中使用 MASM 做一些事情时,我总是会遇到问题和东西......
我已经检查了整个互联网关于“如何为 MASM 设置 VS”,但没有任何帮助我,因为我总是遇到麻烦...
有没有什么方法可以将 Visual Studio 2017 用于 MASM32/64 位而不会感到头疼?
有人可以给我设置 VS2017 进行汇编编程的终极指南吗?
非常感谢您,并为我的英语不好而感到抱歉。
在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前缀中一样.
那么他们如何能够干净地解码该指令?
我查看了英特尔手册,他们似乎只提到了VEX中的位反转,而不是EVEX.
OTOH表中的沙堆说,在这些EVEX RxB位也应该被反转.
哪一项是正确的?
我正在编译这个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,在我正在学习的教科书中找到:
...
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.有谁能解释一下?
我正在设计一个简单的玩具指令集和随附的模拟器,并且正在尝试找出支持哪些指令。在算术方面,我目前有无符号加法、减法、乘法和除法。但是,我似乎无法找到以下问题的明确答案:哪些算术运算符需要签名版本,哪些算术运算符的无符号和补码签名版本等效?
例如,1111 的补码等于 -1。如果你加 1 并假装它是一个无符号数,你会得到 0000,即使将其视为 -1,这也是正确的。然而,这对所有数字都适用吗?那么其他三个运算(减法、乘法、除法)呢?
我已经读过,当地址中的相对跳跃小于124时,将使用短跳跃,否则应该使用长跳跃.
在x86上两种类型的跳转之间在CPU /性能方面执行的操作有何不同?
对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