用于将客户架构的客户指令转换为主机架构的至少一个主机指令的系统和方法与流程

文档序号:15626985发布日期:2018-10-09 23:13阅读:246来源:国知局

本技术涉及用于将客户架构的客户指令转换为主机架构的至少一个主机指令的系统和方法。



背景技术:

已知提供具有主机架构并且被布置为执行指令序列的主机数据处理系统以便执行数据处理操作。通常,将定义主机指令集架构,并且使用该主机指令集架构的指令构建的程序然后可以在主机系统上直接执行。

然而,提供使用与将在主机数据处理系统上执行的客户架构相关联的客户指令来编写代码的能力也是有用的。具体地,已知提供代码转换技术(通常被称为二进制转换技术)来将客户架构的指令转换为主机架构的指令,以便当主机指令的结果序列在主机架构上执行时,它们将实现原始客户指令所要求的功能。

可能会出现可能不利地影响这类代码转换的效率的许多问题,例如,导致实现原始客户指令的功能所需的主机指令的数量的显著增加。例如,可能是以下情况,与客户架构相关联的一些状态与主机架构的状态不同,和/或客户架构中的一些指令以与主机架构中的等同指令不同的方式来更新状态。为了确保正确地使用状态数据和/或根据需要来更新状态数据,可能需要构建相当复杂的主机指令序列以便表示一些客户指令。

因此,将期望提供用于将客户架构的指令转换为主机架构的至少一个主机指令的更高效的机制。



技术实现要素:

根据一个示例配置,提供了一种将客户架构的客户指令转换为主机架构的至少一个主机指令的计算机实现的方法,包括:提供多个表示状态,每个表示状态提供来自客户架构的状态的至少一个条目的在主机架构中的表示;确定当前表示状态,当前表示状态是该多个表示状态中的一个表示状态;以及根据当前表示状态将客户指令转换为所述至少一个主机指令。

根据另一示例配置,提供了一种包括计算机程序的非暂态计算机程序产品,当在计算机上执行时,该计算机程序执行根据上述示例配置的将客户架构的客户指令转换为主机架构的至少一个主机指令的计算机实现的方法。

在又一示例配置中,提供了一种用于将客户架构的客户指令转换为主机架构的至少一个主机指令的系统,包括:存储装置,该存储装置标识来自多个表示状态的当前表示状态,每个表示状态提供来自客户架构的状态的至少一个条目的在主机架构中的表示;以及转换电路,该转换电路根据当前表示状态将客户指令转换为所述至少一个主机指令。

在又一示例配置中,提供了一种用于执行包括客户架构的客户指令的客户程序的数据处理装置,该数据处理装置具有主机架构并且包括根据上述示例配置的用于将客户架构的客户指令转换为主机架构的主机指令的系统。

在又一示例配置中,提供了一种用于将客户架构的客户指令转换为主机架构的至少一个主机指令的系统,包括:用于标识来自多个表示状态的当前表示状态的装置,每个表示状态提供来自客户架构的状态的至少一个条目的在主机架构中的表示;以及用于根据当前表示状态将客户指令转换为所述至少一个主机指令的装置。

附图说明

将参考如在附图中示出的实施例通过仅示例的方法来进一步描述本技术,在附图中:

图1a是在其中可以采用所述实施例的技术的主机数据处理系统的框图;

图1b示意性地示出了根据一个实施例的用于在图1a的主机系统的主机架构上执行的客户程序的转换;

图2是提供根据一个实施例的二进制转换过程的总体概述的流程图;

图3是更详细地示出根据一个实施例的二进制转换的操作的流程图;

图4a示出了根据一个实施例的用于示例客户架构和主机架构的寄存器术语;

图4b示意性地示出了根据一个实施例的一些客户指令到等同主机指令的转换;

图4c提供了若未使用所述实施例的方法则可以如何将客户架构的ands指令转换为等同主机指令的代表性图示;

图5a示出了可以根据一个实施例来提供以表示条件码标志的两个表示状态;

图5b示出了根据一个实施例的可以如何使用图5a的两个表示状态来简化一些客户指令到等同主机指令的转换;

图6是示出根据一个实施例的可被合并在较早描述的图3的二进制转换方法中的一些可选的额外步骤的流程图;

图7示出了根据一个实施例的可用于表示客户架构的字节顺序以便辅助从客户架构到主机架构的指令的二进制转换的两个表示状态;

图8示出了根据一个实施例的在客户架构中如何使用扩展寄存器组中的寄存器以及在主机架构中如何使用这些寄存器之间可能存在的差异;

图9示出了根据一个实施例的使用两个表示状态来提供主机架构的扩展寄存器组中的矢量寄存器的不同映射,以及如何使用这些表示状态来提高转换的效率;以及

图10示意性地示出了可用于实现本技术的类型的通用计算机。

具体实施方式

在参考附图讨论实施例之前,提供实施例的以下描述。

在一个实施例中,提供了一种将客户架构的客户指令转换为主机架构的至少一个主机指令的计算机实现的方法。该方法包括:提供多个表示状态,其中,每个表示状态提供来自客户架构的状态的至少一个条目的在主机架构中的表示。然后从多个表示状态中的确定当前表示状态,并且根据当前表示状态将客户指令转换为至少一个主机指令。

通过提供可用在主机架构中来表示来自客户架构的状态的一个或多个条目的多个表示状态,已经发现这可以在转换过程中实现一些显著的效率提升,例如,通过实现用于表示一系列客户指令的主机指令的显著减少的数目。

存在在上述方法的执行期间可以改变表示状态的许多方式。在一个实施例中,用于转换客户指令的代码转换元件在客户指令的转换期间选择性地改变当前表示状态。因此,在这类实施例中,为了提高转换效率,存在对于转换机制本身的选项来引起当前表示状态的改变。在其他实施例中,取决于来自表示状态所表示的客户架构的状态的一个或多个条目,转换机制本身可以仅利用当前表示状态,并且系统中的其他元件可以更改表示状态例如以反映客户架构中的状态的相应的(一个或多个)条目的变化。

在其中转换机制本身可以改变当前表示状态的一个示例实施例中,该方法还可包括从第一转换机制和第二转换机制中选择转换机制,这取决于第一转换机制和第二转换机制中的哪个转换机制将产生更高效的转换,第一转换机制转换客户指令同时保持当前表示状态并且第二转换机制转换客户指令同时改变当前表示状态。客户指令的转换然后采用所选择的转换机制。取决于实施例以及表示状态所标识的状态的(一个或多个)条目,第二转换机制可以在转换客户指令之前改变当前表示状态,或可以在已经执行转换之后改变当前表示状态。

存在可以选择所选转换机制的许多方式,但在一个实施例中,所选择的转换机制是第一转换机制和第二转换机制中的产生最少数目的主机指令来实现客户指令的功能的一个转换机制。因此,选择转换机制以便提高主机指令的结果序列中的代码密度,从而产生用于实现相关联的(一个或多个)客户指令所要求的功能的更高效的转换。

在一个实施例中,该方法还包括将生成的至少一个主机指令存储在转换存储装置中以供后续执行。然后,可稍后参考该转换存储装置以便移除对要再次转换的一些后续客户指令的需要。

具体地,在一个实施例中,该方法还包括确定当前表示状态的客户指令的转换何时已经存在于转换存储装置中,并且根据该确定来输出对现有转换的参考而不是转换客户指令。

尽管在一个实施例中,若客户指令的转换尚未存在于当前表示状态的转换存储装置中则该方法可被布置为转换该客户指令,但在替代实施例中,即使转换尚未存在于当前表示状态的转换存储装置中,仍可以避免客户指令的转换。

具体地,在一个实施例中,该方法还包括确定客户指令的转换何时已经存在于不是当前表示状态的不同的表示状态的转换存储装置中。根据该确定,应用预定标准来确定是否将当前表示状态改变为所述不同的表示状态。当确定改变当前表示状态时,激活预定机制以实现当前表示状态到所述不同的表示状态的改变,此外,输出对现有转换的参考以用于存储在转换存储装置中而不是转换客户指令。

被激活以实现表示状态的变化的预定机制可以采用各种形式。例如,在一些实施例中,至少对于一些表示表示状态变化,仅注意到表示状态已经改变对于转换机制可能是足够的。然而,在替代实施例中,预定机制可能涉及发布一个或多个指令以存储在转换存储装置中,那些指令的执行然后引起当前表示状态的变化。

预定标准将根据实施例而变化,因此,例如,根据不同的表示状态所表示的状态的实际条目。实际上,可能需要做出使用已经存在的转换而获得的效率和与改变表示状态相关联的任意成本之间的平衡。

存在其中可以输出对现有转换的参考的许多方式,但在一个实施例中,这样的参考包括向转换存储装置添加分支指令,以使得到现有代码转换的分支在代码的执行期间的适当的时刻发生。

多个表示状态可以采用各种形式,但在一个实施例中,包括至少两个表示状态,该至少两个表示状态在所述来自客户指令的状态的至少一个条目的主机架构中提供不同的表示。因此,在这类实施例中,该至少两个表示状态提供了在主机架构中表示特定客户架构的不同方式。

客户架构状态的这类条目采用各种形式,但在一个实施例中,包括多个条件标志值。

更具体地,在一个实施例中,在第一表示状态中,多个条件码标志被存储在主机架构中提供的条件标志寄存器中,并且在第二表示状态中,多个条件码标志的第一子集被存储在主机架构中提供的条件标志寄存器中并且条件码标志的第二子集被存储在另外的寄存器中。

因此,在第一表示状态中,条件码标志被存储在主机架构中提供的条件标志寄存器中,其可例如类似于客户架构中提供的条件标志寄存器的形式,从而提供直观的表示。然而,发明人认识到,在一些情况下,由于客户架构中的一些指令和主机架构中的一些指令之间更新条件代码标志的方式的差异,这可能在那些客户指令的转换中导致显著的复杂性。然而,发明人认识到,通过提供第二表示(其中,仅多个条件码标志的子集被存储在主机架构中提供的条件标志寄存器中,并且条件代码标志的第二子集被存储在其他的寄存器中),可以显著地减少表示客户指令所需的主机指令的数目,同时仍确保以客户指令期望的方式来更新条件码标志。

具体地,在一个实施例中,当客户指令是预定客户指令时,用于转换客户指令的代码转换元件在客户指令的转换期间将当前表示状态从所述第一表示状态改变为所述第二表示状态。通过改变表示状态,然后可以产生具有显著提高的代码密度的转换。

多个表示状态可以采用各种不同的形式,这取决于实施例。在一个实施例中,多个表示状态包括当客户架构使用第一字节顺序数据格式时设置的第一字节顺序表示状态,以及当客户架构使用第二字节顺序数据格式时设置的第二字节顺序表示状态,客户指令的转换取决于第一字节顺序表示状态和第二字节顺序表示状态中的哪一个是当前表示状态。

通过这样的方法,转换电路可以考虑客户架构中当前使用的字节顺序,以及主机架构的字节顺序的知识,以便在一些实例中显著地简化所需的转换。

在一个这类布置中,当客户指令遇到改变客户架构的字节顺序时,这还将导致当前表示状态的变化,其然后将用于后续代码转换。

在又一实施例中,多个表示状态可至少包括第一控制存储装置表示状态和第二控制存储装置表示状态,该第一控制存储装置表示状态指示来自客户架构的第一状态被表示在主机架构的预定控制存储装置中,并且该第二控制存储装置表示状态指示来自客户架构的第二状态被表示在主机架构的所述预定控制存储装置中。

因此,在这样的实施例中,多个表示状态中的至少两个表示状态标识来自客户架构的应被存储在主机架构的预定控制存储装置中的不同状态。已经发现,在一些情况下,这可以显著提高当转换特定客户指令时可以实现的代码密度。

例如,在一个实施例中,第一状态是与第一类型的客户指令相关联的状态数据,并且第二状态数据是与第二类型的客户指令相关联的状态数据。

在一个特定实施例中,第一状态数据是与相对于主机架构的预定控制存储装置的客户架构的等同控制存储装置相关联的状态数据,并且第二状态数据是第二类型的客户指令所使用的替换状态值的集合,而不是与客户架构的等同控制存储装置相关联的状态数据。

这样的方法在各种情况下都是有用的。例如,可能是这样的情况,一些客户指令使用客户架构的等同控制存储装置的内容,而其他客户指令忽略该等同控制存储装置的值并且替代地使用替换状态值。然而,在主机架构中,可能是这样的情况,所有指令都使用存储在主机架构的预定控制存储装置中的值。上述机制允许考虑上述事实,同时在转换中实现良好的代码密度。

在又一实施例中,多个表示状态包括第一状态字段表示状态和第二状态字段表示状态,该第一状态字段表示状态指示一个或多个状态值已经由客户架构设置,并且该第二状态字段表示状态指示客户架构对所述一个或多个状态值的设置是未知的和未设置的中的一个,客户指令的转换取决于第一状态字段表示状态和第二状态字段表示状态中的哪一个是当前表示状态。

当未知一个或多个状态值已经由客户架构设置或已知它们尚未被设置时,可能需要使用相当复杂的主机指令序列来表示一些客户指示。然而,若已知那些一个或多个状态值已经由客户架构设置,则在一些情况下这可能导致代码转换的复杂性的显著降低,从而显著地提高代码密度。作为具体示例,若已知客户架构中的特定粘性值已经被设置,则可以针对一些指令实现这类降低。在一个具体实施例中,该一个或多个状态值包括无效粘性值和不精确粘性值中的至少一个。

在又一示例实施例中,多个表示状态可包括第一寄存器跟踪表示状态和第二寄存器跟踪表示状态,其中,第一寄存器跟踪表示状态指示未执行寄存器跟踪,第二寄存器跟踪表示状态标识存储从来自客户架构的状态的至少一个条目导出的数据值的主机架构中的寄存器位置。

具体地,在一些实施例中,若可以通过跟踪主机架构中的一些寄存器的内容来确定关于来自客户架构的状态的特定条目的信息,则可以使用关于状态的这类条目的值的知识来显著地减少转换所需的复杂性。在一个具体示例中,来自客户架构的状态的至少一个条目是来自客户架构的程序计数器值。具体地,一些客户指令将使用客户程序计数器值或从中导出的值来执行操作。通常,主机架构将不具有客户程序计数器值的知识。然而,在一些情况下,由于先前的指令的处理而可以从存储在主机架构中的特定寄存器中的数据的内容导出该知识,并且在一个实施例中,可以利用该知识以便减少一些后续代码转换的复杂性。

作为可以提供来自客户架构的状态的至少一个条目在主机架构中的不同表示的表示状态的另一示例,在又一实施例中,至少两个表示状态可包括第一寄存器映射表示状态和第二寄存器映射表示状态,其中,第一寄存器映射表示状态提供客户架构的寄存器和主机架构的寄存器之间的第一映射,第二寄存器映射表示状态提供客户架构的寄存器和主机架构的寄存器之间的第二映射。具体地,已经发现通过提供根据表示状态来在客户架构和主机架构的寄存器之间不同地映射的灵活性,可以显著地减少一些代码转换的复杂性。

在一个实施例中,用于转换客户指令的代码转换元件应用预定标准以便确定是否在客户指令的转换之前改变当前表示状态。该预定标准可以采用各种形式。然而,通过示例的方式,例如,由于需要移动一些寄存器的现有内容以便反映映射中的任意变化,因此通常将存在与改变寄存器映射相关联的成本,从而该预定标准可以根据等待转换的指令来试图评估该成本是否将是适当的。在这样的实施例中,代码转换元件可能不仅将查看需要转换的当前客户指令,并且还将查看需要转换的多个未来的代码段,以便确定表示状态中的变化是否是适当的。

可以在各种不同的场景中使用上述转换方法。例如,该方法可用在静态二进制转换系统中,该静态二进制转换系统的目的是将可执行文件的所有代码转换为将在主机架构上运行的代码,而无需首先运行该代码。然而,在替代实施例中,所描述的方法执行一系列客户指令的动态二进制转换。动态二进制转换涉及通过在执行期间根据需要转换其指令来执行程序。通常,动态二进制转换查看代码的短序列,例如,单个基本块的顺序的短序列,然后对其进行转换并且缓存所得的序列。然后根据需要并且在需要时转换代码,并且使用诸如分支指令之类的机制来重新利用已经转换并且保存的代码。

客户架构和主机架构可以采用各种形式,并且实际上,上述实施例可应用于各种各样的客户和主机架构组合。具体地,客户架构和主机架构不需要是同一公司开发的架构,因此,若需要,则第一公司开发的客户指令集的客户指令可被转换为另一公司开发的主机指令集的主机指令。替代地,客户指令集和主机指令集都可以是同一公司开发的指令集。类似地,对主机架构和客户架构所操纵的数据宽度没有限制。然而,在一个实施例中,主机架构使用与客户架构所使用的数据宽度不同的数据宽度。在一个具体示例中,32位架构的指令可被转换成64位架构的指令,反之亦然,而在其他实施例中,客户架构和主机架构都可以在相同的数据宽度上操作。

在一个实施例中,可以提供一种计算机程序,当在计算机上执行时,该计算机程序执行上述计算机实现的用于将客户架构的客户指令转换为主机架构的至少一个主机指令的方法。

在又一实施例中,提供了一种用于将客户架构的客户指令转换为主机架构的至少一个主机指令的系统,该系统具有标识当前表示状态的存储装置,以及用于根据当前表示状态来将客户指令转换为之至少一个主机指令的转换电路。

这样的系统可被合并在用于执行包括客户架构的客户指令的客户程序的数据处理装置中,其中,该数据处理装置具有主机架构,并且上述系统将客户架构的客户指令转换为主机架构的主机指令。这样的数据处理装置结合上述实施例的转换技术可被布置为以更高性能和/或更加能源有效地操作,因为上述代码转换技术的应用可以产生代码密度的提升。

现在将参考附图描述具体实施例。

图1a是其中可以采用所述实施例的技术的主机数据处理系统的框图。提供用于执行指令序列的执行单元10以便执行数据处理操作。如将良好地理解的,执行单元10在执行指令时将具有对各种资源的访问,包括寄存器组15和条件标志寄存器25,其中,寄存器组15包含用于存储执行单元10在那些之类的执行期间所操纵的数据值的一些通用寄存器,条件标志寄存器25存储一些条件标志的当前值,例如,在评估一些条件指令时使用这些当前值。特定指令的执行还将使得更新那些标志值中的一个或多个标志值。

此外,在一个实施例中,可以提供扩展寄存器组20,例如,可以在执行特定类型的指令(例如,浮点指令)时使用该扩展寄存器组20。例如,浮点操作数可被存储在扩展寄存器组中以供由执行单元10参考。

还可以提供一些控制和状态寄存器以供由执行单元10访问。通过具体示例的方式,可以提供浮点控制寄存器30以存储一些控制信息,以便由执行单元在执行浮点指令时参考。可被存储在这样的寄存器中的控制信息的示例是舍入模式指示,其标识在执行浮点计算时应用当前舍入模式。此外,可以提供浮点状态寄存器35以存储一些状态值,执行单元10在执行浮点指令时使用这些状态值。通常,这些值将是粘性值,因为一旦它们被设置,则它们将保持被设置直到采取积极步骤来清除那些值。

图1b示意性地示出了在图1a示出的主机数据处理系统的主机架构上的执行客户程序。将根据主机架构60来设计主机数据处理系统10,主机架构描述了主机系统的功能、组织、以及实现方式。它将通常以抽象的方式来定义系统的功能及其编程模型,以及如何设计和实现系统的内部组织以满足指定的功能。除了其他方面,主机架构将通常定义主机指令集架构,从而定义可以在主机系统上执行的主机指令集。

提供符合与主机架构不同的客户架构的客户程序50。客户架构可以是由设计主机架构的同一公司或由不同的公司设计的架构。它还可以在与主机架构相同的数据宽度大小或不同的数据宽度大小上进行操作。

为了使得客户程序50能够在主机系统的主机架构60上运行,提供了结合本文描述的实施例的转换技术的转换层55,以便提供客户指令到用于在主机架构上执行的等同主机指令的高效转换。具体地,转换层利用多个表示状态,其中,每个表示状态提供来自客户架构的状态的至少一个条目在主机架构中的表示,并且其中,根据当前表示状态来转换客户指令。在一些实施例中,转换层外部的功能可以确定应何时做出当前表示状态的改变,并且转换层将总是根据当前表示状态来转换客户指令。然而,在一些实施例中,转换层本身可被布置为在转换一个或多个客户指令的过程期间改变当前表示状态,以便试图实现更优的代码转换。

图2是提供代码转换过程的总体概述的流程图。在步骤80处,从客户程序读取指令。如前所述,客户架构和主机架构可以采用各种形式。然而,纯粹为了说明的目的,在以下实施例中,将假设客户架构是结合aarch32指令集架构(isa)的arm32位架构,并且主机架构是结合aarch64isa的arm64位架构。

在步骤85处,通过主机系统的转换层55中提供的二进制转换器来传递客户指令,以便将那些客户指令转换为等同的aarch64指令序列。

然后,在步骤90处,将所得的64位主机isa的指令存储在转换缓存中以供由主机系统后续执行。

本文描述的实施例的转换方法可用于各种情况,包括静态二进制转换和动态二进制转换二者。然而,为了以下实施例的目的,将假设执行动态二进制转换。根据动态二进制转换,根据需要并且在需要时转换客户程序中的代码段,并且当确定一些指令已经被转换时,利用转换缓存中现有的转换,向转换缓存添加分支指令以使得在代码转换期间的适当时刻使用已经存在的转换,而不是要求相关的(一个或多个)客户指令的重新转换。

因此,将理解的是,根据实施例,例如,在正在进行的动态二进制转换的过程期间,可以根据需要迭代地重复图2中描述的一般过程。

图3是更详细地示出根据一个实施例的二进制转换器的操作的流程图。在步骤100处,确定二进制转换器是否具有要转换的指令。若二进制转换器具有要转换的指令,则过程前进到步骤105,其中,确定当前表示状态。如稍后将参考剩下的附图描述的,表示状态可以表示客户架构中的状态的各种不同的条目。作为具体示例,表示状态可以表示如何在主机架构的硬件中表示客户架构的条件码标志,如稍后将参考图5a和图5b更详细描述的。

在步骤110处,对于要求转换的客户指令,然后确定对于当前表示状态是否已经存在转换指令或转换指令序列。若存在,则过程前进到步骤115,其中,向转换缓存输出分支指令以便标识将实现客户指令的功能的相关的(一个或多个)主机指令。然后,过程返回到步骤100以便确定是否存在要转换的另一客户指令。

若在步骤110处确定对于当前客户指令在转换缓存中没有已经存在的转换,则过程前进到步骤120(可选地,经由图3中利用标注“a”指示的多个额外的步骤,其将随后参考图6进行描述)。

在步骤120处,根据当前表示状态转换客户指令以便产生实现客户指令的功能的一个或多个主机指令,那些所得的主机指令被输出到转换缓存。在步骤125处,然后确定是否改变表示状态(例如,以反映在步骤120处执行转换时做出的任意假设),并且若确定要改变,则在步骤130处改变表示状态。然后,过程返回到步骤100。

尽管在图3中假设在步骤120处执行的转换之后做出是否改变表示状态的决定,但在替代实施例中,可以在转换之前适当地确定改变表示状态。

图4a示出了示例客户和主机架构中的寄存器的布置,即形成客户架构的示例的armaarch32架构以及形成主机架构的示例的armaarch64架构。在aarch32客户架构中,通用寄存器140由标注“r”表示,并且是32位寄存器。aarch64架构中的等同通用寄存器150是64位寄存器并且由标注“x”参考。此外,这类x寄存器的最低有效32位可被单独寻址,并且被称为“w”寄存器155。

图4b示出了aarch32isa和aarch64isa之间的一些示例转换。如可以看出的,aarch32isa中的简单add指令可被转换为aarch64isa中的等同add指令,为客户架构的r寄存器指定等同w寄存器。

如较早在讨论图1时提到的,一些指令操纵标志寄存器25中的条件码标志。在一个实施例中,条件码标志采用n、z、c、以及v标志的形式,对于相关指令,若结果为负则设置n(负)标志、若结果为零则设置z(零)标志、若结果中发生进位则设置c(进位)标志、以及若结果溢出则设置v(溢出)标志。在一些情况下,aarch32指令和等同aarch64指令可以以相同的方式来操纵标志。这参考adds指令通过示例的方式被示出,该adds指令在32位架构和64位架构中都考虑结果适当地设置了所有的标志值。因此,可以执行简单转换。然而,并不总是在两个isa之间存在直接等同的情况。例如,aarch32架构的armv7中的ands指令仅适当地设置n和z标志,而保持c和v标志不变。然而,aarch64架构中的等同ands指令适当地设置n和z标志,同时清除c和v标志。因此,将明显的是,由于关于条件标志的不同功能,aarch32ands指令不能被直接转换为aarch64ands指令。

图4c示出了aarch64架构中的指令序列,当未采用随后参考图5a和图5b描述的实施例的多表示状态方法时,可以要求aarch64架构中的该指令序列以便实现来自aarch32架构的ands指令的功能。该指令序列使用位字段操作来有效地修补标志值,并且由于需要被执行以实现单个客户指令的功能的指令的数目而显然是相当昂贵的。

更详细地,使用第一移动指令mrs来将主机架构中的标志寄存器160的内容移动到x寄存器中的一个x寄存器(在该示例中,x21165)的预定位中。如可以看出的,四个n、z、c、v位被存储在x21寄存器的w21部分的最高有效四个位中。

然后,在aarch32ands指令所指定的r寄存器的等同w寄存器上执行ands指令,使得更新标志寄存器160中的标志。为了便于说明,已经被复制到寄存器x21中的原始值由下标“p”表示以指示它们是此前的值,并且标记寄存器160中的经更新的值由下标“n”表示以指示它们是新的值。如前所述,64位架构中的ands指令将适当地设置n和z标志,并且将清除c和v标志。

然后,使用另一移动指令来将标志寄存器的当前内容存储在不同的x寄存器(在该示例中,x22170)中。

然后,使用ubfx指令将w21中的c和v位移动到最低有效两个位位置,并且然后将w21的其余部分设置为零。

然后,使用bfi指令将那些最低有效两个位从寄存器w21移动到w22的位28和29中,结果,寄存器x22的位31到28现在包含n和z标志的新的值,以及c和v标志的先前的值。然后,可以使用移动指令来将那些值从寄存器x22移回到标志寄存器160中。作为结果,将看出的是,标志寄存器然后包含若已经执行32位客户架构的ands指令则将会出现的n、z、c、以及v标志的值。

如图5a所示,根据本技术的一个实施例,在主机架构中提供了两个表示状态。表示状态0使得aarch32n、z、c、以及v标志被表示在aarch64架构的标志寄存器160中。

然而,还提供了替代表示状态,表示状态1,其中,来自aarch32架构的n和z标志被表示在aarch64架构的标志寄存器160中,但c和v标志被表示在特定选择的通用寄存器的预定位中。在图5a示出的示例中,假设选择通用寄存器x20,并且具体地,c和v标志被表示在x20寄存器180中的w20寄存器的位28和29中。

图5b是与图4b的等同附图,并且如可以看出的,add和adds指令都如此前一样被转换。然而,尽管不管当前表示状态而以完全相同的方式来转换add指令,但当执行adds指令时,确保过程结束时的当前表示状态时表示状态0。因此,若在执行adds指令时当前处于表示状态1,则在主机架构中执行的adds指令将更新标志寄存器160中的所有标志,从而变为表示状态0是适当的。

关于ands指令,根据当前表示状态来不同地转换。若当前表示状态为表示状态1,则ands指令仅可被转换为64位架构中的等同ands指令,因为尽管64位架构的ands指令将清除标志寄存器160中的c和v标志,但为表示状态1的当前表示状态从x20寄存器的位28和29取其c和v值,因而仍标识n、z、c、以及v标志的适当的值,如将是已经执行了32位架构的ands指令的情况。当采用这样的转换时,过程保持在表示状态1。

若在转换ands指令时当前表示状态是表示状态0,则如图所示ands指令被转换为移动指令和64位架构中的ands指令。具体地,标志寄存器160的当前内容被存储在寄存器x20中,并且然后,在32位ands指令所指定的r寄存器的等同w寄存器上执行64位架构的ands指令。在该转换之后,状态移动到表示状态1。根据如图5a所示的表示状态1,然后将理解的是,主机架构将具有n、z、c、以及v标志的视图,其提供那些标志的正确值,即已经执行原始32位ands指令执行而将存在的值。

因此,可以看出,通过提供两种不同的表示状态,对于一些客户指令可以显著减少所需代码转换的复杂性。

可能的情况是,由于代码、分支等中的循环,可能在多个表示状态中遇到同一客户指令,并且可能因此需要被多次转换。然而,已经发现,该额外步骤通常可能被从产生的转换中所得的代码密度提升实现的益处显著超越。

此外,若需要,则二进制转换器可决定切换表示状体以便利用现有转换。例如,这在包括大量不同的表示状态的实施例中可能是有益的。图6是示出了可被合并在图3的过程中以便提供这类功能的一些额外步骤的流程图。

如图6所示,在步骤200处,过程从图3的步骤110前进,因此在该时刻已经确定对于关于当前表示状态正在考虑的客户指令尚不存在转换。在步骤205处,确定对于另一表示状态的该客户指令是否存在转换。若不存在,则过程仅前进到图3的步骤120,如图6的步骤210所示。

然而,若确定已经存在这样的转换,则在步骤215处,应用预定标准以确定是否将表示状态从当前表示状态切换到针对其已经存在转换的表示状态。将理解的是,将应用的标准将非常依赖于实施例,但在一个实施例中,预定标准的应用将试图评估与切换表示状态相关联的任意成本是否可能被使用现有转换超越。这可以通过仅查看正在考虑的当前客户指令来确定,或替代地可以考虑等待转换的客户指令的数目。在步骤220处,确定预定标准的应用是否已经标识应切换表示状态,并且若不切换,则过程直接前进到图3的步骤120,如图6的步骤210所示。

然而,若在步骤220处确定应切换表示状态,则在步骤225处,二进制转换器激活适当的机制以切换表示状态。在一个实施例中,这通过输出一个或多个指令以将表示状态从当前表示状态切换到针对其已经提供转换的相关表示状态(在替代实施例中,针对此目的可能不需要指令),并且还输出分支指令以标识作为将被切换到的表示状态的客户指令的转换已产生的相关的(一个或多个)主机指令来实现。(一个或多个)切换表示状态指令(若使用)和分支指令通常都将被添加到转换缓存。然后,过程返回到图3的步骤100,如图6的步骤230所示。

切换表示状态所需的(一个或多个)指令的形式将取决于所考虑的表示状态(并且实际上,在一些实施例中,可能不需要指令)。然而,考虑到图5a的较早的示例,并且特别是用于表示n、z、c、以及v标志的两个表示状态,可以例如仅通过发出单个mrs移动指令以将标志寄存器的内容移动到一个正在工作的寄存器中来实现从表示状态0到表示状态1的转换。

作为步骤205和215的实现方式的一个具体示例,在一个实施例中,其可被布置为转换过程在采用间接(寄存器)分支之前将总是移动到表示状态1。因此,当客户指令是间接分支指令并且在表示状态0中遇到该客户指令时,在图3的步骤110处将确定不存在针对表示状态0的该指令的转换,但在步骤205处,可确定存在针对表示状态1的该指令的转换。预定标准将实际上确定只要所考虑的指令是间接分支指令则切换到表示状态1总是适当的,从而将发布移动指令以进入表示状态1,然后,将重新使用表示状态1中的间接分支指令的转换。

图7示意性地示出了可以在一个实施例中使用的表示状态的另一示例。具体地,在aarch32架构中,加载和存储指令根据处理器的状态并且特别地根据处理器的当前字节顺序状态来不同地操作。然而,在aarch64架构中,通常是字节顺序为固定(例如,低位优先(littleendian))的情况。

在这样的实施例中,可以建立两个不同的表示状态y和z,表示状态y指示客户架构当前是低位优先,并且表示状态z指示客户架构当前是高位优先(bigendian)。如图7的上图所示,当处于表示状态y时,并且假设aarch64架构是低位优先,则可能会发生加载或存储指令的简单转换。具体地,示出了将四个字节的数据从存储器位置250移动到主机架构的x寄存器260内的w寄存器中的加载指令。只要客户架构和主机架构都是低位优先,则不需要其他步骤。

然而,如图7中的下图所示,若当前表示状态是表示状态z,则除了使用加载指令来将存储器位置250的内容加载到x寄存器260的w寄存器中之外,还将需要在aarch64架构中执行各种另外的指令以便实现必要的字节交换操作以将数据放入低位优先格式,只要已知客户处理器在高位优先格式中操作。

在该实施例中,转换层本身不会引起表示状态的任何改变,而仅考虑当前表示状态来适应转换。相反,当在客户程序中遇到改变客户架构的字节顺序的指令时,更新表示状态。

如图1a所示,可以提供fp控制寄存器30以供由执行单元10在执行浮点运算时进行参考。在aarch32架构中,一些浮点指令(例如,标量浮点指令)直接使用浮点控制寄存器(fpcr)值,而其他浮点指令(例如,矢量浮点指令)忽略fpcr中的fpcr值而是使用一些标准的替换值。然而,在aarch64架构中不存在等同,而是所有浮点指令都使用fpcr30中的fpcr值。

因此,作为可以提供的多个表示状态的另一示例,可以使用表示状态m来指示aarch64fpcr包含aarch32fpcr值(可选地,那些值的副本被保持在单独的寄存器中)。

相反,另一表示状态n将指示aarch64fpcr30包含例如由矢量浮点指令使用的标准替换值集合,而客户fpcr值然后被保持在单独的寄存器中。若我们考虑aarch32矢量浮点add指令vadd.f32dd,dn,dm,那么若当前表示状态是表示状态m,则需要大量的指令来设置fpcr寄存器中的标准值并且然后恢复fpcr内容。具体地,可能例如需要以下指令序列。

letdi=d/2,ni=n/2,mi=m/2,

dj=d%2,nj=n%2,mj=m%2

经转换的指令序列建立矢量浮点运算的标准fpcr值并且然后恢复fpcr。

上述序列中的前四个和最后两个指令用于处理fpcr内容。浮点加法指令fadd的任一侧上的移动指令(实际需要执行的运算)用于处理寄存器混叠问题。若当前表示状态是表示状态m,则在一个实施例中,所有上述指令序列可用作转换,其中,表示状态维持在状态m。然而,将理解的是,这表示将影响性能的显著的复杂性,并且显著降低代码密度。

若决定在转换期间明智地使用表示状态m和n之间的切换,则可以实现指令的一些简化,例如,这可能使得能够移除用于处理fpcr内容的前四个指令和最后两个指令。此外,若使用额外的表示状态(例如,随后参考图9关于矢量寄存器的映射所描述的u和v状态),则可以移除mov指令中的一个或多个。

替代地,若在遇到vadd指令时当前表示状态是表示状态n,则可以将vadd指令转换为aarch64架构中的单个等同浮点add指令,例如:

faddv1.2s,v2.2s,v3.2s

因此,可以实现显著的代码密度提升。

还如图1a所示,可以提供fp状态寄存器35以供由执行单元在浮点指令的执行期间进行参考,该fpsr存储各种粘性位值。

一些aarch32浮点指令可能需要到等同aarch64指令的复杂转换以实现相同的功能,但如果已知一个或多个特定粘性值已经被设置,则可以显著地简化该转换。

因此,作为多个表示状态的另一示例,可以设置表示状态p以标识未知是否在aarch32架构中已经设置了相关的粘性位(或是否已知尚未设置粘性位)。在这样的表示状态中,将需要执行完整的复杂转换。然而,可以设置另一表示状态r以标识其中已知在aarch32架构中已经设置了相关的粘性位的情况。作为特定示例,若已知已经设置了无效(ioc)粘滞位和不精确(ixc)粘性位,则可以显著地简化该转换。

在运行期间,将监测aarch32状态以便检测无效和不精确粘性位已经被设置的情况,从而表示状态可以转换到表示状态r。类似地,若那些粘性位中的任意粘性位随后被清除,则将需要切换回表示状态p。为了明确的示例的目的,将考虑以下aarch32指令:

vcvt.u16.f32sd,sd,#fbits

该指令从32位浮点值转换为16位定点值,并且向零舍入。由于运算向零舍入,因此若执行两次舍入则得到相同的结果,因此,可以利用下列简单转换来得到正确的结果:

fcvtzu指令从32位浮点转换为32位定点,并且ushr指令然后丢弃底部16个位以产生16位定点数。

然而,实现正确的例外,即正确地设置ioc和ixc粘性位,涉及大量的复杂性。具体地,其中利用核心寄存器逻辑来处理饱和的转换可能采用以下十三个指令:

其中利用核心寄存器逻辑来处理舍入的替代转换稍微更长,如下所示:

考虑到较早提到的表示状态p和r,若当前表示状态是表示状态p,则这些相对长的代码序列中的一个将被要求作为较早提到的vcvt指令的转换。然而,若当前表示状态是表示状态r,并且因此已知ioc和ixc粘性位已经被设置,则可以使用简单转换(即较早讨论的四个指令),从而实现显著地提升代码密度。

作为表示状态的另一示例实施例,一些客户指令可以操纵特定于客户架构的状态数据的条目。一个特定示例是其中客户程序计数器值由客户指令来操纵。通常,客户pc值对于主机架构将不可用,并且将理解的是,主机pc值通常将不等于客户pc值。然而,作为多个表示状态的另一示例,可以使用表示状态的概念来标识aarch64架构中存储已经从客户pc值导出的值的一个或多个寄存器,并且然后使用该信息来简化操纵客户pc值或从中导出的值的客户指令的转换。具体地,可以使用第一表示状态e来表示其中未发生寄存器跟踪的情况,从而必须以标准方式来转换每个这类客户指令。然而,可以使用另外的表示状态f来表示寄存器跟踪模式,其中,至少一个所标识的aarch64寄存器的内容包含从客户pc值导出的值,其可用于减少转换。例如,若我们考虑在示出的客户pc值处出现的以下两个添加指令:

0x40001000addr1,pc,#64;setsr1to0x40001048

0x40001010addr2,pc,#56;setsr2to0x40001050

若维持表示状态e,则这两个add指令中的每个可被转换为移动和移动保持(movk)指令,如下所示:

具体地,第一add指令将程序计数器值(即0x40001000)增加到值8(表示程序计数器值的增量)以及由指令指定的值64,并且将结果放入寄存器r1中。因此,寄存器r1被设置为值0x40001048。需要两个移动指令来在aarch64指令中实现该功能,并且类似地,需要额外的两个移动指令来实现第二加法指令的功能。

然而,若在以相同的方式转换第一add指令之后,表示状态被改变为表示状态f(其跟踪寄存器w1的内容),则可以如下转换两个add指令:

具体地,可以重新使用存储在w1中的值以便减少第二add指令的转换的复杂性。

因此,通过这样的方法,保持跟踪哪些已知值是在主机架构中的哪些寄存器中可以通过使得该信息作为表示状态的部分来实现,以便简化所需的转换。

如前所述,可以使用扩展寄存器组20来提供在处理浮点运算时使用的各种寄存器。在aarch32架构和aarch64架构二者中,在扩展寄存器组中存在不同大小寄存器的概念。具体地,存在128位q寄存器,其包含单独可寻址的64位d寄存器和32位s寄存器。如图8所示,在aarch32架构中,可以提供一组十六个128位q寄存器300,其可被认为包含32个64位d寄存器305。此外,前8个q寄存器可被认为包含32个32位s寄存器310。

在aarch64架构中,q、d、以及s寄存器之间的映射有些不同,如图8中的下图所示。具体地,存在32个128位q寄存器320,并且每个q寄存器包含一个相应的d寄存器,其给出32个d寄存器325的集合。类似地,每个d寄存器包含一个相关联的s寄存器,给出图8所示的32个s寄存器330的集合。

作为可以如何使用表示状态的另一示例,可以提供客户架构的客户寄存器和主机架构的相应的主机寄存器之间的矢量寄存器的不同映射。图9示出了该过程。具体地,如较早参考图8所讨论的,扩展寄存器组20中的aarch64寄存器包含一系列128位q寄存器350。根据第一表示状态u,客户架构的d和s寄存器355、360以与它们被表示在客户架构中完全相同的方式被映射到主机架构,如从图9的一系列d寄存器355和s寄存器360和较早描述的图8的比较中将明显的。然而,根据替代表示状态v,客户寄存器d365被映射到通常与aarch64架构相关联的形式。然后,s寄存器370以不直接对应于aarch32表示或aarch64表示的定制方式被映射。

如图9所示,若我们考虑浮点矢量add指令,若当前表示状态是表示状态v,则这可被容易地映射到在相关d寄存器上运行的64位架构的等同矢量add指令,只要客户架构的d寄存器已经被映射以匹配aarch64架构中的d寄存器的正常位置。

然而,若当前状态是表示状态u,则需要图9所示的四个指令的序列以实现32位矢量add指令。具体地,第一提取指令提取q1(其根据映射355来表示源寄存器d3)的最高64位通道并且将结果存储在寄存器d19中。类似地,第二提取指令提取寄存器q2(其根据映射355来表示源寄存器d5)的上通道(即内容的上半部分)并且将结果存储在寄存器d20中。然后,d19和d20的内容被添加在一起并且被存储回d19中。然后,使用插入指令来将d19的内容插入到寄存器q0(其根据映射355来表示目的地寄存器d1)的上半部分中。

因此,可以看出,转换的效率将取决于所采用的映射。若期望改变映射例如以便提高后续转换的效率,则可能需要做出关于该改变是否值得的决定,因为表示状态中的任意变化可能潜在地涉及显著的开销,例如,因为需要移动各个寄存器的内容以使得那些寄存器内容与新的表示状态相一致。通常,在该实施例中,在评估是否值得改变表示状态时可能需要通过代码来进行预测。

可以通过硬件、固件、软件、或这类元件的组合来执行上述代码转换技术。在一个实施例中,适当的软件可被定义用于执行所需的代码转换操作,并且可以在任意适当的通用计算机上运行,例如,参考图10描述的通用计算机。

图10示意性地示出了可用于实现上述技术并且特别是本文描述的代码转换技术的类型的通用计算机400。通用计算机400包括:中央处理单元402、随机存取存储器404、只读存储器406、网络接口卡408、硬盘驱动器410、显示器驱动器412和监视器414、以及具有键盘418和鼠标420的输入/输出电路416,所有这些项经由公共总线422被连接。在操作中,中央处理单元402将执行计算机程序指令,其可被存储在随机存取存储器404、只读存储器406、以及硬盘驱动器410中的一项或多项中,或可以经由网络接口卡408被动态地下载。所执行的处理的结果可以经由显示器驱动器412和监视器414向用户显示。可以经由用户输入/输出电路416从键盘418或鼠标420接收用于控制通用计算机400的操作的用户输入。将理解的是,可以以各种不同的计算机语言来编写计算机程序。计算机程序可被存储和分发在记录介质上或可被动态地下载到通用计算机400。当在适当的计算机程序的控制下操作时,通用计算机400可以执行上述代码转换技术,并且可被认为形成用于执行上述技术的装置。通用计算机的架构可能有很大不同,并且图10只是一个示例。

根据上述实施例,可以看出,所描述的二进制转换技术利用多个表示状态用于客户架构的指令到主机架构的等同指令的更高效转换,从而使得在主机架构上运行这类客户指令的数据处理系统能够以改善的性能、减少的能耗等来进行操作。此外,通过允许主机系统上客户二进制程序的更高效的执行,这将允许人们更快速和更自信地移动以使用主机架构,其进而允许更高效硬件的更快开发和验证。

已经参考各个附图描述了不同表示状态的各种不同的实施例。尽管可以独立地实现这些不同的实施例中的每个实施例,但还将理解的是,在其他实施例中,这些不同的表示状态中的多个表示状态可以在同一系统内共存,以使得能够跟踪和利用状态的多个条目以便提高二进制转换效率。

可以关联各种不同的客户架构和主机架构来使用所描述的技术,无论这些客户架构和主机架构是否由同一公司开发的,以及是否在相同的数据宽度上操作。仅为了说明的目的而提供其中客户架构是armaarch32架构并且主机架构是armaarch64架构的上述事例。

在本申请中,词语“被配置为...”用于表示装置的元件具有能够执行所定义的操作的配置。在该上下文中,“配置”表示硬件或软件的互连的布置或方式布置或方式。例如,装置可具有提供所定义的操作的专用硬件,或可被编程为执行该功能的处理器或其他处理设备。“被配置为”并不意味着需要以任何方式来改变装置元件以便提供所定义的操作。

尽管本文已经参考附图详细描述了本发明的说明性实施例,但将理解的是,本发明不限于哪些精确的实施例,并且可以由本领域技术人员实现各种改变、添加、以及修改,而不脱离如所附权利要求限定的本发明的范围和精神。例如,从属权利要求的特征的各种组合可以与独立权利要求的特征相一致,而不脱离本发明的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1