1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/env python 2*4bdc9457SAndroid Build Coastguard Worker# Copyright 2022 Google LLC 3*4bdc9457SAndroid Build Coastguard Worker# 4*4bdc9457SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 5*4bdc9457SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 6*4bdc9457SAndroid Build Coastguard Worker 7*4bdc9457SAndroid Build Coastguard Worker# Dumps JIT codegen given specific JIT parameters. 8*4bdc9457SAndroid Build Coastguard Worker# Usage is similar to xngen: 9*4bdc9457SAndroid Build Coastguard Worker# dump-jit-output.py <path to JIT cc file> --max_mr=6 [--clamp_min] 10*4bdc9457SAndroid Build Coastguard Worker# E.g. 11*4bdc9457SAndroid Build Coastguard Worker# ./tools/dump-jit-output.py \ 12*4bdc9457SAndroid Build Coastguard Worker# src/f32-gemm/upto6x8-aarch64-neonfma-cortex-a75.cc 13*4bdc9457SAndroid Build Coastguard Worker# --max_mr=6 14*4bdc9457SAndroid Build Coastguard Worker# 15*4bdc9457SAndroid Build Coastguard Worker# The parameters prefetch, clamp_min, clamp_max defaults to True if not 16*4bdc9457SAndroid Build Coastguard Worker# specified on the command line. 17*4bdc9457SAndroid Build Coastguard Worker 18*4bdc9457SAndroid Build Coastguard Workerimport argparse 19*4bdc9457SAndroid Build Coastguard Workerimport codecs 20*4bdc9457SAndroid Build Coastguard Workerimport re 21*4bdc9457SAndroid Build Coastguard Workerimport sys 22*4bdc9457SAndroid Build Coastguard Workerimport xngen 23*4bdc9457SAndroid Build Coastguard Workerfrom itertools import chain 24*4bdc9457SAndroid Build Coastguard Worker 25*4bdc9457SAndroid Build Coastguard Worker 26*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser(description='Dump output of JIT') 27*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("input", metavar="FILE", nargs=1, 28*4bdc9457SAndroid Build Coastguard Worker help="Input file") 29*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("--prefetch", action="store_true") 30*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("--clamp_min", action="store_true") 31*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("--clamp_max", action="store_true") 32*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("--max_mr", type=int, required=True) 33*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("-o", "--output", 34*4bdc9457SAndroid Build Coastguard Worker help='Output file') 35*4bdc9457SAndroid Build Coastguard Workerparser.set_defaults(defines=list()) 36*4bdc9457SAndroid Build Coastguard Worker 37*4bdc9457SAndroid Build Coastguard Worker 38*4bdc9457SAndroid Build Coastguard Workerdef preprocess(input_text): 39*4bdc9457SAndroid Build Coastguard Worker input_lines = input_text.splitlines() 40*4bdc9457SAndroid Build Coastguard Worker in_function = False 41*4bdc9457SAndroid Build Coastguard Worker output = [] 42*4bdc9457SAndroid Build Coastguard Worker for i, line in enumerate(input_lines): 43*4bdc9457SAndroid Build Coastguard Worker if line.startswith('void Generator::generate'): 44*4bdc9457SAndroid Build Coastguard Worker in_function = True 45*4bdc9457SAndroid Build Coastguard Worker if not in_function: 46*4bdc9457SAndroid Build Coastguard Worker continue 47*4bdc9457SAndroid Build Coastguard Worker if line == '}': 48*4bdc9457SAndroid Build Coastguard Worker in_function = False 49*4bdc9457SAndroid Build Coastguard Worker output.append(line) 50*4bdc9457SAndroid Build Coastguard Worker continue 51*4bdc9457SAndroid Build Coastguard Worker if line.strip() == '}': 52*4bdc9457SAndroid Build Coastguard Worker continue 53*4bdc9457SAndroid Build Coastguard Worker 54*4bdc9457SAndroid Build Coastguard Worker o = re.sub(r'(if|else)( +\(.*\)) +{', r'$\1\2:', line) 55*4bdc9457SAndroid Build Coastguard Worker o = re.sub(r'&&', 'and', o) 56*4bdc9457SAndroid Build Coastguard Worker o = re.sub(r'\|\|', 'or', o) 57*4bdc9457SAndroid Build Coastguard Worker output.append(o) 58*4bdc9457SAndroid Build Coastguard Worker return output 59*4bdc9457SAndroid Build Coastguard Worker 60*4bdc9457SAndroid Build Coastguard Worker 61*4bdc9457SAndroid Build Coastguard Workerdef call_xngen(text, options): 62*4bdc9457SAndroid Build Coastguard Worker input_globals = { 63*4bdc9457SAndroid Build Coastguard Worker 'prefetch': options.prefetch, 64*4bdc9457SAndroid Build Coastguard Worker 'clamp_min': options.clamp_min, 65*4bdc9457SAndroid Build Coastguard Worker 'clamp_max': options.clamp_max, 66*4bdc9457SAndroid Build Coastguard Worker 'max_mr': options.max_mr, 67*4bdc9457SAndroid Build Coastguard Worker } 68*4bdc9457SAndroid Build Coastguard Worker return xngen.preprocess(text, input_globals, "codegen") 69*4bdc9457SAndroid Build Coastguard Worker 70*4bdc9457SAndroid Build Coastguard Worker 71*4bdc9457SAndroid Build Coastguard Workerdef main(args): 72*4bdc9457SAndroid Build Coastguard Worker options = parser.parse_args(args) 73*4bdc9457SAndroid Build Coastguard Worker input_text = codecs.open(options.input[0], "r", encoding="utf-8").read() 74*4bdc9457SAndroid Build Coastguard Worker output = preprocess(input_text) 75*4bdc9457SAndroid Build Coastguard Worker result = call_xngen("\n".join(output), options) 76*4bdc9457SAndroid Build Coastguard Worker if (options.output): 77*4bdc9457SAndroid Build Coastguard Worker with codecs.open(options.output, "w", encoding="utf-8") as output_file: 78*4bdc9457SAndroid Build Coastguard Worker output_file.write(result) 79*4bdc9457SAndroid Build Coastguard Worker else: 80*4bdc9457SAndroid Build Coastguard Worker print(result) 81*4bdc9457SAndroid Build Coastguard Worker 82*4bdc9457SAndroid Build Coastguard Worker 83*4bdc9457SAndroid Build Coastguard Workerif __name__ == "__main__": 84*4bdc9457SAndroid Build Coastguard Worker main(sys.argv[1:]) 85