Blob


1 # Registers
3 16 bit
4 8 GPRs (zero=0, sp=6, lr=7)
5 1 PC
7 # Instructions
9 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
10 | rep | instr | func | F | descr |
11 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
12 | 0000 0RRR 0RRR 0RRR | add rd, rs, rt | rd = rs + rt | R | Addition |
13 | 0000 0RRR 0RRR 1RRR | sub rd, rs, rt | rd = rs - rt | R | Subtraction |
14 | 0000 0RRR 1RRR 0RRR | and rd, rs, rt | rd = rs & rt | R | Logical AND |
15 | 0000 0RRR 1RRR 1RRR | or rd, rs, rt | rd = rs or rt | R | Logical OR |
16 | 0000 1RRR 0RRR 0RRR | lsh rd, rs, rt | rd = lshift(rs, rt) | R | Logical bi-directional shift |
17 | 0000 1RRR 0RRR 1RRR | xor rd, rs, rt | rd = rs ^ rt | R | Logical XOR |
18 | 0000 1RRR 1RRR 0RRR | slt rd, rs, rt | rd = rs < rt (signed) | R | Set if less than (signed) |
19 | 0000 1RRR 1RRR 1RRR | sltu rd, rs, rt | rd = rs < rt (unsigned) | R | Set if less than (unsigned) |
20 | 0001 0RRR 0RRR 0RRR | jalr rd, rt | rd = pc; pc = rt | R | Jump to Register and Link |
21 | 0001 0RRR 1RRR 0RRR | ud | | R | (undefined) |
22 | 0001 1RRR 0RRR 0RRR | ud | | R | |
23 | 0001 1RRR 1RRR 0RRR | ud | | R | |
24 | 0001 xRRR xRRR 1RRR | ud | | R | |
25 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
26 | 0010 0RRR IIII IIII | addi reg, simm8 | rd = rd + simm8 | I | Add w/ immediate |
27 | 0010 1RRR IIII IIII | lshi reg, simm8 | rd = lshift(rd, simm8) | I | Logical bi-directional shift w/ immediate |
28 | 0011 0RRR IIII IIII | lui rd, imm8 | rd = (imm8 << 8) | I | Load upper-immediate |
29 | 0011 1RRR IIII IIII | li rd, imm8 | rd = imm8 | I | Load lower-immediate |
30 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
31 | 0100 IRRR IIII IRRR | lw rd, [rt, simm6] | rd = *(rt + simm6) | L | Load word from memory |
32 | 0101 IRRR IIII IRRR | lbu rd, [rt, simm6] | rd = *(rt + simm6) | L | Load unsigned byte from memory (TODO) |
33 | 0110 IRRR IIII IRRR | lb rd, [rt, simm6] | rd = *(rt + simm6) | L | Load sign-extended byte from memory (TODO) |
34 | 0111 IRRR IIII IRRR | ud | | L | |
35 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
36 | 1000 IIII IRRR IRRR | sw rs, [rt, simm6] | *(rt + simm6 * 2) = rs | S | Store word to memory |
37 | 1001 IIII IRRR IRRR | sb rs, [rt, simm6] | *(rt + simm6) = rs | S | Store byte to memory (TODO) |
38 | 1010 IIII IRRR IRRR | beq rs, rt, simm6 | if (rs == rt) pc += simm6 * 2 | S | PC-relative branch if equal |
39 | 1011 IIII IRRR IRRR | bne rs, rt, simm6 | if (rs != rt) pc += simm6 * 2 | S | PC-relative branch if not equal |
40 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
41 | 110x xxxx xxxx xxxx | ud | | ? | |
42 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
43 | 1110 IIII IIII IIII | jal simm12 | lr = pc; pc += simm12 * 2 | J | PC-relative Jump and Link |
44 | 1111 IIII IIII IIII | j simm12 | pc += simm12 * 2 | J | PC-relative Jump |
45 |---------------------|---------------------|-------------------------------|---|--------------------------------------------|
47 ```c
48 uint16_t lshift(uint16_t a, int16_t b) {
49 if (b < 0) {
50 return a >> -b;
51 } else {
52 return a << b;
53 }
54 }
55 ```