def adjust_register_layout(aInstruction):
    adjust_dest = False
    dest_layout_multiple = 2
    if aInstruction.name.startswith('VW') or aInstruction.name.startswith(
            'VFW'):
        adjust_dest = True
    elif aInstruction.name.startswith('VQMACC'):
        adjust_dest = True
        dest_layout_multiple = 4

    adjust_source = False
    source_layout_multiple = 2
    if '.W' in aInstruction.name:
        adjust_source = True
    elif aInstruction.name.startswith(
            'VSEXT.VF') or aInstruction.name.startswith('VZEXT.VF'):
        adjust_source = True
        layout_divisor = int(aInstruction.name[-1])
        source_layout_multiple = 1 / layout_divisor

    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if adjust_dest:
        operand_adjustor.adjust_dest_layout(dest_layout_multiple)
        operand_adjustor.set_vs1_differ_vd()

    if adjust_source:
        operand_adjustor.adjust_source_layout(source_layout_multiple)

    if adjust_dest != adjust_source:
        operand_adjustor.set_vs2_differ_vd()
Ejemplo n.º 2
0
def adjust_vd_vs2_vs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vs1()
    operand_adjustor.set_vm()
    return True
Ejemplo n.º 3
0
def adjust_vd_vs2_simm5_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_imm('simm5', 'simm5', True)
    operand_adjustor.set_vm()
    return True
Ejemplo n.º 4
0
def adjust_vd_rs1_rs2_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)

    reg_count = 1
    if "SEG" in aInstruction.name:
        layout_opr = aInstruction.find_operand("custom")
        reg_count = int(layout_opr.regCount)

    operand_adjustor.set_vd_ls_dest()
    operand_adjustor.set_rs1_int_ls_base()
    operand_adjustor.set_rs2_int_ls_base()

    width = get_element_size(aInstruction.find_operand("const_bits"))
    attr_dict = dict()
    subop_dict = dict()
    subop_dict["base"] = "rs1"
    subop_dict["index"] = "rs2"
    attr_dict["alignment"] = width
    attr_dict["base"] = "rs1"
    attr_dict["data-size"] = width * reg_count
    attr_dict["element-size"] = width
    attr_dict["mem-access"] = "Read"

    add_addressing_operand(
        aInstruction,
        None,
        "LoadStore",
        "VectorStridedLoadStoreOperandRISCV",
        subop_dict,
        attr_dict,
    )

    operand_adjustor.set_vm()
    return True
Ejemplo n.º 5
0
def add_layout_operand(aInstruction):
    load_store_whole_register = ["VL1R.V", "VS1R.V"]

    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if aInstruction.name in load_store_whole_register:
        reg_count = int(aInstruction.name[2])
        operand_adjustor.add_whole_register_layout_operand(aRegCount=reg_count)
    elif aInstruction.name in ("VMV1R.V", "VMV2R.V", "VMV4R.V", "VMV8R.V"):
        reg_count = int(aInstruction.name[3])
        operand_adjustor.add_whole_register_layout_operand(
            aRegCount=reg_count, aRegIndexAlignment=reg_count
        )
    elif aInstruction.name in ("VSETVL", "VSETVLI"):
        pass  # No vector layout operand required
    elif (
        aInstruction.iclass == "VectorLoadStoreInstruction"
        or aInstruction.iclass == "VectorAMOInstructionRISCV"
    ):
        reg_count = 1
        elem_width = None
        ints = re.findall("\d+", aInstruction.name)
        if len(ints) > 1:
            reg_count = ints[0]
            elem_width = ints[1]
        else:
            elem_width = ints[0]

        operand_adjustor.add_custom_layout_operand(
            aRegCount=reg_count, aElemWidth=elem_width
        )
    else:
        operand_adjustor.add_vtype_layout_operand()
Ejemplo n.º 6
0
def _set_arithmetic_register_layouts(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    for opr_name in ("vd", "vs1", "vs2", "vd/rd", "vd$\neq$0"):
        opr = aInstruction.find_operand(opr_name, fail_not_found=False)

        if opr:
            operand_adjustor.set_vtype_layout(aInstruction, opr)
Ejemplo n.º 7
0
def adjust_vdrd_vs2_rs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vdrd_int()
    operand_adjustor.set_vs2()
    operand_adjustor.set_rs1_int()
    operand_adjustor.set_vm()
    return True
def add_layout_operand(aInstruction):
    # TODO(Noah): Add additional load/store whole register instructions when they are supported by
    # Handcar.
    load_store_whole_register = ['VL1R.V', 'VS1R.V']

    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if aInstruction.name in load_store_whole_register:
        reg_count = int(aInstruction.name[2])
        operand_adjustor.add_whole_register_layout_operand(aRegCount=reg_count)
    elif aInstruction.name in ('VMV1R.V', 'VMV2R.V', 'VMV4R.V', 'VMV8R.V'):
        reg_count = int(aInstruction.name[3])
        operand_adjustor.add_whole_register_layout_operand(
            aRegCount=reg_count, aRegIndexAlignment=reg_count)
    elif aInstruction.name in ('VSETVL', 'VSETVLI'):
        pass  # No vector layout operand required
    elif aInstruction.iclass == 'VectorLoadStoreInstruction' or aInstruction.iclass == 'VectorAMOInstructionRISCV':
        reg_count = 1
        elem_width = None
        ints = re.findall('\d+', aInstruction.name)
        if len(ints) > 1:
            reg_count = ints[0]
            elem_width = ints[1]
        else:
            elem_width = ints[0]

        operand_adjustor.add_custom_layout_operand(aRegCount=reg_count,
                                                   aElemWidth=elem_width)
    else:
        operand_adjustor.add_vtype_layout_operand()
def adjust_vd_rs1_rs2_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)

    reg_count = 1
    if 'SEG' in aInstruction.name:
        layout_opr = aInstruction.find_operand('custom')
        reg_count = int(layout_opr.regCount)

    operand_adjustor.set_vd_ls_dest()
    operand_adjustor.set_rs1_int_ls_base()
    operand_adjustor.set_rs2_int_ls_base()

    width = get_element_size(aInstruction.find_operand('const_bits'))
    attr_dict = dict()
    subop_dict = dict()
    subop_dict['base'] = 'rs1'
    subop_dict['index'] = 'rs2'
    attr_dict['alignment'] = width
    attr_dict['base'] = 'rs1'
    attr_dict['data-size'] = width * reg_count
    attr_dict['element-size'] = width
    attr_dict['mem-access'] = 'Read'

    add_addressing_operand(aInstruction, None, 'LoadStore',
                           'VectorStridedLoadStoreOperand', subop_dict,
                           attr_dict)

    operand_adjustor.set_vm()
    return True
Ejemplo n.º 10
0
def _set_load_store_register_layouts(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)

    (reg_count, elem_width) = _get_load_store_register_layout_parameters(aInstruction)

    src_dest_opr = _get_source_or_destination_operand(aInstruction)
    operand_adjustor.set_fixed_element_size_layout(
        src_dest_opr, aRegCount=reg_count, aElemWidth=elem_width
    )
Ejemplo n.º 11
0
def adjust_vdrd_vs2_vm(aInstruction):
    funct3 = aInstruction.find_operand('const_bits').value[11:14]
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if funct3 == '001':  #OPFVV
        operand_adjustor.set_vdrd_sp()
    else:
        operand_adjustor.set_vdrd_int()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vm()
    return True
Ejemplo n.º 12
0
def adjust_vd_rs1_vm(aInstruction):
    funct3 = aInstruction.find_operand('const_bits').value[11:14]
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    if funct3 == '101':  #OPFVF
        operand_adjustor.set_rs1_sp()
    else:
        operand_adjustor.set_rs1_int()
    operand_adjustor.set_vm()
    return True
def adjust_vd_vs2_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vm()

    if aInstruction.name in ('VMSBF.M', 'VMSIF.M', 'VMSOF.M', 'VIOTA.M'):
        operand_adjustor.set_vs2_differ_vd()

    return True
Ejemplo n.º 14
0
def adjust_vs3_rs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vs3_ls_source()
    operand_adjustor.set_rs1_int_ls_base()

    width = get_element_size(aInstruction.find_operand("const_bits"))
    attr_dict = dict()
    subop_dict = dict()
    subop_dict["base"] = "rs1"
    attr_dict["alignment"] = width
    attr_dict["base"] = "rs1"
    attr_dict["data-size"] = width
    attr_dict["element-size"] = width
    attr_dict["mem-access"] = "Write"

    add_addressing_operand(
        aInstruction,
        None,
        "LoadStore",
        "VectorBaseOffsetLoadStoreOperand",
        subop_dict,
        attr_dict,
    )

    operand_adjustor.set_vm()
    return True
Ejemplo n.º 15
0
def _set_whole_register_load_store_register_layouts(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)

    reg_count = int(aInstruction.name[2])

    elem_width = 8
    if aInstruction.name[4] == "E":
        width_end_index = aInstruction.name.find(".")
        elem_width = int(aInstruction.name[5:width_end_index])

    src_dest_opr = _get_source_or_destination_operand(aInstruction)
    operand_adjustor.set_whole_register_layout(
        src_dest_opr, aRegCount=reg_count, aElemWidth=elem_width
    )
def adjust_vdrd_vs2(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if '.F' in aInstruction.name:
        operand_adjustor.set_vdrd_sp()
    else:
        operand_adjustor.set_vdrd_int()
    operand_adjustor.set_vs2()
    return True
Ejemplo n.º 17
0
def _set_whole_register_move_register_layouts(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)

    reg_count = int(aInstruction.name[3])

    dest_opr = aInstruction.find_operand("vd")
    operand_adjustor.set_whole_register_layout(dest_opr, aRegCount=reg_count)
    src_opr = aInstruction.find_operand("vs2")
    operand_adjustor.set_whole_register_layout(src_opr, aRegCount=reg_count)
def adjust_vs3_rs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vs3_ls_source()
    operand_adjustor.set_rs1_int_ls_base()

    width = get_element_size(aInstruction.find_operand('const_bits'))
    attr_dict = dict()
    subop_dict = dict()
    subop_dict['base'] = 'rs1'
    attr_dict['alignment'] = width
    attr_dict['base'] = 'rs1'
    attr_dict['data-size'] = width
    attr_dict['element-size'] = width
    attr_dict['mem-access'] = 'Write'

    add_addressing_operand(aInstruction, None, 'LoadStore',
                           'VectorBaseOffsetLoadStoreOperand', subop_dict,
                           attr_dict)

    operand_adjustor.set_vm()
    return True
def adjust_vd_vs2_vs1(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vs1()

    if aInstruction.name == 'VCOMPRESS.VM':
        operand_adjustor.set_vs2_differ_vd()
        operand_adjustor.set_vs1_differ_vd()

    return True
def adjust_rd_rs1_zimm_10_0(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_rd_int()
    operand_adjustor.set_rs1_vsetvl()
    operand_adjustor.set_imm_vsetvl()
    return True
Ejemplo n.º 21
0
def adjust_vd_vs2_simm5(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_imm("simm5", "simm5", True)
    return True
def adjust_vd_vs2_rs1_vm(aInstruction):
    funct3 = aInstruction.find_operand('const_bits').value[6:9]
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    if funct3 == '101':  #OPFVF
        operand_adjustor.set_rs1_sp()
    else:
        operand_adjustor.set_rs1_int()

    operand_adjustor.set_vm()

    if aInstruction.name in ('VFSLIDE1UP.VF', 'VRGATHER.VX', 'VSLIDE1UP.VX',
                             'VSLIDEUP.VX'):
        operand_adjustor.set_vs2_differ_vd()

    return True
def adjust_vd_nonzero_vs2_rs1(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd_nonzero()
    operand_adjustor.set_vs2()
    operand_adjustor.set_rs1_int()
    return True
def adjust_vd_vs2_simm5_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_imm('simm5', 'simm5', True)
    operand_adjustor.set_vm()

    if aInstruction.name in ('VRGATHER.VI', 'VSLIDEUP.VI'):
        operand_adjustor.set_vs2_differ_vd()

    return True
def adjust_vd_nonzero_vs2_simm5(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd_nonzero()
    operand_adjustor.set_vs2()
    operand_adjustor.set_imm('simm5', 'simm5', True)
    return True
def adjust_vd_rs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    if aInstruction.iclass == 'VectorLoadStoreInstruction':
        operand_adjustor.set_vd_ls_dest()
        operand_adjustor.set_rs1_int_ls_base()

        width = get_element_size(aInstruction.find_operand('const_bits'))
        attr_dict = dict()
        subop_dict = dict()
        subop_dict['base'] = 'rs1'
        attr_dict['alignment'] = width
        attr_dict['base'] = 'rs1'
        attr_dict['data-size'] = width
        attr_dict['element-size'] = width
        attr_dict['mem-access'] = 'Read'

        add_addressing_operand(aInstruction, None, 'LoadStore',
                               'VectorBaseOffsetLoadStoreOperand', subop_dict,
                               attr_dict)
    else:
        funct3 = aInstruction.find_operand('const_bits').value[11:14]
        operand_adjustor.set_vd()
        if funct3 == '101':  #OPFVF
            operand_adjustor.set_rs1_sp()
        else:
            operand_adjustor.set_rs1_int()
    operand_adjustor.set_vm()
    return True
Ejemplo n.º 27
0
def adjust_vd_vs2_simm5_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_imm("simm5", "simm5", True)
    operand_adjustor.set_vm()

    if aInstruction.name in ("VRGATHER.VI", "VSLIDEUP.VI"):
        operand_adjustor.set_vs2_differ_vd()

    return True
def adjust_rs1_vs2_vd_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_rs1_int_ls_base()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vs2_differ_vd()

    width = get_element_size(aInstruction.find_operand('const_bits'))
    attr_dict = dict()
    subop_dict = dict()
    subop_dict['base'] = 'rs1'
    subop_dict['index'] = 'vs2'
    attr_dict['base'] = 'rs1'
    attr_dict['mem-access'] = 'ReadWrite'

    add_addressing_operand(aInstruction, None, 'LoadStore',
                           'VectorIndexedLoadStoreOperandRISCV', subop_dict,
                           attr_dict)

    operand_adjustor.set_vd_ls_indexed_dest()
    operand_adjustor.set_vm()
    return True
def adjust_vd_vs2_vs1_vm(aInstruction):
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    operand_adjustor.set_vs1()
    operand_adjustor.set_vm()

    if aInstruction.name == 'VRGATHER.VV':
        operand_adjustor.set_vs2_differ_vd()
        operand_adjustor.set_vs1_differ_vd()

    return True
Ejemplo n.º 30
0
def adjust_vd_vs2_rs1_vm(aInstruction):
    funct3 = aInstruction.find_operand("const_bits").value[6:9]
    operand_adjustor = VectorOperandAdjustor(aInstruction)
    operand_adjustor.set_vd()
    operand_adjustor.set_vs2()
    if funct3 == "101":  # OPFVF
        operand_adjustor.set_rs1_sp()
    else:
        operand_adjustor.set_rs1_int()

    operand_adjustor.set_vm()

    if aInstruction.name in (
        "VFSLIDE1UP.VF",
        "VRGATHER.VX",
        "VSLIDE1UP.VX",
        "VSLIDEUP.VX",
    ):
        operand_adjustor.set_vs2_differ_vd()

    return True