aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2019-09-29 23:48:55 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-25 14:36:46 +0200
commit7eb8642c3ace697b03c4fc6edc90ea0ada715689 (patch)
treea4f7a57fae8467b3bade9882ce8b13d91293dd7d
parentf5dc9ad48db4d22e7d6f15e340063dc7cb14c1e1 (diff)
Update doc, changing layout of functions to optimize performance (bundle u8 together)
-rw-r--r--doc/Documentation.md35
1 files changed, 20 insertions, 15 deletions
diff --git a/doc/Documentation.md b/doc/Documentation.md
index afc890c..f04a3a2 100644
--- a/doc/Documentation.md
+++ b/doc/Documentation.md
@@ -1,29 +1,33 @@
# Instructions
Variable length instructions. Instruction size ranges from 1 to 4 bytes.
+
## Instruction formats
Instructions can be in 7 different formats:
1. 1 byte: Opcode(u8)
-2. 2 bytes: Opcode(u8) + register(i8)
-3. 3 bytes: Opcode(u8) + register(i8) + register(i8)
+2. 2 bytes: Opcode(u8) + register(AmalReg)
+3. 3 bytes: Opcode(u8) + register(AmalReg) + register(AmalReg)
4. 3 bytes:\
4.1 Opcode(u8) + intermediate(u16)\
4.2 Opcode(u8) + data(u16)\
4.3 Opcode(u8) + label(i16)\
-4.4 Opcode(u8) + register(i8) + num_args(u8)
-5. 4 bytes: Opcode(u8) + register(i8) + register(i8) + register(i8)
+4.4 Opcode(u8) + register(AmalReg) + num_args(u8)
+5. 4 bytes: Opcode(u8) + register(AmalReg) + register(AmalReg) + register(AmalReg)
6. 4 bytes:\
-6.1 Opcode(u8) + register(i8) + label(i16)\
-6.2 Opcode(u8) + register(i8) + intermediate(u16)\
-6.3 Opcode(u8) + register(i8) + data(u16)\
+6.1 Opcode(u8) + register(AmalReg) + label(i16)\
+6.2 Opcode(u8) + register(AmalReg) + intermediate(u16)\
+6.3 Opcode(u8) + register(AmalReg) + data(u16)\
6.4 Opcode(u8) + flags(u8) + num_local_var_reg(u16)\
6.5 Opcode(u8) + index(u8) + index(u16)
+
## Registers
-Registers have a range of 128. Local variables start from register 0 and increment while parameters start from -1
-and decrement. Registers have the scope of functions and reset after instructions reach a new function (AMAL_OP_FUNC_START).
+Registers have a range of 128. Parameters have the most significant bit set while local variables dont.
+Registers have the scope of functions and reset after instructions reach a new function (AMAL_OP_FUNC_START).
If import index for call and calle is 0, then that means the function resides in the same file the function call
is being called from. Which means that import index 1 is actually import index 0 into the import list.
+@AmalReg is an alias for u8.
+
# Compiler flow
(Tokenize&parse -> Resolve AST -> Generate SSA -> Generate bytecode) -> Generate program\
Each step except the last is done using multiple threads in parallel and the output of each step is used
@@ -106,12 +110,13 @@ The versions in the header only changes for every release, not every change.
|Type|Field |Description |
|----|-------------------------|-----------------------------------------------------------------------------------------------------|
|u8 |num_params |The number of parameters. |
+|u8 |num_return_types |The number of return values. |
+|u8 |name_len |The length of the external function name, in bytes. Excluding the null-terminate character. |
+|u8 |flags |The flags for the external function. The values are defined in @amal_func_flag. |
|u32 |params_num_pointers |The number of pointers in the parameters. |
|u32 |params_fixed_size |The size of all non-pointer type parameters, in bytes. |
-|u8 |num_return_types |The number of return values. |
|u32 |return_types_num_pointers|The number of pointers in the return types. |
|u32 |return_types_fixed_size |The size of all non-pointer type return types, in bytes. |
-|u8 |name_len |The length of the external function name, in bytes. Excluding the null-terminate character. |
|u8[]|name |The name of the external function, where the size is defined by @name_len. Names are null-terminated.|
# Bytecode exported functions
@@ -146,10 +151,10 @@ The versions in the header only changes for every release, not every change.
# Bytecode instructions
## Instructions layout
-|Type |Field |Description |
-|-----------|-----------------|---------------------------------------------------------------------------|
-|u32 |Instructions size|The size of the instructions section, in bytes. |
-|Instruction|Instructions data|The instructions data. Each instructions begins with an opcode, see #Opcode|
+|Type |Field |Description |
+|-------------|-----------------|---------------------------------------------------------------------------|
+|u32 |Instructions size|The size of the instructions section, in bytes. |
+|Instruction[]|Instructions data|The instructions data. Each instructions begins with an opcode, see #Opcode|
# Execution backend
Amalgam supports multiple execution backend and they can be implemented with minimal