CPU指令集背后的基本原理是什么?

Eug*_*gen 2 cpu-architecture

在检查英特尔x86处理器的指令集时,我注意到有"直观"的指令,如'mov','add','mul'......而其他的看起来有点不自然,就像'sete'.问题更多的是出于好奇而不是实际问题:为什么设计师会选择在单个指令中实施特定的执行方案?你知道任何可以解释这种设计决定的阅读材料吗?

srk*_*ing 6

设计人员用来决定"特定执行方案"是否是指令的合理候选者的一些标准:

  1. 无状态的行为 -操作必须在操作数或以其他方式可见的机器状态(例如运算标记)仅取决于执行的时间.不允许隐藏状态.此限制排除了在指令完成后保持忙碌的非阻塞指令.

  2. 有限的内存触摸 - 内存访问通常是一个速率限制器.除了提高代码密度之外,如果由于内存瓶颈而执行相同操作,则将离散操作组合成一个大指令是没有意义的.

  3. 计算上有趣 - 新指令应该比其他方式更有效地执行某些操作.x86 AES指令是极端的例子.如果它们经常发生的话,比较简单的操作就像位杂乱一样.

  4. 业务价值 - 实施指令的芯片面积和验证工作是否能够收回成本?

  5. 兼容性值 - 最后,但并非最不重要的是,除了支持传统软件之外,其他许多指令都存在.


Jer*_*fin 5

就 而言sete,这可能是指令集中编写的代码的实际经验问题。至少如果内存可用的话,sete是从 386 开始添加的,所以到那时该指令集已经被积极使用了几年。据猜测,他们可能花了一些时间浏览代码来查找已经做了很多但指令集中不直接支持的事情。他们可能会筛选那些通过直接在 CPU 中支持它们而可以轻松提高效率的那些。

很多情况都与此相当相似——工作基本上是在软件中进行原型设计,以找到相当灵活、高效且易于实施的设计。然后,当设计相对完善时,CPU 设计人员会对其进行仔细检查,看看他们是否不能通过在硬件中实现(至少部分)它来使其至少更高效一点。

大多数所谓的RISC处理器都是通过收集现有处理器上现有编译器从源代码生成的代码的统计数据来设计的。然后他们检查指令使用的频率,并(尝试)优化那些经常使用的指令,并简单地丢弃那些不经常使用的指令。