Befehlssatz MIPS-R2000
Transcription
Befehlssatz MIPS-R2000
Befehlssatz MIPS-R2000 1 Befehlssatz MIPS-R2000 0 Notation RI imm dist addr C(x)n X[b1 ...bn ] label ? ∗ † ‡ 1 wahlweise Register Rt oder Direktoperand imm 16-Bit Direktoperand, Wert: [symbol] [±dist] symbol + dist (dist) >> int dist/2int int1 [±int2 ] Distanzangabe int1 + int2 [symbol] [±dist] [(Rs )] Adressangabe für Speicherstelle symbol + dist + Rs n Bytes großer Wert an der Speicherstelle x Bits b1 bis bn des Wertes X symbol Symbolischer Name des Sprungziels: bei absoluten Sprüngen (j∗) 26-Bit Instruktionsadresse, bei relativen Sprüngen (b∗) eine 16-Bit Distanzangabe Hardware-Instruktion des Prozessors delayed -Instruktion; Ausführung endet nach dem nächsten Befehl Vorzeichen wird ignoriert Instruktion kann Exception auslösen Pseudo-Instruktion löst beim Fehlerfall Exceptions durch break aus Registerbelegung $0 $1 $2–$3 $4–$7 $8–$15 $16–$23 $24–$25 $26–$27 $28 $29 $30 $31 2 Rt | imm $zero $at $v0–$v1 $a0–$a3 $t0–$t7 $s0–$s7 $t8–$t9 $k0–$k1 $gp $sp $fp $ra constant 0 assembler value argument temporary saved temporary temporary kernel global pointer stack pointer frame pointer return address Konstante 0 reserviert für den Assembler Ausdruck- bzw. Funktionsergebnis Funktionsargument frei, wird bei Funktionsaufrufen überschrieben frei, wird bei Funktionsaufrufen gerettet frei, wird bei Funktionsaufrufen überschrieben reserviert für Betriebssystem Zeiger auf globalen Datenbereich Stack-Pointer Zeiger auf lokalen Datenbereich einer Funktion Rücksprungadresse Ganzzahlarithmetik abs neg ?† add ?† addi ?† sub ? mult mul ‡ mulo ? div ‡ div ‡ rem R d , Rs R d , Rs Rd , Rs , RI Rd , Rs , imm Rd , Rs , RI R s , Rt Rd , Rs , RI ‡ mulou Rd , Rs , RI ? divu R s , Rt ‡ divu Rd , Rs , RI ‡ remu Rd , Rs , RI negu ? addu ? addiu ? subu ? multu absolute value negate value addition addition immediate subtract multiply multiply multiply with overflow divide divide remainder Rd ← |Rs | Rd ← −Rs Rd ← Rs + RI Rd ← Rs + imm Rd ← Rs − RI (hi, lo) ← Rs × Rt Rd ← Rs × RI Rd ← Rs × RI lo ← Rs /Rt , hi ← Rs mod Rt Rd ← Rs /RI Rd ← Rs mod RI c Copyright 1996, 1998, 1999 FG Systemprogrammierung, FB20, TU Darmstadt e-mail: inf2@iti.informatik.tu-darmstadt.de Befehlssatz MIPS-R2000 3 2 Ganzzahlvergleiche seq Rd , Rs , RI sne Rd , Rs , RI sgt sgtu Rd , Rs , RI sgeu Rd , Rs , RI sge ? slt ? sltu Rd , Rs , RI ? slti ? sltiu Rd , Rs , imm sleu Rd , Rs , RI sle 4 Rd Rd Rd Rd Rd Rd Rd equal not equal greater than greater than equal less than less than immediate less than equal ← Rs ← Rs ← Rs ← Rs ← Rs ← Rs ← Rs = RI ? 1 : 0 6= RI ? 1 : 0 > RI ? 1 : 0 ≥ RI ? 1 : 0 < RI ? 1 : 0 < imm ? 1 : 0 ≤ RI ? 1 : 0 Logische Operationen not ? and ? andi ? or ? ori ? xor ? xori ? nor 5 R d , Rs Rd , Rs , RI Rd , Rs , imm Rd , Rs , RI Rd , Rs , imm Rd , Rs , RI Rd , Rs , imm Rd , Rs , RI bitwise bitwise bitwise bitwise bitwise bitwise bitwise bitwise Rd Rd Rd Rd Rd Rd Rd Rd logical negation AND AND immediate OR OR immediate XOR XOR immediate NOR ← ¬Rs ← Rs ∧ RI ← Rs ∧ imm ← Rs ∨ RI ← Rs ∨ imm ← Rs ⊕ RI ← Rs ⊕ imm ← ¬(Rs ∨ RI) Shift-Operationen ? sll ? sllv ? srl ? srlv ? sra ? srav rol ror 6 Rd , Rt , imm R d , Rt , Rv Rd , Rt , imm R d , Rt , Rv Rd , Rt , imm R d , Rt , Rv Rd , Rt , RI Rd , Rt , RI shift left logical shift left logical variable shift right logical shift right logical variable shift right arithmetic shift right arithmetic variable rotate left rotate right Rd Rd Rd Rd Rd Rd Rd Rd ← Rt ∗ 2imm mod 32 ← Rt ∗ 2Rv mod 32 ← Rt /2imm mod 32 ← Rt /2Rv mod 32 ← Rt /2imm mod 32 ← Rt /2Rv mod 32 ← Rt[((31−RI) mod 32)...0,31...((31−RI−1) mod 32)] ← Rt[((RI−1) mod 32)...0,31...(RI mod 32)] Unbedingte Sprünge b label label Rs label bal label ? jalr Rd , Rs ?j ? jr ? jal 7 set set set set set set set branch instruction jump jump register jump and link branch and link jump and link register Sprung nach label Sprung nach label Sprung nach Rs $31 ← IP + 4, Sprung nach label $31 ← IP + 4, Sprung nach label Rd ← IP + 4, Sprung nach Rs Bedingte Sprünge nach Vergleich ?∗ bc1f ?∗ bc1t ?∗ beq ?∗ bne bgt bge blt ble bgtu bgeu bltu bleu label label Rs , RI, label Rs , RI, label Rs , RI, label Rs , RI, label Rs , RI, label Rs , RI, label branch branch branch branch branch branch branch branch coprocessor 1 false coprocessor 1 true on equal on not equal on greater than on greater than equal on less than on less than equal Sprung Sprung Sprung Sprung Sprung Sprung Sprung Sprung nach nach nach nach nach nach nach nach label , label , label , label , label , label , label , label , wenn wenn wenn wenn wenn wenn wenn wenn CF 1 = 0 CF 1 = 1 Rs = RI Rs 6= RI Rs > RI R s ≥ RI Rs < RI Rs ≤ RI Befehlssatz MIPS-R2000 3 Bedingte Sprünge nach Vergleich mit 0 8 beqz bnez ?∗ bgtz ?∗ bgez Rs , label Rs , label Rs , label Rs , label ?∗ bgezal Rs , label ?∗ bltz ?∗ bltzal Rs , label Rs , label ?∗ blez 9 branch on equal zero branch on not equal zero branch on greater than zero branch on greater than equal zero branch on greater than equal zero and link branch on less than zero branch on less than and link Rs , label branch on less than equal zero Sprung Sprung Sprung Sprung 11 nach nach nach nach label, label, label, label, $31 ← IP + 4, Sprung nach label, Sprung nach label, $31 ← IP + 4, Sprung nach label, Sprung nach label, wenn wenn wenn wenn Rs Rs Rs Rs =0 6= 0 >0 ≥0 wenn Rs ≥ 0 wenn Rs < 0 wenn Rs < 0 wenn Rs ≤ 0 R d , Rs Rd Rd Rd Rd R d , Fs R d , Fs mfc1.d Rd , Fs move mov.s mov.d 10 F d , Fs F d , Fs move register move from hi move from lo move to hi move to lo move from coprocessor 1 move to coprocessor 1 move double from coprocessor 1 move floating-point single move floating-point double R d ← Rs Rd ← hi Rd ← lo hi ← Rd lo ← Rd R d ← Fs F s ← Rd (Rd , Rd+1 ) ← (Fs , Fs+1 ) F d ← Fs (Fd , Fd+1 ) ← (Fs , Fs+1 ) Ladebefehle la ?∗ lb ?∗ lbu ?∗ lh ?∗ lhu ?∗ lw ?∗ lwl ?∗ lwr ld ?∗ lwc1 l.s l.d li ? lui li.s Rd , addr Rd , addr Rd , addr Rd , addr Rd , addr Rd , addr Rd , addr Rd , addr Rd , addr Fd , addr Fd , addr Fd , addr Rd , imm Rd , imm Fd , imm li.d Fd , imm ulh Rd , addr ulhu Rd , addr load address load byte load byte unsigned load halfword load halfword unsigned load word load word left load word right load double-word load word coprocessor 1 load floating-point single load floating-point double load immediate load upper immediate load immediate floating-point single load immediate floating-point double unaligned load halfword unaligned load halfword unsigned Rd ← addr Rd ← C(addr )1 Rd ← C(addr )1 Rd ← C(addr )2 Rd ← C(addr )2 Rd ← C(addr )4 Rd[31...(addr mod 4)∗8] ← C(addr )addr mod 4 Rd[(addr mod 4)∗8+7...0] ← C(addr )addr mod 4 (Rd , Rd+1 ) ← C(addr )8 Fd ← C(addr )4 Fd ← C(addr )4 (Fd+1 , Fd ) ← C(addr )8 Rd ← imm Rd ← imm ∗ 216 Fd ← imm (Fd+1 , Fd ) ← imm Rd ← C(addr )2 Rd ← C(addr )2 4 Speicherbefehle ? sb ? sh ? sw ? swl ? swr Rt , addr Rt , addr Rt , addr Rt , addr Rt , addr store store store store store sd Rt , addr Fd , addr Fd , addr Fd , addr Rt , addr Rt , addr store double-word store word coprocessor 1 store floating-point single store floating-point double unaligned store halfword unaligned store word ? swc1 s.s s.d ush usw 12 Registertransfer ? mfhi ? mflo ? mthi ? mtlo ? mfc1 ? mtc1 Befehlssatz MIPS-R2000 C(addr )1 ← Rt[7...0] C(addr )2 ← Rt[15...0] C(addr )4 ← Rt C(addr )4−addr mod 4 ← Rt[31...(addr mod 4)∗8] C(addr + 4 − addr mod 4)addr mod 4 ← Rt[(addr mod 4)∗8−1...0] C(addr )8 ← (Rt , Rt+1 ) C(addr )4 ← Fd C(addr )4 ← Fd C(addr )8 ← (Fd+1 , Fd ) C(addr )2 ← Rt[15...0] C(addr )4 ← Rt Gleitkomma-Arithmetik ? abs.s ? add.s ? sub.s ? mul.s ? div.s 13 byte halfword word word left word right ? abs.d ? add.d ? sub.d ? mul.d ? div.d F d , Fs F d , Fs , Ft F d , Fs , Ft F d , Fs , Ft F d , Fs , Ft Fd Fd Fd Fd Fd absolute value addition subtract multiply divide Gleitkomma-Vergleiche ? c.un.s ? c.eq.s ?† c.seq.s ? c.ueq.s ? c.un.d ? c.eq.d ?† c.seq.d ? c.ueq.d F s , Ft F s , Ft F s , Ft F s , Ft compare compare compare compare ?† c.lt.s ? c.olt.s ? c.ult.s ?† c.lt.d ? c.olt.d ? c.ult.d F s , Ft F s , Ft F s , Ft compare less than compare ordered less than compare unordered less than ?† c.le.s ? c.ole.s ?† c.le.d ? c.ole.d F s , Ft F s , Ft ? c.ule.s ? c.ule.d F s , Ft compare less than equal compare ordered less than equal compare unordered less than equal 14 CF1 ← (Fs = NaN) ∨ (Fs = NaN) CF1 ← Fs = Ft CF1 ← Fs = Ft CF1 ← (Fs = Ft ) ∨ (Fs = NaN) ∨ (Fs = NaN) CF1 ← Fs < Ft CF1 ← Fs < Ft CF1 ← (Fs < Ft ) ∨ (Fs = NaN) ∨ (Fs = NaN) CF1 ← Fs ≤ Ft CF1 ← Fs ≤ Ft CF1 ← (Fs ≤ Ft ) ∨ (Fs = NaN) ∨ (Fs = NaN) F d , Fs F d , Fs F d , Fs F d , Fs F d , Fs F d , Fs convert convert convert convert convert convert single to double integer to double double to integer single to integer double to single integer to single Fd Fd Fd Fd Fd Fd ← [D]Fs ← [D]Fs ← [I]Fs ← [I]Fs ← [S]Fs ← [S]Fs Verschiedenes ? break ? syscall ? rfe nop unordered equal equal unordered equal Gleitkomma-Konversion ? cvt.d.s ? cvt.d.w ? cvt.w.d ? cvt.w.s ? cvt.s.d ? cvt.s.w 15 ← |Fs | ← Fs + Ft ← Fs − Ft ← Fs × Ft ← Fs /Ft n break system call return from exception no operation Exception n auslösen Betriebssystemaufruf Statusregister restaurieren leere Anweisung