一種將計(jì)算機(jī)指令中立即數(shù)擴(kuò)展的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計(jì)算機(jī)領(lǐng)域,具體涉及一種將計(jì)算機(jī)指令中立即數(shù)擴(kuò)展的方法和裝 置,使得RISC計(jì)算機(jī)指令可以獲得位數(shù)大于執(zhí)行指令立即數(shù)域的立即數(shù)。
【背景技術(shù)】
[0002] 當(dāng)前,計(jì)算機(jī)系統(tǒng)主要分為CISC系統(tǒng)和RISC系統(tǒng),對(duì)應(yīng)于這兩種系統(tǒng)分別有兩種 不同風(fēng)格的指令規(guī)格。CISC系統(tǒng)出現(xiàn)最早,其指令集特點(diǎn)是規(guī)模比較大,指令能夠攜帶的立 即數(shù)可以很大,而且各指令長(zhǎng)短不一致,最具代表性就是X86指令集;而RISC系統(tǒng)出現(xiàn)比較 晚,其指令集特點(diǎn)是規(guī)模比較小,只包含有常用的指令,而且各指令長(zhǎng)度都是一致,指令能 夠攜帶的立即數(shù)比較小,最具代表性就是ARM指令集和MISP指令集。雖然CISC系統(tǒng)和RISC系 統(tǒng)的指令風(fēng)格不同,但是它們共同點(diǎn)都是在指令中包含有操作碼和若干操作數(shù),這些操作 數(shù)可能是寄存器名也可能是立即數(shù)。計(jì)算機(jī)指令結(jié)構(gòu)如表1。其中操作碼用于控制譯碼器, 使譯碼器輸出執(zhí)行該指令的操作開(kāi)關(guān),同時(shí)也分離出各操作數(shù)。
[0003] 表1計(jì)算機(jī)指令結(jié)構(gòu)
[0004]
L0005」當(dāng)前計(jì)算機(jī)系統(tǒng)常用圖1所示的電路對(duì)指令進(jìn)行讀取和譯碼處理。
[0006] 在圖1中,取指令電路是由1]1、1]2、1]3、1]4構(gòu)成,其中1]1是數(shù)據(jù)選擇器,其用于選擇相 對(duì)跳轉(zhuǎn)PC增量,U2是加法器,完成下一條指令地址的計(jì)算,U3是數(shù)據(jù)選擇器,其用于選擇下 一條指令的指針,U4是PC寄存器,其存有指令地址值;U5是程序存貯器,里面存有程序指令; U6執(zhí)行指令寄存器;U7是執(zhí)行指令譯碼器,其功能是對(duì)執(zhí)行指令寄存器輸出的指令進(jìn)行譯 碼。
[0007] 在圖1中,其電路的工作過(guò)程是:
[0008] 第一步是取指令階段:由1]1、1]2、1]3、1]4完成下一條指令地址計(jì)算后?(:〇]4)向程序 存貯器(U5)輸出指令的地址值,然后程序存貯器(U5)在其輸出總線上輸出指令。
[0009] 第二步是譯碼階段:程序存貯器(U5)輸出的指令被鎖存到執(zhí)行指令寄存器(U6) 中,執(zhí)行指令譯碼器(U7)直接對(duì)執(zhí)行指令寄存器(U6)里的指令進(jìn)行譯碼,譯碼出該指令的 操作信號(hào)(0P)、目的寄存器號(hào)(Rd)、源寄存器號(hào)(Rs)、源寄存器號(hào)(Rt)、立即數(shù)等信 息。
[0010] 從上面描述的指令讀取和譯碼處理過(guò)程可以看出:在CISC指令系統(tǒng)中,由于CISC 數(shù)據(jù)處理指令可以攜帶幾個(gè)字節(jié)的立即數(shù),所以對(duì)于CISC指令系統(tǒng)來(lái)說(shuō)只要取指令電路動(dòng) 作足夠快,獲取大立即數(shù)根本不是難事,壞處是由于各條指令長(zhǎng)度不一致(從1字節(jié)到15字 節(jié)不等),為了讀取完整的指令,取指令電路必須分析每條指令的操作碼才能確定該指令的 長(zhǎng)度,然后才能讀取完整的指令,顯然CISC的取指令電路相當(dāng)復(fù)雜了,再者由于CISC數(shù)據(jù)處 理指令需要表達(dá)攜帶幾個(gè)字節(jié)立即數(shù)長(zhǎng)度,所以CISC指令集數(shù)量相當(dāng)龐大,比RISC指令規(guī) 模大得多,好處是能夠節(jié)省指令存貯器的空間。而RISC指令系統(tǒng)就不同了,由于在RISC的指 令系統(tǒng)中指令的長(zhǎng)度規(guī)格只有1、2種,比如32位的ARM、MIPS,其指令長(zhǎng)度都是32位(即4個(gè)字 節(jié)),其好處是可以簡(jiǎn)化取指令電路,使得取指令電路不用分析指令的操作碼就可以讀取完 整的指令。但是由于指令長(zhǎng)度不長(zhǎng),所以RISC的指令可以攜帶的立即數(shù)一般都不大,比如 ARM的數(shù)據(jù)運(yùn)算指令攜帶的立即數(shù)最大是12位,而MIPS指令系統(tǒng)的數(shù)據(jù)運(yùn)算指令攜帶的立 即數(shù)最大是16位,要這些RISC指令系統(tǒng)攜帶32位的立即數(shù)是不可能的,因?yàn)槠渲噶铋L(zhǎng)度只 有32位,所以在RISC指令系統(tǒng)中要取得32位立即數(shù)就費(fèi)不少周折了,目前常用的方法有兩 種:第一種是分段讀取法,具體是先讀取高16位的立即數(shù),再讀取低16位的立即數(shù),從而組 成32位立即數(shù),為了支持這種分段讀取法,幾乎所有的RISC指令系統(tǒng)都是專(zhuān)門(mén)制定了相應(yīng) 的指令,比如ARM的MOVW和MOVT指令、MIPS的LUI和ADDIU指令;第二種是訪存法,具體是把32 位立即數(shù)當(dāng)做常數(shù)放在離當(dāng)前PC值不太遠(yuǎn)的地方,然后使用一條與PC相關(guān)的訪存指令讀取 它。但是不管使用哪種讀取方法,要獲取一個(gè)32位的立即數(shù)都是費(fèi)時(shí),怎么都要花2個(gè)周期 才能完成。
[0011] 比如要處理表達(dá)式:R2 = R3&0xl2345678,其中立即數(shù)0x12345678是一個(gè)32位無(wú)符 號(hào)數(shù),對(duì)于MIPS來(lái)說(shuō),由于邏輯與運(yùn)算指令A(yù)NDI$d4s,#imml6的立即數(shù)域只有16位,而上述 表達(dá)式立即數(shù)0x12345678的位數(shù)顯然大于16位,32位立即數(shù)0x12345678是無(wú)法裝入指令 八冊(cè)1$(1,$8,#;[11111116的立即數(shù)域,所以無(wú)法直接使用指令4冊(cè)1$(1,$8,#;[11111116,只能使用指令 AND$d 4s 4t。那么當(dāng)前MIPS的做法是:
[0012] 1、使用分段讀取法的是:
[0013] LUI $1,#1234H;(取得高16位常數(shù),要花1個(gè)周期時(shí)間)
[0014] ADDIU $1,#5678H;(取得低16位常數(shù),要花1個(gè)周期時(shí)間)
[0015] AND $2,$3,$1;
[0016] 2、使用訪存法的是:
[0017] LWPC $1,[卩(:,#0打68幻;(這條指令要花2個(gè)周期時(shí)間)
[0018] AND $2,$3,$1;
[0019] 由此可見(jiàn),無(wú)論使用哪種方法,MIPS處理R2 = R3&0xl2345678共需要花3個(gè)周期時(shí) 間,其中獲取32位常數(shù)0x12345678需要花2個(gè)周期時(shí)間。
【發(fā)明內(nèi)容】
[0020] 為了解決現(xiàn)有的RISC指令系統(tǒng)獲取大立即數(shù)執(zhí)行效率低下的不足,又要維持RISC 指令系統(tǒng)精簡(jiǎn)、統(tǒng)一長(zhǎng)度的優(yōu)點(diǎn),本發(fā)明提出了一種將計(jì)算機(jī)指令中立即數(shù)擴(kuò)展的方法,利 用這種方法RISC計(jì)算機(jī)指令也能夠快速獲得一個(gè)位數(shù)超過(guò)執(zhí)行指令立即數(shù)域的立即數(shù)。
[0021] -種將計(jì)算機(jī)指令中立即數(shù)擴(kuò)展的方法,在現(xiàn)有的RISC計(jì)算機(jī)指令系統(tǒng)中至少增 設(shè)一條立即數(shù)擴(kuò)展指令和對(duì)應(yīng)的一個(gè)立即數(shù)擴(kuò)展指令譯碼器,該立即數(shù)擴(kuò)展指令包含有操 作碼和立即數(shù)域;具體過(guò)程如下:
[0022] 在指令編寫(xiě)過(guò)程中,將一個(gè)位數(shù)大于執(zhí)行指令的立即數(shù)域的長(zhǎng)度的立即數(shù)分成兩 個(gè)字段,一個(gè)是高位立即數(shù)字段,另一個(gè)是低位立即數(shù)字段;所述的高位立即數(shù)字段經(jīng)過(guò)有 符號(hào)數(shù)或無(wú)符號(hào)數(shù)擴(kuò)展后再填入上述新增的立即數(shù)擴(kuò)展指令的立即數(shù)域,所述的低位立即 數(shù)字段則填入所述執(zhí)行指令的立即數(shù)域,并且要求所述的低位立即數(shù)字段的長(zhǎng)度等于所述 執(zhí)行指令的立即數(shù)域的長(zhǎng)度;另外上述新增的立即數(shù)擴(kuò)展指令要前置于攜帶該低位立即數(shù) 字段的所述執(zhí)行指令,中間不能插入別的指令;
[0023] 在取指令過(guò)程中,取指令電路同步將上述新增的立即數(shù)擴(kuò)展指令送入立即數(shù)擴(kuò)展 指令寄存器和將緊隨該立即數(shù)擴(kuò)展指令之后的執(zhí)行指令送入執(zhí)行指令寄存器;
[0024] 在指令譯碼過(guò)程中,立即數(shù)擴(kuò)展指令譯碼器對(duì)立即數(shù)擴(kuò)展指令寄存器輸出的指令 進(jìn)行譯碼的同時(shí),執(zhí)行指令譯碼器也對(duì)執(zhí)行指令寄存器輸出的指令進(jìn)行譯碼,立即數(shù)擴(kuò)展 指令譯碼器輸出的立即數(shù)經(jīng)過(guò)邏輯左移位后再和執(zhí)行指令譯碼器輸出的立即數(shù)進(jìn)行合并, 合并結(jié)果得到一個(gè)位數(shù)大于執(zhí)行指令的立即數(shù)域的長(zhǎng)度的立即數(shù),該立即數(shù)的數(shù)值與上述 的指令編寫(xiě)過(guò)程中的被拆分的立即數(shù)的數(shù)值相等。
[0025] 所述立即數(shù)擴(kuò)展指令是一條非執(zhí)行指令,只到譯碼這一階段就終結(jié),它不需要經(jīng) 歷執(zhí)行、回寫(xiě)的階段。
[0026] 通過(guò)在取指令電路中設(shè)置一個(gè)暫存器,將所述新增的立即數(shù)擴(kuò)展指令延遲一條指 令位置,以等待緊隨其后的執(zhí)行指令的到來(lái),使得取指令電路將上述新增的立即數(shù)擴(kuò)展指 令和緊隨其后的執(zhí)行指令能夠同步分別送入各自的譯碼器進(jìn)行譯碼;所述的暫存器是寄存 器。
[0027] 所述立即數(shù)擴(kuò)展指令譯碼器在譯碼時(shí)受控于執(zhí)行指令譯碼器送來(lái)的一個(gè)符號(hào)數(shù) 標(biāo)志信號(hào),最后譯碼輸出一個(gè)立即數(shù)和一個(gè)譯碼狀態(tài)標(biāo)志信號(hào),并且執(zhí)行如下過(guò)程:如果上 述新增的立即數(shù)擴(kuò)展指令寄存器輸出的指令是上述新增的立即數(shù)擴(kuò)展指令,則設(shè)置該譯碼 狀態(tài)標(biāo)志信號(hào)為真;否則,如果上述新增的立即數(shù)擴(kuò)展指令寄存器輸出的指令不是上述新 增的立即數(shù)擴(kuò)展指令,則設(shè)置該譯碼狀態(tài)標(biāo)志信號(hào)為假和設(shè)置該立即數(shù)擴(kuò)展指令譯碼器輸 出的立即數(shù)為〇值;所述的執(zhí)行指令譯碼器