The attribinfo data structure is not used Adjust the command-line arguments to the python scripts Add hex_common.read_common_files for TCG/helper generation scripts Signed-off-by: Taylor Simpson <ltaylorsimpson@gmail.com> Reviewed-by: Brian Cain <bcain@quicinc.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20240307032327.4799-10-ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <bcain@quicinc.com>
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
 | 
						|
##
 | 
						|
##  Copyright(c) 2019-2024 rev.ng Labs Srl. All Rights Reserved.
 | 
						|
##
 | 
						|
##  This program is free software; you can redistribute it and/or modify
 | 
						|
##  it under the terms of the GNU General Public License as published by
 | 
						|
##  the Free Software Foundation; either version 2 of the License, or
 | 
						|
##  (at your option) any later version.
 | 
						|
##
 | 
						|
##  This program is distributed in the hope that it will be useful,
 | 
						|
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
##  GNU General Public License for more details.
 | 
						|
##
 | 
						|
##  You should have received a copy of the GNU General Public License
 | 
						|
##  along with this program; if not, see <http://www.gnu.org/licenses/>.
 | 
						|
##
 | 
						|
 | 
						|
import sys
 | 
						|
import re
 | 
						|
import string
 | 
						|
from io import StringIO
 | 
						|
 | 
						|
import hex_common
 | 
						|
 | 
						|
 | 
						|
##
 | 
						|
## Generate code to be fed to the idef_parser
 | 
						|
##
 | 
						|
## Consider A2_add:
 | 
						|
##
 | 
						|
##     Rd32=add(Rs32,Rt32), { RdV=RsV+RtV;}
 | 
						|
##
 | 
						|
## We produce:
 | 
						|
##
 | 
						|
##     A2_add(RdV, in RsV, in RtV) {
 | 
						|
##       { RdV=RsV+RtV;}
 | 
						|
##     }
 | 
						|
##
 | 
						|
## A2_add represents the instruction tag. Then we have a list of TCGv
 | 
						|
## that the code generated by the parser can expect in input. Some of
 | 
						|
## them are inputs ("in" prefix), while some others are outputs.
 | 
						|
##
 | 
						|
def main():
 | 
						|
    hex_common.read_semantics_file(sys.argv[1])
 | 
						|
    hex_common.calculate_attribs()
 | 
						|
    hex_common.init_registers()
 | 
						|
    tagregs = hex_common.get_tagregs()
 | 
						|
    tagimms = hex_common.get_tagimms()
 | 
						|
 | 
						|
    with open(sys.argv[-1], "w") as f:
 | 
						|
        f.write('#include "macros.inc"\n\n')
 | 
						|
 | 
						|
        for tag in hex_common.tags:
 | 
						|
            ## Skip the priv instructions
 | 
						|
            if "A_PRIV" in hex_common.attribdict[tag]:
 | 
						|
                continue
 | 
						|
            ## Skip the guest instructions
 | 
						|
            if "A_GUEST" in hex_common.attribdict[tag]:
 | 
						|
                continue
 | 
						|
            ## Skip instructions that saturate in a ternary expression
 | 
						|
            if tag in {"S2_asr_r_r_sat", "S2_asl_r_r_sat"}:
 | 
						|
                continue
 | 
						|
            ## Skip instructions using switch
 | 
						|
            if tag in {"S4_vrcrotate_acc", "S4_vrcrotate"}:
 | 
						|
                continue
 | 
						|
            ## Skip trap instructions
 | 
						|
            if tag in {"J2_trap0", "J2_trap1"}:
 | 
						|
                continue
 | 
						|
            ## Skip 128-bit instructions
 | 
						|
            if tag in {"A7_croundd_ri", "A7_croundd_rr"}:
 | 
						|
                continue
 | 
						|
            if tag in {
 | 
						|
                "M7_wcmpyrw",
 | 
						|
                "M7_wcmpyrwc",
 | 
						|
                "M7_wcmpyiw",
 | 
						|
                "M7_wcmpyiwc",
 | 
						|
                "M7_wcmpyrw_rnd",
 | 
						|
                "M7_wcmpyrwc_rnd",
 | 
						|
                "M7_wcmpyiw_rnd",
 | 
						|
                "M7_wcmpyiwc_rnd",
 | 
						|
            }:
 | 
						|
                continue
 | 
						|
            ## Skip interleave/deinterleave instructions
 | 
						|
            if tag in {"S2_interleave", "S2_deinterleave"}:
 | 
						|
                continue
 | 
						|
            ## Skip instructions using bit reverse
 | 
						|
            if tag in {
 | 
						|
                "S2_brev",
 | 
						|
                "S2_brevp",
 | 
						|
                "S2_ct0",
 | 
						|
                "S2_ct1",
 | 
						|
                "S2_ct0p",
 | 
						|
                "S2_ct1p",
 | 
						|
                "A4_tlbmatch",
 | 
						|
            }:
 | 
						|
                continue
 | 
						|
            ## Skip other unsupported instructions
 | 
						|
            if tag == "S2_cabacdecbin" or tag == "A5_ACS":
 | 
						|
                continue
 | 
						|
            if tag.startswith("Y"):
 | 
						|
                continue
 | 
						|
            if tag.startswith("V6_"):
 | 
						|
                continue
 | 
						|
            if ( tag.startswith("F") and
 | 
						|
                 tag not in {
 | 
						|
                     "F2_sfimm_p",
 | 
						|
                     "F2_sfimm_n",
 | 
						|
                     "F2_dfimm_p",
 | 
						|
                     "F2_dfimm_n",
 | 
						|
                     "F2_dfmpyll",
 | 
						|
                     "F2_dfmpylh"
 | 
						|
                 }):
 | 
						|
                continue
 | 
						|
            if tag.endswith("_locked"):
 | 
						|
                continue
 | 
						|
            if "A_COF" in hex_common.attribdict[tag]:
 | 
						|
                continue
 | 
						|
            if ( tag.startswith('R6_release_') ):
 | 
						|
                continue
 | 
						|
            ## Skip instructions that are incompatible with short-circuit
 | 
						|
            ## packet register writes
 | 
						|
            if ( tag == 'S2_insert' or
 | 
						|
                 tag == 'S2_insert_rp' or
 | 
						|
                 tag == 'S2_asr_r_svw_trun' or
 | 
						|
                 tag == 'A2_swiz' ):
 | 
						|
                continue
 | 
						|
 | 
						|
            regs = tagregs[tag]
 | 
						|
            imms = tagimms[tag]
 | 
						|
 | 
						|
            arguments = []
 | 
						|
            for regtype, regid in regs:
 | 
						|
                reg = hex_common.get_register(tag, regtype, regid)
 | 
						|
                prefix = "in " if reg.is_read() else ""
 | 
						|
                arguments.append(f"{prefix}{reg.reg_tcg()}")
 | 
						|
 | 
						|
            for immlett, bits, immshift in imms:
 | 
						|
                arguments.append(hex_common.imm_name(immlett))
 | 
						|
 | 
						|
            f.write(f"{tag}({', '.join(arguments)}) {{\n")
 | 
						|
            f.write("    ")
 | 
						|
            if hex_common.need_ea(tag):
 | 
						|
                f.write("size4u_t EA; ")
 | 
						|
            f.write(f"{hex_common.semdict[tag]}\n")
 | 
						|
            f.write("}\n\n")
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |