1#!/usr/bin/env python3 2 3## 4## Copyright(c) 2019-2023 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 f.write(f"DEF_HELPER_{len(declared) - 1}({tag}, {arguments})\n") 44 45 46def main(): 47 hex_common.read_semantics_file(sys.argv[1]) 48 hex_common.read_attribs_file(sys.argv[2]) 49 hex_common.read_overrides_file(sys.argv[3]) 50 hex_common.read_overrides_file(sys.argv[4]) 51 ## Whether or not idef-parser is enabled is 52 ## determined by the number of arguments to 53 ## this script: 54 ## 55 ## 5 args. -> not enabled, 56 ## 6 args. -> idef-parser enabled. 57 ## 58 ## The 6:th arg. then holds a list of the successfully 59 ## parsed instructions. 60 is_idef_parser_enabled = len(sys.argv) > 6 61 if is_idef_parser_enabled: 62 hex_common.read_idef_parser_enabled_file(sys.argv[5]) 63 hex_common.calculate_attribs() 64 hex_common.init_registers() 65 tagregs = hex_common.get_tagregs() 66 tagimms = hex_common.get_tagimms() 67 68 output_file = sys.argv[-1] 69 with open(output_file, "w") as f: 70 for tag in hex_common.tags: 71 ## Skip the priv instructions 72 if "A_PRIV" in hex_common.attribdict[tag]: 73 continue 74 ## Skip the guest instructions 75 if "A_GUEST" in hex_common.attribdict[tag]: 76 continue 77 ## Skip the diag instructions 78 if tag == "Y6_diag": 79 continue 80 if tag == "Y6_diag0": 81 continue 82 if tag == "Y6_diag1": 83 continue 84 85 if hex_common.skip_qemu_helper(tag): 86 continue 87 if hex_common.is_idef_parser_enabled(tag): 88 continue 89 90 gen_helper_prototype(f, tag, tagregs, tagimms) 91 92 93if __name__ == "__main__": 94 main() 95