def cook_asm(out, code, save):
    ymm_map = {'jV': 15, 'sV': 14, 'zV': 13}
    E.append_save_registers(ymm_map, 12, save.values())
    scratch = ['%%ymm%s' % i for i in ymm_map.values()]
    rr_map = {7: 'rcx', 10: 'rbx', 9: 'rbp', 8: 'r12', 6: 'r13', 5: 'r14'}
    scratch_map = {0: 'rax', 1: 'r8', 2: 'r9', 3: 'r10', 4: 'r11'}
    scratch += ['%' + i for i in scratch_map.values()]
    rr_map.update(scratch_map)
    code = E.replace_wi(code, rr_map)
    code = E.replace_ymm(code, 15, ymm_map)  # only one 32-bit register
    code = re.sub(r'\bdd\b', '%%rdx', code)
    for v in 'up', 'rp':
        code = re.sub(r'\b%s\b' % v, '%%[%s]' % v, code)
    data = {
        'input': ['up S u_p', 'rp D r_p'],
        'input_output': ['vp +c v_p'],
        'clobber': 'cc memory %rdx ' + ' '.join(scratch),
        'macro_name': 'mul6_broadwell',
        'macro_parameters': 'r_p u_p v_p',
        'source': os.path.basename(sys.argv[0]),
        'code_language': 'asm',
    }
    P.write_cpp_code(out, code, data)
    out.write('\n')
    for i in g_wr_code.strip().split('\n'):
        out.write(P.append_backslash(i, 88))
    out.write('    }\n')
Beispiel #2
0
def do_it(tgt):
    data = {
        'macro_name': 'mpn_mul2_add_4k',
        'scratch': ['w%s s%s' % (i, i) for i in range(4)],
        'vars_type': dict([('s%s' % i, 0) for i in range(4)]),
        'default_type': 'mp_limb_t',
        'input_output': ['rp +r r_p', 'up +r u_p', 'vp +r v_p', 'lc +c k'],
        'clobber': 'memory cc',
        'source': os.path.basename(sys.argv[0]),
        'code_language': 'asm',
        'macro_parameters': 'r_p u_p v_p k',
    }

    all_vars = P.extract_int_vars_name(data['scratch']) + \
            P.extract_int_vars_name(data['input_output'])
    code = g_code.strip()
    for v in all_vars:
        code = re.sub(r'\b%s\b' % v, '%%[%s]' % v, code)
    for l in 'loop nearly_done'.split(' '):
        code = re.sub(r'\b%s\b' % l, l + '%=', code)

    P.write_cpp_code(tgt, code, data)

    # append wrapper code
    tgt.write('\n')
    for i in g_wr_code.strip().split('\n'):
        tgt.write(P.append_backslash(i, 77))
    tgt.write('    }\n')
Beispiel #3
0
def cook_macro(o, code, xmm_save, var_map):
    #discard save and restore instructions, and comments
    code = [c for c in code if (c.find('!') == -1) and (c.find('#') == -1)]

    code = '\n'.join(code)
    code = P.replace_symbolic_names_wr(code, var_map)
    code = code.replace('%', '%%')
    scratch = extract_register_name(var_map) - set(['rdx', 'rdi', 'rsi'])

    data = {
        'input': ['rp D r_p'],
        'input_output': ['up +S u_p', 'vp +d v_p'],
        'macro_name': P.guess_subroutine_name(sys.argv[1]) + '_macro',
        'macro_parameters': 'r_p u_p v_p',
        'source': os.path.basename(sys.argv[0]),
        'code_language': 'asm',
        'clobber': 'cc memory ' + ' '.join(['%' + s for s in scratch]),
    }

    P.write_cpp_code(o, code, data)
    o.write('\n')
    n = data['macro_name']
    ww = g_wr_code.strip().replace('@w', n + '_wr').replace('@n',
                                                            n).split('\n')
    for w in ww:
        o.write(P.append_backslash(w, 84))
    o.write('    }\n')
def do_it(tgt):
    data = {
        'macro_name': 'mpn_bdiv_dbm1c_4k_inplace',
        'scratch': ['w%s s%s' % (i, i) for i in range(4)],
        'vars_type': dict([('s%s' % i, 0) for i in range(4)]),
        'default_type': 'mp_limb_t',
        'input_output': ['rp +r r_p', 'mm +d m', 'nn +r n'],
        'clobber': 'memory cc',
        'source': os.path.basename(sys.argv[0]),
        'code_language': 'asm',
        'macro_parameters': 'r_p n m',
    }

    all_vars = P.extract_int_vars_name(data['scratch']) + \
            P.extract_int_vars_name(data['input_output'])
    code = g_code.strip()
    for v in all_vars:
        code = re.sub(r'\b%s\b' % v, '%%[%s]' % v, code)
    for i in 'loop enter_here'.split(' '):
        code = re.sub(r'\b%s\b' % i, i + '%=', code + ' ').rstrip()

    P.write_cpp_code(tgt, code, data)
    tgt.write('\n')
    for i in g_wr_code.strip().split('\n'):
        tgt.write(P.append_backslash(i, 88))
    tgt.write('    }\n')
    tgt.write(g_func_code)
def do_it(tgt):
    data = {
        'macro_name': 'mpn_bdiv_dbm1c_4k',
        'input_output': ['rp +r r_p', 'up +r u_p', 'mm +d m_m', 'nn +r n'],
        'clobber': 'memory cc %rax %rcx %r8',
        'source': os.path.basename(sys.argv[0]),
        'code_language': 'asm',
        'macro_parameters': 'r_p u_p n m_m',
    }

    code = re.sub(r'\baa\b', '%%rax', g_code.strip())
    code = re.sub(r'\bdd\b', '%%rcx', code)
    code = re.sub(r'\bhh\b', '%%r8', code)
    for i in 'loop tail enter_here'.split(' '):
        code = re.sub(r'\b%s\b' % i, i + '%=', code + ' ').rstrip()
    for v in 'rp up mm nn'.split(' '):
        code = re.sub(r'\b%s\b' % v, '%%[%s]' % v, code)

    P.write_cpp_code(tgt, code, data)
    tgt.write('\n')
    for i in g_wr_code.strip().split('\n'):
        tgt.write(P.append_backslash(i, 88))
    tgt.write('    }\n')
    tgt.write(g_func_code)