对应于多个微操作的复杂程序指令的译码的制作方法_3

文档序号:8257896阅读:来源:国知局
30响应于译码请求24生成单个微操作,而同一指令I的其他微操作将响应于针对这些微操作的分离的译码请求24来生成。因此,复杂程序指令的每个微操作是响应于各自的译码请求24而个体地生成的。
[0049]译码器30向LO指令缓存20输出所生成的微操作32和相应的控制标志34,LO指令缓存20缓存微操作和控制标志。控制标志34指示生成的微操作32是否是相应的程序指令I的最后一个微操作或是否存在进一步的微操作将为该指令I生成。控制标志L与获取的微操作一起被提供给获取单元8。如下面的图9所述,控制标志L控制获取单元8是否递增(increment)程序计数器12或微程序计数器14以指示下一个将被获取的微操作。
[0050]共享指令译码器30从I级(LI)指令缓存40获得将被译码的指令,LI指令缓存40缓存从存储器获取的指令。在其他示例中,可不提供LI指令缓存40,而是共享译码器30作为替代可直接从存储器获取指令。然而,提供LI指令缓存40可有利地降低与将指令I获取到译码器30中相关的延迟和能源开销。
[0051]由于译码器30响应于各自的译码请求24对复杂指令的每个微操作个体地进行译码,因此同一指令可能需要在若干连续周期中被译码。为提升性能,指令缓冲器42被设于LI指令缓存40与共享指令译码器30之间以存储至少一个近期被译码的指令。在此实施例中,缓冲器42存储先前被译码的指令,从而如果下一周期需要同一指令,那么其可更高效地从缓冲器42获取而不是从LI指令缓存40。因此,如果译码请求24的程序计数器与先前的译码请求24的程序计数器相同,那么译码器30能够使用缓冲器42中的指令,而如果程序计数器与先前所请求的程序计数器不同,那么指令能够从LI指令缓存40中获取。在其他实施例中,缓冲器42可存储多个指令,且译码器30能够基于与每个缓冲的指令相关的地址来确定对应于译码请求24的程序计数器的指令是否在缓冲器42中。
[0052]示于图1中的微操作队列6是可选的,且在其他示例中,获取单元8可直接向发出电路10输出获取的微操作。然而,队列6能够提升性能,因为当一个线程的微操作正在从一个队列6发出至处理电路4时,另一线程的微操作能够被获取到另一队列6中,而不是在微操作能够从LO缓存20获取之前不得不等待发出阶段10准备好发出微操作。在一些实施例中,获取单元8和相应的指令队列6可结合到单个单元中。
[0053]微操作缓存20允许同一微操作被译码一次,然后被获取多次,从而通过避免同一微操作的重复译码来提升性能且降低能源损耗。微操作缓存20还提升了明显获取带宽(fetch bandwidth),由于微操作缓存20每个处理周期能够支持比译码器30每个处理周期能够支持的译码请求24更大数目的获取请求16。但是,微操作缓存20是可选的,且在其他实施例中,共享译码器30可直接向获取单元8提供微操作。在这种情况下,获取单元8可直接向共享译码器30发送获取请求16。从而获取请求16也用作译码请求24。
[0054]类似地,指令缓冲器42是可选的,且在其他实施例中共享译码器30可从LI指令缓存40或存储器获取所有的程序指令I。
[0055]图5和图6示出了相应于个体的译码请求对每个微操作分离地进行译码如何能够提升性能的示例。图5示出了比较示例,该比较示例示出了在复杂程序指令I响应于单个译码请求而被整体译码时会出现的译码器30的停滞,正如在先前的译码技术中那样。图5示出了在处理周期O中获取单元O发出获取请求16来请求获取复杂的加载多个(LDM)程序指令的示例,加载多个(LDM)程序指令例如从存储器加载六个不同值到处理电路4的寄存器中。因此,LDM指令被译码为六个分离的微操作μορΟ到μορ5中。响应于获取请求,微操作缓存20确定所需操作不在缓存20中,因此向译码器30发出相应的译码请求24。响应于译码请求,译码器30在周期I开始译码针对LDM指令的微操作,然后继续在以下周期2、3、4中生成针对LDM指令的其他微操作。然而,在周期4处,获取单元O被停滞,例如由于相应的队列QO不能接受任何进一步的微操作。译码器保证为生成加载多个指令的所有微操作,且不能通过指令来部分地中断译码,因为如果译码器中断了加载多个指令的译码,则译码器不知道稍后从何处再次开始。因此,译码器也必须停滞译码微操作,因此该停滞从获取单元O传播回译码器30。因此,在处理周期5、6、7期间,没有微操作被生成。只有获取单元O去停滞,译码器30才再次开始译码,然后完成剩余微操作μορ4、μορ5。一旦LDM指令的所有微操作已经被生成,译码器30才能够转切换为生成用于另一获取单元I的微操作ADD。但是,ADD指令的获取/译码请求是在处理周期4中做出的,并且获取单元I未被停滞,所以如果ADD微操作在译码器30停滞的周期5、6、7中的一个期间被生成,获取单元I本可以接受ADD微操作。
[0056]相反,图6示出了如何通过响应于分离的译码请求对复杂指令的每个微操作分离地进行译码来避免译码器的停滞。获取单元8为每个个体的微操作提供分离的获取请求。因此,需要LDM指令被执行的获取单元O在对应于微操作μ opO到μ ορ3的周期O到3中发出获取请求。LO缓存20不包含这些微操作,因此触发相应的译码请求到译码器30。译码器通过在周期I到4生成相应的微操作来响应每个译码请求。当获取单元O在周期4停滞时,译码器30不停滞,因为由于译码器30能够后续响应于分离的译码请求来生成剩余微操作μ ορ4、μ ορ5,它不必完成LDM指令的所有微操作。因此,在周期5中译码器30能够替代地生成获取单元I要求的ADD微操作。类似地,对于其他指令或来自其他获取单元的译码请求可在周期6和7期间被译码器30处理。当获取单元O在周期7去停滞,获取单元O便开始发出对剩余微操作μορ4、μ ορ5的获取请求,且这就触发了新的译码请求到译码器30,译码器30随后在周期8、9生成这些微操作。因此,译码器30现在能够在某一指令中间在译码不同指令之间快速切换以提升性能。
[0057]图7为示出了共享指令译码器30的操作示例的流程图。在步骤50,译码器30接收指定程序计数器和微程序计数器的译码指令24,程序计数器和微程序计数器二者一起标识将被生成的微操作。在步骤52,译码器30确定译码请求24中指定的程序计数器是否与上一个译码请求的程序计数器相同。如果相同,那么在步骤54,所需指令从存储最近的译码指令的指令缓冲器42获取。如果程序计数器与上一个译码请求的程序计数器不同,那么在步骤56,译码器30从LI指令缓存40获取所需指令。从步骤54或步骤56获取的指令随后在步骤58译码,以生成由译码请求24的微程序计数器标识的微操作。此时,译码器30只生成译码请求指定的微操作。同一程序指令的其它微操作不是已经被生成就是将后续响应于其他译码请求而生成。在步骤60,共享指令译码器30确定新生成的微操作是否是经译码的程序指令的最后一个微操作。如果生成的微操作是最后一个微操作,那么在步骤62,控制标志L被置为1,而如果还存在至少一个剩余的微操作将被生成,那么在步骤64,控制标志置为O。在步骤66,微操作和控制标志L被输出到LO指令缓存20。在步骤68,译码器30等待下一个译码请求,当下一个译码请求到来时方法返回步骤50。虽然图7示出了单个译码请求的处理,但在一些实施例中,译码器30每个处理周期能够服务多个译码请求,并且在这种情况下,则将为每个接收到的译码请求执行图7的步骤。
[0058]图8Α和8Β示出了由LO指令缓存20执行的功能。图8Α示出了在缓存20中存储微操作的方法。在步骤70,LO指令缓存20从共享指令译码器30接收微操作。在步骤72,LO指令缓存20在缓存20中存储微操作和控制标志L。缓存20还存储对应于相应的微操作的程序计数器和微程序计数器,从而缓存20能够识别哪些微操作被存储在缓存中且相应地响应获取请求16。例如,程序计数器和微程序计数器可作为用于定位存储所需微操作的LO指令缓存20的入口的标签。
[0059]图8Β示出了由LO指令缓存20响应于获取请求16所执行的功能。在步骤80,从获取单元8中的一个接收到获取请求。该获取请求16指定相应的获取单元8的程序计数器12及微程序计数器14的当前值。在步骤82,缓存20确定由程序计数器和微程序计数器标识的所请求的微操作是否存储在缓存20中。如果是,那么在步骤84,缓存20向发送获取请求16的获取单元8提供所请求的微操作和相应的控制标志L。如果所请求的微操作不在缓存中,那么在步骤86,缓存20发送译码请求24到指令译码器30。译码请求24包括包括在触发译码请求24的获取请求16中的程序计数器和微程序计数器。该方法随后进行到步骤80,在该步骤中缓存20等待下一个获取请求16。再者,LO指令缓存20可在同一处理周期中并行处理多个获取请求,在这种情况下,将为每个获取请求执行图8B的步骤。
[0060]图9为示出了由获取单元8执行的功能的流程图。在步骤90,获取单元8确定在相应的微操作队列6中是否存在用于下一个将被获取的微操作的空间。如果存在空间,那么在步骤92,获取单元8向LO指令缓存20发送获取请求16,获取请求16指示由获取单元8维护的程序计数器12及微程序计数器14的当前值。在步骤94,获取单元
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1