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')
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')
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)