1#!/usr/bin/env python3
2
3##
4##  Copyright(c) 2019-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
5##
6##  This program is free software; you can redistribute it and/or modify
7##  it under the terms of the GNU General Public License as published by
8##  the Free Software Foundation; either version 2 of the License, or
9##  (at your option) any later version.
10##
11##  This program is distributed in the hope that it will be useful,
12##  but WITHOUT ANY WARRANTY; without even the implied warranty of
13##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14##  GNU General Public License for more details.
15##
16##  You should have received a copy of the GNU General Public License
17##  along with this program; if not, see <http://www.gnu.org/licenses/>.
18##
19
20import sys
21import re
22import string
23import hex_common
24
25##
26## Generate the DEF_HELPER prototype for an instruction
27##     For A2_add: Rd32=add(Rs32,Rt32)
28##     We produce:
29##         DEF_HELPER_3(A2_add, s32, env, s32, s32)
30##
31def gen_helper_prototype(f, tag, tagregs, tagimms):
32    regs = tagregs[tag]
33    imms = tagimms[tag]
34
35    declared = []
36    ret_type = hex_common.helper_ret_type(tag, regs).proto_arg
37    declared.append(ret_type)
38
39    for arg in hex_common.helper_args(tag, regs, imms):
40        declared.append(arg.proto_arg)
41
42    arguments = ", ".join(declared)
43
44    ## Add the TCG_CALL_NO_RWG_SE flag to helpers that don't take the env
45    ## argument and aren't HVX instructions.  Since HVX instructions take
46    ## pointers to their arguments, they will have side effects.
47    if hex_common.need_env(tag) or hex_common.is_hvx_insn(tag):
48        f.write(f"DEF_HELPER_{len(declared) - 1}({tag}, {arguments})\n")
49    else:
50        f.write(f"DEF_HELPER_FLAGS_{len(declared) - 1}({tag}, "
51                f"TCG_CALL_NO_RWG_SE, {arguments})\n")
52
53
54def main():
55    hex_common.read_common_files()
56    tagregs = hex_common.get_tagregs()
57    tagimms = hex_common.get_tagimms()
58
59    output_file = sys.argv[-1]
60    with open(output_file, "w") as f:
61        for tag in hex_common.tags:
62            ## Skip the priv instructions
63            if "A_PRIV" in hex_common.attribdict[tag]:
64                continue
65            ## Skip the guest instructions
66            if "A_GUEST" in hex_common.attribdict[tag]:
67                continue
68            ## Skip the diag instructions
69            if tag == "Y6_diag":
70                continue
71            if tag == "Y6_diag0":
72                continue
73            if tag == "Y6_diag1":
74                continue
75
76            if hex_common.skip_qemu_helper(tag):
77                continue
78            if hex_common.is_idef_parser_enabled(tag):
79                continue
80
81            gen_helper_prototype(f, tag, tagregs, tagimms)
82
83
84if __name__ == "__main__":
85    main()
86