? ? ?最近幾年RISC-V在國內(nèi)外風(fēng)生水起,在中低端領(lǐng)域,越來越多的芯片設(shè)計公司慢慢的放棄ARM的cortex-M,cortex-A等中低端的ARMv7/v8架構(gòu),除了考慮防止掐脖子外,更多的也是為了降低成本。但是在高端局里面,ARMv9依然處于不可被撼動的地位。本文將從兩者最基本的寄存器和匯編講述兩者的不同(ARM本文重點介紹ARMv7,ARMv8/9后續(xù)通過連載的方式展開,以下ARM架構(gòu)描述默認(rèn)指的是ARMv7架構(gòu))
? ? ?如下圖所示,最直觀的感覺,RISC-V的通用寄存器有32個,相比ARM16個寄存器多了一倍,通用寄存器越多,好處可太多了。最常見的一個收益是C語言中函數(shù)之間的調(diào)用傳參,在ARM中,只能用R0~R3這4個通用寄存器傳參,一旦函數(shù)的參數(shù)超過4個,則必須把多的參數(shù)保存在棧也就是內(nèi)存里面,進一步導(dǎo)致性能下降,同樣的程序放在RISC-V中,則不會存在這個問題,因為它可以用a0~a7這8個通用寄存器保存參數(shù),避免了ARM一旦參數(shù)超過4個需要壓棧。

與ARM寄存器相比,RISC-V還有一個用于提升性能的寄存器gp,全局指針寄存器。

? ? ?如上面的C代碼所示, 對全局變量test加1操作,ARM需要5條匯編指令搞定


?再舉例最常見的匯編指令mov,
mov r0,?#0x56000000? ? ?/* 可以正確編譯?*/
mov r0, #0x56000014? ??/* 無法正確編譯?*/
本質(zhì)上還是因為mov對應(yīng)的機器碼內(nèi)容無法表達任意32bit數(shù)值,只能某些bit通過相關(guān)規(guī)則表達符合規(guī)則的數(shù)值(該規(guī)則請各位看官老爺自行度娘)。同樣C語言邏輯,對于RISC-V來說, 只需要3行匯編指令就搞定,相比ARM來說,足足少了2條指令,它的最大功臣來源于gp寄存器,通過一條和gp相關(guān)的指令就能獲取變量的地址,這個性能的提升對于實時性比較敏感,比如基帶處理等等起著非常重要的作用。

但是gp寄存器也不是萬能的,我們查詢RISC-V匯編指令手冊(上圖lw/sw指令)可以看到,以gp位基地址最大偏移地址只能是offset[11:0],即最大4096地址范圍內(nèi),+-2k。gp寄存器在程序編譯鏈接完成后就確定了,中途不能有任何改變,因此在工程實現(xiàn)的連接腳本中,把對時間比較敏感的變量盡可能的和gp(globe point)靠近在一起。

關(guān)注公眾號,加星標(biāo),回復(fù)1024獲取學(xué)習(xí)資料,每天進步一點點。
聲明:
本號原創(chuàng)、轉(zhuǎn)載的文章、圖片等版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。
關(guān)注、點贊、在看、轉(zhuǎn)發(fā),支持優(yōu)質(zhì)內(nèi)容!
?