当前位置: 首页 > 知识库问答 >
问题:

关于gcc生产的汇编代码(汇编代码不按顺序?)

公孙森
2023-03-14

我正在为64位mips机器使用gcc编译器。我注意到生成的一段汇编代码很有趣。下面是详细信息:

00000001200a4348 <get_pa_txr_index+0x50> 2ca2001f   sltiu   v0,a1,31
00000001200a434c <get_pa_txr_index+0x54> 14400016   bnez    v0,00000001200a43a8 <get_pa_txr_index+0xb0>
00000001200a4350 <get_pa_txr_index+0x58> 64a2000e   daddiu  v0,a1,14

00000001200a43a8 <get_pa_txr_index+0xb0> 000210f8   dsll    v0,v0,0x3
00000001200a43ac <get_pa_txr_index+0xb4> 0062102d   daddu   v0,v1,v0
00000001200a43b0 <get_pa_txr_index+0xb8> dc440008   ld  a0,8(v0)
00000001200a43b4 <get_pa_txr_index+0xbc> df9955c0   ld  t9,21952(gp)
00000001200a43b8 <get_pa_txr_index+0xc0> 0320f809   jalr    t9
00000001200a43bc <get_pa_txr_index+0xc4> 00000000   nop

通常,bnez将立即跳到0xb0。但在0xb0之后的块中,我确信程序必须使用a1作为参数。但是我们可以看到,在0xb0之后,a1从未出现在块中。

但是a1在0x58中使用,就在bnez(0x54)之后。

那么0x54和0x58指令有可能同时执行吗?超标量处理器通过同时将多条指令分派到处理器上的冗余功能单元,在时钟周期内执行多条指令。

我的问题是,gcc编译器怎么知道我的cpu有这个能力?gcc使用什么样的技术?gcc使用什么优化选项来生成这种汇编代码?

谢谢

共有1个答案

丁嘉
2023-03-14

此功能通常称为分支延迟槽。查找用于填充分支延迟槽的指令通常是在优化编译器后端的调度阶段完成的。

 类似资料:
  • 让我们用一个简单的C代码来设置寄存器: 当我使用1级优化为ARM(ARM none eabi gcc)编译此代码时,汇编代码如下所示: 看起来地址111111被解析到最接近的4K边界(110592)并移动到r3,然后通过将519添加到110592 (=111111)来存储值4096(0x1000)。为什么会这样? 在x86中,组装非常简单:

  • 因此,通常关于通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你聪明”。我明白了。 但是,我注意到优化的线性代数库(例如ACML)可以比标准编译库实现2到5倍的性能改进。例如,在我的8核机器上,与现有的单线程BLAS实现相比,优化的矩阵乘法运行速度快了30倍以上,这意味着,在考虑了由于使用所有内核而提高的8倍之后,仅仅通过优化仍然可以提高4倍。 所以在我看来,优化的汇编代码确实可以带来巨大的

  • 至少在GCC中,如果我们提供生成汇编代码的选项,编译器会通过创建一个包含汇编代码的文件来服从。但是,当我们简单地运行命令而没有任何选项时,它不会在内部生成汇编代码吗? 如果是,那么为什么它需要首先生成一个汇编代码,然后将其翻译成机器语言?

  • #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = j

  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 我是android新手,正在处理一个广播互联网连接状态的应用程序。我使用了一个不推荐使用的方法isConnectingOrConnected()。我无法修复我的代码,它令人困惑。请查看我的代码并帮我解决问题。真心感谢任何帮助 这是我的连接接收器代码 这是我的主要活动