xref: /aosp_15_r20/external/XNNPACK/tools/dump-jit-output.py (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
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