Questions tagged «x86-64»

x86-64是Intel x86架构的64位扩展


6
如果我针对大小而不是速度进行优化,为什么GCC会生成15-20%的更快代码?
我在2009年首先注意到,如果我对大小(-Os)而不是速度(-O2或-O3)进行优化,那么GCC(至少在我的项目和我的机器上)倾向于生成明显更快的代码,而我一直在想为什么。 我设法创建了(相当愚蠢的)代码来显示这种令人惊讶的行为,并且足够小,可以在此处发布。 const int LOOP_BOUND = 200000000; __attribute__((noinline)) static int add(const int& x, const int& y) { return x + y; } __attribute__((noinline)) static int work(int xval, int yval) { int sum(0); for (int i=0; i<LOOP_BOUND; ++i) { int x(xval+sum); int y(yval+sum); int z = add(x, y); sum += z; …


5
为什么GCC在实现整数除法时使用乘以奇数的乘法?
我一直在阅读div和mul汇编操作,我决定通过用C编写一个简单程序来看到它们的作用: 文件分割 #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } 然后使用以下命令生成汇编语言代码: gcc -S division.c -O0 -masm=intel 但是查看生成的division.s文件,它不包含任何div操作!取而代之的是,它执行某种带有移位和魔术数字的黑魔法。这是一个计算的代码片段i/5: mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX movabs rdx, -3689348814741910323 ; Move some magic number to …

4
为什么引入无用的MOV指令会加速x86_64汇编中的紧密循环?
背景: 在使用嵌入式汇编语言优化某些Pascal代码时,我注意到一个不必要的MOV指令,并将其删除。 令我惊讶的是,删除了不必要的指令使我的程序变慢了。 我发现添加任意,无用的MOV指令可以进一步提高性能。 效果是不稳定的,并且会根据执行顺序而变化:同一行垃圾指令在一行中上下移动会导致速度降低。 我知道CPU会进行各种优化和精简,但这似乎更像是黑魔法。 数据: 我的代码版本在运行时间的循环中间有条件地编译了三个垃圾操作2**20==1048576。(周围的程序只计算SHA-256哈希值)。 我的旧机器(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms 程序循环运行25次,每次运行顺序随机更改。 摘抄: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …


3
从函数返回结构时可能的GCC错误
我相信我在实施O'Neill的PCG PRNG时发现了GCC中的错误。(Godbolt的Compiler Explorer上的初始代码) 相乘后oldstate通过MULTIPLIER,(存储在RDI结果),GCC不该结果添加到INCREMENT,movabs'ing INCREMENT到RDX代替,然后把它用作rand32_ret.state的返回值 一个最小的可复制示例(Compiler Explorer): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成的程序集(GCC 9.2,x86_64,-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in …
133 c  gcc  assembly  x86-64  compiler-bug 

11
如何查找本机DLL文件是编译为x64还是x86?
我想确定是否从托管代码应用程序(C#)将本机程序集编译为x64或x86 。 我认为它必须在PE标头中,因为操作系统加载程序需要知道此信息,但我找不到它。当然,我更喜欢在托管代码中执行此操作,但是如果需要,我可以使用本机C ++。
133 c#  .net  winapi  64-bit  x86-64 

4
Rust的128位整数“ i128”如何在64位系统上工作?
Rust具有128位整数,这些整数用数据类型表示i128(u128对于无符号整数): let a: i128 = 170141183460469231731687303715884105727; Rust如何使这些i128值在64位系统上工作?例如,如何对它们进行算术运算? 据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128?还是他们改用某种大整数结构来表示它们?

3
为什么32位寄存器上的x86-64指令将整个64位寄存器的高位归零?
在x86-64英特尔手册之旅中,我阅读了 也许最令人惊讶的事实是诸如MOV EAX, EBX自动将RAX寄存器的高32位清零的指令。 同一来源引用的英特尔文档(手动基本体系结构中的3.4.1.1通用寄存器在64位模式下)告诉我们: 64位操作数在目标通用寄存器中生成64位结果。 32位操作数生成32位结果,并将其零扩展到目标通用寄存器中的64位结果。 8位和16位操作数生成8位或16位结果。目的通用寄存器的高56位或高48位(分别)不会被该操作修改。如果8位或16位运算的结果打算用于64位地址计算,则将寄存器显式符号扩展为完整的64位。 在x86-32和x86-64汇编中,16位指令例如 mov ax, bx 不要显示eax的高位字为零的这种“奇怪”行为。 因此:引入此行为的原因是什么?乍一看似乎是不合逻辑的(但是原因可能是我已经习惯了x86-32程序的怪癖)。

8
在同一解决方案/项目中使用Visual Studio定位32位和64位
对于如何为多目标设置视觉工作室版本,我有些困惑。 背景:c#.NET v2.0,带有p /调用带有安装程序项目的第三方32位DLL,SQL compact v3.5 SP1。现在,平台目标已设置为x86,因此可以在Windows x64上运行。 这家第三方公司刚刚发布了其DLL的64位版本,我想构建一个专用的64位程序。 这提出了一些我还没有答案的问题。我想要完全相同的代码库。我必须使用对32位DLL或64位DLL的引用进行构建。(第3方和SQL Server Compact) 是否可以使用2套新的配置集(Debug64和Release64)来解决? 我必须创建2个单独的安装项目(std。visual studio项目,没有Wix或任何其他实用程序),还是可以在同一.msi中解决此问题? 任何想法和/或建议都将受到欢迎。

4
为什么Windows64使用与x86-64上所有其他操作系统不同的调用约定?
AMD具有ABI规范,该规范描述了在x86-64上使用的调用约定。除具有自己的x86-64调用约定的Windows外,所有操作系统都遵循它。为什么? 有谁知道这种差异的技术,历史或政治原因,还是纯粹是NIHsyndrome问题? 我知道不同的操作系统可能对更高层次的东西有不同的需求,但这并不能解释为什么例如Windows上的register参数传递顺序却是rcx - rdx - r8 - r9 - rest on stack其他所有人都使用的原因rdi - rsi - rdx - rcx - r8 - r9 - rest on stack。 PS:我知道这些调用约定通常有何不同,并且我知道在需要的地方可以找到详细信息。我想知道的是为什么。 编辑:有关操作方法,请参见Wikipedia条目及其链接。

10
为什么x86丑陋?与其他人相比为什么被认为是次等的?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 最近,我一直在阅读一些SO档案,并遇到了针对x86体系结构的声明。 为什么我们需要针对服务器,小型/大型机和混合核的不同CPU体系结构?他说: “ PC体系结构是一团糟,任何OS开发人员都会告诉你。 ” 学习汇编语言值得吗?(已存档)说: “意识到x86架构充其量是可怕的 ” 有什么简单的方法来学习x86汇编程序?表示: “ 大多数大学都在MIPS之类的课程上教授汇编语言,因为它更容易理解,x86汇编确实很难看。 ” 还有更多评论,例如 “与大多数体系结构相比,X86非常糟糕。” “ X86不如MIPS,SPARC和PowerPC,这绝对是传统观念 ” “ x86很丑 ” 我尝试搜索,但没有找到任何原因。我认为x86不错,可能是因为这是我所熟悉的唯一体系结构。 有人可以给我理由比其他人考虑x86丑/坏/劣等。

15
System.BadImageFormatException:无法加载文件或程序集(从installutil.exe)
我正在尝试使用InstallUtil.exe安装Windows服务,并收到错误消息 System.BadImageFormatException:无法加载文件或程序集“ {xxx.exe}”或其依赖项之一。试图加载格式错误的程序。 是什么赋予了? 编辑:(不是由OP)从dup中提取的完整消息越来越多的命中[用于谷歌搜索]: C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C:\ xxx.exe Microsoft(R).NET Framework安装实用程序4.0.30319.1版权所有(c)Microsoft Corporation。版权所有。 初始化安装时发生异常:System.BadImageFormatException:无法加载文件或程序集'file:/// C:\ xxx.exe'或其依赖项之一。试图加载格式不正确的程序。

11
现代硬件上的浮点数与整数计算
我正在用C ++进行一些性能至关重要的工作,并且我们目前正在使用整数计算来解决那些固有的浮点问题,因为它“更快”。这会引起很多烦人的问题,并增加了很多烦人的代码。 现在,我记得读过有关浮点计算如何如此缓慢的信息,大约在386天左右,我相信(IIRC)有一个可选的协同处理器。但是,如今在使用指数级更复杂,功能更强大的CPU时,如果进行浮点或整数计算,那么“速度”没有区别吗?特别是由于与导致流水线停滞或从主内存中获取某些内容相比,实际的计算时间很小? 我知道正确的答案是在目标硬件上进行基准测试,什么是测试此硬件的好方法?我编写了两个微型C ++程序,并将它们的运行时间与Linux上的“时间”进行了比较,但是实际的运行时间变化太大(对我在虚拟服务器上运行没有帮助)。我一整天都没有运行数百个基准测试,制作图表等,我是否可以做一些事情来对相对速度进行合理测试?有什么想法或想法吗?我完全错了吗? 我使用的程序如下,它们在任何方面都不相同: #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** argv ) { int accum = 0; srand( time( NULL ) ); for( unsigned int i = 0; i < 100000000; ++i ) { accum += rand( ) % 365; } …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.