Instructions
Instructions for each machine:
- lm32 - Lattice Mico32 MACH
lm32 MEM - Memory
lm32 ALU - ALU
lm32 BR - Branch
lm32 lm32 - Lattice Mico32 MACH
Individual instructions descriptions
add - add
-
machines: base
-
syntax: add $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x2d
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (add r0 r1))
addgotoff - add got offset
-
machines: base
-
syntax: addi $r1,$r0,$gotofflo16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xd
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1 (add r0 (ext SI (trunc HI gotofflo16))))
addi - add immediate
-
machines: base
-
syntax: addi $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xd
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (add r0 (ext SI (trunc HI imm))))
and - and
-
machines: base
-
syntax: and $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x28
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (and r0 r1))
andhii - and high immediate
-
machines: base
-
syntax: andhi $r1,$r0,$hi16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x18
|
r0
|
r1
|
hi16
|
-
semantics:
(set r1 (and r0 (sll SI hi16 16)))
andi - and immediate
-
machines: base
-
syntax: andi $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x8
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (and r0 (zext SI uimm)))
b - branch
-
machines: base
-
syntax: b $r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x30
|
r0
|
0x0
|
0x0
|
0x0
|
-
semantics:
(set pc (c-call USI "@cpu@_b_insn" r0 f-r0))
be - branch equal
-
machines: base
-
syntax: be $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x11
|
r0
|
r1
|
branch
|
-
semantics:
(if (eq r0 r1) (set pc branch))
bg - branch greater
-
machines: base
-
syntax: bg $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x12
|
r0
|
r1
|
branch
|
-
semantics:
(if (gt r0 r1) (set pc branch))
bge - branch greater or equal
-
machines: base
-
syntax: bge $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x13
|
r0
|
r1
|
branch
|
-
semantics:
(if (ge r0 r1) (set pc branch))
bgeu - branch greater or equal unsigned
-
machines: base
-
syntax: bgeu $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x14
|
r0
|
r1
|
branch
|
-
semantics:
(if (geu r0 r1) (set pc branch))
bgu - branch greater unsigned
-
machines: base
-
syntax: bgu $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x15
|
r0
|
r1
|
branch
|
-
semantics:
(if (gtu r0 r1) (set pc branch))
bi - branch immediate
-
machines: base
-
syntax: bi $call
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-call
|
|
0x38
|
call
|
-
semantics:
(set pc (ext SI call))
bne - branch not equal
-
machines: base
-
syntax: bne $r0,$r1,$branch
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-branch
|
|
0x17
|
r0
|
r1
|
branch
|
-
semantics:
(if (ne r0 r1) (set pc branch))
break - breakpoint
-
machines: base
-
syntax: break
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-exception
|
|
0x2b
|
0x2
|
-
semantics:
(set pc (c-call USI "@cpu@_break_insn" pc))
bret - return from breakpoint
-
machines: base
-
syntax: bret
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x30
|
0x1f
|
0x0
|
0x0
|
0x0
|
-
semantics:
(set pc (c-call USI "@cpu@_bret_insn" r0))
call - call
-
machines: base
-
syntax: call $r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x36
|
r0
|
0x0
|
0x0
|
0x0
|
-
semantics:
(sequence
()
(set (reg h-gr 29) (add pc 4))
(set pc r0))
calli - call immediate
-
machines: base
-
syntax: calli $call
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-call
|
|
0x3e
|
call
|
-
semantics:
(sequence
()
(set (reg h-gr 29) (add pc 4))
(set pc (ext SI call)))
cmpe - compare equal
-
machines: base
-
syntax: cmpe $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x39
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (eq SI r0 r1))
cmpei - compare equal immediate
-
machines: base
-
syntax: cmpei $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x19
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (eq SI r0 (ext SI (trunc HI imm))))
cmpg - compare greater than
-
machines: base
-
syntax: cmpg $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x3a
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (gt SI r0 r1))
cmpge - compare greater or equal
-
machines: base
-
syntax: cmpge $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x3b
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (ge SI r0 r1))
cmpgei - compare greater or equal immediate
-
machines: base
-
syntax: cmpgei $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x1b
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (ge SI r0 (ext SI (trunc HI imm))))
cmpgeu - compare greater or equal unsigned
-
machines: base
-
syntax: cmpgeu $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x3c
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (geu SI r0 r1))
cmpgeui - compare greater or equal unsigned immediate
-
machines: base
-
syntax: cmpgeui $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x1c
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (geu SI r0 (zext SI uimm)))
cmpgi - compare greater than immediate
-
machines: base
-
syntax: cmpgi $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x1a
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (gt SI r0 (ext SI (trunc HI imm))))
cmpgu - compare greater than unsigned
-
machines: base
-
syntax: cmpgu $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x3d
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (gtu SI r0 r1))
cmpgui - compare greater than unsigned immediate
-
machines: base
-
syntax: cmpgui $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x1d
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (gtu SI r0 (zext SI uimm)))
cmpne - compare not equal
-
machines: base
-
syntax: cmpne $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x3f
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (ne SI r0 r1))
cmpnei - compare not equal immediate
-
machines: base
-
syntax: cmpnei $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x1f
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (ne SI r0 (ext SI (trunc HI imm))))
divu - unsigned divide
-
machines: base
-
syntax: divu $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x23
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set pc
(c-call USI "@cpu@_divu_insn" pc f-r0 f-r1 f-r2))
eret - return from exception
-
machines: base
-
syntax: eret
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x30
|
0x1e
|
0x0
|
0x0
|
0x0
|
-
semantics:
(set pc (c-call USI "@cpu@_eret_insn" r0))
lb - load byte
-
machines: base
-
syntax: lb $r1,($r0+$imm)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x4
|
r0
|
r1
|
imm
|
-
semantics:
(set r1
(ext SI
(mem QI (add r0 (ext SI (trunc HI imm))))))
lbgotoff - load byte got offset
-
machines: base
-
syntax: lb $r1,($r0+$gotofflo16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x4
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1
(ext SI
(mem QI (add r0 (ext SI (trunc HI gotofflo16))))))
lbgprel - load byte gp relative
-
machines: base
-
syntax: lb $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x4
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1
(ext SI
(mem QI (add r0 (ext SI (trunc HI gp16))))))
lbu - load byte unsigned
-
machines: base
-
syntax: lbu $r1,($r0+$imm)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x10
|
r0
|
r1
|
imm
|
-
semantics:
(set r1
(zext SI
(mem QI (add r0 (ext SI (trunc HI imm))))))
lbugotoff - load byte got offset unsigned
-
machines: base
-
syntax: lbu $r1,($r0+$gotofflo16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x10
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1
(zext SI
(mem QI (add r0 (ext SI (trunc HI gotofflo16))))))
lbugprel - load byte unsigned gp relative
-
machines: base
-
syntax: lbu $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x10
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1
(zext SI
(mem QI (add r0 (ext SI (trunc HI gp16))))))
lh - load halfword
-
machines: base
-
syntax: lh $r1,($r0+$imm)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x7
|
r0
|
r1
|
imm
|
-
semantics:
(set r1
(ext SI
(mem HI (add r0 (ext SI (trunc HI imm))))))
lhgotoff - load half word got offset
-
machines: base
-
syntax: lh $r1,($r0+$gotofflo16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x7
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1
(ext SI
(mem HI (add r0 (ext SI (trunc HI gotofflo16))))))
lhgprel - load halfword gp relative
-
machines: base
-
syntax: lh $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x7
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1
(ext SI
(mem HI (add r0 (ext SI (trunc HI gp16))))))
lhu - load halfword unsigned
-
machines: base
-
syntax: lhu $r1,($r0+$imm)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xb
|
r0
|
r1
|
imm
|
-
semantics:
(set r1
(zext SI
(mem HI (add r0 (ext SI (trunc HI imm))))))
lhugotoff - load half word got offset unsigned
-
machines: base
-
syntax: lhu $r1,($r0+$gotofflo16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xb
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1
(zext SI
(mem HI (add r0 (ext SI (trunc HI gotofflo16))))))
lhugprel - load halfword unsigned gp relative
-
machines: base
-
syntax: lhu $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xb
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1
(zext SI
(mem HI (add r0 (ext SI (trunc HI gp16))))))
lw - load word
-
machines: base
-
syntax: lw $r1,($r0+$imm)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xa
|
r0
|
r1
|
imm
|
-
semantics:
(set r1
(mem SI (add r0 (ext SI (trunc HI imm)))))
lwgotoff - load word got offset
-
machines: base
-
syntax: lw $r1,($r0+$gotofflo16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xa
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set r1
(mem SI (add r0 (ext SI (trunc HI gotofflo16)))))
lwgotrel - load word got relative
-
machines: base
-
syntax: lw $r1,(gp+$got16)
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xa
|
0x1a
|
r1
|
got16
|
-
semantics:
(set r1
(mem SI (add r0 (ext SI (trunc HI got16)))))
lwgprel - load word gp relative
-
machines: base
-
syntax: lw $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xa
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1
(mem SI (add r0 (ext SI (trunc HI gp16)))))
modu - unsigned modulus
-
machines: base
-
syntax: modu $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x31
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set pc
(c-call USI "@cpu@_modu_insn" pc f-r0 f-r1 f-r2))
mul - mulitply
-
machines: base
-
syntax: mul $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x22
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (mul r0 r1))
muli - multiply immediate
-
machines: base
-
syntax: muli $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x2
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (mul r0 (ext SI (trunc HI imm))))
mv - move
-
machines: base
-
syntax: mv $r2,$r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x2e
|
r0
|
0x0
|
r2
|
0x0
|
-
semantics:
(set r2 r0)
mva - move address
-
machines: base
-
syntax: mva $r1,$gp16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xd
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set r1 (add r0 (ext SI (trunc HI gp16))))
mvhi - move high immediate
-
machines: base
-
syntax: mvhi $r1,$hi16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x1e
|
0x0
|
r1
|
hi16
|
-
semantics:
(set r1 (or r0 (sll SI hi16 16)))
mvi - move immediate
-
machines: base
-
syntax: mvi $r1,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xd
|
0x0
|
r1
|
imm
|
-
semantics:
(set r1 (add r0 (ext SI (trunc HI imm))))
mvui - move unsigned immediate
-
machines: base
-
syntax: mvu $r1,$lo16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0xe
|
0x0
|
r1
|
lo16
|
-
semantics:
(set r1 (zext SI lo16))
nop - nop
-
machines: base
-
syntax: nop
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xd
|
0x0
|
0x0
|
0x0
|
-
semantics:
(set r0 r0)
nor - nor
-
machines: base
-
syntax: nor $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x21
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (inv (or r0 r1)))
nori - nor immediate
-
machines: base
-
syntax: nori $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x1
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (inv (or r0 (zext SI uimm))))
not - not
-
machines: base
-
syntax: not $r2,$r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x29
|
r0
|
0x0
|
r2
|
0x0
|
-
semantics:
(set r2 (inv r0))
or - or
-
machines: base
-
syntax: or $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x2e
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (or r0 r1))
orhigotoffi - or high got offset immediate
-
machines: base
-
syntax: orhi $r1,$r0,$gotoffhi16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x1e
|
r0
|
r1
|
gotoffhi16
|
-
semantics:
(set r1 (or r0 (sll SI gotoffhi16 16)))
orhii - or high immediate
-
machines: base
-
syntax: orhi $r1,$r0,$hi16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x1e
|
r0
|
r1
|
hi16
|
-
semantics:
(set r1 (or r0 (sll SI hi16 16)))
ori - or immediate
-
machines: base
-
syntax: ori $r1,$r0,$lo16
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0xe
|
r0
|
r1
|
lo16
|
-
semantics:
(set r1 (or r0 (zext SI lo16)))
rcsr - read control or status register
-
machines: base
-
syntax: rcsr $r2,$csr
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-csr
|
f-r1
|
f-r2
|
f-resv0
|
|
0x24
|
csr
|
0x0
|
r2
|
0x0
|
-
semantics:
(set r2 csr)
ret - return
-
machines: base
-
syntax: ret
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x30
|
0x1d
|
0x0
|
0x0
|
0x0
|
-
semantics:
(set pc r0)
sb - store byte
-
machines: base
-
syntax: sb ($r0+$imm),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xc
|
r0
|
r1
|
imm
|
-
semantics:
(set (mem QI (add r0 (ext SI (trunc HI imm))))
r1)
sbgotoff - store byte got offset
-
machines: base
-
syntax: sb ($r0+$gotofflo16),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xc
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set (mem QI (add r0 (ext SI (trunc HI gotofflo16))))
r1)
sbgprel - store byte gp relative
-
machines: base
-
syntax: sb $gp16,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xc
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set (mem QI (add r0 (ext SI (trunc HI gp16))))
r1)
scall - system call
-
machines: base
-
syntax: scall
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-exception
|
|
0x2b
|
0x7
|
-
semantics:
(set pc (c-call USI "@cpu@_scall_insn" pc))
sextb - sign extend byte
-
machines: base
-
syntax: sextb $r2,$r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x2c
|
r0
|
0x0
|
r2
|
0x0
|
-
semantics:
(set r2 (ext SI (trunc QI r0)))
sexth - sign extend half-word
-
machines: base
-
syntax: sexth $r2,$r0
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x37
|
r0
|
0x0
|
r2
|
0x0
|
-
semantics:
(set r2 (ext SI (trunc HI r0)))
sh - store halfword
-
machines: base
-
syntax: sh ($r0+$imm),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x3
|
r0
|
r1
|
imm
|
-
semantics:
(set (mem HI (add r0 (ext SI (trunc HI imm))))
r1)
shgotoff - store half word got offset
-
machines: base
-
syntax: sh ($r0+$gotofflo16),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x3
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set (mem HI (add r0 (ext SI (trunc HI gotofflo16))))
r1)
shgprel - store halfword gp relative
-
machines: base
-
syntax: sh $gp16,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x3
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set (mem HI (add r0 (ext SI (trunc HI gp16))))
r1)
sl - shift left
-
machines: base
-
syntax: sl $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x2f
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (sll SI r0 r1))
sli - shift left immediate
-
machines: base
-
syntax: sli $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0xf
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (sll SI r0 imm))
sr - shift right
-
machines: base
-
syntax: sr $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x25
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (sra SI r0 r1))
sri - shift right immediate
-
machines: base
-
syntax: sri $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x5
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (sra SI r0 imm))
sru - shift right unsigned
-
machines: base
-
syntax: sru $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x20
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (srl SI r0 r1))
srui - shift right unsigned immediate
-
machines: base
-
syntax: srui $r1,$r0,$imm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x0
|
r0
|
r1
|
imm
|
-
semantics:
(set r1 (srl SI r0 imm))
sub - subtract
-
machines: base
-
syntax: sub $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x32
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (sub r0 r1))
sw - store word
-
machines: base
-
syntax: sw ($r0+$imm),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x16
|
r0
|
r1
|
imm
|
-
semantics:
(set (mem SI (add r0 (ext SI (trunc HI imm))))
r1)
swgotoff - store word got offset
-
machines: base
-
syntax: sw ($r0+$gotofflo16),$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x16
|
r0
|
r1
|
gotofflo16
|
-
semantics:
(set (mem SI (add r0 (ext SI (trunc HI gotofflo16))))
r1)
swgprel - store word gp relative
-
machines: base
-
syntax: sw $gp16,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-imm
|
|
0x16
|
0x1a
|
r1
|
gp16
|
-
semantics:
(set (mem SI (add r0 (ext SI (trunc HI gp16))))
r1)
user - user defined instruction
-
machines: base
-
syntax: user $r2,$r0,$r1,$user
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-user
|
|
0x33
|
r0
|
r1
|
r2
|
user
|
-
semantics:
(set r2 (c-call SI "@cpu@_user_insn" r0 r1 user))
wcsr - write control or status register
-
machines: base
-
syntax: wcsr $csr,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-csr
|
f-r1
|
f-r2
|
f-resv0
|
|
0x34
|
csr
|
r1
|
0x0
|
0x0
|
-
semantics:
(c-call VOID "@cpu@_wcsr_insn" f-csr r1)
xnor - xnor
-
machines: base
-
syntax: xnor $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x29
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (inv (xor r0 r1)))
xnori - xnor immediate
-
machines: base
-
syntax: xnori $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x9
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (inv (xor r0 (zext SI uimm))))
xor - xor
-
machines: base
-
syntax: xor $r2,$r0,$r1
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11
|
10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-r2
|
f-resv0
|
|
0x26
|
r0
|
r1
|
r2
|
0x0
|
-
semantics:
(set r2 (xor r0 r1))
xori - xor immediate
-
machines: base
-
syntax: xori $r1,$r0,$uimm
-
format:
|
31 30 29 28 27 26
|
25 24 23 22 21
|
20 19 18 17 16
|
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
f-opcode
|
f-r0
|
f-r1
|
f-uimm
|
|
0x6
|
r0
|
r1
|
uimm
|
-
semantics:
(set r1 (xor r0 (zext SI uimm)))
Macro Instructions
Macro instructions for each machine:
lm32 - Lattice Mico32 MACH
Individual macro-instructions descriptions
This documentation was machine generated from the cgen cpu description
files for this architecture.
http://sources.redhat.com/cgen/