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