Пример #1
0
def parse_line(s):
    # print('{}: {}'.format(read_bytes, s))
    m = op_pat.match(s)
    m2 = const_pat.match(s)
    if m is not None:
        op_name = m.group('op_name')
        # ここかっこよくやる方法わからん
        g = m.group('args')
        if g is None:
            args = []
        else:
            args = m.group('args').replace(' ', '').replace('\t',
                                                            '').split(',')
        try:
            a = asm(op_name, args)
        except Exception as e:
            error_line(s)
            raise e
        return a
    elif m2 is not None:
        value = m2.group('value')
        i = utils.check_and_trans_imm(value, 32)
        return utils.int2u32b(i)
    elif debug:
        print('{} is ignored'.format(s))
    return None
Пример #2
0
def lui(rd, imm):
    rd = check_and_trans_reg(rd)
    imm = check_and_trans_imm(imm, 20)
    return pack([
        (0b0110111, 7),
        (rd, 5),
        (imm, 20)
        ])
Пример #3
0
def auipc(rd, imm):
    rd = check_and_trans_reg(rd)
    v = check_and_trans_imm(imm, 20)
    return pack([
        (0b0010111, 7),
        (rd, 5),
        (v, 20)
        ])
Пример #4
0
def tail(imm):
    imm = utils.check_and_trans_imm(imm, 32)
    ui = str((imm >> 12) + ((imm >> 11) & 1))
    li = str(imm & (1 << 12 - 1))
    l = [
        ('auipc', ('x6', ui)),
        ('jalr', ('x0', 'x6', li)),
    ]
    return l
Пример #5
0
def jal(rd, imm):
    rd = check_and_trans_reg(rd)
    imm = check_and_trans_imm(imm, 20)
    # check_alignment(imm, 2)
    return pack([
        (0b1101111, 7),
        (rd, 5),
        (bit_reorder(imm, [19, *range(9, -1, -1), 10, *range(18, 10, -1)]), 20)
    ])
Пример #6
0
def alui(rd, funct3, rs1, imm):
    imm = check_and_trans_imm(imm, 12)
    rd = check_and_trans_reg(rd)
    rs1 = check_and_trans_reg(rs1)
    return pack([
        (0b0010011, 7),
        (rd, 5),
        (funct3, 3),
        (rs1, 5),
        (imm, 12)
    ])
Пример #7
0
def jalr(rd, rs, imm):
    rd = check_and_trans_reg(rd)
    rs = check_and_trans_reg(rs)
    v = check_and_trans_imm(imm, 12)
    return pack([
        (0b1100111, 7),
        (rd, 5),
        (0, 3),
        (rs, 5),
        (v, 12),
    ])
Пример #8
0
def flw(rd, rs1, imm):
    imm = check_and_trans_imm(imm, 12)
    rd = check_and_trans_reg(rd)
    rs1 = check_and_trans_reg(rs1)
    return pack([
        (0b0000111, 7),
        (rd, 5),
        (0b010, 3),
        (rs1, 5),
        (imm, 12)
    ])
Пример #9
0
def shift(rd, funct3, rs1, imm1, imm2):
    imm1 = check_and_trans_imm(imm1, 7)
    rd = check_and_trans_reg(rd)
    rs1 = check_and_trans_reg(rs1)
    return pack([
        (0b0010011, 7),
        (rd, 5),
        (funct3, 3),
        (rs1, 5),
        (imm1, 5),
        (imm2, 7)
    ])
Пример #10
0
def branch(imm, funct3, rs1, rs2):
    imm = check_and_trans_imm(imm, 12)
    rs1 = check_and_trans_reg(rs1)
    rs2 = check_and_trans_reg(rs2)
    val = ((imm & 0b1111) << 1) | ((imm >> 10) & 1)
    val2 = ((imm >> 4) & 0b111111) | (((imm >> 11) & 1) << 6)
    return pack([
        (0b1100011, 7),
        (val, 5),
        (funct3, 3),
        (rs1, 5),
        (rs2, 5),
        (val2, 7)
    ])
Пример #11
0
def fsw(rs1, rs2, imm):
    imm = check_and_trans_imm(imm, 12)
    rs1 = check_and_trans_reg(rs1)
    rs2 = check_and_trans_reg(rs2)
    val = (imm & 0b11111)
    val2 = (imm >> 5)
    return pack([
        (0b0100111, 7),
        (val, 5),
        (0b010, 3),
        (rs2, 5),
        (rs1, 5),
        (val2, 7),
    ])
Пример #12
0
def bnei(rs, rt, imm):
    rt = utils.check_and_trans_imm(str(utils.get_reg(rt) - 16), 5)
    l = [('bgeu', (rs, 'x' + str(rt), imm))]
    return l
Пример #13
0
def li(rd, imm):
    imm = utils.check_and_trans_imm(imm, 32)
    ui = str((imm >> 12) + ((imm >> 11) & 1))
    li = str(imm & ((1 << 12) - 1))
    l = [('lui', [rd, ui]), ('addi', [rd, rd, li])]
    return l