确保正确预解码的方法和设备的制作方法

文档序号:6567107阅读:170来源:国知局
专利名称:确保正确预解码的方法和设备的制作方法
技术领域
本发明大体上涉及消除处理具有多种长度的指令的处理器管线中的预解码同步错 误,且更明确地说,涉及用于填充程序代码以使得预解码引擎将可变长度指令正确地辨 识为在预解码包含内嵌数据的指令串时的指令的有利技术。
背景技术
如今处理器通常支持具有可变长度指令的指令集。举例来说,ARM⑧指令集由具有 32位长度的指令和具有16位长度的指令组成。支持可变长度指令的管线处理器可含有 预解码管线级,其用于对指令迸行部分解码,以便简化后续的解码级并因此使管线成流 线型。典型的预解码管线级以每个代码行为基础检验程序代码,对代码行进行预解码, 并将经预解码的信息连同代码行一起写入到高速缓冲存储器中。依据用于创建程序或目 标代码的编译程序,程序代码可含有内嵌数据以及指令。
内嵌数据可能恰好看起来像指令或指令的一部分。在此情况下,预解码引擎通常将 误解译内嵌数据。因此,在预解码引擎将16位的数据不正确地预解码为32位指令的第 一部分的情况下,后续16位指令接着可能又被解译为32位指令的第二半,使得无效的 经预解码的信息将存储在高速缓冲存储器中,且预解码过程可能失去与对下一指令进行 预解码的同步。通常直到后续解码级时才辨识出同步错误。这种同步错误导致当试图从 预解码错误中恢复时出现处理器延迟和无用的功率消耗。
对上述问题的常规解决方法包含提供恢复机制以使预解码引擎再同步。

发明内容
除了本发明第一实施例的若干方面之外,本发明第一实施例意识到需要一种在内嵌
数据恰好被编码为指令流中的指令时阻止预解码引擎必须再同步的技术,其中所述指令 流含有来自可变长度指令集的指令和内嵌数据。为此,此实施例包含界定等于所述指令
集中的最小长度指令的区组,和将组成所述指令集中的最长长度指令的区组的数目界定 为MAX。所述实施例进一步包含当将程序编译或汇编为所述指令串时,确定内嵌数据段 的末端,以及将长度为MAX -1的填充符插入所述指令串中,至所述内嵌数据的末端。 当对填充的指令流进行后续的预解码时,即使内嵌数据恰好类似可变长度指令集中的现
有指令或指令的一部分,预解码器也有利地维持与填充的指令流中的指令同步。从以下具体实施方式
和附图中将更全面地理解本发明以及本发明的其它特征和优点。


图1展示可有利地使用本发明实施例的示范性无线通信系统。 图2是可有利地使用本发明实施例的处理器复合体的方框图。图3展示根据其中利用固定长度填充的本发明第一实施例,含有用于具有16和32 位的指令大小的变化长度指令集的填充符的说明性程序段。图4展示根据本发明第一实施例,含有用于具有8、 16、 24和32位的指令大小的变 化长度指令集的三个填充字节的说明性程序段。图5展示根据其中利用可变长度填充的本发明第二实施例,含有用于具有8、 16、 24和32位的指令大小的变化长度指令集的两个填充字节的说明性程序段。图6展示根据本发明第二实施例,含有用于具有8、 16、 24和32位的指令大小的变 化长度指令集的一个填充字节的说明性程序段。图7是根据本发明的教示的执行软件的计算机的方框图。图8是根据本发明实施例进行操作的处理器管线的方框图。图9说明根据本发明实施例对于恒定大小填充的可伸縮编码方法。图10是说明根据本发明第一实施例将恒定大小填充符插入程序代码中的方法的流 程图。图ll是说明根据本发明第二实施例将可变大小填充符插入程序代码中的方法的流程图。
具体实施方式
现将参看附图更充分地描述本发明,附图中展示本发明的若干实施例。然而,本发 明可以各种形式实施,且不应解释为限于本文陈述的实施例。事实上,提供这些实施例 以使得本发明将是详尽和全面的,且将把本发明的范围完全传达给所属领域的技术人员。将了解,本发明可实施为方法、系统或计算机程序产品。因此,本发明可采取硬件 实施例、软件实施例或组合软件与硬件方面的实施例的形式。此外,本发明可采取计算 机可用存储媒体上的计算机程序产品的形式,所述计算机可用存储媒体具有内嵌在媒体 中的计算机可用程序代码。可利用任何合适的计算机可读媒体,包含硬盘、CD-ROM、光学存储装置、快闪存储器或磁性存储装置。
根据本发明教示,可用例如C、 C++、原始汇编程序、JAVA⑧、Smalltalk、 JavaScript 、 Visual Basic 、 TSQL、 Perl的编程语言或用各种其它编程语言初始编写可编译、汇编、 编译或汇编之后进行预解码等的计算机程序代码。程序代码或计算机可读媒体是指例如 目标代码的其格式可由处理器理解的机器语言代码。本发明的软件实施例不依赖于其以 特定编程语言进行的实施方案。图l展示可有利地使用本发明实施例的示范性无线通信系统100。出于说明的目的, 图1展示三个远程单元120、 130和150以及两个基站140。将了解,典型的无线通信系 统可具有更多的远程单元和基站。远程单元120、 130和150包含分别执行程序代码125A、 125B和125C的硬件组件。如下文进一步论述,根据本发明教示来修改程序代码125A、 125B和125C。图1展示从基站140到远程单元12、 13和15的前向链路信号180,以及 从远程单元12、 13和15到基站140的逆向链路信号190。图1中,在无线本地环路系统中,远程单元120展示为移动电话,远程单元130展 示为便携式计算机,且远程单元150展示为固定位置远程单元。举例来说,远程单元可 以是手机、手持式个人通信系统(PCS)单元、例如个人数据助理的便携式数据单元, 或例如仪表读数设备的固定位置数据单元。尽管图1说明根据本发明教示的远程单元, 但本发明不限于这些所说明的示范性单元。本发明可合适地用于任何管线处理环境中, 其中利用预解码级或引擎来对包含可变长度指令和内嵌数据的指令串进行预解码。图2展示可有利地使用本发明实施例的处理器复合体200。处理器复合体200可合 适地用于执行并存储根据本发明教示修改的程序代码125A-C。处理器复合体200包含中 央处理单元(CPU) 240、 1级数据高速缓冲存储器230、 1级指令高速缓冲存储器220, 和2级指令与数据高速缓冲存储器210。 CPU 240耦合到1级数据高速缓冲存储器230、 1级指令高速缓冲存储器220和2级高速缓冲存储器210。 CPU 240在预解码级期间对程 序代码进行预解码并将经预解码的信息与程序代码一起写入1级指令高速缓冲存储器 220,或者如果1级指令高速缓沖存储器已满,那么写入2级高速缓冲存储器210。CPU 240以层级型式从高速缓冲存储器检索指令和数据。举例来说,当CPU240需要获取指令时, CPU 240将访问1级指令高速缓冲存储器220以确定匹配。如果1级指令高速缓冲存储 器220中不存在匹配,那么CPU 240将访问2级指令与数据高速缓冲存储器210。类似 地,当CPU 240需要获取数据时,CPU 240将访问1级数据高速缓冲存储器230以确定 匹配。如果1级数据高速缓冲存储器230中不存在匹配,那么CPU 240将访问2级指令 与数据高速缓冲存储器210。本发明实施例不限于所说明的处理器复合体200,且可进一
步适用于(举例来说)利用预解码引擎的任何处理器复合体,例如任何精简指令集计算 机(RISC)处理器。将了解,本发明不限于RISC环境。图3展示根据其中插入恒定长度填充的本发明第一实施例,含有填充符的说明性程 序段300。程序段300可合适地存储为2级高速缓冲存储器(例如,2级高速缓冲存储器 210)的(一或多个)高速缓冲存储器线,或存储在程序存储器中。应注意,尽管出于说 明的口的,假定从(一或多个)高速缓冲存储器线中检索程序段,但本发明教示适用于 与从中检索程序段的存储器装置无关地处理程序段。由于高速缓冲存储器线通常具有固 定长度,所以术语"指令串"或"指令流"通常涉及可或可不跨越高速缓冲存储器线的 边界的一个或一个以上程序段。此外,程序段300还可说明高速缓冲存储器线的一部分。说明性程序段300包含指令310、内嵌数据320,和填充符330。指令310来自可变 长度指令集。图3中说明来自可变长度指令集的若干示范性指令。在此实例中,可变长 度指令集中的指令为16或32位长。出于说明性目的,字节指示符305说明高速缓冲存 储器线中指令开始的字节位置,并指示指令的大小。举例来说,LOADOA指令开始于字 节位置00并结束于字节位置03。因此,LOAD OA是32位指令。类似地,ADD指令为 16位长,且BRANCH指令为32位长。在程序段300中,内嵌数据字节322和324在 BRANCH指令之后。根据本发明教示,在数据字节324之后插入填充符330的填充字节 332和334。 ADD指令336在填充字节334之后。内嵌数据320不是即时数据,且通常与程序段中的附近指令(例如,LOAD指令312) 有关。通常,内嵌数据的局域性对于标准编译程序来说是便利性的问题。许多标准编译 程序(例如,ARM⑧编译程序)通常在程序段内产生内嵌数据320。标准编译程序可能内 嵌与邻近指令无关的数据的一个原因是允许附近的指令较容易地访问数据空间。举例来 说,当寻址数据时,将允许载入指令使用较少的偏移位,参看图3, LOAD 0A指令312 载入在偏移OA处开始的数据字节322和324。为了以举例的方式说明本发明的有利特征,我们首先描述内嵌数据320恰巧与32位 LOAD指令的第一两个字节相似且尚未添加填充符330的情形。在此状况下;在管线处 理器的预解码操作期间,预解码器通过一次检验16位而检验高速缓冲存储器线的指令, 而处理所述高速缓冲存储器线。预解码器对每一指令进行部分解码,并随后将整个高速缓冲存储器线连同经预解码 的信息一起写回到高速缓冲存储器(例如,1级指令高速缓冲存储器220),且如果l级 高速缓冲存储器已满,那么写回到2级高速缓冲存储器210。通常,经预解码的信息可
包含例如以下信息指令在高速缓冲存储器线中的哪个位置开始以用于后续的解码操作、 指令是载入指令还是存储指令、指令是否为算术、指令是较大指令的第一半还是第二半、 指令是否复杂等。由于存在我们已假定为与LOAD指令的第一部分相似的内嵌数据320 的缘故,内嵌数据将被预解码器不正确地解译为LOAD指令的一部分。在此实例中,后 续的ADD指令336将被不正确地预解码为LOAD指令的第二半。转向如图3所示添加有填充符330时预解码器的操作,预解码器将以每个区组为基 础步进通过高速缓冲存储器线300。区组是等于可变长度指令集中的最短长度指令的大 小的量度单位。对于此实例,指令集含有16位和32位的长指令。因此, 一个区组等于 16位。通常,对于指令集来说,内嵌数据的大小是区组的倍数。关于程序段300,预解 码器首先检验第一区组,LOAD0A指令312的第一 16位,随后是第二区组,LOAD OA 指令312的第二16位。其次,预解码器检验下一区组,16位ADD指令的16位。第三, 预解码器检验下一区组,BRANCH OE指令的第一 16位,随后是下一区组,BRANCH 0E 指令的第二16位。由于内嵌数据320看起来像LOAD指令的第一 16位,所以预解码器 对内嵌数据320进行预解码,随后对填充符330进行预解码,如同它们一起构成32位 LOAD指令。因此,由于根据本发明教示而插入的填充符的缘故,预解码器有利地维持 与高速缓冲存储器线中的下一指令同步,使得当其检验下一区组(开始于字节位置OE的 ADD指令)时,其正确地辨识出ADD指令。如上文所论述,在没有插入的填充符的情 况下,预解码器将对ADD指令336进行预解码,如同其是LOAD指令的其余16位,从 而导致预解码器不正确地预解码ADD指令336且还可能不正确地预解码后续指令。一旦已预解码高速缓冲存储器线,就将高速缓冲存储器线和预解码信息写入高速缓 冲存储器并准备用于后续的解码和执行操作。应注意,预解码器可能由于将内嵌数据和 填充符330预解码为LOAD指令的其余16位而产生一些无效的预解码信息。此类无效的 预解码信息毫无意义,因为当程序实际执行时,由于程序流的缘故,程序计数器将不会 被引导以执行内嵌数据或内嵌填充符。举例来说,在执行指令BRANCH 0E之后,程序 计数器将指向地址0E并促使接着执行ADD指令336,从而避开内嵌数据320和填充符 330以及任何相关联的无效的预解码信息。图4展示根据本发明第一实施例含有用于具有8、 16、 24和32位的指令大小的变化 长度指令集的三个填充字节的说明性程序段400。程序段400可合适地存储为2级高速 缓冲存储器(例如,2级高速缓冲存储器210)的高速缓冲存储器线的一部分、高速缓冲 存储器线,或多个高速缓冲存储器线。或者,程序段400可存储在某一其它形式的程序
存储器中。程序段包含指令410、内嵌数据420,和填充符430。在此实例中,指令410 来自具有8、 16、 24或32位长的长度的可变长度指令集。可变长度指令集的区组大小为 8位或1个字节。出于说明的目的,字节指示符405说明高速缓冲存储器线中的字节位 置。在程序段400中,内嵌数据420在16位BRANCH指令414之后。根据本发明教示, 在数据字节426之后分别在字节位置09、 OA和OB处插入填充符430的填充字节432、 434和436。存储(STOR)指令416 (8位指令)在填充字节436之后,并开始于字节位 置OC。相乘(MULT)指令418 (24位指令)开始于下一字节位置0D。由于在此实例中最小指令是一个字节,所以一区组是一个字节。预解码器在处理程 序段400时将一次检验一个区组。对于图4-6的所有程序段400、 500和600中的每一者, 预解码器以相同方式对相应程序段的第一 8个字节进行操作。为了简化论述,我们将参 看图4描述对所述8个字节的操作。预解码器将检验LOAD06指令412的第一区组,辨 识出第一区组是LOAD指令,并循序地检验来自高速缓冲存储器线的下一三个区组(字 节位置01-03)以对LOAD 06指令412迸行预解码。预解码器接着将检验BRANCH 0C 指令414的第一区组,辨识出第一区组是BRANCH 0C指令,并循序地检验来自高速缓 冲存储器线的下一区组(字节位置05)以对BRANCH OC指令414进行预解码。以与变 化长度指令集中的任何指令不同的方式编码数据字节422和424。因此,预解码器将检 验字节位置06处的区组,辨识出其含有数据并继续下一步。其继续检验字节位置07处 的下一区组(数据字节424),并正确地辨识出数据字节424也含有数据。对于图4中所说明的实例,数据字节426恰巧类似于32位指令(例如,LOAD指令) 的第一8位。因此,在预解码器将数据字节426预解码为32位LOAD指令的第一部分之 后,预解码器将考虑下一 3个区组(填充字节432、 434和436),如同所述三个字节是 此一致的LOAD指令的其余部分。由于填充符430的缘故,下一指令(STOR指令416) 将被正确预解码,因此维持预解码器与高速缓冲存储器线中的指令之间的同步。在不插 入填充符430的情况下,预解码器将对应于STOR指令416和MULT指令418的字节误 解为对应于一致的LOAD指令的最后3个字节的字节,从而导致预解码器将STOR指令 416预解码为一致的LOAD指令的第二字节,且将MULT指令418的第一两个字节预解 码为一致的LOAD指令的最后两个字节,因此导致预解码器失去与高速缓冲存储器线中 的指令的同步。作为另一实例,如果图4的数据字节426经编码以恰巧类似于24位指令(例如, MULT指令)的第一8位,那么预解码器将检验下一两个区组(填充字节432和434), 如同所述两个字节属于一致的MULT指令。预解码器接着将检验下一区组,填充字节436。 如果如下文进一步处理,填充字节436被编码为8位指令或编码为与指令集不同的数据, 那么预解码器将检验在字节位置OC处存在的下一区组,STOR指令416。此实例说明不 管数据字节426如何被误解,填充符430均保持辨识内嵌数据之后的指令的完整性。图5展示根据其中使用变化的填充符大小的本发明第二实施例,含有用于具有8、 16、 24和32位的指令大小的变化长度指令集的两个填充字节的说明性程序段500。图5 说明依据类似于一指令的内嵌数据会如何被预解码器误解,可如何将另一大小的填充符 插入程序代码中。使用变化长度的填充符有利地减小了程序代码大小。程序段500包含 指令510、数据520和填充符530。程序段500与程序段400相同,只是程序段500在填 充符530中少了一个填充字节,且因此,填充字节534之后的指令在高速缓冲存储器线 中上移一个字节位置。由于所述移位,BRANCH OB指令514的目标地址递减一个字节。图5中所说明的实例涉及数据字节526,其恰巧类似于可变长度指令集中的24位指 令的第一8位。因此,当预解码器开始预解码数据字节526时,预解码器将检验下一两 个区组(填充字节532和534),如同所述两个字节是一致的24位指令的其余部分。预 解码器接着将检验下一区组(STOR指令516)以进行预解码,从而维持预解码器与高速 缓冲存储器线中的指令之间的同步。在图5中所说明的实例中,两字节的填充符已足够,. 而不是图4中所使用的三字节的填充符。在不插入填充符530的情况下,预解码器将对应于STOR指令516和MULT指令518 的区组误解为对应于一致的24位指令的最后两个字节的字节,从而导致预解码器与高速缓冲存储器线不同步。因此,辨识内嵌数据之后的指令的完整性受损。图6展示根据本发明第二实施例含有用于具有8、 16、 24和32位的指令大小的变化长度指令集的一个填充字节的说明性程序段600。图6说明依据数据会如何被预解码器 误解,可如何仅将一个填充字节插入程序代码中。程序段600包含指令610、数据620 和填充符630。程序段600与程序段500相同,只是程序段600在填充符630中少了一 个填充字节,且因此,填充字节632之后的指令在高速缓冲存储器线中上移一个字节位 置。由于所述移位,BRANCH OA指令614的目标地址递减一个字节。图6中所说明的实例涉及数据字节626,其恰巧类似于可变长度指令集中的16位指 令的第一8位。当预解码器开始预解码数据字节626时,预解码器将检验下一区组(填 充字节632),如同填充字节632属于由数据字节626指示的16位指令。预解码器接着 将检验下一区组(STOR指令616)以进行预解码,从而维持预解码器与高速缓冲存储器
线中的指令之间的同步。在图6中所说明的实例中,由于数据字节632类似于16位指令 的第一8位,所以一个字节大小的填充符将已足够。如结合图5和6描述的实例中所示,在内嵌数据之后插入的填充符的大小可变化。 由于在计算机上执行的软件编译程序或汇编程序以较高级的编程语言产生具有如图3_6中所说明的指令和内嵌数据的程序代码,所以内嵌数据无论何时类似于来自变化长度指 令集的指令,编译程序或汇编程序均可辨识出,并相应地插入填充符。如下文进一步论 述,可应用固定长度或变化长度的填充符。图7是根据本发明教示执行软件730的计算机710的方框图700。尽管未说明,但 计算机710包含例如处理器、存储器、输入/输出装置等内部组件,以及用于在这些内部 组件之间通信的总线。软件730可合适地为根据本发明教示而修改的编译程序或汇编程 序。软件730驻存在计算机710的存储器中。软件730接收程序720作为输入,并产生 具有根据本发明插入的填充符的经编译或汇编的程序代码740作为输出。可用C、 C++、 原始汇编程序、JAVA 、 Smalltalk、 JavaScript 、 Visual Basic 、 TSQL、 Perl或用各种 其它编程语言编写程序720。写入程序720,以当程序代码740在例如包含在手机、手持 式PCS单元、计算机和便携式数据单元中的目标处理器上执行时实现所述目标处理器上 的特定功能。目标处理器可不同于执行软件730的计算机710,或可与其相同。软件730包含解析装置,其解析程序720以确定程序720的结构内容以及程序720 在句法上是否有效。所述解析装置还将程序720转换为内部形式。软件730进一步包含 代码产生装置。所述代码产生装置将内部形式转译为可由目标处理器执行的目标代码。 所述目标代码由具有内嵌数据和来自可变长度指令集的指令的一个或一个以上程序段组 成。软件730进一歩包含插入装置,其在内嵌数据段的末端处插入填充符。为了计算待插入在内嵌数据与后续指令之间的填充大小,软件730包含任选的分析 装置,其分析内嵌数据段的内容。内嵌数据段是内嵌在指令流中被指令包围的数据。软 件730进一步包含任选的辨识装置。在编译程序720期间,辨识装置辨识内嵌数据段内 的任何区组是否经编码而类似于指令集中指令的区组。如果是,那么插入装置考虑到内 嵌数据的区组所类似的指令长度和内嵌数据的区组相对于后续指令的位置而在内嵌数据 之后插入一定数目的填充区组。或者,软件730视情况可包含插入装置,其插入恒定大小的填充符。此替代方法由 于不必分析内嵌数据编码而有利地减小了软件730的复杂性。在此替代实施例中,软件 730包含检测装置,其检测内嵌数据段的末端与指令之间的过渡。只要辨识出从内嵌数 据段到指令的过渡,插入装置接着就插入具有恒定数目的填充区组的填充符。所插入的 填充符的每一填充区组可合适地经编码以含有指令集中巳界定的具有一个区组长度的有 效指令,或者可仅含有具有不与指令集中的任何指令类似的编码的数据。下文将结合对 图9的论述进一步论述替代的填充符编码。为了确定组成待插入在程序代码740中的恒定大小的填充符的填充区组的数目,软 件730利用目标处理器所支持的组成指令集的各种长度的指令。组成恒定大小的填充符 的填充区组的数目可写为-Pz = (Max(instrlen) - Min(instrlen)) / Min(instrlen)(1) 其简化为Pz = (Max(instrlen) / Min(instrlen)) -1 ,且为了简便,(2)MAX = (Max(instrlen) / Min(instrlen)),因此简化,(3)Pz = MAX-l (4)其中Pz是填充大小(以区组计),Max(instrien)是最长指令的长度(以位计), Min(instrlen)是最短指令的长度(以位计),且MAX是最长指令的长度(以区组计)。举 例来说,在具有32和16位指令的指令集中, 一个区组等于16位(最短长度指令)。以 区组计的填充的数目将为(32 [位]/16 [位/区组])-1,其等于1个区组或16位。因此,只 要数据与下一指令之间存在过渡,就可插入含有取自指令集的16位指令的填充符。举另一实例,在具有32、 16和8位指令的指令集中, 一个区组等于8位(最短指令)。 以区组计的填充的数目将等于(32[位]/8[位/区组])-l,其等于3个区组或24位。因此, 只要数据与下一指令之间存在过渡,接着就可插入24位填充符。下文结合对图9的论述 进一步描述24位填充符的组成部分的其它可能的变化形式。下文结合图11描述可变长 度填充的内容。图8是根据本发明实施例进行操作的处理器管线800的方框图。处理器管线800包 含1级高速缓冲存储器获取级810、 2级高速缓冲存储器获取820、预解码器830、写入 级840、指令对准级850,和解码并执行级860。在1级高速缓冲存储器获取级810处,基于地址从1级高速缓冲存储器获取高速缓 冲存储器线。高速缓冲存储器线可含有一个或一个以上程序段,其可能类似于图3-6中 所说明的示范性程序段。如果存在高速缓存未中,那么如获取级820所示从2级高速缓
冲存储器获取高速缓冲存储器线,并将其转发到预解码器830。预解码器830识别组成 高速缓冲存储器线中的指令的区组的数目。预解码器830利用所述数目的区组对指令执 行适当的预解码。 一旦预解码指令完成,就将所得的预解码信息临时存储在缓冲器中, 且预解码高速缓冲存储器线中的下一指令。如果高速缓冲存储器线中没有更多区组要处 理,那么管线继续行进到写入级840。在写入级840处,将经预解码的信息和高速缓冲 存储器线写入1级高速缓冲存储器。预解码器830并行地将高速缓冲存储器线和预解码 信息转移到指令对准级850。在指令对准级850处,使高速缓冲存储器线中的指令对准 并准备用于后续的解码并执行级860。应注意,预解码器830不对不与指令类似的内嵌数据进行预解码。然而,如果内嵌 数据确实与指令类似,那么可对内嵌数据且可能对填充符进行预解码。如上所述,此类 无效的预解码信息毫无意义,因为当程序实际执行时,由于程序流的缘故,程序计数器 将不会被引导以执行内嵌数据或内嵌填充符。本发明实施例不限于所说明的管线800, 且进一步适用于包含对可变长度指令集进行预解码的预解码操作的任何管线处理器。对于如图3-6所示的程序段,除非将区组辨识为指令集中的指令,否则预解码器将 以每个区组为基础对程序段进行操作。当将区组辨识为指令集中的指令时,检验一个或 一个以上额外区组以对整个指令进行预解码。通过编码填充符的内容以类似于指令集中 的指令,预解码器可更有效地跟踪到下一指令。图9说明根据本发明实施例对于用于具有32、 24、 16和8位指令的指令集的恒定大 小填充900的可伸缩编码方法。根据上述公式(2),对于此特定可变长度指令集来说, 最大大小填充为3个区组或字节。只要在内嵌数据与后续指令之间发现过渡,就将在内 嵌数据的末端处插入填充900。此填充卯0可由将不会被辨识为指令的区组的数据组成。 或者,填充符卯0可由取自指令集的指令的变化组合组成。举例来说,填充符可含有三 个8位指令或可伸缩编码。可伸缩编码可含有经编码以被辨识为24位指令的第一字节的 第一字节910、经编码以被辨识为16位指令的第一字节的第二字节920,和经编码以被 辨识为8位指令的第三字节930。通过24位填充900的伸縮编码,预解码器830将能够 与24位填充符900之后的后续指令同步,而不管预解码操作由于将内嵌数据不正确地解 码为指令而在24位填充中何处终止。图IO是说明根据本发明第一实施例将恒定大小填充符插入程序代码(例如,程序代 码740)中的方法1000的流程图。如上所述在计算机710上执行的软件730可实施方法 1000的步骤。在步骤1010处,所述方法分析管线处理器所支持的可变长度指令集的长
度以确定填充符的大小。在步骤1010处,使用上述等式(2)来确定填充符的大小。在 步骤1015处,确定填充符的内容。 一个实例是使填充符由来自指令集的长度等于填充符 大小的已知指令组成。举例来说,在具有16和32位指令两者的可变长度指令集中,填 充符大小为16位。因此,从指令集中选择16位指令以作为填充符而插入。在另一实例 中,通过从指令集中选择最短指令并将其多次连接直到其达到与填充符相同的大小为止, 来构造所述填充符。另一实例将是设计可伸缩编码或从指令集中选择可伸缩指令(如果 存在的话),如图9所述。在另一实例中,填充符可含有不同于指令集中的指令的数据。 如上文结合图3所述,由于对内嵌数据或填充符进行预解码而产生的预解码信息毫无意 义,因为程序流将不会正常地促使执行内嵌数据或填充符。将了解,或者可修改执行级 以在执行级试图执行内嵌数据或填充符的不太可能的情形下辨识出填充符。在步骤1020处,在通过软件编译程序或汇编程序产生程序代码的步骤期间,所述方 法确定内嵌数据与下一指令之间是否存在过渡点。如果没有内嵌数据,那么所述方法进 行到步骤1040。如果存在内嵌数据,那么所述方法进行到步骤1030。在步骤1030处, 将填充符插入程序代码中,位于内嵌数据与下一指令之间的过渡点处。在步骤1040处, 所述方法确定程序代码的产生是否完成。如果是,那么方法1000结束,且已产生其中插 入有填充符的程序代码。如果不是,那么方法1000进行到步骤1020,其中其继续在内 嵌数据与后续指令之间的过渡处插入填充符。当所述方法完成时,所产生的程序代码将含有填充符以便允许预解码器在内嵌数据类似于指令时将可变长度指令正确地辨识为指 令。图11是说明根据本发明第二实施例将可变大小填充符插入程序代码中的方法iioo 的流程图。如上所述,在计算机710上执行的软件730可实施方法1100的步骤。在步骤 1110处,所述方法分析可变长度指令集以确定一区组等于最短指令的大小。或者,所述 方法可仅知道或被告知区组的大小。此步骤可实施为在软件730上设定编译程序选项, 其通知软件730指令集中的最短长度指令。或者,由于软件730产生包含来自指令集的 指令的程序代码,所以软件730可能已知道最短指令的长度,使得此步骤仅涉及在软件 730的执行期间读取一变量以确定一个区组的大小。在步骤1120处,在将程序代码编译 或汇编为指令流期间,方法IIOO确定内嵌数据的一区组(例如指令流中的常数)是否经 编码以类似于来自变化长度指令集的指令。如果不是,那么方法1100进行到步骤1125。 在步骤1125处,所述方法确定编译或汇编是否完成,如果是,那么方法1100结束。否 则,方法1100通过进行到步骤1120而继续。
返回步骤1120,如果内嵌数据的一区组经编码使得其类似于一指令,那么方法IIOO 进行到步骤1130。在步骤130处,方法1100检査指令流的下一X-1个区组,其中X是 类似指令的大小(以区组计)。在步骤1135处,方法IIOO通过检查在经编码以类似于一 指令的内嵌数据的区组之后开始的下一 X-l个区组,而确定内嵌数据与下一指令之间的 过渡之后的区组数目N (如果存在的话)。换句话说,此确定步骤考虑到后续预解码器为了完成对内嵌数据的区组所类似的指 令进行预解码而将要检验的区组的数目。举例来说,如果区组是一个字节且数据的区组 类似于32位指令的第一字节,那么方法1100检査来自指令流的下三个字节,以确定是 否存在从内嵌数据到下一指令的过渡。方法1100进行到步骤1138,其中其确定N是否大于零。如果N不大于零,那么类 似于指令的内嵌数据的区组将与后续预解码器毫无关系,因为由于潜在的预解码错误引 起的位移量仍在具有类似指令的内嵌数据内。因此,所述方法进行到步骤1125。如果N 大于零,那么所述方法进行到步骤1140。在步骤1140处,方法1100将填充符插入内嵌 数据与下一指令之间的过渡中。所插入的填充符的大小N等于通过步骤1130中发现的内 嵌数据与下一指令之间的过渡的区组数目。当所述方法完成时,所产生的程序代码将含有填充符以便允许预解码器在内嵌数据类似于指令时将可变长度指令正确地辨识为指 令。由于图5展示方法1100的说明性结果,所以让我们参看图5例如没有填充符530的 情况。回想到数据字节526恰巧类似于24位指令的第一8位且一个区组等于8位,方法 1100将检査数据字节526之后的下一 X-l个或两个区组。在检查第一区组时,方法IIOO 将辨识8位STOR指令516并确定发生了从内嵌数据到指令的过渡。在检査第二区组时, 方法1100将辨识MULT指令518的第一字节。由于MULT指令518的第一字节距离过 渡有两个区组,所以N等于两个区组。因此,接着如图6所示将两个区组的填充符530 插在过渡处。当编译或汇编完成时,程序代码可含有具有不同长度的插入填充符。虽然在实施例的情境下揭示了本发明,但将认识到,所属领域的一般技术人员可使 用与上文的论述和所附权利要求书相一致的多种实施方案。
权利要求
1.一种确保指令串的正确预解码的方法,所述指令串含有来自指令集的指令和内嵌数据段,所述指令集具有变化长度的指令,所述指令集中的最小指令的长度界定一区组,组成所述指令集中最长长度指令的区组的数目界定数目MAX,所述方法包括当将程序编译或汇编为所述指令串时,确定第一内嵌数据段的末端;以及将长度为MAX-1的填充符插入至所述第一内嵌数据段的末端。
2. 根据权利要求l所述的方法,其中所述填充符经编码以不同于所述指令集中的任何 指令。
3. 根据权利要求l所述的方法,其中所述填充符经编码以包含来自所述指令集的彼此 连接的多个指令。
4. 根据权利要求l所述的方法,其中可伸縮地编码所述填充符。
5. 根据权利要求4所述的方法,其中所述最长指令是32位,所述最短指令是8位, 其它指令是24和16位,所述填充符是三个字节,且所述可伸縮编码的填充符具有 看起来像24位指令的第一字节的第一字节、看起来像16位指令的第一字节的第二 字节和看起来像8位指令的第三字节。
6. 根据权利要求1所述的方法,其中所述确定所述内嵌数据段的末端的步骤进一步包 括辨识所述指令串中的后续指令位于所述内嵌数据段之后时的过渡。
7. 根据权利要求l所述的方法,其中所述最短指令是8位。
8. 根据权利要求1所述的方法,其进一步包括确定第二内嵌数据段的末端,以及将长度为MAX-1的填充符插入至所述第二内嵌段的所述末端。
9. 根据权利要求1所述的方法,其中所述最短指令是16位。
10. 根据权利要求9所述的方法,其中所述最长指令是32位。
11. 一种确保指令串的正确预解码的方法,所述指令串含有来自指令集的指令和内嵌数 据,所述指令集具有变化长度的指令,所述指令集中的最小长度指令界定一区组, 所述方法包括确定内嵌数据的区组是否经编码以类似于所述指令集中的指令; 至少检查所述指令串的下一X-1区组,其中X是所述类似指令的区组大小; 确定内嵌数据与下一指令之间的过渡之后的区组的数目Y;以及 如果Y大于0,那么在所述过渡之后插入大小为Y的填充符。
12. 根据权利要求11所述的方法,其中所述填充符经编码以不同于所述指令集中的任何 指令。
13. 根据权利要求11所述的方法,其中所述填充符经编码以包含来自所述指令集的彼此 连接的多个指令。
14. 根据权利要求ll所述的方法,其中可伸縮地编码所述填充符。
15. 根据权利要求ll所述的方法,其中所述最短指令是8位。
16. 根据权利要求ll所述的方法,其中所述最短指令是16位。
17. —种计算机可读媒体,其内容确保所述计算机可读媒体的正确预解码,其包括.-内嵌数据;填充符,其与所述内嵌数据邻接;以及一个或一个以上连续指令,其来自可变长度指令集并与所述填充符邻接。
18. 根据权利要求17所述的计算机可读媒体,其中所述可变长度指令集中的最小指令 的长度界定一区组,且最大指令的长度是一个或一个以上区组的倍数MAX,其中 所述填充符大小等于MAX - 1个区组。
19. 一种用于确保指令串的正确预解码的计算机系统,所述指令串含有来自指令集的指 令和内嵌数据,所述指令集具有变化长度的指令,所述指令集中的最小长度指令界 定一区组,组成所述指令集中最长长度指令的区组的数目界定数目MAX,所述计 算机系统包括用于检测连续指令位于内嵌数据之后的过渡的装置;以及 用于在所述内嵌数据之后插入长度为MAX - 1的填充符的装置。
20. —种计算机可读媒体,其内容促使计算机系统执行将填充符插入指令串中,所述指 令串含有来自可变长度指令集的指令和内嵌数据,所述计算机系统具有用于通过执 行以下步骤来编译程序代码的程序,所述指令集中的最小长度指令界定一区组,所 述步骤包括确定组成所述指令集中最长长度指令的区组的数目MAX; 检测连续指令位于内嵌数据之后的过渡;以及 在所述内嵌数据后插入长度为MAX - 1的填充符。
全文摘要
本发明揭示用于确保指令的同步预解码的技术。指令串含有来自可变长度指令集的指令和内嵌数据。一种技术包含将一区组界定为等于所述指令集中的最小长度指令,和将组成所述指令集中最长长度指令的区组的数目界定为MAX。所述技术进一步包含当将程序编译或汇编为所述指令串时,确定内嵌数据段的末端,以及将长度为MAX-1的填充符插入所述指令串中所述内嵌数据的末端。当对所述填充的指令串进行预解码时,即使内嵌数据恰好经编码而类似于所述可变长度指令集中的现有指令,预解码器也维持与所述填充的指令串中的指令同步。
文档编号G06F9/30GK101160560SQ200680012922
公开日2008年4月9日 申请日期2006年2月24日 优先权日2005年2月25日
发明者托马斯·安德鲁·萨托里乌斯, 杰弗里·托德·布里奇斯, 罗德尼·韦恩·史密斯, 詹姆斯·诺里斯·迪芬德尔费尔 申请人:高通股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1