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
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) ])
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) ])
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
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) ])
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) ])
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), ])
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) ])
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) ])
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) ])
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), ])
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
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