Files
DSA/doc/ISA.md
T

147 lines
3.8 KiB
Markdown

## Architecture
32 bit instruction width/word size
## Instruction Types:
Type Sizes:
- u16: [16 bits]
- u6: [6 bits]
- Reg: [5 bits]
- Opcode: [6 bits]
Instruction Types:
- R: [Opcode] [Reg] [Reg] [Reg] [Reg] [u6]
- I: [Opcode] [Reg] [Reg] [u16 ]
## Instruction Set
// move
mov <src: Reg> <dst: Reg> [ unused ]
cmov <src: Reg> <dst: Reg> <cmp: Reg>
// load
ldb <src: Reg> <dst: Reg> <offset: u16>
ldbs <src: Reg> <dst: Reg> <offset: u16>
ldh <src: Reg> <dst: Reg> <offset: u16>
ldhs <src: Reg> <dst: Reg> <offset: u16>
ldw <src: Reg> <dst: Reg> <offset: u16>
// store
stb <src: Reg> <dst: Reg> <offset: u16>
sth <src: Reg> <dst: Reg> <offset: u16>
stw <src: Reg> <dst: Reg> <offset: u16>
// immediate
lli <dst: Reg> [unused] <imm: u16>
lui <dst: Reg> [unused] <imm: u16>
// comparison
ieq <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
ine <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
igt <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
ige <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
ilt <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
ile <sr1: Reg> <sr2: Reg> <dst: Reg> [unused]
// Jump
jmp [ unused ] <addr: Reg> <offset: u16> // unconditional
jez <cmp: Reg> <addr: Reg> <offset: u16> // conditional on cmp == 0
jnz <cmp: Reg> <addr: Reg> <offset: u16>
jic [ unused ] <addr: Reg> <offset: u16> // conditional on carry
jnc [ unused ] <addr: Reg> <offset: u16>
// Bitwise
and <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // and
nnd <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // nand
or <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // or
nor <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // nor
xor <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // xor
xnr <sr1: Reg> <sr2: Reg> <dst: Reg> [unused] // xnor
not <src: Reg> [ unused ] <dst: Reg> [unused] // not
// Arithmetic
add <sr1: Reg> <sr2: Reg> <dst: Reg>
sub <sr1: Reg> <sr2: Reg> <dst: Reg>
shl <src: Reg> <rshamt: Reg> <dst: Reg> <ishamt: u6> // left shift of rshamt+ishamt
shr <src: Reg> <rshamt: Reg> <dst: Reg> <ishamt: u6> // right shift
// Immediate Arithmetic
addi <sr1: Reg> <dst: Reg> <imm: u16>
subi <sr1: Reg> <dst: Reg> <imm: u16>
// Misc
nop (zero/do nothing)
int <imm: u6>
hlt
// Atomic
// Atomic Compare and Swap - compares src and dst, if src
acs <src: Reg> <cmp: Reg> <dst: Reg> <res: Reg>
## Assembler Pseudoinstructions
Definitions:
Label - named address, a function or global
```
lwi <src: Label|Imm> <dest: Reg> // loads the literal value of Label|Imm into dest
// if src is a Label, take literal value of Label
=> lli $src, $dest
=> lui $src, $dest
lli <src: Label> <dest: Reg> // loads the lower 16 bits of the literal value of Label into dest
... -> similarly defined for lui
ldw <src: Label> <dest: Reg> // loads the word at the address of Label into dest
... => similarly defined for ldb, ldbs, ldh, ldhs
// load the label value of src into dest with lui/lli
=> lli $src, $dest
=> lui $src, $dest
=> ldw $dest, $dest
stw <src: Reg> <dest: Label> // stores the word in src using the address/label that is dest.
// load the literal value of dest into the accumulator with lui/lli
=> lli $dest, acc
=> lui $dest, acc
=> stw $src, acc
jmp <dest: Label>
CASE dest > u16::MAX:
=> lli $dest, acc
=> lui $dest, acc
=> jmp $dest, 0
CASE dest < u16::MAX:
// assembler inserts the literal value of dest
=> jmp $dest, 0
jmp <lbl: Label> <dest: Reg>
CASE lbl > u16::MAX:
AssemblerError!
CASE lbl < u16::MAX:
=> jmp $dest, lbl
call <addr: Label>
=> subi spr, 4, spr
=> stw pcx, spr, 0
=> jmp $addr
func
// push bpr
=> subi spr, 4, spr
=> stw bpr, spr, 0
// replace bpr with spr
=> mov spr, bpr
return
=> mov bpr, spr
// pop bpr
=> addi spr, 4, spr
=> ldw spr, bpr, 0
// load return addr
=> ldw spr, ret, 0
=> addi, spr, 4, spr
=> jmp ret, 4
```