在浮点指令执行过程中,8个80位长度的物理寄存器组被作为栈式累加器使用。虽然每个80位寄存器有固定的物理顺序位置(即左边的0~7),但当前栈顶则由ST(即ST(0))来指明。ST之下的其余累加器使用名称ST(i)来指明(i = 1~7)。至于哪个80位物理寄存器是当前栈顶ST,则由具体操作过程指定。在状态字寄存器中名称为TOP的3位字段含有当前栈顶ST对应的80位物理寄存器的绝对位置。一个入栈(Push)操作将会把TOP字段值递减1,并把新值存储于新的ST中。在入栈操作之后,原来的ST变成了ST(1),而原来的ST(7)变成了现在的ST。即所有累加器的名称都从原来的ST(i)变成了ST((i+1)&0x7)。一个出栈(Pop)操作将会读出当前ST对应的80位寄存器的值,并且把TOP字段值递增1。因此在出栈操作之后,原来的ST(即ST(0))变成了ST(7),原来的ST(1)成为新的ST。即所有累加器的名称都从原来的ST(i)变成ST((i-1)& 0x7)。 ST的作用如同一个累加器是因为它被作为所有浮点指令的一个隐含操作数。若有另一个操作数,那么该第2个操作数可以是任何其余累加器之一ST(i),或者是一个内存操作数。栈中的每个累加器为一个实数提供了使用临时实数格式存储的80位空间,其最高位(s)是符号位,位78~64是15位的指数字段,位63~0是64位的有效数字段。 浮点指令被设计成能充分利用这个累加器栈模式。浮点加载指令(FLD等)会从内存中读取一个操作数并压入栈中,而浮点存储指令则会从当前栈顶取得一个值并写到内存中。若栈中该值不再需要时还可以同时执行出栈操作。加和乘之类的操作会把当前ST寄存器内容作为一个操作数,而另一个取自其他寄存器或内存中,并且在计算完后即把结果保存在ST中。还有一类“操作并弹出”操作形式用于在ST和ST(1)两者之间进行运算。这种操作形式会执行一次弹出操作,然后把结果放入新的ST中。
Linux内核完全剖析——栈式浮点累加器
书名: Linux内核完全剖析
作者: 赵炯
出版社: 机械工业出版社
副标题: 基于0.12内核
出版年: 2008.10
页数: 945
定价: 99.00元
装帧: 平装
ISBN: 9787111250470