file vi.gmo was initially added on branch binutils-2_16-branch.
[binutils.git] / gas / itbl-parse.y
blob54d7204652991df7841d66a9bf39f21c843832b2
1 /* itbl-parse.y
2 Copyright 1997, 2002, 2003, 2005 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS 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, or (at your option)
9 any later version.
11 GAS 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.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
23 /*
25 Yacc grammar for instruction table entries.
27 =======================================================================
28 Original Instruction table specification document:
30 MIPS Coprocessor Table Specification
31 ====================================
33 This document describes the format of the MIPS coprocessor table. The
34 table specifies a list of valid functions, data registers and control
35 registers that can be used in coprocessor instructions. This list,
36 together with the coprocessor instruction classes listed below,
37 specifies the complete list of coprocessor instructions that will
38 be recognized and assembled by the GNU assembler. In effect,
39 this makes the GNU assembler table-driven, where the table is
40 specified by the programmer.
42 The table is an ordinary text file that the GNU assembler reads when
43 it starts. Using the information in the table, the assembler
44 generates an internal list of valid coprocessor registers and
45 functions. The assembler uses this internal list in addition to the
46 standard MIPS registers and instructions which are built-in to the
47 assembler during code generation.
49 To specify the coprocessor table when invoking the GNU assembler, use
50 the command line option "--itbl file", where file is the
51 complete name of the table, including path and extension.
53 Examples:
55 gas -t cop.tbl test.s -o test.o
56 gas -t /usr/local/lib/cop.tbl test.s -o test.o
57 gas --itbl d:\gnu\data\cop.tbl test.s -o test.o
59 Only one table may be supplied during a single invocation of
60 the assembler.
63 Instruction classes
64 ===================
66 Below is a list of the valid coprocessor instruction classes for
67 any given coprocessor "z". These instructions are already recognized
68 by the assembler, and are listed here only for reference.
70 Class format instructions
71 -------------------------------------------------
72 Class1:
73 op base rt offset
74 LWCz rt,offset (base)
75 SWCz rt,offset (base)
76 Class2:
77 COPz sub rt rd 0
78 MTCz rt,rd
79 MFCz rt,rd
80 CTCz rt,rd
81 CFCz rt,rd
82 Class3:
83 COPz CO cofun
84 COPz cofun
85 Class4:
86 COPz BC br offset
87 BCzT offset
88 BCzF offset
89 Class5:
90 COPz sub rt rd 0
91 DMFCz rt,rd
92 DMTCz rt,rd
93 Class6:
94 op base rt offset
95 LDCz rt,offset (base)
96 SDCz rt,offset (base)
97 Class7:
98 COPz BC br offset
99 BCzTL offset
100 BCzFL offset
102 The coprocessor table defines coprocessor-specific registers that can
103 be used with all of the above classes of instructions, where
104 appropriate. It also defines additional coprocessor-specific
105 functions for Class3 (COPz cofun) instructions, Thus, the table allows
106 the programmer to use convenient mnemonics and operands for these
107 functions, instead of the COPz mmenmonic and cofun operand.
109 The names of the MIPS general registers and their aliases are defined
110 by the assembler and will be recognized as valid register names by the
111 assembler when used (where allowed) in coprocessor instructions.
112 However, the names and values of all coprocessor data and control
113 register mnemonics must be specified in the coprocessor table.
116 Table Grammar
117 =============
119 Here is the grammar for the coprocessor table:
121 table -> entry*
123 entry -> [z entrydef] [comment] '\n'
125 entrydef -> type name val
126 entrydef -> 'insn' name val funcdef ; type of entry (instruction)
128 z -> 'p'['0'..'3'] ; processor number
129 type -> ['dreg' | 'creg' | 'greg' ] ; type of entry (register)
130 ; 'dreg', 'creg' or 'greg' specifies a data, control, or general
131 ; register mnemonic, respectively
132 name -> [ltr|dec]* ; mnemonic of register/function
133 val -> [dec|hex] ; register/function number (integer constant)
135 funcdef -> frange flags fields
136 ; bitfield range for opcode
137 ; list of fields' formats
138 fields -> field*
139 field -> [','] ftype frange flags
140 flags -> ['*' flagexpr]
141 flagexpr -> '[' flagexpr ']'
142 flagexpr -> val '|' flagexpr
143 ftype -> [ type | 'immed' | 'addr' ]
144 ; 'immed' specifies an immediate value; see grammar for "val" above
145 ; 'addr' specifies a C identifier; name of symbol to be resolved at
146 ; link time
147 frange -> ':' val '-' val ; starting to ending bit positions, where
148 ; where 0 is least significant bit
149 frange -> (null) ; default range of 31-0 will be assumed
151 comment -> [';'|'#'] [char]*
152 char -> any printable character
153 ltr -> ['a'..'z'|'A'..'Z']
154 dec -> ['0'..'9']* ; value in decimal
155 hex -> '0x'['0'..'9' | 'a'..'f' | 'A'..'F']* ; value in hexadecimal
158 Examples
159 ========
161 Example 1:
163 The table:
165 p1 dreg d1 1 ; data register "d1" for COP1 has value 1
166 p1 creg c3 3 ; ctrl register "c3" for COP1 has value 3
167 p3 func fill 0x1f:24-20 ; function "fill" for COP3 has value 31 and
168 ; no fields
170 will allow the assembler to accept the following coprocessor instructions:
172 LWC1 d1,0x100 ($2)
173 fill
175 Here, the general purpose register "$2", and instruction "LWC1", are standard
176 mnemonics built-in to the MIPS assembler.
179 Example 2:
181 The table:
183 p3 dreg d3 3 ; data register "d3" for COP3 has value 3
184 p3 creg c2 22 ; control register "c2" for COP3 has value 22
185 p3 func fee 0x1f:24-20 dreg:17-13 creg:12-8 immed:7-0
186 ; function "fee" for COP3 has value 31, and 3 fields
187 ; consisting of a data register, a control register,
188 ; and an immediate value.
190 will allow the assembler to accept the following coprocessor instruction:
192 fee d3,c2,0x1
194 and will emit the object code:
196 31-26 25 24-20 19-18 17-13 12-8 7-0
197 COPz CO fun dreg creg immed
198 010011 1 11111 00 00011 10110 00000001
200 0x4ff07601
203 Example 3:
205 The table:
207 p3 dreg d3 3 ; data register "d3" for COP3 has value 3
208 p3 creg c2 22 ; control register "c2" for COP3 has value 22
209 p3 func fuu 0x01f00001 dreg:17-13 creg:12-8
211 will allow the assembler to accept the following coprocessor
212 instruction:
214 fuu d3,c2
216 and will emit the object code:
218 31-26 25 24-20 19-18 17-13 12-8 7-0
219 COPz CO fun dreg creg
220 010011 1 11111 00 00011 10110 00000001
222 0x4ff07601
224 In this way, the programmer can force arbitrary bits of an instruction
225 to have predefined values.
227 =======================================================================
228 Additional notes:
230 Encoding of ranges:
231 To handle more than one bit position range within an instruction,
232 use 0s to mask out the ranges which don't apply.
233 May decide to modify the syntax to allow commas separate multiple
234 ranges within an instruction (range','range).
236 Changes in grammar:
237 The number of parms argument to the function entry
238 was deleted from the original format such that we now count the fields.
240 ----
241 FIXME! should really change lexical analyzer
242 to recognize 'dreg' etc. in context sensitive way.
243 Currently function names or mnemonics may be incorrectly parsed as keywords
245 FIXME! hex is ambiguous with any digit
249 #include <stdio.h>
250 #include "itbl-lex.h"
251 #include "itbl-ops.h"
253 /* #define DEBUG */
255 #ifdef DEBUG
256 #ifndef DBG_LVL
257 #define DBG_LVL 1
258 #endif
259 #else
260 #define DBG_LVL 0
261 #endif
263 #if DBG_LVL >= 1
264 #define DBG(x) printf x
265 #else
266 #define DBG(x)
267 #endif
269 #if DBG_LVL >= 2
270 #define DBGL2(x) printf x
271 #else
272 #define DBGL2(x)
273 #endif
275 static int sbit, ebit;
276 static struct itbl_entry *insn=0;
277 static int yyerror PARAMS ((const char *));
281 %union
283 char *str;
284 int num;
285 int processor;
286 unsigned long val;
289 %token DREG CREG GREG IMMED ADDR INSN NUM ID NL PNUM
290 %type <val> value flags flagexpr
291 %type <num> number NUM ftype regtype pnum PNUM
292 %type <str> ID name
294 %start insntbl
298 insntbl:
299 entrys
302 entrys:
303 entry entrys
307 entry:
308 pnum regtype name value NL
310 DBG (("line %d: entry pnum=%d type=%d name=%s value=x%x\n",
311 insntbl_line, $1, $2, $3, $4));
312 itbl_add_reg ($1, $2, $3, $4);
314 | pnum INSN name value range flags
316 DBG (("line %d: entry pnum=%d type=INSN name=%s value=x%x",
317 insntbl_line, $1, $3, $4));
318 DBG ((" sbit=%d ebit=%d flags=0x%x\n", sbit, ebit, $6));
319 insn=itbl_add_insn ($1, $3, $4, sbit, ebit, $6);
321 fieldspecs NL
323 | NL
324 | error NL
327 fieldspecs:
328 ',' fieldspec fieldspecs
329 | fieldspec fieldspecs
333 ftype:
334 regtype
336 DBGL2 (("ftype\n"));
337 $$ = $1;
339 | ADDR
341 DBGL2 (("addr\n"));
342 $$ = ADDR;
344 | IMMED
346 DBGL2 (("immed\n"));
347 $$ = IMMED;
351 fieldspec:
352 ftype range flags
354 DBG (("line %d: field type=%d sbit=%d ebit=%d, flags=0x%x\n",
355 insntbl_line, $1, sbit, ebit, $3));
356 itbl_add_operand (insn, $1, sbit, ebit, $3);
360 flagexpr:
361 NUM '|' flagexpr
363 $$ = $1 | $3;
365 | '[' flagexpr ']'
367 $$ = $2;
369 | NUM
371 $$ = $1;
375 flags:
376 '*' flagexpr
378 DBGL2 (("flags=%d\n", $2));
379 $$ = $2;
383 $$ = 0;
387 range:
388 ':' NUM '-' NUM
390 DBGL2 (("range %d %d\n", $2, $4));
391 sbit = $2;
392 ebit = $4;
396 sbit = 31;
397 ebit = 0;
401 pnum:
402 PNUM
404 DBGL2 (("pnum=%d\n",$1));
405 $$ = $1;
409 regtype:
410 DREG
412 DBGL2 (("dreg\n"));
413 $$ = DREG;
415 | CREG
417 DBGL2 (("creg\n"));
418 $$ = CREG;
420 | GREG
422 DBGL2 (("greg\n"));
423 $$ = GREG;
427 name:
430 DBGL2 (("name=%s\n",$1));
431 $$ = $1;
435 number:
438 DBGL2 (("num=%d\n",$1));
439 $$ = $1;
443 value:
446 DBGL2 (("val=x%x\n",$1));
447 $$ = $1;
452 static int
453 yyerror (msg)
454 const char *msg;
456 printf ("line %d: %s\n", insntbl_line, msg);
457 return 0;