2014-10-18 116 views
0

当Intel首次设计8087时,他们为什么选择将浮点寄存器组织为堆栈?从这样的设计中可以获得什么样的优势?与允许任意寄存器用作源操作数和目标操作数相比,它看起来更不灵活和难以操作。为什么80x87指令集使用“基于堆栈”的设计?

+1

我建议你在[电气工程](http://electronics.stackexchange.com/)堆栈上询问这个问题,但我相信它会归结为有限的晶体管数量。根据[Wikipedia](http://en.wikipedia.org/wiki/Transistor_count)8080有4500个晶体管。到8088年时,它达到29000个晶体管,但我不知道它是否与你的问题直接相关。 – 2014-10-18 20:36:32

+0

@ElliottFrisch,这不是关于IC设计的问题,而是关于指令集设计。但是,如果答案是“因为它更容易在硅片中实现”,请继续并将其作为答案。不过,我不明白为什么会出现这种情况。 – 2014-10-18 20:42:02

+2

参见[本文档](http://www.cims.nyu.edu/~dbindel/class/cs279/87stack.pdf)(通过[wikipedia]找到(http://en.wikipedia.org/wiki/) X87))。 – Jester 2014-10-18 23:31:50

回答

1

文章"On the Advantages of the 8087's Stack"在@Jester的评论中共享,解释了设计师的想法。为什么他们组织了浮点寄存器作为堆栈摘要:

  1. 潜在的,它可以做出过程调用更有效,因为(在理论上)既不呼叫者也不是被调用者就必须明确地保存和恢复FP寄存器。需要进行FP计算的被调用者只需将它们的操作数推入寄存器堆栈,进行计算,并在完成时将结果从堆栈中弹出,自动恢复调用者的x87状态。 (这与机器堆栈用于函数参数,返回值和局部变量的方式基本相同。)

  2. 考虑到8086/8088上已经编码了指令,并且已经使用了操作码的数量,他们只能为8087而不是2操作数提供1操作数指令。这对于平面寄存器文件来说效果不佳。他们认为提供FXCH指令会使其足够简单,可以随意重新排列x87寄存器堆栈(以便任意的值对可以在需要时用作操作数)。此外,FXCH操作便宜。

+0

我是唯一一个认为80x87是一个好建筑的人,但却是一些相当不好的编译器的受害者?如果编译器不允许声明扩展精度变量,并且有时会在寄存器中留下80位值,但有时会将它们“溢出”为32位或64位,则产生的语义会变得很糟糕,但8x87设计者并不会不要责怪。当人们诅咒8x87这个事实时,我感到很难过,因为这两个产品经常浮动,但并不总是表现为扩展,而不是诅咒那些不让它们一贯使用扩展的语言。 – supercat 2014-10-19 18:36:11

+0

@supercat,非常有趣,我不知道存在这样的问题。我不认为C标准指定应该存储多少位“float”和“double”,或者甚至它们必须使用IEEE格式,所以似乎兼容的C编译器*可能会使用80位'double's。如我错了请纠正我。 – 2014-10-19 19:48:01

+0

无论出于何种原因,x86的许多C编译器都将64位用于'double'和'long double'类型,但未能提供任何80位数据类型;这意味着如果例如一个想要计算'x = sin(a)+ b; y = sin(a)+ c;'要么必须计算sin(a)两次,否则在将其存储到临时变量时会失去精度。更糟糕的是,即使'sin(a)'操作出现两次,如上所示,一些优化编译器会将中间计算保存为64位值,在计算x时使用80位值,并使用64计算y的位值。 – supercat 2014-10-19 20:04:09