Instruction PreDecode

指令预译码器从指令Cache或者指令预取缓存区中接收16字节的指令流,执行如下的预译码操作:

  • 确定每条指令的长度(注:x86指令是变长指令)
  • 译码每条指令的指令前缀
  • 为译码器标记每条指令的不同属性(例如,“是分支指令”)

指令预译码器可以每个周期想指令队列写入6条x86指令。如果读取的指令行含有超过6条指令,预译码器每个周期译码6条指令,直到指令行中所有的指令都译码完毕。然后才开始译码下一个指令行。

例如,如果一个指令行含有7条指令,预译码器在第一个周期会译码前6条指令,然后在第二个周期译码1条指令。平均下来,每个周期译码3.5条指令。尽管看起来每周期指令数(IPC)指标没有完全优化(即没有达到理想的每周期6条指令),但是实际上这个速度已经高出大部分程序的性能了。通常情况下,软件无需为了避免指令饥饿而采取额外的优化措施。

在指令长度译码阶段,下面的指令前缀可能会导致性能问题。这些前缀可以动态的改变指令的长度,被称为指令长度切换前缀(LCP):

  • 操作数长度覆盖前缀(66H), 当指令使用单字长立即数时,这个前缀位于指令前

例如指令MOV ax, 1234H对应的十六机制机器码是66 B8 34 12(66即是操作数长度覆盖前缀)

  • 地址长度覆盖前缀(67H),在实模式,16位或32位保护模式下,当指令使用ModR/M字节时。

例如,指令MOV eax, [si]对应的十六进制机器码是"67 8B 04"(67即使地址长度覆盖前缀)

当预译码器在指令行中碰到LCP前缀时,它必须使用一个慢速的指令长度译码算法。使用这个算法,预译码器需要6个周期才能完成指令行译码,而不是通常的1个周期完成。而且通常的处理器流水线中的排队机制也无法隐藏/覆盖LCP前缀导致的额外周期数。

注意,在Intel 64位架构指令集中的REX前缀(4xH)可以改变两类指令的长度:MOV指令的位移量和MOV指令的立即数。但是这个前缀并不会导致LCP损失,因此它不被认为是LCP前缀。(todo:补充一个例子)

Instruction Queue

指令队列是18指令深度,即有18个条目,可以保存18条指令,位于指令预译码器指令译码器之间。它每个周期可以发送最多达5条指令,同时支持1个宏熔合操作。指令队列也可以作为小于18条指令的循环的高速缓存(简称为循环缓存)使用,具体操作后面有讲解。

BPU中有一个循环流侦测器(LSD)。这个LSD可以尝试侦测循环指令,符合条件的循环结构的指令会被锁定在指令队列中,至此循环指令可以由指令队列提供,直到分支预测失败导致循环结束。当循环指令在指令队列中“回放”时,即指令队列(向执行核)提供循环指令,可以获得更高的指令带宽以及更低的功耗(因为流水线前端中的其他部件可以关闭,例如取指单元,预译码器等)。

LSD提供了如下的优势:

  • 对于采纳分支没有带宽损失
  • 对于未对齐的指令没有带宽损失
  • 没有LCP损失,因为预译码阶段已经完成
  • 降低前端的能耗,因为指令Cache,BPU以及预译码器可以空闲

软件应该“机会主义式地”使用循环缓存功能。循环展开以及其他的优化方法可能导致循环长度太大,以至于无法符合LSD条件。对于追求高性能的代码,循环展开通常是更被推荐的优化方法,尽管这种方法可能导致LSD不可用。

Instruction Decode

Intel Core微架构有4个指令译码器,第一个,译码器0,可以译码最多4微指令的Intel 64与IA32指令,即译码器0将x86指令译码后对应的微指令条数不超过4条。另外3个译码器可以译码单微指令的x86指令,即一条x86指令译码后对应一条微指令。微指令序列生成器可以每周期生成3条微指令,辅助译码超过4微指令的x86指令。

注:Intel Architecture Optimization (Order#: 245127-001)的附录C中介绍了Pentium II & III处理器上常用指令对应的微指令条数。大部分x86指令都对应单条微指令,例如AAA,CLC,CMC,DAS等,复杂的指令,例如AAM,RET等,对应4条微指令。更复杂的指令,例如RSM,STI等,则需要微指令序列生成器辅助译码。需要注意的是,同一条指令的不同格式,可能会生成不同条数的微指令,例如ADD指令,ADD AL, imm8对应单条微指令,ADD r8, m8对应2条微指令(大约是读操作数,然后做加法),ADD m8, imm8则对应4条微指令(大约是读操作数,做加法,再写回内存)。Intel并未公布微指令的细节,以及单条x86指令对应的详细微指令序列。

所有的译码器都支持单微指令流的常见情况,包括:微熔合,栈指针跟踪,和宏熔合。因此,即使那3个简单译码器也不仅限于译码单微指令的x86指令。将指令按照4-1-1-1的模式排列既无必要也不再推荐。

宏熔合将两条x86指令合并成单条微指令。在32位操作模式下(包括Intel 64位模式下的兼容模式),Intel Core微架构可以每周期进行一次宏熔合;但是在64位模式下不做宏熔合,因为使用长指令(指令字节数)的代码通常很难利用到宏熔合机制。

注:处理器的Intel 64位模式实际包括两种子模式:兼容(子)模式和64位(子)模式。兼容模式使得64位操作系统可以运行传统的32位软件;64位模式使得64位操作系统可以运行访问64位线性地址空间的64位应用程序。

Intel Core Enhanced Core架构/微架构/流水线 (6) - 指令预译码/指令队列/指令译码相关推荐

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

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

  2. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器

    Legacy Decode Pipeline 传统的译码流水线由下列部件/单元构成:指令地址转换旁查缓冲区ITLB,指令缓存,指令预译码器,指令译码单元(一个复杂译码器/三个简单译码器). Instr ...

  3. Intel Core Enhanced Core架构/微架构/流水线 (15) - 先进智能缓存

    Intel® Advanced Smart Cache 为了支持单基模上的双处理器核,Intel Core微架构提供了许多优化特性.两个核共享一个二级缓存和总线接口单元,下图中绿色部分标出.本节讲述I ...

  4. Intel Core Enhanced Core架构/微架构/流水线 (13) - 存储转发/访存消歧

    Store forwarding 如果一个读存操作紧跟着写存操作且这两条指令操作同一个内存地址,Intel Core微架构可以直接将写存操作的数据转发给读存操作指令.这个过程被称为存储到读取转发机制, ...

  5. Intel Core Enhanced Core架构/微架构/流水线 (12) - 数据预取

    Data Prefetch to L1 Caches Intel Core微架构提供了2个硬件预取器,可以将数据预取到一级缓存中,由此加速程序访问数据的速度: 数据缓存单元预取器(DCU prefet ...

  6. Intel Core Enhanced Core架构/微架构/流水线 (10) - 先进存储器访问

    Intel® Advanced Memory Access Intel Core微架构中的每个处理器核都包含一个指令缓存和一个一级数据缓存.两个处理器核共享一个2M或4M字节大小的二级混合式缓存(既存 ...

  7. Intel Core Enhanced Core架构/微架构/流水线 (9) - 执行单元发射口旁路时延

    Issue Ports and Execution Units 通过发射口,调度器可以每周期分发6条微指令.Intel Core微架构和Enhanced Intel Core微架构的发射口以及支持的操 ...

  8. Intel Core Enhanced Core架构/微架构/流水线 (8) - 执行核

    Execution Core Intel Core微架构的执行核是超标量的,且可以乱序处理指令.注意:这里没有使用乱序执行指令,用的是乱序处理指令."处理"在这里包括对指令的寄存器 ...

  9. Intel Core Enhanced Core架构/微架构/流水线 (3) - 流水线概述

    Intel® Core Microarchitecture Pipeline Overview Intel Core微架构的流水线包括: 有序发射前端,从内存中获取指令,利用4个指令译码器将x86指令 ...

最新文章

  1. AI 博士生获201万最高档年薪,华科学子连续三年入选华为“天才少年”!
  2. Linux防止SSH暴力破解
  3. sql取最大值的那一行_从零学会SQL:SQL高级功能
  4. 歌词数据解析、歌词滚动、歌词进度控制功能的实现(基于js-base64、lyric-parser、better-scroll),以vue项目为例...
  5. datatable数据插入mysql_DataTable 数据更新、删除、插入 数据库 操作
  6. 户籍改革更进一步!我国将推动户籍准入年限同城化累计互认
  7. ios app的真机调试与发布配置
  8. BeanFactory与FactoryBean的区别
  9. 【渝粤题库】国家开放大学2021春3962金融营销基础题目
  10. mysql 未知列_mysql – ‘字段列表’连接中的未知列’..’
  11. [html] 跨标签页的通讯方式有哪些
  12. Linux下ARM开发环境搭建
  13. 纯软件归档产品的好处
  14. 使用FlyMcu.exe中出现的问题
  15. 最新白白iApp手册开源-iApp源码 非常牛逼
  16. signature=9293cc4bd6f47e4f2a5f299011c6e89e,02-本地证书配置指导
  17. MAF:Mutation Annotation Format格式简介
  18. 简单的 js 日历控件
  19. Unity免费资源汇总
  20. 路由协议常见FAQ-V1.1

热门文章

  1. 多人姿态识别框架——AlphaPose
  2. JetBrains IDEA实用快捷键
  3. time()函数php_time()
  4. vue3 编译很慢_Vue 项目编译时间过长问题
  5. mysql 树形结构_结合RBAC模型讲解权限管理系统需求及表结构创建
  6. 坐标轨迹计算_机器人的轨迹规划与自动导引
  7. python的ols_【量化工具】OLS在python中的四种实现方式
  8. Jenkins配置工具
  9. 【项目调研+论文阅读】基于BERT的中文命名实体识别方法[J] | day6
  10. softmax分类器_[ML] 逻辑回归与 Softmax 回归