自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

loongarch架構(gòu)介紹—基礎(chǔ)指令(一)

開(kāi)發(fā) 架構(gòu)
本文介紹了loongarch架構(gòu)中的一些基礎(chǔ)指令,如整數(shù)和浮點(diǎn)運(yùn)算指令、轉(zhuǎn)移指令、訪存指令,并結(jié)合案例對(duì)loongarch匯編語(yǔ)言的寫(xiě)法進(jìn)行了說(shuō)明。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前言

最近龍芯中科宣布,龍芯2K0500開(kāi)發(fā)板已與OpenHarmony(開(kāi)源鴻蒙系統(tǒng))完成了適配驗(yàn)證,LoongArch平臺(tái)實(shí)現(xiàn)初步支持OpenHarmony。本系列文章將對(duì)loongarch架構(gòu)進(jìn)行介紹。

龍芯架構(gòu)LoongArch是龍芯中科公司自主設(shè)計(jì)的一種精簡(jiǎn)指令集計(jì)算機(jī)(RISC)風(fēng)格的指令系統(tǒng)架構(gòu)。其分為32位和64位兩個(gè)版本,分別稱(chēng)為L(zhǎng)A32架構(gòu)和LA64架構(gòu)。本文主要對(duì)其中的基礎(chǔ)部分進(jìn)行介紹。本文中的主要信息來(lái)源于龍芯目前公開(kāi)的資料。

1、指令編碼格式

下圖為龍芯架構(gòu)的典型指令編碼格式,大部分指令格式都符合這些格式:

#loongarch架構(gòu)介紹#[一]基礎(chǔ)指令-開(kāi)源基礎(chǔ)軟件社區(qū)

上圖中解釋?zhuān)?/p>

  • 指令長(zhǎng)度固定為32位,無(wú)論是LA32還是LA64
  • 上圖中共有2R-type、3R-type、2RI8-type等9種編碼格式,其中R表示寄存器,I表示立即數(shù)。如2RI8-type表示指令格式中除了操作碼opcode外,還指定了2個(gè)寄存器和一個(gè)8位的立即數(shù)。

2、指令匯編格式

loongarch的指令匯編格式主要包括指令名和操作數(shù)這兩部分,其中指令名格式比較特別。loongarch中指令名可以有前綴和后綴字母,前綴字母有:

  • V:128位向量指令
  • XV:256位向量指令
  • F:非向量浮點(diǎn)指令
  • VF:128位向量浮點(diǎn)指令
  • XVF:256位向量浮點(diǎn)指令

后綴字母有:

  • 對(duì)于整數(shù)類(lèi)型指令:.B、.H、.W、.D、.BU、.HU、.WU、.DU分別表示有符號(hào)字節(jié)、有符號(hào)半字、有符號(hào)字、有符號(hào)雙字、無(wú)符號(hào)字節(jié)、無(wú)符號(hào)半字、無(wú)符號(hào)字、無(wú)符號(hào)雙字。其中雙字僅存在于LA64
  • 對(duì)于浮點(diǎn)類(lèi)型指令:.H、.S、.D、.W、.L、.WU、.LU分別表示半精度、單精度、雙精度的浮點(diǎn)數(shù),以及有符號(hào)字、有符號(hào)雙字、無(wú)符號(hào)字、無(wú)符號(hào)雙字的整數(shù)。其中雙字僅存在于LA64

舉例如下:

  • add.w    rd, rj, rk: 表示寄存器rj和rk相加,結(jié)果寫(xiě)入rd。無(wú)前綴,后綴.w表示操作數(shù)據(jù)的位數(shù)為32位。
  • fadd.s fd, fj, fk:表示浮點(diǎn)寄存器fj和fk相加,結(jié)果寫(xiě)入fd。前綴為f,表示為非向量浮點(diǎn)運(yùn)算指令。后綴為.s,表示操作數(shù)據(jù)為單精度浮點(diǎn)數(shù)。
  • mulw.d.wu rd, rj, rk:表示寄存器rj和rk相乘,結(jié)果寫(xiě)入rd。無(wú)前綴。該指令有兩個(gè)后綴,.d表示rd中結(jié)果為雙精度浮點(diǎn)數(shù),.wu表示rj和rk中數(shù)據(jù)為無(wú)符號(hào)32位整數(shù)。

3、基礎(chǔ)指令介紹

(1)整數(shù)運(yùn)算類(lèi)

loongarch中有32個(gè)通用寄存器,LA32和LA64中分別為32位和64位長(zhǎng)度。loongarch中可用這些寄存器執(zhí)行整數(shù)類(lèi)的指令。

loongarch支持基本的整數(shù)運(yùn)算,有:

  • 加減乘除的add、sub、mul、div等指令。如addi.w rd, rj, si12表示將寄存器rj和有符號(hào)立即數(shù)si12進(jìn)行32位加法運(yùn)算,結(jié)果寫(xiě)入rd。
  • 邏輯移位、算術(shù)移位的sll、srl、sra、rotr等指令。如srl.w rd, rj, rk表示將寄存器rj作邏輯右移rk位,移位結(jié)果符號(hào)擴(kuò)展寫(xiě)入寄存器rd。
  • 與或非等操作的and、or、nor、xor、andi、ori等指令。如and rd, rj, rk表示將寄存器rj和rk作位與運(yùn)算,結(jié)果寫(xiě)入rd。
  • slt、sltu、slti、sltui指令用于小于比較。
  • 如slt rd, rj, rk表示將寄存器rj和rk視為有符號(hào)整數(shù)作小于比較,將結(jié)果寫(xiě)入rd。
  • 如sltu rd, rj, rk表示將寄存器rj和rk視為無(wú)符號(hào)整數(shù)作小于比較,將結(jié)果寫(xiě)入rd
  • lu12i.w、lu32i.d等指令用于立即數(shù)連接。如lu12i.w rd, si20表示將20位立即數(shù)si20最低位連接上12位的0,然后符合擴(kuò)展后寫(xiě)入rd。
  • 一些位操作指令,有clo、clz、ctz等指令、用于符號(hào)擴(kuò)展的ext指令等。
  • 如ext.w.b rd, rj表示將rj中低8位數(shù)據(jù)進(jìn)行符號(hào)擴(kuò)展后寫(xiě)入rd。
  • 如clz.w rd, rj表示從第31位開(kāi)始計(jì)數(shù)寄存器rj中連續(xù)0的個(gè)數(shù),結(jié)果寫(xiě)入rd。

(2)浮點(diǎn)運(yùn)算類(lèi)

loongarch中有32個(gè)浮點(diǎn)寄存器,在LA32和LA64中均為64位。loongarch中可用這些寄存器進(jìn)行浮點(diǎn)類(lèi)指令。

loongarch中支持基本的浮點(diǎn)運(yùn)算,有:

  • 加減乘除相關(guān)的fadd、fsub、fmul、fdiv、fmadd、fnmsub等指令。
  • 如fadd.s fd, fj, fk表示將浮點(diǎn)寄存器fj和fk進(jìn)行單精度加法運(yùn)算,結(jié)果寫(xiě)入fd。
  • 如fmsub.d fd, fj, fk, fa表示將浮點(diǎn)寄存器fj和fk進(jìn)行雙精度乘法運(yùn)算,然后再與fa進(jìn)行雙精度減法運(yùn)算,結(jié)果寫(xiě)入fd。
  • 浮點(diǎn)比較運(yùn)算相關(guān)的fcmp.cond指令。其中.cond可以為多種比較含義的助記符。如fcmp.ceq.s cc, fj, fk 表示進(jìn)行相等比較。
  • 浮點(diǎn)轉(zhuǎn)換類(lèi)的fcvt、ffint、frint等指令。
  • 如fcvt.s.d fd, fj表示將浮點(diǎn)寄存器fj中的雙精度浮點(diǎn)數(shù)轉(zhuǎn)換為單精度,并寫(xiě)入fd。
  • 如ftintrne.w.s fd, fj表示將浮點(diǎn)寄存器fj中的單精度浮點(diǎn)數(shù)轉(zhuǎn)換為32位整數(shù)寫(xiě)入到fd,并采用“向最近的偶數(shù)舍入”。
  • 浮點(diǎn)搬運(yùn)類(lèi)型指令,包括fmov、fsel、movgr2fr等指令。
  • 如fsel fd, fj, fk, ca表示如果條件標(biāo)志寄存器ca的值為0,則將浮點(diǎn)寄存器fj寫(xiě)入fd,否則將fk寫(xiě)入fd。
  • 如movgr2fr.w fd, rj表示將rj的低32位寫(xiě)入浮點(diǎn)寄存器fj的低32位。
  • 一些特殊浮點(diǎn)運(yùn)算指令,有取最小/最大值運(yùn)算的fmax、fmin、fmaxa、fmina指令、取絕對(duì)值的fabs指令、取反的fneg指令、開(kāi)方和倒數(shù)運(yùn)算相關(guān)的fsqrt和frecip等指令,等等。如fmaxa.s fd, fj, fk表示fd中寫(xiě)入浮點(diǎn)寄存器fj、fk中絕對(duì)值的較大者。

(3)訪存指令

和一般RISC一樣,loongarch中通過(guò)load/store類(lèi)指令進(jìn)行訪存,有:

  • ld/st指令。
  • 如ld.b rd, rj, si12表示將rj+有符號(hào)立即數(shù)si12作為虛擬地址,從該地址取出一個(gè)字節(jié)數(shù)據(jù)寫(xiě)入rd。
  • 如st.w rd, rj, si12表示將rj+有符號(hào)立即數(shù)si12作為虛擬地址,將rd低32位數(shù)據(jù)寫(xiě)入該地址。
  • ldx/stx指令。相比ld/st指令,區(qū)別是虛擬地址表示不同:如ldx.b rd, rj, rk表示將rj+rk作為虛擬地址,從該地址取出一個(gè)字節(jié)數(shù)據(jù)寫(xiě)入rd。
  • ldptr/stptr指令。相比ld/st指令,區(qū)別是立即數(shù)表示不同,即立即數(shù)的最大位數(shù)不同以及其表示的偏移以4字節(jié)對(duì)齊。如stptr.w rd, rj, si14表示將rj+有符號(hào)立即數(shù)si14*4作為虛擬地址,從該地址取出32位數(shù)據(jù)寫(xiě)入rd。
  • ldgt/stgt、ldle/stle等邊界檢查訪存指令。如ldgt.b rd, rj, rk表示將rj作為虛擬地址,如果rj大于rk,則從該地址中取出一個(gè)字節(jié)數(shù)據(jù)到rd。否則觸發(fā)異常。
  • 浮點(diǎn)訪存指令,包括fld/fst、fldx/fstx、fldgt/fstgt指令等。與前面指令含義基本一致,只不過(guò)是用浮點(diǎn)寄存器作為目標(biāo)寄存器。如fld.s fd, rj, si12表示將rj+有符號(hào)立即數(shù)si12作為虛擬地址,從該地址取出一個(gè)單精度浮點(diǎn)數(shù)數(shù)據(jù)寫(xiě)入fd。

(4)轉(zhuǎn)移指令

下面對(duì)loongarch中的轉(zhuǎn)移指令進(jìn)行介紹:

  • 無(wú)條件跳轉(zhuǎn)指令b。如b offs26表示無(wú)條件跳轉(zhuǎn)到地址pc+offs26*4,其中offs26為26位的立即數(shù)偏移量,且4字節(jié)對(duì)齊。
  • 無(wú)條件跳轉(zhuǎn)指令jirl。和b的區(qū)別是,會(huì)將pc+4的值進(jìn)行保存。如jirl rd, rj, offs16表示無(wú)條件跳轉(zhuǎn)到地址pc+offs16*4,然后將pc+4寫(xiě)入rd。其中offs16為16位的立即數(shù)偏移量,且4字節(jié)對(duì)齊。
  • 無(wú)條件跳轉(zhuǎn)指令bl。和jirl的區(qū)別是,pc+4的值固定保存在r1中。r1別名ra,一般用作保存返回地址。如bl offs26表示無(wú)條件跳轉(zhuǎn)到地址pc+offs26*4,然后將pc+4寫(xiě)入r1。其中offs26為26位的立即數(shù)偏移量,且4字節(jié)對(duì)齊。
  • 條件轉(zhuǎn)移指令beq、bne、blt等。如beq rj, rd, offs16表示當(dāng)rj和rd相等時(shí)才跳轉(zhuǎn)到地址pc+offs16*4。

(5)一些補(bǔ)充的基礎(chǔ)指令

在閱讀linux上loongarch架構(gòu)相關(guān)代碼的時(shí)候,遇到了一些loongarch資料中沒(méi)有寫(xiě)出來(lái)的指令。本小節(jié)中將這些指令列出,其中指令的含義是根據(jù)上下文推測(cè)出來(lái)的。

  • move:如move rd, rj將rj中值復(fù)制到rd。
  • li:如li.w rd, 1將rd中值置為1。
  • la:如la.abs rd, label將label對(duì)應(yīng)地址賦值給rd。
  • jr:如jr ra跳轉(zhuǎn)到ra中地址,可能會(huì)有一些額外的操作。

4、匯編案例說(shuō)明

#loongarch架構(gòu)介紹#[一]基礎(chǔ)指令-開(kāi)源基礎(chǔ)軟件社區(qū)

上圖中描述了loongarch中寄存器的使用約定,與其他的架構(gòu)其實(shí)大同小異。有棧指針寄存器,有通用和浮點(diǎn)的傳參寄存器,有返回地址寄存器等。下面結(jié)合代碼進(jìn)行說(shuō)明。

以下為一段c語(yǔ)言代碼:

...
extern long
nested(long a, long b, long c, long d,
long e, long f, long g, long h, long i);

long normal(void) {
return nested(1, 2, 3, 4, 5, 6, 7, 8, 9);
}

對(duì)應(yīng)loongarch匯編如下:

normal:
// 分配棧幀
addi.d $sp, $sp, -32
// 傳參9,傳參寄存器不夠,儲(chǔ)存在棧上
addi.w $t0, $zero, 9
stptr.d $t0, $sp, 0
// 傳參8-1,使用傳出寄存器a7-a0
addi.w $a7, $zero, 8
addi.w $a6, $zero, 7
addi.w $a5, $zero, 6
addi.w $a4, $zero, 5
addi.w $a3, $zero, 4
addi.w $a2, $zero, 3
addi.w $a1, $zero, 2
addi.w $a0, $zero, 1

// 將返回地址保存到棧上
st.d $ra, $sp, 24

// 調(diào)用nested函數(shù)
bl %plt(nested)

// 恢復(fù)返回地址到ra
ld.d $ra, $sp, 24

// 恢復(fù)棧幀
addi.d $sp, $sp, 32

// 函數(shù)返回
jr $ra

loongarch的棧幀可用下圖表示:

#loongarch架構(gòu)介紹#[一]基礎(chǔ)指令-開(kāi)源基礎(chǔ)軟件社區(qū)

總結(jié)

本文介紹了loongarch架構(gòu)中的一些基礎(chǔ)指令,如整數(shù)和浮點(diǎn)運(yùn)算指令、轉(zhuǎn)移指令、訪存指令,并結(jié)合案例對(duì)loongarch匯編語(yǔ)言的寫(xiě)法進(jìn)行了說(shuō)明。下一篇文章將會(huì)介紹loongarch中的原子指令、柵障指令,及其用法。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來(lái)源: 51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-01-04 15:20:51

loongarch架構(gòu)

2023-03-01 14:59:08

TLB維護(hù)架構(gòu)

2023-02-03 14:41:03

地址翻譯模式loongarch

2023-02-21 16:46:04

loongarch架構(gòu)

2011-12-20 15:52:03

PhoneGap架構(gòu)基礎(chǔ)工作原理

2021-01-21 10:02:45

Consul架構(gòu)安裝

2019-11-06 10:55:32

虛擬化VMware vSph架構(gòu)

2013-07-19 12:52:50

iOS中BlockiOS開(kāi)發(fā)學(xué)習(xí)

2009-12-11 15:59:00

Linux grep指

2009-12-25 14:24:59

Linux指令od

2022-10-08 11:16:04

UbuntuLoongArch

2020-12-24 07:29:32

云計(jì)算云基礎(chǔ)云原生DevOps

2010-11-01 06:43:21

PowerShell

2012-07-23 16:18:52

Linux集群HPC架構(gòu)

2011-07-14 16:26:01

2010-03-05 10:24:33

2011-06-30 18:39:35

SEO

2023-07-10 16:00:56

AT指令建立網(wǎng)絡(luò)連接

2011-07-14 17:02:09

C++指針

2011-07-21 17:33:27

JAVA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)