X87熔合乘加指令及其应用的制作方法

文档序号:6613099阅读:209来源:国知局
专利名称:X87熔合乘加指令及其应用的制作方法
技术领域
本发明涉及的是在管线微处理器中执行的浮点指令,更具体地说,是关 于一种在X87指令集架构中执行的熔合乘加指令。
背景技术
某些微处理器,微控制器和数字信号处理器的指令集中包括了熔合乘加 (Fused Multiply-Add, FMA)指令。 一个浮点熔合乘加指令将两个浮点操作数 (A和B)相乘,将其乘积与第三个浮点操作数(C)相加,即 FMA(A, B, C) = (A * B) + C与需要程序执行一个单独的乘法指令,再执行一个单独的加法指令的微处理器相比,指令集中包括了熔合乘加指令的微处理器可以提高许多含有乘 积累加的重要运算的速度和精确度,例如矩阵乘法、点积运算或多项式展开。 浮点熔合乘加指令可以提高精确度,因为熔合乘加指令可以只对结果进行一 次舍入,而一个单独的乘法指令,再执行一个单独的加法指令时,必须进行 两次舍入。后者的乘法指令的结果是进行舍入了的,但浮点熔合乘加指令在 加上第三个操作数之前是不会做舍入的。另外,浮点熔合乘加指令可以提高 速度,因为基于微体系机构的微处理器执行单独一条指令的速度比执行两条 指令的速度快。包括了浮点熔合乘加指令的微处理器有PowerPC, Intel ItaniumTM以 及Sun Microsystems SPARC系列处理器。但是,当前最主流的X86体系结 构的微处理器的指令集中当前却没有包含浮点熔合乘加指令。因此需要在X86 体系结构的微处理器的指令集中加入浮点熔合乘加指令。发明内容本发明提供了一种X87熔合乘加指令,该指令存储于计算机系统存储器 中,并由具有X87浮点单元寄存器堆栈的X86体系结构的微处理器执行,该 指令包括第一操作数和第二操作数,被指定存储于寄存器堆栈的第一寄存
器和第二寄存器。该第一寄存器和第二寄存器是位于该寄存器堆栈栈顶的两 个寄存器。该指令还包括第三操作数,被指定存储于寄存器堆栈的第三寄存 器中。该熔合乘加指令指示微处理器将该第一操作数和该第二操作数相乘以 产生一个乘积,然后将该第三操作数和该乘积相加以产生一个计算结果。本发明的另一方面,提供了一种具有X87浮点单元的X86体系结构的微 处理器,其中该X87浮点单元具有X87寄存器堆栈。该微处理器包括指令译 码器,其对微处理器指令集中的X87熔合乘加指令进行译码。该熔合乘加指 令包括第一操作数和第二操作数,被指定存储于该寄存器堆栈的第一寄存器 和第二寄存器。该第一寄存器和第二寄存器是位于该寄存器堆栈栈顶的两个寄存器。该熔合乘加指令还包括第三操作数,被指定存储于寄存器堆栈的第 三寄存器中。该微处理器还包括乘法器,耦接至该寄存器堆栈,其将该第一 操作数和该第二操作数相乘产生一乘积,以响应该熔合乘加指令。该微处理 器还包括加法器,耦接至该乘法器,其将该第三操作数和该乘积相加以产生 一个计算结果,以响应该熔合乘加指令。本发明的另 一方面,提供了 一种在计算设备中使用的计算机程序产品。 该计算机程序产品包括包含计算机可读程序代码的计算机可用存储媒介,以 提供一种具有X87浮点单元的X86体系结构的微处理器,其中该X87浮点单 元具有X87寄存器堆栈。该计算机可读程序代码包括第一程序代码,其提供 指令译码器将微处理器指令集中的XS7熔合乘加指令译码。该熔合乘加指令 包括第一操作数和第二操作数,被指定存储于该寄存器堆栈的第一寄存器和 第二寄存器。该第一寄存器和第二寄存器是位于该寄存器堆栈栈顶的两个寄 存器。该熔合乘加指令还包括第三操作数,被指定存储于寄存器堆栈的第三 寄存器中。该计算机可读程序代码还包括第二程序代码,其提供乘法器,耦 接至该寄存器堆栈,该乘法器将该第一操作数和该第二操作数相乘产生一乘 积,以响应该熔合乘加指令。该计算机可读程序代码还包括第三程序代码, 其提供加法器,耦接至该乘法器,其将该第三操作数和该乘积相加以产生一 个计算结果,以响应该熔合乘加指令。


图1是根据本发明实施例所述的指令集包括X87熔合乘加指令的X86体 系结构的微处理器的结构框图。 图2是图1中执行熔合乘加指令的X87浮点单元的结构示意图。 图3是图1中的微处理器执行熔合乘加指令的步骤流程图。 图4是提供执行本发明各步骤的软件,并接着将该软件作为计算机数据 信号通过通讯网络传输的方法流程图。 主要元件标号说明202数据寄存器堆栈 204乘法器206加法器 208移位器212控制逻辑电路 214规格化及舍入电路216加法器 218计算结果222乘积具体实施方式
参考图1,该结构框图示出了指令集包括X87熔合乘加(Fused Multiply-Add, FMA)指令的X86体系结构的微处理器100。微处理器100包 括指令緩存器102,其緩存取自耦接于微处理器100的系统存储器的程序指 令,根据本发明,该程序指令包括X87熔合乘加指令。微处理器1Q0还包括 指令取得器1Q4,耦接至该指令緩存器102,其从指令緩存器1Q2和系统存储 器中取得程序指令。微处理器100还包括指令译码器106,耦接至该指令取 得器104,其对取得的微处理器100指令集的程序代码,如本发明所描述的 X87熔合乘加指令,进行译码。指令调度器108,耦接至指令译码器106,将 指令调度至耦接到该指令调度器108的各个功能单元。在本发明的一个实施 例中,指令译码器106是一个指令转变器,其将取得的程序指令转变为底层 的微指令,这些微指令被指令调度器108调度各个功能单元。这些功能单元 或执行单元包括整数执行单无124,存取单元122以及X87浮点单元 (Floating-Point Unit , FPU) 126。在其它实施例中,还可以包括其它功能 单元,如独立的浮点加法单元、MMX(MultiMedia Extens ions,多媒体扩展指 令集)单元、SSE (Streaming SIMD Extensions,单指令多数据流扩展)单元、 和/或SSE2单元。微处理器100还包括寄存器文件112,其为功能单元提供 指令操作数并从功能单元接收指令结果。微处理器1QQ还包括数据緩存器 114,其耦接至存取单元122,存取单元122緩存来自系统存储器的数据。指 令调度器108调度本发明的X87熔合乘加指令至X87浮点单元126。执行X87
熔合乘加指令时的X87浮点单元126及其操作数在图2和图3中有详细的表 述。图1也示出了熔合乘加指令的形式。该熔合乘加指令包括操作码132, 其作为在微处理器100的指令集中识别该熔合乘加指令的唯一标识。操作码 132的值是X87的操作码范围。在本发明的一实施例中,X87熔合乘加指令有 四个可能的操作码值QxD9D4、 0xD9D5、 0xD9D6、 0xD9D7。在本发明的一实 施例中,X87熔合乘加指令还明确指定了熔合乘加指令的第三操作数,如加 数(这里用"C,,表示)。根据X87的标准术语,第三个操作数这里也可以表示 为通用记法ST(i),其代表了 X87浮点单元寄存器堆栈202 (在图2示出)中的 一个寄存器,即寄存器堆栈202的栈顶下的第"i"个寄存器,其中可 以取0到7之间的值。熔合乘加指令指定另两个操作数到X87浮点单元寄存 器堆栈202中最接近栈顶的两个寄存器。图2是图1中根据本发明执行熔合乘加指令的X87浮点单元126的结构 示意图。该X87浮点单元126包括X87数据寄存器堆栈202。该X87浮点单 元寄存器堆栈202包括八个以堆栈方式组织的80bit位宽的寄存器。其中每 个寄存器包括64bit的尾数字段,15bit的指数字段以及1个符号位。栈顶 (Top-of-Stack, T0S)指针指向X87浮点单元寄存器堆栈202的栈顶寄存器的 栈顶,如图2中所示的栈顶指针TOP (Top-of-Stack Pointer)。栈顶指针包 含在X87浮点单元126的一个状态寄存器中(图中未示)。如图2所示,栈顶 指针指向的是索引值为6的寄存器。因此,这两个被指定的操作数,如这里 被表示为位于寄存器6和寄存器5的因子"A"和"B",分别位于X87浮点单 元寄存器堆栈202的栈顶的寄存器(通用的表示法是表示为ST(0))和栈顶以 下紧邻栈顶的寄存器(通用的表示法是表示为ST(l))。在图2所示的实施例 中,加法操作数"C"位于寄存器4,例如可以是X87浮点单元寄存器堆栈202 中紧邻操作数"B,,的寄存器。但是,除了在图2所示的实施例所示,程序员 也可以指定X87浮点单元寄存器堆栈202中的其它寄存器为第三操作数,而 不是紧邻操作数"B"的寄存器。X87浮点单元126包括乘法器204,其将因子"A"和"B"的尾数相乘一 产生一个128位的乘积222,乘积222提供给加法器216的第一输入端。X87 浮点单元126还包括一个第二加法器206,其接收因子"A"和"B"的指数, 并将其相加产生一个和以提供给控制逻辑电路212。控制逻辑电路212也接
收加数"C"的指数。移位器208接收操作数"C"的尾数,并在控制逻辑电 路212提供的控制信号的指示下,将所接收的操作数"C"的尾数移位。移位 器208的输出提供给加法器216的第二输入端。控制逻辑电路212控制移位 器208根据"C"的指数及"A"与"B"的指数之和将"C"的尾数移位,加 法器216将乘积222与"C"尾数的有效位相加以产生一个和。尽管图2示出 乘法器204和加法器206耦接至X87浮点单元寄存器堆栈202的接收寄存器 5和6,且移位器208和控制逻辑电路212耦接至接收寄存器4, X87浮点单 元寄存器堆栈202还包括多工器逻辑(图中未示出),其接收XS7浮点单元寄 存器堆栈202的每个寄存器的内容,并基于栈顶指针(Top-of-Stack Pointer) 以及熔合乘加指令的具体操作数来选择适当的寄存器内容提供给乘法器204, 加法器206,移位器208以及控制逻辑电路212。加法器216将其得到的加和提供给规格化及舍入电路214。该规格化及 舍入电路214将该加和规格化并舍入为标准的X87的符号位、指数、尾数格 式,根据控制逻辑电路212提供给规格化及舍入电路214的控制信号,产生 该熔合乘加指令的计算计算结果218的尾数。控制逻辑电路212根据"C"的 指数及"A"的指数与"B"指数的和,并根据加法器216的输出产生该控制 信号。控制逻辑电路212还输出该熔合乘加指令的计算结果218的指数和符 号。计算结果218被存储于该熔合乘加指令指定的存储操作数"C"的寄存器 中。在本发明的其它实施例中,计算结果218还可以存储到寄存器堆栈202 中除了栈顶的两个寄存器的其它任意一个寄存器中,甚至还可以存储到微处 理器100中其它寄存器中。在本发明的一实施例中,如图3所示,操作数"A"和"B"弹出该X87 浮点单元寄存器堆栈202。因此,如果该熔合乘加指令指定X87浮点单元寄 存器堆栈202栈顶指针(Top-of-Stack Pointer, TOP)以下的第二个寄存器 (通常记为ST(2))为"C,,操作数寄存器,则该熔合乘加指令的计算结果218 将置于X87浮点单元寄存器堆栈202如图3所示的栈顶指针(Top-of-Stack Pointer, TOP)寄存器中。现在参考图3,是图1中的微处理器100执行熔合乘加指令的步骤流程 图。流程从步骤302开始。根据本发明的一实施例,在步骤302,指令解码器106将X87熔合乘加 指令解码。如上所述,该X87熔合乘加指令指定熔合乘加操作的前两个操作
数(因子"A"和"B")到图2中的X87浮点单元寄存器堆栈202顶部的两个 寄存器ST(O) and ST(l),并指定第三个操作数(加数"C")到X87浮点单元 寄存器堆栈202的第三寄存器ST(i)。接下来执行步骤304。在步骤304,图2中的乘法器204将因子的尾数相乘产生图2中的乘积 222。另外,图2中的加法器206将"A"和"B"的指数部分相加产生一个和 以提供给图2中的控制逻辑电路212接下来执行步骤306。在步骤306,加法器216将乘积222与加数"C"的尾数被移位器208移 位以后的结果相加以产生一个和。另外,控制逻辑电路212根据"C,,的指数 及"A"与"B"的指数之和,以及根据加法器216的执行结果以产生计算结 果218的指数和符号位。接下来执行步骤308。在步骤308,参考以上图2的描述,图2中的规格化及舍入电路214将 加法器216输出的和规格化及舍入,将加法器216输出的和转化成符合X87 标准的符号位、指数、尾数格式。规格化及舍入的操作被延迟直到步骤306 的加法执行以后,如此提供的计算结果218比分别先后执行乘法,舍入和加 法操作所得的结果更精确。接下来执行步骤312。在步骤312,计算结果218被存储到X87浮点单元寄存器堆栈202中被 指定存储熔合乘加指令的第三操作数的寄存器ST(i)中。在本发明的另一实 施例中,X87浮点单元寄存器堆栈202的栈顶指针(Top-of-Stack Pointer, TOP)以下的第二个寄存器ST(2)被指定为该目的寄存器,即第三操作数寄存 器,换句话说,寄存器ST(2)紧邻在寄存器ST(1)的下方。接着执行步骤314。在步骤31.4中,该X87浮点单元126将栈顶的两个值,即操作数"A"和 "B"弹出该X87浮点单元寄存器堆栈202。因此,如果程序员指定X87浮点 单元寄存器堆栈202的栈顶指针(T叩-of-Stack Pointer, TOP)以下的第二个 寄存器ST(2)为"C,,操作数寄存器和目的寄存器,则当熔合乘加指令执行完 全完成以后,如图3所示,计算结果218就被置于X87浮点单元寄存器堆栈 202的栈顶指针(Top-of-Stack Pointer, TOP)寄存器中。步骤214完成以后 流程结束。另一方面,任何本领域技术人员,在不脱离本发明的范围内,可 在此基础上做进一步的形式上和具体实施方式
上的改进和变化,例如在步骤 308后,执行步骤314再执行步骤312。值得注意的是,用于执行一系列结果累积的程序可以包括一系列的三指 令序列。该指令序列中的三个指令包括两个指令将操作数"A"和"B"压 入X87浮点单元寄存器堆栈202的栈顶指针(Top-of-Stack Pointer, TOP) 寄存器中,接着一熔合乘加指令指定寄存器ST(2)为"C,,操作数寄存器和目 的寄存器。另外,程序也可以包括一个包含这三指令序列的循环程序。这里揭露的X87熔合乘加指令解决了熔合乘加指令需要指定三个操作数 的问题,这并不是X87指令的本来的特点。这里揭露的X87熔合乘加指令通 过指定至少两个操作数存储到X87浮点单元寄存器堆栈的栈顶的寄存器中, 解决了这个问题。尽管本发明及其对象,特点和优点已经被详细描述,本发明还包括了其 它的具体实施方式
。例如,尽管本实施例描述了 X87熔合乘加指令中指定X87 浮点单元寄存器堆栈中的寄存器用来存放该第三操作数,在其它实施例中也 描述了 X87浮点单元寄存器堆栈中的寄存器ST(2)被指定为存放该第三操作 数的寄存器。以上所述仅为本发明较佳实施例,然其并非用以限定本发明的范围,任 何本领域技术人员,在不脱离本发明的范围内,可在此基础上做进一步的形 式上和具体实施方式
上的改进和变化,例如,除了采用硬件(例如,中央处理 器、微处理器、微控制器、数字信号处理器、处理器核、片上系统(System on Chip, SOC)或其它设备)以外,还可以采用被存储在计算机可用(如可读)媒介 中的软件(如计算机可读代码、程序代码和其它形式的指令,如源语言、目标 语言或机器语言)实现。这样的软件可以实现这里揭露的装置和方法的功能、 制造、建模、仿真描述和/或测试。例如,可以通过使用通用编程语言(如 C,C++),硬件描述语言(HDL)包括Verilog HDL、 VHDL等,或其它可用程序来 实现。这样的软件可以被置于任何计算机可用的媒介中,如半导体、磁盘或 光盘(如CD-R0M、 DVD-ROM等)。该软件也可是包含在计算机可用(如可读)的 传输媒介(如载波或其他任何包含数字,光或模拟介质的传输媒介)中的一个 计算机数据信号。如图4所示,本发明的实施例还为这里描述的微处理器提 供该软件和接下来将该软件作为 一个计算机数据信号在包括互联网和内部网 的通讯网络中传输的方法。这里描述的装置和方法可能会包含在半导体 IP(intellectual property)核中,如孩t处理器核(如用HDL实现),并被转变 为集成电路中的硬件。此外,这里描述的装置和方法可以用软件结合的方法 实现。因此,本发明不应局限在上述任何一个实施例中,本发明的保护范围 当以本申请的权利要求及其均等物所界定的范围为准。
任何本领域技术人员,可在运用与本发明相同目的的前提下,使用本发 明所揭露的概念和特别实施例来作为设计和改进其他一些结构的基础。这些 变化、替代和改进不能背离权利要求书所界定的本发明的保护范围。
权利要求
1. 一种X87熔合乘加指令,存储于计算机系统存储器中,并由具有X87 浮点单元寄存器堆栈的X86体系结构的微处理器执行,该指令包括第一操作数和第二操作数,被指定存储于该X87浮点单元寄存器堆栈的 第一寄存器和第二寄存器,其中该第一寄存器和该第二寄存器是位于该X87浮点单元寄存器堆栈栈顶的两个寄存器;以及第三操作数,被指定存储于该X87浮点单元寄存器堆栈的第三寄存器中; 其中,该X87熔合乘加指令指示该微处理器将该第一操作数和该第二操作数相乘以产生乘积,并将该第三操作数和该乘积相加以产生计算结果。
2. 如权利要求1所述的X87熔合乘加指令,其特征在于,该指令还指示 该微处理器将该计算结果存储于该X87浮点单元寄存器堆栈的该第三寄存器 中。
3. 如权利要求1所述的X87熔合乘加指令,其特征在于,该指令还指示 该微处理器将该第一操作数和该第二操作数弹出该X87浮点单元寄存器堆栈。
4. 如权利要求1所述的熔合乘加指令,其特征在于,其中该第三寄存器 为该寄存器堆栈栈顶以下的第二个寄存器。
5. —种具备X87浮点单元的X86体系结构微处理器,其中该X87浮点单 元具有X87寄存器堆栈。该微处理器包括指令译码器,其对该微处理器指令集中的X87熔合乘加指令进行译码, 该熔合乘加指令包括第一操作数和第二操作数,被指定存储于该寄存器堆栈 的第一寄存器和第二寄存器,该第一寄存器和该第二寄存器是位于该寄存器 堆栈的栈顶的两个寄存器,该熔合乘加指令还包括第三操作数,被指定存储 于该寄存器堆栈的第三寄存器中;乘法器,耦接至该寄存器堆栈,其将该第一操作数和该第二操作数相乘 产生乘积,以响应该熔合乘加指令;以及加法器,耦接至该乘法器,其将该第三操作数和该乘积相加以产生一个 计算结果,以响应该熔合乘加指令。
6. 如权利要求5所述的微处理器,其特征在于,其还将该计算结果存储 于该寄存器堆栈的该第三寄存器中,以响应该熔合乘加指令。
7. 如权利要求5所述的微处理器,其特征在于,该微处理器还将该第一 操作数和该第二操作数弹出该寄存器堆栈,以响应该熔合乘加指令。
8. 如权利要求5所述的微处理器,其特征在于,其中该第三寄存器为该 寄存器堆栈栈顶以下的第二个寄存器。
9. 一种在计算设备中使用的计算机程序产品,其包括 计算机可用存储媒介,其中包含计算机可读程序代码,该程序代码提供具有X87浮点单元的X86体系结构的微处理器,其中该X87浮点单元具有X87 寄存器堆栈,该计算机可读程序代码包括第一程序代码,其提供指令译码器,将微处理器指令集中的X87熔合 乘加指令译码,其中该熔合乘加指令包括第一操作数和莱二操作数,被指定存储于该寄存器堆栈的第一寄存器和第二寄存器,该第一寄存器和该第二寄 存器是位于该寄存器堆栈的栈顶的两个寄存器,该熔合乘加指令还包括第三 操作数,被指定存储于寄存器堆栈的第三寄存器中;第二程序代码,其提供乘法器,耦接至该寄存器堆栈,该乘法器将该 第一操作数和该第二操作数相乘产生乘积,以响应该熔合乘加指令;以及第三程序代码,其提供加法器,耦接至该乘法器,其将该第三操作数 与该乘积相加以产生计算结果,以响应该熔合乘加指令。
10. 如权利要求9所述的计算机程序产品,其特征在于,其中该微处理 器还存储该计算结果到该寄存器堆栈的该第三寄存器中,以响应该熔合乘加 指令。
11.如权利要求9所述的计算机程序产品,其特征在于,其中该计算机 可读程序代码可作为计算机数据信号在网络上传输。
全文摘要
本发明是有关于一种X86体系结构的微处理器指令集中的X87熔合乘加指令。该熔合乘加指令将第一和第二操作数指定到X87浮点单元寄存器堆栈栈顶的两个寄存器中,并指定第三操作数到该X87浮点单元寄存器堆栈的第三寄存器中。该微处理器将该第一和第二操作数相乘以产生乘积,并将该第三操作数和该乘积相加以产生计算结果。该计算结果被存储于该第三寄存器中,且前两个操作数被弹出该寄存器堆栈。在本发明的另一个实施例中,该第三操作数被指定存储于该寄存器堆栈栈顶以下的第二个寄存器中,且该计算结果也被存储于此。该指令操作码的值在X87指令操作码的范围内。
文档编号G06F9/302GK101145099SQ20071016668
公开日2008年3月19日 申请日期2007年11月5日 优先权日2007年4月10日
发明者G·格伦·亨利, 特里·帕克斯, 蒂莫西·A·埃利奥特 申请人:威盛电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1