# Rename register files to their new systematic names.
def upgrader(cpt):
    is_arm = cpt.get('root', 'isa', fallback='') == 'arm'

    import re

    is_cpu = lambda sec: 'intRegs' in cpt[sec]
    cpu_sections = filter(is_cpu, cpt.sections())

    for sec in cpu_sections:
        items = cpt[sec]

        # Almost all registers are 64 bits, except vectors and predicate
        # vectors in ARM.
        regval_bits = 64
        arm_vec_bits = 2048

        byte_bits = 8
        byte_mask = (0x1 << byte_bits) - 1

        # If there's vecRegs, create regs.vector_element from it.
        vec_regs = items.get('vecRegs')
        if vec_regs is not None:
            reg_vals = vec_regs.split()
            if is_arm:
                full_bits = arm_vec_bits
            else:
                full_bits = regval_bits
                reg_vals = ['0']
            elem_bits = 32
            elem_mask = (0x1 << elem_bits) - 1

            bytes = []
            for full in reg_vals:
                full = int(full)
                for idx in range(full_bits // elem_bits):
                    # Extract one element.
                    elem = full & elem_mask
                    full = full >> elem_bits

                    # Treat the element as a RegVal value, even if it's
                    # fewer bits in the vector registers.
                    for chunk in range(regval_bits // byte_bits):
                        bytes.append(f'{elem & byte_mask}')
                        elem = elem >> byte_bits

            items['regs.vector_element'] = ' '.join(bytes)

        name_map = {
            'floatRegs.i': 'regs.floating_point',
            'vecRegs': 'regs.vector',
            'vecPredRegs': 'regs.vector_predicate',
            'intRegs': 'regs.integer',
            'ccRegs': 'regs.condition_code',
        }

        for old, new in name_map.items():
            if old in items:
                if is_arm and old in ('vecRegs', 'vecPredRegs'):
                    reg_bits = 2048
                else:
                    reg_bits = regval_bits

                reg_vals = items[old].split()
                if not is_arm and old in ('vecRegs', 'vecPredRegs'):
                    reg_vals = ['0']

                bytes = []
                for reg in reg_vals:
                    reg = int(reg)
                    for chunk in range(reg_bits // byte_bits):
                        bytes.append(f'{reg & byte_mask}')
                        reg >> byte_bits

                items[new] = ' '.join(bytes)
                del items[old]

        items.setdefault('regs.condition_code', '')

legacy_version = 16
