Split the instructions in multiple files and added move and branch instructions
All checks were successful
Central(Architecture) Docs Build / Build Documentation (push) Successful in 17s

This commit is contained in:
Elyan 2024-11-02 00:44:24 +01:00
parent 3459319b1a
commit 955251bea6
11 changed files with 949 additions and 571 deletions

View File

@ -1,60 +0,0 @@
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 5, name: 'rs1', type: 4},
{bits: 5, name: 'rs2', type: 4},
{bits: 6, name: 'imm', type: 5}
], config: {label: {right: 'A-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 5, name: 'rs1', type: 4},
{bits: 11, name: 'imm', type: 5}
], config: {label: {right: 'B-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 16, name: 'imm', type: 5}
], config: {label: {right: 'C-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 21, name: 'imm', type: 5}
], config: {label: {right: 'D1-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 25, name: 'imm', type: 5}
], config: {label: {right: 'D2-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'E-Type'}}}
....

View File

@ -0,0 +1,115 @@
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 5, name: 'rs1', type: 4},
{bits: 5, name: 'rs2', type: 4},
{bits: 6, name: 'imm', type: 5}
], config: {label: {right: 'A1-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'imm[4:0]', type: 5},
{bits: 5, name: 'rs1', type: 4},
{bits: 5, name: 'rs2', type: 4},
{bits: 6, name: 'imm[10:5]', type: 5}
], config: {label: {right: 'A2-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 5, name: 'rs1', type: 4},
{bits: 11, name: 'imm', type: 5}
], config: {label: {right: 'B1-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'imm[4:0]', type: 5},
{bits: 5, name: 'rs1', type: 4},
{bits: 11, name: 'imm[15:5]', type: 5}
], config: {label: {right: 'B2-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'rd', type: 2},
{bits: 16, name: 'imm', type: 5}
], config: {label: {right: 'C-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 4, name: 'cond', type: 6},
{bits: 21, name: 'imm', type: 5}
], config: {label: {right: 'D1-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 1, name: 0},
{bits: 24, name: 'imm', type: 5}
], config: {label: {right: 'D2-Type'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 'opcode', type: 8},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'E-Type'}}}
....
.Format fields
[horizontal]
opcode::
The operation to carry on.
cond::
Condition code. +
See <<conditions-encoding>>.
rd::
Destination register. +
See <<registers-encoding>>.
rs1::
Source register 1.
rs2::
Source register 2.
imm::
Immediate value. +
Can be interpreted as signed or unsigned depending on the instruction.
reg::
Source/destination register on the _Execution Engine_ side. +
See <<registers-encoding>>.
sid::
Subsystem ID. +
See <<subsystems-encoding>>.
sre::
Source/destination register on the subsystem side. +
See <<subsystems-registers-encoding>>.
cmd::
Subsystem register command. +
Specific to the accessed subsystem register. More info in <<subsystems>>.

View File

@ -6,538 +6,41 @@ The source (rs1 and rs2) and destination (rd) registers are kept at the same pos
For instruction encoding formats that contain an immediate value, not all immediate bits are used by all instructions sharing the format. The actual relevant bits are specified for these instructions.
include::images/instruction-formats.adoc[]
.Format fields
[horizontal]
opcode::
The operation to carry on.
cond::
Condition code. +
See <<conditions-encoding>>.
rd::
Destination register. +
See <<registers-encoding>>.
rs1::
Source register 1.
rs2::
Source register 2.
imm::
Immediate value. +
Can be interpreted as signed or unsigned depending on the instruction.
reg::
Source/destination register on the _Execution Engine_ side. +
See <<registers-encoding>>.
sid::
Subsystem ID. +
See <<subsystems-encoding>>.
sre::
Source/destination register on the subsystem side. +
See <<subsystems-registers-encoding>>.
cmd::
Subsystem register command. +
Specific to the accessed subsystem register. More info in <<subsystems>>.
include::instruction-formats.adoc[]
<<<
include::instructions-operands-encoding.adoc[]
<<<
=== Instruction List
#TODO: List instructions#
* NOP instruction
* memory load/store instructions
* register move instructions
* arithmetic instructions
* bitwise operations instructions (w/ bit shifts)
* comparison instructions
* jump instructions
* system mode instructions (svc, uret, sret, ...)
* subsystems instructions (ssr & ssw)
==== Miscellaneous Instructions
===== NOP: No Operation
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x0, type: 8, attr: '0x0'},
{bits: 25, name: 'unused'}
], config: {label: {right: 'NOP'}}}
....
Description::
Does nothing. Can be used to align a block of instructions.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
nop
----
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions:: None.
include::instructions/nop.adoc[]
<<<
include::instructions/svc.adoc[]
<<<
===== SVC: Supervisor Call
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7f, type: 8, attr: '0x7e'},
{bits: 25, name: 'svc_num', type: 5}
], config: {label: {right: 'SVC'}}}
....
Description::
Generates an SVC exception to execute a privileged operation.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
svc <svc_num>
----
+
Where:
[horizontal]
svc_num:::
A constant identifying the privileged operation to execute. +
Must be in the range 0..33554431 (0x0..0x1FFFFFF).
Examples::
+
[source]
----
svc 128 <1>
svc 0xff <2>
----
<1> Calls the privileged operation number 128 that is exposed by the kernel.
<2> Calls the privileged operation number 255 that is exposed by the kernel.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions:: SVC.
==== Memory-Related Instructions
include::instructions/ldr.adoc[]
<<<
==== Memory-related instructions
===== LDR: Load Register
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x1, type: 8, attr: '0x1'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIR'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x2, type: 8, attr: '0x2'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIRW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x3, type: 8, attr: '0x3'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIOW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x4, type: 8, attr: '0x4'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDRR'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x5, type: 8, attr: '0x5'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDRRW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x6, type: 8, attr: '0x6'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDROW'}}}
....
[frame=ends,grid=rows,cols="1,1"]
|===
|Instruction variant | Description
|LDRIR
|<<LDRIR>>
|LDRIRW
|<<LDRIRW>>
|LDRIOW
|<<LDRIOW>>
|LDRR
|<<LDRR>>
|LDRRW
|<<LDRRW>>
|LDROW
|<<LDROW>>
|===
==== Register Manipulation Instructions
include::instructions/mov.adoc[]
<<<
[id=LDRIR]
====== LDRIR: Load Register+Immediate Pre-indexed
Description::
Loads a word from memory into a register.
The immediate offset `off` is added to the address in the `src` register before reading memory.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off?>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 0 is used.
Examples::
+
[source]
----
ldr r1, [r0] <1>
ldr r3, [r2, 8] <2>
ldr.eq r5, [r4] <3>
----
<1> Reads a word from the memory address in r0 into r1.
<2> Reads a word from the memory address in r2, with an 8 bytes offset, into r3.
<3> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r4 into r5. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRIRW]
====== LDRIRW: Load Register+Immediate Pre-indexed with Write-back
Description::
Increments the source register then reads a word from memory into the destination register.
The immediate offset `off` is added to the `src` register value before reading a word from memory into the `dst` register.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, ![<src>, <off?>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 4 is used.
Examples::
+
[source]
----
ldr r1, ![r0] <1>
ldr r3, ![r2, 8] <2>
ldr.eq r5, ![r4] <3>
----
<1> Increments r0 by 4 then reads a word from the memory address in r0 into r1.
<2> Increments r2 by 8 then reads a word from the memory address in r2 into r3.
<3> If the last comparison resulted in an 'eq' condition status, increments r4 by 4 then reads a word from the memory address in r4 into r5. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRIOW]
====== LDRIOW: Load Register+Immediate Post-indexed with Write-back
Description::
Reads a word from memory into the destination register then increments the source register.
The immediate offset `off` is added to the source register `src` after reading from memory into the destination register `dst`.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off?>]!
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 4 is used.
Examples::
+
[source]
----
ldr r1, [r0]! <1>
ldr r3, [r2, 8]! <2>
ldr.eq r5, [r4]! <3>
----
<1> Reads a word from the memory address in r0 into r1 then increments r0 by 4.
<2> Reads a word from the memory address in r2 into r3 then increments r2 by 8.
<3> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r4 into r5 then increments r4 by 4. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRR]
====== LDRR: Load Register+Register Pre-indexed
Description::
Loads a word from memory into a register.
The value in the register `off` is added to the address in the `src` register before reading memory.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, [sp, r0] <1>
ldr.eq r0, [r1, r2] <2>
----
<1> Reads a word from the memory address in sp into r1, adding the value of r0 as an offset.
<2> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r1 into r0, adding the value of r2 as an offset. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRRW]
====== LDRRW: Load Register+Register Pre-indexed with Write-back
Description::
Increments the source register then reads a word from memory into the destination register.
The value in the register `off` is added to the `src` register value before reading a word from memory into the `dst` register.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, ![<src>, <off>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, ![sp, r0] <1>
ldr.eq r0, ![r1, r2] <2>
----
<1> Adds the value of r0 into sp then reads a word from the memory address in sp into r1.
<2> If the last comparison resulted in an 'eq' condition status, adds the value of r2 into r1 then reads a word from the memory address in r1 into r0. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDROW]
====== LDROW: Load Register+Register Post-indexed with Write-back
Description::
Reads a word from memory into the destination register then increments the source register.
The value in the register `off` is added to the source register `src` after reading from memory into the destination register `dst`.
Encoding:: A-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off>]!
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, [sp, r0]! <1>
ldr.eq r0, [r1, r2]! <2>
----
<1> Reads a word from the memory address in sp into r1 then adds the value of r0 into sp.
<2> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r1 into r0 then adds the value of r2 into r1. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
==== Branching Instructions
include::instructions/b.adoc[]
<<<
==== Subsystems Instructions
===== SSR: Subsystem Register Read
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7d, type: 8, attr: '0x7d'},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'SSR'}}}
....
Description::
Reads a value from a subsystem register into an _Execution Engine_ register.
Encoding:: E-Type
Assembler syntax::
+
[source]
----
ssr <sid>, <reg>, <sre>, <cmd>
----
+
Where:
[horizontal]
sid:::
The subsystem identifier.
Should be in the range *ss0*..*ss15*.
reg::: The _Execution Engine_ destination register.
sre:::
The subsystem source register.
Should be in the range *sr0*..*sr255*.
cmd::: The subsystem register specific command to use for reading.
Examples::
+
[source]
----
ssr ss0, r1, sr0, 1 <1>
ssr ss15, pc, sr32, 0 <2>
----
<1> Reads the *sr0* register from the *ss0* subsystem into *r1* using the command _0x1_ to do so.
<2> Reads the *sr32* register from the *ss15* subsystem into *pc* using the command _0x0_ to do so.
Privileged instruction:: No. (The access control is done at the register/command level).
Updates program state flags:: No.
Exceptions:: PrivFault.
include::instructions/ssr.adoc[]
<<<
===== SSW: Subsystem Register Write
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7e, type: 8, attr: '0x7e'},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'SSW'}}}
....
Description::
Writes a value from an _Execution Engine_ register into a subsystem register.
Encoding:: E-Type
Assembler syntax::
+
[source]
----
ssw <sid>, <reg>, <sre>, <cmd>
----
+
Where:
[horizontal]
sid:::
The subsystem identifier.
Should be in the range *ss0*..*ss15*.
reg::: The _Execution Engine_ source register.
sre:::
The subsystem destination register.
Should be in the range *sr0*..*sr255*.
cmd::: The subsystem register specific command to use for writing.
Examples::
+
[source]
----
ssw ss0, r1, sr0, 1 <1>
ssw ss15, pc, sr32, 0 <2>
----
<1> Writes the value in *r1* into the *sr0* register from the *ss0* subsystem using the command _0x1_ to do so.
<2> Writes the value in *pc* into the *sr32* register from the *ss15* subsystem using the command _0x0_ to do so.
Privileged instruction:: No. (The access control is done at the register/command level).
Updates program state flags:: No.
Exceptions:: PrivFault.
include::instructions/ssw.adoc[]

View File

@ -0,0 +1,241 @@
===== B: Branch
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0xf, type: 8, attr: '0x0f'},
{bits: 4, name: 'cond', type: 6},
{bits: 21, name: 'off', type: 5}
], config: {label: {right: 'BIO'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x10, type: 8, attr: '0x10'},
{bits: 1, name: 0},
{bits: 24, name: 'off', type: 5}
], config: {label: {right: 'BAIO'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x11, type: 8, attr: '0x11'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'off[4:0]', type: 5},
{bits: 5, name: 'base', type: 4},
{bits: 11, name: 'off[15:5]', type: 5}
], config: {label: {right: 'BRIA'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x12, type: 8, attr: '0x12'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'unused'},
{bits: 5, name: 'base', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'BRRA'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x13, type: 8, attr: '0x13'},
{bits: 1, name: 0},
{bits: 24, name: 'addr', type: 5}
], config: {label: {right: 'BAIA'}}}
....
[frame=ends,grid=rows,cols="1,1"]
|===
|Instruction variant | Description
|BIO
|<<BIO>>
|BAIO
|<<BAIO>>
|BRIA
|<<BRIA>>
|BRRA
|<<BRRA>>
|BAIA
|<<BAIA>>
|===
<<<
[id=BIO]
====== BIO: Branch Immediate Offset
Description::
Branch to the instruction the address of which is at `pc + off`. +
The assembler selects this variant over *BAIO* when a condition is given.
Encoding:: D1-Type
Assembler syntax::
+
[source]
----
b<cond> <off>
----
+
Where:
[horizontal]
cond::: Condition.
off::: Immediate offset.
Examples::
+
[source]
----
b.al -20 <1>
b.eq 8 <2>
----
<1> Branches to `pc - 20`.
<2> If the last comparison resulted in an 'eq' condition status, branches to `pc + 8`. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=BAIO]
====== BAIO: Branch Always Immediate Offset
Description::
Branch to the instruction the address of which is at `pc + off`.
Permits the use of more bits for the offset at the cost of being unconditional. +
The assembler selects this variant over *BIO* when no condition is given.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
b <off>
----
+
Where:
[horizontal]
off::: Immediate offset.
Examples::
+
[source]
----
b -0x3FFFFF <1>
----
<1> Branches to `pc - 0x3FFFFF`.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=BRIA]
====== BRIA: Branch Register+Immediate Absolute
Description::
Branch to the instruction the address of which is at `base + off`.
Permits to use a varying base address with a fixed offset.
Encoding:: B2-Type
Assembler syntax::
+
[source]
----
b<cond?> [<base>, <off?>]
----
+
Where:
[horizontal]
cond::: Optional condition.
base::: Base register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-262140.
If omitted, then 0 is used.
Examples::
+
[source]
----
b [r0, 12] <1>
b.eq [r3] <2>
----
<1> Branches to the instruction at address `r0 + 12`.
<2> If the last comparison resulted in an 'eq' condition status, branches to the instruction at the address in r3. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=BRRA]
====== BRRA: Branch Register+Register Absolute
Description::
Branch to the instruction the address of which is at `base + off`.
Permits to use a varying base address with a varying offset.
Encoding:: A2-Type
Assembler syntax::
+
[source]
----
b<cond?> [<base>, <off>]
----
+
Where:
[horizontal]
cond::: Optional condition.
base::: Base register.
off::: Offset register.
Examples::
+
[source]
----
b [r0, r1] <1>
b.eq [r2, r3] <2>
----
<1> Branches to the instruction at address `r0 + r1`.
<2> If the last comparison resulted in an 'eq' condition status, branches to the instruction at address `r2 + r3`. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=BAIA]
====== BAIA: Branch Always Immediate Address
Description::
Branch to the instruction at the address `addr`.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
b <addr>
----
+
Where:
[horizontal]
addr::: Immediate address.
Examples::
+
[source]
----
b 0x100000 <1>
----
<1> Branches to the address 0x100000.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.

View File

@ -0,0 +1,324 @@
===== LDR: Load Register
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x1, type: 8, attr: '0x01'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIR'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x2, type: 8, attr: '0x02'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIRW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x3, type: 8, attr: '0x03'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'off', type: 5}
], config: {label: {right: 'LDRIOW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x4, type: 8, attr: '0x04'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDRR'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x5, type: 8, attr: '0x05'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDRRW'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x6, type: 8, attr: '0x06'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 5, name: 'off', type: 4},
{bits: 6, name: 'unused'}
], config: {label: {right: 'LDROW'}}}
....
[frame=ends,grid=rows,cols="1,1"]
|===
|Instruction variant | Description
|LDRIR
|<<LDRIR>>
|LDRIRW
|<<LDRIRW>>
|LDRIOW
|<<LDRIOW>>
|LDRR
|<<LDRR>>
|LDRRW
|<<LDRRW>>
|LDROW
|<<LDROW>>
|===
<<<
[id=LDRIR]
====== LDRIR: Load Register+Immediate Pre-indexed
Description::
Loads a word from memory into a register.
The immediate offset `off` is added to the address in the `src` register before reading memory.
Encoding:: B1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off?>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 0 is used.
Examples::
+
[source]
----
ldr r1, [r0] <1>
ldr r3, [r2, 8] <2>
ldr.eq r5, [r4] <3>
----
<1> Reads a word from the memory address in r0 into r1.
<2> Reads a word from the memory address in r2, with an 8 bytes offset, into r3.
<3> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r4 into r5. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRIRW]
====== LDRIRW: Load Register+Immediate Pre-indexed with Write-back
Description::
Increments the source register then reads a word from memory into the destination register.
The immediate offset `off` is added to the `src` register value before reading a word from memory into the `dst` register.
Encoding:: B1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, ![<src>, <off?>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 4 is used.
Examples::
+
[source]
----
ldr r1, ![r0] <1>
ldr r3, ![r2, 8] <2>
ldr.eq r5, ![r4] <3>
----
<1> Increments r0 by 4 then reads a word from the memory address in r0 into r1.
<2> Increments r2 by 8 then reads a word from the memory address in r2 into r3.
<3> If the last comparison resulted in an 'eq' condition status, increments r4 by 4 then reads a word from the memory address in r4 into r5. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRIOW]
====== LDRIOW: Load Register+Immediate Post-indexed with Write-back
Description::
Reads a word from memory into the destination register then increments the source register.
The immediate offset `off` is added to the source register `src` after reading from memory into the destination register `dst`.
Encoding:: B1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off?>]!
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off:::
Optional offset immediate.
Must be a multiple of 4 and in the range 0-8188.
If omitted, then 4 is used.
Examples::
+
[source]
----
ldr r1, [r0]! <1>
ldr r3, [r2, 8]! <2>
ldr.eq r5, [r4]! <3>
----
<1> Reads a word from the memory address in r0 into r1 then increments r0 by 4.
<2> Reads a word from the memory address in r2 into r3 then increments r2 by 8.
<3> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r4 into r5 then increments r4 by 4. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRR]
====== LDRR: Load Register+Register Pre-indexed
Description::
Loads a word from memory into a register.
The value in the register `off` is added to the address in the `src` register before reading memory.
Encoding:: A1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, [sp, r0] <1>
ldr.eq r0, [r1, r2] <2>
----
<1> Reads a word from the memory address in sp into r1, adding the value of r0 as an offset.
<2> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r1 into r0, adding the value of r2 as an offset. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDRRW]
====== LDRRW: Load Register+Register Pre-indexed with Write-back
Description::
Increments the source register then reads a word from memory into the destination register.
The value in the register `off` is added to the `src` register value before reading a word from memory into the `dst` register.
Encoding:: A1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, ![<src>, <off>]
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, ![sp, r0] <1>
ldr.eq r0, ![r1, r2] <2>
----
<1> Adds the value of r0 into sp then reads a word from the memory address in sp into r1.
<2> If the last comparison resulted in an 'eq' condition status, adds the value of r2 into r1 then reads a word from the memory address in r1 into r0. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.
<<<
[id=LDROW]
====== LDROW: Load Register+Register Post-indexed with Write-back
Description::
Reads a word from memory into the destination register then increments the source register.
The value in the register `off` is added to the source register `src` after reading from memory into the destination register `dst`.
Encoding:: A1-Type
Assembler syntax::
+
[source]
----
ldr<cond?> <dst>, [<src>, <off>]!
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
off::: Offset register.
Examples::
+
[source]
----
ldr r1, [sp, r0]! <1>
ldr.eq r0, [r1, r2]! <2>
----
<1> Reads a word from the memory address in sp into r1 then adds the value of r0 into sp.
<2> If the last comparison resulted in an 'eq' condition status, reads a word from the memory address in r1 into r0 then adds the value of r2 into r1. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
MemFault.

View File

@ -0,0 +1,101 @@
===== MOV: Move to Register
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0xd, type: 8, attr: '0x0d'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 5, name: 'src', type: 4},
{bits: 11, name: 'unused'}
], config: {label: {right: 'MOVR'}}}
....
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0xe, type: 8, attr: '0x0e'},
{bits: 4, name: 'cond', type: 6},
{bits: 5, name: 'dst', type: 2},
{bits: 16, name: 'val', type: 5}
], config: {label: {right: 'MOVI'}}}
....
[frame=ends,grid=rows,cols="1,1"]
|===
|Instruction variant | Description
|MOVR
|<<MOVR>>
|MOVI
|<<MOVI>>
|===
<<<
[id=MOVR]
====== MOVR: Move Register to Register
Description::
Copies the value of a source register into a destination register.
Encoding:: B1-Type
Assembler syntax::
+
[source]
----
mov<cond?> <dst>, <src>
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
src::: Source register.
Examples::
+
[source]
----
mov r1, r0 <1>
mov.lt r3, lr <2>
----
<1> Copies the value from r0 into r1.
<2> If the last comparison resulted in an 'lt' condition status, copies the value from lr into r3. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
None.
<<<
[id=MOVI]
====== MOVI: Move Immediate to Register
Description::
Sets a destination register to the value given in the immediate field.
Encoding:: C-Type
Assembler syntax::
+
[source]
----
mov<cond?> <dst>, <val>
----
+
Where:
[horizontal]
cond::: Optional condition.
dst::: Destination register.
val::: Immediate value.
Examples::
+
[source]
----
mov r0, 42 <1>
mov.eq r1, 1337 <2>
----
<1> Sets r0 to 42.
<2> If the last comparison resulted in an 'eq' condition status, sets r1 to 1337. Else, does nothing.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions::
None.

View File

@ -0,0 +1,22 @@
===== NOP: No Operation
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x0, type: 8, attr: '0x00'},
{bits: 25, name: 'unused'}
], config: {label: {right: 'NOP'}}}
....
Description::
Does nothing. Can be used to align a block of instructions.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
nop
----
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions:: None.

View File

@ -0,0 +1,47 @@
===== SSR: Subsystem Register Read
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7d, type: 8, attr: '0x7d'},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'SSR'}}}
....
Description::
Reads a value from a subsystem register into an _Execution Engine_ register.
Encoding:: E-Type
Assembler syntax::
+
[source]
----
ssr <sid>, <reg>, <sre>, <cmd>
----
+
Where:
[horizontal]
sid:::
The subsystem identifier.
Should be in the range *ss0*..*ss15*.
reg::: The _Execution Engine_ destination register.
sre:::
The subsystem source register.
Should be in the range *sr0*..*sr255*.
cmd::: The subsystem register specific command to use for reading.
Examples::
+
[source]
----
ssr ss0, r1, sr0, 1 <1>
ssr ss15, pc, sr32, 0 <2>
----
<1> Reads the sr0 register from the ss0 subsystem into r1 using the command _0x1_ to do so.
<2> Reads the sr32 register from the ss15 subsystem into pc using the command _0x0_ to do so.
Privileged instruction:: No. (The access control is done at the register/command level).
Updates program state flags:: No.
Exceptions:: PrivFault.

View File

@ -0,0 +1,47 @@
===== SSW: Subsystem Register Write
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7e, type: 8, attr: '0x7e'},
{bits: 5, name: 'reg', type: 2},
{bits: 4, name: 'sid', type: 7},
{bits: 8, name: 'sre', type: 2},
{bits: 8, name: 'cmd', type: 8}
], config: {label: {right: 'SSW'}}}
....
Description::
Writes a value from an _Execution Engine_ register into a subsystem register.
Encoding:: E-Type
Assembler syntax::
+
[source]
----
ssw <sid>, <reg>, <sre>, <cmd>
----
+
Where:
[horizontal]
sid:::
The subsystem identifier.
Should be in the range *ss0*..*ss15*.
reg::: The _Execution Engine_ source register.
sre:::
The subsystem destination register.
Should be in the range *sr0*..*sr255*.
cmd::: The subsystem register specific command to use for writing.
Examples::
+
[source]
----
ssw ss0, r1, sr0, 1 <1>
ssw ss15, pc, sr32, 0 <2>
----
<1> Writes the value in r1 into the sr0 register from the ss0 subsystem using the command _0x1_ to do so.
<2> Writes the value in pc into the sr32 register from the ss15 subsystem using the command _0x0_ to do so.
Privileged instruction:: No. (The access control is done at the register/command level).
Updates program state flags:: No.
Exceptions:: PrivFault.

View File

@ -0,0 +1,38 @@
===== SVC: Supervisor Call
[wavedrom, ,svg]
....
{reg: [
{bits: 7, name: 0x7f, type: 8, attr: '0x7e'},
{bits: 25, name: 'svc_num', type: 5}
], config: {label: {right: 'SVC'}}}
....
Description::
Generates an SVC exception to execute a privileged operation.
Encoding:: D2-Type
Assembler syntax::
+
[source]
----
svc <svc_num>
----
+
Where:
[horizontal]
svc_num:::
An immediate number identifying the privileged operation to execute.
Examples::
+
[source]
----
svc 128 <1>
svc 0xff <2>
----
<1> Calls the privileged operation number 128 that is exposed by the kernel.
<2> Calls the privileged operation number 255 that is exposed by the kernel.
Privileged instruction:: No.
Updates program state flags:: No.
Exceptions:: SVC.

View File

@ -30,7 +30,7 @@ The {central-arch-name} allows up to 16 subystem identifiers. Not all of these i
|#TODO: Describe it.#
|===
<<<
[id=debugging-subsystem]
=== Debugging Subsystem
==== Description