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: [email protected]
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