本申請要求于2014年9月24日提交的題為“TECHNOLOGIES FOR EFFICIENT LZ77-BASED DATA COMPRESSION(用于進行有效的基于LZ77的數(shù)據(jù)解壓縮的技術(shù))”的美國實用新型專利申請序列號14/494,766的優(yōu)先權(quán)。
背景技術(shù):
軟件數(shù)據(jù)解壓縮是許多計算應(yīng)用(包括服務(wù)器應(yīng)用和客戶端應(yīng)用兩者)中使用的重要軟件操作。許多常見的無損壓縮格式基于LZ77壓縮算法。使用基于LZ77的算法所壓縮的數(shù)據(jù)通常包括符號流。每一個符號可以包括要復(fù)制到輸出或參考中以便重復(fù)已經(jīng)解壓縮的數(shù)據(jù)的文字量數(shù)據(jù)。相比如DEFLATE等其他無損壓縮算法,基于LZ77的算法通常實現(xiàn)更低的壓縮級別但提供更高的性能,特別是對于解壓縮。一種典型的基于LZ77的格式是由谷歌公司開發(fā)且由Apache HadoopTM項目等使用的“Snappy”。其他基于LZ77的格式包括LZO和LZF。
解壓縮算法的典型實施方式包括用于對輸入符號進行分類的眾多條件分支。那些條件分支的結(jié)果取決于輸入數(shù)據(jù)。用于典型處理器的分支預(yù)測硬件可能難以正確地預(yù)測那些條件分支的結(jié)果。分支誤預(yù)測懲罰可能降低可實現(xiàn)的解壓縮性能。
附圖說明
在附圖中通過示例的方式而非限制的方式來展示了本文中所描述的概念。為了說明的簡單和清晰起見,附圖中所展示的元件不一定按比例繪制。在認(rèn)為適當(dāng)?shù)那闆r下,在附圖當(dāng)中重復(fù)參考標(biāo)號以表示相應(yīng)或相似的元件。
圖1是用于有效數(shù)據(jù)解壓縮的計算設(shè)備的至少一個實施例的簡化框圖;
圖2是圖1的計算設(shè)備的環(huán)境的至少一個實施例的簡化框圖;
圖3A和圖3B是可由圖1和圖2的計算設(shè)備執(zhí)行的用于有效數(shù)據(jù)解壓縮的方法的至少一個實施例的簡化流程圖;
圖4是可以通過圖3A和圖3B的方法來解壓縮的壓縮數(shù)據(jù)符號的示意圖;
圖5是圖3A和圖3B的方法的至少一個實施例的偽代碼清單;以及
圖6是圖3A和圖3B的方法的一部分的另一個實施例的偽代碼清單。
具體實施方式
雖然本公開的概念易于經(jīng)歷各種修改和替代形式,但是在附圖中已經(jīng)通過示例的方式來示出了其特定實施例并且將在本文中對其進行詳細(xì)描述。然而,應(yīng)當(dāng)理解的是,不意在將本公開的概念限制于所公開的特定形式,而相反,意圖是覆蓋與本公開和所附權(quán)利要求書一致的所有修改型式、等效型式和替代型式。
在說明書中提到“一個實施例”、“實施例”、“示意性實施例”等表明所描述的實施例可以包括特定特征、結(jié)構(gòu)、或特性,但每一個實施例可能或可能不一定包括該特定特征、結(jié)構(gòu)、或特性。此外,這種短語不一定指相同的實施例。進一步地,當(dāng)關(guān)于實施例而描述特定特征、結(jié)構(gòu)或特性時,應(yīng)當(dāng)認(rèn)為的是,無論是否進行了明確描述,結(jié)合其他實施例來實現(xiàn)這種特征、結(jié)構(gòu)或特性都在本領(lǐng)域的技術(shù)人員的知識內(nèi)。另外,應(yīng)當(dāng)理解的是,包括在采用“A、B和C中的至少一者”的形式的列表中的項目可以指(A);(B);(C);(A和B);(A和C);(B和C);或(A、B、和C)。類似地,采用“A、B或C中的至少一者”的形式來列出的項目可以指(A);(B);(C);(A和B);(A和C);(B和C);或(A、B和C)。
在一些情況下,可以在硬件、固件、軟件或其任何組合中實施所公開的實施例。還可以將所公開的實施例實施為由瞬態(tài)或非瞬態(tài)機器可讀(例如,計算機可讀)存儲介質(zhì)承載或者存儲在其上的可由一個或多個處理器來讀取和執(zhí)行的指令。機器可讀存儲介質(zhì)可以被具體化為任何存儲設(shè)備、機制、或用于存儲或傳輸采用機器可讀形式的信息的其他物理結(jié)構(gòu)(例如,易失性或非易失性存儲器、介質(zhì)盤或其他介質(zhì)設(shè)備)。
在附圖中,一些結(jié)構(gòu)特征或方法特征可能以特定安排和/或順序示出。然而,應(yīng)當(dāng)理解的是,可能不需要這種特定安排和/或順序。相反,在一些實施例中,可以采用與在說明性附圖中所示出的方式和/或順序不同的方式和/或順序來安排這種特征。另外,在具體的圖中包括結(jié)構(gòu)特征或方法特征并不意味著暗示在所有實施例中都需要這種特征,并且在一些實施例中,可以不包括這種特征或者這種特征可以與其他特征組合。
現(xiàn)在參照圖1,用于進行有效數(shù)據(jù)解壓縮的說明性計算設(shè)備100包括處理器120、I/O子系統(tǒng)122、存儲器124、和數(shù)據(jù)存儲設(shè)備126。在使用時,如以下所描述的,計算設(shè)備100被配置成用于從壓縮輸入數(shù)據(jù)中讀取符號,對所述符號進行解碼,以及輸出解壓縮數(shù)據(jù)。計算設(shè)備100判定是否可以使用快速通路解壓縮例程或使用傳統(tǒng)緩慢通路解壓縮例程來解壓縮每一個輸入符號??梢允褂每焖偻防虂斫鈮嚎s大多數(shù)符號,并且由此可由處理器120的分支預(yù)測硬件高準(zhǔn)確性地預(yù)測對是否應(yīng)用快速通路例程的確定。在執(zhí)行快速通路例程期間,計算設(shè)備100在不執(zhí)行可能無法使用分支預(yù)測硬件來預(yù)測的數(shù)據(jù)相關(guān)分支指令的情況下確定要復(fù)制的數(shù)據(jù)的起始地址和長度。再次,計算設(shè)備100可以在不執(zhí)行數(shù)據(jù)相關(guān)分支指令的情況下使用小數(shù)據(jù)表或其他快速的技術(shù)來確定下一符號在輸入流中的位置。通過避免不可預(yù)測的分支指令,計算設(shè)備100可以避免分支誤預(yù)測懲罰。通過減小用于確定下一符號位置的關(guān)鍵指令路徑的執(zhí)行時間,計算設(shè)備100可以提高吞吐量,特別是在使用能夠進行無序執(zhí)行的處理器120時。說明性地,如在本文中所描述的計算設(shè)備100可以實現(xiàn)的解壓縮速度比之前已知的、優(yōu)化的軟件解壓縮技術(shù)快50-100%。
計算設(shè)備100可以被具體化為能夠進行有效數(shù)據(jù)解壓縮并且以其他方式執(zhí)行本文中所描述的功能的任何類型的設(shè)備。例如,計算設(shè)備100可以被具體化為(不限于)膝上型計算機、筆記本計算機、平板計算機、智能電話、移動計算設(shè)備、可穿戴計算設(shè)備、計算機、臺式計算機、工作臺、服務(wù)器計算機、分布式計算系統(tǒng)、多處理器系統(tǒng)、消費者電子設(shè)備、智能家電、和/或能夠進行有效數(shù)據(jù)解壓縮的任何其他計算設(shè)備。如在圖1中所示出的,說明性計算設(shè)備100包括處理器120、I/O子系統(tǒng)122、存儲器124、和數(shù)據(jù)存儲設(shè)備126。當(dāng)然,在其他實施例中,計算設(shè)備100可以包括其他或附加部件,如計算機中常見的部件(例如,各種輸入/輸出設(shè)備)。另外,在一些實施例中,說明性部件中的一個或多個說明性部件可以結(jié)合在另一部件中,或以其他方式形成其一部分。例如,在一些實施例中,存儲器124或其部分可以結(jié)合在處理器120中。
處理器120可以被具體化為能夠執(zhí)行本文中所描述的功能的任何類型的處理器。例如,處理器120可以被具體化為(多個)單核或多核處理器、數(shù)字信號處理器、微控制器、或者其他處理器或處理/控制電路。類似地,存儲器124可以被具體化為能夠執(zhí)行本文中所描述的功能的任何類型的易失性或非易失性存儲器或數(shù)據(jù)儲存設(shè)備。在操作中,存儲器124可以存儲在對計算設(shè)備100的操作期間所使用的各種數(shù)據(jù)和軟件,比如,操作系統(tǒng)、應(yīng)用、程序、庫、和驅(qū)動程序。存儲器124經(jīng)由I/O子系統(tǒng)122通信地耦合至處理器120,所述子系統(tǒng)可以被具體化為用于促進與計算設(shè)備100的處理器120、存儲器124、以及其他部件的輸入/輸出操作的電路和/或部件。例如,I/O子系統(tǒng)122可以被具體化為或以其他方式包括用于促進輸入/輸出操作的存儲器控制器中樞、輸入/輸出控制中樞、固件設(shè)備、通信鏈路(即,點到點鏈路、總線鏈路、線、電纜、光導(dǎo)、印刷電路板跡線等)和/或其他部件和子系統(tǒng)。在一些實施例中,I/O子系統(tǒng)122可以形成片上系統(tǒng)(SoC)的一部分并且可以與計算設(shè)備100的處理器120、存儲器124以及其他部件一起結(jié)合在單個集成電路芯片上。
數(shù)據(jù)存儲設(shè)備126可以被具體化為被配置成用于對數(shù)據(jù)進行短期或長期存儲的任何類型的一種或多種設(shè)備,如例如,存儲器設(shè)備和電路、存儲器卡、硬盤驅(qū)動器、固態(tài)驅(qū)動器或其他數(shù)據(jù)存儲設(shè)備。數(shù)據(jù)存儲設(shè)備126可以存儲計算設(shè)備100處理的壓縮和/或解壓縮數(shù)據(jù)。
計算設(shè)備100還可以包括通信子系統(tǒng)128,所述通信子系統(tǒng)可以被具體化為能夠使計算設(shè)備100與其他遠端設(shè)備之間通過計算機網(wǎng)絡(luò)(未示出)的通信成為可能任何通信電路、設(shè)備、或其集合。通信子系統(tǒng)128可以被配置成用于使用任何一種或多種通信技術(shù)(例如,有線或無線通信)以及相關(guān)聯(lián)的協(xié)議(例如,以太網(wǎng)、WiMAX等)來實現(xiàn)這種通信。
現(xiàn)在參照圖2,在說明性實施例中,計算設(shè)備100在操作期間建立環(huán)境200。說明性實施例200包括輸入模塊202、符號標(biāo)簽解碼模塊204、數(shù)據(jù)源模塊206、輸出模塊208、和緩慢通路模塊210。在使用時,計算設(shè)備100被配置成用于從輸入流212中讀取壓縮數(shù)據(jù)、對所述壓縮數(shù)據(jù)進行解碼、以及將解壓縮數(shù)據(jù)寫入輸出流214中。環(huán)境200的各種模塊可以被具體化為硬件、固件、軟件或其組合。例如,環(huán)境200的各種模塊、邏輯和其他部件可以形成計算設(shè)備100的處理器120或其他硬件部件的一部分或以其他方式由所述計算設(shè)備的所述處理器或所述其他硬件部件建立。
輸入模塊202被配置成用于管理對輸入流212的訪問。輸入模塊202被配置成用于打開輸入流212并從輸入流212中讀取符號和其他數(shù)據(jù)。輸入模塊202可以維持輸入流指針,所述輸入流指針可以用于訪問來自輸入流212的壓縮數(shù)據(jù)。輸入流212可以被具體化為包括壓縮數(shù)據(jù)的任何存儲器內(nèi)數(shù)據(jù)結(jié)構(gòu)。輸入流212可由文件、網(wǎng)絡(luò)連接、存儲器緩沖器、或壓縮數(shù)據(jù)的任何其他來源支持或以其他方式與其相關(guān)聯(lián)。
符號標(biāo)簽解碼模塊204被配置成用于基于輸入模塊202讀取的符號標(biāo)簽值來確定下一符號增量值、文字量增量值、數(shù)據(jù)長度和偏移量值。如以上所描述的,壓縮數(shù)據(jù)包括符號系列。每一個符號可以是文字量符號或參考符號,并且每一個符號可以在輸入流212中占據(jù)可變數(shù)量的字節(jié)。文字量符號包括在解壓縮期間要復(fù)制到輸出流214中的文字量數(shù)據(jù)。參考符號指在解壓縮期間要復(fù)制到輸出流214中的之前解壓縮的數(shù)據(jù),例如,通過復(fù)制之前復(fù)制到輸出流214中的數(shù)據(jù)。下一符號增量值可以用于標(biāo)識下一符號的開頭在輸入流212中的位置。對于文字量符號和參考符號兩者,數(shù)據(jù)長度指示要復(fù)制多少數(shù)據(jù)字節(jié)。文字量增量值可以用于定位文字量數(shù)據(jù)在輸入流212中的起點,并且偏移量值可以用于定位參考數(shù)據(jù)在輸出流214中的起點。在一些實施例中,符號標(biāo)簽解碼模塊204可以被配置成用于通過分別對下一符號增量表216、文字量增量表218和長度表220進行索引來確定下一符號增量值、文字量增量和數(shù)據(jù)長度。另外地或可替代地,在一些實施例中,符號標(biāo)簽解碼模塊204可以被配置成用于以編程方式確定那些值。
數(shù)據(jù)源模塊206被配置成用于維持源指針,所述源指針用于訪問要復(fù)制到解壓縮輸出中的數(shù)據(jù)。數(shù)據(jù)源模塊206被配置成用于基于當(dāng)前符號的類型(即,文字量符號或參考符號)來將源指針設(shè)置成指向來自輸入流212的文字量數(shù)據(jù)或者參考來自輸出流214的之前解壓縮的數(shù)據(jù)。數(shù)據(jù)源模塊206被配置成用于在不執(zhí)行任何可預(yù)測分支指令的情況下例如通過使用條件移動指令來設(shè)置源指針。
輸出模塊208被配置成用于管理對輸出流214的訪問。輸出模塊208被配置成用于打開輸出流214并將解壓縮數(shù)據(jù)寫入輸出流214中。輸出模塊208還被配置成用于允許從用于解壓縮參考符號的輸出流214中復(fù)制已經(jīng)寫入的數(shù)據(jù)。輸出模塊208可以維持輸出流指針,所述輸出流指針可以用于從輸出流214中讀取和/或?qū)懭虢鈮嚎s數(shù)據(jù)。輸出流214可以被具體化為能夠存儲和參考解壓縮數(shù)據(jù)的任何存儲器內(nèi)數(shù)據(jù)結(jié)構(gòu)。輸出流214可由文件、網(wǎng)絡(luò)連接、存儲器緩沖器、或任何其他解壓縮數(shù)據(jù)目的地支持或以其他方式與其相關(guān)聯(lián)。
緩慢通路模塊210被配置成用于執(zhí)行緩慢通路解壓縮例程以便對快速通路(即,輸入模塊202、符號標(biāo)簽解碼模塊204、數(shù)據(jù)源模塊206、和輸出模塊208)無法解碼的符號進行解碼。緩慢通路解壓縮例程可以被具體化為能夠?qū)焖偻窡o法解碼的符號進行解碼的任何經(jīng)優(yōu)化或未經(jīng)優(yōu)化的解壓縮算法,如例如,谷歌公司開發(fā)的Snappy解壓縮庫。例如,緩慢通路解壓縮例程可以基于當(dāng)前符號的類別而包括不可預(yù)測的分支指令。
現(xiàn)在參照圖3A,在使用時,計算設(shè)備100可以執(zhí)行用于進行有效數(shù)據(jù)解壓縮的方法300。方法300開始于框302,在所述框中,計算設(shè)備100打開輸入流212并將輸入流指針設(shè)置到包括在所述流中的第一符號。計算設(shè)備100可以使用任何技術(shù)來打開輸入流212,比如,將文件的內(nèi)容復(fù)制到存儲器緩沖器中或者對文件進行存儲器映射。對于許多文件格式,輸入流212可以包括第一符號之前的報頭或其他數(shù)據(jù)。例如,Snappy壓縮文件格式包括將文件的未壓縮長度存儲為小字節(jié)序varint的前導(dǎo)。計算設(shè)備100可以執(zhí)行任何適當(dāng)?shù)牟僮饕员闾幚韴箢^并且將輸入流指針增大至第一符號。
在框304中,計算設(shè)備100打開輸出流214并初始化輸出流指針。計算設(shè)備100可以使用任何技術(shù)來打開輸出流214,比如,創(chuàng)建存儲器內(nèi)寫入緩沖器或?qū)ξ募M行存儲器映射。在打開之后,計算設(shè)備100能夠從輸出流指針開始將數(shù)據(jù)寫入輸出流214。計算設(shè)備100還能夠從用于解壓縮參考符號的輸出流214中讀取和/或復(fù)制數(shù)據(jù)。
在框306中,計算設(shè)備100從輸入流指針中讀取當(dāng)前輸入符號的標(biāo)簽值。在對以Snappy格式存儲的文件進行解壓縮的說明性實施例中,計算設(shè)備100從輸入流212中讀取單個標(biāo)簽字節(jié)。然而,在其他實施例中,計算設(shè)備100可以讀取附加標(biāo)簽數(shù)據(jù)。如以上所描述的,輸入流212包括符號序列,包括文字量符號和參考符號。標(biāo)簽值可由計算設(shè)備100用于確定當(dāng)前符號的類型,并且還可以用于確定符號的如偏移量和數(shù)據(jù)長度等參數(shù)。
現(xiàn)在參照圖4,圖400展示了以Snappy格式使用各種符號。每一個符號開始于標(biāo)簽字節(jié)并且在標(biāo)簽字節(jié)的2個最低有效位中包括可以用于對符號進行分類的2位類別值。符號402、404是文字量符號,類別值等于二進制值“00”。符號402包括標(biāo)簽字節(jié),在標(biāo)簽字節(jié)之后是文字量數(shù)據(jù)字節(jié)序列。標(biāo)簽字節(jié)的6個最高有效位表示文字量的長度減去1。符號402可以表示長度為從1字節(jié)到60字節(jié)(包括)的文字量。由此,符號402可以用于相對短的文字量。
符號404可以用于更長的文字量。符號404包括標(biāo)簽字節(jié),在標(biāo)簽字節(jié)之后是長度值并且之后是文字量數(shù)據(jù)字節(jié)序列。對標(biāo)簽字節(jié)的6個最高有效位進行編碼以便指示使用多少字節(jié)來存儲長度值。對應(yīng)于60、61、62或63的二進制值分別與1至4字節(jié)的長度相對應(yīng)。長度值等于文字量的長度減1,以小字節(jié)序格式存儲。
符號406、408、410是參考符號。符號406是一字節(jié)偏移量參考符號,類別值等于二進制值“01”。符號406包括11位偏移量值。偏移量的三個最高有效位(O10至O8)存儲在標(biāo)簽字節(jié)的三個最高有效位中,并且偏移量的剩余部分(位O7至O0)存儲在標(biāo)簽字節(jié)之后的下一字節(jié)中。標(biāo)簽字節(jié)還包括定位在偏移量位和類別位之間的3位長度值(標(biāo)簽字節(jié)中標(biāo)號為4至2的位,標(biāo)記為l2至l0)。長度值表示數(shù)據(jù)長度減4;因此,符號406可以存儲從4到11(包括)的長度以及從0到2047(包括)的偏移量。
符號408是兩字節(jié)偏移量參考符號,類別值等于二進制值“10”。符號408包括標(biāo)簽字節(jié)之后的兩字節(jié)偏移量值,存儲為小字節(jié)序16位整數(shù)。換言之,偏移量的第一字節(jié)存儲8個最低有效位,并且偏移量的第二字節(jié)存儲8個最高有效位。長度值存儲在標(biāo)簽字節(jié)的6個最高有效位中,并且表示要復(fù)制的數(shù)據(jù)的長度減1。符號408可以存儲從1到64(包括)的長度以及從0到65,535(包括)的偏移量。
符號408是四字節(jié)偏移量參考符號,類別值等于二進制值“11”。符號408包括標(biāo)簽字節(jié)之后的四字節(jié)偏移量值,存儲為小字節(jié)序32位整數(shù)。長度值存儲在標(biāo)簽字節(jié)的6個最高有效位中,并且等于要復(fù)制的數(shù)據(jù)的長度減1。因為生成四字節(jié)偏移量參考符號將需要壓縮器維持大量歷史,所以這種符號在使用時的壓縮數(shù)據(jù)中可能非常罕見。
返回參照圖3A,在讀取標(biāo)簽值之后,在框308中,計算設(shè)備100判定標(biāo)簽值是否大于最大數(shù)據(jù)長度。如果標(biāo)簽值大于最大數(shù)據(jù)長度,則計算設(shè)備100可能不能對符號進行快速通路解壓縮。在許多實施例中,因為如以上所描述的,如果標(biāo)簽值的高6位大于或等于60(因為高6位包括長度減1),則符號可以是如圖4的符號404等大文字量符號,所以最大數(shù)據(jù)長度可以是60字節(jié)。在那些實施例中,計算設(shè)備100可以判定標(biāo)簽字節(jié)的高6位是否大于或等于60,這可能相當(dāng)于判定標(biāo)簽值是否大于或等于60乘以4。如果計算設(shè)備100確定標(biāo)簽值大于最大數(shù)據(jù)長度,則方法300分支到框310。如以下所描述的,若否,則計算設(shè)備100前進到框312。
在框310中,計算設(shè)備100使用緩慢通路例程來解壓縮當(dāng)前輸入符號。緩慢通路例程可以執(zhí)行普通、經(jīng)優(yōu)化的或未經(jīng)優(yōu)化的解壓縮算法。具體地,當(dāng)執(zhí)行緩慢通路例程時,計算設(shè)備100可以執(zhí)行不可預(yù)測的分支指令或其他可能很慢的指令,以便對輸入符號執(zhí)行正確解壓縮。因為很少采用緩慢通路,所以方法300的整體性能可能不會受到分支誤預(yù)測懲罰或緩慢通路中的其他性能問題的負(fù)面影響。當(dāng)執(zhí)行緩慢通路例程時,計算設(shè)備100可能不會做出關(guān)于當(dāng)前輸入符號的類型的假設(shè)并且由此可能對所有可能的格式進行檢查。例如,盡管標(biāo)簽字節(jié)可以讓其高6位大于或等于60,但是當(dāng)前輸入符號不一定是長的文字量符號。例如,當(dāng)前符號可以是長度大于60的兩字節(jié)或四字節(jié)參考符號。在解壓縮當(dāng)前符號并相應(yīng)更新輸入流指針和輸出流指針之后,方法300循環(huán)回到框306以便繼續(xù)解壓縮下一符號。
返回參照框308,如果標(biāo)簽值不大于或等于60乘以4,則方法300前進到框312。因為標(biāo)簽值將僅很少大于或等于60乘以4,所以在大多數(shù)迭代中,方法300前進到框312。因此,處理器120的分支預(yù)測硬件可能能夠高準(zhǔn)確性地預(yù)測方法300是否前進到框312。在框312中,計算設(shè)備100將類別值設(shè)置成等于標(biāo)簽字節(jié)的低2位。計算設(shè)備100可以例如使用一項或多項逐位運算來遮蔽所述低2位。如在圖4中所示出的,兩位類別值標(biāo)識了4種不同類型的符號:文字量、一字節(jié)偏移量參考、兩字節(jié)偏移量參考、和四字節(jié)偏移量參考。
在框314中,計算設(shè)備100判定當(dāng)前符號的類別是否為四字節(jié)偏移量參考符號。例如,計算設(shè)備100可以判定類別值是否等于二進制值“11”。計算設(shè)備100可能不能對四字節(jié)偏移量參考符號進行快速通路解壓縮。如以上所描述的,如果符號是四字節(jié)偏移量參考符號,則方法300分支到框310以便執(zhí)行緩慢通路解壓縮例程。如果符號不是四字節(jié)偏移量參考符號,則方法300前進到框316。如以上所描述的,四字節(jié)偏移量參考符號很罕見。因此,在大多數(shù)迭代中,方法300前進到框316,并且處理器120的分支預(yù)測硬件可能能夠高準(zhǔn)確性地預(yù)測方法300是否前進到框316。
在框316中,計算設(shè)備100通過使用標(biāo)簽字節(jié)來對下一符號增量表216進行索引從而查找下一符號的增量值。下一符號增量表216很小(例如,僅僅256字節(jié))并且可能能夠存儲在處理器120的緩存存儲器中。因此,可以非常迅速地完成對下一符號增量值的確定(例如,在L1緩存命中所需的時間內(nèi),例如,4個時鐘周期)。如以下所描述的,可以將下一符號增量值添加到輸入流指針中以便確定下一符號在輸入流212中的位置。由此,可能在方法300的關(guān)鍵路徑上確定下一符號增量值。通過迅速地計算下一符號增量值并且在不依賴于任何不可預(yù)測的分支的情況下,計算設(shè)備100可以減小關(guān)鍵路徑的長度和/或等待時間。具體地,在具有能夠進行無序指令執(zhí)行的處理器120的實施例中,計算設(shè)備100可能能夠繼續(xù)無序執(zhí)行以便對附加輸入符號進行解壓縮。進一步地,盡管被展示為從下一符號增量表216中查找下一符號增量值,但是應(yīng)當(dāng)理解的是,在一些實施例中,計算設(shè)備100可以以編程方式計算下一符號增量值。
在框318中,計算設(shè)備100通過使用標(biāo)簽字節(jié)來對文字量增量表218進行索引從而查找文字量符號起點的增量值。如通過圖4的符號402、404來展示的,對于文字量符號,根據(jù)文字量數(shù)據(jù)的長度,從標(biāo)簽字節(jié)的地址到文字量數(shù)據(jù)的起點的增量可能在1至5字節(jié)之間變化。另外,因為文字量增量值將不會用于參考符號,所以文字量增量表218可以包括與那些符號相關(guān)聯(lián)的標(biāo)簽字節(jié)的任何值。類似于下一符號增量表216,文字量增量表218很小(例如,僅僅256字節(jié))并且可能能夠存儲在處理器120的緩存存儲器中。進一步地,盡管被展示為從文字量增量表218中查找文字量增量值,但是應(yīng)當(dāng)理解的是,在一些實施例中,計算設(shè)備100可以以編程方式計算文字量增量值。另外地或可替代地,在一些實施例中,快速通路解壓縮例程可以僅解壓縮具有1字節(jié)偏移量的相對短的文字量。在那些實施例中,文字量增量表218可以包括所有“1”,或者文字量數(shù)據(jù)的起點的增量可以是恒定值1,并且可以省略文字量增量表218。
在框320中,計算設(shè)備100通過使用標(biāo)簽字節(jié)來對長度表220進行索引從而查找要復(fù)制的數(shù)據(jù)的長度。可通過快速通路解壓縮過程來處理的所有符號包括對數(shù)據(jù)長度在標(biāo)簽字節(jié)本身中的表示。例如,圖4的符號402、406、408全部包括在標(biāo)簽字節(jié)中的長度。長度表220可以包括將不會通過快速通路例程來處理的標(biāo)簽字節(jié)的任何值——或不包括所述標(biāo)簽字節(jié)的任何值。類似于表216、218,長度表220很小(例如,僅僅256字節(jié))并且可能能夠存儲在處理器120的緩存存儲器中。進一步地,盡管被展示為從長度表220中查找數(shù)據(jù)長度,但是應(yīng)當(dāng)理解的是,在一些實施例中,計算設(shè)備100可以以編程方式計算數(shù)據(jù)長度值。
在框322中,計算設(shè)備100將標(biāo)簽值右移五位,保留原始高三位。將標(biāo)簽值右移允許計算設(shè)備100提取一字節(jié)參考符號的偏移量的高位。如通過圖4的符號406來展示的,將標(biāo)簽字節(jié)右移五位就將偏移量的高三位(O10至O8)移動至標(biāo)簽字節(jié)的是三個最低有效位。
在框324中,計算設(shè)備100將文字量指針設(shè)置為指向輸入流指針加上如通過以上在框318中所描述的方式來確定的文字量增量值。計算設(shè)備100可以在不判定當(dāng)前符號是文字量符號還是參考符號的情況下設(shè)置文字量指針。如以下所描述的,計算設(shè)備100將忽視參考符號的文字量指針。
現(xiàn)在參照圖3B,方法300繼續(xù)框326,在所述框中,計算設(shè)備100有條件地移動偏移量值的第二字節(jié):如果符號是兩字節(jié)偏移量參考符號則移動至標(biāo)簽值,如果符號不是兩字節(jié)偏移量參考符號則保留標(biāo)簽值。如通過圖4的符號408來展示的,對于兩字節(jié)偏移量符號,偏移量值的第二字節(jié)包括偏移量值的8個最高有效位(位15至8)。計算設(shè)備100可以在不執(zhí)行條件分支指令的情況下使用任何技術(shù)來有條件地設(shè)置標(biāo)簽值。例如,計算設(shè)備100可以使用三元運算符、預(yù)測的指令、條件移動指令、或其他處理器指令來執(zhí)行條件移動。在說明性實施例中,計算設(shè)備100測試類別值是否與二進制值“10”相匹配并且然后基于測試結(jié)果來執(zhí)行條件移動(CMOV)指令。執(zhí)行條件移動指令允許計算設(shè)備100在不執(zhí)行任何不可預(yù)測的分支指令和引起相關(guān)聯(lián)的分支誤預(yù)測懲罰的情況下選擇適當(dāng)?shù)闹怠?/p>
在框328中,計算設(shè)備100將偏移量值設(shè)置成標(biāo)簽值與偏移量的第一字節(jié)的聯(lián)接。如以上所描述的,標(biāo)簽值包括如以上關(guān)于框322而描述的偏移量值的3個最高有效位或如以上關(guān)于框326而描述的偏移量值的8個最高有效位。由此,在聯(lián)接之后,偏移量值對于一字節(jié)偏移量符號和兩字節(jié)偏移量符號兩者而言是恰當(dāng)?shù)?。另外,如以上所描述的,已?jīng)在沒有執(zhí)行任何不可預(yù)測的分支指令的情況下計算了偏移量值。
在框330中,計算設(shè)備100有條件地設(shè)置源指針:如果所述符號具有文字量類別則設(shè)置為文字量指針,并且如果所述符號不具有文字量類別值則設(shè)置為輸出流指針與偏移量值之差。計算設(shè)備100可以使用任何技術(shù)來有條件地設(shè)置源指針。例如,計算設(shè)備100可以使用三元運算符、預(yù)測的指令、條件移動指令、或其他處理器指令來執(zhí)行條件移動。在說明性實施例中,計算設(shè)備100測試類別值是否為二進制值“00”并且然后基于測試結(jié)果來執(zhí)行條件移動(CMOV)指令以便移動文字量指針或輸出流指針與偏移量值之差。執(zhí)行條件移動指令允許計算設(shè)備100在不執(zhí)行任何不可預(yù)測的分支指令和引起相關(guān)聯(lián)的分支誤預(yù)測懲罰的情況下設(shè)置源指針的適當(dāng)值。如以下進一步描述的,在確定源指針之后,計算設(shè)備100可以將數(shù)據(jù)長度量的字節(jié)從源指針復(fù)制到輸出流指針。由此,從輸入流212的文字量數(shù)據(jù)或者從之前輸出到輸出流214的數(shù)據(jù)中復(fù)制實際數(shù)據(jù)。
在框332中,計算設(shè)備100判定偏移量值是否小于16以及符號的類別是否不是文字量。在一些實施例中,計算設(shè)備100可以執(zhí)行該測試的短路邏輯評估。也就是說,如果偏移量值大于或等于16,則計算設(shè)備100可以不測試符號的類別。在許多實施例中,偏移量值通常大于或等于16。由此,可以使用計算設(shè)備100的分支預(yù)測硬件來高度預(yù)測框332的確定。如以下所描述的,如果偏移量值小于16并且類別不是文字量,則方法332分支到框336。若否,則方法300分支到框334。
在框334中,計算設(shè)備100對起始于源指針的數(shù)據(jù)長度數(shù)量個字節(jié)執(zhí)行到輸出流指針的16字節(jié)塊存儲器復(fù)制。在許多實施例中,計算設(shè)備100的處理器120能夠例如使用專用向量指令或向量寄存器來執(zhí)行快速16字節(jié)非對齊存儲器副本。因為計算設(shè)備100一次復(fù)制16字節(jié)的數(shù)據(jù),所以可以將比所請求的數(shù)據(jù)長度更多的數(shù)據(jù)復(fù)制到輸出流214中。然而,如以下所描述的,在完成復(fù)制之后,該不正確地復(fù)制的數(shù)據(jù)將被定位成經(jīng)過輸出流指針,并且由此,在對附加符號進行解碼時,將使用正確數(shù)據(jù)來復(fù)寫所述不正確地復(fù)制的數(shù)據(jù)。如以下所描述的,在復(fù)制數(shù)據(jù)之后,方法300前進到框338。
返回參照框332,如果偏移量值小于16并且類別不是文字量,則方法332分支到框336。在框336中,計算設(shè)備100對數(shù)據(jù)長度個字節(jié)執(zhí)行從源指針到輸出流指針的逐字節(jié)存儲器復(fù)制。盡管執(zhí)行逐字節(jié)復(fù)制通??赡鼙葔K復(fù)制更慢,但是可能為了正確性和/或為了避免頁面錯誤或其他錯誤而需要逐字節(jié)復(fù)制。在復(fù)制數(shù)據(jù)之后,方法300前進到框338。
在框338中,計算設(shè)備100將輸出流指針增大復(fù)制到輸出流214的數(shù)據(jù)的長度。由此,輸出流指針準(zhǔn)備在輸出流214中的正確位置處寫入下一符號的解壓縮數(shù)據(jù)。在框340中,計算設(shè)備100將輸入流指針增大下一符號增量值。由此,輸入流指針準(zhǔn)備在輸入流212中的正確位置處讀取下一輸入符號的數(shù)據(jù)。
在框342中,計算設(shè)備100判定是否仍需對附加符號進行解碼。計算設(shè)備100可以使用任何技術(shù)來判定是否還有附加符號,比如,將輸出流指針或輸入流指針與之前基于壓縮文件的報頭來確定的最大大小進行比較、測試在輸入流212中是否已經(jīng)到達文件的終點、或者任何其他測試。如果還有附加符號,則方法300循環(huán)回圖3A中所示出的框306,以便讀取下一標(biāo)簽字節(jié)。如果沒有附加符號,則方法300完成。計算設(shè)備100可以關(guān)閉輸入流212和/或輸出流214、輸出解壓縮內(nèi)容、或者執(zhí)行任何其他需要的處理以便產(chǎn)生解壓縮輸出。方法300可以重新開始于框302以便執(zhí)行附加解壓縮。
現(xiàn)在參照圖5,偽代碼500展示了方法300的一個潛在實施例。如所示出的,偽代碼500展示了操作306’至340’,每一項操作分別與圖3A和圖3B的框306至340的一個說明性實施例相對應(yīng)。具體地,偽代碼500判定是否通過執(zhí)行可高度預(yù)測的“如果語句:如果正確,則可以跳到緩慢通路例程”來在與框308至314的一個說明性實施例相對應(yīng)的操作308’至314’中應(yīng)用緩慢通路例程。另外,偽代碼500在操作330’中有條件地分配源指針的值,所述操作包括三元運算符并與框330的一個說明性實施例相對應(yīng)。如以上所描述的,在許多實施例中,可以將該三元運算符編譯成包括如CMOV等條件移動指令的可執(zhí)行代碼。偽代碼500還使用與框326的一個說明性實施例相對應(yīng)的包括三元運算符的類似操作326’來有條件地移動偏移量值的第二字節(jié)。現(xiàn)在參照圖6,偽代碼600展示了操作326”、328”,每一項操作分別與方法300的框326、328的另一個說明性實施例相對應(yīng)。如所示出的,偽代碼600還使用三元運算符來計算偏移量值,所述偏移量值可以被編譯成包括如CMOV等條件移動指令的可執(zhí)行代碼。
示例
以下提供了在本文中所公開的技術(shù)的說明性示例。所述技術(shù)的實施例可以包括以下所描述的示例中的任何一個或多個示例及其任何組合。
示例1包括一種用于數(shù)據(jù)解壓縮的計算設(shè)備,所述計算設(shè)備包括:輸入模塊,所述輸入模塊用于從輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取符號標(biāo)簽值;符號標(biāo)簽解碼模塊,所述符號標(biāo)簽解碼模塊用于根據(jù)所述符號標(biāo)簽值來確定下一符號增量值、文字量增量值、數(shù)據(jù)長度和偏移量值;數(shù)據(jù)源模塊,所述數(shù)據(jù)源模塊用于有條件地設(shè)置源指針:(i)響應(yīng)于確定所述符號標(biāo)簽值包括文字量類別值而設(shè)置成所述輸入指針加上所述文字量增量值,并且(ii)響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而設(shè)置成輸出指針減去所述偏移量值;以及輸出模塊,所述輸出模塊用于將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的存儲器位置;其中,所述輸入模塊進一步用于響應(yīng)于對所述數(shù)據(jù)的復(fù)制而將所述輸入指針增大所述下一符號增量值。
示例2包括如示例1所述的主題,并且其中,有條件地設(shè)置所述源指針包括在不執(zhí)行分支指令的情況下有條件地設(shè)置所述源指針。
示例3包括如示例1和2中任一項所述的主題,并且其中,有條件地設(shè)置所述源指針包括使用條件移動指令來有條件地設(shè)置所述源指針。
示例4包括如示例1至3中任一項所述的主題,并且進一步包括:緩慢通路模塊,所述緩慢通路模塊用于響應(yīng)于確定無法對當(dāng)前符號進行快速通路解碼而執(zhí)行緩慢通路解壓縮例程;其中,所述符號標(biāo)簽解碼模塊進一步用于根據(jù)所述符號標(biāo)簽值并且在確定所述下一符號增量值之前判定是否可以對所述當(dāng)前符號進行快速通路解碼。
示例5包括如示例1至4中任一項所述的主題,并且其中,判定是否可以對所述當(dāng)前符號進行快速通路解碼包括根據(jù)所述符號標(biāo)簽來判定所述數(shù)據(jù)長度是否與最大數(shù)據(jù)長度具有預(yù)定義關(guān)系。
示例6包括如示例1至5中任一項所述的主題,并且其中,判定所述數(shù)據(jù)長度是否與所述最大數(shù)據(jù)長度具有所述預(yù)定義關(guān)系包括判定所述數(shù)據(jù)長度是否大于六十字節(jié)。
示例7包括如示例1至6中任一項所述的主題,并且其中,判定是否可以對所述當(dāng)前符號進行快速通路解碼包括判定所述符號標(biāo)簽是否包括四字節(jié)偏移量類別值。
示例8包括如示例1至7中任一項所述的主題,并且其中,確定所述下一符號增量值包括使用所述符號標(biāo)簽值來對下一符號增量表進行索引。
示例9包括如示例1至8中任一項所述的主題,并且其中,對所述下一符號增量表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述下一符號增量表中查找所述下一符號增量值。
示例10包括如示例1至9中任一項所述的主題,并且其中,用于確定所述文字量增量值包括用于使用所述符號標(biāo)簽值來對文字量增量表進行索引。
示例11包括如示例1至10中任一項所述的主題,并且其中,對所述文字量增量表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述文字量增量表中查找所述文字量增量值。
示例12包括如示例1至11中任一項所述的主題,并且其中,確定所述數(shù)據(jù)長度包括使用所述符號標(biāo)簽值來對長度表進行索引。
示例13包括如示例1至12中任一項所述的主題,并且其中,對所述長度表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述長度表中查找所述數(shù)據(jù)長度。
示例14包括如示例1至13中任一項所述的主題,并且其中,讀取所述符號標(biāo)簽值包括從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取標(biāo)簽字節(jié)。
示例15包括如示例1至14中任一項所述的主題,并且其中,根據(jù)所述符號標(biāo)簽值來確定所述偏移量值包括:將所述標(biāo)簽字節(jié)右移五位;有條件地設(shè)置所述標(biāo)簽字節(jié):如果所述符號標(biāo)簽值包括兩字節(jié)偏移量類別值則設(shè)置成從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第二偏移量字節(jié),并且如果所述符號標(biāo)簽值不包括所述兩字節(jié)偏移量類別值則設(shè)置成所述標(biāo)簽字節(jié);以及聯(lián)接所述標(biāo)簽字節(jié)與從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第一偏移量字節(jié),以便生成所述偏移量值。
示例16包括如示例1至15中任一項所述的主題,并且其中,有條件地設(shè)置所述標(biāo)簽字節(jié)包括使用條件移動指令來有條件地設(shè)置所述標(biāo)簽字節(jié)。
示例17包括如示例1至16中任一項所述的主題,并且其中,將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的所述存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置包括:判定所述偏移量值是否小于預(yù)定義塊大?。豁憫?yīng)于確定所述偏移量值小于所述預(yù)定義塊大小而判定所述符號標(biāo)簽值是否不包括文字量類別值;響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的逐字節(jié)存儲器復(fù)制;以及響應(yīng)于確定所述偏移量值不小于所述預(yù)定義塊大小或者響應(yīng)于確定所述符號標(biāo)簽值包括所述文字量類別值而使用具有所述預(yù)定義塊大小的塊來進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的塊存儲器復(fù)制。
示例18包括如示例1至17中任一項所述的主題,并且其中,所述預(yù)定義塊大小包括十六字節(jié)、三十二字節(jié)、或六十四字節(jié)。
示例19包括如示例1至18中任一項所述的主題,并且其中,所述輸出模塊進一步用于響應(yīng)于對所述數(shù)據(jù)的復(fù)制而將所述輸出指針增大所述數(shù)據(jù)長度。
示例20包括示例1至19中任一項所述的主題,并且其中,所述輸入模塊進一步用于:響應(yīng)于對所述輸入指針的增大而判定是否還有附加符號;以及響應(yīng)于確定還有附加符號而從所述輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取下一符號標(biāo)簽值。
示例21包括一種用于數(shù)據(jù)解壓縮的方法,所述方法包括:由計算設(shè)備從輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取符號標(biāo)簽值;由所述計算設(shè)備根據(jù)所述符號標(biāo)簽值來確定下一符號增量值、文字量增量值、數(shù)據(jù)長度和偏移量值;由所述計算設(shè)備有條件地設(shè)置源指針:(i)響應(yīng)于確定所述符號標(biāo)簽值包括文字量類別值而設(shè)置成所述輸入指針加上所述文字量增量值,并且(ii)響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而設(shè)置成輸出指針減去所述偏移量值;由所述計算設(shè)備將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的存儲器位置;以及由所述計算設(shè)備響應(yīng)于復(fù)制所述數(shù)據(jù)而將所述輸入指針增大所述下一符號增量值。
示例22包括如示例21所述的主題,并且其中,有條件地設(shè)置所述源指針包括在不執(zhí)行分支指令的情況下有條件地設(shè)置所述源指針。
示例23包括如示例21和22中任一項所述的主題,并且其中,有條件地設(shè)置所述源指針包括使用條件移動指令來有條件地設(shè)置所述源指針。
示例24包括如示例21至23中任一項所述的主題,并且進一步包括:由所述計算設(shè)備根據(jù)所述符號標(biāo)簽值并且在確定所述下一符號增量值之前判定是否可以對當(dāng)前符號進行快速通路解碼;以及由所述計算設(shè)備響應(yīng)于確定無法對所述當(dāng)前符號進行快速通路解碼而執(zhí)行緩慢通路解壓縮例程。
示例25包括如示例21至24中任一項所述的主題,并且其中,判定是否可以對所述當(dāng)前符號進行快速通路解碼包括根據(jù)所述符號標(biāo)簽來判定所述數(shù)據(jù)長度是否與最大數(shù)據(jù)長度具有預(yù)定義關(guān)系。
示例26包括如示例21至25中任一項所述的主題,并且其中,判定所述數(shù)據(jù)長度是否與所述最大數(shù)據(jù)長度具有所述預(yù)定義關(guān)系包括判定所述數(shù)據(jù)長度是否大于六十字節(jié)。
示例27包括如示例21至26中任一項所述的主題,并且其中,判定是否可以對所述當(dāng)前符號進行快速通路解碼包括判定所述符號標(biāo)簽是否包括四字節(jié)偏移量類別值。
示例28包括如示例21至27中任一項所述的主題,并且其中,確定所述下一符號增量值包括使用所述符號標(biāo)簽值來對下一符號增量表進行索引。
示例29包括如示例21至28中任一項所述的主題,并且其中,對所述下一符號增量表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述下一符號增量表中查找所述下一符號增量值。
示例30包括如示例21至29中任一項所述的主題,并且其中,確定所述文字量增量值包括使用所述符號標(biāo)簽值來對文字量增量表進行索引。
示例31包括如示例21至30中任一項所述的主題,并且其中,對所述文字量增量表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述文字量增量表中查找所述文字量增量值。
示例32包括如示例21至31中任一項所述的主題,并且其中,確定所述數(shù)據(jù)長度包括使用所述符號標(biāo)簽值來對長度表進行索引。
示例33包括如示例21至32中任一項所述的主題,并且其中,對所述長度表進行索引包括在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述長度表中查找所述數(shù)據(jù)長度。
示例34包括如示例21至33中任一項所述的主題,并且其中,讀取所述符號標(biāo)簽值包括從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取標(biāo)簽字節(jié)。
示例35包括如示例21至34中任一項所述的主題,并且其中,根據(jù)所述符號標(biāo)簽值來確定所述偏移量值包括:將所述標(biāo)簽字節(jié)右移五位;有條件地設(shè)置所述標(biāo)簽字節(jié):如果所述符號標(biāo)簽值包括兩字節(jié)偏移量類別值則設(shè)置成從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第二偏移量字節(jié),并且如果所述符號標(biāo)簽值不包括所述兩字節(jié)偏移量類別值則設(shè)置成所述標(biāo)簽字節(jié);以及聯(lián)接所述標(biāo)簽字節(jié)與從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第一偏移量字節(jié),以便生成所述偏移量值。
示例36包括如示例21至35中任一項所述的主題,并且其中,有條件地設(shè)置所述標(biāo)簽字節(jié)包括使用條件移動指令來有條件地設(shè)置所述標(biāo)簽字節(jié)。
示例37包括如示例21至36中任一項所述的主題,并且其中,將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的所述存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置包括:判定所述偏移量值是否小于預(yù)定義塊大?。豁憫?yīng)于確定所述偏移量值小于所述預(yù)定義塊大小而判定所述符號標(biāo)簽值是否不包括文字量類別值;響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的逐字節(jié)存儲器復(fù)制;以及響應(yīng)于確定所述偏移量值不小于所述預(yù)定義塊大小或者響應(yīng)于確定所述符號標(biāo)簽值包括所述文字量類別值而使用具有所述預(yù)定義塊大小的塊來進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的塊存儲器復(fù)制。
示例38包括如示例21至37中任一項所述的主題,并且其中,所述預(yù)定義塊大小包括十六字節(jié)、三十二字節(jié)、或六十四字節(jié)。
示例39包括如示例21至38中任一項所述的主題,并且進一步包括由所述計算設(shè)備響應(yīng)于復(fù)制所述數(shù)據(jù)而將所述輸出指針增大所述數(shù)據(jù)長度。
示例40包括示例21至39中任一項所述的主題,并且進一步包括:由所述計算設(shè)備響應(yīng)于增大所述輸入指針而判定是否還有附加符號;以及由所述計算設(shè)備響應(yīng)于確定還有附加符號而從所述輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取下一符號標(biāo)簽值。
示例41包括一種計算設(shè)備,所述計算設(shè)備包括:處理器;以及存儲器,所述存儲器具有存儲于其中的多條指令,所述指令當(dāng)由所述處理器執(zhí)行時使所述計算設(shè)備執(zhí)行如示例21至40中任一項所述的方法。
示例42包括一種或多種機器可讀存儲介質(zhì),所述一種或多種機器可讀存儲介質(zhì)包括存儲于其上的多條指令,所述指令響應(yīng)于被執(zhí)行而使計算設(shè)備執(zhí)行如示例21至40中任一項所述的方法。
示例43包括一種計算設(shè)備,所述計算設(shè)備包括用于執(zhí)行如示例21至40中任一項所述的方法的裝置。
示例44包括一種用于數(shù)據(jù)解壓縮的計算設(shè)備,所述計算設(shè)備包括:用于從輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取符號標(biāo)簽值的裝置;用于根據(jù)所述符號標(biāo)簽值來確定下一符號增量值、文字量增量值、數(shù)據(jù)長度和偏移量值的裝置;用于有條件地設(shè)置源指針的裝置:(i)響應(yīng)于確定所述符號標(biāo)簽值包括文字量類別值而設(shè)置成所述輸入指針加上所述文字量增量值,并且(ii)響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而設(shè)置成輸出指針減去所述偏移量值;用于將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的存儲器位置的裝置;以及用于響應(yīng)于復(fù)制所述數(shù)據(jù)而將所述輸入指針增大所述下一符號增量值的裝置。
示例45包括如示例44所述的主題,并且其中,用于有條件地設(shè)置所述源指針的所述裝置包括用于在不執(zhí)行分支指令的情況下有條件地設(shè)置所述源指針的裝置。
示例46包括如示例44和45中任一項所述的主題,并且其中,用于有條件地設(shè)置所述源指針的所述裝置包括用于使用條件移動指令來有條件地設(shè)置所述源指針的裝置。
示例47包括如示例44至46中任一項所述的主題,并且進一步包括:用于根據(jù)所述符號標(biāo)簽值并且在確定所述下一符號增量值之前判定是否可以對當(dāng)前符號進行快速通路解碼的裝置;以及用于響應(yīng)于確定無法對所述當(dāng)前符號進行快速通路解碼而執(zhí)行緩慢通路解壓縮例程的裝置。
示例48包括如示例44至47中任一項所述的主題,并且其中,用于判定是否可以對所述當(dāng)前符號進行快速通路解碼的所述裝置包括用于根據(jù)所述符號標(biāo)簽來判定所述數(shù)據(jù)長度是否與最大數(shù)據(jù)長度具有預(yù)定義關(guān)系的裝置。
示例49包括如示例44至48中任一項所述的主題,并且其中,用于判定所述數(shù)據(jù)長度是否與所述最大數(shù)據(jù)長度具有所述預(yù)定義關(guān)系的所述裝置包括用于判定所述數(shù)據(jù)長度是否大于六十字節(jié)的裝置。
示例50包括如示例44至49中任一項所述的主題,并且其中,用于判定是否可以對所述當(dāng)前符號進行快速通路解碼的所述裝置包括用于判定所述符號標(biāo)簽是否包括四字節(jié)偏移量類別值的裝置。
示例51包括如示例44至50中任一項所述的主題,并且其中,用于確定所述下一符號增量值的所述裝置包括用于使用所述符號標(biāo)簽值來對下一符號增量表進行索引的裝置。
示例52包括如示例44至51中任一項所述的主題,并且其中,用于對所述下一符號增量表進行索引的所述裝置包括用于在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述下一符號增量表中查找所述下一符號增量值的裝置。
示例53包括如示例44至52中任一項所述的主題,并且其中,用于確定所述文字量增量值的所述裝置包括用于使用所述符號標(biāo)簽值來對文字量增量表進行索引的裝置。
示例54包括如示例44至53中任一項所述的主題,并且其中,用于對所述文字量增量表進行索引的所述裝置包括用于在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述文字量增量表中查找所述文字量增量值的裝置。
示例55包括如示例44至54中任一項所述的主題,并且其中,用于確定所述數(shù)據(jù)長度的所述裝置包括用于使用所述符號標(biāo)簽值來對長度表進行索引的裝置。
示例56包括如示例44至55中任一項所述的主題,并且其中,用于對所述長度表進行索引的所述裝置包括用于在存儲在所述計算設(shè)備的處理器的緩存存儲器中的所述長度表中查找所述數(shù)據(jù)長度的裝置。
示例57包括如示例44至56中任一項所述的主題,并且其中,用于讀取所述符號標(biāo)簽值的所述裝置包括用于從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取標(biāo)簽字節(jié)的裝置。
示例58包括如示例44至57中任一項所述的主題,并且其中,用于根據(jù)所述符號標(biāo)簽值來確定所述偏移量值的所述裝置包括:用于將所述標(biāo)簽字節(jié)右移五位的裝置;用于有條件地設(shè)置所述標(biāo)簽字節(jié)的裝置:如果所述符號標(biāo)簽值包括兩字節(jié)偏移量類別值則設(shè)置成從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第二偏移量字節(jié),并且如果所述符號標(biāo)簽值不包括所述兩字節(jié)偏移量類別值則設(shè)置成所述標(biāo)簽字節(jié);以及用于聯(lián)接所述標(biāo)簽字節(jié)與從所述輸入指針?biāo)鶚?biāo)識的所述存儲器位置中讀取的第一偏移量字節(jié)以便生成所述偏移量值的裝置。
示例59包括如示例44和58中任一項所述的主題,并且其中,用于有條件地設(shè)置所述標(biāo)簽字節(jié)的所述裝置包括用于使用條件移動指令來有條件地設(shè)置所述標(biāo)簽字節(jié)的裝置。
示例60包括如示例44至59中任一項所述的主題,并且其中,用于將具有所述數(shù)據(jù)長度的數(shù)據(jù)從所述源指針?biāo)鶚?biāo)識的所述存儲器位置復(fù)制到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的所述裝置包括:用于判定所述偏移量值是否小于預(yù)定義塊大小的裝置;用于響應(yīng)于確定所述偏移量值小于所述預(yù)定義塊大小而判定所述符號標(biāo)簽值是否不包括文字量類別值的裝置;用于響應(yīng)于確定所述符號標(biāo)簽值不包括所述文字量類別值而進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的逐字節(jié)存儲器復(fù)制的裝置;以及用于響應(yīng)于確定所述偏移量值不小于所述預(yù)定義塊大小或者響應(yīng)于確定所述符號標(biāo)簽值包括所述文字量類別值而使用具有所述預(yù)定義塊大小的塊來進行從所述源指針?biāo)鶚?biāo)識的所述存儲器位置到所述輸出指針?biāo)鶚?biāo)識的所述存儲器位置的具有所述數(shù)據(jù)長度的塊存儲器復(fù)制的裝置。
示例61包括如示例44至60中任一項所述的主題,并且其中,所述預(yù)定義塊大小包括十六字節(jié)、三十二字節(jié)、或六十四字節(jié)。
示例62包括如示例44至61中任一項所述的主題,并且進一步包括用于響應(yīng)于復(fù)制所述數(shù)據(jù)而將所述輸出指針增大所述數(shù)據(jù)長度的裝置。
示例63包括示例44至62中任一項所述的主題,并且進一步包括:用于響應(yīng)于增大所述輸入指針而判定是否還有附加符號的裝置;以及用于響應(yīng)于確定還有附加符號而從所述輸入指針?biāo)鶚?biāo)識的存儲器位置中讀取下一符號標(biāo)簽值的裝置。