Skip to content

Instantly share code, notes, and snippets.

@KrzaQ
Created December 20, 2018 13:49
Show Gist options
  • Save KrzaQ/c9a10d6e1aa1b731dfbbf105cc2f6ecc to your computer and use it in GitHub Desktop.
Save KrzaQ/c9a10d6e1aa1b731dfbbf105cc2f6ecc to your computer and use it in GitHub Desktop.
#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