在Intel 64与IA-32架构中,存在一类用于跳转到以及跳出程序段的指令:PUSH、POP、CALL、LEAVE与RET。这些指令可以在没有其余指令的干预下隐式地更新栈寄存器(ESP),维护栈内的参数,然后再执行其它相应的操作。在P3处理器之前,这类指令都会被解码成多条μops。

从PM处理器开始,引入了Stack Pointer Tracker技术。PM处理器的decoder中添加了对上述指令的处理逻辑,使得上述指令中的隐式更新ESP部分可以在decoder内完成。这种技术带来了以下便利:

  • 节约解码带宽,因为少输出了一个更新ESP的μop,PUSH、POP、以及RET都变成了单μop指令。
  • 节约执行带宽,因为更新ESP的运算不用在EU内执行了。
  • 提升了out-of-order处理的并行度,因为ESP间的隐式依赖已经被消除。
  • 降低了功耗,因为ESP的更新采用了更小型的硬件。

不过ESP除了上述指令中的隐式运算外,还能进行显式运算。ESP的隐式运算是在decoder中以in-order顺序进行的,而显式运算是在execution unit中以out-of-order顺序进行的,为了使得ESP相关指令正确执行,有必要对decoder以及EU中的ESP进行同步。同步分为两部分:

  • decoder执行完ESP相关运算后,把ESP更新到EU。
  • EU执行完ESP相关运算后,把ESP更新到decoder。

这需要EU以及decoder有对ESP的跟踪能力(Stack Pointer Tracking),不过由于指令在经过renamer的时候有用RAT记录了所有寄存器的映射,因此不单单EU,decoder也能跟踪到ESP的变化。

sync ESP from decoder to EU

decoder向EU更新ESP的实现方法是把ESP分为两部分

ESPP = ESPO + ESPD

其中ESPP是程序员眼中的ESP值(ESP实际值);ESPO是EU中用到的ESP,显式的ESP运算会用到该数值;ESPD是decoder中维护的差值,隐式ESP运算会修改这个数值。以下面的例子来阐述其中机制(仅供参考)

如上图所示,在解码POP/PUSH等隐式修改ESP的指令的时候,可以得到这些指令对ESP修改的差值ESPD,然后通过这些差值,decoder内部的硬件逻辑可以直接算出ESPP并用于这类指令的后续操作。一旦碰上显式访问ESP的指令,如果此时ESPD不为0,则插入一条用于更新ESPO的μop,然后把ESPD置为0。

sync ESP from EU to decoder

由于在pipeline中decoder位于EU的前方,所以有可能会出现这种情况:decoder在计算ESPP时,所需的ESPO还没处理完成,此时ESPP只能依靠推测来得到,即speculative calculation。由于可能会推测错误,因此在得到ESPO后还需要进行判断,如果出错则应该把指令回溯,重新以正确的ESP再次执行。有兴趣的可以查看Reference中的第二三条链接作为拓展阅读。

优化建议

StackPointerTracker会在隐式修改ESP指令之后的第一条显式访问ESP的指令插入一条同步指令,因此如果对ESP的隐式修改与显式访问指令频繁交替,则会不断添加同步μop,因而会影响指令的处理效率。不过无论是隐式修改ESP还是显式访问ESP都是函数不可或缺的一部分,因此在函数体内尽量减少对ESP的隐式显式交替访问(尽量不用PUSH/POP指令),某些critical代码善用inline。

Reference:

Intel® 64 and IA-32 Architectures Optimization Reference Manual

Literature: S. Gochman, et al.: The Intel Pentium M Processor: Microarchitecture and Performance. Intel Technology Journal, vol. 7, no. 2, 2003

M. Bekerman, et al. : Early Load Address Resolution Via Register Tracking

转载于:https://www.cnblogs.com/TaigaCon/p/7711504.html

Stack Pointer Tracker相关推荐

  1. iar 堆栈设置_IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)...

    摘要: 本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解). 最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR f ...

  2. MCS-51单片机存储器结构-特殊功能寄存器 :堆栈指针SP(Stack Pointer)

    堆栈指针SP(Stack Pointer) 堆栈是一种数据结构,它是一个8位寄存器,它指示堆栈顶部在内部RAM中的位置.系统复位后,SP的初始值为07H,使得堆栈实际上是从08H开始的.但我们从RAM ...

  3. 用IAR下载出现 Stack pointer is setup to incorrect alignment. Stack addr = 0xFFFFFFFF 如何解决?

    今天调试别的人的工程出现这个问题,我按网上的方法修改了两处地方,修改了第二处之后就好了,不确定第一处有没有起作用. 第一处.工程生成的程序输出 .out 文件,不包含调试信息和地址信息,需要生成 .h ...

  4. Intel Core Enhanced Core架构/微架构/流水线 (7) - 栈指针跟踪器/微熔合

    Stack Pointer Tracker Intel 64和IA32架构上有几个用于参数传递以及过程进入与退出的常用指令:PUSH,POP,CALL,LEAVE和RET.这些指令隐式得更新栈指针寄存 ...

  5. Stack(栈)和Heap(堆)的区别

    Stack 和 Heap在程序运行时均可用来存放对象,均存在于RAM中,那么二者有什么区别呢? Stack: 1. 处理器经由指针(stack pointer)提供直接支持.当程序分配一块新的内存时, ...

  6. java中堆栈(stack)和堆(heap)

    http://www.ej38.com/showinfo/java-172156.html 堆栈是一种先进后出的数据结构,只能在一端进行输入或输出数据的操作  Stack类在java.util包中 向 ...

  7. st(state-threads) coroutine和stack分析

    st(state-threads) https://github.com/winlinvip/state-threads 以及基于st的RTMP/HLS服务器:https://github.com/w ...

  8. C的function call與stack frame心得

    为什么80%的码农都做不了架构师?>>>    [技術] C的function call與stack frame心得 Written on 12:00 上午 by Yu Lai 從大 ...

  9. stack 和 heap区别

    heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 堆和栈最大的区别在于堆是由低地址向高 ...

最新文章

  1. 自学python清单-python学习清单
  2. Android分包方案multidex
  3. 蓝桥杯 历届试题 分糖果(模拟)
  4. 微信小程序登录-利用Oenid实现白名单和黑名单
  5. DCMTK:“内容映射资源”Content Mapping Resource中的各种CIDxxx和TIDxxx类的测试程序
  6. win7系统出现0x0000001a蓝屏代码的解决教程
  7. 计算机考研310分什么水平,知乎工学考研310是什么水平
  8. 研究人脸识别技术必须知道的十个基本概念
  9. vs2010新功能(转)
  10. 微服务注册中心为什么要使用Consul替代Eureka?
  11. UI基础(四)之tableView (cell重用、原型cell、静态cell)/xib注意事项
  12. 吟诗作赋不能赚钱,作诗的AI机器人的盈利之路在哪
  13. 报错:for..in loops iterate over the entire prototype chain, which is virtually never what you want.
  14. 华为研发小仙女自述:我和开发的“撕逼”日常
  15. 如何发送工资条通知短信
  16. failed to open file mysql,导入mysql数据库打不开的解决办法
  17. 阿里云服务器搭建和宝塔面板连接
  18. 嗨聊:移动社交区域化发展的新思路
  19. mysql接受表单数据类型_PHP如何接收表单数据数组并插入MySQL数据库?其中表单数据类型包括图片文件类型,要实现图片..._慕课问答...
  20. 【Vant相关知识】

热门文章

  1. WannaCry勒索软件还在继续传播和感染中
  2. 如何让一个对话框全屏对话框
  3. Yii 数据库重连告别General error: 2006 MySQL server has gone away
  4. 录入学员的身份证后控件焦点转移时根据身份证号码获得生日和性别
  5. perl(Class::MethodMaker) is needed by MySQL-ndb-tools-5.1.21-0.glibc23.i386
  6. 【转载】Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
  7. linux 安装 python3
  8. Kinect V2 基础教程之彩色图像
  9. CentOS安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  10. Mac os android×××,环境配置 mountain lion10.8.2 配置×××环境,并编译源码