<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 如何在32個處理器中編輯并且翻譯64固定的點進(jìn)位計算

          如何在32個處理器中編輯并且翻譯64固定的點進(jìn)位計算

          作者: 時間:2004-12-10 來源:網(wǎng)絡(luò) 收藏
          摘要:介紹嵌式32位CPU在編譯器中解決64位運算的方法,并列舉一個加法運算的例子,給出可供參考的指令模板。包括32位RISC體系嵌入式CPU層次結(jié)構(gòu)和編譯器后端結(jié)構(gòu)。

          關(guān)鍵詞:RTL 指令模板 編譯優(yōu)化

          1 概述

          在信息化飛速發(fā)展的今天,機(jī)已成為人們學(xué)習(xí)和工作不可缺少的工具,我國業(yè)已取得了電腦生產(chǎn)大國的地位;但是,作為機(jī)的核心――CPU的設(shè)計與制造,卻成了幾代機(jī)工作者的未了習(xí)愿,也給國家的安全帶來了隱憂。順應(yīng)潮流,中芯微系統(tǒng)公司于2001年推出了國內(nèi)第一顆實用化的32位CPU(方舟一號),主頻達(dá)到166MHz。下一代方舟CPU將采用0.18μm工藝,超流水結(jié)構(gòu),主頻能達(dá)到600MHz以上,在嵌入式CPU領(lǐng)域走到國際前列。

          傳統(tǒng)的32位計算機(jī)處理64位運算通常是設(shè)計具體的邏輯電路實現(xiàn)。隨著SoC(System on Chip)的出現(xiàn),芯片上集成各種功能部件越來越多,特別對于嵌入式系統(tǒng),片上能利用的空間就列加有限,這也要求將部分功能用軟件來實現(xiàn)。對于64位長字運算軟件實現(xiàn)的方法通常有兩種:一是設(shè)計系統(tǒng)軟件供操作系統(tǒng)內(nèi)核調(diào)用;二是在相關(guān)的編譯器中設(shè)計指令模板來解決。前者執(zhí)行效率高,但每使用一次就要編譯一次;后者只需編譯一次,總的效率要高于前者。因此,實際采用在編譯器中設(shè)計指令模板予以解決。

          2 32位RISC體系嵌入式CPU層次結(jié)構(gòu)描述

          圖1是一個集成了DSP(數(shù)字信號)嵌入式CPU的層次圖。從圖1可看到,編譯器在整個CPU結(jié)構(gòu)中處于ASIC硬件電路之下和操作系統(tǒng)之上,擔(dān)負(fù)著將高級的、抽象的表達(dá)式轉(zhuǎn)化為相對低級的表達(dá)式,最終生成系統(tǒng)指令集。

          3 CPU編譯器后端結(jié)構(gòu)

          CPU編譯器分為前端和后端:前端主要完成詞法/語法分析并生成語法樹,這里不再論述;后端是編譯的主體部分,它將語法樹轉(zhuǎn)換成不間語言,在此不間語言基礎(chǔ)上進(jìn)行各種編譯優(yōu)化,最終生成匯編指令代碼。編譯后端在進(jìn)行優(yōu)化的過程中要跟具體的目標(biāo)機(jī)的機(jī)器描述文件多次匹配,生成RTL語言(Register Transfer Language)―GNU CC的中間語言。

          機(jī)器描述文件由各種與目標(biāo)機(jī)有關(guān)的指令模板、功能模板、C語言形式的預(yù)處理函數(shù)等構(gòu)成。本文涉及到的64位運算就是由RTL和指令模板多次匹配后生成匯編指令來解決的,過程如圖2所示。

          限于篇幅,這里僅舉64位加法運算的部分例子,其它運算與此類似。

          4 64位加法運算指令板

          ① RTL識別指令模板,第一次匹配。

          (define_insn “adddi3”)

          [(set(match_operand:DI 0 "register_operand" "=r")

          (plus:DI (match_operand:DI 1“register_operand”“0”)

          (match_operand:DI 2 "register_operand"“r”)))

          (clobber(reg:SI 6))]//6號寄存器作使用

          "")

          ② 將64位加法分解成高32位和低32位運算,第二次匹配。

          (define_split

          [(set(match_operand:DI 0 "register_operand"“=r”)

          (plus:DI (match_operand:DI 1“register_operand”“0”)

          (match_operand:DI 2 “register_operand”“r”)))

          (clobber(reg:SI 6))]

          "reload_complete"

          “{

          [(const_int 0)] //寄存器使用前清零

          rtx low[3],high[3]; //rtx為一種處理表達(dá)式的數(shù)據(jù)類型

          low[0]=gen_lowpart(Simode,operands[0]);

          low[1]=gen_lowpart(Simode,operands[1]);

          low[2]=gen_lowpart(Simode,operands[2]);

          high[0]=gen_rtx(REG,Simode,REGNO(operands[0]-1);

          high[1]=gen_rtx(REG,Simode,REGNO(operands[1]-1);

          high[2]=gen_rtx(REG,Simode,REGNO(operands[2]-1);

          //由于方舟CPU地址存儲方式采用的是Big-Endian,即字節(jié)中的最高有效位具有最低序號,所以高位硬寄存器號要減1。

          emit_insn(gen_addsi3_set_carry(low[0],low[1],low[2])) //低32位加并設(shè)置

          emit_insn(gen_addsi3_use_carry(high[0],high[1],high[2])); //高32位加并處理

          DONE;

          }

          ③ 處理低32位加。

          (define_insn "addsi_set_carry"

          [(set(match_operand:SI 0 (match_operand:SI1 "register_operand" "r")

          (match_operand:SI 2

          "register_operand"“r”))) (clobber(reg:SI6))] //以下判斷是否有進(jìn)位。有,則6號寄存器置1(set(reg:SI6)

          (itu:SI(plus:SI(match_dup 1)match_dup 2))(match_dup 1)))]

          ""

          "add %0,%1,%2" //生成低32位匯編模板

          ④處理高32位加。

          (define_insn "addi3_use_carry"

          (define_insn "adddi3_use_carry"

          [(set(match_operand:SI 0 "register_operand"“=r”)

          (plus:SI(plus:SI(match_operand:SI 1 "register_operand" "r"))

          (reg:SI 6)))

          (clobber(reg:SI 6))]

          “”

          "add%0,%1,%2;add %0,%0,r6" //生成高32位帶進(jìn)位加匯編模板

          )

          在機(jī)器描述文件中,DI為64位機(jī)器方式,SI為32位方式。該文件由機(jī)器描述處理程序進(jìn)行格式轉(zhuǎn)換,它將調(diào)用編譯內(nèi)部一套專門的函數(shù)和數(shù)據(jù)結(jié)構(gòu)作為接口,生成gen_開頭的預(yù)處理函數(shù)對指令模板作進(jìn)一步的處理,再生成由insn_開頭的函數(shù)對模板作匹配后生成匯編代碼。

          結(jié)語

          在方舟二號CPU上測試的結(jié)果達(dá)到了64運算的要求,相關(guān)的指令代碼如下:

          ……

          132 r18,[r15,4]

          132 r19,[r15,8]

          add r16,r16,r18

          add r17,r17,r19

          add r17,r17,r6

          ……

          用SPEC95進(jìn)行定點運算測試,可達(dá)280MIPS以上,收到了較好的預(yù)期結(jié)果。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();