xref: /qemu/target/hexagon/gen_semantics.c (revision 144da357)
1f7a9e80dSTaylor Simpson /*
2f7a9e80dSTaylor Simpson  *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
3f7a9e80dSTaylor Simpson  *
4f7a9e80dSTaylor Simpson  *  This program is free software; you can redistribute it and/or modify
5f7a9e80dSTaylor Simpson  *  it under the terms of the GNU General Public License as published by
6f7a9e80dSTaylor Simpson  *  the Free Software Foundation; either version 2 of the License, or
7f7a9e80dSTaylor Simpson  *  (at your option) any later version.
8f7a9e80dSTaylor Simpson  *
9f7a9e80dSTaylor Simpson  *  This program is distributed in the hope that it will be useful,
10f7a9e80dSTaylor Simpson  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11f7a9e80dSTaylor Simpson  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12f7a9e80dSTaylor Simpson  *  GNU General Public License for more details.
13f7a9e80dSTaylor Simpson  *
14f7a9e80dSTaylor Simpson  *  You should have received a copy of the GNU General Public License
15f7a9e80dSTaylor Simpson  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
16f7a9e80dSTaylor Simpson  */
17f7a9e80dSTaylor Simpson 
18f7a9e80dSTaylor Simpson /*
19f7a9e80dSTaylor Simpson  * This program generates the semantics file that is processed by
20f7a9e80dSTaylor Simpson  * the do_qemu.py script.  We use the C preporcessor to manipulate the
21f7a9e80dSTaylor Simpson  * files imported from the Hexagon architecture library.
22f7a9e80dSTaylor Simpson  */
23f7a9e80dSTaylor Simpson 
24f7a9e80dSTaylor Simpson #include <stdio.h>
25f7a9e80dSTaylor Simpson #define STRINGIZE(X) #X
26f7a9e80dSTaylor Simpson 
main(int argc,char * argv[])27f7a9e80dSTaylor Simpson int main(int argc, char *argv[])
28f7a9e80dSTaylor Simpson {
29f7a9e80dSTaylor Simpson     FILE *outfile;
30f7a9e80dSTaylor Simpson 
31f7a9e80dSTaylor Simpson     if (argc != 2) {
32f7a9e80dSTaylor Simpson         fprintf(stderr, "Usage: gen_semantics ouptputfile\n");
33f7a9e80dSTaylor Simpson         return 1;
34f7a9e80dSTaylor Simpson     }
35f7a9e80dSTaylor Simpson     outfile = fopen(argv[1], "w");
36f7a9e80dSTaylor Simpson     if (outfile == NULL) {
37f7a9e80dSTaylor Simpson         fprintf(stderr, "Cannot open %s for writing\n", argv[1]);
38f7a9e80dSTaylor Simpson         return 1;
39f7a9e80dSTaylor Simpson     }
40f7a9e80dSTaylor Simpson 
41f7a9e80dSTaylor Simpson /*
42f7a9e80dSTaylor Simpson  * Process the instruction definitions
43f7a9e80dSTaylor Simpson  *     Scalar core instructions have the following form
44f7a9e80dSTaylor Simpson  *         Q6INSN(A2_add,"Rd32=add(Rs32,Rt32)",ATTRIBS(),
45f7a9e80dSTaylor Simpson  *         "Add 32-bit registers",
46f7a9e80dSTaylor Simpson  *         { RdV=RsV+RtV;})
47*144da357STaylor Simpson  *     HVX instructions have the following form
48*144da357STaylor Simpson  *         EXTINSN(V6_vinsertwr, "Vx32.w=vinsert(Rt32)",
49*144da357STaylor Simpson  *         ATTRIBS(A_EXTENSION,A_CVI,A_CVI_VX),
50*144da357STaylor Simpson  *         "Insert Word Scalar into Vector",
51*144da357STaylor Simpson  *         VxV.uw[0] = RtV;)
52f7a9e80dSTaylor Simpson  */
53f7a9e80dSTaylor Simpson #define Q6INSN(TAG, BEH, ATTRIBS, DESCR, SEM) \
54f7a9e80dSTaylor Simpson     do { \
55f7a9e80dSTaylor Simpson         fprintf(outfile, "SEMANTICS( \\\n" \
56f7a9e80dSTaylor Simpson                          "    \"%s\", \\\n" \
57f7a9e80dSTaylor Simpson                          "    %s, \\\n" \
58f7a9e80dSTaylor Simpson                          "    \"\"\"%s\"\"\" \\\n" \
59f7a9e80dSTaylor Simpson                          ")\n", \
60f7a9e80dSTaylor Simpson                 #TAG, STRINGIZE(BEH), STRINGIZE(SEM)); \
61f7a9e80dSTaylor Simpson         fprintf(outfile, "ATTRIBUTES( \\\n" \
62f7a9e80dSTaylor Simpson                          "    \"%s\", \\\n" \
63f7a9e80dSTaylor Simpson                          "    \"%s\" \\\n" \
64f7a9e80dSTaylor Simpson                          ")\n", \
65f7a9e80dSTaylor Simpson                 #TAG, STRINGIZE(ATTRIBS)); \
66f7a9e80dSTaylor Simpson     } while (0);
67*144da357STaylor Simpson #define EXTINSN(TAG, BEH, ATTRIBS, DESCR, SEM) \
68*144da357STaylor Simpson     do { \
69*144da357STaylor Simpson         fprintf(outfile, "SEMANTICS( \\\n" \
70*144da357STaylor Simpson                          "    \"%s\", \\\n" \
71*144da357STaylor Simpson                          "    %s, \\\n" \
72*144da357STaylor Simpson                          "    \"\"\"%s\"\"\" \\\n" \
73*144da357STaylor Simpson                          ")\n", \
74*144da357STaylor Simpson                 #TAG, STRINGIZE(BEH), STRINGIZE(SEM)); \
75*144da357STaylor Simpson         fprintf(outfile, "ATTRIBUTES( \\\n" \
76*144da357STaylor Simpson                          "    \"%s\", \\\n" \
77*144da357STaylor Simpson                          "    \"%s\" \\\n" \
78*144da357STaylor Simpson                          ")\n", \
79*144da357STaylor Simpson                 #TAG, STRINGIZE(ATTRIBS)); \
80*144da357STaylor Simpson     } while (0);
81f7a9e80dSTaylor Simpson #include "imported/allidefs.def"
82f7a9e80dSTaylor Simpson #undef Q6INSN
83*144da357STaylor Simpson #undef EXTINSN
84f7a9e80dSTaylor Simpson 
85f7a9e80dSTaylor Simpson /*
86f7a9e80dSTaylor Simpson  * Process the macro definitions
87f7a9e80dSTaylor Simpson  *     Macros definitions have the following form
88f7a9e80dSTaylor Simpson  *         DEF_MACRO(
89f7a9e80dSTaylor Simpson  *             fLSBNEW0,
90f7a9e80dSTaylor Simpson  *             predlog_read(thread,0),
91f7a9e80dSTaylor Simpson  *             ()
92f7a9e80dSTaylor Simpson  *         )
93f7a9e80dSTaylor Simpson  * The important part here is the attributes.  Whenever an instruction
94f7a9e80dSTaylor Simpson  * invokes a macro, we add the macro's attributes to the instruction.
95f7a9e80dSTaylor Simpson  */
96f7a9e80dSTaylor Simpson #define DEF_MACRO(MNAME, BEH, ATTRS) \
97f7a9e80dSTaylor Simpson     fprintf(outfile, "MACROATTRIB( \\\n" \
98f7a9e80dSTaylor Simpson                      "    \"%s\", \\\n" \
99f7a9e80dSTaylor Simpson                      "    \"\"\"%s\"\"\", \\\n" \
100f7a9e80dSTaylor Simpson                      "    \"%s\" \\\n" \
101f7a9e80dSTaylor Simpson                      ")\n", \
102f7a9e80dSTaylor Simpson             #MNAME, STRINGIZE(BEH), STRINGIZE(ATTRS));
103f7a9e80dSTaylor Simpson #include "imported/macros.def"
104f7a9e80dSTaylor Simpson #undef DEF_MACRO
105f7a9e80dSTaylor Simpson 
106*144da357STaylor Simpson /*
107*144da357STaylor Simpson  * Process the macros for HVX
108*144da357STaylor Simpson  */
109*144da357STaylor Simpson #define DEF_MACRO(MNAME, BEH, ATTRS) \
110*144da357STaylor Simpson     fprintf(outfile, "MACROATTRIB( \\\n" \
111*144da357STaylor Simpson                      "    \"%s\", \\\n" \
112*144da357STaylor Simpson                      "    \"\"\"%s\"\"\", \\\n" \
113*144da357STaylor Simpson                      "    \"%s\" \\\n" \
114*144da357STaylor Simpson                      ")\n", \
115*144da357STaylor Simpson             #MNAME, STRINGIZE(BEH), STRINGIZE(ATTRS));
116*144da357STaylor Simpson #include "imported/allext_macros.def"
117*144da357STaylor Simpson #undef DEF_MACRO
118*144da357STaylor Simpson 
119f7a9e80dSTaylor Simpson     fclose(outfile);
120f7a9e80dSTaylor Simpson     return 0;
121f7a9e80dSTaylor Simpson }
122