Created
December 20, 2018 13:49
-
-
Save KrzaQ/c9a10d6e1aa1b731dfbbf105cc2f6ecc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <array> | |
#include <iostream> | |
#include <functional> | |
#include <vector> | |
#include <type_traits> | |
template<int IP> | |
struct machine | |
{ | |
std::array<int, 6> registers; | |
int instruction; | |
machine(int first_value): | |
registers{{first_value}} | |
{} | |
int& ip() { return registers[IP]; } | |
template<int A, int B, int C> | |
void addr() { registers[C] = registers[A] + registers[B]; } | |
template<int A, int B, int C> | |
void addi() { registers[C] = registers[A] + B; } | |
template<int A, int B, int C> | |
void mulr() { registers[C] = registers[A] * registers[B]; } | |
template<int A, int B, int C> | |
void muli() { registers[C] = registers[A] * B; } | |
template<int A, int B, int C> | |
void banr() { registers[C] = registers[A] & registers[B]; } | |
template<int A, int B, int C> | |
void bali() { registers[C] = registers[A] & B; } | |
template<int A, int B, int C> | |
void borr() { registers[C] = registers[A] | registers[B]; } | |
template<int A, int B, int C> | |
void bori() { registers[C] = registers[A] | B; } | |
template<int A, int, int C> | |
void setr() { registers[C] = registers[A]; } | |
template<int A, int, int C> | |
void seti() { registers[C] = A; } | |
template<int A, int B, int C> | |
void gtir() { registers[C] = A > registers[B]; } | |
template<int A, int B, int C> | |
void gtri() { registers[C] = registers[A] > B; } | |
template<int A, int B, int C> | |
void gtrr() { registers[C] = registers[A] > registers[B]; } | |
template<int A, int B, int C> | |
void eqir() { registers[C] = A == registers[B]; } | |
template<int A, int B, int C> | |
void eqri() { registers[C] = registers[A] == B; } | |
template<int A, int B, int C> | |
void eqrr() { registers[C] = registers[A] == registers[B]; } | |
}; | |
int main(int argc, char** argv) | |
{ | |
using m = machine<4>; | |
m sym{std::stoi(argv[1])}; | |
// m sym{0}; | |
LABEL_0: | |
sym.addi<4,16,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_1: | |
sym.seti<1,2,3>(); | |
sym.ip()++; | |
LABEL_2: | |
sym.seti<1,6,1>(); | |
sym.ip()++; | |
LABEL_3: | |
sym.mulr<3,1,2>(); | |
sym.ip()++; | |
LABEL_4: | |
sym.eqrr<2,5,2>(); | |
sym.ip()++; | |
LABEL_5: | |
sym.addr<2,4,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_6: | |
sym.addi<4,1,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_7: | |
sym.addr<3,0,0>(); | |
sym.ip()++; | |
LABEL_8: | |
sym.addi<1,1,1>(); | |
sym.ip()++; | |
LABEL_9: | |
sym.gtrr<1,5,2>(); | |
sym.ip()++; | |
LABEL_10: | |
sym.addr<4,2,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_11: | |
sym.seti<2,8,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_12: | |
sym.addi<3,1,3>(); | |
sym.ip()++; | |
LABEL_13: | |
sym.gtrr<3,5,2>(); | |
sym.ip()++; | |
LABEL_14: | |
sym.addr<2,4,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_15: | |
sym.seti<1,4,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_16: | |
sym.mulr<4,4,4>(); | |
sym.ip()++; | |
LABEL_17: | |
sym.addi<5,2,5>(); | |
sym.ip()++; | |
LABEL_18: | |
sym.mulr<5,5,5>(); | |
sym.ip()++; | |
LABEL_19: | |
sym.mulr<4,5,5>(); | |
sym.ip()++; | |
LABEL_20: | |
sym.muli<5,11,5>(); | |
sym.ip()++; | |
LABEL_21: | |
sym.addi<2,5,2>(); | |
sym.ip()++; | |
LABEL_22: | |
sym.mulr<2,4,2>(); | |
sym.ip()++; | |
LABEL_23: | |
sym.addi<2,18,2>(); | |
sym.ip()++; | |
LABEL_24: | |
sym.addr<5,2,5>(); | |
sym.ip()++; | |
LABEL_25: | |
sym.addr<4,0,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_26: | |
sym.seti<0,6,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_27: | |
sym.setr<4,8,2>(); | |
sym.ip()++; | |
LABEL_28: | |
sym.mulr<2,4,2>(); | |
sym.ip()++; | |
LABEL_29: | |
sym.addr<4,2,2>(); | |
sym.ip()++; | |
LABEL_30: | |
sym.mulr<4,2,2>(); | |
sym.ip()++; | |
LABEL_31: | |
sym.muli<2,14,2>(); | |
sym.ip()++; | |
LABEL_32: | |
sym.mulr<2,4,2>(); | |
sym.ip()++; | |
LABEL_33: | |
sym.addr<5,2,5>(); | |
sym.ip()++; | |
LABEL_34: | |
sym.seti<0,1,0>(); | |
sym.ip()++; | |
LABEL_35: | |
sym.seti<0,5,4>(); | |
sym.ip()++; | |
switch(sym.registers[4]) { | |
case 0: goto LABEL_0; | |
case 1: goto LABEL_1; | |
case 2: goto LABEL_2; | |
case 3: goto LABEL_3; | |
case 4: goto LABEL_4; | |
case 5: goto LABEL_5; | |
case 6: goto LABEL_6; | |
case 7: goto LABEL_7; | |
case 8: goto LABEL_8; | |
case 9: goto LABEL_9; | |
case 10: goto LABEL_10; | |
case 11: goto LABEL_11; | |
case 12: goto LABEL_12; | |
case 13: goto LABEL_13; | |
case 14: goto LABEL_14; | |
case 15: goto LABEL_15; | |
case 16: goto LABEL_16; | |
case 17: goto LABEL_17; | |
case 18: goto LABEL_18; | |
case 19: goto LABEL_19; | |
case 20: goto LABEL_20; | |
case 21: goto LABEL_21; | |
case 22: goto LABEL_22; | |
case 23: goto LABEL_23; | |
case 24: goto LABEL_24; | |
case 25: goto LABEL_25; | |
case 26: goto LABEL_26; | |
case 27: goto LABEL_27; | |
case 28: goto LABEL_28; | |
case 29: goto LABEL_29; | |
case 30: goto LABEL_30; | |
case 31: goto LABEL_31; | |
case 32: goto LABEL_32; | |
case 33: goto LABEL_33; | |
case 34: goto LABEL_34; | |
case 35: goto LABEL_35; | |
default: goto LABEL_36; | |
} | |
LABEL_36: | |
std::cout << sym.registers[0] << '\n'; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment