
1: /* itbl-parse.y 2: Copyright 1997, 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. 3: 4: This file is part of GAS, the GNU Assembler. 5: 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 3, or (at your option) 9: any later version. 10: 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. 15: 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, 51 Franklin Street - Fifth Floor, Boston, MA 19: 02110-1301, USA. */ 20: 21: %{ 22: 23: /* 24: 25: Yacc grammar for instruction table entries. 26: 27: ======================================================================= 28: Original Instruction table specification document: 29: 30: MIPS Coprocessor Table Specification 31: ==================================== 32: 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. 41: 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. 48: 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. 52: 53: Examples: 54: 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 58: 59: Only one table may be supplied during a single invocation of 60: the assembler. 61: 62: 63: Instruction classes 64: =================== 65: 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. 69: 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 101: 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. 108: 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. 114: 115: 116: Table Grammar 117: ============= 118: 119: Here is the grammar for the coprocessor table: 120: 121: table -> entry* 122: 123: entry -> [z entrydef] [comment] '\n' 124: 125: entrydef -> type name val 126: entrydef -> 'insn' name val funcdef ; type of entry (instruction) 127: 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) 134: 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 150: 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 156: 157: 158: Examples 159: ======== 160: 161: Example 1: 162: 163: The table: 164: 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 169: 170: will allow the assembler to accept the following coprocessor instructions: 171: 172: LWC1 d1,0x100 ($2) 173: fill 174: 175: Here, the general purpose register "$2", and instruction "LWC1", are standard 176: mnemonics built-in to the MIPS assembler. 177: 178: 179: Example 2: 180: 181: The table: 182: 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. 189: 190: will allow the assembler to accept the following coprocessor instruction: 191: 192: fee d3,c2,0x1 193: 194: and will emit the object code: 195: 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 199: 200: 0x4ff07601 201: 202: 203: Example 3: 204: 205: The table: 206: 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 210: 211: will allow the assembler to accept the following coprocessor 212: instruction: 213: 214: fuu d3,c2 215: 216: and will emit the object code: 217: 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 221: 222: 0x4ff07601 223: 224: In this way, the programmer can force arbitrary bits of an instruction 225: to have predefined values. 226: 227: ======================================================================= 228: Additional notes: 229: 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). 235: 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. 239: 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 244: 245: FIXME! hex is ambiguous with any digit 246: 247: */ 248: 249: #include "as.h" 250: #include "itbl-lex.h" 251: #include "itbl-ops.h" 252: 253: /* #define DEBUG */ 254: 255: #ifdef DEBUG 256: #ifndef DBG_LVL 257: #define DBG_LVL 1 258: #endif 259: #else 260: #define DBG_LVL 0 261: #endif 262: 263: #if DBG_LVL >= 1 264: #define DBG(x) printf x 265: #else 266: #define DBG(x) 267: #endif 268: 269: #if DBG_LVL >= 2 270: #define DBGL2(x) printf x 271: #else 272: #define DBGL2(x) 273: #endif 274: 275: static int sbit, ebit; 276: static struct itbl_entry *insn=0; 277: static int yyerror (const char *); 278: 279: %} 280: 281: %union 282: { 283: char *str; 284: int num; 285: int processor; 286: unsigned long val; 287: } 288: 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 293: 294: %start insntbl 295: 296: %% 297: 298: insntbl: 299: entrys 300: ; 301: 302: entrys: 303: entry entrys 304: | 305: ; 306: 307: entry: 308: pnum regtype name value NL 309: { 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); 313: } 314: | pnum INSN name value range flags 315: { 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); 320: } 321: fieldspecs NL 322: {} 323: | NL 324: | error NL 325: ; 326: 327: fieldspecs: 328: ',' fieldspec fieldspecs 329: | fieldspec fieldspecs 330: | 331: ; 332: 333: ftype: 334: regtype 335: { 336: DBGL2 (("ftype\n")); 337: $$ = $1; 338: } 339: | ADDR 340: { 341: DBGL2 (("addr\n")); 342: $$ = ADDR; 343: } 344: | IMMED 345: { 346: DBGL2 (("immed\n")); 347: $$ = IMMED; 348: } 349: ; 350: 351: fieldspec: 352: ftype range flags 353: { 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); 357: } 358: ; 359: 360: flagexpr: 361: NUM '|' flagexpr 362: { 363: $$ = $1 | $3; 364: } 365: | '[' flagexpr ']' 366: { 367: $$ = $2; 368: } 369: | NUM 370: { 371: $$ = $1; 372: } 373: ; 374: 375: flags: 376: '*' flagexpr 377: { 378: DBGL2 (("flags=%d\n", $2)); 379: $$ = $2; 380: } 381: | 382: { 383: $$ = 0; 384: } 385: ; 386: 387: range: 388: ':' NUM '-' NUM 389: { 390: DBGL2 (("range %d %d\n", $2, $4)); 391: sbit = $2; 392: ebit = $4; 393: } 394: | 395: { 396: sbit = 31; 397: ebit = 0; 398: } 399: ; 400: 401: pnum: 402: PNUM 403: { 404: DBGL2 (("pnum=%d\n",$1)); 405: $$ = $1; 406: } 407: ; 408: 409: regtype: 410: DREG 411: { 412: DBGL2 (("dreg\n")); 413: $$ = DREG; 414: } 415: | CREG 416: { 417: DBGL2 (("creg\n")); 418: $$ = CREG; 419: } 420: | GREG 421: { 422: DBGL2 (("greg\n")); 423: $$ = GREG; 424: } 425: ; 426: 427: name: 428: ID 429: { 430: DBGL2 (("name=%s\n",$1)); 431: $$ = $1; 432: } 433: ; 434: 435: number: 436: NUM 437: { 438: DBGL2 (("num=%d\n",$1)); 439: $$ = $1; 440: } 441: ; 442: 443: value: 444: NUM 445: { 446: DBGL2 (("val=x%x\n",$1)); 447: $$ = $1; 448: } 449: ; 450: %% 451: 452: static int 453: yyerror (msg) 454: const char *msg; 455: { 456: printf ("line %d: %s\n", insntbl_line, msg); 457: return 0; 458: }