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