Skip to content

Instantly share code, notes, and snippets.

@simon816
Created December 20, 2018 01:30
Show Gist options
  • Save simon816/d2407f663af21296da8824722cda7e92 to your computer and use it in GitHub Desktop.
Save simon816/d2407f663af21296da8824722cda7e92 to your computer and use it in GitHub Desktop.
import sys
program = []
binding = None
for line in sys.stdin:
opcode, *rest = line.split(' ')
if opcode == '#ip':
binding = int(rest[0])
else:
program.append((opcode,) + tuple(map(int, rest)))
insns = {
'addr': lambda A, B: 'r%d + r%d' % (A, B),
'addi': lambda A, B: 'r%d + %d' % (A, B),
'mulr': lambda A, B: 'r%d * r%d' % (A, B),
'muli': lambda A, B: 'r%d * %d' % (A, B),
'banr': lambda A, B: 'r%d & r%d' % (A, B),
'bani': lambda A, B: 'r%d & %d' % (A, B),
'borr': lambda A, B: 'r%d | r%d' % (A, B),
'bori': lambda A, B: 'r%d | %d' % (A, B),
'setr': lambda A, B: 'r%d' % (A),
'seti': lambda A, B: '%d' % A,
'gtir': lambda A, B: '%d > r%d ? 1 : 0' % (A, B),
'gtri': lambda A, B: 'r%d > %d ? 1 : 0' % (A, B),
'gtrr': lambda A, B: 'r%d > r%d ? 1 : 0' % (A, B),
'eqir': lambda A, B: '%d == r%d ? 1 : 0' % (A, B),
'eqri': lambda A, B: 'r%d == %d ? 1 : 0' % (A, B),
'eqrr': lambda A, B: 'r%d == r%d ? 1 : 0' % (A, B),
}
n_reg = 6
reg_list = ', '.join(map(lambda n: 'r%d' % n, range(n_reg)))
print('static int %s;' % reg_list)
print("""
#include <stdio.h>
int main(int argc, char *argv[])
{
%s = 0;
for(;;r%d++)
switch (r%d) {""" % (' = '.join(map(lambda n: 'r%d' % n, range(n_reg))),
binding, binding))
for i in range(len(program)):
opcode, A, B, C = program[i]
print(' case %d: r%d = %s; break;' % (i, C, insns[opcode](A, B)))
print(' default: printf("[%s]", %s); return 0;' % (','.join(['%d'] * n_reg), reg_list))
print(' }\n}')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment