print("""// encoding is tssooo
// t = 0: 32-bit, t = 1: 64-bit
// ss = 00: reserved
// ss = 01: 2 components
// ss = 10: 3 components
// ss = 11: 4 components
// ooo = 000: and
// ooo = 001: or
// ooo = 010: xor
// ooo = 011: add.i
// ooo = 100: nand
// ooo = 101: nor
// ooo = 110: xnor
// ooo = 111: add.f
""")
#for vec3
types = [
    ["int", "int", "int", "int", "int", "int", "int", "float"],
    ["long", "long", "long", "long", "long", "long", "long", "double"]
]
#does not include size (2 or 4, 3 is special)
vec_types = [
    ["ivec", "ivec", "ivec", "ivec", "ivec", "ivec", "ivec", "vec"],
    ["lvec", "lvec", "lvec", "lvec", "lvec", "lvec", "lvec", "dvec"]
]
operators = ["&", "|", "^", "+"]

def case_str(type, width, op):
    case = (type << 5) | (width << 3) | (op)
    return f"case {case:03o}:"

def src_str(type, width, op):
    if width & 1:
        return f"OPA({vec_types[type][op]}{width+1})"
    else:
        return f"OPA({types[type][op]})"

def dst_str(type, width, op):
    return f"OPC({types[type][op]})"

def hop_str(type, width, op):
    return f"{'~' if op & 4 and op != 7 else ''}OP_hop{width+1}"

for type in range(2):
    for width in range(1, 4): # 0 is reserved
        for opcode in range(8):
            case = case_str(type, width, opcode)
            src = src_str(type, width, opcode)
            dst = dst_str(type, width, opcode)
            hop = hop_str(type, width, opcode)
            op = operators[opcode & 3]
            if width == 2:
                print(f"{case} {dst} = {hop} (&{src}, {op}); break;")
            else:
                print(f"{case} {dst} = {hop} ({src}, {op}); break;")
