热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GCC源代码分析,recog_memoized()函数

定义在recog.c文件中intrecog_memoized(insn)    rtxinsn;{ volatile_ok1; if(INSN_CODE(insn)

定义在recog.c文件中

int

recog_memoized (insn)
     rtx insn;
{
  volatile_ok = 1;
  if (INSN_CODE (insn) <0)
    INSN_CODE (insn) = recog (PATTERN (insn), insn);
  return INSN_CODE (insn);
}

recog()函数定义在insn_recog.c文件中



...
insn insn 13
insn call_insn 140
insn insn 14
insn jump_insn 137
(const_int 4)
(reg:SI 6)
(plus:SI (reg:SI 6)
   (const_int 4))
(mem:SI (plus:SI (reg:SI 6)
       (const_int 4)))
(reg:SI 6)
(reg:SI 6)
(plus:SI (reg:SI 6)
   (reg:SI 6))
(const_int 4)
(plus:SI (plus:SI (reg:SI 6)
       (reg:SI 6))
   (const_int 4))
insn insn 13
insn call_insn 140
insn insn 14
insn jump_insn 137
(mem (nil))
insn insn 13
insn insn 13
insn call_insn 140
insn call_insn 140
insn insn 14
insn insn 14
insn jump_insn 137
insn jump_insn 137


最终得到的号码是140


insn call_insn 140
i=0 reg
i=1 mem
i=2 const_int

operands[0]名字是reg,  operands[1]名字是mem,  operands[2]名字是const_int


static char *
output_140 (operands, insn)
     rtx *operands;
     rtx insn;
{
{
  if (GET_CODE (operands[1]) == MEM
      && ! CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))
    {
      operands[1] = XEXP (operands[1], 0);
      output_asm_insn ("call %*%1", operands);
    }
  else
    output_asm_insn ("call %1", operands);
  if (GET_MODE (operands[0]) == DFmode
      || GET_MODE (operands[0]) == SFmode)
    {
/*      fp_pop_level&#43;&#43;; */
      /* pop if reg dead */
      if (!FP_REG_P (operands[0]))
    abort ();
      if (top_dead_p (insn))
    {
      POP_ONE_FP;
    }
    }
  RET;
}
Out-i386.c (config):29
#define RET return ""

这里的RET的目的是第二次进入output_asm_insn()函数的时候直接返回,因为

  /* An insn may return a null string template
     in a case where no assembler code is needed.  */
  if (*template == 0)
    return;



Tm-i386.h (config):653
#define CONSTANT_ADDRESS_P(X)   CONSTANT_P (X)

rtl.h

#define CONSTANT_P(X)   \
  (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF        \
   || GET_CODE (X) == CONST_INT                        \
   || GET_CODE (X) == CONST)



推荐阅读
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 本文详细介绍了如何在CentOS 7操作系统上安装和配置Grafana,包括必要的依赖项安装、插件管理以及服务启动等步骤。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
author-avatar
gengjiang3_946
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有