会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 电脑零配件 / 微处理器 / 一种乱序执行微处理器中的有条件存储指令

一种乱序执行微处理器中的有条件存储指令

阅读:935发布:2021-03-03

IPRDB可以提供一种乱序执行微处理器中的有条件存储指令专利检索,专利查询,专利分析的服务。并且指令编译器将一个有条件存储指令(指定寄存器文件的数据寄存器、基址寄存器、以及偏移寄存器)编译为至少两个微指令。乱序执行流水线执行这些微指令。为了执行第一个微指令,一个执行单元中接收基地址及来自寄存器文件的偏移量,并且产生随着基址值与偏移量而变的第一结果。第一结果指定存储单元的地址。为了执行第二个微指令,一个执行单元接收第一结果且如果条件标志满足此条件,那么将第一结果写入到存储队列中的一个分配的条目(存储队列顺次将数据写入到由此地址指定的存储单元),并且如果条件标志不满足此条件,那么消灭分配的存储队列条目以使得存储队列不将数据写入到由这个地址指定的存储单元。,下面是一种乱序执行微处理器中的有条件存储指令专利的具体信息内容。

1.一种微处理器,具有定义有条件存储指令的指令集架构,所述微处理器包括:存储队列;

寄存器文件;

指令编译器,将所述有条件存储指令编译为至少两个微指令,其中所述有条件存储指令指定所述寄存器文件的数据寄存器、基址寄存器、以及偏移寄存器,其中如果所述微处理器的条件标志满足指定条件,则所述有条件存储指令命令所述微处理器将数据从所述数据寄存器存储到存储单元;以及乱序执行流水线,包括执行所述微指令的复数个执行单元;

其中为了执行所述微指令的第一个微指令,一个所述执行单元接收基址值和来自所述寄存器文件的偏移量,并且作为响应该一个所述执行单元产生随所述基址值与所述偏移量而变的第一结果,其中所述第一结果指定所述存储单元的一个地址;

其中为了执行所述微指令的第二个微指令,一个所述执行单元接收所述第一结果,并且作为响应:如果所述条件标志满足所述条件,则将所述第一结果写入到所述存储队列中的一个分配的条目,其中所述存储队列配置为顺次将所述数据写入到由所述地址指定的所述存储单元;以及如果所述条件标志不满足所述条件,则消灭所述分配的存储队列条目以使得所述存储队列不将所述数据写入到由所述地址指定的所述存储单元。

2.根据权利要求1所述的微处理器,

其中所述基址寄存器是与所述数据寄存器及所述偏移寄存器不相同的寄存器,其中如果满足所述条件的话,所述有条件存储指令指定所述基址寄存器待更新;

其中所述至少两个微指令包含一个第三微指令,其中为了执行所述第三微指令,一个所述执行单元接收所述基址寄存器的一个在前值及所述第一结果,并且作为响应该一个所述执行单元提供用于写入到所述基址寄存器的一个第二结果,其中如果满足所述条件的话,则所述第二结果是所述第一结果,并且如果不满足所述条件的话,则所述第二结果是所述基址寄存器的所述在前值;

其中所述基址寄存器的所述在前值包含执行一个微指令所产生的结果,其中所述微指令是关于所述第三微指令的所述基址寄存器的次序上最近的在前写入者。

3.根据权利要求2所述的微处理器,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第四微指令,其中为了执行所述第四微指令,一个所述执行单元接收所述移位量和来自所述寄存器文件的所述偏移量,并且作为响应该一个所述执行单元提供一个第三结果,所述第三结果是移位了所述移位量的所述偏移量;

其中执行所述第一微指令的所述执行单元接收所述第三结果而不是来自所述寄存器文件的所述偏移量,并且所述执行单元使用所述第三结果而非来自所述寄存器文件的所述偏移量产生所述第一结果。

4.根据权利要求2所述的微处理器,

其中所述第三微指令指定所述第二结果待写入到所述基址寄存器;

其中在顺序上位于所述第三微指令之后的一个用户微指令指定是所述基址寄存器的一个源寄存器,其中与是否满足所述条件无关,所述用户微指令使用所述第三微指令的所述第二结果作为源操作数。

5.根据权利要求1所述的微处理器,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第三微指令,其中为了执行所述第三微指令,一个所述执行单元接收所述移位量及来自所述寄存器文件的所述偏移量,并且作为响应该一个所述执行单元提供一个第二结果,所述第二结果是移位了所述移位量的所述偏移量;

其中执行所述第一微指令的所述执行单元接收所述第二结果而不是来自所述寄存器文件的所述偏移量,并且所述执行单元使用所述第二结果而非来自所述寄存器文件的所述偏移量产生所述第一结果。

6.根据权利要求1所述的微处理器,其中进一步为了执行所述第二微指令,所述执行单元的一个不同的执行单元:从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

7.根据权利要求1所述的微处理器,

其中所述至少两个微指令包括一个第三微指令,其中为了执行所述第三微指令,所述执行单元中的一个不同的执行单元:从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

8.根据权利要求1所述的微处理器,其中所述微指令的编码方式与由所述指令集架构定义的所述指令的编码方式不相同。

9.根据权利要求1所述的微处理器,其中对于执行所述微指令的每一个所述执行单元,所述寄存器文件包括最多两个读端口以同时将最多两个源操作数提供给所述执行单元。

10.根据权利要求1所述的微处理器,其中所述第一微指令将所述寄存器文件的一个非架构寄存器指定作为所述第一微指令的目标寄存器,其中所述第二微指令将由所述第一微指令指定的所述非架构寄存器指定作为所述第二微指令的源寄存器。

11.一种微处理器的操作方法,其中所述微处理器具有定义有条件存储指令的指令集架构且具有存储队列及寄存器文件,所述微处理器的操作方法包括:将所述有条件存储指令编译为至少两个微指令,其中所述有条件存储指令指定所述寄存器文件的数据寄存器、基址寄存器、以及偏移寄存器,其中如果所述微处理器的条件标志满足指定条件,则所述有条件存储指令命令所述微处理器将数据从所述数据寄存器存储到存储单元;以及通过所述微处理器的乱序执行流水线执行所述微指令;

其中所述执行所述微指令的第一个微指令包括接收一个基址值及来自所述寄存器文件的偏移量,并且作为响应产生随所述基址值与偏移量而变的第一结果,其中所述第一结果指定所述存储单元的一个地址;

其中所述执行所述微指令的第二个微指令包括接收所述第一结果且作为响应:如果所述条件标志满足所述条件,则将所述第一结果写入到所述存储队列中的一个分配的条目,其中所述存储队列配置为将所述数据顺次写入到由所述地址指定的所述存储单元;以及如果所述条件标志不满足所述条件,则消灭所述分配的存储队列条目以使得所述存储队列不将所述数据写入到由所述地址指定的所述存储单元。

12.根据权利要求11所述的微处理器的操作方法,

其中所述基址寄存器是与所述数据寄存器及所述偏移寄存器不相同的寄存器,其中如果满足所述条件的话,则所述有条件存储指令指定所述基址寄存器待更新;

其中所述至少两个微指令包含一个第三微指令;

其中所述执行所述第三微指令包括,接收所述基址寄存器的在前值及所述第一结果,并且作为响应提供用于写入到所述基址寄存器的一个第二结果,其中当满足所述条件的话所述第二结果是所述第一结果,并且如果不满足所述条件的话所述第二结果是所述基址寄存器的所述在前值;

其中所述基址寄存器的所述在前值包含由执行一个微指令所产生的结果,其中所述微指令是关于所述第三微指令的所述基址寄存器的次序上最近的在前写入者。

13.根据权利要求12所述的微处理器的操作方法,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第四微指令;

其中所述执行所述第四微指令包括,接收所述移位量及来自所述寄存器文件的所述偏移量,并且作为响应提供一个第三结果,所述第三结果是移位了所述移位量的所述偏移量;

其中所述接收来自所述寄存器文件的一个偏移量包括接收所述第三结果而不是来自所述寄存器文件的所述偏移量且使用所述第三结果而非来自所述寄存器文件的所述偏移量产生所述第一结果。

14.根据权利要求12所述的微处理器的操作方法,

其中所述第三微指令指定所述第二结果待写入到所述基址寄存器;

其中在顺序上位于所述第三微指令之后的一个用户微指令指定是所述基址寄存器的一个源寄存器,其中与是否满足所述条件无关,所述用户微指令使用所述第三微指令的所述第二结果作为源操作数。

15.根据权利要求11所述的微处理器的操作方法,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第三微指令;

其中所述执行所述第三微指令包括,接收所述移位量及来自所述寄存器文件的所述偏移量,并且作为响应提供一个第二结果,所述第二结果是移位了所述移位量的所述偏移量;

其中所述接收来自所述寄存器文件的一个偏移量包括接收所述第二结果而不是来自所述寄存器文件的所述偏移量且使用所述第二结果而非来自所述寄存器文件的所述偏移量产生所述第一结果。

16.根据权利要求11所述的微处理器的操作方法,

其中所述执行所述第二微指令进一步包括:

从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

17.根据权利要求11所述的微处理器的操作方法,

其中所述至少两个微指令包括一个第三微指令;

其中所述执行所述第三微指令包括:

从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

18.根据权利要求11所述的微处理器的操作方法,其中所述微指令的编码方式与由所述指令集架构定义的所述指令的编码方式不相同。

19.一种微处理器,具有定义有条件存储指令的指令集架构,所述微处理器包括:存储队列;

寄存器文件;

指令编译器,将所述有条件存储指令编译为至少两个微指令,其中所述有条件存储指令指定所述寄存器文件的数据寄存器以及基址寄存器,其中所述基址寄存器与所述数据寄存器不相同,其中如果所述微处理器的条件标志满足指定条件,则所述有条件存储指令命令所述微处理器将数据从所述数据寄存器存储到存储单元,其中如果满足所述条件,则所述有条件存储指令指定所述基址寄存器待更新;以及乱序执行流水线,包括执行所述微指令的复数个执行单元;

其中为了执行所述微指令的第一个微指令,一个所述执行单元:随着从所述基址寄存器接收的基址值而变,计算所述存储单元的一个地址;

如果所述条件标志满足所述条件,则将所述地址写入到所述存储队列中的一个分配的条目,其中所述存储队列配置为将所述数据顺次写入到由该地址指定的所述存储单元;以及如果所述条件标志不满足所述条件,则消灭所述分配的存储队列条目以使得所述存储队列不将所述数据写入到由该地址指定的所述存储单元;

其中为了执行所述微指令的第二个微指令,一个所述执行单元接收偏移量及所述基址寄存器的一个在前值,并且作为响应,该一个所述执行单元计算所述偏移量与所述基址寄存器的所述在前值的总和,并且该一个所述执行单元提供一个第一结果,如果满足所述条件,则所述第一结果是所述总和,并且如果不满足所述条件,则所述第一结果是所述基址寄存器的所述在前值;

其中所述基址寄存器的所述在前值包括由执行一个微指令所产生的结果,其中所述微指令是关于所述第二微指令的所述基址寄存器的次序上最近的在前写入者。

20.根据权利要求19所述的微处理器,其中所述有条件存储指令指定待写入所述数据的所述存储器中的所述单元的所述地址是所述基址寄存器值与所述偏移量的总和,其中所述指令编译器发出所述第一微指令以命令所述执行单元计算所述存储单元的所述地址为所述偏移量与所述基址值的总和。

21.根据权利要求19所述的微处理器,其中所述有条件存储指令指定所述地址为所述基址寄存器的值,其中所述指令编译器发出所述第一微指令,用以指示所述执行单元计算所述地址为所述基址值。

22.根据权利要求19所述的微处理器,其中所述有条件存储指令指定所述偏移量为一个立即值,其中所述指令编译器发出所述第一微指令,用以指示所述执行单元接收所述立即值而不访问所述寄存器文件。

23.根据权利要求22所述的微处理器,其中如果所述有条件存储指令指定所述所述基址寄存器不需要更新,则然后所述指令编译器将所述有条件存储指令编译成一单个微指令而不是至少两个微指令,其中所述单个微指令是所述第一微指令。

24.根据权利要求22所述的微处理器,其中所述指令编译器将所述有条件存储指令编译成一单个微指令而不是至少两个微指令,其中所述单个微指令是所述第一微指令,其中为了执行所述第一微指令,该一个所述执行单元进一步:接收所述偏移量与所述基址寄存器的所述在前值,并且作为响应计算所述偏移量与所述基址寄存器的所述在前值的总和且提供所述第一结果,如果满足所述条件则所述第一结果是所述总和,并且如果不满足所述条件则所述第一结果为所述基址寄存器的所述在前值。

25.根据权利要求19所述的微处理器,其中所述有条件存储指令指定所述偏移量作为一个寄存器值,其中所述指令编译器发出所述第一微指令,用以指示所述执行单元从所述寄存器文件的一个偏移寄存器接收所述偏移值。

26.根据权利要求19所述的微处理器,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第三微指令,其中为了执行所述第三微指令,一个所述执行单元接收所述偏移量且从所述寄存器文件接收所述偏移量,并且作为响应该一个执行单元提供一个第二结果,所述第二结果是移位了所述移位量的所述偏移量;

其中执行所述第二微指令的所述执行单元接收所述偏移量作为所述第二结果。

27.根据权利要求26所述的微处理器,其中所述第三微指令将所述寄存器文件的一个非架构寄存器指定作为所述第三微指令的目标寄存器,其中所述第二微指令将由所述第三微指令指定的所述非架构寄存器指定作为所述第二微指令的源寄存器。

28.根据权利要求19所述的微处理器,

其中进一步为了执行所述第一微指令,所述执行单元的一个不同的执行单元:从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

29.根据权利要求19所述的微处理器,

其中所述至少两个微指令包括一个第三微指令,其中为了执行所述第三微指令,所述执行单元中的一个不同的执行单元:从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

30.根据权利要求19所述的微处理器,其中所述微指令的编码方式与由所述指令集架构定义的所述指令的编码方式不相同。

31.根据权利要求19所述的微处理器,其中对于执行所述微指令的每一个执行单元,所述寄存器文件包括最多两个读端口以同时将最多两个源操作数提供给所述执行单元。

32.一种微处理器的操作方法,其中所述微处理器具有定义有条件存储指令的指令集架构且具有存储队列及寄存器文件,所述微处理器的操作方法包括:将所述有条件存储指令编译为至少两个微指令,其中所述有条件存储指令指定所述寄存器文件的数据寄存器以及基址寄存器,其中所述基址寄存器与所述数据寄存器不相同,其中如果所述微处理器的条件标志满足指定条件,则所述有条件存储指令命令所述微处理器将数据从所述数据寄存器存储到存储单元,其中如果满足所述条件,则所述有条件存储指令指示所述基址寄存器待进行更新;以及通过乱序执行流水线执行所述微指令;

其中所述执行所述微指令的第一个微指令包括:

随着从所述基址寄存器接收的基址值而变计算所述存储单元的一个地址;

如果所述条件标志满足所述条件,则将所述地址写入到所述存储队列中的一个分配的条目,其中所述存储队列配置为将所述数据顺次写入到由该地址指定的所述存储单元;以及如果所述条件标志不满足所述条件,则消灭所述分配的存储队列条目以使得所述存储队列不将所述数据写入到由该地址指定的所述存储单元;

其中所述执行所述微指令的第二个微指令包括,接收偏移量及所述基址寄存器的在前值,并且作为响应计算所述偏移量与所述基址寄存器的所述在前值的总和,并且提供一个第一结果,如果满足所述条件,则所述第一结果是所述总和,并且如果不满足所述条件则所述第一结果是所述基址寄存器的所述在前值;

其中所述基址寄存器的所述在前值包括由执行一个微指令所产生的结果,其中所述微指令是关于所述第二微指令的所述基址寄存器的次序上最近的在前写入者。

33.根据权利要求32所述的微处理器的操作方法,其中所述有条件存储指令指定,待写入所述数据的所述存储器中的所述单位的所述地址是所述基址寄存器值与所述偏移量的总和,其中编译所述有条件存储指令包括发出所述第一微指令以指示计算所述存储单元的所述地址是所述偏移量与所述基址值的总和。

34.根据权利要求32所述的微处理器的操作方法,其中所述有条件存储指令指定所述地址是所述基址寄存器值,其中所述编译所述有条件存储指令包括发出所述第一微指令,用以指示计算所述地址为所述基址值。

35.根据权利要求32所述的微处理器的操作方法,其中所述有条件存储指令指定所述偏移量为一个立即值,其中所述编译所述有条件存储指令包括发出所述第一微指令,用以指示接收所述立即值而不访问所述寄存器文件。

36.根据权利要求35所述的微处理器的操作方法,其中如果所述有条件存储指令指定所述所述基址寄存器不需要更新,则然后所述编译所述有条件存储指令包括将所述有条件存储指令编译成一单个微指令而不是至少两个微指令,其中所述单个微指令是所述第一微指令。

37.根据权利要求35所述的微处理器的操作方法,其中所述编译所述有条件存储指令包括将所述有条件存储指令编译成一单个微指令而不是至少两个微指令,其中所述单个微指令是所述第一微指令,其中所述执行所述第一微指令进一步包括:接收所述偏移量与所述基址寄存器的所述在前值,并且作为响应计算所述偏移量与所述基址寄存器值的所述在前值的总和,并且提供所述第一结果,如果满足所述条件,则所述第一结果是所述总和,如果不满足所述条件则所述第一结果是所述基址寄存器的所述在前值。

38.根据权利要求32所述的微处理器的操作方法,其中所述有条件存储指令指定所述偏移量作为一个寄存器值,其中所述编译所述有条件存储指令包括发出所述第一微指令,用以指示从所述寄存器文件的一个偏移寄存器接收所述偏移值。

39.根据权利要求32所述的微处理器的操作方法,

其中所述有条件存储指令进一步指定一个移位量;

其中所述至少两个微指令包括一个第三微指令,

其中所述执行所述第三微指令包括,接收所述移位量且从所述寄存器文件接收所述偏移量,并且作为响应提供一个第二结果,所述第二结果是移位了所述移位量的所述偏移量;

其中所述执行所述第二微指令包括接收所述偏移量作为所述第二结果。

40.根据权利要求39所述的微处理器的操作方法,其中所述第三微指令将所述寄存器文件的一个非架构寄存器指定作为所述第三微指令的目标寄存器,其中所述第二微指令将由所述第三微指令指定的所述非架构寄存器指定作为所述第二微指令的源寄存器。

41.根据权利要求40所述的微处理器的操作方法,

其中所述执行所述第一微指令进一步包括:

从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

42.根据权利要求32所述的微处理器的操作方法,

其中所述至少两个微指令包括一个第三微指令;

其中所述执行所述第三微指令包括:

从所述数据寄存器接收所述数据;以及

将所述数据写入到所述分配的存储队列条目。

43.根据权利要求32所述的微处理器的操作方法,其中所述微指令的编码方式与由所述指令集架构定义的所述指令的编码方式不相同。

说明书全文

一种乱序执行微处理器中的有条件存储指令

[0001] 相关申请的交叉引用
[0002] 本申请为下列美国非临时性专利申请的一个部分延续申请案(CIP)
[0003]13/224,310(CNTR.2575) 09/01/2011
13/333,520(CNTR.2569) 12/21/2011
13/333,572(CNTR.2572) 12/21/2011
13/333,631(CNTR.2618) 12/21/2011
13/413,258(CNTR.2552) 03/06/2012
13/412,888(CNTR.2580) 03/06/2012
13/412,904(CNTR.2583) 03/06/2012
13/412,914(CNTR.2585) 03/06/2012
13/413,346(CNTR.2573) 03/06/2012
13/413,300(CNTR.2564) 03/06/2012
13/413,314(CNTR.2568) 03/06/2012
13/416,879(CNTR.2556) 03/09/2012
[0004] 其中每一项在此以所有目的被整体引用作为参考;
[0005] 本申请根据下列美国临时性申请而享有优先权
[0006]61/473,062(CNTR.2547) 04/07/2011
61/473,067(CNTR.2552) 04/07/2011
61/473,069(CNTR.2556) 04/07/2011
61/537,473(CNTR.2569) 09/21/2011
61/541,307(CNTR.2585) 09/30/2011
61/547,449(CNTR.2573) 10/14/2011
61/555,023(CNTR.2564) 11/03/2011
61/604,561(CNTR.2552) 02/29/2012
61/614,893(CNTR.2592) 03/23/2012
[0007] 其中每一项在此以所有目的被整体引用作为参考;
[0008] 美国非临时性专利申请
[0009]13/224,310(CNTR.2575) 09/01/2011
[0010] 根据下列美国临时性申请而享有优先权
[0011]61/473,062(CNTR.2547) 04/07/2011
61/473,067(CNTR.2552) 04/07/2011
61/473,069(CNTR.2556) 04/07/2011
[0012] 其中每一项在此以所有目的被整体引用作为参考;
[0013] 美国非临时性申请
[0014]13/413,258(CNTR.2552) 03/06/2012
13/412,888(CNTR.2580) 03/06/2012
13/412,904(CNTR.2583) 03/06/2012
13/412,914(CNTR.2585) 03/06/2012
13/413,346(CNTR.2573) 03/06/2012
13/413,300(CNTR.2564) 03/06/2012
13/413,314(CNTR.2568) 03/06/2012
[0015] 中的每一项是以下美国非临时性专利申请的部分延续申请案(CIP)
[0016]13/224,310(CNTR.2575) 09/01/2011
13/333,520(CNTR.2569) 12/21/2011
13/333,572(CNTR.2572) 12/21/2011
13/333,631(CNTR.2618) 12/21/2011
[0017] 并且根据以下美国临时性专利申请案要求优先权
[0018]61/473,062(CNTR.2547) 04/07/2011
61/473,067(CNTR.2552) 04/07/2011
61/473,069(CNTR.2556) 04/07/2011
61/537,473(CNTR.2569) 09/21/2011
61/541,307(CNTR.2585) 09/30/2011
61/547,449(CNTR.2573) 10/14/2011
61/555,023(CNTR.2564) 11/03/2011
61/604,561(CNTR.2552) 02/29/2012
[0019]
[0020] 其中每一项在此以所有目的被整体引用作为参考;
[0021] 美国非临时性申请
[0022]13/416,879(CNTR.2556) 03/09/2012
[0023] 是以下美国非临时性专利申请的部分延续申请案(CIP)
[0024]13/224,310(CNTR.2575) 09/01/2011
13/333,520(CNTR.2569) 12/21/2011
13/333,572(CNTR.2572) 12/21/2011
13/333,631(CNTR.2618) 12/21/2011
13/413,258(CNTR.2552) 03/06/2012
13/412,888(CNTR.2580) 03/06/2012
13/412,904(CNTR.2583) 03/06/2012
13/412,914(CNTR.2585) 03/06/2012
13/413,346(CNTR.2573) 03/06/2012
13/413,300(CNTR.2564) 03/06/2012
13/413,314(CNTR.2568) 03/06/2012
[0025] 并且根据以下美国临时性专利申请案要求优先权
[0026]61/473,062(CNTR.2547) 04/07/2011
61/473,067(CNTR.2552) 04/07/2011
61/473,069(CNTR.2556) 04/07/2011
61/537,473(CNTR.2569) 09/21/2011
61/541,307(CNTR.2585) 09/30/2011
61/547,449(CNTR.2573) 10/14/2011
61/555,023(CNTR.2564) 11/03/2011
61/604,561(CNTR.2552) 02/29/2012
[0027] 其中每一项在此以所有目的被整体引用作为参考。

背景技术

[0028] 在计算领域中,位于加利福尼亚州圣塔克拉拉市的Intel公司最初开发出的x86处理器架构和英国剑桥的ARM有限公司最初开发出的ARM(Advanced RISC Machines)架构是业内众所周知的。存在许多包括一个ARM或x86处理器的计算系统,并且对它们的需求似乎正在迅速增加。目前,对于ARM架构处理核心的需求似乎在计算市场的低功耗、低成本部分,例如手机、PDA、平板电脑、网络路由器、集线器、以及机顶盒(例如,苹果公司的iPhone与iPad的主要处理能力由ARM架构处理核心提供)占据主导地位,而对于x86架构处理器的需求似乎在例如:便携式电脑、台式机以及服务器的需要较高性能且运行成本较高的市场部分占据主导地位。但是,随着ARM核心的性能提升且x86处理器的某些类型的功耗和成本降低,不同市场之间的分界线会明显地减弱,并且这两种架构开始在例如智能手机的移动计算设备市场中形成面对面竞争的局面,而且很可能这两种架构在便携式电脑、台式机以及服务器市场中开始更频繁的竞争。
[0029] 这种情况将使得计算设备制造商与客户陷入这两种架构何者将占据主导的两难境地,并且特别是对于这两种架构的软件开发者何者将开发出更多的软件。举例而言,一些机构每月或每年都会购入大量的计算机系统。例如,由于与购买大量相同系统有关的成本效率以及系统维护与修理的简化,都会使这些机构产生较高的购买具有相同架构系统的动机。然而,这些较大机构中的用户群体对这些单一的配置系统具有不同的计算需求。具体而言,一些用户具有在ARM架构处理器上运行软件的计算需求,并且一些用户具有在x86架构上运行软件的计算需求,而另一些客户甚至希望在两种架构上都能运行软件。更进一步而言,一些新的前所未知的计算需求也会寄希望于其中的一种架构。在这些情况下,这些大机构所进行的这种大规模投资中部分被浪费。再例如,某个用户可具有一个只能在x86架构上运行的重要的应用程序因此他购买了一个x86架构的系统,但是后续开发了这种应用程序的比x86版本更好的ARM架构的版本(或者相反),那么这个用户将愿意在架构间进行转换。但遗憾的是,该用户已经在他不想要的架构上进行了投资。另一情况下,某个用户可对仅能够在ARM架构上运行的应用程式进行投资,但是此用户还想利用在其他领域为x86架构开发的不存在于ARM架构上或者比为ARM架构所开发的软件更好的这种应用程序(或者存在相反的情况)。值得注意的是,虽然一些小机构或个人用户所进行的投资不如大公司的规模大,但是在相关事项上所浪费的投资可甚至更大。在不同的计算机设备市场中,从x86构架到ARM构架的转换或从ARM构架到x86构架的转换的背景下,可能存在或出现许多浪费投资的类似实例。最后,计算机设备生产商,例如原始设备制造商(OEM)会在开发新产品上投入大量的资源。所以,如果这些计算机设备生产商开发并制造了大量的x86架构或ARM架构的系统而用户却突然要求改变,这时计算机设备生产商会陷入浪费一些有价值开发资源的困境。
[0030] 对于计算机设备的生产商和客户而言比较好的方案是可以维护他们的投资而不考虑这两种架构那种占主导。因此,需要一种办法使得系统制造者可以开发出在x86架构与ARM架构上都能运行的计算设备。
[0031] 主要因为用户会在指令集不同于新硬件的旧硬件上运行的软件中进行了大量投资,所以人们一直希望有可以运行多于一种指令集的系统。例如,IBM的System/360Model30包括与IBM System1401的兼容特性,进而可使转化为具有更高性能和性能增强的System/360变得简单。其中,Model30同时包括对System/360与1401只读存储器(Read Only Storage,ROS)的控制,这种控制在如果辅助存储器预先加载有所需信息时,能够对Model30提供可用于1401模式中的能力。而且,在通过高级语言开发软件的情况下,新硬件的开发者可能较少或没有控制为旧硬件编译的软件,并且尤其是在软件开发者和硬件开发者不在同一公司的情况下,软件开发者也没有动力为新的硬件重新编译源代码。西尔贝曼(Silberman)和依贝斯格鲁(Ebcioglu)提出了一种通过在RISC超标量体系架构上运行现有的(“基础”)CISC架构(例如,IBM S/390)软件来提高该软件的性能的技术,以及一种通过包括用于执行本地码的本地引擎以及用于执行基本目标代码的移动引擎的超长指令字(VLIW)架构(“本地”)系统,用以根据翻译软件的作用按照需要在代码类型之间进行切换,其中这种转换软件用于将基本目标代码编译为本地代码。参考西尔贝曼和依贝斯格鲁在1993年6月第6期《Computer》中刊载的《An Architectural Framework for Supporting Heterogeneous Instruction-Set Architectures》。范戴克(Van Dyke)等人在2006年5月16日公布的美国第7,047,394号专利中公布了一种具有执行流水线的处理器,此执行流水线用于执行本地RISC(Tapestry)程序指令,并通过硬件转换与软件转换的结合将x86程序指令编译为本地RISC指令。纳克达(Nakada)等人提出了一种异构的同时多线程(SMT)处理器,这种处理器具有用于非常规(例如:操作系统)程序的ARM架构前端流水线,这种处理器还具有富士通FR-V(VLIW)架构前端流水线,用于向FR-V VLIW后端流水线提供添加的VLIW队列以从前端流水线中持有指令集。请参见在意大利,科莫湖(Lake Como),2008年11月(结合MICRO-41)的高性能和硬件感知计算的新前沿第一次国际研讨会上(HipHaC'08)上的会议论文集,《OROCHI:A Multiple Instruction Set SMT Processor》一文,Buchty与Weib编辑,Universitatsverlag Karlsruhe出版(ISBN978-3-86644-298-6)。上述文献中的方法的提出用于减少异构片上系统(SOC)装置上的整体系统痕迹,这种片上系统如德克萨斯州仪器公司出产的OMAP,这种平台包括了ARM处理核心以及一个或多个协同处理器(例如,TMS320、各种数字信号处理器、或各种图像处理单元(GPU)),并且协同处理器并不分享指令执行资源,而是集成在单个芯片上的不同处理核心。
[0032] 软件编译器,也称为软件仿真器、软件模拟器、动态二进制编译器等,也应用于支持在不同架构的处理器上运行一个架构程序的能力。广为所知的商业实例是摩托罗拉公司的68K-to-PowerPC仿真器,这种仿真器连同苹果的Macintosh计算机在具有Power PC的Macintosh计算机上运行68K程序,同时稍后开发出的PowerPC-to-x86模拟器,允许在具有x86处理器的Macintosh计算机上运行Power PC程序。位于加利福尼亚州圣塔克拉拉市的Transmeta公司将VLIW核心硬件与“纯软件指令编译器(称之为“Code Morphing Software”)[其]动态地编译或模仿x86编码序列”相结合以执行x86编码。请参考维基媒体基金会于2011年所发布“Transmeta”(http://en.wikipedia.org/wiki/Transmeta)。同时,请参考例如1998年11月3日公布的由Kelly等人申请的美国第5,832,205号专利。同时,IBM DAISY(源自约克镇的动态架构指令集)系统包括VLIW机器以及动态二维软件翻译功能,以为旧构架提供百分之百的软件兼容仿真。DAISY包括虚拟计算机监视器,这种虚拟计算机监视器位于ROM中,而这种ROM可并行处理VLIW原语并将VLIW原语存储于主内存中无法被旧架构发现的部分中,以寄希望于避免在相同的旧架构代码片段的后续实例中再次进行重新编译。DAISY系统包括快速编译优化算法以提高性能。QEMU是一种包括软件动态编译器的计算机模拟器。QEMU在不同主机(例如,x86、PowerPC、ARM、SPARC、Alpha及MIPS)上仿真许多的CPU(例如,x86、PowerPC、ARM及SPARC)。正如QEMU的创始人所说,“动态编译器执行从目标CPU指令到主机指令集的运行时间转换。所产生的二进制编码存储于一个翻译高速缓存中,以使这些二进制编码可被重新使用…由于集成了由GNU C编译器离线产生的计算机代码片段,所以QEMU更为简单(与其它动态翻译期相比)”,请参考USENIX协会,FREENIX Track:2005年USENIX年度技术会议,Fabrice Bellard发表的《QEMU,a Fast and Portable Dynamic Translator》。并且参见阿德莱德大学(University of Adelaide)Lee Wang Hao于2009年7月19日发表的论文《ARM Instruction Set Simulation on Multi-Core x86Hardware》。然而,虽然基于软件编译器的方案可为计算需求的子集提供足够的性能,但是不大可能提供许多用户所需要的性能。
[0033] 静态二进制编译是另一种具有高性能潜力的技术。但是,其中存在着与静态二进制编译相关的技术上的考虑(例如:已知自修改代码仅在运行时间间接分支其值)以及一些贸易或法律壁垒(例如,可需要硬件开发商开房用于发布新程序的渠道;潜在许可或版权与原程序分销商相冲突)。
[0034] ARM ISA(Industrial Standard Architecture,工业标准架构)的一个特征是条件指令执行。正如ARM架构参考手册第A4-3页所述:
[0035] 大多数ARM指令能够按条件被执行。这意味着如果APSR中的N标志、Z标志、C标志及V标志符合指令中所指定的条件,则这些ARM指令只在程序员的模式操作、存储器及协同处理器中具有它们的正常作用。如果这些标志不符合条件,那么指令被视为空语句(NOP),也就是说,按照常态进行至下一指令,包含任何采取的异常的相关检查而不具有其他作用。
[0036] 因此,条件执行特征的优点在于:可能促进更小的代码尺寸并可通过减小分支指令的数目,以及伴随与错误预测这些指令相关的功能的劣化而提高性能。因此,特别是在支持高微处理器时钟频率的方式下,需要有效地执行条件指令的方式。

发明内容

[0037] 本发明的一方面提供了一种微处理器,此种微处理器具有定义一个有条件存储指令的指令集架构。此微处理器包括存储队列和寄存器文件。微处理器还包括指令编译器,用于将有条件存储指令编译为至少两个微指令,其中有条件存储指令指定寄存器文件的数据寄存器、基址寄存器、以及偏移寄存器,其中如果微处理器的条件标志满足指定条件,则有条件存储指令命令微处理器将数据从数据寄存器存储到存储单元。微处理器还包括乱序执行流水线,乱序执行流水线包括执行微指令的复数个执行单元。其中为了执行微指令的第一个微指令,这些执行单元中的一个执行单元接收基址值及来自寄存器文件的偏移量,并且作为响应这个执行单元产生随基址值与偏移量而变的第一结果,其中第一结果指定存储单元的一个地址。为了执行微指令的第二个微指令,这些执行单元中的一个执行单元接收第一结果。作为响应:如果条件标志满足此条件,那么执行单元将第一结果写入到存储队列中的一个分配的条目,其中此存储队列配置为顺次将数据写入到由该地址指定的存储单元,并且如果条件标志不满足此条件,那么执行单元消灭分配的存储队列条目以使得存储队列不将数据写入到由这个地址指定的存储单元。
[0038] 另一方面,本发明提供了一种微处理器的操作方法,其中微处理器具有定义有条件存储指令的指令集架构且具有存储队列及寄存器文件,此种微处理器的操作方法包括:将有条件存储指令编译为至少两个微指令,其中有条件存储指令指定寄存器文件的数据寄存器、基址寄存器、以及偏移寄存器,其中如果微处理器的条件标志满足指定条件,那么有条件存储指令命令微处理器将数据从数据寄存器存储到存储单元。此种微处理器的操作方法还包括通过微处理器的乱序执行流水线执行微指令。执行微指令的第一个微指令包括接收一个基址值及来自所述寄存器文件的偏移量,并且作为响应产生随基址值与偏移量而变的第一结果,其中第一结果指定存储单元的一个地址。执行微指令的第二个微指令包括接收第一结果,且作为响应如果条件标志满足此条件,则将第一结果写入到存储队列中的一个分配的条目,其中存储队列配置为将数据顺次写入到由此地址指定的存储单元,并且如果条件标志不满足此条件,则消灭分配的存储队列的条目以使得存储队列不将数据写入到由这个地址指定的存储单元。
[0039] 再一个方面,本发明提供了一种微处理器,此种微处理器具有定义有条件存储指令的指令集架构。微处理器包括存储队列及寄存器文件。微处理器还包括指令编译器,指令编译器将有条件存储指令编译为至少两个微指令,其中有条件存储指令指定寄存器文件的数据寄存器以及基址寄存器,其中基址寄存器与数据寄存器不相同,其中如果微处理器的条件标志满足指定条件,则有条件存储指令命令微处理器将数据从数据寄存器存储到存储单元,其中如果满足一个条件,那么有条件存储指令指定基址寄存器待更新。微处理器还包括乱序执行流水线,乱序流水线包括执行微指令的复数个执行单元。为了执行微指令的第一个微指令,这些执行单元的一个执行单元随着从基址寄存器接收的基址值而变,计算存储单元的一个地址。如果条件标志满足此条件,则执行单元将地址写入到存储队列中的一个分配的条目,其中存储队列配置为将数据顺次写入到由地址指定的存储单元,并且如果条件标志不满足此条件,那么执行单元消灭分配的存储队列的条目以使得存储队列不将数据写入到由地址指定的存储单元。其中为了执行微指令的第二个微指令,这些执行单元中的一个执行单元接收偏移量及基址寄存器的一个在前值,并且作为响应这个执行单元计算偏移量与基址寄存器在前值的总和,并且这个执行单元提供一个第一结果,如果满足此条件,第一结果是这个总和,并且如果不满足此条件则第一结果为基址寄存器的在前值。基址寄存器的在前值包括执行一个微指令所产生的结果,其中此微指令是关于第二微指令的基址寄存器的次序上最近的在前写入者。
[0040] 在又一个方面,本发明提供了一种微处理器的操作方法,微处理器具有定义一个有条件存储指令的指令集架构且具有存储队列及寄存器文件。此种微处理器的操作方法包括:将有条件存储指令编译为至少两个微指令,其中有条件存储指令指定寄存器文件的数据寄存器以及基址寄存器,其中基址寄存器与数据寄存器不相同,其中如果微处理器的条件标志满足指定条件,那么有条件存储指令命令微处理器将数据从数据寄存器存储到存储单元,其中如果不满足条件,则有条件存储指令指示基址寄存器要进行更新。此种微处理器的操作方法还包括通过乱序执行流水线执行微指令。执行微指令中的第一个微指令包括:随着从基址寄存器接收的基址值而变计算存储单元的一个地址,并且如果条件标志满足此条件,那么将地址写入到存储队列中的一个分配的条目,其中存储队列配置为将数据顺次写入到由地址指定的存储单元,并且如果条件标志不满足此条件,则消灭分配的存储队列的条目以使得存储队列不将数据写入到由这个地址指定的存储单元。其中执行微指令的第二个微指令包括,接收偏移量及基址寄存器的一个在前值,并且作为响应计算偏移量与基址寄存器的在前值的总和,并且提供一个第一结果,并且如果满足此条件,则第一结果是这个总和,并且如果不满足此条件则第一结果为基址寄存器的在前值。基址寄存器的在前数值包括执行一个微指令所产生的结果,其中此微指令是关于第二微指令的基址寄存器的次序上最近的在前写入者。

附图说明

[0041] 图1是表示根据本发明实施例的运行x86ISA和ARM ISA机器语言程序的微处理器的方框图。
[0042] 图2是更详细地表示出图1的硬件指令编译器的方框图。
[0043] 图3是表示图2的指令格式程序更详细说明的方框图。
[0044] 图4是更详细地表示图1的执行流水线的方框图。
[0045] 图5是更详细地表示图1的寄存器文件的方框图。
[0046] 图6是表示图1的微处理器的操作的流程图。
[0047] 图7是表示根据本发明的双核微处理器的方框图。
[0048] 图8是表示根据本发明另一实施例执行x86ISA和ARM ISA机器语言程序的微处理器的方框图。
[0049] 图9是表示图1的微处理器的更详细部分,并且特别是执行流水线的方框图。
[0050] 图10A是更详细地表示图9的加载单元的方框图。
[0051] 图10B和图10D是更详细地表示图9的存储单元的方框图。
[0052] 图10C和图10E是更详细地表示图9的整数单元的方框图。
[0053] 图10F是更详细地表示图9的存储单元的另一实施例的方框图。
[0054] 图11是图9的微处理器的指令编译器操作的流程图,图中表示出将一个有条件加载指令编译成微指令的操作。
[0055] 图12是图9的微处理器执行有条件加载微指令的操作的流程图。
[0056] 图13是表示图9的微处理器执行一个有条件加载有效地址微指令的流程图。
[0057] 图14是表示图9的微处理器用以执行有条件移动微指令126的操作的流程图。
[0058] 图15是表示图9的微处理器将有条件存储指令编译成微指令的操作的流程图。
[0059] 图16和图17是表示图9的微处理器执行有条件存储融合微指令的操作的流程图。
[0060] 图18是表示图9的微处理器执行有条件加载微指令的另一个实施例的流程图。
[0061] 图19是表示图9的微处理器将有条件存储指令编译成微指令的操作另一实施例的流程图。
[0062] 图20是表示图9的微处理器将有条件存储指令编译成微指令的操作的另一实施例的流程图。
[0063] 图21是表示图9的微处理器执行有条件存储融合微指令的操作的另一实施例的流程图。

具体实施方式

[0064] 本发明的详细说明
[0065] 术语
[0066] “指令集”定义了为机器语言指令的一组二维编码值到微处理器执行的操作的映射关系。(通常,机器语言程序由二进制进行编码,虽然其他一些系统可应用其他进位制,例如:一些老的IBM计算机的机器语言程序是通过十进制进行编码,尽管这些语言程序最终由具有以二进制值感测的电压的物理信号来表示)。可指示微处理器操作的机器语言指令类型的示例性实例为:将寄存器1中的操作数与寄存器2中的操作数相加,并将结果写入至寄存器3,从存储单元0x12345678中的操作数减去此指令所指定的立即操作数并将结果写入到寄存器5,将寄存器6中的数值移位由寄存器7所指定的位数,并且如果标志符设定为零时转至此指令之后的36字节指令,进而从存储单元0xABCD0000将此数值加载至寄存器8中。因此,指令集定义了每一种机器语言指令为了使微处理器执行所期望的操作必须具有的二进制编码值。应当理解的事实是:指令集定义了由二进制数值到微处理器操作的映射并非暗示一个二进制值与一个微处理器操作的映射。具体而言,在一些指令集中,多个二进制值可映射到相同的微处理器操作。
[0067] 在微处理器系列层面上,“指令集架构(ISA)”包括:(1)指令集、(2)通过指令集的指令可访问的一组资源(例如:寄存器以及用于访问存储器的模式)、以及(3)微处理器响应于处理对指令集的指令所产生的一异常(例如,除以零、页面错误、存储器保护冲突)。因为一个程序员,例如一个汇编程序或编译程序员,他想产生可运行于微处理器系列上的机器语言程序,需要它的ISA定义,微处理器的系列的制造者通常在程序员手册中定义此ISA。例如,在2009年3月公布的Intel64与IA-32架构软件开发手册(包括五卷,即第1卷:基本架构;第2A卷:指令集参考A-M;第2B卷:指令集参考N-Z;第3A卷:系统编程指南;以及第3B卷:系统编程指南第二部分),本说明书在此以所有目的被整体引用作为参考,此开发手册的目的在于定义Intel64与IA-32处理器架构的ISA,而这种工业标准结构通常被称为x86架构且也在此称作x86、x86ISA、x86ISA系列、x86系列或其它类似术语。而在另一个实例中,在2010年公布的ARM架构参考手册、ARM v7-A和ARM v7-R版勘误表标记,在此以所有目的被整体引用作为参考,它定义了ARM处理器架构的ISA,这里也称为ARM、ARM ISA、ARM ISA系列、ARM系列或其它类似术语。众所周知的ISA系列的其他实例为IBM System/360/370/390以及z/架构、DEC VAX、摩托罗拉68k、MIPS、SPARC、Power PC及DEC Alpha。其中,此ISA定义覆盖了一系列处理器,由于ISA处理器系列的使用寿命中,制造商可通过例如在指令集加入新指令和/或在架构寄存器组内加入新的寄存器,来增强这一系列中的原处理器的ISA。为清楚地描述,举例而言,随着发展,x86ISA将一组128位的XMM寄存器引入Intel奔腾III处理器系列而作为SSE扩展的部分,并且虽然x86ISA机器语言程序并没用到SSE扩展部分的XMM寄存器,但是x86ISA机器语言程序已经开发出利用XMM寄存器以提高性能。此外,其它制造商已经设计并制造出可运行x86ISA机器语言程序的微处理器。例如,AMD和VIA技术已经加入新特性,例如:AMD3DNOW!SIMD向量处理指令、VIA扣锁安全引擎随机数生成器以及增强型密码引擎特征等,这些特征中的每一项都能够通过一些x86ISA机器语言程序使用但是无法应用在现有的Intel微处理器中。通过另一实例进行说明,ARM ISA最初定义了具有四字节指令的ARM指令集状态。然而,ARM ISA发展为对Thumb指令集状态加入了例如二个字节指令以增加代码密度并加入了Jazelle指令集状态以加速Java字节码程序,并且虽然ARM ISA机器语言程序存在不能够利用其他ARM ISA指令集的状态,但是这种ARM ISA机器语言程序发展为利用了一些或者全部其他类型的ARM ISA指令集状态。
[0068] “ISA的机器语言程序”包括一系列ISA的指令,即ISA指令集映射的一系列二维编码值,以使得程序员希望程序执行的一序列操作。因此,“x86ISA机器语言程序”包括一系列x86ISA指令;并且“ARM ISA机器语言程序”包括一些列ARM ISA指令。这些机器语言指令驻留在存储器中并通过微处理器获取和处理。
[0069] “硬件指令编译器”包括一个晶体管组合,此晶体管组合按照输入接收ISA机器语言指令(例如,x86ISA或ARM ISA机器语言指令)并分别将一个或多个微指令直接输出到微处理器执行流水线。由执行流水线进行的该一个或多个微处理器的执行结果是由ISA指令定义的结果。因此,由执行流水线进行的一个或多个微指令的集体执行“实现”了ISA指令;也就是说,由执行流水线进行的从硬件指令编译器输出的执行微指令的集体执行实现了在ISA指令定义的输入端上由ISA指令指定的操作,用以产生ISA指令定义的结果。因此,硬件指令编译器称作将ISA指令“编译”成一个或多个执行微指令。本申请描述了微处理器的实施例,其中微处理器包括一个硬件指令编译器,以将x86ISA指令和ARM ISA指令编译成微指令。应当理解的是,这种硬件指令编译器不必能够编译x86程序员手册或ARM程序员手册定义的全部指令集,而是能够编译这些指令的子集,这就像大多数的x86ISA或ARM ISA处理器仅支持它们各程序员手册所定义的指令的子集一样。具体而言,通过硬件指令编译器所编译的x86程序员手册定义的指令的子集不必对应于全部现有的x86ISA处理器,并且通过硬件指令编译器编译的ARM程序员手册定义的指令子集不必对应于全部现有的ARM ISA处理器。
[0070] “执行流水线”是一系列的阶段,其中每一阶段包括硬件逻辑和用于保存硬件逻辑输出的硬件寄存器,进而可依据微处理器的时钟信号按照顺序提供给下一阶段。执行流水线可包括多个这样系列的阶段,即存在多个流水线。执行流水线接收作为输入的多个微指令并响应地执行由微处理指令指定的操作以输出结果。不同流水线的硬件逻辑执行由微指令指定的操作,这些操作可包括,但不限于算术、逻辑、内存加载/存储、比较、测试、以及分支分解,并且不同流水线的硬件逻辑执行一定格式的数据的操作,这些格式包括但不限于:整数、浮点、字符、二进制到十进制以及压缩格式。这种执行流水线执行为了实现ISA指令(例如,x86ISA与ARM ISA)的微指令,以产生由ISA指令所定义的结果。执行流水线与硬件指令编译器是不同的;具体而言,硬件指令编译器可产生执行微指令且执行流水线执行这些执行微指令;此外,执行流水线不产生执行微指令。
[0071] “指令高速缓存”是一种微处理器中的随机访问内存装置,微处理器在此随机访问内存装置中放置了ISA机器语言程序的指令(例如x86ISA和ARM ISA机器语言指令),这些指令为在ISA机器语言程序运行期间,从系统存储器最近取出且由微处理器执行的指令。具体而言,ISA定义了一个指令地址寄存器,这个指令地址寄存器保存要执行的下一个ISA指令的存储地址(例如,X86ISA定义的指令指针(IP)以及ARM ISA定义的程序计数器(PC)),并且随着微处理器运行机器语言程序,此微处理器更新指令地址寄存器的内容,进而控制程序的流程。依据指令地址寄存器的内容,ISA指令被存储以用于后续读取的目的,因此,在机器语言程序下一次流程中,ISA指令被更快的从指令高速缓存中读出,而不是从系统寄存器中读出,以使得此寄存器可保留在指令高速缓存中存在的ISA指令的存储地址。特别的是,指令高速缓存可根据在指令地址寄存器(例如,IP或PC)中保留的存储地址进行访问,而不是根据由加载或存储指令所指定的存储地址进行访问。因此,将ISA指令保留为可以专门根据负载/存储地址访问,而不是通过指令地址寄存器值进行访问的数据(例如可存在于使用一个软件编译器的系统的硬件部分中)的一个专用数据高速缓存不是一个指令高速缓存。此外,一个存储指令和数据两者的统一高速缓存,即根据指令地址寄存器值和加载/存储地址访问,但不专门基于一个加载/存储地址访问,因此这种统一高速缓存确定为包含于本发明目的的指令高速缓存的定义中。在这种情况下,加载指令是一个从存储器读入到微处理器中的指令,并且存储指令是一个将数据从微处理器写入到存储器的指令。
[0072] “微指令集”是微处理器的执行流水线能够实现的指令集(微指令)。
[0073] 具体实施例
[0074] 本发明描述了微处理器的实施例,其中微处理器由硬件将x86ISA和ARM ISA两种机器语言程序的x86ISA和ARM ISA指令编译成由微处理器的执行流水线直接执行的微指令,进而能够执行x86ISA和ARM ISA两种机器语言程序。通过不同于x86ISA和ARM ISA两者的微处理器的微架构的微指令集可对微指令进行定义。随着在此描述的微处理器的实施例运行x86和ARM机器语言程序,微处理器的硬件指令编译器将x86和ARM指令编译成微指令,进而将这些微指令提供到微处理器的执行流水线,以执行实现x86和ARM指令的微指令。有利的是,与在由执行流水线执行之前将主指令存储到内存的基于软件编译器的系统不同,由于硬件指令编译器可将执行微指令直接提供到用于执行的执行流水线,所以与使用软件编译器的系统相比微处理器可通过硬件指令编译器更快地运行x86和ARM机器语言程序。
[0075] 现在请参考图1,图1是表示出根据本发明的能够运行x86ISA和ARM ISA机器语言程序的微处理器100的方框图。微处理器100包括:指令高速缓存102;硬件指令编译器104,用于从指令高速缓存102接收x86ISA指令以及ARM ISA指令,并将这些指令转换成微指令126;执行流水线112,用于接收来自硬件指令编译器104的微指令126并执行微指令以产生微指令结果128,微指令结果128作为操作数返回到执行流水线112;寄存器文件
106以及存储器子系统108,分别用于向执行流水线112提供操作数并从执行流水线112接收微指令结果128;以及取指令单元及分支预测器114,用于向指令高速缓存102提供一个取地址134;ARM ISA定义的程序计数器(PC)寄存器116以及x86ISA定义的指令指针(IP)寄存器118,用于通过微指令结果128进行更新并且PC及IP的内容提供给取指令单元及分支预测器114;以及配置寄存器122,用于向硬件指令编译器104、取指令单元及分支预测器
114提供指令模式指示符132和环境模式指示符136,并依据微指令结果128进行更新。
[0076] 当微处理器100执行x86ISA和ARM ISA机器语言指令时,微处理器100根据程序流程将指令从系统存储器(图未示)读取到微处理器100中。微处理器100将最近取出的x86ISA和ARM ISA机器语言指令存储在指令高速缓存102中。取指令单元114产生取地址134,其中根据取地址134从系统存储器中读取x86ISA或ARM ISA的指令字节块。如果取地址134位于指令高速缓存102中,则指令高速缓存102将在取地址134的x86ISA或ARM ISA的指令字节124块提供至硬件指令编译器104,否则从系统存储器中读取ISA指令字节
124。取指令单元114根据ARM PC116和x86IP118中的数值产生取地址134。更具体地说,取指令单元114保持取地址寄存器中的获取地址。而每次取指令单元114读取一个ISA指令字节的新模块时,取指令单元114可按照模块大小更新取地址并继续按这种方式进行处理,直至发生控制流程的事件。这些控制流程的事件包括:产生异常;在所取的模块中存在获取分支时,通过分支预测器114进行预测;以及响应未被分支预测器114预测出的所执行的支路指令而由执行流水线112对ARM PC116和x86IP118进行的更新。响应于一个控制流程的事件,取指令单元114分别将取地址更新为异常处理地址、预测目标地址、或执行目标地址。可预期本发明一个实施例中指令高速缓存102是一个统一高速缓存,用于对ISA指令124与数据的两者进行存储。应该注意的是,在这种统一高速缓存实施例中,虽然可依据加载/存储地址对此统一高速缓存进行访问以读取/写入数据,但是当微处理器100从此统一高速缓存中取ISA指令124时,此统一高速缓存可依据ARM PC116和x86IP118的数值,而不是依据加载/存储地址进行访问。其中,指令高速缓存102是随机存取存储器(RAM)装置。
[0077] 指令模式指示符132为表示微处理器100是否正在读取、格式化/解码、或将x86ISA或ARM ISA指令124编译成微指令126的状态。此外,虽然只是对于微指令集的较小子集,但是执行流水线112和存储器子系统108可接收影响执行微指令126的执行方式的指令模式指示符132。x86IP寄存器118保持将要执行的下一个x86ISA指令124的存储地址,并且ARM PC寄存器116保持将要执行的下一个ARM ISA指令124的存储地址。为了对程序的流程进行控制,微处理器100在执行x86和ARM机器语言程序时,可分别将x86IP寄存器118与ARM PC寄存器116更新为下一序列的指令或分支指令的目标地址或者异常处理地址。当微处理器100执行x86ISA和ARM ISA机器语言程序时,微处理器100可从系统存储器中取机器语言程序的ISA指令,并将ISA指令放置于指令高速缓存102中,用以替换最近较少获取并运行的那些指令。根据指令模式指示符132指示的微处理器100目前读取的ISA指令124是x86ISA模式还是ARM模式,取指令单元114可基于x86IP寄存器118或ARM PC寄存器116的数值产生取地址134。在本发明一个实施例中,x86IP寄存器118和ARM PC寄存器116实现为一个共享的硬件指令地址寄存器,此共享的硬件指令地址寄存器可将其内容提供该取指令单元及分支预测器114,进而根据指令模式指示符132指示x86还是ARM,分别依据x86或ARM语义由执行流水线112进行更新。
[0078] 环境模式指示符136是表示微处理器100在其操作的不同执行环境方面,例如虚拟内存、异常、超缓存控制、以及整体运行时间保护中是应用x86ISA语义还是ARM ISA语义的状态。因此,指令模式指示符132和环境模式指示符136一起创建多种执行模式。在指令模式指示符132和环境模式指示符136同时指示x86ISA模式的第一模式中,微处理器100可作为正常的x86ISA处理器。而在指令模式指示符132和环境模式指示符136同时指示为ARM ISA模式的第二模式中,微处理器100可作为正常的ARM ISA处理器。在第三模式中,指令模式指示符132指示为x86ISA而环境模式指示符136指示为ARM ISA,第三模式有利的是,例如可在ARM操作系统或管理程序的控制下执行用户模式x86机器语言程序;相反,在指令模式指示符132指示为ARM ISA而环境模式指示符136指示为x86ISA的第四模式中,有利的是,例如在x86操作系统或管理程序的控制下可用于执行用户模式ARM机器语言程序。指令模式指示符132和环境模式指示符136在最初可设定为复位状态。在本发明的一个实施例中,这些初始值可编码为微代码常量,但也可以通过融合程序(blown configuration fuse)和/或微代码补丁对此初始值进行修改。而在本发明的另一个实施例中,初始值可由外部向微处理器100提供。在本发明的一个实施例中,环境模式指示符
136仅可通过复位到ARM的指令124或复位到x86ISA的指令124进行复位之后被改变(以下将参考图6描述);也就是说,在没有通过常规的复位操作或复位到x86或复位到ARM指令124对微处理器100复位时,在微处理器100的正常运行期间,环境模式指示符136可不发生改变。
[0079] 硬件指令编译器104接收输入的x86ISA及ARM ISA的机器语言指令124,并作为响应输出用于执行x86或ARM ISA指令124的一个或多个微指令126。由执行流水线112对一个或多个微指令126的共同执行实现了x86ISA或ARM ISA指令124。也就是说,该共同执行在x86或ARM ISA指令124指定的输入上完成了由x86或ARM ISA指令124指定的操作,以产生x86或ARM ISA指令124定义的结果。因此,硬件指令编译器104将x86或ARM ISA指令124编译成一个或多个执行微指令126。硬件指令编译器104包括按预定形式排布的一组晶体管,用以将x86ISA或ARM ISA机器语言指令124编译成一个或多个执行微指令126。硬件指令编译器104包括用于产生执行微指令126的布尔逻辑门(例如,图2的简单指令编译器204)。在本发明的一个实施例中,硬件指令编译器104还包括微编码只读存储器(例如,图2的复杂指令编译器206的元件234),硬件指令编译器104使用这种微编码只读存储器产生复杂ISA指令124的执行微指令126,更详细的描述请参考图2。较佳地,硬件指令编译器104不必对通过x86程序员手册或ARM程序员手册定义的ISA指令
124的全部指令集进行编译,而是能够对这些指令的子集进行编译。具体而言,硬件指令编译器104所编译的x86程序员手册定义的ISA指令124的子集不必和Intel公司所开发的任何现有的x86ISA处理器相对应,并且硬件指令编译器104所编译的ARM程序员手册定义的ISA指令124的子集不必和ARM公司所开发的任何现有的ISA处理器相对应。实现x86或ARM ISA指令124的一个或多个执行微指令126可通过硬件指令编译器104一次性地或依顺序提供给执行流水线112。有利的是,硬件指令编译器104可直接为执行流水线112提供执行微指令126,进而不需要将这些微指令存储在硬件指令编译器104与执行流水线112之间的存储器中。在图1中的微处理器100的实施例中,随着微处理器100运行x86或ARM机器语言程序,每次微处理器100执行x86或ARM指令124时,硬件指令编译器104将x86或ARM机器语言指令124编译成可执行的一个或多个微指令126。但是,在图8所示出的实施例中,使用了微指令高速缓存,以避免每次微处理器100执行x86或ARM ISA指令124时进行再编译。图2对硬件指令编译器104的实施例进行了更详细的描述。
[0080] 执行流水线112执行通过硬件指令编译器104所提供的执行微指令126。大致而言,执行流水线112是一种通用的高速微指令处理器,虽然这里以x86/ARM的特定知识对执行流水线112执行的功能进行了描述,但微处理器100的其它部分,例如硬件指令编译器104也可执行大量的x86/ARM特定功能。在本发明的一个实施例中,执行流水线112可处理寄存器重命名、超级标量问题、以及从硬件指令编译器104接收的执行微指令126不按顺序执行的问题。图4详细地描述了这种执行流水线112。
[0081] 微处理器100的微架构包括:(1)微指令集;(2)一组由微指令集的微指令126可访问的资源,这些资源可为x86ISA和ARM ISA资源的超集;以及(3)一组由微处理器100定义的,响应微指令126的执行而产生的微异常,这些微异常是x86ISA和ARM ISA异常组成的一个超集。此微架构不同于x86ISA和ARM ISA。更具体而言,微指令集在几个方面都不同于x86ISA和ARM ISA指令集。第一,此微指令集的微指令可指示执行流水线112所进行的一组操作与x86ISA和ARM ISA指令集的指令可命令微处理器执行的一组作业没有一对一的对应关系。虽然许多操作可能是相同的,但是可能会有一些操作由微指令集指定而不能够由x86ISA和/或ARM指令集指定;相反,可能会有一些操作由x86ISA和/或ARM指令集指定而不能够由微指令集指定。第二,微指令集的微指令的编码方式与x86ISA和ARM ISA指令集中指令的编码方式不同。也就是说,虽然许多相同的操作(例如,相加、移位、加载、返回)可由微指令集和x86ISA及ARM ISA指令集两者指定,但是在微指令集与x86或ARM ISA指令集的二进制操作码数值到操作的映射关系之间并不是一一对应的。如果微指令集中的二进制操作码数值到操作的映射与x86或ARM ISA指令集的二进制操作码数值到操作的映射相同,一般而言这是巧合的,并且微指令集的二进制操作码数值到操作的映射与x86或ARM ISA指令集的二进制操作码数值到操作的映射仍然不是一一对应的。第三,微指令集的微指令的字段与x86或ARM ISA指令集的指令的字段之间也不具有一一对应关系。
[0082] 作为一个整体来看,微处理器100能够执行x86ISA和ARM ISA机器语言程序指令。然而,执行流水线112不能执行x86或ARM ISA机器语言指令本身;相反,执行流水线112执行从x86ISA和ARM ISA指令编译出的微处理器100微架构的微指令集的执行微指令126。
然而,虽然此微架构与x86ISA及ARM ISA不相同,但是可预期到其中微指令集和其他微架构指定的资源受到用户影响的其他实施例;也就是说,在这些其他实施例中,此微架构可以是除x86ISA与ARM ISA之外可在微处理器100中执行它的机器语言程序的第三种ISA。
[0083] 表1描述了微处理器100的一个实施例的微指令集的微指令126的一些字段。
[0084]
[0085] 表1
[0086] 以下,表2描述了微处理器100的一个实施例的微指令集中的一些微指令。
[0087]
[0088]
[0089]
[0090] 表2
[0091] 微处理器100还包括一些微架构指定资源,例如:微架构指定的通用寄存器、媒体寄存器、以及段寄存器(例如,用于寄存器重命名或微代码所使用的段寄存器)、x86ISA和ARM ISA不可见的控制寄存器以及下文将有更多描述的专用微架构指定随机存储器(PRAM)。此外,这种微架构可以产生异常,简称微异常,这种微异常并不由x86或ARM ISA指定或不为x86或ARM ISA所见。可以理解的是,表1中所列举的字段、表2中所列举的微指令以及上文所列出的微架构所指定的异常仅是用于说明微架构的实例而并不是穷举每一种情况。
[0092] 寄存器文件106包括由微指令126所使用的硬件寄存器,以保存源和/或目标操作数。执行流水线112将其结果128写入至寄存器文件106并从寄存器文件106接收用于微指令126的操作数。硬件寄存器的示例为x86ISA定义和ARM ISA定义的寄存器。在一个实施例中,x86ISA和ARM ISA定义的许多通用寄存器共享寄存器文件106的寄存器的一些实例。举例而言,在一个实施例中,寄存器文件106的示例为由ARM ISA寄存器R0至R14和x86ISA EAX至R14D寄存器所共享的15个32位寄存器。因此,举例而言,如果第一微指令126将一数值写入到ARM R2寄存器中,则然后读取x86ECX寄存器的一随后的第二微指令126将接收由第一微指令126写入的该相同数值,反之亦然。这有利于使得X86ISA和ARM ISA机器语言程序通过寄存器快速地进行联系。例如,假定在ARM机器语言操作系统中运行的ARM机器语言程序实现指令模式132到x86ISA的变化,并控制转换到x86机器语言例行程序以执行某种功能,而这样做的好处可在于x86ISA支持能够执行特定操作的某种指令,这种指令所执行的操作比在ARM ISA中运行的更快。ARM程序可以为寄存器文件106的共享寄存器提供x86例行程序所需的数据。相反,x86例行程序也能够将结果提供到寄存器文件106的共享寄存器中,该结果当利用x86例行程序返回给ARM程序时对ARM程序可见。类似地,在x86机器语言操作系统下运行的x86机器语言程序可实现指令模式132到ARM ISA的变化并控制转换到ARM机器语言例行程序;x86程序能够将ARM例行程序所需的资料提供于寄存器文件106的共享寄存器中,并且,ARM例行程序能够将结果提供到寄存器文件106的共享寄存器中,当利用ARM程序返回至x86程序时此结果对x86程序可见。其中,一个个别的实例是,由于ARM R15为ARM PC寄存器116,因此示例出x86R15D寄存器的第十六个32位寄存器不被ARM R15寄存器共享。此外,在一个实施例中,三十二个
32位ARM VFPv3浮点寄存器共享x86模式的十六个128位寄存器XMM0至XMM15以及十六个128位的高级SIMD(“Neon”)寄存器的32位部分。寄存器文件106的示例为标志寄存器(即x86EFLAGS寄存器与ARM条件标志寄存器),以及由x86ISA与ARM ISA定义的不同的控制及状态寄存器。此架构的控制及状态寄存器包括x86架构模式指定寄存器(MSR)和保留ARM的协处理器(8-15)寄存器。寄存器文件106的还示例为非架构寄存器,例如用于寄存器重命名并由微代码234使用的非架构通用寄存器,以及非架构x86MSR以及定义的执行程序,或是由供应商特定的ARM协处理器寄存器。根据图5对寄存器文件106进行了进一步的说明。
[0093] 存储器子系统108包括高速缓冲存储器的高速缓冲存储器层次结构(在一个实施例中,包括一级指令缓存102、一级数据缓存、以及标准的二级缓存)。存储器子系统108还包括各种存储器请求队列,例如:加载、存储、填充、探听、写结合缓冲。存储器子系统108还包括具有翻译后援缓冲器(TLB)的存储器管理单元(MMU),其中较佳的是分开的指令翻译后援缓冲器与数据翻译后援缓冲器。存储器子系统108还包括表格漫游引擎,以响应于翻译后援缓冲器(TLB)失败而获得虚拟到物理地址的编译。虽然在图1中分开示出了指令高速缓存102与存储器子系统108,但在逻辑上,指令高速缓存102是存储子系统108的一部分。存储子系统108设置为可使x86与ARM机器语言程序共享一个共用存储空间,这样的优点是能够使得x86与ARM机器语言程序便于通过存储器进行联系。
[0094] 存储器子系统108可识别使得存储器子系统能够在适当的ISA环境中执行各种操作的指令模式132和环境模式136。举例而言,存储器子系统108可根据指令模式指示符132指示x86或ARM ISA,执行某些内存访问冲突检查(例如,限制违规检查)。在另一个实例中,响应于环境模式指示符136的变化,存储器子系统108刷新翻译后援缓冲器(TLB);
然而,存储器子系统108不会响应于指令模式指示符132的变化而刷新翻译后援缓冲器(TLB),由此在指令模式指示符132和环境模式指示符136中的一个指示x86且另一个指示ARM的上述第三模式与第四模式中会具有更好的效果。在另一个实例中,响应于TLB失败,表格漫游引擎会根据环境模式指示符136指示x86ISA还是ARM ISA而使用x86页面表格或ARM页面表格执行页面表格漫游以填充TLB。在另一个实例中,如果状态指示符136指示x86ISA,则存储器子系统108可对影响缓存规则(例如,CR0CD及NW位)的适合的x86ISA控制寄存器的架构状态进行检查,并且如果环境模式指示符136指示ARM ISA,则存储器子系统108可对适合的ARM ISA中的控制寄存器(例如,SCTLR I及C位)的架构状态进行检查。在另一个实例中,如果状态指示符136指示x86ISA,则存储器子系统108对影响内存管理(例如,CR0PG位)的适当的x86ISA控制寄存器的架构状态进行检查,并且如果环境模式指示符136指示ARM ISA,则存储器子系统108对适当的ARM ISA控制寄存器(例如,SCTLR M位)的架构状态进行检查。在另一实例中,如果状态指示符136指示x86ISA,则存储器子系统108对影响队列检查(例如,CR0AM位)的适当的x86ISA控制寄存器的架构状态进行检查,并且如果环境模式指示符136指示ARM ISA,则存储器子系统108对适当的ARM ISA控制寄存器(例如,SCTLR A位)的架构状态进行检查。而在又一实例中,如果状态指示符136指示x86ISA,则存储器子系统108(以及用于特权指令的硬件指令编译器104)对指定当前特权级(CPL)的适当的x86ISA控制寄存器的架构状态进行检查,并且如果环境模式指示符
136指示ARM ISA,则存储器子系统108(以及用于特权指令的硬件指令编译器104)对指示用户或特权模式的适当的ARM ISA控制寄存器的架构状态进行检查。然而,在一个实施例中,x86ISA与ARM ISA共享具有类似功能的微处理器100的控制位/寄存器,而不是微处理器100为每一个ISA示例个别的控制位/寄存器。
[0095] 虽然图中分开示出,但配置寄存器122可以是寄存器文件106的一个合理部分。配置寄存器122包括全局配置寄存器,这个全局配置寄存器在涉及x86ISA与ARM ISA的不同方面控制微处理器100的操作,这些不同方面例如为使得不同特性生效或失效的能力。全局配置寄存器可使得微处理器100执行ARM ISA的机器语言程序的能力失效,即,使得微处理器100只作为x86微处理器100,包括禁用其它相关的ARM特定的能力,例如在此所述启动x86及复位到x86的指令124以及实现定义的协处理器寄存器。全局配置寄存器还可用于使得微处理器100执行x86ISA机器语言程序的能力失效,即,使得微处理器100只作为ARM微处理器100,并使得禁用其它相关的能力,例如在此所述的启动ARM及复位到ARM指令124以及新的非架构MSR。在一个实施例中,微处理器100制造为初始具有缺省配置默认值,例如微代码234中的硬编码值,其中微代码234在初始化时使用硬代码值用于设置微处理器100,就是说写入配置寄存器122。然而,一些配置寄存器122是通过硬件设置的而不是通过微代码234设置。此外,微处理器100包括可通过微代码234读取的融合器(fuse),此融和器可被熔合以修改缺省配置默认值。在一个实施例中,微代码234读取熔合器并使用默认值和熔合器值执行异或运算,并将结果写入到配置寄存器122。更进一步地,熔合器的调整作用可通过微代码234的补丁进行反转。假设微处理器100设置为可执行x86和ARM程序的两者,则全局配置寄存器还可用以确定微处理器100(或者例如关于图7所示的多核部分中的特定核心100)在复位或响应于x86型INIT时,微处理器100作为x86微处理器或ARM微处理器启动,如以下结合图6的更详细描述。全局配置寄存器还包括为某些架构控制寄存器,例如ARM ISA SCTLT寄存器以及CPACR寄存器提供初始默认值的位。在一个多核心的实施例中,如在图7所进行的描述,存在一个单一的全局配置寄存器,虽然每个核心可单独配置为例如作为x86或ARM核心启动,即,使用均可分别设定x86或ARM的指令模式指示符132和环境模式指示符136;此外,启动ARM的指令126和用于启动x86的指令126可用于在x86指令模式132和ARM指令模式132之间动态地切换。在一个实施例中,全局配置寄存器可通过x86RDMSR指令对一个新的非架构MSR可读,其中控制位的一部分经由x86WRMSR指令对于这个新的非架构MSR可写,并且全局配置寄存器可经由ARM MRC/MRRC指令对映射至这个新的非架构性MSR的ARM协处理器寄存器可读取,并且其中控制位的一部分经由ARM MRC/MRRC指令对映射至这个新的非架构性MSR的ARM协处理器寄存器可写。
[0096] 配置寄存器122还包括各种控制寄存器,用于控制微处理器100在非x86/ARM指定的不同方面的操作,这些控制寄存器还被称为全局寄存器、非ISA控制寄存器、非x86/ARM控制寄存器、通用控制寄存器或类似的名称。在一个实施例中,这些控制寄存器经由x86RDMSR/WRMSR指令能够由非架构MSR访问并经由ARM MCR/MRC(或MCRR/MRRC)指令能够由新的实现定义的协处理器寄存器访问。举例而言,微处理器100包括非x86/ARM指定的控制寄存器,确定细微的缓存控制,即,比X86ISA与ARM ISA控制寄存器所提供的控制更细微。
[0097] 在一个实施例中,微处理器100经由直接映射到相应的x86MSR的实现定义的ARM ISA协处理器寄存器,提供通向X86ISA MSR的ARM ISA机器语言程序。MSR的地址在ARM ISA R1寄存器中指定。数据从由MRC/MRRC/MCR/MCRR指令指定的ARM ISA寄存器中读取或写入到此寄存器。在一个实施例中,MSR的一个子集是受密码保护的,即,试图访问MSR的指令必须提供一个密码;在这个实施例中,密码在ARM的R7:R6寄存器中指定。如果这个访问将导致x86的通用保护故障的话,则微处理器100产生ARM ISA UND异常。在一个实施例中,ARM协处理器4(地址:0,7,15,0)用以访问相应的x86MSR。
[0098] 微处理器100还包括耦合到执行流水线112的中断控制器(图未示)。在一个实施例中,中断控制器是一个x86型高级可编程中断控制器(APIC),借以将x86ISA中断映射到ARM ISA中断。在一个实施例中,x86INTR映射到ARM IRQ中断;x86NMI映射到ARM IRQ中断;x86INIT产生INIT复位序列,不管最初硬件复位从哪个ISA(x86或ARM)开始,微处理器100开始于该INIT复位序列ISA;x86SMI映射到ARM FIQ中断;并且x86STPCLK、A20、Thermal、PREQ、以及Rebranch不映射到ARM中断。ARM机器语言程序能够经由新的实现定义的ARM协处理器寄存器访问APIC的功能。在一个实施例中,APIC寄存器地址在ARM R0寄存器中指定,并且APIC寄存器地址与x86地址相同。在一个实施例中,ARM协处理器6(地址:0、7、nn、0,其中nn为15时用于访问APIC,并且为12-14时用于访问总线接口单元,以在处理器总线上执行8位、16位、以及32位进出循环)用于通常由操作系统使用的特权模式功能。微处理器100还包括耦合到存储器子系统108以及执行流水线112的一个总线接口单元(图未示),用于作为微处理器100到处理器总线的接口。在一个实施例中,处理器总线符合不同的英特尔奔腾系列微处理器总线中的一种。ARM机器语言程序能够经由新实现定义的ARM协处理器寄存器来访问总线接口单元的功能,用以在处理器总线上产生I/O周期,即进与出总线在I/O空间中传送指定的地址,这些I/O周期用于与系统的芯片组进行联系,例如可产生SMI应答特定周期或是产生与C状态转换相关的I/O周期。在一个实施例中,I/O地址在ARM R0寄存器中指定。在一个实施例中,微处理器100还包括电源管理功能,例如众所周知的P-状态管理和C-状态管理。ARM机器语言程序能够经由新实现定义的ARM协处理器寄存器执行电源管理。在一个实施例中,微处理器100还包括位于执行流水线112中的一加密单元(图未示)。在一个实施例中,加密单元基本上类似于包括挂锁(Padlock)功能的VIA微处理器的加密单元。ARM机器语言程序能够访问加密单元的功能,例如经由新实现定义的ARM协处理器寄存器访问加密指令。在一个实施例中,ARM协处理器5使用于通常由用户模式应用程序采用的用户模式函数,例如那些可使用加密单元特征的用户模式函数。
[0099] 随着微处理器100运行X86ISA与ARM ISA机器语言程序,硬件指令编译器104可在每次微处理器100执行x86或ARM ISA指令124时执行硬件编译。值得注意的是,相比之下,基于软件编译的系统可通过在许多情况中重新使用编译,而并非对先前编译过的机器语言指令进行重新编译进而提高其性能。此外,图8的实施例使用了微指令高速缓存,以潜在地避免每次微处理器100执行x86或ARM ISA指令124时的重新编译。因此,每一种方法可根据程序特性及程序运行环境的不同具有不同的优点。
[0100] 分支预测器114可存储先前执行的x86和ARM两者的分支指令的历史信息。当根据所存储的历史信息从指令高速缓存102取出高速缓存线时,分支预测器114预测x86与ARM两者的分支指令124是否出现以及在高速缓存线中的目标地址。在一个实施例中,缓存的历史信息包括分支指令124的存储地址、分支目标地址、方向(取或未取)指示、分支指令的类型、分支指令在高速缓存线中的起始字节、以及指令是否跨越多个高速缓存线的指示。在一个实施例中,分支预测器114可增强对于ARM ISA条件非分支指令方向的预测,请参见
2011年4月7日提交的美国临时申请第61/473,067号,名称为《APPARATUS AND METHOD FOR USING BRANCH PREDICTION TO EFFICIENTLY EXECUTE CONDITIONAL NON-BRANCH INSTRUCTIONS》。在一个实施例中,硬件指令编译器104还包括一个静态分支预测器,用于根据操作码、条件码类型、向后/向前等信息预测对于x86和ARM二者的方向和分支目标地址。
[0101] 可期望实现由X86ISA与ARM ISA定义的特征的不同组合的各种实施例,例如,在一个实施例中,微处理器100实现ARM、Thumb、ThumbEE与Jazelle指令集的状态,但是提供了Jazelle扩展的简单实现;并且实现了以下的指令集扩展:Thumb-2、VFPv3-D32、高级SIMD(“Neon”)、多重处理、以及VMSA;并且不实现以下的扩展:安全扩展、快速上下文切换扩展、ARM调试功能(然而,x86调试功能可由ARM程序经由ARM MCR/MRC指令可由新定义的协处理器寄存器访问)、性能监视计数器(然而,x86性能计数器经由新的实现定义的协处理器寄存器由ARM程序访问)。对于另一个实例,在一个实施例中,微处理器100以空操作指令处理ARM SETEND指令并且只支持小端的数据格式。对于另一个实例,在一个实施例中,微处理器100不实现x86的SSE4.2功能。
[0102] 可以预期的一个实施例为,微处理器100可为一个商用微处理器,即由台湾台北TM TM的威盛技术有限公司制造的威盛Nano 处理器的增强,威盛Nano 处理器可运行x86ISA机器语言程序但是不能运行ARM ISA机器语言程序。这种Nano处理器包括一个高性能的寄存器重命名、超标量指令发布、乱序执行流水线以及硬件编译器,此硬件编译器将x86ISA指令编译成由执行流水线执行的微指令。Nano硬件指令编译器可基本上如此所述进行增强,用以除了x86机器语言指令之外,还将ARM ISA机器语言指令编译成可由执行流水线执行的微指令。这种对硬件指令编译器的增强可包括对包含微代码的简单指令编译器和复杂指令编译器的增强。此外,新的微指令可以添加到微指令集中以支持将ARM ISA机器语言指令编译成微指令,并且可提高执行流水线以执行新的微指令。此外,Nano寄存器文件和存储器子系统可大致如在此所述进行增强以包括共享一定的寄存器来支撑ARM ISA。分支预测单元还可如此所述进行增强以除X86分支之外还容纳ARM分支指令预测。有利的是,需要对Nano微处理器的执行流水线进行一个相对适度量的修改以容纳ARM ISA指令,因为它已经很大程度上与ISA无关。对执行流水线的增强可包括:产生并使用条件码标志的方式;用于更新和报告指令指针寄存器的语义(semantics);访问特权保护方法;以及各种与内存管理相关的功能,例如:访问违例检查、分页及TLB使用、以及高速缓存规则,此处仅给出一些示意性实例,并且下面将对其中一些进行详细描述。最后,如上所述,x86ISA与ARM ISA中定义的各种特性可在Nano增强的实施例中得不到支持,例如:x86SSE4.2及ARM安全扩展、快速的上下文切换扩展、调试、以及性能计数器特征,此处仅给出一些示意性实例,并且下面将对其中一些进行更详细的描述。用以支持运行ARM ISA机器语言程序的Nano处理器的增强是这样一个实施例的实例:进行设计、测试和制造资源的协同使用,以可以运行代表着市场上绝大多数现有的机器语言程序的x86和ARM两种机器语言程序的单个集成电路的实时方式而走向市场。特别地,在此所述的微处理器100设计的实施例可配置为x86微处理器、ARM微处理器、或可以同时运行x86ISA和ARM ISA两种机器语言程序的微处理器。同时运行x86ISA和ARM ISA机器语言程序的能力可通过在单个微处理器100(或核心
100,请参见图7)上的x86ISA和ARM ISA机器语言程序之间动态切换;通过将多核心微处理器100(如结合图7所述)中的一个或多个核心100配置为ARM核心以及将一个或多个核心配置为x86核心;或者通过两者的结合,即,多核心100的每一个之上的x86和ARM指令模式132之间的动态切换而获得。此外,从历史上看,ARM ISA核心已被设计为知识产权的核心以由不同的第三方供应商纳入到应用程序中,例如SOC和/或嵌入式应用中。因此,ARM ISA未指定用于将ARM核心连接至系统其余部分,例如芯片或其他外围设备的标准化处理器总线。有利的是,Nano处理器已经包括:连接内存与外围设备的高速x86型处理器总线;以及内存一致性结构,其与微处理器100协同工作以在x86PC型系统环境中支持ARM ISA机器语言程序的运行。
[0103] 现在请参照图2,图2是更详细地表示出图1的硬件指令编译器104的方框图。硬件指令编译器104包括硬件,更确切地说是一些晶体管的集合。硬件指令编译器104包括:指令格式程序202,用于从图1的指令高速缓存102接收指令模式指示符132以及x86ISA与ARM ISA指令字节124的块,并且输出格式化的x86ISA与ARM ISA指令242;简单指令编译器(SIT)204,用于接收指令模式指示符132及环境模式指示符136,并输出执行微指令
244及微代码地址252;复杂指令编译器(CIT)206(也被称为微代码单元),用于接收微代码地址252及环境模式指示符136并提供执行微指令246;以及多路复用器212,用于在一个输入端接收来自简单指令编译器204的微指令244,且在另一输入端从复杂指令编译器206接收微指令246,并且多路复用器212将执行微指令126提供给图1的执行流水线112。图
3更详细描述了指令格式程序202。简单指令编译器204包括x86SIT222和ARM SIT224。
复杂指令编译器206包括:微程序计数器(微-PC)232,用于接收微代码地址252;微代码只读存储器(ROM)234,从微程序计数器232接收只读存储器地址254;微序列器236,更新微程序计数器232;指令间接寻址寄存器(IIR)235;以及微编译器237,产生由复杂指令编译器206输出的执行微指令246。简单指令编译器204产生的执行微指令244和复杂指令编译器206产生的执行微指令246均为微处理器100的微架构的微指令集的微指令126,并且执行微指令244与执行微指令246可直接由执行流水线112执行。
[0104] 多路复用器212由选择输入248控制。通常,多路复用器212从简单指令编译器204选择微指令;然而,当简单指令编译器204遇到复杂的x86或ARM ISA指令242并且将控制或收集传送到复杂指令编译器206时,简单指令编译器204控制选择输入248以使得多路复用器212从复杂指令编译器206中选择微指令246。当RAT402(图4中的)遇到微指令126,并且此微指令126具有特定的位设置而指示该指令为执行复杂ISA指令242的序列中最后的微指令时,RAT402控制选择输入248以使得多路复用器212返回到从简单指令编译器204选择微指令244。此外,重新排序缓冲器422控制选择输入248,以使得当重新排序缓冲器422(参见图4)根据微指令126的状态需要而准备解除微指令126时,例如如果状态指示微指令126已经引起一个异常条件时,使得多路复用器212从复杂指令编译器
206中选择微指令246。
[0105] 简单指令编译器204接收ISA指令242,并且如果指令模式指示符132指示为x86,则简单指令编译器204将ISA指令242解码为x86ISA指令,如果指令模式指示符132指示为ARM,则简单指令编译器204将ISA指令242解码为ARM ISA指令。简单指令编译器204还确定ISA指令242是简单ISA指令还是复杂ISA指令。简单ISA指令242是简单指令编译器204可向其发出执行ISA指令242的所有执行微指令126的指令;也就是说,复杂指令编译器206不对简单ISA指令242提供任何的执行微指令126。相反,复杂ISA指令124需要复杂指令编译器206提供如果非全部的话,则提供至少一些的执行微指令126。在一个实施例中,对于ARM和x86ISA指令集的指令124的一个子集,简单指令编译器204发出实现x86/ARM ISA指令126的微指令244的一部分,并且然后对复杂指令编译器206传送控制,复杂指令编译器206随后发出实现x86/ARM ISA指令126的微指令246的剩余部分。多路复用器212受到控制,进而首先将来自简单指令编译器204的执行微指令244提供给执行流水线112而作为微指令126,其次,将来自复杂指令编译器206的执行微指令246提供给执行流水线112而作为微指令126。简单指令编译器204了解硬件指令编译器104所使用的各种微代码例行程序的起始微代码ROM234的地址,用以对不同的复杂ISA指令124产生执行微指令126,并且当简单微指令编译器204对复杂ISA指令242解码时,简单微指令编译器204将相关的微代码例行程序地址252提供至复杂指令编译器206的微PC232。
简单指令编译器204发出需要执行ARM和x86ISA指令集的相对高百分比的指令124的全部微指令,特别是趋向于以高频率由X86ISA和ARM ISA机器语言程序执行的特定ISA指令124的全部微指令,并且仅一个相对低的百分比需要复杂指令编译器206来提供执行微指令246。根据一个实施例,主要由复杂指令编译器206执行的x86指令的实例是PDMSR/WRMSR、CPUID、复杂的数学指令(例如,FSQRT和超越指令)、以及IRET指令;并且主要由复杂指令编译器206执行的ARM指令的实例是MCR、MRC、MSR、MRS、SRS、以及RFE指令。前面的列举并不详尽,但提供了由复杂指令编译器206执行的ISA指令类型的表达。
[0106] 当指令模式指示符132指示x86时,x86SIT222对x86ISA指令242解码并将x86ISA指令242编译为执行微指令244;当指令模式指示符132指示ARM时,ARM SIT224对ARM ISA指令242解码并将ARM ISA指令242编译成执行微指令244。在一个实施例中,简单指令编译器204是使用众所周知的合成工具合成的一组布尔逻辑门。在一个实施例中,x86SIT222与ARM SIT224是单独的布尔逻辑门;然而,在另一个实施例中,x86SIT222与ARM SIT224为单个组的布尔逻辑门。在一个实施例中,简单指令编译器204在每个时钟周期编译最多三个ISA指令242并向执行流水线提供最多六个执行微指令244。在一个实施例中,简单指令编译器204包括三个子编译器(图未示),其中每一个子编译器编译单一格式的ISA指令242:第一子编译器能够编译需要不超过三个执行微指令126的格式化ISA指令242;第二子编译器能够编译需要不超过两个执行微指令126的格式化ISA指令242;以及第三子编译器能够编译需要不超过一个执行微指令126的格式化ISA指令242。在一个实施例中,简单指令编译器204包括一个硬件状态机,硬件状态机使得简单指令编译器在多个时钟周期输出执行ISA指令242的多个微指令244。
[0107] 在一个实施例中,简单指令编译器204还根据指令模式指示符132和/或环境模式指示符136执行不同的异常检查。例如,如果指令模式指示符132指示x86且x86SIT222解码对x86ISA无效的ISA指令124时,则然后简单指令编译器204产生一个x86无效的操作码异常;类似地,如果指令模式指示符132指示ARM且ARM SIT224解码对ARM ISA无效的ISA指令124,则然后简单指令编译器204产生一个ARM未定义的指令异常。在另一个实例中,如果环境模式指示符136指示X86ISA,则然后简单指令编译器204检查所遇到的每一个x86ISA指令242是否需要特定的特权等级,如果结果为是,则检查CPL是否满足X86ISA指令242所需要的特权等级,如果结果为否则产生异常信号;类似地,如果环境模式指示器136指示ARM ISA,则然后简单指令编译器204检查每一个格式化的ARM ISA指令242是否为特权模式指令,如果结果为是,则检查当前模式是否为特权模式,如果当前模式为用户模式则产生异常信号。复杂指令编译器206对于某些复杂ISA指令242执行类似的功能。
[0108] 复杂指令编译器206向多路复用器212输出一系列的执行微指令246。微代码ROM234存储微代码例行程序的ROM指令247。微代码ROM234响应于由微PC232保持的,待从微代码ROM234中取出的下一个ROM指令247的地址,进而输出ROM指令247。通常,随着简单指令编译器204解码复杂ISA指令242,微PC232从简单指令编译器204接收微PC232的初始值252。在其他情况下,例如作为对复位或异常的响应,微PC232分别接收复位微代码例行程序地址或适当的微代码异常处理程序的地址的地址。微序列器236通常根据ROM指令247的大小将微PC232更新为通过微代码例行程序的序列,并且或者是随着执行一个控制型指令126,例如分支到微代码ROM234中的非时序位置的分支指令,将微PC232更新为由执行流水线112产生的目标地址。微代码ROM234在微处理器100的半导体晶粒中制造。
[0109] 除了产生执行简单ISA指令124或复杂ISA指令124的一部分的微指令224之外,简单指令编译器204还产生写入到指令间接寄存器(IIR)235的指令信息255。IIR235中存储的ISA指令信息255包含关于正在编译的ISA指令124的信息,例如,识别由ISA指令124指定的源和目标寄存器以及ISA指令124的形式的信息,例如ISA指令124是否在微处理器100内存中或架构寄存器106中的操作数上操作。这样,使得微代码例行程序是通用的,即不必使得每一个不同的源寄存器和/或目标寄存器具有不同的微代码例行程序。特别地,简单指令编译器204对寄存器文件106熟知,包括哪些寄存器为共享的寄存器504,并且经由ISA指令信息255将x86ISA和ARM ISA指令124中提供的寄存器信息编译到文件寄存器106中适当的寄存器。ISA指令信息255还包括位移字段、立即字段、常量字段、为每个源操作数和微指令126本身重命名的信息、在实现ISA指令124的一系列微指令126中指示第一个与最后一个微指令126的信息、以及由硬件指令编译器104从ISA指令124的解码发现的有用信息的其它位。
[0110] 微编译器237从微代码ROM234接收ROM指令247以及IIR235的内容。作为响应,微编译器237产生执行微指令246。依据从IIR235接收的信息,例如根据ISA指令124的形式与源和/或目标架构寄存器106所指定的源和/或目的架构寄存器106的组合信息,微编译器237将某些ROM指令247编译成不同序列的微指令246。在许多情况下,许多的ISA指令信息255与ROM指令247合并,进而产生执行微指令246。在一个实施例中,每个ROM指令247大约40位宽,并且每个微指令246大约200位宽。在一个实施例中,微编译器237能够从ROM指令247产生最多三个的微指令246。微编译器237包括用于产生执行微指令246的布尔逻辑门。
[0111] 微编译器237提供的一个优点是,由于简单指令编译器204产生ISA指令信息255,于是微代码ROM234无需存储IIR235提供的ISA指令信息255,因此可减小微代码ROM234的大小。此外,由于微代码ROM234不需要包括对于每一个不同的ISA指令形式以及每一个源和/或目标架构寄存器106组合的例行程序,所以微代码ROM234的例行程序可包含较少的条件分支指令。举例而言,如果复杂ISA指令124是存储器形式,则简单指令编译器204可产生包含微指令244的微指令244前序,以将源操作数从存储器加载到暂存寄存器106中,并且微编译器237可产生微指令246以将结果从暂存寄存器存储到存储器;相反,如果复杂ISA指令124是寄存器形式,则该前序可将源操作数从ISA指令124指定的源寄存器移动到暂存寄存器106,并且微编译器237可产生微指令246以将结果从暂存寄存器移动至由IIR235指定的架构目标寄存器106。在一个实施例中,微编译器237在许多方面类似于2010年4月23日所提交的美国专利申请的12/766244中描述的微编译器237,此专利申请在此以所有目的整体被引用作为参考,但是修改之处在于x86ISA指令124的编译和对ARM ISA指令的124的编译。
[0112] 需要注意的是,微PC232与ARM PC116和x86IP118不相同;也就是说,微PC232不保持ISA指令124的地址,并且微PC232中保存的地址也不位于系统存储地址空间内。还需要注意的是,微指令246由硬件指令编译器104产生并直接提供给执行流水线112执行,而不是成为执行流水线112的结果128。
[0113] 现在请参照图3,图3是表示图2的指令格式程序202的更详细说明的方框图。指令格式程序202从图1的指令高速缓存102接收一组x86ISA和ARM ISA指令字节124。
根据x86ISA指令的可变长度的特性,x86指令124可从一组指令字节124中的任意字节开始。确定一个超高速缓存块中的x86ISA指令的长度和位置的任务由于以下事实变得复杂:
x86ISA允许前缀字节和长度可受到当前地址的长度和操作数长度的默认值的影响。此外,根据当前的ARM指令集状态322和ARM ISA指令124的操作码,ARM ISA指令是2字节或4字节长度的指令且是2字节或4字节对齐的。因此,指令格式程序202从由指令高速缓存
102接收到的块组成的指令字节124流中取出不同的X86ISA和ARM ISA指令。也就是说,指令格式程序202安排x86ISA和ARM ISA指令字节流的格式,从而大大简化了图2的简单指令编译器204对ISA指令124解码和编译的难度。
[0114] 指令格式程序202包括一个预解码器302,如果指令模式指示符132提示为x86,则预解码器302将指令字节124预解码为x86指令字节;并且如果指令模式指示符132提示为ARM,则预解码器302将指令字节124预解码为ARM指令字节,进而产生预解码信息。指令字节队列(IBQ)304接收ISA指令字节124块和由预解码器302产生的相关预解码信息。
[0115] 长度解码器及纹波逻辑306的阵列接收IBQ304的下端入口的内容,即接收ISA指令字节124块与相关的预解码信息。长度解码器及纹波逻辑306还接收指令模式指示符132及ARM ISA指令集状态322。在一个实施例中,ARM ISA指令集状态322包括ARM ISA CPSR寄存器的J位和T位。响应于长度解码器及纹波逻辑306的输入,长度解码器及纹波逻辑306产生解码信息,此解码信息包含有ISA指令字节124块中的x86和ARM指令的长度、x86前缀信息、以及与每一个ISA指令字节124相关用以指示字节是否为ISA指令124的起始字节的指示符、ISA指令124的结束字节、和/或ISA指令124的有效字节。多路复用器对列(MQ)308接收:ISA指令字节126的块、通过预解码器302产生的相关预解码信息、以及由长度解码器及纹波逻辑306产生的相关解码信息。
[0116] 控制逻辑(图未示)检测底端MQ308条目的内容,并且控制多路复用器312以提取提供给格式化指令队列(FIQ)314的不同的、或格式化的、ISA指令和相关预解码及解码信息。格式化指令队列(FIQ)314缓冲用于提供给图2的简单指令编译器204的格式化ISA指令242和相关信息。在一个实施例中,多路复用器312每个时钟周期提取最多三个的格式化ISA指令和相关信息。
[0117] 在一个实施例中,指令格式程序202在许多方面相似于2009年10月1日所提交的美国专利申请第12/571997、12/572002、12/572045、12/572024、12/572052以及12/572058号案中描述的XIBQ、指令格式程序、以及FIQ,上述专利在此以所有目的被整体引用作为参考。然而,上述专利申请中的XIBQ、指令格式程序、以及FIQ有改变以格式ARM ISA指令124以及x86SIA指令124。长度解码器306被修改以解码ARM ISA指令124,用以产生ARM ISA指令124的长度和开始、结束、以及有效字节指示符。特别地,如果指令模式指示符132指示ARM ISA,则长度解码器306检查当前的ARM指令集状态322和ARM ISA指令124的操作码以确定ARM ISA124是否为2字节或4字节的长度指令。在一个实施例中,长度解码器306包括多个单独的长度解码器,用于产生X86ISA指令124的长度且用于产生ARM ISA指令124的长度,并且单独的长度解码器的输出线或(wire-ORed)在一起而提供给纹波逻辑
306。在一个实施例中,格式化的指令队列(FIQ)314包括用于保持格式化的指令242的独立部分的单独队列。在一个实施例中,指令格式程序202在每个时钟周期向简单指令编译器204提供最多三个的格式化的ISA指令242。
[0118] 现在请参照图4,图4是更详细地表示图1的执行流水线112的方框图。执行流水线112相耦合以从图2的硬件指令编译器104直接接收执行微指令126。执行流水线112包括:接收微指令126的微指令队列401;从微指令队列401接收微指令的寄存器分配表(RAT)402;结合到RAT402的指令分配器404;结合到指令分配器404的保留站406;结合到保留站406的指令发布单元408;结合到RAT402、指令分配器404、以及保留站406的重新排序缓冲器(ROB)422;以及结合到保留站406、指令发布单元408、以及ROB422的执行单元424。RAT402和执行单元424接收指令模式指标符132。
[0119] 在硬件指令编译器104产生执行微指令126的速率与执行流水线112执行这些执行微指令的速率不相同的情况下,微指令队列401作为缓冲器。在一个实施例中,微指令队列401包含M对N的可压缩微指令队列,此可压缩微指令队列能够使得执行流水线112在给定的时钟周期中从硬件指令编译器104接收最多M个(在一个实施例中,M为六个)微指令126且将接收的微指令126存储于一个N宽度队列(在一个实施例中,N为三)的结构中,用以在每个时钟周期将最多N个的微指令126提供到RAT402,其中RAT402在每个时钟周期能够处理最多N个的微指令126。微指令队列401是可压缩的,它在队列的条目中不留空隙,而是与其中接收微指令126的特定时钟周期无关,随着微指令126从硬件指令编译器126中接收,顺次地在具有微指令126的队列中插入空项。这样的优点在于能够使得执行单元424(图4的)的利用率高,用以获得高指令吞吐量同时提供了一个不可压缩的M宽度或N宽度指令队列的优点。更具体地说,一个不可压缩性的N宽度队列需要硬件指令编译器104,特别是简单指令编译器204在随后的时钟周期中重新编译已经在之前的时钟周期中编译的一个或多个ISA指令124,因为不可压缩性的N宽度队列不能够在每个时钟周期中接受多于N个的微指令126,并且重新编译浪费能量;然而,一个不可压缩性的M宽度的队列虽然不需要简单指令编译器204去重新编译,但是将在队列条目中形成空隙,这会造成浪费并需要更多行的项目,从而需要更大和更耗电的队列以实现相应的缓冲能力。
[0120] RAT402从微指令队列401接收微指令126并产生微处理器100中的等待状态的微指令126的相关信息,并且执行寄存器重命名以增加微指令利用超标量,指令流水线112的乱序执行能力的并行性。如果ISA指令124指示x86,则然后RAT402产生此相关信息并关于微处理器100的x86ISA寄存器106执行寄存器重命名;相反,如果ISA指令124指示ARM,则然后RAT402产生此相关信息且关于微处理器100的ARM ISA寄存器106执行寄存器重命名;然而,如上所述,一些寄存器106可由X86ISA和ARM ISA共享。RAT402还按照程序顺序对每个微指令126在ROB422中分配一个条目,以使得即使微指令126可按脱离程序的顺序关于微指令126所实现的x86ISA及ARM ISA指令124而执行,但是ROB422能够按照程序顺序退出微指令126以及它们相关联的x86ISA及ARM ISA指令124。ROB422包括条目的一个循环队列,每个条目用于存储等待状态的微指令126相关的信息。在其他方面,这些信息包括微指令126的执行状况、指示微指令126从x86或ARM ISA指令124编译出的标记、以及用于存储微指令126的结果的存储量。
[0121] 指令分配器404从RAT402接收寄存器重命名微指令126和相关信息,并且根据指令的类型和执行单元424的可用性,将微指令126及其相关联的相关信息发送到与将执行微指令126的适当执行单元424相关的保留站406。
[0122] 指令发送单元408,对于在保留站406等待的每一微指令126,检测相关的执行单元424是可用的且满足相关条件(例如,源操作数可用),并且将微指令126发送到执行单元424用于执行。如前所述,指令发送单元408能够发出以脱离程序顺序和在一超标量方式之下执行的微指令126。
[0123] 在一个实施例中,执行单元424包括整数/分支单元412、媒体单元414、加载/存储单元416、以及浮点单元418。执行单元424执行微指令126以产生提供给ROB422的结果。虽然执行单元424基本上不知它们正在执行的微指令126是从x86或ARM ISA指令124中编译出,但是执行单元424使用指令模式指示符132和环境模式指示符136以执行微指令126的一个相对较小的子集。举例而言,执行流水线112根据指令模式指示符132指示x86ISA或ARM ISA略有不同地处理标志的产生,并且根据指令模式指示符132是否指示x86ISA或ARM ISA更新PSR中的x86EFLAGS寄存器或ARM状态码标志。在另一个实例中,执行流水线112采样指令模式指示符132以决定是否更新x86IP118或ARM PC116,或共同指令地址寄存器,以及是否使用x86或ARM语义这样做。一旦微指令126变为微处理器100中最早完成的微指令126(即,在ROB422队列的头部且具有一个完成的状态),则ROB422退出ISA指令124且释放与执行微指令126相关的条目。在一个实施例中,微处理器100在每个时钟周期中能够退出最多三个的ISA指令124。有利的是,执行流水线112是一种高性能、通用目的执行引擎以执行支持x86ISA和ARM ISA指令124两者的微处理器100的微架构的微指令126。
[0124] 现在请参照图5,图5是更详细地表示出图1的寄存器文件106的方框图。较佳地,寄存器文件106实现为单独的寄存器的物理块,在一个实施例中,通用寄存器实现于具有多个读端口和写端口的一个物理寄存器文件中;然而,其他的寄存器与通用寄存器文件及访问寄存器文件的相似功能块的物理定位相分离,并且具有比通用寄存器文件更少的读/写端口。在一个实施例中,一些非通用寄存器,特别是那些不直接控制微处理器100的硬件而简单存储微代码234使用的数值的寄存器(例如,一些x86MSR或ARM协处理器寄存器),实现于可由微代码234访问但是对x86ISA和ARM ISA程序装置不可见,即不在ISA系统的存储地址空间中的一个专门随机存取存储器(PRAM)中。
[0125] 一般而言,寄存器文件106在逻辑上分为三类,如图5所示,即ARM特定寄存器502、x86特定寄存器504、以及共享寄存器506,在一个实施例中,共享寄存器506包括由ARM ISA寄存器R0至R14和x86ISA EAX至R14D寄存器共享的十五个32位寄存器,以及由x86ISA XMM0至XMM15寄存器和ARM ISA高级SIMD(Neon)寄存器共享的十六个128位寄存器,十六个128位寄存器的其中一部分也由三十二个32位ARM VFPv3浮点寄存器重叠。
如上面结合图1所述,通用寄存器的共享意味着,由一个x86ISA指令124写入到共享寄存器的数值能够由随后读取这个共享寄存器的一个ARM ISA指令124看到,并且反之亦然。这有利于允许x86ISA和ARM ISA例行程序通过寄存器彼此联系。此外,如上所述,x86ISA和ARM ISA的架构控制寄存器的某些位也例如可为共享寄存器506。如上所述,在一个实施例中,x86MSR可借由实现定义的协处理器寄存器由ARM ISA指令124访问,并且因此由x86ISA和ARM ISA共享。共享寄存器506还可包括非架构寄存器,例如条件标志的非架构寄存器,此非架构寄存器也通过RAT402重命名。硬件指令编译器104了解哪些寄存器由x86ISA和ARM ISA共享,以使得它可产生访问正确寄存器的执行微指令126。
[0126] ARM特定的寄存器502包括由ARM ISA定义未包含在共享寄存器506中的其他的寄存器,并且x86特定的寄存器504包括由x86ISA定义的未包含在共享寄存器506中的其他的寄存器。ARM特定的寄存器502的实例包括ARM PC116、CPSR、SCTRL、FPSCR、CPACR、协处理器寄存器、组合的通用寄存器以及各种异常模式的SPSR等等。上述并非用以作为ARM特定的寄存器502的一个详尽清单,但仅仅是作为一个例证。x86特定的寄存器504的实例包括x86EIP118、EFLAGS、R15D、64位R0-R15寄存器的较高32位(即,不在共享寄存器506中的部分)、段寄存器(SS、CS、DS、ES、FS、GS)、x87FPU寄存器、MMX寄存器、控制寄存器(例如,CR0-CR3、CR8)等等。上述并非用以作为x86特定的寄存器504的一个详尽清单,但仅仅是作为一个例证。
[0127] 在一个实施例中,微处理器100包括新的实现定义的ARM协处理器寄存器,当指令模式指示符132指示ARM ISA时可访问此新的实现定义的ARM协处理器寄存器以便执行x86ISA相关的操作,包括但不限于:将微处理器100复位至x86ISA处理器的能力(复位至x86指令);初始化微处理器100的x86特定状态,将指令模式指示符132切换到x86,并且在特定的x86目标地址开始提取x86指令124(开始x86指令)的能力;访问上述讨论的全局配置寄存器的能力;访问x86特定的寄存器(例如,EFLAGS)的能力,如上所述,其中要访问的x86寄存器在ARM R0寄存器中识别,电源管理(例如,P状态和C状态转换),处理器总线功能(例如,I/O周期),中断控制器访问,以及加密加速功能访问。此外,在一个实施例中,微处理器100包括新的x86非架构MSR,当指令模式指示符132指示x86ISA时可访问此新的x86非架构MSR以便执行ARM ISA相关的操作,包括但不限于:将微处理器100复位到一个ARM ISA处理器(复位到ARM指令)的能力;初始化微处理器100的ARM特定的状态、将ARM指令模式指示符132切换到ARM、以及在指定的ARM目标地址开始取ARM指令124(开始ARM指令)的能力;访问上述讨论的全局配置寄存器的能力;访问ARM特定的寄存器(例如,CPSR)的能力,其中待访问的ARM寄存器在EAX寄存器中识别。
[0128] 现在请参考图6,包括图6A和6B,是表示图1的微处理器100的操作的流程图。流程在方框602开始。
[0129] 在方框602,对微处理器100复位。这个复位可在微处理器100的复位输入端收到信号。此外,在处理器总线是x86型处理器总线的一个实施例中,复位可以由x86型INIT提供信号。响应于此复位,调用微代码234中的复位例行程序。复位微代码:(1)将x86特定的状态504初始化为由x86ISA指定的默认值;(2)将ARM特定的状态502初始化为由ARM ISA指定的默认值;(3)将微处理器100的非ISA特定状态初始化为由微处理器100制造商指定的默认值;(4)将共享的ISA状态506,例如,GPR,初始化为由x86ISA指定的默认值;以及(5)将指令模式指示符132和环境模式指示符136设置为指示x86ISA。在另一个实施例中,代替上述的动作(4)及(5),复位微代码将共享的ISA状态506初始化为由ARM ISA指定的默认值且将模式指示符132和环境模式指示符136设置为指示ARM ISA。在这样一个实施例中,不需要执行方框638及642的操作,并且在方框614之前,复位微代码将共享的ISA状态506初始化为由x86ISA指定的默认值且将指令模式指示符132和环境模式指示符136设置为指示x86ISA。流程进行到方框604。
[0130] 在方框604,复位微代码确定是否微处理器100配置作为x86处理器或者作为ARM处理器启动。一个实施例中,如上所述,默认的ISA引导模式是硬编码的微代码,但可由熔断配置熔断器和/或由微代码补丁进行修改。在另一个实施例中,默认的ISA启动模式作为微处理器100的一个外部输入,例如一个外部输入引脚而提供。流程进行到判定方框606。在判定方框606,如果默认的ISA引导模式是x86,则流程进行到方框614;而如果默认的ISA是ARM,则流程进行到方框638。
[0131] 在方框614,复位微代码使得微处理器100在由x86ISA指定的复位向量地址开始取x86指令124。流程进行到方框616。
[0132] 在方框616,x86系统软件,例如,基本输入输出系统(BIOS),使用例如x86的ISA RDMSR和WRMSR指令124配置微处理器100。流程进行到方框618。
[0133] 在方框618,x86系统软件执行复位到ARM的指令124。复位到ARM的指令使得微处理器100复位且因为复位而成为一个ARM处理器。然而,由于没有x86特定的状态504和没有非ISA特定的配置状态由复位到ARM的指令126改变,因此有利于使得x86系统固件执行微处理器100的初始配置且然后作为ARM处理器重新启动微处理器100,同时完整地保持由x86系统软件执行的微处理器100的非ARM配置。这样使得“薄”微引导代码来启动ARM操作系统,而不需要微引导代码了解如何配置微处理器100的复杂性。在一个实施例中,复位到ARM的指令是对于新的非架构MSR的x86WRMSR指令。流程进行到方框622。
[0134] 在方框622,简单指令编译器204响应于复杂的复位到ARM的指令124收集复位微代码。复位微代码将ARM特定的状态502初始化为由ARM ISA指定的默认值。然而,复位微代码不改变微处理器100的非ISA特定的状态,这样有利于保留在方框616执行的配置状态。另外,复位微代码将共享的ISA状态506初始化为由ARM ISA指定的默认值。最后,复位微代码将指令模式指示符132和环境模式指示符136设置为表示ARM ISA。流程进行到方框624。
[0135] 在方框624,复位微代码使得微处理器100在x86ISA EDX:EAX寄存器中指定的地址开始取ARM指令124。流程在方框624结束。
[0136] 在方框638,复位微代码将共享的ISA状态506,例如GPR,初始化为由ARM ISA指定的默认值。流程进行到方框642。
[0137] 在方框642,复位微代码将指令模式指示符132和环境模式指示符136设置为指示ARM ISA。流程进行到方框644。
[0138] 在方框644,复位微代码使得微处理器100在由ARM ISA指定的复位向量地址开始取ARM指令124。在ARM ISA定义了由一个输入选择的两个复位向量地址,在一个实施例中,微处理器100包括一个外部的输入,用以在两个ARM ISA定义的复位向量地址之间选择。在另一个实施例中,微代码234包括在两个ARM ISA定义的复位向量地址之间的一个默认选择,但是此默认选择可由熔断一个熔断器和/或由微代码补丁修改。流程进行到方框646。
[0139] 在方框646,ARM系统软件使用,例如ARM ISA的MCR和MRC指令124配置微处理器100。流程进行到方框648。
[0140] 在方框648,ARM系统软件执行复位到x86的指令124。复位到x86的指令使得微处理器100复位且由于复位而作为一个x86处理器。然而,由于没有ARM特定的状态502且并没有非ISA特定的配置状态由复位到x86的指令126改变,因此有利于使得ARM系统固件执行微处理器100的初始配置且然后作为x86处理器重新启动微处理器100,同时完整地保持由ARM系统软件执行执行的微处理器100的非x86配置。这样使得“薄”微引导代码来启动x86操作系统,而不需要微引导代码了解如何配置微处理器100的复杂性。在一个实施例中,复位到x86的指令是对于一个新的实现定义的协处理器寄存器的ARM MRC/MRCC指令。流程进行到方框652。
[0141] 在方框652,简单指令编译器204响应于复杂的复位到x86指令124收集复位微代码。复位微代码将x86特定的状态504初始化为由x86ISA指定的默认值。然而,复位微代码不改变微处理器100的非ISA特定的状态,这有利地保留在方框646执行的配置状态。另外,复位微代码将共享的ISA状态506初始化为由x86ISA指定的默认值。最后,复位微代码将指令模式指示符132和环境模式指示符136设置为指示x86ISA。流程进行到方框
654。
[0142] 在方框654,复位微代码使得微处理器100在ARM ISA R1:R0寄存器中指定的地址开始取x86指令124。流程在方框654结束。
[0143] 现在请参考图7,图7是表示根据本发明的双核微处理器700的方框图。双核微处理器700包括两个处理核心100,其中每个核心100包括图1的微处理器100中的元件,这样它能够执行x86ISA和ARM ISA两种机器语言程序。核心100可配置为使得两个核心100同时运行x86ISA程序、两个核心100同时运行ARM ISA程序、或者一个核心100运行x86ISA程序而另一个核心100运行ARM ISA程序,并且这三种配置的组合可在微处理器700的运行期间改变。正如上面结合图6所述,每个核心100对于它的指令模式指示符132和环境模式指示符136具有默认值,默认值可由一熔断器和/或由微代码补丁倒置,以使得每个核心100可单独复位而作为x86或ARM处理器。虽然图7所示的实施例包括两个核心100,但是在其他实施例中,微处理器700包含两个以上的核心100,每一个核心都能够运行x86ISA和ARM ISA两种机器语言程序。
[0144] 现在请参考图8,图8是表示根据本发明另一实施例能够执行x86ISA和ARM ISA的机器语言程序的微处理器100的方框图。图8中的微处理器100类似于图1的微处理器100且类似标号的元件是类似的。然而,图8中的微处理器100还包括一个微指令高速缓存
892。微指令高速缓存892缓存由硬件指令编译器104产生的,直接提供给执行流水线112的微指令126。微指令高速缓存892由通过取指令单元114产生的提取地址134编入索引。
如果提取地址134位于微指令高速缓存892中,则然后执行流水线112中的一个多路复用器(图未示)从微指令高速缓存892中选择微指令126,而不是从硬件指令编译器104中选择;另外,多路复用器选择从硬件指令编译器104直接提供的微指令126。微指令高速缓存的操作,通常也被称为跟踪缓存,在微处理器设计的本领域中是众所周知的。由微指令缓冲
892提供的一个优点是,从微指令高速缓存892提取微指令126所需要的时间通常小于从指令高速缓存102提取ISA指令124且通过硬件指令编译器104将其编译为微指令126所需要的时间。在图8的实施例中,随着微处理器100运行一个x86或ARM ISA机器语言程序,硬件指令编译器104可不需要在每次执行x86或ARM ISA指令124时执行硬件编译,也就是说,如果执行微指令126已经存在于微指令高速缓存892中时不需要执行硬件编译。
[0145] 有利的是,在此所述的微处理器的实施例通过包含一个硬件指令编译器能够运行x86ISA和ARM ISA两种机器语言程序,其中此硬件指令编译器将x86ISA和ARM ISA两种指令编译成与x86ISA和ARM ISA指令集不相同的微指令集的微指令,此微指令集的微指令可由提供了该执行微指令的微处理器的一个通常执行流水线执行。在此所描述的微处理器的实施例的一个优点是,通过协同利用基本上与ISA无关的执行流水线以执行从x86ISA和ARM ISA两种指令硬件编译出的微指令,微处理器的设计和制造可比两个独立设计和制造的微处理器,即一个可执行x86ISA机器语言程序且一个可执行ARM ISA机器语言程序需要更少的资源。另外,微处理器的实施例,特别是那些采用了超标量乱序执行流水线,潜在地提供了比现有更高性能的ARM ISA处理器。此外,微处理器的实施例潜在地提供了比采用软件编译器的系统更高的x86和ARM性能。最后,因为微处理器具有能够同时运行x86ISA和ARM ISA两种机器语言程序的能力,因此这种微处理器可包含于其上能够以高性能同时运行x86和ARM两种机器语言程序的系统中。
[0146] 有条件的加载/存储指令
[0147] 可以期望的是,一个微处理器在其指令集中包括有条件执行加载/存储指令的能力。也就是说,加载/存储指令可指定一个条件(例如,零、或负、或大于),如果条件标志满足此条件则由微处理器执行,如果条件标志不满足则此条件则不被执行。更具体地,在有条件加载指令的情况下,如果满足此条件,则然后数据从存储器加载到架构寄存器中,否则微处理器将这个有条件加载指令作为一个无操作指令处理;在有条件存储指令的情况下,如果满足此条件,则数据在从架构寄存器存储到存储器且否则微处理器将有条件储存指令作为一个无操作指令处理。
[0148] 如前所述,ARM ISA提供了有条件指令的执行能力,包括加载/存储指令,如同《ARM体系结构参考手册》中所描述的,例如在A8-118至A8-125页(加载寄存器指令,该指令可为有条件地执行)和A8-382到A8-387页(存储寄存器的指令,该指令可为有条件地执行)。美国专利第5961633号,其受让人为英国剑桥的ARM公司,描述了数据处理器的实施例,数据处理器提供了其全部指令集的有条件执行。数据处理器执行存储器的读/写操作。数据处理器包括可与ARM6处理器相同形式的条件测试器和指令执行单元。条件测试器测试处理器标志的状态,其中处理器标志代表由先前执行的指令产生的处理器状态。仅在适当的标志设置为由指令的条件字段所指定的状态时,允许执行当前指令。如果条件测试器显示不应该执行当前指令时,此指令被取消,而不改变任何寄存器的状态或与数据处理器相关联的存储器的位置状态。
[0149] 有利的是,这里所描述的实施例描述了在一个无序执行微处理器中执行ISA有条件加载/存储指令有效的方式。一般来说,根据在此所述的实施例,硬件指令编译器将有条件执行的ISA加载/存储指令编译到一个或多个微指令序列,用于由乱序执行流水线执行。微指令的数目和类型可取决于指令是否为加载或存储指令以及取决于有条件负载/存储指令指定的寻址模式和地址偏移来源。微指令的数量和类型还可取决于是否有条件加载/存储指令124指定一个源操作数,即一个偏移寄存器值具有一个适用于它的预移位操作。在一个实施例中,这中预移位操作包括例如在《ARM体系结构参考手册》的第A8-12到A8-10页中的所进行的描述。
[0150] 在此所使用的情况是,有条件加载/存储指令是一个ISA指令,用以命令微处理器如果满足条件将数据从存储器加载到目标寄存器中(有条件加载)或将数据从数据寄存器存储到存储器(有条件存储),并且否则将指令作为一个无操作指令。也就是说,有条件加载指令将数据从存储器位置加载到一个处理器寄存器,但只有当处理器条件标志满足由指令指定的条件时进行;并且有条件存储指令将数据从处理器寄存器存储到一个存储器位置,但只有当处理器条件标志满足由指令指定的条件时进行。
[0151] 现在请参看图9,图9是表示图1的微处理器100的更详细部分的方框图,并且特别是表示执行流水线112。图4的RAT402结合到记分板902、微指令队列904以及图4的ROB422。微指令队列904为图4的保留站406的一部分。在图9中,保留站406单独地表示且是图4的保留站406的一部分,其中保留站406保持ROB标记和源操作数的寄存器重命名标记,这将在以下讨论。记分板902结合到保留站406。保留站结合到微指令队列904、RAT402以及图4中的指令发出单元408。指令发出单元408结合到微指令队列904且也结合到图4的执行单元424。图1的存储器子系统108通过总线968结合到执行单元424。总线968能够使得在存储器子系统108和执行单元424之间传送数据、地址以及控制信号,例如由图4的存储单元416写入的存储数据传送到存储器子系统108的存储队列中。微指令队列904经由总线966将微指令126提供给执行单元424。ROB422通过总线972结合到执行单元424。总线972包括ROB422和执行单元424之间的控制信号,例如微指令126的执行状态对ROB422的更新。
[0152] 图1的寄存器文件106清楚表示为:架构寄存器文件106A、推测寄存器文件106B、架构标志寄存器106C、以及推测标志寄存器文件106D。寄存器文件106结合到微指令队列904和图4的执行单元424。架构寄存器文件106A也结合以从推测寄存器文件106B接收更新,并且架构标志寄存器106C也进行结合以从推测标志寄存器文件106D接收更新。每一个多路复用器912(为了简单和清楚,图9中表述出一单个多路复用器912)在其输入端上从架构寄存器文件106A的一个读端口、推测寄存器文件106B的一个读端口、以及结合到微指令队列904的常量总线952接收源操作数。每一个多路复用器912选择从一个操作数源输出的操作数,用于作为输入提供给多个相应的多路复用器922(为了简单和清楚起见,图9中表示出一单个多路复用器922)。每一个多路复用器914(为了简单和清楚起见,图
9中表示出一单个多路复用器914)从架构标志寄存器106C的一个读端口和推测标志寄存器文件106D的一个读端口接收其输入条件标志。每一个多路复用器914选择从一个来源输出的条件标志,用于作为输入提供给多个相应的多路复用器924(为了简单和清楚起见,图9中表示出单个的多路复用器924)。也就是说,虽然只表示出一个组的多路复用器912和922,但是微处理器100对于可提供给执行单元424的每一个源操作数均包括一组多路复用器912/922。因此,在一个实施例中,例如,具有六个执行单元424且架构寄存器文件
106A和/或推测寄存器文件106B能够对每个执行单元424供给两个源操作数,所以微处理器100包括十二组多路复用器912/922,即,对于每个执行单元424的每个源操作数都提供一组。此外,尽管仅表示出一组的多路复用器914及924,但是微处理器100对于每一个执行单元424均包括一组多路复用器914/924。在一些实施例中,一些执行单元424不接收条件标志964,以及一些执行单元424配置为从架构寄存器文件106A和/或推测寄存器文件
106B接收少于两个的源操作数。
[0153] 架构寄存器文件106A保持有微处理器100的通用寄存器,例如以上所述的ARM和/或x86ISA的通用寄存器的架构状态。架构寄存器文件106A还可包括非ISA暂存寄存器,这个非ISA暂存寄存器可由指令编译器104使用,例如由图2的复杂指令编译器206的微代码使用,但是并非由ISA指令124指定。在一个实施例中,微处理器100包括一个整数架构寄存器文件和一个单独的媒体架构寄存器文件,这两种架构寄存器文件均包含于架构寄存器文件106A中。在一个实施例中,整数架构寄存器文件106A包括三个写端口和八个读端口(两个读端口对应于每四个执行单元424,用于读取整体架构寄存器文件106A),并且媒体架构寄存器文件106A包括三个写端口和四个读端口(两个读端口对应于两个执行单元424,用于读取媒体架构寄存器文件106A)。架构寄存器文件106A由微指令队列904提供的架构寄存器标记编入索引,将在下面进行更详细的描述。
[0154] 推测寄存器文件106B,也称为ROB寄存器文件,包括对应于ROB422条目的复数个寄存器。在一个实施例中,微处理器100包括一个整数推测寄存器文件和单独的媒体推测寄存器文件,这两者均包含于推测寄存器文件106B中。推测寄存器文件106B的每个寄存器可用于从执行单元424接收微指令126的推测(即,未退回到加构状态)结果,其中微指令126在ROB422中的相应条目已经由RAT402分配给微指令126。当微处理器100使得一个微指令126退出时,微处理器100将其结果从推测寄存器文件106B复制到架构寄存器文件
106A的适当的寄存器。在一个实施例中,在每个时钟周期中可退出最多三个微指令126。在一个实施例中,推测寄存器文件106B包括六个写端口(每一个对应于每六个执行单元424)和十五个读端口(两个对应于每六个执行单元424且三个用于对架构寄存器文件106A的结果退出)。推测寄存器文件106B由微指令队列904提供的寄存器重命名标记提供索引,这将在下面更详细地描述。
[0155] 架构标志寄存器106C保持微处理器100的条件标志,例如以上所述的ARM PSR和/或x86EFLAGS寄存器的架构状态。架构标志寄存器106C包括用于存储微处理器100的架构状态的存储单元,此存储单元可受到指令集架构的部分指令的影响。举例而言,在一个实施例中,架构标志寄存器106C根据ARM ISA包括四个状态位,即:一个负(N)位(如果指令的结果为负,则设置为1)、一个零(Z)位(如果指令的结果是零,则设置为1)、一个进位(C)位(如果指令产生一个进位,则设置为1)、一个溢出(V)位(如果指令结果为溢出情况,则设置为1)。在x86指令集架构中,架构标志寄存器106C包括熟知的x86EFLAGS寄存器的位。有条件加载/存储指令124指定一个条件,在此条件下,存储器的加载/存储操作根据条件标志的当前值是否满足条件而有选择地执行。根据适合于ARM ISA的一个实施例,有条件加载/存储指令124的条件代码字段在高四位(即,位[31:28])中指定,以使得十六个不同的可能值的编码根据下面的表1所示。相对于架构的版本相关值(0b1111),此指令根据一个架构版本是不可预知的,并且是用来指示其他版本中的无条件指令的扩展空间。
[0156]
[0157]
[0158] 表1
[0159] 推测标志寄存器文件106D,也称为ROB标记文件,包括对应于ROB422的条目的复数个寄存器。推测标志寄存器文件106D的每个寄存器可用于从执行单元424接收微指令126的推测(即,未退出到架构状态)条件标志结果,其中微指令126在ROB422中的相应条目已经由RAT402分配给微指令126。当微处理器100退出一个微指令126时,如果微指令
126是发动条件标志的一个指令,则微处理器100将其条件标志结果从推测标志寄存器文件106D复制到架构标志寄存器文件106C。在一个实施例中,推测标志寄存器文件106D包括六个写端口(一个对应于每六个执行单元424)和七个读端口(一个对应于每六个执行单元424且一个用于退出对于架构寄存器文件106A的结果)。推测标志寄存器文件106D由微指令队列904提供的寄存器重命名标记提供索引,这将在下面更详细地描述。
[0160] 结果总线128从每个执行单元424提供一个结果值(例如一个整数/浮点算术运算的结果、布尔运算结果、移位/旋转操作结果、媒体操作结果、加载/存储的数据等等)和一个条件标志结果。在一个实施例中,并非所有的执行单元424产生和/或消耗条件标志结果。复数个多路复用器922中的每一个在另外的输入端经由结果总线128从执行单元424接收源操作数,并选择从一个操作数来源输出一个操作数,以作为输入提供到相应的执行单元424。复数个多路复用器924中的每一个在另外的输入端经由结果总线128从执行单元424接收条件标志,并选择从一个来源输出的条件标志以作为相应执行单元424的一个输入。此外,推测寄存器文件106B通过结果总线128写入有执行单元424的结果,并且推测标志寄存器文件106D通过结果总线128写入有执行单元424的条件标志的结果。较佳地,每个执行单元424的每个源操作数输入被结合以从对应的多路复用器922接收源操作数,其中多路复用器922从一个相应的多路复用器912接收一个源操作数;类似地,每个执行单元424(其接收一个条件标志)的条件标志输入被结合以从一个相应的多路复用器924接收条件标志,其中这个相应的多路复用器924从相应的多路复用器914接收条件标志。
[0161] 如上所述,ROB422包括用于保持与微指令126相关的信息的条目,这些信息包括控制/状态信息,例如有效、完整、异常和融合位。正如上文所述,推测寄存器文件106B保持有相应微指令126的执行结果且推测标志寄存器文件106D保持有相应微指令126的条件标志结果。
[0162] RAT402按照程序顺序输出微指令126。ISA指令124具有它们在程序中出现的顺序。指令编译器104按照ISA指令124在程序中出现的顺序,即按照程序顺序,将ISA指令编译为一个或多个微指令126。如果ISA指令124编译成超过一个的微指令126,则微指令126具有由指令编译器104所确定的顺序。微指令126的程序顺序可以使得,与给定的ISA指令124相关的微指令126保持在ISA指令124的程序顺序中,并且与一个给定ISA指令
124相关的微指令126保持在由指令编译器104指定的顺序中。随着RAT402从指令编译器
104接收微指令126,RAT402在循环队列方式下,按照程序顺序对微指令126分配ROB422的条目。ROB422设置为一个循环队列的条目,并且每个条目具有一个索引值,称为ROB标记或ROB索引。因此,每个微指令126具有一个ROB标记,此ROB标记具有一个数值,此数值是由RAT402分配给微指令126的ROB条目的索引值。当执行单元424执行微指令126时,执行单元424伴随输出执行结果而输出微指令126的ROB标记。这能够使得执行结果写入到由ROB标记指定的推测寄存器文件106B的寄存器中,并且条件标志结果(如果产生的话)写入到由ROB标记指定的推测标志寄存器文件106D的寄存器。还能够使得指令发出单元
408确定哪个执行结果可用作相关的微指令126的源操作数。如果ROB422已满,则RAT402使得停止输出微指令126。
[0163] 当RAT402对微指令126在ROB422中分配一个条目时,RAT402就将微指令126提供到了微指令队列904。在一个实施例中,RAT402可在每个时钟周期将最多三个微指令126提供给微指令队列904。在一个实施例中,微指令队列904包括三个写端口(一个端口对应于RAT402可输出的每个微指令126)和六个读端口(一个用于每个执行单元424的结果)。每个微指令队列904条目保留关于每个微指令126的信息,包括每个源操作数的两个标记字段:一个架构寄存器标记和一个重命名寄存器标记。架构寄存器标记用于索引到架构寄存器文件106A,用以使得架构寄存器文件106A产生所需的源操作数。架构寄存器标记利用指令编译器104填充有一个来自ISA指令124的数值,其中微指令126是从这个ISA指令124中编译出的。重命名寄存器标记用于索引到推测寄存器文件106B和推测标志寄存器文件106D中。当从指令编译器104接收时,重命名寄存器标记为空,并且当重命名寄存器执行寄存器重命名时由RAT402填充。RAT402维持一个重命名表。当RAT402从指令编译器104接收微指令126时,对于由这个微指令126所指定的每个架构源寄存器,RAT402在重命名表中查找架构源寄存器标志值,用以确定架构源寄存器的次序上最近的在前写入者的ROB标记,并且使用这个次序上最近的在前写入者的ROB标记填充重命名寄存器标记字段。相对于指定源操作数寄存器Q的一个给定的微指令A,这个次序上最近的在前写入者是满足下列标准的微指令B:(1)微指令B在程序顺序上更先于微指令A,即在程序顺序上比A更早;(2)微指令B写入到寄存器Q;以及(3)微指令B是满足(1)和(2)的最近(即程序顺序上最新的)的微指令。从这个意义上说,RAT402重新命名了架构源寄存器。这样,RAT402产生微指令A根据微指令B的依存性,因为图4的指令发出单元408将不发出微指令A到一个执行单元424以执行,直到微指令126的所有源操作数都可用。(在这个实例中,微指令A称作为依存微指令。)当指令发出单元408探测到由执行单元424输出的一个ROB标记与源操作数的重命名标记相匹配时,指令发出单元408注意到这个源操作数是可用的。如果重命名表中的架构寄存器标记的查找指示没有次序上最近的在前写入者时,然后RAT402不产生依存性(在一个实施例中,如果将一预定值写入到重命名寄存器标志以表示没有依存性时),并且源操作数代替为从架构寄存器文件106A获得(使用架构寄存器标记)。
[0164] 如上所述,一个保留站406与每个执行单元424相联系。保留站406保持有待发送到相关的执行单元424的每个微指令126的ROB标记。每个保留站406条目还保持有微指令126的源操作数的重命名寄存器标记。每个时钟周期,指令发出单元408探测由执行单元424输出的ROB标记,以确定是否一个微指令126准备发送到执行单元424以便执行。特别地,指令发出单元408将探测的ROB标记与保留站406中的重命名寄存器的标志相比较。当执行单元424可用以执行微指令且微指令的所有源操作数可用时,准备发出保留站
406条目中的微指令126。如果源操作数从架构寄存器文件106A获得,因为不存在依存性,则此源操作数是可用的,或者当微指令126到达执行单元424的时候,由重命名寄存器标记指示的次序上最近的在前写入者的结果或者从前行的结果总线128或从推测寄存器文件
106B可用时,则此源操作数是可用的。如果在保留站406中具有多个准备的微指令126,那么指令发出单元408提取最老的微指令126以发出。在一个实施例中,因为微指令126一旦离开保留站406到达执行单元424需要多个时钟周期(在一个实施例中为四个),所以指令发出单元408预先查看准备条件是否得到满足,即,执行单元424和源操作数是否在微指令126到达执行单元424时可用。
[0165] 当RAT402将微指令126写入到微指令队列904时,RAT402还经由记分板902将微指令126的ROB标记写入到与将执行微指令126的执行单元424相关联的保留站406。RAT402还将重命名寄存器标记写入到保留站406的条目。当保留站406中的微指令126准备发送给执行单元424时,保留站406输出准备的微指令126的ROB标记以在微指令队列
904中编入索引,微指令队列904做出响应将由ROB标记索引的微指令126输出到执行单元
424。微指令队列904还将重命名寄存器标记和架构寄存器标记输出到寄存器文件106,寄存器文件106作为响应将由这些标记指定的源操作数输出到执行单元424。最后,微指令队列904输出关于微指令126的其他信息,包括常量总线952上的常量。在一个实施例中,这些常量可包括一个64位的位移值、一个64位的下一条顺序指令指针的值、以及各种运算的常量,例如零常量。
[0166] 记分板902是位的阵列,每个位对应到一个ROB索引,并且因此具有分配有相应ROB422条目的微指令126。当RAT402将微指令126写入到保留站406时,随着通过记分板902而设置一个记分板902位。当执行微指令126,或者当它因为错误预测分支指令被刷新且目前正在纠正时,一个记分板902位被清除。因此,在记分板902中的一个设置位表示相应的微指令126执行流水线112仍然没有执行,即,它正等待执行。当一个微指令126在从RAT402到保留站406的途中通过记分板902时,检查对应于的重命名寄存器标记的记分板
902的位,以确定是否存在即时微指令依存性(例如,次序上最近的在前写入者)的微指令
126在等待。如果没有,则然后在下一个周期能够发出微指令126,假设执行单元424可用且保留站406中没有更早准备的微指令126。值得注意的是,如果RAT402产生了次序上最近的先前的写入者的依存性,则然后次序上最近期的先前写入者或者正在等待或者已经执行和退出,因为RAT402将不会产生一个退出的微指令126的依存性。
[0167] 虽然乱序执行流水线112的一个实施例在图9中示出,但应当理解的是,可以采用其他实施例以按照与在此描述的那些类似的方式在微处理器100中执行从有条件加载/存储指令124编译出的微指令126。例如,可采用其他结构来完成寄存器重命名以及乱序微指令126的发出和执行。
[0168] 现在请参考图10A,图10A是更详细地表示出图9的加载单元416的方框图。加载单元416包括相结合的加法器1004A和控制逻辑1002A,用以控制第一多路复用器1006A以及第二多路复用器1008A。控制逻辑1002A从微指令队列904接收总线966上的一个微指令126。图10A表示出由控制逻辑1002A接收的有条件加载(LD.CC)微指令126(以下将结合图11、图12以及图19进行更详细的描述)。更具体而言,LD.CC微指令126包括一个条件,即由编译出LD.CC微指令126的有条件加载指令124指定的条件。控制逻辑1002A解码微指令126以了解如何执行它。
[0169] 加法器1004A将三个加数相加以产生经由总线968提供给存储器子系统108的一个存储地址。在图11和图19的LD.CC微指令是基址寄存器(RN)或偏移寄存器(RM)的在前值的情况下,这一点如以下详细所述,一个加数是微指令126的第二源操作数。在图11和图19的LD.CC微指令是直接偏移常量或零值常量的情况下,这一点如以下详细所述,第二个加数是微指令126的第四个源操作数,如以下详细所述。第三个加数是多路复用器1006A的输出。在图11和图19的LD.CC微指令是基址寄存器(RN)或偏移寄存器(RM)的在前值的情况下,这一点如以下详细所述,多路复用器1006A接收零常量输入和第一源操作数962。对于图11的实施例,控制逻辑1002A控制多路复用器1006A以选择零常量输入。然而,在图19的方框1924/1926/1934/1936的替代实施例中,LD.CC指令指示加载单元416来选择第一源操作数962。在一个实施例中,加法器1004A包括一个第四输入,第四输入是一个段描述符值用于当微处理器100运行在x86模式下时支持地址的产生。
[0170] 控制逻辑1002A还经由结果总线128从执行单元424接收一个操作数有效信号,这个操作数有效信号指示由加载单元416接收的源操作数是否有效。控制逻辑1002A经由总线972的一个结果有效的输出,对ROB422作出源操作数是有效的还是无效的指示,如以下结合图12的描述。
[0171] 控制逻辑1002A还经由总线968从存储器子系统108接收一个异常信号,这个异常信号指示微指令126是否引起异常情况。控制逻辑1002A还可以检测本身的异常情况。控制逻辑1002A经由总线972对ROB422作出是否存在异常情况的指示,是否检测到自身或由存储器子系统108作出指示,以下将结合图12进行描述。
[0172] 控制逻辑1002A经由总线968从存储器子系统108接收一个缓存缺失的指示,这个缓存缺失的指示表示加载地址是否在存储器子系统108的数据高速缓存(图未示)中缺失。控制逻辑1002A经由总线972对作出ROB422是否发生一个高速缓存缺失的指示,以下将结合图12进行描述。
[0173] 控制逻辑1002A还接收条件标志964作为它的第三源操作数。控制逻辑1002A确定条件标志是否满足在微指令126中指定的条件,以下将结合图12进行描述。如果满足的话,控制逻辑1002A指示存储器子系统108经由总线968的进行加载的指示从存储器加载数据。加载的数据经由总线968从存储器子系统108返回至多路复用器1008A。此外,控制逻辑1002A控制多路复用器1008A以选择此数据而提供在结果总线128上。然而,在图11和图19的LD.CC微指令是基址寄存器(RN)或偏移寄存器(RM)的在前值的情况下,这一点将在如下详细描述,如果条件不满足,控制逻辑1002A控制多路复用器1008A选择用于在结果总线128上提供的第一源操作数962。此外,控制逻辑1002A经由总线968的加载指示对存储器子系统108作出不执行任何架构的状态改变操作的指示,因为该条件没有被满足,这将在下面更详细地描述。
[0174] 现在请参考图10B,图10B是更详细地表示图9的存储单元416的方框图。存储单元416类似于包括类似于图10A的加载单元的许多元件和信号且尽管它们可能表示为“B”,而不是一个“A”后缀,但是具有类似的编号。
[0175] 图10B表示了由控制逻辑1002B接收的有条件加载有效地址(LEA.CC)微指令126(以下将结合图11、图13、图15、图19以及图20更详细地描述)。LEA CC微指令126还包括一个条件,即由编译出LEA CC微指令126的有条件存储指令124指定的条件。控制逻辑1002B解码微指令126以了解如何执行它。
[0176] 加法器1004B将三个加数相加以产生经由总线968提供给存储器子系统108的存储地址,并且更具体而言是提供给存储器子系统108的一个存储队列条目的存储地址。在图11、图15、图19以及图20的LEA.CC微指令是零常量、是偏移寄存器(RM)或暂存寄存器(T2)的在前值的情况下,这一点将在以下详细描述,一个加数是微指令126的第二源操作数。在图11、图15、图19以及图20的LEA.CC微指令是直接偏移常量或零值常量的情况下,这一点将在下面详细描述,第二个加数是微指令126的第四源操作数。第三个加数是多路复用器1006B的输出。在图11、图15、图19以及图20的LEA.CC微指令是基址寄存器(RN)的在前值的情况下,这一点将在如下详细描述,多路复用器1006B接收一个零常量输入和第一源操作数962。对于图11、图15、图19以及图20的实施例,在解码LEA.CC的情况下,控制逻辑1002B控制多路复用器1006B,用以选择第一源操作数962,即基址寄存器(RN)的在前值。
[0177] 控制逻辑1002B还经由结果总线128从执行单元424接收一个操作数有效信号,这个操作数有效信号指示由加载单元416接收的源操作数是否有效。控制逻辑1002B经由总线972的一个结果有效的输出,对ROB422作出源操作数有效还是无效的指示,这一点将在以下结合图13描述。
[0178] 控制逻辑1002B还经由总线968从存储器子系统108接收一个异常信号,这个异常信号指示微指令126是否引起异常情况。控制逻辑1002B还可以检测本身的异常情况。控制逻辑1002B经由总线972对ROB422作出以下指示:是否存在异常情况,是否检测到自身或由存储器子系统108作出指示,这一点将在以下结合图16描述。
[0179] 控制逻辑1002B还接收条件标志964作为它的第三源操作数。控制逻辑1002B确定条件标志是否满足在微指令126中指定的条件,如以下结合图13的描述。如果满足的话,控制逻辑1002B控制多路复用器1008B选择由加法器1004B产生的存储地址以在结果总线128上提供。然而,在图11、图15、图19以及图20的LEA.CC微指令是基址寄存器(RN)的在前值的情况下,这一点将在如下详细描述,如果条件不满足,控制逻辑1002B控制多路复用器1008B选择第一源操作数962以在结果总线128上提供。
[0180] 现在请参考图10C,图10C是更详细地表示图9的整数单元412的方框图。整数单元412包括一个相结合的控制逻辑1002C用以控制多路复用器1008C。控制逻辑1002C从微指令队列904在总线966上接收的一个微指令126。图10C表示由控制逻辑1002C接收的一个有条件移动(MOV.CC)微指令126(以下将1结合图11、图14、图15、图19以及图20更详细地描述)。更具体而言,MOV.CC微指令126包括一个条件,即由从中编译出MOV.CC微指令126的有条件加载指令124指定的条件。控制逻辑1002C解码微指令126,以便了解如何执行它。
[0181] 控制逻辑1002C还经由结果总线128从执行单元424接收一个操作数有效信号,这个操作数有效信号指示由加载单元416接收的源操作数是否有效。控制逻辑1002C经由总线972的一个结果有效的输出,对ROB422源操作数作出是有效的还是无效的指示,以下将结合图14进行描述。
[0182] 控制逻辑1002C还经由总线968从存储器子系统108接收一个异常信号,这个异常信号指示微指令126是否引起异常情况。控制逻辑1002C还可以检测本身的异常情况。控制逻辑1002C经由总线972对ROB422作出的指示为:是否存在异常情况,是否检测到自身或由存储器子系统108指示,以下将结合图14进行描述。
[0183] 在图11、图15、图19以及图20的实施例的MOV.CC微指令126是一个暂存寄存器(T1)的情况下,多路复用器1008C将微指令126的第二源操作数作为一个输入接收。在图11、图15、图19以及图20的实施例的MOV.CC微指令126是数据寄存器(RT)的在前值或基址寄存器(RN)的在前值的情况下,多路复用器1008C将微指令126的第一源操作数作为第二输入接收。在不使用图11、图15、图19以及图20的实施例的MOV.CC微指令126的情况下,多路复用器1008C将不同算术逻辑单元的输出作为第三输入,或较佳的作为多个其他输入接收。
[0184] 控制逻辑1002C还将条件标志964作为它的第三源操作数接收。控制逻辑1002C确定条件标志是否满足在微指令126中指定的条件,这将在以下结合图14进行描述。如果满足的话,在图11、图15、图19以及图20的实施例的MOV.CC微指令126是暂存寄存器(T1)的情况下,控制逻辑1002C控制多路复用器1008C选择将第二源操作数提供在结果总线128上;然而,如果不满足此条件,在图11、图15、图19以及图20的实施例的MOV.CC微指令126是数据寄存器(RT)的在前值或基址寄存器值(RN)的在前值的情况下,这一点将结合图14描述,控制逻辑1002C控制多路复用器1008C选择将第一源操作数962在结果总线128上提供。
[0185] 现在请参照图10D,图10D是更详细地表示图9的存储单元416的方框图。图10D的存储单元416与图10B的存储单元416相同;但是,如图所示,图10D表示当在接收有条件存储融合(ST.FUSED.CC)微指令126时,而非当接收一个LEA.CC微指令126时存储单元416的操作。
[0186] 加法器1004B将三个加数相加以产生经由总线968提供给存储器子系统108,并且更具体而言提供给存储器子系统108的一个存储队列条目的一个存储地址,如同以下结合图15及图16更详细的描述。在图11、图15、图19以及图20的ST.FUSED.CC微指令是基址寄存器(RN)或暂存寄存器(T1)的在前值的情况下,这一点将在以下详细描述,一个加数是微指令126的第二源操作数。在图11、图15、图19以及图20的ST.FUSED.CC微指令是直接偏移常量或零值常量的情况下,这一点将在下面详细描述,第二个加数是微指令126的第四源操作数。第三个加数是多路复用器1006B的输出。在图11、图15、图19以及图20的ST.FUSED.CC微指令是数据寄存器(RT)的在前值的情况下,这一点以下详细描述,多路复用器1006B接收一个零常量输入和第一源操作数962。对于图11、图15、图19以及图20的实施例,在解码ST.FUSED.CC的情况下,控制逻辑1002B控制多路复用器1006B以选择零常量输入。在一个实施例中,加法器1004B包括一个第四输入,这个第四输入是一个段描述符值,用以支持当微处理器100在x86模式下工作时产生地址。
[0187] 控制逻辑1002B还经由结果总线128从执行单元424接收一个操作数有效信号,这个操作数有效信号指示由加载单元416接收的源操作数是否有效。控制逻辑1002B经由总线972的一个结果有效的输出作出ROB422源操作数是有效的还是无效的指示,如以下结合图16的描述。
[0188] 控制逻辑1002B还经由总线968从存储器子系统108接收一个异常信号,这个异常信号指示微指令126是否引起异常情况。控制逻辑1002B还可以检测本身的异常情况。控制逻辑1002B经由总线972对ROB422以下指示:是否存在异常情况,是否检测到自身或由存储器子系统108指示,这一点将在下面结合图16进行描述。
[0189] 控制逻辑1002B还接收条件标志964作为它的第三源操作数。控制逻辑1002B确定条件标志是否满足在微指令126中指定的条件,如以下关于图16所述。如果满足的话,控制逻辑1002B产生总线968的执行存储指示的一个值给存储器子系统108,用以指示存储器子系统将存储地址968写入到存储队列条目,并且按顺序存储由ST.FUSED.CC微指令126的存储数据部分写入的数据,如以下结合图10E、图15以及图17进行描述。然而,如果条件不满足,则控制逻辑1002B经由执行存储的指示968对存储器子系统108作出不执行任何架构状态改变的操作,因为该条件没有被满足,如以下将进行更详细的描述。以下将结合图10F描述用于执行一个有条件融合更新(UPDATE ST.FUSED CC)微指令126的存储单元416的另一实施例。
[0190] 现在请参照图10E,图10E是更详细表示图9的整数单元412的方框图。图10E的整数单元412与图10C的一样;然而,如图所示,图10E表示当接收ST.FUSED.CC微指令126时,而非当接收MOV.CC微指令126时整数单元412的操作。ST.FUSED.CC微指令126仅占用一单个的ROB422条目、保留站406条目、指令编译器104位置、RAT402位置等等,在这个意义上,ST.FUSED.CC微指令126是一单个的微指令126。但是,它发送给两个执行单元424,即发送给存储单元416(关于图10D、图10E、图15、图16以及图17所描述的)和整数单元412。存储单元416作为存储地址微指令126执行ST.FUSED.CC,整数单元412作为存储数据微指令126执行ST.FUSED.CC。在这个意义上,ST.FUSED.CC是两个微指令126“融合”成一个单个的微指令126。在图15和图17的ST.FUSED.CC为来自数据寄存器(RT)的数据值的情况下,这一点以下关于图15、图17以及图20有描述,当控制逻辑1002C解码ST.FUSED.CC微指令126时,控制逻辑1002C控制多路复用器1008C以选择在结果总线128上提供第一源操作数962。如关于图17所述,从数据寄存器128提供的数据在结果总线128上写入到存储器子系统108的存储队列中。
[0191] 现在请参照图10F,图10F是更详细地表示出图9的存储单元416的另一实施例的方框图。图10F的存储单元416在许多方面类似于图10D的存储单元416,但是,如图所示,图10F表示出当接收一个有条件存储融合更新(ST.FUSED.UPDATE.CC)微指令126时,而非当接收ST.FUSED.CC微指令126时存储单元416的操作。ST.FUSED.UPDATE.CC微指令126将一个更新值写入到目标寄存器(图20的方框2012和2014的实施例中的基址寄存器RN),并且在下面将结合图20和图21进行更详细的描述。图10F的存储单元416和图10D的存储单元416之间的其他区别如下。
[0192] 在图20的ST.FUSED.UPDATE.CC微指令是基址寄存器(RN)的在前值的情况下,这一点将在下面详细描述,图10D的2:1多路复用器1008B以3:1多路复用器1008F取代,多路复用器1008F将微指令126的第二源操作数作为第三输入接收。第三多路复用器1012F接收微指令126的第二源操作数和从加法器1004B输出的总和1022。根据条件标志是否满足在微指令126中指定的条件且ST.FUSED.UPDATE.CC微指令126是否为图20中的后索引或预索引型(即,分别为图20的方框2012的ST.FUSED.UPDATE.POST.CC或图20的方框2014的ST.FUSED.UPDATE.PRE.CC),控制逻辑1002B根据下面的表2控制多路复用器1008F和1012F,并且如以下关于图20和图21进行的描述。
[0193]
[0194] 表2
[0195] 现在请参考图11,图11是图9的微处理器100的指令编译器104的操作的流程图,图中表示出将一个有条件加载指令124编译成微指令126的操作。流程从方框1102开始。
[0196] 在方框1102,根据有条件加载指令124的特性,指令编译器104遇到一个有条件加载指令124并把它编译成一个或多个微指令126,如方框1112至方框1136中所述。有条件加载指令124指定一个条件(图11中表示为),在该条件下,如果条件标志满足该条件,则数据将从存储地址加载到一个架构目标寄存器中。在图11的实例中,目标寄存器表示为“RT”。有条件加载指令124还指定了一个架构基址寄存器和一个偏移量。基址寄存器保持有基地址。在图11的实例中,基址寄存器表示为“RN”。偏移量可能是三个来源之一:(1)有条件加载指令124指定的立即值;(2)在架构偏移寄存器中保持的一个值;或者(3)移位有条件加载指令124指定的一个立即值的偏移寄存器中保持的值。在图11的实例中,偏移寄存器表示为“RM”。有条件加载指令124指定的特征之一是寻址模式。寻址模式指定如何计算存储地址,其中数据将从这个存储地址中被载入。在图11的实例中,可能具有三种寻址模式:后索引寻址模式、预索引寻址模式、以及偏移地址寻址模式。在后索引寻址模式中,存储地址是简单的基地址,并且基址寄存器使用基地址和偏移量的总和更新。在预索引寻址模式中,存储地址是基地址和偏移量的总和,并且基址寄存器使用基地址和偏移量的总和更新。在变址寻址模式中,存储地址是基地址和偏移量的总和,并且没有更新基址寄存器。值得注意的是,有条件加载指令124可指定一个基地址和偏移量的差别而非总和。在这些情况下,相比当有条件加载指令124指定一个总和的时候,指令编译器104可发出稍微不相同的微指令126。例如,在由指令编译器104产生的直接偏移量的条件下,情况可能会相反。流程进行到判定方框1103。
[0197] 在判定方框1103,指令编译器104确定偏移量来源是否是立即值、一个寄存器值、或移位寄存器值。如果是一个立即值,则流程进行到判定方框1104;如果是一个寄存器值,则流程进行到判定方框1106;如果是一个移位的寄存器值时,则流程进行到判定方框1108。
[0198] 在判定方框1104,指令编译器104确定寻址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1112;如果是预索引模式,则流程进行到方框1114;如果是偏移地址模式,则流程进行到方框1116。
[0199] 在判定方框1106,指令编译器104确定寻址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1122;如果是预先索引模式,则流程进行到方框1124;如果是偏移地址模式,则流程进行到方框1126。
[0200] 在判定方框1108,指令编译器104确定寻址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1132;如果是预索引模式,则流程进行到方框1134;如果是偏移地址模式,则流程进行到方框1136。
[0201] 在方框1112,指令编译器104将直接偏移后索引有条件加载指令124编译成两微指令126:一个有条件加载微指令126(LD.CC)和一个有条件加载有效地址微指令126(LEA.CC)。每一个微指令126包括由有条件加载指令124指定的条件。LD.CC指定:(1)RT,指定作为有条件加载指令124的目标寄存器的架构寄存器106A,作为其目标寄存器;(2)RT作为源操作数962;(3)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)零常量952作为源操作962。LD.CC微指令126的执行将关于图12进行详细描述。LEA CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)一个零常量952作为源操作数962;(4)条件标志964作为源操作数;以及(5)由有条件加载指令124的指定的直接常量作为源操作962。LEA CC微指令126的执行将结合图13详细描述。应该注意的是,如果LD.CC导致异常(例如,页面错误),则然后LEA.CC结果将不会退回到架构状态来更新基址寄存器(RN),尽管此结果可写入到推测寄存器文件
106B。
[0202] 在方框1114,类似于方框1112所进行的描述,指令编译器104将立即偏移前索引有条件加载指令124编译成两个微指令126:一个有条件加载微指令126(LD.CC)和一个有条件加载有效地址微指令126(LEA.CC)。然而,相比较于方框1112的LD.CC指定一个零常量952作为源操作数962,方框1114的LD.CC将由有条件加载指令124指定的立即常量952指定为源操作数962。因此,将从中加载数据的计算的存储地址为基地址和偏移量的总和,这一点将关于图12更详细地描述。
[0203] 在方框1116,指令编译器104将立即偏移量偏移地址索引的有条件加载指令124编译成一单个的微指令126:类似于关于方框1114描述的LD.CC的一个有条件加载微指令126(LD.CC)。方框1112和方框1114的LEA.CC是不必要的,因为偏移地址寻址模式不要求更新基址寄存器。
[0204] 在方框1122,指令编译器104将寄存器偏移后索引的有条件加载指令124编译成两个微指令126:一个有条件加载微指令126(LD.CC)和一个有条件加载有效地址微指令126(LEA.CC)。每一个微指令126包括由有条件加载指令124指定的条件。LD.CC与关于方框1112描述的LD.CC相同。LD.CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)RM,指定作为有条件加载指令124的偏移量寄存器的架构寄存器106A,作为源操作数962;(4)条件标志
964作为源操作数;以及(5)一个零常量952作为源操作962。也就是说,方框1122的LEA.CC类似于方框1112的LEA.CC,不同的是方框1122的LEA.CC指定RM作为源寄存器,而不是零常量作为它的第二源操作数,并且指定了一个零常量而不是立即数作为它的第四源操作数。因此,计算的更新基地址是基地址与来自RM的寄存器偏移量的总和,如关于图13所述。
[0205] 在方框1124,指令编译器104将寄存器偏移预索引的有条件加载指令124编译成三个微指令126指令:一个无条件加载有效地址微指令126(LEA)、一个有条件加载微指令126(LD.CC)、以及一个有条件移动微指令126(MOV.CC)。LD.CC和MOV.CC微指令126包括由有条件加载指令124指定的条件。LEA指定:(1)T1,一个暂存寄存器106,作为其目标寄存器;(2)RN,作为有条件加载指令124的基址寄存器指定的架构寄存器106A,作为源操作数962;(3)RM,作为有条件加载指令124的偏移寄存器指定的架构寄存器106A,作为源操作数962;(4)不关心(DC)作为第三源操作数(因为LEA是无条件的且不需要条件标志964作为源操作数);以及(5)零常量952作为源操作数962。LEA微指令126的执行类似于LEA.CC的执行,除了LEA微指令126的执行是无条件的之外,这一点关于图13有描述。LD.CC指定:(1)RT,有条件加载指令124的目标寄存器所指定的架构寄存器106A,作为其目标寄存器;(2)RT作为源操作数962;(3)T1,是LEA的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为源操作数962;以及(5)零常量952作为源操作数962。也就是说,方框1124的LD.CC类似于方框1122的LD.CC;然而,相比较于方框1122的LD.CC指定RN(基址寄存器)作为源操作数962,方框1124的LD.CC指定T1(LEA的目标寄存器)作为源操作数962。因此,将从中加载数据的计算的存储地址是基地址和寄存器偏移量的总和。MOV CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)T1,是LEA的目标寄存器的暂存寄存器
106A,作为源操作数962;(4)条件标志964作为一个源操作数;以及(5)一个零常量952作为源操作数962。因此,MOV.CC使得基址寄存器使用基地址和寄存器偏移量(从LEA到T1)的总和进行更新。应该注意的是,如果LD.CC产生异常(例如,页面错误),则然后MOV.CC结果将不会退回到架构状态来更新基址寄存器(RN),尽管这个结果可写入到推测寄存器文件
106。
[0206] 在方框1126,指令编译器104将寄存器偏移量的偏移地址的有条件加载指令124编译成两个微指令126:一个无条件加载有效地址微指令126(LEA)和一个有条件加载微指令126(LD.CC),这两个微指令与方框1124的LEA和LD.CC相同。应该注意的是,MOV.CC微指令126不是必要的,因为不调用以更新基址寄存器的偏移地址的寻址模式。
[0207] 在方框1132,指令编译器104将偏移寄存器偏移量后索引有条件加载指令124编译成三个微指令126:一个移位微指令126(SHF)、一个有条件加载微指令126(LD.CC)、以及一个有条件加载有效地址微指令126(LEA.CC)。其中SHF指定:(1)T2,一个暂存寄存器106,作为其目标寄存器;(2)RM,指定作为有条件加载指令124的偏移寄存器的架构寄存器
106A,作为源操作数962;(3)不关心(DC)作为第二源操作数;(4)不关心(DC)作为第三源操作数(因为SHF是无条件的,并且因此不需要条件标志964作为源操作数);以及(5)由有条件存储指令124指定的立即常量952作为源操作数962,此立即常量952指定了RM中移位的数值以移位而产生移位寄存器。LD.CC与关于方框1112描述的LD.CC相同。LEA CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)T2,是SHF的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)零常量952作为源操作数962。也就是说,方框1132的LEA.CC类似于方框1122的LEA.CC,不同的是方框1132的LEA.CC指定T2作为源寄存器而不是RM作为它的第二源操作数。因此,计算出的更新基地址是基地址和移位寄存器的偏移的总和。
[0208] 在方框1134,指令编译器104将移位寄存器偏移的预索引有条件加载指令124编译为四个微指令126:一个移位微指令126(SHF)、一个无条件加载有效地址微指令126(LEA)、一个有条件加载微指令126(LD.CC)、以及一个有条件移动微指令126(MOV.CC)。SHF与方框1132的SHF相同,并且LD.CC和MOV.CC与方框1124的相同。LEA与方框1124中的相同,除了方框1134指定T2,即SHF的目标寄存器的暂存寄存器106A,作为其第二源操作数962之外。因此,从中加载数据的存储地址与更新的基地址值是基地址与移位的寄存器偏移量的总和。
[0209] 在方框1136,指令编译器104将移位寄存器偏移的偏移地址有条件加载指令124编译为三个微指令126:一个移位微指令126(SHF)、一个无条件加载有效地址微指令126(LEA)、以及一个有条件加载微指令126(LD.CC),这与方框1134的SHF、LEA以及LD.CC相同。值得注意的是,MOV.CC微指令126是不必要的,因为不调用用于更新基址寄存器的偏移地址的寻址模式。
[0210] 值得注意的是,指令编译器104发出图11的SHF、LEA、LD.CC、LEA.CC、MOV.CC微指令126、以及ST.FUSED.CC微指令126(图15的),使得它们不更新条件标志。
[0211] 如上所述,硬件指令编译器104按照顺序发出微指令126。也就是说,硬件指令编译器104按照ISA指令124在ISA程序中出现的顺序编译ISA指令124,以使得从相应ISA指令124的编译中发出的微指令126组按照相应ISA程序指令124在ISA程序中出现的顺序发出。此外,在一组中的微指令126具有一个顺序。在图11(以及图15、图19、以及图20)中,在流程图的一个给定的方框中,在图示的顺序下,由硬件指令编译器104发出微指令126。例如,在方框1112中,LD.CC微指令126位于LEA.CC的微指令126之前。另外,RAT402按照微指令126由硬件指令编译器104发出的顺序,对微指令分配ROB422中条目。
因此,从ISA指令124编译中发出的一组微指令126按照由硬件指令编译器104发出的顺序而退出。然而,有利的是,执行流水线112以乱序执行微指令126,即按照与硬件指令编译器104发出的顺序不相同的顺序,在给定的微指令126对其他微指令126的依存性允许的范围内进行。按照顺序退出微指令126的一个有益的副作用是,如果在第二微指令126之前的第一微指令126产生一个异常情况,那么第二微指令126的结果将不会退回到架构状态,例如,退回到架构通用寄存器106A或架构标志寄存器106C。
[0212] 现在请参考图12,图12是图9的微处理器100执行有条件加载微指令126(例如,图11的LD.CC)操作的一个流程图。流程开始于方框1202。
[0213] 在方框1202,加载单元416伴随接收源操作数962/964从微指令队列904接收LD.CC。流程进行到方框1218。
[0214] 在方框1218,加载单元416通过相加两个相关的源操作数从源操作数中计算存储地址。在图11的LD.CC微指令126的情况下,举例而言,加载单元416将在基址寄存器中(RN)中指定的基地址与偏移量相加以产生存储地址。如上所述,此偏移量可为在常量总线952上提供的一个立即值或在一个操作数总线962上提供的寄存器或移位寄存器值。然后加载单元416将计算的存储地址提供给存储器子系统108以访问数据高速缓存。流程进行到判定方框1222。
[0215] 在判定方框1222,加载单元416确定在方框1202提供给它的操作数是否有效。也就是说,微架构推测源操作数是有效的,即标志964、目标寄存器962的在前值、以及地址计算操作数962。如果加载单元416得知其源操作数不是有效的,例如,由于老的加载错误而发出其结果是无效的信号,那么加载单元416对ROB422发信号以在以下方框1224重播LD.CC微指令126。然而,作为一个优化,根据图18中所示的另一实施例,如果加载单元416检测到标志964是有效的但不满足此条件且先前的目标寄存器的值962是有效的(在图18的判定方框1802),那么即使地址操作数962不是有效的,加载单元416也对ROB422发出完成微指令126的信号,即,不对ROB422发出重播有条件加载/存储微指令126且在结果总线128上提供目标寄存器的前值的信号,这类似于以下关于方框1234描述的方式。由微指令“A”126(例如,方框1112的LD.CC微指令126)接收的寄存器(例如,目的/基址寄存器)的在前值是由另一个微指令“B”126执行所产生的一个结果,其中微指令“B”126是关于微指令A的次序上最近的寄存器的在前写入者。也就是说,微指令B所指的微指令126为:(1)写入到寄存器(即,指定作为该微指令126目标寄存器的寄存器106A与微指令A指定作为一个其源寄存器106A的寄存器相同);(2)在由硬件指令编译器104发出的微指令
126流中,位于微指令A之前;以及(3)在位于微指令A之前的所有的微指令126中,微指令B是在此微指令流中最近写入到寄存器的,即,是在该微指令流中最靠近于微指令A的在前的寄存器写入者。如上所述,此寄存器的在前值可提供给执行单元424,执行单元424或者由架构寄存器文件106A、推测寄存器文件106B、或者由行进总线128执行微指令A。通常,这些标志由程序中的一个指令124编译出的未退出的微指令126写入,该指令124在有条件加载/存储指令124(例如ADD指令124)之前,以使得标志写入微指令126相比编译出有条件负载/存储指令124的LD.CC、LEA.CC和/或MOV.CC微指令126更早。因此,RAT402对每个有条件微指令126(例如,LD.CC、LEA.CC和/或MOV.CC)根据更早的标志写入微指令126产生一个依存性。如果源操作数962/964是有效的,那么流程进行到判定方框1232;
否则,流程进行到方框1224。
[0216] 在方框1224,加载单元416发出操作完成且结果128无效的信号。在另一个实施例中,加载单元416发出失败而非操作完成的信号。流程在方框1224结束。
[0217] 在判定方框1232,加载单元416确定在方框1202接收的条件标志964是否满足由LD.CC指定的条件。在另一个实施例中,与执行单元424逻辑上分开的单元,例如指令发出单元408,做出条件标志是否满足此条件的决定,并且提供一个指示给执行单元424,而不是执行单元424本身作出该决定。如果条件标志满足条件,那么流程进行到判定方框1242;否则,流程前进到方框1234。
[0218] 在方框1234,加载单元416不执行会导致微处理器100改变它的架构状态的任何操作。更具体而言,在一个实施例中,加载单元416没有:(1)执行表寻访(tablewalk)(即使在TLB中丢失存储地址,因为一个表寻访可涉及更新一个页面表);(2)产生一个架构异常(例如,页面错误,即使由存储地址指示的存储页面是物理存储器中没有的);(3)执行任何总线事务(例如,响应于高速缓存缺失,或响应于来自存储器的一个不可缓存区域的加载)。此外,加载单元416不在存储器子系统108的数据高速缓存中分配行线。换句话而言,除了加载单元416在分配给LD.CC的ROB422条目中不设置一个异常位之外,加载单元416的操作类似于当产生异常时的操作。加载单元416(或者,例如关于以下的方框1634的存储单元416)不执行的操作整体上适用于加载/存储单元416和存储器子系统108;举例而言,存储器子系统108的表寻访引擎不执行表寻访或总线事务或在数据高速缓存中分配行线。
此外,加载单元416在结果总线128上提供在前的目标寄存器值926,用于加载到目标寄存器(RT)。在前的目标寄存器值926是由执行另一个微指令126产生的结果,该另一个微指令126是关于LD.CC微指令126的目标寄存器(RT)的次序上最近的在前写入者。应该注意的是,即使条件标志不满足此条件,LD.CC微指令126的执行也将一个结果写入到目标寄存器(假设LD.CC退出),此目标寄存器是微处理器100的架构状态的一部分;然而,如果条件标志不满足此条件,那么LD.CC微指令126的执行不“改变”目标寄存器,因为目标寄存器的在前值在这里在方框1234重新写入到目标寄存器。这是当不满足条件时,对于有条件加载指令124的指令集架构定义的正确的体系结果。最后,加载单元416发出操作完成且结果128有效的信号。流程在方框1234结束。
[0219] 在判定方框1242,加载单元416确定LD.CC是否引起异常情况的发生,例如一个页面错误、内存保护故障、数据异常中止条件、对准故障状态等等。如果没有引起异常情况的发生,那么流程进行到判定方框1252,否则,流程进行到方框1244。
[0220] 在方框1244,加载单元416发出操作导致异常的信号。流程在方框1244结束。
[0221] 在判定方框1252,加载单元416确定在方框1218计算的存储地址是否在数据高速缓存中缺失。如果是这样,流程进行到方框1254,否则,流程进行到方框1256。
[0222] 在方框1254,加载单元416发出高速缓存缺失且结果无效的信号。这样能够使得ROB422重新播放取决于缺失的加载数据的任何更新的微指令126。此外,加载单元416从适当的来源获得数据。更具体而言,加载单元416从高速缓存层级中的另一个高速缓存(例如,L2高速缓存)获得数据,并且如果失败,则从系统存储器中获得数据。然后加载单元416将数据提供于结果总线128上用于加载到目标寄存器(RT)且发出完成和结果是有效的信号。流程在方框1254结束。
[0223] 在方框1256中,加载单元416将在方框1218从数据高速缓存获得的数据提供于结果总线128上,用于加载到目标寄存器(RT)中且发出完成且结果有效的信号,流程在方框1256结束。
[0224] 现在请参考图13,图13是表示图9的微处理器100执行一个有条件加载有效地址微指令126(例如,图11的LEA.CC)的流程图。流程在方框1302开始。
[0225] 在方框1302,存储单元416连同接收它的源操作数962/964,还从微指令队列904接收的LEA.CC。流程进行到方框1318。
[0226] 在方框1318,类似于在方框1218由加载单元416计算存储地址的情况,存储单元416通过将两个相关的源操作数相加,由此从源操作数计算这个地址。例如,在图11的LEA.CC微指令126的情况下,存储单元416将在基址寄存器(RN)中指定的基地址与偏移量相加以产生这个地址。如上所述,偏移量可以是在常量总线952上提供的一个立即值或在一个操作数总线962上提供的寄存器或移位寄存器的值。流程进行到判定方框1322。
[0227] 在判定方框1322,存储单元416判定在方框1302提供给它的操作数是否是有效。如果存储单元416得知它的源操作数是无效的,那么存储单元416在以下的方框1324对ROB422发出重放LEA.CC微指令126的信号。然而,作为一个优化,根据一个实施例,如果存储单元416检测到标志964是有效的,但没有满足条件且在前的目标寄存器值962是有效的,那么即使地址操作数962是无效的,存储单元416也对ROB422发出微指令126完成的信号,也就是说,不对ROB422发出重放有条件加载/存储微指令126且将基址寄存器的在前值提供到结果总线128上的信号,这类似于在以下关于方框1334描述的方式。如果源操作数962/964是有效的,那么流程进行到判定方框1332,否则,流程进行到方框1324。
[0228] 在方框1324,存储单元416发出操作完成且结果128是无效的信号。流程在方框1324结束。
[0229] 在判定方框1332,存储单元416确定在方框1302接收的条件标志964是否满足LEA.CC指定的条件。如果满足这个条件,那么流程进行到判定方框1356,否则,流程进行到方框1334。
[0230] 在方框1334,存储单元416在结果总线128上提供在前的基址寄存器值926用于加载入基址寄存器(RN)中,其中基址寄存器(RN)被指定为LEA.CC的目标寄存器(例如,图11的方框1112、1114、1122以及1132)。在前的基址寄存器值926是执行另一个微指令126产生的结果,该另一个微指令126是关于LEA.CC微指令126的基址寄存器(RN)在次序上最近的在前写入者。值得注意的是,即使条件标志不满足此条件,LEA.CC微指令126的执行也将结果写入到基址寄存器(假设LEA.CC退出),其中基址寄存器是处理器100的架构状态的一部分;然而,如果条件标志不满足此条件,则LEA.CC微指令126的执行不“改变”基址寄存器,因为基址寄存器的先前值在这里在方框1334重新写入到基址寄存器。这是当不满足此条件时,对于有条件加载指令124的指令集架构定义的正确的体系结果。最后,存储单元416发出操作完成且结果128有效的信号。流程在方框1334结束。
[0231] 在方框1356,存储单元126将在方框1318计算的地址提供于结果总线128上用于加载到基址寄存器(RN),并且发出完成且结果有效的信号。流程在方框1356结束。
[0232] 存储单元416执行无条件加载有效地址微指令126(例如,图11的LEA)的操作类似于图13所进行的描述;然而,由于LEA微指令126是无条件的,因此不执行在方框1332和方框1334的步骤。如以上关于图11所述,在某些情况下,指令编译器104指定一个暂存寄存器106,而不是架构寄存器106作为LEA微指令126的目标寄存器。
[0233] 一般来说,程序往往倾向于执行从存储器读取相比写入到存储器具有显著更高的比例。因此,存储单元一般比加载单元较少使用。在上述关于图12和图13描述的实施例中,存储单元416执行LEA.CC微指令126且加载单元416执行LD.CC微指令126。在与方框1112、1114、1122、以及1132相关联的情况下,例如,LD.CC和LEA.CC微指令126不具有彼此的依存关系;因此,它们可能会被发出而彼此无关地执行。在一个实施例中,LD.CC微指令126可发送给加载单元416用于执行,在相同的时钟周期中,LEA.CC微指令126发送给存储单元416用于执行(假设这两种微指令126均准备好将进行发送,即单元416和源操作数964/962是可用的)。因此,有利的是,与第二微指令126相关的任何额外的等待时间对于许多指令流而言在统计上是小的。此外,在一个可预期的实施例中,执行流水线112包括两个对称的加载/存储单元416,而不是一个不同的加载单元416和存储单元416。在这样的一个实施例中,由于LD.CC微指令126和LEA.CC微指令126可同时发送给这个双对称的加载/存储单元416,因此可预期到对于有条件加载指令124的类似益处。此外,在这样一个实施例中,由于ST.FUSED.CC微指令126(在下面关于图15-17详细描述)和LEA.CC微指令126不具有彼此的依存性,因此可预期到对于条件存储指令124的类似益处,并且因此可同时发送给对称的加载/存储单元416用于执行。
[0234] 现在请参考图14,图14是表示图9的微处理器100用以执行有条件转移微指令126(例如,图11的MOV.CC)的操作的流程图。流程在方框1402开始。
[0235] 在方框1402,整数单元412随着接收它的源操作数964/962而从微指令队列904接收MOV.CC。流程进行到判定方框1422。
[0236] 在判定方框1422,整数单元412确定在方框1402提供给它的操作数是否有效。如果源操作数964/962是有效的,那么流程进行到判定方框1432;否则,流程进行到方框
1424。
[0237] 在方框1424,整数单元412发出操作完成且结果128无效的信号。流程在方框1424结束。
[0238] 在判定方框1432,整数单元412确定在方框1402接收的条件标志964是否满足由MOV.CC.指定的条件。如果满足此条件,那么流程进行到判定方框1442;否则,流程前进到方框1434。
[0239] 在方框1434,整数单元412在结果总线128上提供在前的基址寄存器值926,用于加载到基址寄存器(RN)中,基址寄存器(RN)被指定作为MOV.CC(例如,图11的方框1124和1134)的目标寄存器。在前的基址寄存器值926是执行另一个微指令126产生的结果,该另一个微指令是关于MOV CC微指令126的基址寄存器(RN)在次序上最近的在前写入者。值得注意的是,即使在条件标志不满足这个条件,MOV CC微指令126的执行也将结果写入到基址寄存器(假设MOV.CC退出),其中这个基址寄存器是微处理器100的架构状态的一部分;然而,如果条件标志不满足这个条件,则MOV CC微指令126的执行不会“改变”基址寄存器,因为基址寄存器的在前值在这里在方框1434重新写入到基址寄存器。这是当不满足条件时,由对于有条件加载指令124的指令集架构定义的正确的架构结果。在由指令编译器104产生的MOV.CC微指令126的某些情况下,MOV.CC在结果总线128上提供在前的目标寄存器值926(而不是在前的基址寄存器值)用于加载到目标寄存器(RT)中,其中目标寄存器(RT)被指定为MOV.CC的目标寄存器(例如,图19的方框1924、1926、1934、以及1936)。
最后,整数单元412发出操作完成且结果128有效的信号。流程在方框1434结束。
[0240] 在判定方框1442,整数单元412决定MOV.CC是否引起异常情况发生。如果没有引起异常情况的发生,那么流程进行到方框1456;否则,流程进行到方框1444。
[0241] 在方框1444,整数单元412发出操作导致一个异常的信号。流程在方框1444结束。
[0242] 在方框1456,整数单元412将第二源操作数926(例如,图11的方框1124和1134的暂存寄存器T1)提供于结果总线128上,用于根据指令编译器104指定哪个寄存器作为目标寄存器MOV.CC而加载入基址寄存器(RN)或目的寄存器(RT),并且发出完成且结果有效的信号。流程在方框1456结束。
[0243] 现在请参照图15,图15是表示图9的微处理器100将有条件存储指令124编译成微指令126的操作104的流程图。流程在方框1502开始。
[0244] 在方框1502,根据有条件存储指令124的特性,指令编译器104遇到一个有条件存储指令124并把它编译成一个或多个微指令126,如关于方框1512至1536所述。有条件存储指令124指定一个条件(图15中表示为),在该条件下,如果条件标志满足该条件,则数据将从数据寄存器存储到一个存储地址。在图15的实例中,数据寄存器表示为“RT”。有条件存储指令124还指定了一个基址寄存器和一个偏移量。基址寄存器保持有基地址。在图15的实例中,基址寄存器表示为“RN”。偏移量可能是三个来源之一:(1)条件加载指令124指定的立即值;(2)在偏移寄存器中保持的一个值;或者(3)移位有条件存储指令124指定的一个立即值的偏移寄存器中保持的值。在图15的实例中,偏移寄存器表示为“RM”。
有条件存储指令124指定的特征之一是寻址模式。寻址模式指定如何计算存储地址,其中数据将从这个存储地址中被载入。在图15的实例中,可能具有三种寻址模式:后索引寻址模式、预索引寻址模式、以及偏移地址寻址模式。在后索引寻址模式中,存储地址是简单的基地址,并且基址寄存器使用基地址和偏移量的总和更新。在预索引寻址模式中,存储地址是基地址和偏移量的总和,并且基址寄存器使用基地址和偏移量的总和更新。在变址寻址模式中,存储地址是基地址和偏移量的总和,并且没有更新基址寄存器。值得注意的是,有条件存储指令124可指定一个基地址和偏移量的差别而非总和。流程进行到判定方框
1503。
[0245] 在判定方框1503,指令编译器104确定偏移量来源是否是立即值、一个寄存器值、或移位寄存器值。如果是一个立即值,则流程进行到判定方框1504;如果是一个寄存器值,则流程进行到判定方框1506;如果是一个移位的寄存器值时,则流程进行到判定方框1508。
[0246] 在判定方框1504,指令编译器104确定寻址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1512;如果是预索引,则流程进行到方框1514;如果是偏移地址模式,则流程进行到方框1516。
[0247] 在判定方框1506,指令编译器104确定地址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1522;如果是预索引,则流程进行到方框1524;如果是偏移地址模式,则流程进行到方框1526。
[0248] 在判定方框1508,指令编译器104确定寻址模式是否是后索引、预索引、或偏移地址。如果是后索引模式,则流程进行到方框1532;如果是预索引模式,则流程进行到方框1534;如果是偏移地址模式,则流程进行到方框1536。
[0249] 在方框1512,指令编译器104将直接偏移后索引的有条件存储指令124编译成两微指令126:一个有条件存储融合微指令126(ST.FUSED.CC)和一个有条件加载有效地址微指令126(LEA.CC)。每一个微指令126包括由有条件存储指令124指定的条件。ST.FUSED.CC指定:(1)DC(不关心),指定作为ST.FUSED.CC的目标寄存器(因为ST.FUSED.CC不提供一个结果);(2)RT,指定作为有条件存储指令124的数据寄存器的架构寄存器106A,作为源操作数962;(3)RN,指定作为有条件存储指令124的基址寄存器的架构寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)零常量952作为源操作962。ST.FUSED.CC微指令126的执行将关于图16进行详细描述。ST.FUSED.CC微指令126是占据ROB422中的一单个条目的单个微指令126;然而,ST.FUSED.CC被发送给存储单元416和整数单元412的两者。在一个实施例中,存储单元416执行一个存储地址部分,存储地址部分产生写入到存储队列条目的存储地址,并且整数单元412执行一个存储数据部分,存储数据部分产生将存储数据写入到存储队列条目。在一个实施例中,微处理器100不包括一个单独的存储数据单元;而代替地,存储数据操作由整数单元412执行。在一个实施例中,ST.FUSED.CC类似于在美国专利第8,090,931号(CNTR.2387)案中的描述,该案以所有目的在此整体引用作为参考。LEA.CC指定:(1)RN,指定作为有条件存储指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)一个零常量952作为源操作数962;(4)条件标志964作为源操作数;以及(5)由有条件存储指令124的指定的直接常量952作为源操作962。LEA CC微指令126的执行将结合图13详细描述。应该注意的是,如果LD.CC产生一个异常(例如,页面错误),那么然后LEA.CC结果将不退出到架构状态来更新基址寄存器(RN),尽管此结果可写入到推测寄存器文件106B。
[0250] 在方框1514,类似于方框1512所进行的描述,指令编译器104将立即偏移预索引的有条件存储指令124编译成两个微指令126:一个有条件存储融合微指令126(ST.FUSED.CC)和一个有条件加载有效地址微指令126(LEA.CC)。然而,相比较于方框1512的ST.FUSED.CC指定一个零常量952作为源操作数962,方框1514的ST.FUSED.CC将由有条件存储指令124指定的立即常量952指定为源操作数962。因此,将存储数据的计算的存储地址为基地址和偏移量的总和,如关于图16的更详细的描述。
[0251] 在方框1516,指令编译器104将立即偏移量偏移地址索引的有条件存储指令124编译成一单个的微指令126:一个有条件存储融合微指令126(ST.FUSED.CC),这个有条件存储融合微指令(ST.FUSED.CC)类似于方框1514描述的ST.FUSED.CC。方框1512和1514的LEA.CC是不必要的,因为偏移地址的寻址模式不要求更新基址寄存器。
[0252] 在方框1522,指令编译器104将寄存器偏移后索引有条件存储指令124编译成两个微指令126:一个有条件存储融合微指令126(ST.FUSED.CC)和一个有条件加载有效地址微指令126(LEA.CC)。每一个微指令126包括由有条件存储指令124指定的条件。ST.FUSED.CC与关于方框1512描述的ST.FUSED.CC相同。LEA.CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)RM,指定作为有条件加载指令124的偏移量寄存器的架构寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)一个零常量952作为源操作962。
也就是说,方框1522的LEA.CC类似于方框1512的LEA.CC,不同的是方框1522的LEA.CC指定RM作为源寄存器,而不是零常量作为它的第二源操作数,并且指定了一个零常量而不是直接常量它的第四源操作数。因此,计算的更新基地址是基地址与来自RM的寄存器偏移量的总和,如关于图13所述。
[0253] 在方框1524,指令编译器104将寄存器偏移预索引的有条件存储指令124编译成三个微指令126:一个无条件加载有效地址微指令126(LEA)、一个有条件存储融合微指令126(ST.FUSED.CC)、以及一个有条件移动微指令126(MOV.CC)。ST.FUSED.CC和MOV.CC微指令126包括由有条件加载指令124指定的条件。LEA指定:(1)T1,暂存寄存器106,作为其目标寄存器;(2)RN,指定作为有条件存储指令124的基址寄存器指定的架构寄存器
106A,作为源操作数962;(3)RM,指定作为有条件存储指令124的偏移寄存器指定的架构寄存器106A,作为源操作数962;(4)不关心(DC)作为第三源操作数(因为LEA是无条件的且不需要条件标志964作为源操作数);以及(5)零常量952作为源操作数962。ST.FUSED.CC指定:(1)DC(不关心)作为其目标寄存器;(2)RT作为源操作数962;(3)T1,为LEA的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为源操作数962;以及(5)零常量952作为源操作数962。也就是说,方框1524的ST.FUSED.CC类似于方框1522的ST.FUSED.CC;然而,相比较于方框1522的ST.FUSED.CC指定RN(基址寄存器)为源操作数962,方框1524的ST.FUSED.CC指定T1(LEA的目标寄存器)作为源操作数962。因此,将存储数据的计算的存储地址是基地址和寄存器偏移量的总和。MOV CC指定:(1)RN,指定作为有条件存储指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)T1,LEA的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)一个零常量952作为源操作数962。因此,MOV.CC使得基址寄存器使用基地址和寄存器偏移量(从LEA到T1)的总和进行更新。应该注意的是,如果ST.FUSED.CC产生一个异常(例如,页面错误),则MOV.CC结果将不会退回到架构状态来更新基址寄存器(RN),尽管这个结果可写入到推测寄存器文件106B。
[0254] 在方框1526,指令编译器104将寄存器偏移的偏移地址有条件存储指令124编译成两个微指令126:一个无条件加载有效地址微指令126(LEA)和一个有条件存储融合微指令126(ST.FUSED.CC),这两个微指令与方框1524的LEA和ST.FUSED.CC相同。应该注意的是,MOV.CC微指令126不是必要的,因为不调用用于更新基址寄存器的偏移地址的寻址模式。
[0255] 在方框1532,指令编译器104将偏移寄存器的偏移量后索引有条件存储指令124编译成三个微指令126:一个移位微指令126(SHF)、一个有条件存储融合微指令126(ST.FUSED.CC)、以及一个有条件加载有效地址微指令126(LEA.CC)。其中SHF指定:(1)T2,一个暂存寄存器106,作为其目标寄存器;(2)RM,指定作为有条件存储指令124的偏移寄存器的架构寄存器106A,作为源操作数962;(3)不关心(DC)作为第二源操作数;(4)不关心(DC)作为第三源操作数(因为SHF是无条件的,并且因此不需要条件标志964作为源操作数);以及(5)有条件存储指令124指定的立即常量952作为源操作数962,此源操作数指定了用以产生移位寄存器偏移量的RM中移位的数量值。ST.FUSED.CC与关于方框1512的ST.FUSED.CC描述相同。LEA CC指定:(1)RN,指定作为有条件存储指令124的基址寄存器的架构寄存器106A,作为其目标寄存器;(2)RN作为源操作数962;(3)T2,SHF的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)零常量952作为源操作数962。也就是说,方框1532的LEA.CC类似于方框1522的LEA.CC,不同的是方框1532的LEA.CC指定T2作为源寄存器而不是RM作为其第二源操作数。因此,计算出的更新基地址是基地址和移位寄存器的偏移的总和。
[0256] 在方框1534,指令编译器104将移位寄存器偏移的预索引有条件存储指令124编译为四个微指令126:一个移位微指令126(SHF)、一个无条件加载有效地址微指令126(LEA)、一个有条件存储融合微指令126(ST.FUSED.CC)、以及一个有条件移动微指令126(MOV.CC)。SHF与方框1532中的相同,并且LD.CC和MOV.CC与方框1524的相同。LEA与方框1524中的相同,除了方框1534的LEA指定T2(SHF的目标寄存器的暂存寄存器106A)作为第二源操作数962之外。因此,存储数据的存储地址与更新的基地址值是基地址与移位的寄存器偏移量的总和。
[0257] 在方框1536,指令编译器104将移位寄存器偏移的偏移地址有条件存储指令124编译为三个微指令126:一个移位微指令126(SHF)、一个无条件加载有效地址微指令126(LEA)、以及一个有条件存储融合微指令126(ST.FUSED.CC),这与方框1534的SHF、LEA以及ST.FUSED.CC相同。值得注意的是,MOV.CC微指令126是不必要的,因为不调用用于更新基址寄存器的偏移地址的寻址模式。
[0258] 现在请参照图16,图16是表示图9的微处理器100执行有条件存储融合微指令126(例如,图11的ST.FUSED.CC)的操作的流程图。流程在方框1602开始。
[0259] 在方框1602,存储单元416连同接收它的源操作数962/964而从微指令队列904接收ST.FUSED.CC。当ST.FUSED.CC发送到存储单元416时,存储器子系统108从微指令队列中904探听总线并检测ST.FUSED.CC微指令126已经发出。作为响应,存储器子系统108在存储队列中为ST.FUSED.CC分配一个条目。在另一个实施例中,存储器子系统108通过探测RAT402且检测何时ST.FUSED.CC微指令126发送到保留站406和微指令队列904,而分配存储队列中的条目。将存储数据的存储地址随后写入到分配的存储队列条目,如以下关于方框1656的描述。此外,要存储的数据随后写入到所分配的存储队列条目,如关于图17的方框1756所述。随后,如果ST.FUSED.CC最终退出的话,存储器子系统108将存储队列条目中的数据存储到存储队列条目中的存储地址。流程进行到方框1618。
[0260] 在方框1618,存储单元416通过将两个源操作数相加,从源操作数计算存储地址。在图15的ST.FUSED.CC微指令126的情况下,例如,存储单元416将在基址寄存器(RN)中指定的基地址与偏移量相加而产生的存储地址。如上所述,偏移量可以是提供在常量总线
952上的立即值或提供在操作数总线952上的一个寄存器或移位寄存器的值。流程进行到判定方框1622。
[0261] 在判定方框1622,存储单元416确定在方框1602提供给它的操作数是否有效。如果源操作数962/964是有效的,则流程进行到判定方框1632;否则,流程进行到方框1624。
[0262] 在方框1624,存储单元416发出操作完成的信号。在另一个实施例中,存储单元416不发出完成的信号。流程在方框1624结束。
[0263] 在判定方框1632,存储单元416确定在方框1602接收的条件标志964是否满足由ST.FUSED.CC指定的条件。如果满足这个条件,则流程进行到判定方框1642;否则,流程前进到方框1634。
[0264] 在方框1634,存储单元416不执行会导致微处理器100改变架构状态的任何操作。更具体而言,在一个实施例中,存储单元416没有:(1)执行表寻访(即使在TLB中缺失存储地址,因为一个表寻访可涉及更新一个页面表);(2)产生一个架构异常(例如,页面错误,即使由存储地址指示的存储页面是物理存储器中没有的);(3)执行任何总线事务(例如,将数据存储到存储器)。此外,加载单元416不在存储器子系统108的数据高速缓存中分配行线。
换句话而言,除了加载单元416在分配给ST.FUSED.CC的ROB422条目中不设置一个异常位之外,加载单元416的操作类似于当产生异常时的操作。此外,加载单元416向存储器子系统108发出信号,以消灭在方框1602分配给ST.FUSED.CC的存储队列中的条目,以使得没有存储操作由存储器子系统108执行且使得存储队列条目的释放与在图17的方框1756由整数单元412写入的存储数据一致。最后,加载单元416发出操作完成且结果128有效的信号。流程在方框1634结束。
[0265] 在判定方框1642,存储单元416确定是否ST.FUSED.CC产生一个异常条件的出现。如果没有产生异常条件的出现,则流程进行到方框1644。
[0266] 在方框1644,存储单元416发出操作导致异常的信号。流程在方框1644结束。
[0267] 在方框1656,存储单元416将在方框1618计算的将存储数据的存储地址写入到已分配的存储队列条目。此外,存储单元416发出完成且结果有效的信号。如果ST.FUSED.CC最终退出,存储器子系统108将随后将数据从存储队列条目写入到存储队列条目中的存储地址。流程在方框1656结束。
[0268] 现在请参看图17,图17是表示图9的微处理器100执行有条件存储融合微指令(例如,图11的ST.FUSED.CC)的存储数据部分的操作流程图。流程在方框1702开始。
[0269] 在方框1702,整数单元412伴随接收其源操作数962/964而从微指令队列904接收ST.FUSED.CC。流程进行到判定方框1722。
[0270] 在判定方框1722,整数单元412确定在方框1702提供给它的操作数是否有效。如果源操作数962/964是有效的,则流程进行到方框1756;否则,流程进到方框1724。
[0271] 在方框1756,整数单元412将数据从源数据寄存器(例如,图15的RT)提供在结果总线128上,用于将加载到在方框1602分配的存储队列条目中,并且发出完成且结果有效的信号。流程在方框1756结束。
[0272] 虽然已经描述的实施例中,有条件存储指令编译成包括有条件存储融合微指令一个或多个微指令,但是本发明并不局限于这些实施例;相反,在可预期的其他实施例中,有条件存储指令被编译成不同的有条件存储地址和存储数据的微指令,而不是有条件的存储融合微指令。因此,举例而言,在图15的方框1512所示的情况下,作为替代可编译成下列微指令126序列:
[0273] STA.CC DC,RT,RN,FLAGS,ZERO
[0274] STD DC,RT,RN,FLAGS,ZERO
[0275] LEA.CC RN,RN,ZERO,FLAGS,IMM
[0276] STA.CC和STD微指令126分别按照与图16和17的描述类似的方式执行;然而,这两个微指令126不共享一个ROB条目;而是为每个微指令分配一个不同的ROB422条目。如果在微架构指令集中不包括一个存储融合位置126,那么这个替代实施例可简化微处理器100的部分。然而,特别是在有条件存储指令124编译成的微指令126的总数超过简单指令编译器124宽度的情况下,即,超出简单指令编译器204能够在一个简单时钟周期中发出的微指令126数目的情况下,这个实施例可能具有与消耗一个额外的ROB422条目和可能增加硬件指令编译器104的复杂性有关的缺点。
[0277] 现在请参照图19,图19是表示另一实施例的图9的微处理器100的指令编译器104将有条件加载指令124翻译成微指令126的操作流程图。图19的流程图在许多方面类似于图11且类似编号的方框是相同的。然而,图11中的方框1124、1126、1134以及1136分别由图19中的方框1924、1926、1934以及1936替代。
[0278] 在方框1924,指令编译器104将寄存器偏移预索引的有条件加载指令124编译成三个微指令126:一个有条件加载微指令126(LD.CC)、一个无条件加载有效地址微指令126(LEA)、以及一个有条件移动微指令126(MOV.CC)。LD.CC和MOV.CC微指令126包括由有条件加载指令124指定的条件。LD.CC指定:(1)T1,暂存寄存器106,作为它的目标寄存器;(2)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为源操作数962;(3)RM,指定作为有条件加载指令124的偏移量寄存器的架构寄存器106A,作为源操作数962;(4)条件标志964作为源操作数;以及(5)零常量952作为源操作数962。LEA.CC指定:(1)RN,指定作为有条件加载指令124的基址寄存器的架构寄存器106A,作为源操作数962;(2)RN作为源操作数962;(3)RM,指定作为有条件加载指令124的偏移寄存器的架构寄存器106A,作为源操作数962;(4)条件标志964作为源操作数962;以及(5)零常量
952作为源操作数962。MOV CC指定:(1)RT,指定作为有条件加载指令124的目标寄存器的架构寄存器106A,作为它的目标寄存器;(2)RT作为源操作数962;(3)T1,是LD.CC的目标寄存器的暂存寄存器106A,作为源操作数962;(4)条件标志964作为一个源操作数;以及(5)一个零常量952作为源操作数962。应该注意的是,在图19的实施例中指令编译器
104产生LD.CC微指令126而不是一个无条件加载微指令126,虽然加载一个暂存寄存器而不是架构寄存器以避免产生架构的状态更新动作,而这一点如以上关于图12的方框1234所述,如果条件不满足的话LD.CC不执行架构的状态更新动作。方框1924的实施例子与方框1124的实施例不同之处在于:加载和加载有效地址微指令126是相反的且微指令126的依存关系不相同,这可能会影响对于一个给定的指令124流的微处理器100的总处理能力且取决于执行单元424的组合、高速缓存命中率等。
[0279] 在方框1926,指令编译器104将寄存器偏移的偏移地址有条件加载指令124编译为两个微指令126:一个有条件加载微指令126(LD.CC)和一个有条件移动微指令126(MOV.CC),这两个微指令与方框1924的LD.CC及MOVCC相同。值得注意的是,LEA.CC微指令126是不必要的,因为不调用以更新基址寄存器的偏移地址的寻址模式。
[0280] 在方框1934,指令编译器104将移位寄存器偏移预索引有条件加载指令124编译为四个微指令126:一个移位微指令126(SHF)、一个有条件加载微指令126(LD.CC)、一个有条件加载有效地址微指令126(LEA.CC)、以及一个有条件移动微指令126(MOV.CC)。LD.CC、LEA.CC和MOV.CC微指令126包括由有条件加载指令124指定的条件。SHF与方框
1132的相同,并且LEA.CC和MOV.CC与方框1924的相同。LD.CC与方框1924的相同,除了方框1934的LD.CC指定T2(SHF的目标寄存器的暂存寄存器106A)作为它的第二源操作数962之外。因此,从中加载数据的存储地址与更新的基地址值是基地址和移位寄存器偏移量的总和。方框1934的实施例与方框1134的不同之处在于,加载和加载有效地址微指令126是相反的且微指令126的依存关系不相同,这可能会影响对于一个给定的指令124流的微处理器100的总处理能力且取决于执行单元424的组合、高速缓存命中率等。
[0281] 在方框1936,指令编译器104将移位寄存器偏移的偏移地址有条件加载指令124编译为三个微指令126:一个移位微指令126(SHF)、一个有条件加载微指令126(LD.CC)、以及一个有条件移动微指令126(MOV.CC),并且这三个微指令与方框1934的SHF、LD.CC以及MOV CC是相同的。值得注意的是,LEA.CC微指令126是不必要的,因为不调用以更新基址寄存器的偏移地址的寻址模式。
[0282] 现在请参照图20,图20是表示图9的微处理器100将有条件存储指令124编译成微指令126的操作的另一实施例的流程图。图20的流程图在许多方面类似于图15的流程图且类似编号的方框是相同的。然而,图15的方框1512和1514在图20中分别以方框2012和2014替代。
[0283] 在方框2012,指令编译器104将立即偏移后索引有条件存储指令124编译成一单个的有条件存储融合后更新的微指令126(ST.FUSED.UPDATE.POST.CC)。ST.FUSED.UPDATE.POST.CC微指令126包括由有条件存储指令124指定的条件。ST.FUSED.UPDATE.POST.CC指定:(1)RN,指定作为有条件存储指令124的基址寄存器的架构寄存器106A,作为源操作数962;(2)RT,指定作为有条件存储指令124的数据寄存器的架构寄存器106A,作为源操作数
962;(3)RN作为一个源操作数962;(4)条件标志964作为源操作数;以及(5)有条件存储指令124的指定的立即常量952作为源操作数962。ST.FUSED.UPDATE.CC微指令126的执行结合图21详细进行。ST.FUSED.UPDATE.CC微指令126的操作类似于一个ST.FUSED.CC微指令126;但是,它还将结果写入到一个目标寄存器。在方框2012的实施例中,目标寄存器是基址寄存器(RN)且由ST.FUSED.UPDATE.CC写入到基址寄存器的更新的地址是基地址和立即偏移量的总和。
[0284] 在方框2014,指令编译器104将立即偏移前索引的有条件存储指令124编译成一单个有条件存储融合预更新的微指令126(ST.FUSED.UPDATE.PRE.CC)。方框2014的ST.FUSED.UPDATE.PRE.CC微指令126类似于方框2012的ST.FUSED.UPDATE.POST.CC微指令126,不同的是,尽管类似于ST.FUSED.UPDATE.POST.CC,ST.FUSED.UPDAT.PRE.CC将基地址和直接偏移量的总和写入到目标寄存器,但是方框2014的ST.FUSED.UPDATE.PRE.CC微指令126将数据存储到基地址(而非基地址和直接偏移量的总和)。
[0285] 现在请参照图21,图21是表示图9的微处理器100执行有条件存储融合更新微指令126(例如,图20的方框2012的ST.FUSED.UPDATE.POST.CC和方框2014的ST.FUSED.UPDATE.PRE.CC,这里笼统称为ST.FUSED.UPDATE.CC)的操作的流程图。图21的流程图在许多方面类似于图16的流程图且类似编号的方框是相同的。然而,图16的方框1602、1618、1624、1634以及1656分别由图21的方框2102、2118、2124、2134以及2156替代。
[0286] 在方框2102,存储单元416随着它的源操作数962/964而从微指令队列904接收ST.FUSED.UPDATE.CC。当ST.FUSED.UPDATE.CC发送给存储单元416时,存储子系统108从微指令队列中904探听总线且检测ST.FUSED.UPDATE.CC微指令126已经发出。作为响应,存储器子系统108在存储队列中为ST.FUSED.UPDATE.CC分配一个条目。将向其存储数据的存储地址顺次写入到已分配的存储队列条目,如在以下关于方框2156所述。此外,要存储的数据随后写入到所分配的存储队列条目,如关于图17的方框1756所述。随后,如果为ST.FUSED.UPDATE.CC最终退出的话,存储器子系统108将存储队列条目中的数据存储到存储队列条目的存储地址。流程进行到方框2118。
[0287] 在方框2118,存储单元416从源操作数计算存储器地址和一个更新地址。存储单元416通过将两个相关的源操作数相加来计算更新的地址。举例而言,在图15的ST.FUSED.UPDATE.CC微指令126的情况下,存储单元416将在基址寄存器(RN)中指定的基地址与偏移量相加以产生更新的地址。如上所述,偏移量可为常量总线952上提供的立即值或一个操作数总线962上提供的一个寄存器或移位寄存器的值。在ST.FUSED.UPDATE.POST.CC的情况下,存储单元416通过将基地址和零相加计算存储地址。在ST.FUSED.UPDATE.PRE的情况下,如同更新地址的情况一样,存储单元416通过将两个相关的源操作数相加计算存储地址。流程进行到判定方框2122。
[0288] 在方框2124中,存储单元416发出操作完成且结果128无效的信号。流程在方框2124结束。
[0289] 在方框2134,存储单元416按照类似于在方框1634执行ST.FUSED.CC的方式执行ST.FUSED.UPDATE.CC。然而,存储单元416另外还在结果总线128上提供在前的基址寄存器值926,用于加载入基址寄存器(RN)中,其中基址寄存器(RN)指定作为ST.FUSED.UPDATE.CC(例如,图20的方框2012和2014中的)。在前的基址寄存器值926是执行另一个微指令126产生的结果,该另一个微指令126是关于ST.FUSED.UPDATE.CC微指令126,在基址寄存器(RN)的次序上在前的最近写入者。值得注意的是,即使条件标志不满足此条件,ST.FUSED.UPDATE.CC微指令126的执行也将结果写入到基址寄存器(假设ST.FUSED.UPDATE.CC退回),其中这个基址寄存器是微处理器100的架构状态的一部分;然而,如果条件标志不满足此条件,则ST.FUSED.UPDATE.CC微指令126的执行不“改变”基址寄存器,因为基址寄存器的在前值这里在方框2134重新写入到基址寄存器。这是当不满足条件时,对于有条件加载指令124的指令集架构定义的正确的体系结果。流程在方框2134结束。
[0290] 在方框2156,存储单元416将在方框2118计算的待存储数据的存储地址写入到已分配的存储队列条目。此外,存储单元416发出完成且结果是有效的信号。如果ST.FUSED.CC最终退出,则存储器子系统108将随后把数据从存储队列条目写入到存储队列条目中存储地址的存储器。此外,存储单元416将在方框2118计算的更新地址提供于结果总线128上,用于加载入基址寄存器(RN)中,其中基址寄存器(RN)指定作为ST.FUSED.UPDATE.CC(例如,图20的方框2012和2014中的)的目标寄存器。在一个实施例中,只要结果总线
128上的更新地址的出现比存储地址写入到存储队列条目更快,并且存储地址单元416发出更新地址完成的信号比发出将存储单元写入给存储队列完成的信号更快,那么这样是有利的,因为这样使得更新地址发送到依存微指令126更快。流程在方框2156结束。
[0291] 结合上述图式的描述,可以从微处理器100的操作观察到,加载/存储地址随着基地址值和偏移值而变;在后索引寻址模式的情况下,加载/存储地址是简单的基地址值;而在预索引或偏移地址寻址模式的情况下,加载/存储地址是偏移值和基地址的值的总和。
[0292] 可以观察到,在此描述的实施例的优点在于,能够使得有条件加载指令124指定目标寄存器,此目标寄存器与有条件加载指令124指定的所有源操作数(例如,基地址和偏移量)寄存器不相同。此外,这里所描述的实施例的优点在于,能够使得有条件存储指令124指定一个数据寄存器,这个数据寄存器与有条件存储指令124指定的所有源操作数(例如,基址和偏移量)寄存器不相同。
[0293] 微处理器100的实施例中已经描述,架构寄存器文件106A仅包括足够的读端口以提供最多两个源操作数给执行单元424,执行单元424执行实现有条件加载/存储指令124的微指令126。如以上关于图1所述,在可预期的实施例中,微处理器100是市售的微处理器是一个增强版本。保存市售微处理器的通用寄存器的该寄存器文件仅包括足够的读端口,以使寄存器文件提供最多两个源操作数给执行单元,其中该执行单元执行实现有条件加载/存储指令124的微指令126。因此,这里所描述的实施例特别的优点是与市售微处理器的微架构协同适用。如以上关于图1所述,市售微处理器最初为x86ISA设计,其中指令的有条件执行不是一个主要特征,并且因为它是基于累加器一般需要一个源操作数作为目标操作数,因此似乎并没有额外读端口的理由。
[0294] 从以上说明中可以观察到,这里所描述的实施例可能避免采用微架构的缺点,其中这个微架构在有条件加载指令124的情况下允许微指令126指定一个额外的源操作数来获得除基址寄存器值和偏移寄存器值之外的在前的目标寄存器值,或者在一个有条件存储指令的情况下,获得数据、基地址以及偏移寄存器的值。避免的缺点可包括以下内容。第一,对微指令126增加一个额外的源操作数对于使用该额外源操作数来执行微指令126的每个执行单元而言,需要在架构寄存器文件106A上多一个额外的读端口。第二,对于将使用一个另外的源操作数来执行微指令126的每个执行单元424而言,可能需要在推测寄存器文件106B上提供一个另外的读端口。第三,对于将使用一个另外的源操作数来执行微指令126的每个执行单元424而言,发送总线128可能需要更多的线。第四,对于将使用一个另外的源操作数来执行微指令126的每个执行单元424而言,可能需要一个另外的较大的多路复用器。第五,可能需要较大数目的额外的标记比较器,其中这个数目是执行单元424的数目、对每个执行单元424的保留站406条目的数目、由每个执行单元424可执行的微指令指定的源操作数的最大数目、以及能够发送到每个执行单元424的执行单元424的数目的一个函数。第六,对于该额外的源操作数,可能需要RAT402中另外的重命名查找。第七,它可能需要保留站扩大以处理额外的源操作数。根据速度、功率、以及不动产的额外成本是不期望的。这些不期望的附加成本可能由所描述的实施例有利地避免掉。
[0295] 因此,本文所描述的实施例的一个优点是,能够使得一乱序执行流水线有效地执行ISA有条件加载/存储指令,同时在通用及ROB寄存器文件上保持一个可接受数目的读端口。虽然实施例描述了,ISA(例如ARM ISA)有条件加载/存储指令可从通用架构寄存器指定最多两个源操作数,并且通用寄存器文件和ROB寄存器文件上读端口的数目对每个执行单元保持为两个,但是在可期望的其他实施例中,一个不同的ISA中,ISA有条件加载/存储指令可指定由通用架构寄存器提供的大于两个的源操作数,并且通用寄存器文件和ROB寄存器文件上读端口的数目对每个执行单元仍旧保持为期望的数目。举例而言,在不同的ISA中,有条件加载/存储指令可指定由通用架构寄存器提供的最多三个源操作数,例如一个基址寄存器值、一个索引寄存器值、以及一个偏移寄存器值。在这样一个实施例中,每个执行单元的读端口数量可以是三个,微指令可适于指定一个额外的源寄存器,并且有条件加载/存储指令可编译成与本文所述实施例类似数目的微指令。或者,每个执行单元读端口的数目可为两个,并且有条件加载/存储指令可编译成相比在此所述的实施例更大数量的微指令和/或不同的微指令。举例而言,考虑一个有条件加载指令的情况,类似于关于图11的方框1134描述的情况,但它另外还指定一个索引寄存器,RL,随着有条件加载指令编译成微指令,RL添加到基址寄存器(RN)值和偏移寄存器(RM)值来产生存储地址和更新地址值,如下所示:
[0296]
[0297] 对于另一个实例,考虑其中一个有条件存储指令类似于图15的方框1516描述的情况,但还另外还指定了一个索引寄存器,RL,随着有条件加载指令编译成微指令,RL添加到基址寄存器(RN)值和立即偏移值以产生存储地址,如下所示:
[0298] STRRT,RN,RL,IMM,OFFSET-ADDR
[0299] LEA T1,RL,RN,FLAGS,IMM
[0300] ST.FUSED.CC DC,RT,T1,FLAGS,IMM
[0301] 本文所述实施例的另一个优点是,虽然在某些情况下具有与有条件加载/存储指令124编译成两个、三个、或四个微指令相关的执行等待时间,但是每个微指令所执行的操作是相对简单的,这使得它适合于能够支持较高的核心时钟速率的流水线的执行。
[0302] 虽然描述的实施例中,微处理器100能够执行ARM ISA和x86ISA两种指令,但是这些实施例并不局限于此。相反,在可以期望的实施例中,微处理器仅执行单一的ISA。此外,虽然描述的实施例中,微处理器100如这里所述将ARM ISA有条件加载/存储指令编译为微指令126,但是可以期望的实施例中微处理器执行除ARM以外,但还包括它的指令集中的有条件加载/存储指令的ISA指令。
[0303] 虽然这里已经描述了本发明的各种实施例,但是应该理解的是,这些实施例是通过举例的方式表示,而不用作限制。相关计算机领域的技术人员可以理解的是,不脱离本发明范围的情况下,可在其中作形式和细节上的各种改变。举例而言,软件能够实现例如本文所述的装置和方法的功能、制造、建模、模拟、描述和/或测试。这些可通过使用通用的编程语言(如C,C++),包括Verilog HDL语言、VHDL等的硬件描述语言(HDL),或其他可用的程序实现。这样的软件可设置在任何已知的计算机可用介质,例如磁带、半导体、磁盘、或光盘(例如,CD-ROM、DVD-ROM等)、网络、有线线路、无线或其它通信介质之中。这里所描述的装置和方法的实施例可包括在半导体智能核心,例如一个微处理器核心之中(例如,实现或指定为一个HDL之中),并且转化为集成电路生产中的硬件。此外,本文所描述的装置和方法可实现为硬件和软件的组合。因此,本发明不应该局限于本文所描述的任何示例性实施例,而应当仅根据下面的权利要求及其等同进行限定。具体而言,本发明可实现于通用计算机中使用的微处理器设备中。最后,本领域技术人员应该理解的是,在不脱离所附的权利要求书所限定的本发明的范围的情况下,这些实施例很容易使用所揭露的概念和具体实施例作为设计或修改实现本发明相同目标的其它结构的基础。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用