Chapter 3 SignalGP instruction set
Below, we document the instruction set used in our GP system for our 2023 GPTP experiments.
Abbreviations:
- EOP: End of program
 - Reg: local register
- Reg[0] indicates the value at the register specified by an instruction’s first argument, Reg[1] indicates the value at the register specified by an instruction’s second argument, and Reg[2] indicates the value at the register specified by the instruction’s third argument.
 - Reg[0], Reg[1], etc: Register 0, Register 1, etc.
 
 - Input: input buffer
- Follows same scheme as Reg
 
 - Output: output buffer
- Follows same scheme as Reg
 
 - Global: global memory buffer
- Follows same scheme as Reg
 
 - Arg: Instruction argument
- Arg[i] indicates the i’th instruction argument (an integer encoded in the genome)
 - E.g., Arg[0] is an instruction’s first argument
 
 
Instructions that would produce undefined behavior (e.g., division by zero) are treated as no operations.
3.1 Default Instructions
I.e., instructions used across all diagnostic tasks.
| Instruction | Arguments Used | Description | 
|---|---|---|
Nop | 
0 | No operation | 
Not | 
1 | Reg[0] = !Reg[0] | 
Inc | 
1 | Reg[0] = Reg[0] + 1 | 
Dec | 
1 | Reg[0] = Reg[0] - 1 | 
Add | 
3 | Reg[2] = Reg[0] + Reg[1] | 
Sub | 
3 | Reg[2] = Reg[0] - Reg[1] | 
Mult | 
3 | Reg[2] = Reg[0] * Reg[1] | 
Div | 
3 | Reg[2] = Reg[0] / Reg[1] | 
Mod | 
3 | Reg[2] = Reg[0] % Reg[1] | 
Nand | 
2 | Reg[2] = !(Reg[0] & Reg[1]) | 
TestEqu | 
3 | Reg[2] = Reg[0] == Reg[1] | 
TestNEqu | 
3 | Reg[2] = Reg[0] != Reg[1] | 
TestLess | 
3 | Reg[2] = Reg[0] < Reg[1] | 
TestLessEqu | 
3 | Reg[2] = Reg[0] <= Reg[1] | 
TestGreater | 
3 | Reg[2] = Reg[0] > Reg[1] | 
TestGreaterEqu | 
3 | Reg[2] = Reg[0] >= Reg[1] | 
SetMem | 
2 | Reg[0] = Arg[1] | 
Terminal | 
1 | Reg[0] = double value encoded by instruction tag | 
CopyMem | 
2 | Reg[0] = Reg[1] | 
SwapMem | 
2 | Swap(Reg[0], Reg[1]) | 
InputToWorking | 
2 | Reg[1] = Input[0] | 
WorkingToOutput | 
2 | Output[1] = Reg[0] | 
If | 
1 | If Reg[0] != 0, proceed. Otherwise skip to the next Close or EOP. | 
While | 
1 | While Reg[0] != 0, loop. Otherwise skip to next Close or EOP. | 
Close | 
0 | Indicate the end of a control block of code (e.g., loop, if). | 
Break | 
0 | Break out of current control flow (e.g., loop). | 
Call | 
0 | Call a function, using this instruction’s tag to determine which function is called. | 
Routine | 
0 | Same as call, but local memory is shared. Sort of like a jump that will jump back when the routine ends. | 
Return | 
0 | Return from the current function call. | 
WorkingToGlobal | 
2 | Global[1] = Reg[0] | 
GlobalToWorking | 
2 | Reg[1] = Global[0] | 
FullGlobalToWorking | 
0 | Copy entire global memory buffer into working memory buffer | 
FullWorkingToGlobal | 
0 | Copy entire working memory buffer into global memory buffer | 
Note that Nand performs a bitwise operation.