RISC-V-Befehle (RV32)

Befehlsreferenz: i386 · x64 · ARM32 (Thumb-2) · ARM64 (AArch64) · RISC-V (RV32)

143 Befehle für .arch riscv32: Name, Operanden, die Bitkodierung (32 Bit, bei den komprimierten Befehlen 16 Bit) und eine kurze Beschreibung mit der Wirkung als Pseudocode. Enthalten ist alles, was die RISC-V-Kerne des Raspberry Pi Pico 2 (Hazard3) ausführen: der Grundbefehlssatz RV32I, Multiplikation und Division (M), die atomaren Befehle (A), die Steuerregister (Zicsr), fence.i (Zifencei), die Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb) und die komprimierten Befehle (C, Zcb). Die Pseudobefehle des Assemblers (li, mv, j, ret …) stehen beim Befehl, zu dem sie werden. Gleitkomma gibt es auf dem Hazard3 nicht.

So liest du die Tabelle

Ein RISC-V-Befehl ist ein Wort mit 32 Bit; die beiden untersten Bits sind dann 11. Ein komprimierter Befehl (Name mit c.) hat 16 Bit und endet auf 00, 01 oder 10. Die Kodierung zeigt die Bits von links (höchste Bit-Nummer) nach rechts: feste Bits als Ziffern (Opcode, funct3, funct7), die Namen sind Felder. Mit der Maus auf einem Feld steht der Bereich der Bits. rd, rs1, rs2 sind Register mit 5 Bit (x0 bis x31); rd', rs1', rs2' in den komprimierten Befehlen haben 3 Bit und meinen x8 bis x15. Darunter steht der Wert der festen Bits und die Maske in Hex: Ein Befehl gehört zu dieser Form, wenn (Wort & Maske) == Wert ist.

Konstanten sind in RISC-V auf mehrere Felder verteilt, damit das Vorzeichen immer in Bit 31 steht und die Register an festen Stellen bleiben. imm[12|10-5] ist ein Feld, das die Bits 12 und 10 bis 5 der Zahl enthält, in dieser Reihenfolge. Bei Sprüngen und Verzweigungen ist Bit 0 der Entfernung immer 0 und wird nicht gespeichert. Flags gibt es nicht: Verzweigungen vergleichen zwei Register selbst, slt schreibt das Ergebnis eines Vergleichs als 0 oder 1 in ein Register.

Die atomaren Befehle haben die Bits aq und rl für die Reihenfolge der Speicherzugriffe; der Disassembler schreibt sie als Anhang an den Namen (amoadd.w.aq, .rl, .aqrl). Jede Kodierung in dieser Tabelle ist gegen den Zerleger von Asmonite geprüft: Mit zufälligen Werten für die Felder ergibt sie wieder diesen Befehl (oder seinen Pseudonamen). Der Pseudocode ist wie Quelltext englisch geschrieben, auch auf der deutschen Seite; <s und <u vergleichen mit und ohne Vorzeichen, [x]32 ist das Wort im Speicher an der Adresse x.

BefehlOperandenKodierungBeschreibung
addrd, rs1, rs20000000 rs2 rs1 000 rd 01100110x00000033 / Maske 0xFE00707FAddition zweier Registerrd = rs1 + rs2Arithmetik
addird, rs1, imm12auch: li, mv, nopimm[11-0] rs1 000 rd 00100110x00000013 / Maske 0x0000707FAddition einer Konstanten (12 Bit mit Vorzeichen)rd = rs1 + sext(imm12)Arithmetik
amoadd.wrd, rs2, (rs1)00000 aq rl rs2 rs1 010 rd 01011110x0000202F / Maske 0xF800707FAtomare Addition (A)rd = [rs1]; [rs1] = rd + rs2Atomare Speicherbefehle (A)
amoand.wrd, rs2, (rs1)01100 aq rl rs2 rs1 010 rd 01011110x6000202F / Maske 0xF800707FAtomares UND (A)rd = [rs1]; [rs1] = rd & rs2Atomare Speicherbefehle (A)
amomax.wrd, rs2, (rs1)10100 aq rl rs2 rs1 010 rd 01011110xA000202F / Maske 0xF800707FAtomares Maximum mit Vorzeichen (A)rd = [rs1]; [rs1] = max_s(rd, rs2)Atomare Speicherbefehle (A)
amomaxu.wrd, rs2, (rs1)11100 aq rl rs2 rs1 010 rd 01011110xE000202F / Maske 0xF800707FAtomares Maximum ohne Vorzeichen (A)rd = [rs1]; [rs1] = max_u(rd, rs2)Atomare Speicherbefehle (A)
amomin.wrd, rs2, (rs1)10000 aq rl rs2 rs1 010 rd 01011110x8000202F / Maske 0xF800707FAtomares Minimum mit Vorzeichen (A)rd = [rs1]; [rs1] = min_s(rd, rs2)Atomare Speicherbefehle (A)
amominu.wrd, rs2, (rs1)11000 aq rl rs2 rs1 010 rd 01011110xC000202F / Maske 0xF800707FAtomares Minimum ohne Vorzeichen (A)rd = [rs1]; [rs1] = min_u(rd, rs2)Atomare Speicherbefehle (A)
amoor.wrd, rs2, (rs1)01000 aq rl rs2 rs1 010 rd 01011110x4000202F / Maske 0xF800707FAtomares ODER (A)rd = [rs1]; [rs1] = rd | rs2Atomare Speicherbefehle (A)
amoswap.wrd, rs2, (rs1)00001 aq rl rs2 rs1 010 rd 01011110x0800202F / Maske 0xF800707FAtomarer Austausch (A)rd = [rs1]; [rs1] = rs2Atomare Speicherbefehle (A)
amoxor.wrd, rs2, (rs1)00100 aq rl rs2 rs1 010 rd 01011110x2000202F / Maske 0xF800707FAtomares exklusives ODER (A)rd = [rs1]; [rs1] = rd ^ rs2Atomare Speicherbefehle (A)
andrd, rs1, rs20000000 rs2 rs1 111 rd 01100110x00007033 / Maske 0xFE00707FUNDrd = rs1 & rs2Logik und Bits
andird, rs1, imm12imm[11-0] rs1 111 rd 00100110x00007013 / Maske 0x0000707FUND mit einer Konstantenrd = rs1 & sext(imm12)Logik und Bits
andnrd, rs1, rs20100000 rs2 rs1 111 rd 01100110x40007033 / Maske 0xFE00707FUND mit invertiertem Operanden (Zbb, Zbkb)rd = rs1 & ~rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
auipcrd, imm20imm[31-12] rd 00101110x00000017 / Maske 0x0000007FAddition der oberen 20 Bit zum pc (Adresse relativ zum Befehl)rd = pc + (imm20 << 12)Konstanten und Adressen laden
bclrrd, rs1, rs20100100 rs2 rs1 001 rd 01100110x48001033 / Maske 0xFE00707FLöschen eines Bits (Zbs)rd = rs1 & ~(1 << rs2[4:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bclrird, rs1, shamt0100100 shamt rs1 001 rd 00100110x48001013 / Maske 0xFE00707FLöschen eines Bits, Nummer als Konstante (Zbs)rd = rs1 & ~(1 << shamt)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
beqrs1, rs2, labelauch: beqzimm[12|10-5] rs2 rs1 000 imm[4-1|11] 11000110x00000063 / Maske 0x0000707FVerzweigung, wenn gleichif rs1 == rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
bextrd, rs1, rs20100100 rs2 rs1 101 rd 01100110x48005033 / Maske 0xFE00707FAuslesen eines Bits (Zbs)rd = (rs1 >> rs2[4:0]) & 1Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bextird, rs1, shamt0100100 shamt rs1 101 rd 00100110x48005013 / Maske 0xFE00707FAuslesen eines Bits, Nummer als Konstante (Zbs)rd = (rs1 >> shamt) & 1Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bgers1, rs2, labelauch: bgez, blezimm[12|10-5] rs2 rs1 101 imm[4-1|11] 11000110x00005063 / Maske 0x0000707FVerzweigung, wenn größer oder gleich (mit Vorzeichen)if rs1 >=s rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
bgeurs1, rs2, labelimm[12|10-5] rs2 rs1 111 imm[4-1|11] 11000110x00007063 / Maske 0x0000707FVerzweigung, wenn größer oder gleich (ohne Vorzeichen)if rs1 >=u rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
binvrd, rs1, rs20110100 rs2 rs1 001 rd 01100110x68001033 / Maske 0xFE00707FUmkehren eines Bits (Zbs)rd = rs1 ^ (1 << rs2[4:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
binvird, rs1, shamt0110100 shamt rs1 001 rd 00100110x68001013 / Maske 0xFE00707FUmkehren eines Bits, Nummer als Konstante (Zbs)rd = rs1 ^ (1 << shamt)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bltrs1, rs2, labelauch: bltz, bgtzimm[12|10-5] rs2 rs1 100 imm[4-1|11] 11000110x00004063 / Maske 0x0000707FVerzweigung, wenn kleiner (mit Vorzeichen)if rs1 <s rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
blturs1, rs2, labelimm[12|10-5] rs2 rs1 110 imm[4-1|11] 11000110x00006063 / Maske 0x0000707FVerzweigung, wenn kleiner (ohne Vorzeichen)if rs1 <u rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
bners1, rs2, labelauch: bnezimm[12|10-5] rs2 rs1 001 imm[4-1|11] 11000110x00001063 / Maske 0x0000707FVerzweigung, wenn ungleichif rs1 != rs2 then pc = pc + sext(imm13)Sprünge und Aufrufe
brev8rd, rs1011010000111 rs1 101 rd 00100110x68705013 / Maske 0xFFF0707FUmkehrung der Bits in jedem Byte (Zbkb)for every byte: rd.byte = bit_reverse(rs1.byte)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bsetrd, rs1, rs20010100 rs2 rs1 001 rd 01100110x28001033 / Maske 0xFE00707FSetzen eines Bits (Zbs)rd = rs1 | (1 << rs2[4:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
bsetird, rs1, shamt0010100 shamt rs1 001 rd 00100110x28001013 / Maske 0xFE00707FSetzen eines Bits, Nummer als Konstante (Zbs)rd = rs1 | (1 << shamt)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
c.addrd, rs2100 1 rd rs2 100x9002 / Maske 0xF003Addition zweier Registerrd = rd + rs2 (rs2 != 0)Komprimierte Befehle (C, Zcb)
c.addird, imm6auch: c.nop000 imm[5] rd imm[4-0] 010x0001 / Maske 0xE003Addition einer Konstanten (6 Bit mit Vorzeichen)rd = rd + sext(imm6)Komprimierte Befehle (C, Zcb)
c.addi16spsp, imm011 imm[9] 00010 imm[4|6|8-7|5] 010x6101 / Maske 0xEF83Addition eines Vielfachen von 16 zum spsp = sp + sext(imm10) (imm != 0)Komprimierte Befehle (C, Zcb)
c.addi4spnrd', sp, uimm000 uimm[5-4|9-6|2|3] rd' 000x0000 / Maske 0xE003Addition einer Konstanten zum sp (Adresse auf dem Stack)rd' = sp + zext(uimm) (uimm != 0)Komprimierte Befehle (C, Zcb)
c.andrd', rs2'100 0 11 rd' 11 rs2' 010x8C61 / Maske 0xFC63UNDrd' = rd' & rs2'Komprimierte Befehle (C, Zcb)
c.andird', imm6100 imm[5] 10 rd' imm[4-0] 010x8801 / Maske 0xEC03UND mit einer Konstanten (6 Bit mit Vorzeichen)rd' = rd' & sext(imm6)Komprimierte Befehle (C, Zcb)
c.beqzrs1', label110 imm[8|4-3] rs1' imm[7-6|2-1|5] 010xC001 / Maske 0xE003Verzweigung, wenn 0if rs1' == 0 then pc = pc + sext(imm9)Komprimierte Befehle (C, Zcb)
c.bnezrs1', label111 imm[8|4-3] rs1' imm[7-6|2-1|5] 010xE001 / Maske 0xE003Verzweigung, wenn nicht 0if rs1' != 0 then pc = pc + sext(imm9)Komprimierte Befehle (C, Zcb)
c.ebreak100 1 00000 00000 100x9002 / Maske 0xFFFFHaltepunkt für den Debuggerraise breakpoint exception (or enter debug mode)Komprimierte Befehle (C, Zcb)
c.jlabel101 imm[11|4|9-8|10|6|7|3-1|5] 010xA001 / Maske 0xE003Sprung (±2 KB)pc = pc + sext(imm12)Komprimierte Befehle (C, Zcb)
c.jallabel001 imm[11|4|9-8|10|6|7|3-1|5] 010x2001 / Maske 0xE003Sprung mit Rücksprungadresse in ra (±2 KB)ra = pc + 2; pc = pc + sext(imm12)Komprimierte Befehle (C, Zcb)
c.jalrrs1100 1 rs1 00000 100x9002 / Maske 0xF07FSprung an die Adresse in einem Register, mit Rücksprungadresse in rat = rs1; ra = pc + 2; pc = tKomprimierte Befehle (C, Zcb)
c.jrrs1100 0 rs1 00000 100x8002 / Maske 0xF07FSprung an die Adresse in einem Registerpc = rs1 (rs1 != 0)Komprimierte Befehle (C, Zcb)
c.lburd', uimm(rs1')100 000 rs1' uimm[0|1] rd' 000x8000 / Maske 0xFC03Laden eines Bytes ohne Vorzeichen (Zcb)rd' = zext([rs1' + uimm]8)Komprimierte Befehle (C, Zcb)
c.lhrd', uimm(rs1')100 001 rs1' 1 uimm[1] rd' 000x8440 / Maske 0xFC43Laden eines Halbworts mit Vorzeichen (Zcb)rd' = sext([rs1' + uimm]16)Komprimierte Befehle (C, Zcb)
c.lhurd', uimm(rs1')100 001 rs1' 0 uimm[1] rd' 000x8400 / Maske 0xFC43Laden eines Halbworts ohne Vorzeichen (Zcb)rd' = zext([rs1' + uimm]16)Komprimierte Befehle (C, Zcb)
c.lird, imm6010 imm[5] rd imm[4-0] 010x4001 / Maske 0xE003Laden einer Konstanten (6 Bit mit Vorzeichen)rd = sext(imm6)Komprimierte Befehle (C, Zcb)
c.luird, imm6auch: c.addi16sp011 imm[17] rd imm[16-12] 010x6001 / Maske 0xE003Laden der Bits 17 bis 12 einer Konstantenrd = sext(imm6 << 12) (rd != 0, 2)Komprimierte Befehle (C, Zcb)
c.lwrd', uimm(rs1')010 uimm[5-3] rs1' uimm[2|6] rd' 000x4000 / Maske 0xE003Laden eines Wortsrd' = [rs1' + zext(uimm)]32Komprimierte Befehle (C, Zcb)
c.lwsprd, uimm(sp)010 uimm[5] rd uimm[4-2|7-6] 100x4002 / Maske 0xE003Laden eines Worts vom Stackrd = [sp + zext(uimm)]32 (rd != 0)Komprimierte Befehle (C, Zcb)
c.mulrd', rs2'100 1 11 rd' 10 rs2' 010x9C41 / Maske 0xFC63Multiplikation, untere 32 Bit (Zcb)rd' = (rd' * rs2')[31:0]Komprimierte Befehle (C, Zcb)
c.mvrd, rs2100 0 rd rs2 100x8002 / Maske 0xF003Kopieren eines Registersrd = rs2 (rs2 != 0)Komprimierte Befehle (C, Zcb)
c.notrd'100 1 11 rd' 11 101 010x9C75 / Maske 0xFC7FBitweise Umkehrung (Zcb)rd' = ~rd'Komprimierte Befehle (C, Zcb)
c.orrd', rs2'100 0 11 rd' 10 rs2' 010x8C41 / Maske 0xFC63ODERrd' = rd' | rs2'Komprimierte Befehle (C, Zcb)
c.sbrs2', uimm(rs1')100 010 rs1' uimm[0|1] rs2' 000x8800 / Maske 0xFC03Speichern eines Bytes (Zcb)[rs1' + uimm]8 = rs2'[7:0]Komprimierte Befehle (C, Zcb)
c.sext.brd'100 1 11 rd' 11 001 010x9C65 / Maske 0xFC7FErweiterung eines Bytes mit Vorzeichen (Zcb)rd' = sext(rd'[7:0])Komprimierte Befehle (C, Zcb)
c.sext.hrd'100 1 11 rd' 11 011 010x9C6D / Maske 0xFC7FErweiterung eines Halbworts mit Vorzeichen (Zcb)rd' = sext(rd'[15:0])Komprimierte Befehle (C, Zcb)
c.shrs2', uimm(rs1')100 011 rs1' 0 uimm[1] rs2' 000x8C00 / Maske 0xFC43Speichern eines Halbworts (Zcb)[rs1' + uimm]16 = rs2'[15:0]Komprimierte Befehle (C, Zcb)
c.sllird, shamt000 0 rd shamt 100x0002 / Maske 0xF003Schieben nach links um eine Konstanterd = rd << shamtKomprimierte Befehle (C, Zcb)
c.sraird', shamt100 0 01 rd' shamt 010x8401 / Maske 0xFC03Schieben nach rechts mit Vorzeichen um eine Konstanterd' = rd' >>s shamtKomprimierte Befehle (C, Zcb)
c.srlird', shamt100 0 00 rd' shamt 010x8001 / Maske 0xFC03Schieben nach rechts ohne Vorzeichen um eine Konstanterd' = rd' >>u shamtKomprimierte Befehle (C, Zcb)
c.subrd', rs2'100 0 11 rd' 00 rs2' 010x8C01 / Maske 0xFC63Subtraktionrd' = rd' - rs2'Komprimierte Befehle (C, Zcb)
c.swrs2', uimm(rs1')110 uimm[5-3] rs1' uimm[2|6] rs2' 000xC000 / Maske 0xE003Speichern eines Worts[rs1' + zext(uimm)]32 = rs2'Komprimierte Befehle (C, Zcb)
c.swsprs2, uimm(sp)110 uimm[5-2|7-6] rs2 100xC002 / Maske 0xE003Speichern eines Worts auf dem Stack[sp + zext(uimm)]32 = rs2Komprimierte Befehle (C, Zcb)
c.xorrd', rs2'100 0 11 rd' 01 rs2' 010x8C21 / Maske 0xFC63Exklusives ODERrd' = rd' ^ rs2'Komprimierte Befehle (C, Zcb)
c.zext.brd'100 1 11 rd' 11 000 010x9C61 / Maske 0xFC7FErweiterung eines Bytes mit Nullen (Zcb)rd' = zext(rd'[7:0])Komprimierte Befehle (C, Zcb)
c.zext.hrd'100 1 11 rd' 11 010 010x9C69 / Maske 0xFC7FErweiterung eines Halbworts mit Nullen (Zcb)rd' = zext(rd'[15:0])Komprimierte Befehle (C, Zcb)
clmulrd, rs1, rs20000101 rs2 rs1 001 rd 01100110x0A001033 / Maske 0xFE00707FMultiplikation ohne Übertrag, untere 32 Bit (Zbc)rd = clmul(rs1, rs2)[31:0]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
clmulhrd, rs1, rs20000101 rs2 rs1 011 rd 01100110x0A003033 / Maske 0xFE00707FMultiplikation ohne Übertrag, obere 32 Bit (Zbc)rd = clmul(rs1, rs2)[63:32]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
clmulrrd, rs1, rs20000101 rs2 rs1 010 rd 01100110x0A002033 / Maske 0xFE00707FMultiplikation ohne Übertrag, Bits 62 bis 31 (Zbc)rd = clmul(rs1, rs2)[62:31]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
clzrd, rs10110000 00000 rs1 001 rd 00100110x60001013 / Maske 0xFFF0707FZählen der führenden Nullbits (Zbb)rd = number of 0 bits above the highest 1 bit (32 for 0)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
cpoprd, rs10110000 00010 rs1 001 rd 00100110x60201013 / Maske 0xFFF0707FZählen der gesetzten Bits (Zbb)rd = number of 1 bits in rs1Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
csrrcrd, csr, rs1auch: csrccsr rs1 011 rd 11100110x00003073 / Maske 0x0000707FLesen eines Steuerregisters und Löschen von Bitst = csr; csr = t & ~rs1; rd = tSteuer- und Statusregister (Zicsr)
csrrcird, csr, uimm5auch: csrcicsr uimm 111 rd 11100110x00007073 / Maske 0x0000707FLesen eines Steuerregisters und Löschen von Bits einer Konstantent = csr; csr = t & ~uimm5; rd = tSteuer- und Statusregister (Zicsr)
csrrsrd, csr, rs1auch: csrr, csrscsr rs1 010 rd 11100110x00002073 / Maske 0x0000707FLesen eines Steuerregisters und Setzen von Bitst = csr; csr = t | rs1; rd = tSteuer- und Statusregister (Zicsr)
csrrsird, csr, uimm5auch: csrsicsr uimm 110 rd 11100110x00006073 / Maske 0x0000707FLesen eines Steuerregisters und Setzen von Bits einer Konstantent = csr; csr = t | uimm5; rd = tSteuer- und Statusregister (Zicsr)
csrrwrd, csr, rs1auch: csrwcsr rs1 001 rd 11100110x00001073 / Maske 0x0000707FAustausch eines Steuerregisters mit einem Registert = csr; csr = rs1; rd = tSteuer- und Statusregister (Zicsr)
csrrwird, csr, uimm5auch: csrwicsr uimm 101 rd 11100110x00005073 / Maske 0x0000707FAustausch eines Steuerregisters mit einer Konstanten (5 Bit)rd = csr; csr = uimm5Steuer- und Statusregister (Zicsr)
ctzrd, rs10110000 00001 rs1 001 rd 00100110x60101013 / Maske 0xFFF0707FZählen der Nullbits am Ende (Zbb)rd = number of 0 bits below the lowest 1 bit (32 for 0)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
divrd, rs1, rs20000001 rs2 rs1 100 rd 01100110x02004033 / Maske 0xFE00707FDivision mit Vorzeichen (M)rd = rs1 /s rs2 (by 0: -1)Arithmetik
divurd, rs1, rs20000001 rs2 rs1 101 rd 01100110x02005033 / Maske 0xFE00707FDivision ohne Vorzeichen (M)rd = rs1 /u rs2 (by 0: all ones)Arithmetik
ebreak000000000001 00000 000 00000 11100110x00100073 / Maske 0xFFFFFFFFHaltepunkt für den Debuggerraise breakpoint exception (or enter debug mode)System und Privilegien
ecall000000000000 00000 000 00000 11100110x00000073 / Maske 0xFFFFFFFFAufruf der Umgebung (Ausnahme)raise environment call exceptionSystem und Privilegien
fencepred, succ0000 pred succ 00000 000 00000 00011110x0000000F / Maske 0xF00FFFFFSpeicherbarriere: Zugriffe der Art pred vor denen der Art succorder memory accesses (i, o, r, w)Schranken und Sonstiges
fence.i000000000000 00000 001 00000 00011110x0000100F / Maske 0xFFFFFFFFSynchronisation des Befehlsstroms mit geschriebenem Code (Zifencei)later instruction fetches see earlier storesSchranken und Sonstiges
jalrd, labelauch: jimm[20|10-1|11|19-12] rd 11011110x0000006F / Maske 0x0000007FSprung mit Rücksprungadresse (±1 MB)rd = pc + 4; pc = pc + sext(imm21)Sprünge und Aufrufe
jalrrd, imm12(rs1)auch: jr, retimm[11-0] rs1 000 rd 11001110x00000067 / Maske 0x0000707FSprung an die Adresse in einem Register, mit Rücksprungadresset = rs1 + sext(imm12); rd = pc + 4; pc = t & ~1Sprünge und Aufrufe
lbrd, imm12(rs1)imm[11-0] rs1 000 rd 00000110x00000003 / Maske 0x0000707FLaden eines Bytes mit Vorzeichenrd = sext([rs1 + sext(imm12)]8)Laden und Speichern
lburd, imm12(rs1)imm[11-0] rs1 100 rd 00000110x00004003 / Maske 0x0000707FLaden eines Bytes ohne Vorzeichenrd = zext([rs1 + sext(imm12)]8)Laden und Speichern
lhrd, imm12(rs1)imm[11-0] rs1 001 rd 00000110x00001003 / Maske 0x0000707FLaden eines Halbworts mit Vorzeichenrd = sext([rs1 + sext(imm12)]16)Laden und Speichern
lhurd, imm12(rs1)imm[11-0] rs1 101 rd 00000110x00005003 / Maske 0x0000707FLaden eines Halbworts ohne Vorzeichenrd = zext([rs1 + sext(imm12)]16)Laden und Speichern
lr.wrd, (rs1)00010 aq rl 00000 rs1 010 rd 01011110x1000202F / Maske 0xF9F0707FLaden mit Reservierung (A)rd = [rs1]32; reserve the addressAtomare Speicherbefehle (A)
luird, imm20imm[31-12] rd 01101110x00000037 / Maske 0x0000007FLaden der oberen 20 Bit einer Konstantenrd = imm20 << 12Konstanten und Adressen laden
lwrd, imm12(rs1)imm[11-0] rs1 010 rd 00000110x00002003 / Maske 0x0000707FLaden eines Worts (32 Bit)rd = [rs1 + sext(imm12)]32Laden und Speichern
maxrd, rs1, rs20000101 rs2 rs1 110 rd 01100110x0A006033 / Maske 0xFE00707FMaximum mit Vorzeichen (Zbb)rd = (rs1 >s rs2) ? rs1 : rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
maxurd, rs1, rs20000101 rs2 rs1 111 rd 01100110x0A007033 / Maske 0xFE00707FMaximum ohne Vorzeichen (Zbb)rd = (rs1 >u rs2) ? rs1 : rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
minrd, rs1, rs20000101 rs2 rs1 100 rd 01100110x0A004033 / Maske 0xFE00707FMinimum mit Vorzeichen (Zbb)rd = (rs1 <s rs2) ? rs1 : rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
minurd, rs1, rs20000101 rs2 rs1 101 rd 01100110x0A005033 / Maske 0xFE00707FMinimum ohne Vorzeichen (Zbb)rd = (rs1 <u rs2) ? rs1 : rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
mret0011000 00010 00000 000 00000 11100110x30200073 / Maske 0xFFFFFFFFRückkehr aus einer Ausnahme im Machine Modepc = mepc; restore the mode from mstatusSystem und Privilegien
mulrd, rs1, rs20000001 rs2 rs1 000 rd 01100110x02000033 / Maske 0xFE00707FMultiplikation, untere 32 Bit (M)rd = (rs1 * rs2)[31:0]Arithmetik
mulhrd, rs1, rs20000001 rs2 rs1 001 rd 01100110x02001033 / Maske 0xFE00707FMultiplikation mit Vorzeichen, obere 32 Bit (M)rd = (sext(rs1) * sext(rs2))[63:32]Arithmetik
mulhsurd, rs1, rs20000001 rs2 rs1 010 rd 01100110x02002033 / Maske 0xFE00707FMultiplikation mit und ohne Vorzeichen, obere 32 Bit (M)rd = (sext(rs1) * zext(rs2))[63:32]Arithmetik
mulhurd, rs1, rs20000001 rs2 rs1 011 rd 01100110x02003033 / Maske 0xFE00707FMultiplikation ohne Vorzeichen, obere 32 Bit (M)rd = (zext(rs1) * zext(rs2))[63:32]Arithmetik
orrd, rs1, rs20000000 rs2 rs1 110 rd 01100110x00006033 / Maske 0xFE00707FODERrd = rs1 | rs2Logik und Bits
orc.brd, rs1001010000111 rs1 101 rd 00100110x28705013 / Maske 0xFFF0707FBytes auf 0x00 oder 0xFF setzen, je nachdem, ob ein Bit gesetzt ist (Zbb)for every byte: rd.byte = (rs1.byte != 0) ? 0xFF : 0Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
orird, rs1, imm12imm[11-0] rs1 110 rd 00100110x00006013 / Maske 0x0000707FODER mit einer Konstantenrd = rs1 | sext(imm12)Logik und Bits
ornrd, rs1, rs20100000 rs2 rs1 110 rd 01100110x40006033 / Maske 0xFE00707FODER mit invertiertem Operanden (Zbb, Zbkb)rd = rs1 | ~rs2Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
packrd, rs1, rs2auch: zext.h0000100 rs2 rs1 100 rd 01100110x08004033 / Maske 0xFE00707FZusammensetzen der unteren Halbwörter zweier Register (Zbkb)rd = (rs2[15:0] << 16) | rs1[15:0]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
packhrd, rs1, rs20000100 rs2 rs1 111 rd 01100110x08007033 / Maske 0xFE00707FZusammensetzen der unteren Bytes zweier Register (Zbkb)rd = (rs2[7:0] << 8) | rs1[7:0]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
remrd, rs1, rs20000001 rs2 rs1 110 rd 01100110x02006033 / Maske 0xFE00707FRest der Division mit Vorzeichen (M)rd = rs1 %s rs2 (by 0: rs1)Arithmetik
remurd, rs1, rs20000001 rs2 rs1 111 rd 01100110x02007033 / Maske 0xFE00707FRest der Division ohne Vorzeichen (M)rd = rs1 %u rs2 (by 0: rs1)Arithmetik
rev8rd, rs1011010011000 rs1 101 rd 00100110x69805013 / Maske 0xFFF0707FUmkehrung der Reihenfolge der Bytes (Zbb, Zbkb)rd = byte_reverse(rs1)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
rolrd, rs1, rs20110000 rs2 rs1 001 rd 01100110x60001033 / Maske 0xFE00707FRotation nach links um ein Register (Zbb, Zbkb)rd = rotate_left(rs1, rs2[4:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
rorrd, rs1, rs20110000 rs2 rs1 101 rd 01100110x60005033 / Maske 0xFE00707FRotation nach rechts um ein Register (Zbb, Zbkb)rd = rotate_right(rs1, rs2[4:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
rorird, rs1, shamt0110000 shamt rs1 101 rd 00100110x60005013 / Maske 0xFE00707FRotation nach rechts um eine Konstante (Zbb, Zbkb)rd = rotate_right(rs1, shamt)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
sbrs2, imm12(rs1)imm[11-5] rs2 rs1 000 imm[4-0] 01000110x00000023 / Maske 0x0000707FSpeichern eines Bytes[rs1 + sext(imm12)]8 = rs2[7:0]Laden und Speichern
sc.wrd, rs2, (rs1)00011 aq rl rs2 rs1 010 rd 01011110x1800202F / Maske 0xF800707FBedingtes Speichern nach lr.w (A)if reserved then [rs1]32 = rs2; rd = 0 else rd = 1Atomare Speicherbefehle (A)
sext.brd, rs10110000 00100 rs1 001 rd 00100110x60401013 / Maske 0xFFF0707FErweiterung eines Bytes mit Vorzeichen (Zbb)rd = sext(rs1[7:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
sext.hrd, rs10110000 00101 rs1 001 rd 00100110x60501013 / Maske 0xFFF0707FErweiterung eines Halbworts mit Vorzeichen (Zbb)rd = sext(rs1[15:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
shrs2, imm12(rs1)imm[11-5] rs2 rs1 001 imm[4-0] 01000110x00001023 / Maske 0x0000707FSpeichern eines Halbworts[rs1 + sext(imm12)]16 = rs2[15:0]Laden und Speichern
sh1addrd, rs1, rs20010000 rs2 rs1 010 rd 01100110x20002033 / Maske 0xFE00707FAddition mit um 1 verschobenem Register (Zba)rd = rs2 + (rs1 << 1)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
sh2addrd, rs1, rs20010000 rs2 rs1 100 rd 01100110x20004033 / Maske 0xFE00707FAddition mit um 2 verschobenem Register (Zba)rd = rs2 + (rs1 << 2)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
sh3addrd, rs1, rs20010000 rs2 rs1 110 rd 01100110x20006033 / Maske 0xFE00707FAddition mit um 3 verschobenem Register (Zba)rd = rs2 + (rs1 << 3)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
sllrd, rs1, rs20000000 rs2 rs1 001 rd 01100110x00001033 / Maske 0xFE00707FSchieben nach links um ein Registerrd = rs1 << rs2[4:0]Schieben und Rotieren
sllird, rs1, shamt0000000 shamt rs1 001 rd 00100110x00001013 / Maske 0xFE00707FSchieben nach links um eine Konstanterd = rs1 << shamtSchieben und Rotieren
sltrd, rs1, rs2auch: sltz, sgtz0000000 rs2 rs1 010 rd 01100110x00002033 / Maske 0xFE00707FVergleich mit Vorzeichen: 1, wenn kleinerrd = (rs1 <s rs2) ? 1 : 0Vergleichen und Tauschen
sltird, rs1, imm12imm[11-0] rs1 010 rd 00100110x00002013 / Maske 0x0000707FVergleich mit einer Konstanten mit Vorzeichen: 1, wenn kleinerrd = (rs1 <s sext(imm12)) ? 1 : 0Vergleichen und Tauschen
sltiurd, rs1, imm12auch: seqzimm[11-0] rs1 011 rd 00100110x00003013 / Maske 0x0000707FVergleich mit einer Konstanten ohne Vorzeichen: 1, wenn kleinerrd = (rs1 <u sext(imm12)) ? 1 : 0Vergleichen und Tauschen
slturd, rs1, rs2auch: snez0000000 rs2 rs1 011 rd 01100110x00003033 / Maske 0xFE00707FVergleich ohne Vorzeichen: 1, wenn kleinerrd = (rs1 <u rs2) ? 1 : 0Vergleichen und Tauschen
srard, rs1, rs20100000 rs2 rs1 101 rd 01100110x40005033 / Maske 0xFE00707FSchieben nach rechts mit Vorzeichen um ein Registerrd = rs1 >>s rs2[4:0]Schieben und Rotieren
sraird, rs1, shamt0100000 shamt rs1 101 rd 00100110x40005013 / Maske 0xFE00707FSchieben nach rechts mit Vorzeichen um eine Konstanterd = rs1 >>s shamtSchieben und Rotieren
sret0001000 00010 00000 000 00000 11100110x10200073 / Maske 0xFFFFFFFFRückkehr aus einer Ausnahme im Supervisor Modepc = sepc; restore the mode from sstatusSystem und Privilegien
srlrd, rs1, rs20000000 rs2 rs1 101 rd 01100110x00005033 / Maske 0xFE00707FSchieben nach rechts ohne Vorzeichen um ein Registerrd = rs1 >>u rs2[4:0]Schieben und Rotieren
srlird, rs1, shamt0000000 shamt rs1 101 rd 00100110x00005013 / Maske 0xFE00707FSchieben nach rechts ohne Vorzeichen um eine Konstanterd = rs1 >>u shamtSchieben und Rotieren
subrd, rs1, rs2auch: neg0100000 rs2 rs1 000 rd 01100110x40000033 / Maske 0xFE00707FSubtraktion zweier Registerrd = rs1 - rs2Arithmetik
swrs2, imm12(rs1)imm[11-5] rs2 rs1 010 imm[4-0] 01000110x00002023 / Maske 0x0000707FSpeichern eines Worts[rs1 + sext(imm12)]32 = rs2Laden und Speichern
unziprd, rs1000010001111 rs1 101 rd 00100110x08F05013 / Maske 0xFFF0707FEntflechten in gerade und ungerade Bits (Zbkb)rd[i] = rs1[2i]; rd[i+16] = rs1[2i+1]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
wfi0001000 00101 00000 000 00000 11100110x10500073 / Maske 0xFFFFFFFFWarten auf einen Interruptpause until an interrupt is pendingSystem und Privilegien
xnorrd, rs1, rs20100000 rs2 rs1 100 rd 01100110x40004033 / Maske 0xFE00707FInvertiertes exklusives ODER (Zbb, Zbkb)rd = ~(rs1 ^ rs2)Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
xorrd, rs1, rs20000000 rs2 rs1 100 rd 01100110x00004033 / Maske 0xFE00707FExklusives ODERrd = rs1 ^ rs2Logik und Bits
xorird, rs1, imm12auch: notimm[11-0] rs1 100 rd 00100110x00004013 / Maske 0x0000707FExklusives ODER mit einer Konstantenrd = rs1 ^ sext(imm12)Logik und Bits
zext.hrd, rs10000100 00000 rs1 100 rd 01100110x08004033 / Maske 0xFFF0707FErweiterung eines Halbworts mit Nullen (Zbb)rd = zext(rs1[15:0])Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)
ziprd, rs1000010001111 rs1 001 rd 00100110x08F01013 / Maske 0xFFF0707FVerschränken der Bits der beiden Halbwörter (Zbkb)rd[2i] = rs1[i]; rd[2i+1] = rs1[i+16]Bit-Manipulation (Zba, Zbb, Zbs, Zbc, Zbkb)