xref: /qemu/target/hexagon/gen_idef_parser_funcs.py (revision 7c19dcc5646aef8ef31d453adf81becdcfb43c19)
1*7c19dcc5SAlessandro Di Federico#!/usr/bin/env python3
2*7c19dcc5SAlessandro Di Federico
3*7c19dcc5SAlessandro Di Federico##
4*7c19dcc5SAlessandro Di Federico##  Copyright(c) 2019-2022 rev.ng Labs Srl. All Rights Reserved.
5*7c19dcc5SAlessandro Di Federico##
6*7c19dcc5SAlessandro Di Federico##  This program is free software; you can redistribute it and/or modify
7*7c19dcc5SAlessandro Di Federico##  it under the terms of the GNU General Public License as published by
8*7c19dcc5SAlessandro Di Federico##  the Free Software Foundation; either version 2 of the License, or
9*7c19dcc5SAlessandro Di Federico##  (at your option) any later version.
10*7c19dcc5SAlessandro Di Federico##
11*7c19dcc5SAlessandro Di Federico##  This program is distributed in the hope that it will be useful,
12*7c19dcc5SAlessandro Di Federico##  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*7c19dcc5SAlessandro Di Federico##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*7c19dcc5SAlessandro Di Federico##  GNU General Public License for more details.
15*7c19dcc5SAlessandro Di Federico##
16*7c19dcc5SAlessandro Di Federico##  You should have received a copy of the GNU General Public License
17*7c19dcc5SAlessandro Di Federico##  along with this program; if not, see <http://www.gnu.org/licenses/>.
18*7c19dcc5SAlessandro Di Federico##
19*7c19dcc5SAlessandro Di Federico
20*7c19dcc5SAlessandro Di Federicoimport sys
21*7c19dcc5SAlessandro Di Federicoimport re
22*7c19dcc5SAlessandro Di Federicoimport string
23*7c19dcc5SAlessandro Di Federicofrom io import StringIO
24*7c19dcc5SAlessandro Di Federico
25*7c19dcc5SAlessandro Di Federicoimport hex_common
26*7c19dcc5SAlessandro Di Federico
27*7c19dcc5SAlessandro Di Federico##
28*7c19dcc5SAlessandro Di Federico## Generate code to be fed to the idef_parser
29*7c19dcc5SAlessandro Di Federico##
30*7c19dcc5SAlessandro Di Federico## Consider A2_add:
31*7c19dcc5SAlessandro Di Federico##
32*7c19dcc5SAlessandro Di Federico##     Rd32=add(Rs32,Rt32), { RdV=RsV+RtV;}
33*7c19dcc5SAlessandro Di Federico##
34*7c19dcc5SAlessandro Di Federico## We produce:
35*7c19dcc5SAlessandro Di Federico##
36*7c19dcc5SAlessandro Di Federico##     A2_add(RdV, in RsV, in RtV) {
37*7c19dcc5SAlessandro Di Federico##       { RdV=RsV+RtV;}
38*7c19dcc5SAlessandro Di Federico##     }
39*7c19dcc5SAlessandro Di Federico##
40*7c19dcc5SAlessandro Di Federico## A2_add represents the instruction tag. Then we have a list of TCGv
41*7c19dcc5SAlessandro Di Federico## that the code generated by the parser can expect in input. Some of
42*7c19dcc5SAlessandro Di Federico## them are inputs ("in" prefix), while some others are outputs.
43*7c19dcc5SAlessandro Di Federico##
44*7c19dcc5SAlessandro Di Federicodef main():
45*7c19dcc5SAlessandro Di Federico    hex_common.read_semantics_file(sys.argv[1])
46*7c19dcc5SAlessandro Di Federico    hex_common.read_attribs_file(sys.argv[2])
47*7c19dcc5SAlessandro Di Federico    hex_common.calculate_attribs()
48*7c19dcc5SAlessandro Di Federico    tagregs = hex_common.get_tagregs()
49*7c19dcc5SAlessandro Di Federico    tagimms = hex_common.get_tagimms()
50*7c19dcc5SAlessandro Di Federico
51*7c19dcc5SAlessandro Di Federico    with open(sys.argv[3], 'w') as f:
52*7c19dcc5SAlessandro Di Federico        f.write('#include "macros.inc"\n\n')
53*7c19dcc5SAlessandro Di Federico
54*7c19dcc5SAlessandro Di Federico        for tag in hex_common.tags:
55*7c19dcc5SAlessandro Di Federico            ## Skip the priv instructions
56*7c19dcc5SAlessandro Di Federico            if ( "A_PRIV" in hex_common.attribdict[tag] ) :
57*7c19dcc5SAlessandro Di Federico                continue
58*7c19dcc5SAlessandro Di Federico            ## Skip the guest instructions
59*7c19dcc5SAlessandro Di Federico            if ( "A_GUEST" in hex_common.attribdict[tag] ) :
60*7c19dcc5SAlessandro Di Federico                continue
61*7c19dcc5SAlessandro Di Federico            ## Skip instructions that saturate in a ternary expression
62*7c19dcc5SAlessandro Di Federico            if ( tag in {'S2_asr_r_r_sat', 'S2_asl_r_r_sat'} ) :
63*7c19dcc5SAlessandro Di Federico                continue
64*7c19dcc5SAlessandro Di Federico            ## Skip instructions using switch
65*7c19dcc5SAlessandro Di Federico            if ( tag in {'S4_vrcrotate_acc', 'S4_vrcrotate'} ) :
66*7c19dcc5SAlessandro Di Federico                continue
67*7c19dcc5SAlessandro Di Federico            ## Skip trap instructions
68*7c19dcc5SAlessandro Di Federico            if ( tag in {'J2_trap0', 'J2_trap1'} ) :
69*7c19dcc5SAlessandro Di Federico                continue
70*7c19dcc5SAlessandro Di Federico            ## Skip 128-bit instructions
71*7c19dcc5SAlessandro Di Federico            if ( tag in {'A7_croundd_ri', 'A7_croundd_rr'} ) :
72*7c19dcc5SAlessandro Di Federico                continue
73*7c19dcc5SAlessandro Di Federico            if ( tag in {'M7_wcmpyrw', 'M7_wcmpyrwc',
74*7c19dcc5SAlessandro Di Federico                         'M7_wcmpyiw', 'M7_wcmpyiwc',
75*7c19dcc5SAlessandro Di Federico                         'M7_wcmpyrw_rnd', 'M7_wcmpyrwc_rnd',
76*7c19dcc5SAlessandro Di Federico                         'M7_wcmpyiw_rnd', 'M7_wcmpyiwc_rnd'} ) :
77*7c19dcc5SAlessandro Di Federico                continue
78*7c19dcc5SAlessandro Di Federico            ## Skip interleave/deinterleave instructions
79*7c19dcc5SAlessandro Di Federico            if ( tag in {'S2_interleave', 'S2_deinterleave'} ) :
80*7c19dcc5SAlessandro Di Federico                continue
81*7c19dcc5SAlessandro Di Federico            ## Skip instructions using bit reverse
82*7c19dcc5SAlessandro Di Federico            if ( tag in {'S2_brev', 'S2_brevp', 'S2_ct0', 'S2_ct1',
83*7c19dcc5SAlessandro Di Federico                         'S2_ct0p', 'S2_ct1p', 'A4_tlbmatch'} ) :
84*7c19dcc5SAlessandro Di Federico                continue
85*7c19dcc5SAlessandro Di Federico            ## Skip other unsupported instructions
86*7c19dcc5SAlessandro Di Federico            if ( tag == 'S2_cabacdecbin' or tag == 'A5_ACS' ) :
87*7c19dcc5SAlessandro Di Federico                continue
88*7c19dcc5SAlessandro Di Federico            if ( tag.startswith('Y') ) :
89*7c19dcc5SAlessandro Di Federico                continue
90*7c19dcc5SAlessandro Di Federico            if ( tag.startswith('V6_') ) :
91*7c19dcc5SAlessandro Di Federico                continue
92*7c19dcc5SAlessandro Di Federico            if ( tag.startswith('F') ) :
93*7c19dcc5SAlessandro Di Federico                continue
94*7c19dcc5SAlessandro Di Federico            if ( tag.endswith('_locked') ) :
95*7c19dcc5SAlessandro Di Federico                continue
96*7c19dcc5SAlessandro Di Federico            if ( "A_COF" in hex_common.attribdict[tag] ) :
97*7c19dcc5SAlessandro Di Federico                continue
98*7c19dcc5SAlessandro Di Federico
99*7c19dcc5SAlessandro Di Federico            regs = tagregs[tag]
100*7c19dcc5SAlessandro Di Federico            imms = tagimms[tag]
101*7c19dcc5SAlessandro Di Federico
102*7c19dcc5SAlessandro Di Federico            arguments = []
103*7c19dcc5SAlessandro Di Federico            for regtype,regid,toss,numregs in regs:
104*7c19dcc5SAlessandro Di Federico                prefix = "in " if hex_common.is_read(regid) else ""
105*7c19dcc5SAlessandro Di Federico
106*7c19dcc5SAlessandro Di Federico                is_pair = hex_common.is_pair(regid)
107*7c19dcc5SAlessandro Di Federico                is_single_old = (hex_common.is_single(regid)
108*7c19dcc5SAlessandro Di Federico                                 and hex_common.is_old_val(regtype, regid, tag))
109*7c19dcc5SAlessandro Di Federico                is_single_new = (hex_common.is_single(regid)
110*7c19dcc5SAlessandro Di Federico                                 and hex_common.is_new_val(regtype, regid, tag))
111*7c19dcc5SAlessandro Di Federico
112*7c19dcc5SAlessandro Di Federico                if is_pair or is_single_old:
113*7c19dcc5SAlessandro Di Federico                    arguments.append("%s%s%sV" % (prefix, regtype, regid))
114*7c19dcc5SAlessandro Di Federico                elif is_single_new:
115*7c19dcc5SAlessandro Di Federico                    arguments.append("%s%s%sN" % (prefix, regtype, regid))
116*7c19dcc5SAlessandro Di Federico                else:
117*7c19dcc5SAlessandro Di Federico                    print("Bad register parse: ",regtype,regid,toss,numregs)
118*7c19dcc5SAlessandro Di Federico
119*7c19dcc5SAlessandro Di Federico            for immlett,bits,immshift in imms:
120*7c19dcc5SAlessandro Di Federico                arguments.append(hex_common.imm_name(immlett))
121*7c19dcc5SAlessandro Di Federico
122*7c19dcc5SAlessandro Di Federico            f.write("%s(%s) {\n" % (tag, ", ".join(arguments)))
123*7c19dcc5SAlessandro Di Federico            f.write("    ");
124*7c19dcc5SAlessandro Di Federico            if hex_common.need_ea(tag):
125*7c19dcc5SAlessandro Di Federico                f.write("size4u_t EA; ");
126*7c19dcc5SAlessandro Di Federico            f.write("%s\n" % hex_common.semdict[tag])
127*7c19dcc5SAlessandro Di Federico            f.write("}\n\n")
128*7c19dcc5SAlessandro Di Federico
129*7c19dcc5SAlessandro Di Federicoif __name__ == "__main__":
130*7c19dcc5SAlessandro Di Federico    main()
131