1 /* Table of relaxations for Xtensa assembly. 2 Copyright 2003, 2004, 2005, 2007, 2008 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 18 the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 /* This file contains the code for generating runtime data structures 22 for relaxation pattern matching from statically specified strings. 23 Each action contains an instruction pattern to match and 24 preconditions for the match as well as an expansion if the pattern 25 matches. The preconditions can specify that two operands are the 26 same or an operand is a specific constant or register. The expansion 27 uses the bound variables from the pattern to specify that specific 28 operands from the pattern should be used in the result. 29 30 The code determines whether the condition applies to a constant or 31 a register depending on the type of the operand. You may get 32 unexpected results if you don't match the rule against the operand 33 type correctly. 34 35 The patterns match a language like: 36 37 INSN_PATTERN ::= INSN_TEMPL ( '|' PRECOND )* ( '?' OPTIONPRED )* 38 INSN_TEMPL ::= OPCODE ' ' [ OPERAND (',' OPERAND)* ] 39 OPCODE ::= id 40 OPERAND ::= CONSTANT | VARIABLE | SPECIALFN '(' VARIABLE ')' 41 SPECIALFN ::= 'HI24S' | 'F32MINUS' | 'LOW8' 42 | 'HI16' | 'LOW16' 43 VARIABLE ::= '%' id 44 PRECOND ::= OPERAND CMPOP OPERAND 45 CMPOP ::= '==' | '!=' 46 OPTIONPRED ::= OPTIONNAME ('+' OPTIONNAME) 47 OPTIONNAME ::= '"' id '"' 48 49 The replacement language 50 INSN_REPL ::= INSN_LABEL_LIT ( ';' INSN_LABEL_LIT )* 51 INSN_LABEL_LIT ::= INSN_TEMPL 52 | 'LABEL' 53 | 'LITERAL' VARIABLE 54 55 The operands in a PRECOND must be constants or variables bound by 56 the INSN_PATTERN. 57 58 The configuration options define a predicate on the availability of 59 options which must be TRUE for this rule to be valid. Examples are 60 requiring "density" for replacements with density instructions, 61 requiring "const16" for replacements that require const16 62 instructions, etc. The names are interpreted by the assembler to a 63 truth value for a particular frag. 64 65 The operands in the INSN_REPL must be constants, variables bound in 66 the associated INSN_PATTERN, special variables that are bound in 67 the INSN_REPL by LABEL or LITERAL definitions, or special value 68 manipulation functions. 69 70 A simple example of a replacement pattern: 71 {"movi.n %as,%imm", "movi %as,%imm"} would convert the narrow 72 movi.n instruction to the wide movi instruction. 73 74 A more complex example of a branch around: 75 {"beqz %as,%label", "bnez %as,%LABEL;j %label;LABEL"} 76 would convert a branch to a negated branch to the following instruction 77 with a jump to the original label. 78 79 An Xtensa-specific example that generates a literal: 80 {"movi %at,%imm", "LITERAL %imm; l32r %at,%LITERAL"} 81 will convert a movi instruction to an l32r of a literal 82 literal defined in the literal pool. 83 84 Even more complex is a conversion of a load with immediate offset 85 to a load of a freshly generated literal, an explicit add and 86 a load with 0 offset. This transformation is only valid, though 87 when the first and second operands are not the same as specified 88 by the "| %at!=%as" precondition clause. 89 {"l32i %at,%as,%imm | %at!=%as", 90 "LITERAL %imm; l32r %at,%LITERAL; add %at,%at,%as; l32i %at,%at,0"} 91 92 There is special case for loop instructions here, but because we do 93 not currently have the ability to represent the difference of two 94 symbols, the conversion requires special code in the assembler to 95 write the operands of the addi/addmi pair representing the 96 difference of the old and new loop end label. */ 97 98 #include "as.h" 99 #include "xtensa-isa.h" 100 #include "xtensa-relax.h" 101 #include <stddef.h> 102 #include "xtensa-config.h" 103 104 #ifndef XCHAL_HAVE_WIDE_BRANCHES 105 #define XCHAL_HAVE_WIDE_BRANCHES 0 106 #endif 107 108 /* Imported from bfd. */ 109 extern xtensa_isa xtensa_default_isa; 110 111 /* The opname_list is a small list of names that we use for opcode and 112 operand variable names to simplify ownership of these commonly used 113 strings. Strings entered in the table can be compared by pointer 114 equality. */ 115 116 typedef struct opname_list_struct opname_list; 117 typedef opname_list opname_e; 118 119 struct opname_list_struct 120 { 121 char *opname; 122 opname_list *next; 123 }; 124 125 static opname_list *local_opnames = NULL; 126 127 128 /* The "opname_map" and its element structure "opname_map_e" are used 129 for binding an operand number to a name or a constant. */ 130 131 typedef struct opname_map_e_struct opname_map_e; 132 typedef struct opname_map_struct opname_map; 133 134 struct opname_map_e_struct 135 { 136 const char *operand_name; /* If null, then use constant_value. */ 137 int operand_num; 138 unsigned constant_value; 139 opname_map_e *next; 140 }; 141 142 struct opname_map_struct 143 { 144 opname_map_e *head; 145 opname_map_e **tail; 146 }; 147 148 /* The "precond_list" and its element structure "precond_e" represents 149 explicit preconditions comparing operand variables and constants. 150 In the "precond_e" structure, a variable is identified by the name 151 in the "opname" field. If that field is NULL, then the operand 152 is the constant in field "opval". */ 153 154 typedef struct precond_e_struct precond_e; 155 typedef struct precond_list_struct precond_list; 156 157 struct precond_e_struct 158 { 159 const char *opname1; 160 unsigned opval1; 161 CmpOp cmpop; 162 const char *opname2; 163 unsigned opval2; 164 precond_e *next; 165 }; 166 167 struct precond_list_struct 168 { 169 precond_e *head; 170 precond_e **tail; 171 }; 172 173 174 /* The insn_templ represents the INSN_TEMPL instruction template. It 175 is an opcode name with a list of operands. These are used for 176 instruction patterns and replacement patterns. */ 177 178 typedef struct insn_templ_struct insn_templ; 179 struct insn_templ_struct 180 { 181 const char *opcode_name; 182 opname_map operand_map; 183 }; 184 185 186 /* The insn_pattern represents an INSN_PATTERN instruction pattern. 187 It is an instruction template with preconditions that specify when 188 it actually matches a given instruction. */ 189 190 typedef struct insn_pattern_struct insn_pattern; 191 struct insn_pattern_struct 192 { 193 insn_templ t; 194 precond_list preconds; 195 ReqOptionList *options; 196 }; 197 198 199 /* The "insn_repl" and associated element structure "insn_repl_e" 200 instruction replacement list is a list of 201 instructions/LITERALS/LABELS with constant operands or operands 202 with names bound to the operand names in the associated pattern. */ 203 204 typedef struct insn_repl_e_struct insn_repl_e; 205 struct insn_repl_e_struct 206 { 207 insn_templ t; 208 insn_repl_e *next; 209 }; 210 211 typedef struct insn_repl_struct insn_repl; 212 struct insn_repl_struct 213 { 214 insn_repl_e *head; 215 insn_repl_e **tail; 216 }; 217 218 219 /* The split_rec is a vector of allocated char * pointers. */ 220 221 typedef struct split_rec_struct split_rec; 222 struct split_rec_struct 223 { 224 char **vec; 225 int count; 226 }; 227 228 /* The "string_pattern_pair" is a set of pairs containing instruction 229 patterns and replacement strings. */ 230 231 typedef struct string_pattern_pair_struct string_pattern_pair; 232 struct string_pattern_pair_struct 233 { 234 const char *pattern; 235 const char *replacement; 236 }; 237 238 239 /* The widen_spec_list is a list of valid substitutions that generate 240 wider representations. These are generally used to specify 241 replacements for instructions whose immediates do not fit their 242 encodings. A valid transition may require multiple steps of 243 one-to-one instruction replacements with a final multiple 244 instruction replacement. As an example, here are the transitions 245 required to replace an 'addi.n' with an 'addi', 'addmi'. 246 247 addi.n a4, 0x1010 248 => addi a4, 0x1010 249 => addmi a4, 0x1010 250 => addmi a4, 0x1000, addi a4, 0x10. 251 252 See the comments in xg_assembly_relax for some important details 253 regarding how these chains must be built. */ 254 255 static string_pattern_pair widen_spec_list[] = 256 { 257 {"add.n %ar,%as,%at ? IsaUseDensityInstruction", "add %ar,%as,%at"}, 258 {"addi.n %ar,%as,%imm ? IsaUseDensityInstruction", "addi %ar,%as,%imm"}, 259 {"beqz.n %as,%label ? IsaUseDensityInstruction", "beqz %as,%label"}, 260 {"bnez.n %as,%label ? IsaUseDensityInstruction", "bnez %as,%label"}, 261 {"l32i.n %at,%as,%imm ? IsaUseDensityInstruction", "l32i %at,%as,%imm"}, 262 {"mov.n %at,%as ? IsaUseDensityInstruction", "or %at,%as,%as"}, 263 {"movi.n %as,%imm ? IsaUseDensityInstruction", "movi %as,%imm"}, 264 {"nop.n ? IsaUseDensityInstruction ? realnop", "nop"}, 265 {"nop.n ? IsaUseDensityInstruction ? no-realnop", "or 1,1,1"}, 266 {"ret.n %as ? IsaUseDensityInstruction", "ret %as"}, 267 {"retw.n %as ? IsaUseDensityInstruction", "retw %as"}, 268 {"s32i.n %at,%as,%imm ? IsaUseDensityInstruction", "s32i %at,%as,%imm"}, 269 {"srli %at,%as,%imm", "extui %at,%as,%imm,F32MINUS(%imm)"}, 270 {"slli %ar,%as,0", "or %ar,%as,%as"}, 271 272 /* Widening with literals or const16. */ 273 {"movi %at,%imm ? IsaUseL32R ", 274 "LITERAL %imm; l32r %at,%LITERAL"}, 275 {"movi %at,%imm ? IsaUseConst16", 276 "const16 %at,HI16U(%imm); const16 %at,LOW16U(%imm)"}, 277 278 {"addi %ar,%as,%imm", "addmi %ar,%as,%imm"}, 279 /* LOW8 is the low 8 bits of the Immed 280 MID8S is the middle 8 bits of the Immed */ 281 {"addmi %ar,%as,%imm", "addmi %ar,%as,HI24S(%imm); addi %ar,%ar,LOW8(%imm)"}, 282 283 /* In the end convert to either an l32r or const16. */ 284 {"addmi %ar,%as,%imm | %ar!=%as ? IsaUseL32R", 285 "LITERAL %imm; l32r %ar,%LITERAL; add %ar,%as,%ar"}, 286 {"addmi %ar,%as,%imm | %ar!=%as ? IsaUseConst16", 287 "const16 %ar,HI16U(%imm); const16 %ar,LOW16U(%imm); add %ar,%as,%ar"}, 288 289 /* Widening the load instructions with too-large immediates */ 290 {"l8ui %at,%as,%imm | %at!=%as ? IsaUseL32R", 291 "LITERAL %imm; l32r %at,%LITERAL; add %at,%at,%as; l8ui %at,%at,0"}, 292 {"l16si %at,%as,%imm | %at!=%as ? IsaUseL32R", 293 "LITERAL %imm; l32r %at,%LITERAL; add %at,%at,%as; l16si %at,%at,0"}, 294 {"l16ui %at,%as,%imm | %at!=%as ? IsaUseL32R", 295 "LITERAL %imm; l32r %at,%LITERAL; add %at,%at,%as; l16ui %at,%at,0"}, 296 {"l32i %at,%as,%imm | %at!=%as ? IsaUseL32R", 297 "LITERAL %imm; l32r %at,%LITERAL; add %at,%at,%as; l32i %at,%at,0"}, 298 299 /* Widening load instructions with const16s. */ 300 {"l8ui %at,%as,%imm | %at!=%as ? IsaUseConst16", 301 "const16 %at,HI16U(%imm); const16 %at,LOW16U(%imm); add %at,%at,%as; l8ui %at,%at,0"}, 302 {"l16si %at,%as,%imm | %at!=%as ? IsaUseConst16", 303 "const16 %at,HI16U(%imm); const16 %at,LOW16U(%imm); add %at,%at,%as; l16si %at,%at,0"}, 304 {"l16ui %at,%as,%imm | %at!=%as ? IsaUseConst16", 305 "const16 %at,HI16U(%imm); const16 %at,LOW16U(%imm); add %at,%at,%as; l16ui %at,%at,0"}, 306 {"l32i %at,%as,%imm | %at!=%as ? IsaUseConst16", 307 "const16 %at,HI16U(%imm); const16 %at,LOW16U(%imm); add %at,%at,%as; l32i %at,%at,0"}, 308 309 /* This is only PART of the loop instruction. In addition, 310 hardcoded into its use is a modification of the final operand in 311 the instruction in bytes 9 and 12. */ 312 {"loop %as,%label | %as!=1 ? IsaUseLoops", 313 "loop %as,%LABEL;" 314 "rsr.lend %as;" /* LEND */ 315 "wsr.lbeg %as;" /* LBEG */ 316 "addi %as, %as, 0;" /* lo8(%label-%LABEL1) */ 317 "addmi %as, %as, 0;" /* mid8(%label-%LABEL1) */ 318 "wsr.lend %as;" 319 "isync;" 320 "rsr.lcount %as;" /* LCOUNT */ 321 "addi %as, %as, 1;" /* density -> addi.n %as, %as, 1 */ 322 "LABEL"}, 323 {"loopgtz %as,%label | %as!=1 ? IsaUseLoops", 324 "beqz %as,%label;" 325 "bltz %as,%label;" 326 "loopgtz %as,%LABEL;" 327 "rsr.lend %as;" /* LEND */ 328 "wsr.lbeg %as;" /* LBEG */ 329 "addi %as, %as, 0;" /* lo8(%label-%LABEL1) */ 330 "addmi %as, %as, 0;" /* mid8(%label-%LABEL1) */ 331 "wsr.lend %as;" 332 "isync;" 333 "rsr.lcount %as;" /* LCOUNT */ 334 "addi %as, %as, 1;" /* density -> addi.n %as, %as, 1 */ 335 "LABEL"}, 336 {"loopnez %as,%label | %as!=1 ? IsaUseLoops", 337 "beqz %as,%label;" 338 "loopnez %as,%LABEL;" 339 "rsr.lend %as;" /* LEND */ 340 "wsr.lbeg %as;" /* LBEG */ 341 "addi %as, %as, 0;" /* lo8(%label-%LABEL1) */ 342 "addmi %as, %as, 0;" /* mid8(%label-%LABEL1) */ 343 "wsr.lend %as;" 344 "isync;" 345 "rsr.lcount %as;" /* LCOUNT */ 346 "addi %as, %as, 1;" /* density -> addi.n %as, %as, 1 */ 347 "LABEL"}, 348 349 /* Relaxing to wide branches. Order is important here. With wide 350 branches, there is more than one correct relaxation for an 351 out-of-range branch. Put the wide branch relaxations first in the 352 table since they are more efficient than the branch-around 353 relaxations. */ 354 355 {"beqz %as,%label ? IsaUseWideBranches", "WIDE.beqz %as,%label"}, 356 {"bnez %as,%label ? IsaUseWideBranches", "WIDE.bnez %as,%label"}, 357 {"bgez %as,%label ? IsaUseWideBranches", "WIDE.bgez %as,%label"}, 358 {"bltz %as,%label ? IsaUseWideBranches", "WIDE.bltz %as,%label"}, 359 {"beqi %as,%imm,%label ? IsaUseWideBranches", "WIDE.beqi %as,%imm,%label"}, 360 {"bnei %as,%imm,%label ? IsaUseWideBranches", "WIDE.bnei %as,%imm,%label"}, 361 {"bgei %as,%imm,%label ? IsaUseWideBranches", "WIDE.bgei %as,%imm,%label"}, 362 {"blti %as,%imm,%label ? IsaUseWideBranches", "WIDE.blti %as,%imm,%label"}, 363 {"bgeui %as,%imm,%label ? IsaUseWideBranches", "WIDE.bgeui %as,%imm,%label"}, 364 {"bltui %as,%imm,%label ? IsaUseWideBranches", "WIDE.bltui %as,%imm,%label"}, 365 {"bbci %as,%imm,%label ? IsaUseWideBranches", "WIDE.bbci %as,%imm,%label"}, 366 {"bbsi %as,%imm,%label ? IsaUseWideBranches", "WIDE.bbsi %as,%imm,%label"}, 367 {"beq %as,%at,%label ? IsaUseWideBranches", "WIDE.beq %as,%at,%label"}, 368 {"bne %as,%at,%label ? IsaUseWideBranches", "WIDE.bne %as,%at,%label"}, 369 {"bge %as,%at,%label ? IsaUseWideBranches", "WIDE.bge %as,%at,%label"}, 370 {"blt %as,%at,%label ? IsaUseWideBranches", "WIDE.blt %as,%at,%label"}, 371 {"bgeu %as,%at,%label ? IsaUseWideBranches", "WIDE.bgeu %as,%at,%label"}, 372 {"bltu %as,%at,%label ? IsaUseWideBranches", "WIDE.bltu %as,%at,%label"}, 373 {"bany %as,%at,%label ? IsaUseWideBranches", "WIDE.bany %as,%at,%label"}, 374 {"bnone %as,%at,%label ? IsaUseWideBranches", "WIDE.bnone %as,%at,%label"}, 375 {"ball %as,%at,%label ? IsaUseWideBranches", "WIDE.ball %as,%at,%label"}, 376 {"bnall %as,%at,%label ? IsaUseWideBranches", "WIDE.bnall %as,%at,%label"}, 377 {"bbc %as,%at,%label ? IsaUseWideBranches", "WIDE.bbc %as,%at,%label"}, 378 {"bbs %as,%at,%label ? IsaUseWideBranches", "WIDE.bbs %as,%at,%label"}, 379 380 /* Widening branch comparisons eq/ne to zero. Prefer relaxing to narrow 381 branches if the density option is available. */ 382 {"beqz %as,%label ? IsaUseDensityInstruction", "bnez.n %as,%LABEL;j %label;LABEL"}, 383 {"bnez %as,%label ? IsaUseDensityInstruction", "beqz.n %as,%LABEL;j %label;LABEL"}, 384 {"beqz %as,%label", "bnez %as,%LABEL;j %label;LABEL"}, 385 {"bnez %as,%label", "beqz %as,%LABEL;j %label;LABEL"}, 386 {"WIDE.beqz %as,%label ? IsaUseDensityInstruction", "bnez.n %as,%LABEL;j %label;LABEL"}, 387 {"WIDE.bnez %as,%label ? IsaUseDensityInstruction", "beqz.n %as,%LABEL;j %label;LABEL"}, 388 {"WIDE.beqz %as,%label", "bnez %as,%LABEL;j %label;LABEL"}, 389 {"WIDE.bnez %as,%label", "beqz %as,%LABEL;j %label;LABEL"}, 390 391 /* Widening expect-taken branches. */ 392 {"beqzt %as,%label ? IsaUsePredictedBranches", "bnez %as,%LABEL;j %label;LABEL"}, 393 {"bnezt %as,%label ? IsaUsePredictedBranches", "beqz %as,%LABEL;j %label;LABEL"}, 394 {"beqt %as,%at,%label ? IsaUsePredictedBranches", "bne %as,%at,%LABEL;j %label;LABEL"}, 395 {"bnet %as,%at,%label ? IsaUsePredictedBranches", "beq %as,%at,%LABEL;j %label;LABEL"}, 396 397 /* Widening branches from the Xtensa boolean option. */ 398 {"bt %bs,%label ? IsaUseBooleans", "bf %bs,%LABEL;j %label;LABEL"}, 399 {"bf %bs,%label ? IsaUseBooleans", "bt %bs,%LABEL;j %label;LABEL"}, 400 401 /* Other branch-around-jump widenings. */ 402 {"bgez %as,%label", "bltz %as,%LABEL;j %label;LABEL"}, 403 {"bltz %as,%label", "bgez %as,%LABEL;j %label;LABEL"}, 404 {"beqi %as,%imm,%label", "bnei %as,%imm,%LABEL;j %label;LABEL"}, 405 {"bnei %as,%imm,%label", "beqi %as,%imm,%LABEL;j %label;LABEL"}, 406 {"bgei %as,%imm,%label", "blti %as,%imm,%LABEL;j %label;LABEL"}, 407 {"blti %as,%imm,%label", "bgei %as,%imm,%LABEL;j %label;LABEL"}, 408 {"bgeui %as,%imm,%label", "bltui %as,%imm,%LABEL;j %label;LABEL"}, 409 {"bltui %as,%imm,%label", "bgeui %as,%imm,%LABEL;j %label;LABEL"}, 410 {"bbci %as,%imm,%label", "bbsi %as,%imm,%LABEL;j %label;LABEL"}, 411 {"bbsi %as,%imm,%label", "bbci %as,%imm,%LABEL;j %label;LABEL"}, 412 {"beq %as,%at,%label", "bne %as,%at,%LABEL;j %label;LABEL"}, 413 {"bne %as,%at,%label", "beq %as,%at,%LABEL;j %label;LABEL"}, 414 {"bge %as,%at,%label", "blt %as,%at,%LABEL;j %label;LABEL"}, 415 {"blt %as,%at,%label", "bge %as,%at,%LABEL;j %label;LABEL"}, 416 {"bgeu %as,%at,%label", "bltu %as,%at,%LABEL;j %label;LABEL"}, 417 {"bltu %as,%at,%label", "bgeu %as,%at,%LABEL;j %label;LABEL"}, 418 {"bany %as,%at,%label", "bnone %as,%at,%LABEL;j %label;LABEL"}, 419 {"bnone %as,%at,%label", "bany %as,%at,%LABEL;j %label;LABEL"}, 420 {"ball %as,%at,%label", "bnall %as,%at,%LABEL;j %label;LABEL"}, 421 {"bnall %as,%at,%label", "ball %as,%at,%LABEL;j %label;LABEL"}, 422 {"bbc %as,%at,%label", "bbs %as,%at,%LABEL;j %label;LABEL"}, 423 {"bbs %as,%at,%label", "bbc %as,%at,%LABEL;j %label;LABEL"}, 424 425 {"WIDE.bgez %as,%label", "bltz %as,%LABEL;j %label;LABEL"}, 426 {"WIDE.bltz %as,%label", "bgez %as,%LABEL;j %label;LABEL"}, 427 {"WIDE.beqi %as,%imm,%label", "bnei %as,%imm,%LABEL;j %label;LABEL"}, 428 {"WIDE.bnei %as,%imm,%label", "beqi %as,%imm,%LABEL;j %label;LABEL"}, 429 {"WIDE.bgei %as,%imm,%label", "blti %as,%imm,%LABEL;j %label;LABEL"}, 430 {"WIDE.blti %as,%imm,%label", "bgei %as,%imm,%LABEL;j %label;LABEL"}, 431 {"WIDE.bgeui %as,%imm,%label", "bltui %as,%imm,%LABEL;j %label;LABEL"}, 432 {"WIDE.bltui %as,%imm,%label", "bgeui %as,%imm,%LABEL;j %label;LABEL"}, 433 {"WIDE.bbci %as,%imm,%label", "bbsi %as,%imm,%LABEL;j %label;LABEL"}, 434 {"WIDE.bbsi %as,%imm,%label", "bbci %as,%imm,%LABEL;j %label;LABEL"}, 435 {"WIDE.beq %as,%at,%label", "bne %as,%at,%LABEL;j %label;LABEL"}, 436 {"WIDE.bne %as,%at,%label", "beq %as,%at,%LABEL;j %label;LABEL"}, 437 {"WIDE.bge %as,%at,%label", "blt %as,%at,%LABEL;j %label;LABEL"}, 438 {"WIDE.blt %as,%at,%label", "bge %as,%at,%LABEL;j %label;LABEL"}, 439 {"WIDE.bgeu %as,%at,%label", "bltu %as,%at,%LABEL;j %label;LABEL"}, 440 {"WIDE.bltu %as,%at,%label", "bgeu %as,%at,%LABEL;j %label;LABEL"}, 441 {"WIDE.bany %as,%at,%label", "bnone %as,%at,%LABEL;j %label;LABEL"}, 442 {"WIDE.bnone %as,%at,%label", "bany %as,%at,%LABEL;j %label;LABEL"}, 443 {"WIDE.ball %as,%at,%label", "bnall %as,%at,%LABEL;j %label;LABEL"}, 444 {"WIDE.bnall %as,%at,%label", "ball %as,%at,%LABEL;j %label;LABEL"}, 445 {"WIDE.bbc %as,%at,%label", "bbs %as,%at,%LABEL;j %label;LABEL"}, 446 {"WIDE.bbs %as,%at,%label", "bbc %as,%at,%LABEL;j %label;LABEL"}, 447 448 /* Expanding calls with literals. */ 449 {"call0 %label,%ar0 ? IsaUseL32R", 450 "LITERAL %label; l32r a0,%LITERAL; callx0 a0,%ar0"}, 451 {"call4 %label,%ar4 ? IsaUseL32R", 452 "LITERAL %label; l32r a4,%LITERAL; callx4 a4,%ar4"}, 453 {"call8 %label,%ar8 ? IsaUseL32R", 454 "LITERAL %label; l32r a8,%LITERAL; callx8 a8,%ar8"}, 455 {"call12 %label,%ar12 ? IsaUseL32R", 456 "LITERAL %label; l32r a12,%LITERAL; callx12 a12,%ar12"}, 457 458 /* Expanding calls with const16. */ 459 {"call0 %label,%ar0 ? IsaUseConst16", 460 "const16 a0,HI16U(%label); const16 a0,LOW16U(%label); callx0 a0,%ar0"}, 461 {"call4 %label,%ar4 ? IsaUseConst16", 462 "const16 a4,HI16U(%label); const16 a4,LOW16U(%label); callx4 a4,%ar4"}, 463 {"call8 %label,%ar8 ? IsaUseConst16", 464 "const16 a8,HI16U(%label); const16 a8,LOW16U(%label); callx8 a8,%ar8"}, 465 {"call12 %label,%ar12 ? IsaUseConst16", 466 "const16 a12,HI16U(%label); const16 a12,LOW16U(%label); callx12 a12,%ar12"} 467 }; 468 469 #define WIDEN_COUNT (sizeof (widen_spec_list) / sizeof (string_pattern_pair)) 470 471 472 /* The simplify_spec_list specifies simplifying transformations that 473 will reduce the instruction width or otherwise simplify an 474 instruction. These are usually applied before relaxation in the 475 assembler. It is always legal to simplify. Even for "addi as, 0", 476 the "addi.n as, 0" will eventually be widened back to an "addi 0" 477 after the widening table is applied. Note: The usage of this table 478 has changed somewhat so that it is entirely specific to "narrowing" 479 instructions to use the density option. This table is not used at 480 all when the density option is not available. */ 481 482 string_pattern_pair simplify_spec_list[] = 483 { 484 {"add %ar,%as,%at ? IsaUseDensityInstruction", "add.n %ar,%as,%at"}, 485 {"addi.n %ar,%as,0 ? IsaUseDensityInstruction", "mov.n %ar,%as"}, 486 {"addi %ar,%as,0 ? IsaUseDensityInstruction", "mov.n %ar,%as"}, 487 {"addi %ar,%as,%imm ? IsaUseDensityInstruction", "addi.n %ar,%as,%imm"}, 488 {"addmi %ar,%as,%imm ? IsaUseDensityInstruction", "addi.n %ar,%as,%imm"}, 489 {"beqz %as,%label ? IsaUseDensityInstruction", "beqz.n %as,%label"}, 490 {"bnez %as,%label ? IsaUseDensityInstruction", "bnez.n %as,%label"}, 491 {"l32i %at,%as,%imm ? IsaUseDensityInstruction", "l32i.n %at,%as,%imm"}, 492 {"movi %as,%imm ? IsaUseDensityInstruction", "movi.n %as,%imm"}, 493 {"nop ? realnop ? IsaUseDensityInstruction", "nop.n"}, 494 {"or %ar,%as,%at | %ar==%as | %as==%at ? IsaUseDensityInstruction", "nop.n"}, 495 {"or %ar,%as,%at | %ar!=%as | %as==%at ? IsaUseDensityInstruction", "mov.n %ar,%as"}, 496 {"ret %as ? IsaUseDensityInstruction", "ret.n %as"}, 497 {"retw %as ? IsaUseDensityInstruction", "retw.n %as"}, 498 {"s32i %at,%as,%imm ? IsaUseDensityInstruction", "s32i.n %at,%as,%imm"}, 499 {"slli %ar,%as,0 ? IsaUseDensityInstruction", "mov.n %ar,%as"} 500 }; 501 502 #define SIMPLIFY_COUNT \ 503 (sizeof (simplify_spec_list) / sizeof (string_pattern_pair)) 504 505 506 /* Externally visible functions. */ 507 508 extern bfd_boolean xg_has_userdef_op_fn (OpType); 509 extern long xg_apply_userdef_op_fn (OpType, long); 510 511 512 static void 513 append_transition (TransitionTable *tt, 514 xtensa_opcode opcode, 515 TransitionRule *t, 516 transition_cmp_fn cmp) 517 { 518 TransitionList *tl = (TransitionList *) xmalloc (sizeof (TransitionList)); 519 TransitionList *prev; 520 TransitionList **t_p; 521 assert (tt != NULL); 522 assert (opcode < tt->num_opcodes); 523 524 prev = tt->table[opcode]; 525 tl->rule = t; 526 tl->next = NULL; 527 if (prev == NULL) 528 { 529 tt->table[opcode] = tl; 530 return; 531 } 532 533 for (t_p = &tt->table[opcode]; (*t_p) != NULL; t_p = &(*t_p)->next) 534 { 535 if (cmp && cmp (t, (*t_p)->rule) < 0) 536 { 537 /* Insert it here. */ 538 tl->next = *t_p; 539 *t_p = tl; 540 return; 541 } 542 } 543 (*t_p) = tl; 544 } 545 546 547 static void 548 append_condition (TransitionRule *tr, Precondition *cond) 549 { 550 PreconditionList *pl = 551 (PreconditionList *) xmalloc (sizeof (PreconditionList)); 552 PreconditionList *prev = tr->conditions; 553 PreconditionList *nxt; 554 555 pl->precond = cond; 556 pl->next = NULL; 557 if (prev == NULL) 558 { 559 tr->conditions = pl; 560 return; 561 } 562 nxt = prev->next; 563 while (nxt != NULL) 564 { 565 prev = nxt; 566 nxt = nxt->next; 567 } 568 prev->next = pl; 569 } 570 571 572 static void 573 append_value_condition (TransitionRule *tr, 574 CmpOp cmp, 575 unsigned op1, 576 unsigned op2) 577 { 578 Precondition *cond = (Precondition *) xmalloc (sizeof (Precondition)); 579 580 cond->cmp = cmp; 581 cond->op_num = op1; 582 cond->typ = OP_OPERAND; 583 cond->op_data = op2; 584 append_condition (tr, cond); 585 } 586 587 588 static void 589 append_constant_value_condition (TransitionRule *tr, 590 CmpOp cmp, 591 unsigned op1, 592 unsigned cnst) 593 { 594 Precondition *cond = (Precondition *) xmalloc (sizeof (Precondition)); 595 596 cond->cmp = cmp; 597 cond->op_num = op1; 598 cond->typ = OP_CONSTANT; 599 cond->op_data = cnst; 600 append_condition (tr, cond); 601 } 602 603 604 static void 605 append_build_insn (TransitionRule *tr, BuildInstr *bi) 606 { 607 BuildInstr *prev = tr->to_instr; 608 BuildInstr *nxt; 609 610 bi->next = NULL; 611 if (prev == NULL) 612 { 613 tr->to_instr = bi; 614 return; 615 } 616 nxt = prev->next; 617 while (nxt != 0) 618 { 619 prev = nxt; 620 nxt = prev->next; 621 } 622 prev->next = bi; 623 } 624 625 626 static void 627 append_op (BuildInstr *bi, BuildOp *b_op) 628 { 629 BuildOp *prev = bi->ops; 630 BuildOp *nxt; 631 632 if (prev == NULL) 633 { 634 bi->ops = b_op; 635 return; 636 } 637 nxt = prev->next; 638 while (nxt != NULL) 639 { 640 prev = nxt; 641 nxt = nxt->next; 642 } 643 prev->next = b_op; 644 } 645 646 647 static void 648 append_literal_op (BuildInstr *bi, unsigned op1, unsigned src_op) 649 { 650 BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp)); 651 652 b_op->op_num = op1; 653 b_op->typ = OP_LITERAL; 654 b_op->op_data = src_op; 655 b_op->next = NULL; 656 append_op (bi, b_op); 657 } 658 659 660 static void 661 append_label_op (BuildInstr *bi, unsigned op1) 662 { 663 BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp)); 664 665 b_op->op_num = op1; 666 b_op->typ = OP_LABEL; 667 b_op->op_data = 0; 668 b_op->next = NULL; 669 append_op (bi, b_op); 670 } 671 672 673 static void 674 append_constant_op (BuildInstr *bi, unsigned op1, unsigned cnst) 675 { 676 BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp)); 677 678 b_op->op_num = op1; 679 b_op->typ = OP_CONSTANT; 680 b_op->op_data = cnst; 681 b_op->next = NULL; 682 append_op (bi, b_op); 683 } 684 685 686 static void 687 append_field_op (BuildInstr *bi, unsigned op1, unsigned src_op) 688 { 689 BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp)); 690 691 b_op->op_num = op1; 692 b_op->typ = OP_OPERAND; 693 b_op->op_data = src_op; 694 b_op->next = NULL; 695 append_op (bi, b_op); 696 } 697 698 699 /* These could be generated but are not currently. */ 700 701 static void 702 append_user_fn_field_op (BuildInstr *bi, 703 unsigned op1, 704 OpType typ, 705 unsigned src_op) 706 { 707 BuildOp *b_op = (BuildOp *) xmalloc (sizeof (BuildOp)); 708 709 b_op->op_num = op1; 710 b_op->typ = typ; 711 b_op->op_data = src_op; 712 b_op->next = NULL; 713 append_op (bi, b_op); 714 } 715 716 717 /* These operand functions are the semantics of user-defined 718 operand functions. */ 719 720 static long 721 operand_function_HI24S (long a) 722 { 723 if (a & 0x80) 724 return (a & (~0xff)) + 0x100; 725 else 726 return (a & (~0xff)); 727 } 728 729 730 static long 731 operand_function_F32MINUS (long a) 732 { 733 return (32 - a); 734 } 735 736 737 static long 738 operand_function_LOW8 (long a) 739 { 740 if (a & 0x80) 741 return (a & 0xff) | ~0xff; 742 else 743 return (a & 0xff); 744 } 745 746 747 static long 748 operand_function_LOW16U (long a) 749 { 750 return (a & 0xffff); 751 } 752 753 754 static long 755 operand_function_HI16U (long a) 756 { 757 unsigned long b = a & 0xffff0000; 758 return (long) (b >> 16); 759 } 760 761 762 bfd_boolean 763 xg_has_userdef_op_fn (OpType op) 764 { 765 switch (op) 766 { 767 case OP_OPERAND_F32MINUS: 768 case OP_OPERAND_LOW8: 769 case OP_OPERAND_HI24S: 770 case OP_OPERAND_LOW16U: 771 case OP_OPERAND_HI16U: 772 return TRUE; 773 default: 774 break; 775 } 776 return FALSE; 777 } 778 779 780 long 781 xg_apply_userdef_op_fn (OpType op, long a) 782 { 783 switch (op) 784 { 785 case OP_OPERAND_F32MINUS: 786 return operand_function_F32MINUS (a); 787 case OP_OPERAND_LOW8: 788 return operand_function_LOW8 (a); 789 case OP_OPERAND_HI24S: 790 return operand_function_HI24S (a); 791 case OP_OPERAND_LOW16U: 792 return operand_function_LOW16U (a); 793 case OP_OPERAND_HI16U: 794 return operand_function_HI16U (a); 795 default: 796 break; 797 } 798 return FALSE; 799 } 800 801 802 /* Generate a transition table. */ 803 804 static const char * 805 enter_opname_n (const char *name, int len) 806 { 807 opname_e *op; 808 809 for (op = local_opnames; op != NULL; op = op->next) 810 { 811 if (strlen (op->opname) == (unsigned) len 812 && strncmp (op->opname, name, len) == 0) 813 return op->opname; 814 } 815 op = (opname_e *) xmalloc (sizeof (opname_e)); 816 op->opname = (char *) xmalloc (len + 1); 817 strncpy (op->opname, name, len); 818 op->opname[len] = '\0'; 819 return op->opname; 820 } 821 822 823 static const char * 824 enter_opname (const char *name) 825 { 826 opname_e *op; 827 828 for (op = local_opnames; op != NULL; op = op->next) 829 { 830 if (strcmp (op->opname, name) == 0) 831 return op->opname; 832 } 833 op = (opname_e *) xmalloc (sizeof (opname_e)); 834 op->opname = xstrdup (name); 835 return op->opname; 836 } 837 838 839 static void 840 init_opname_map (opname_map *m) 841 { 842 m->head = NULL; 843 m->tail = &m->head; 844 } 845 846 847 static void 848 clear_opname_map (opname_map *m) 849 { 850 opname_map_e *e; 851 852 while (m->head != NULL) 853 { 854 e = m->head; 855 m->head = e->next; 856 free (e); 857 } 858 m->tail = &m->head; 859 } 860 861 862 static bfd_boolean 863 same_operand_name (const opname_map_e *m1, const opname_map_e *m2) 864 { 865 if (m1->operand_name == NULL || m1->operand_name == NULL) 866 return FALSE; 867 return (m1->operand_name == m2->operand_name); 868 } 869 870 871 static opname_map_e * 872 get_opmatch (opname_map *map, const char *operand_name) 873 { 874 opname_map_e *m; 875 876 for (m = map->head; m != NULL; m = m->next) 877 { 878 if (strcmp (m->operand_name, operand_name) == 0) 879 return m; 880 } 881 return NULL; 882 } 883 884 885 static bfd_boolean 886 op_is_constant (const opname_map_e *m1) 887 { 888 return (m1->operand_name == NULL); 889 } 890 891 892 static unsigned 893 op_get_constant (const opname_map_e *m1) 894 { 895 assert (m1->operand_name == NULL); 896 return m1->constant_value; 897 } 898 899 900 static void 901 init_precond_list (precond_list *l) 902 { 903 l->head = NULL; 904 l->tail = &l->head; 905 } 906 907 908 static void 909 clear_precond_list (precond_list *l) 910 { 911 precond_e *e; 912 913 while (l->head != NULL) 914 { 915 e = l->head; 916 l->head = e->next; 917 free (e); 918 } 919 l->tail = &l->head; 920 } 921 922 923 static void 924 init_insn_templ (insn_templ *t) 925 { 926 t->opcode_name = NULL; 927 init_opname_map (&t->operand_map); 928 } 929 930 931 static void 932 clear_insn_templ (insn_templ *t) 933 { 934 clear_opname_map (&t->operand_map); 935 } 936 937 938 static void 939 init_insn_pattern (insn_pattern *p) 940 { 941 init_insn_templ (&p->t); 942 init_precond_list (&p->preconds); 943 p->options = NULL; 944 } 945 946 947 static void 948 clear_insn_pattern (insn_pattern *p) 949 { 950 clear_insn_templ (&p->t); 951 clear_precond_list (&p->preconds); 952 } 953 954 955 static void 956 init_insn_repl (insn_repl *r) 957 { 958 r->head = NULL; 959 r->tail = &r->head; 960 } 961 962 963 static void 964 clear_insn_repl (insn_repl *r) 965 { 966 insn_repl_e *e; 967 968 while (r->head != NULL) 969 { 970 e = r->head; 971 r->head = e->next; 972 clear_insn_templ (&e->t); 973 } 974 r->tail = &r->head; 975 } 976 977 978 static int 979 insn_templ_operand_count (const insn_templ *t) 980 { 981 int i = 0; 982 const opname_map_e *op; 983 984 for (op = t->operand_map.head; op != NULL; op = op->next, i++) 985 ; 986 return i; 987 } 988 989 990 /* Convert a string to a number. E.G.: parse_constant("10", &num) */ 991 992 static bfd_boolean 993 parse_constant (const char *in, unsigned *val_p) 994 { 995 unsigned val = 0; 996 const char *p; 997 998 if (in == NULL) 999 return FALSE; 1000 p = in; 1001 1002 while (*p != '\0') 1003 { 1004 if (*p >= '0' && *p <= '9') 1005 val = val * 10 + (*p - '0'); 1006 else 1007 return FALSE; 1008 ++p; 1009 } 1010 *val_p = val; 1011 return TRUE; 1012 } 1013 1014 1015 static bfd_boolean 1016 parse_special_fn (const char *name, 1017 const char **fn_name_p, 1018 const char **arg_name_p) 1019 { 1020 char *p_start; 1021 const char *p_end; 1022 1023 p_start = strchr (name, '('); 1024 if (p_start == NULL) 1025 return FALSE; 1026 1027 p_end = strchr (p_start, ')'); 1028 1029 if (p_end == NULL) 1030 return FALSE; 1031 1032 if (p_end[1] != '\0') 1033 return FALSE; 1034 1035 *fn_name_p = enter_opname_n (name, p_start - name); 1036 *arg_name_p = enter_opname_n (p_start + 1, p_end - p_start - 1); 1037 return TRUE; 1038 } 1039 1040 1041 static const char * 1042 skip_white (const char *p) 1043 { 1044 if (p == NULL) 1045 return p; 1046 while (*p == ' ') 1047 ++p; 1048 return p; 1049 } 1050 1051 1052 static void 1053 trim_whitespace (char *in) 1054 { 1055 char *last_white = NULL; 1056 char *p = in; 1057 1058 while (p && *p != '\0') 1059 { 1060 while (*p == ' ') 1061 { 1062 if (last_white == NULL) 1063 last_white = p; 1064 p++; 1065 } 1066 if (*p != '\0') 1067 { 1068 last_white = NULL; 1069 p++; 1070 } 1071 } 1072 if (last_white) 1073 *last_white = '\0'; 1074 } 1075 1076 1077 /* Split a string into component strings where "c" is the 1078 delimiter. Place the result in the split_rec. */ 1079 1080 static void 1081 split_string (split_rec *rec, 1082 const char *in, 1083 char c, 1084 bfd_boolean elide_whitespace) 1085 { 1086 int cnt = 0; 1087 int i; 1088 const char *p = in; 1089 1090 while (p != NULL && *p != '\0') 1091 { 1092 cnt++; 1093 p = strchr (p, c); 1094 if (p) 1095 p++; 1096 } 1097 rec->count = cnt; 1098 rec->vec = NULL; 1099 1100 if (rec->count == 0) 1101 return; 1102 1103 rec->vec = (char **) xmalloc (sizeof (char *) * cnt); 1104 for (i = 0; i < cnt; i++) 1105 rec->vec[i] = 0; 1106 1107 p = in; 1108 for (i = 0; i < cnt; i++) 1109 { 1110 const char *q; 1111 int len; 1112 1113 q = p; 1114 if (elide_whitespace) 1115 q = skip_white (q); 1116 1117 p = strchr (q, c); 1118 if (p == NULL) 1119 rec->vec[i] = xstrdup (q); 1120 else 1121 { 1122 len = p - q; 1123 rec->vec[i] = (char *) xmalloc (sizeof (char) * (len + 1)); 1124 strncpy (rec->vec[i], q, len); 1125 rec->vec[i][len] = '\0'; 1126 p++; 1127 } 1128 1129 if (elide_whitespace) 1130 trim_whitespace (rec->vec[i]); 1131 } 1132 } 1133 1134 1135 static void 1136 clear_split_rec (split_rec *rec) 1137 { 1138 int i; 1139 1140 for (i = 0; i < rec->count; i++) 1141 free (rec->vec[i]); 1142 1143 if (rec->count > 0) 1144 free (rec->vec); 1145 } 1146 1147 1148 /* Initialize a split record. The split record must be initialized 1149 before split_string is called. */ 1150 1151 static void 1152 init_split_rec (split_rec *rec) 1153 { 1154 rec->vec = NULL; 1155 rec->count = 0; 1156 } 1157 1158 1159 /* Parse an instruction template like "insn op1, op2, op3". */ 1160 1161 static bfd_boolean 1162 parse_insn_templ (const char *s, insn_templ *t) 1163 { 1164 const char *p = s; 1165 int insn_name_len; 1166 split_rec oprec; 1167 int i; 1168 1169 /* First find the first whitespace. */ 1170 1171 init_split_rec (&oprec); 1172 1173 p = skip_white (p); 1174 insn_name_len = strcspn (s, " "); 1175 if (insn_name_len == 0) 1176 return FALSE; 1177 1178 init_insn_templ (t); 1179 t->opcode_name = enter_opname_n (p, insn_name_len); 1180 1181 p = p + insn_name_len; 1182 1183 /* Split by ',' and skip beginning and trailing whitespace. */ 1184 split_string (&oprec, p, ',', TRUE); 1185 1186 for (i = 0; i < oprec.count; i++) 1187 { 1188 const char *opname = oprec.vec[i]; 1189 opname_map_e *e = (opname_map_e *) xmalloc (sizeof (opname_map_e)); 1190 e->next = NULL; 1191 e->operand_name = NULL; 1192 e->constant_value = 0; 1193 e->operand_num = i; 1194 1195 /* If it begins with a number, assume that it is a number. */ 1196 if (opname && opname[0] >= '0' && opname[0] <= '9') 1197 { 1198 unsigned val; 1199 1200 if (parse_constant (opname, &val)) 1201 e->constant_value = val; 1202 else 1203 { 1204 free (e); 1205 clear_split_rec (&oprec); 1206 clear_insn_templ (t); 1207 return FALSE; 1208 } 1209 } 1210 else 1211 e->operand_name = enter_opname (oprec.vec[i]); 1212 1213 *t->operand_map.tail = e; 1214 t->operand_map.tail = &e->next; 1215 } 1216 clear_split_rec (&oprec); 1217 return TRUE; 1218 } 1219 1220 1221 static bfd_boolean 1222 parse_precond (const char *s, precond_e *precond) 1223 { 1224 /* All preconditions are currently of the form: 1225 a == b or a != b or a == k (where k is a constant). 1226 Later we may use some special functions like DENSITY == 1 1227 to identify when density is available. */ 1228 1229 const char *p = s; 1230 int len; 1231 precond->opname1 = NULL; 1232 precond->opval1 = 0; 1233 precond->cmpop = OP_EQUAL; 1234 precond->opname2 = NULL; 1235 precond->opval2 = 0; 1236 precond->next = NULL; 1237 1238 p = skip_white (p); 1239 1240 len = strcspn (p, " !="); 1241 1242 if (len == 0) 1243 return FALSE; 1244 1245 precond->opname1 = enter_opname_n (p, len); 1246 p = p + len; 1247 p = skip_white (p); 1248 1249 /* Check for "==" and "!=". */ 1250 if (strncmp (p, "==", 2) == 0) 1251 precond->cmpop = OP_EQUAL; 1252 else if (strncmp (p, "!=", 2) == 0) 1253 precond->cmpop = OP_NOTEQUAL; 1254 else 1255 return FALSE; 1256 1257 p = p + 2; 1258 p = skip_white (p); 1259 1260 /* No trailing whitespace from earlier parsing. */ 1261 if (p[0] >= '0' && p[0] <= '9') 1262 { 1263 unsigned val; 1264 if (parse_constant (p, &val)) 1265 precond->opval2 = val; 1266 else 1267 return FALSE; 1268 } 1269 else 1270 precond->opname2 = enter_opname (p); 1271 return TRUE; 1272 } 1273 1274 1275 static void 1276 clear_req_or_option_list (ReqOrOption **r_p) 1277 { 1278 if (*r_p == NULL) 1279 return; 1280 1281 free ((*r_p)->option_name); 1282 clear_req_or_option_list (&(*r_p)->next); 1283 *r_p = NULL; 1284 } 1285 1286 1287 static void 1288 clear_req_option_list (ReqOption **r_p) 1289 { 1290 if (*r_p == NULL) 1291 return; 1292 1293 clear_req_or_option_list (&(*r_p)->or_option_terms); 1294 clear_req_option_list (&(*r_p)->next); 1295 *r_p = NULL; 1296 } 1297 1298 1299 static ReqOrOption * 1300 clone_req_or_option_list (ReqOrOption *req_or_option) 1301 { 1302 ReqOrOption *new_req_or_option; 1303 1304 if (req_or_option == NULL) 1305 return NULL; 1306 1307 new_req_or_option = (ReqOrOption *) xmalloc (sizeof (ReqOrOption)); 1308 new_req_or_option->option_name = xstrdup (req_or_option->option_name); 1309 new_req_or_option->is_true = req_or_option->is_true; 1310 new_req_or_option->next = NULL; 1311 new_req_or_option->next = clone_req_or_option_list (req_or_option->next); 1312 return new_req_or_option; 1313 } 1314 1315 1316 static ReqOption * 1317 clone_req_option_list (ReqOption *req_option) 1318 { 1319 ReqOption *new_req_option; 1320 1321 if (req_option == NULL) 1322 return NULL; 1323 1324 new_req_option = (ReqOption *) xmalloc (sizeof (ReqOption)); 1325 new_req_option->or_option_terms = NULL; 1326 new_req_option->next = NULL; 1327 new_req_option->or_option_terms = 1328 clone_req_or_option_list (req_option->or_option_terms); 1329 new_req_option->next = clone_req_option_list (req_option->next); 1330 return new_req_option; 1331 } 1332 1333 1334 static bfd_boolean 1335 parse_option_cond (const char *s, ReqOption *option) 1336 { 1337 int i; 1338 split_rec option_term_rec; 1339 1340 /* All option or conditions are of the form: 1341 optionA + no-optionB + ... 1342 "Ands" are divided by "?". */ 1343 1344 init_split_rec (&option_term_rec); 1345 split_string (&option_term_rec, s, '+', TRUE); 1346 1347 if (option_term_rec.count == 0) 1348 { 1349 clear_split_rec (&option_term_rec); 1350 return FALSE; 1351 } 1352 1353 for (i = 0; i < option_term_rec.count; i++) 1354 { 1355 char *option_name = option_term_rec.vec[i]; 1356 bfd_boolean is_true = TRUE; 1357 ReqOrOption *req; 1358 ReqOrOption **r_p; 1359 1360 if (strncmp (option_name, "no-", 3) == 0) 1361 { 1362 option_name = xstrdup (&option_name[3]); 1363 is_true = FALSE; 1364 } 1365 else 1366 option_name = xstrdup (option_name); 1367 1368 req = (ReqOrOption *) xmalloc (sizeof (ReqOrOption)); 1369 req->option_name = option_name; 1370 req->is_true = is_true; 1371 req->next = NULL; 1372 1373 /* Append to list. */ 1374 for (r_p = &option->or_option_terms; (*r_p) != NULL; 1375 r_p = &(*r_p)->next) 1376 ; 1377 (*r_p) = req; 1378 } 1379 return TRUE; 1380 } 1381 1382 1383 /* Parse a string like: 1384 "insn op1, op2, op3, op4 | op1 != op2 | op2 == op3 | op4 == 1". 1385 I.E., instruction "insn" with 4 operands where operand 1 and 2 are not 1386 the same and operand 2 and 3 are the same and operand 4 is 1. 1387 1388 or: 1389 1390 "insn op1 | op1 == 1 / density + boolean / no-useroption". 1391 i.e. instruction "insn" with 1 operands where operand 1 is 1 1392 when "density" or "boolean" options are available and 1393 "useroption" is not available. 1394 1395 Because the current implementation of this parsing scheme uses 1396 split_string, it requires that '|' and '?' are only used as 1397 delimiters for predicates and required options. */ 1398 1399 static bfd_boolean 1400 parse_insn_pattern (const char *in, insn_pattern *insn) 1401 { 1402 split_rec rec; 1403 split_rec optionrec; 1404 int i; 1405 1406 init_insn_pattern (insn); 1407 1408 init_split_rec (&optionrec); 1409 split_string (&optionrec, in, '?', TRUE); 1410 if (optionrec.count == 0) 1411 { 1412 clear_split_rec (&optionrec); 1413 return FALSE; 1414 } 1415 1416 init_split_rec (&rec); 1417 1418 split_string (&rec, optionrec.vec[0], '|', TRUE); 1419 1420 if (rec.count == 0) 1421 { 1422 clear_split_rec (&rec); 1423 clear_split_rec (&optionrec); 1424 return FALSE; 1425 } 1426 1427 if (!parse_insn_templ (rec.vec[0], &insn->t)) 1428 { 1429 clear_split_rec (&rec); 1430 clear_split_rec (&optionrec); 1431 return FALSE; 1432 } 1433 1434 for (i = 1; i < rec.count; i++) 1435 { 1436 precond_e *cond = (precond_e *) xmalloc (sizeof (precond_e)); 1437 1438 if (!parse_precond (rec.vec[i], cond)) 1439 { 1440 clear_split_rec (&rec); 1441 clear_split_rec (&optionrec); 1442 clear_insn_pattern (insn); 1443 return FALSE; 1444 } 1445 1446 /* Append the condition. */ 1447 *insn->preconds.tail = cond; 1448 insn->preconds.tail = &cond->next; 1449 } 1450 1451 for (i = 1; i < optionrec.count; i++) 1452 { 1453 /* Handle the option conditions. */ 1454 ReqOption **r_p; 1455 ReqOption *req_option = (ReqOption *) xmalloc (sizeof (ReqOption)); 1456 req_option->or_option_terms = NULL; 1457 req_option->next = NULL; 1458 1459 if (!parse_option_cond (optionrec.vec[i], req_option)) 1460 { 1461 clear_split_rec (&rec); 1462 clear_split_rec (&optionrec); 1463 clear_insn_pattern (insn); 1464 clear_req_option_list (&req_option); 1465 return FALSE; 1466 } 1467 1468 /* Append the condition. */ 1469 for (r_p = &insn->options; (*r_p) != NULL; r_p = &(*r_p)->next) 1470 ; 1471 1472 (*r_p) = req_option; 1473 } 1474 1475 clear_split_rec (&rec); 1476 clear_split_rec (&optionrec); 1477 return TRUE; 1478 } 1479 1480 1481 static bfd_boolean 1482 parse_insn_repl (const char *in, insn_repl *r_p) 1483 { 1484 /* This is a list of instruction templates separated by ';'. */ 1485 split_rec rec; 1486 int i; 1487 1488 split_string (&rec, in, ';', TRUE); 1489 1490 for (i = 0; i < rec.count; i++) 1491 { 1492 insn_repl_e *e = (insn_repl_e *) xmalloc (sizeof (insn_repl_e)); 1493 1494 e->next = NULL; 1495 1496 if (!parse_insn_templ (rec.vec[i], &e->t)) 1497 { 1498 free (e); 1499 clear_insn_repl (r_p); 1500 return FALSE; 1501 } 1502 *r_p->tail = e; 1503 r_p->tail = &e->next; 1504 } 1505 return TRUE; 1506 } 1507 1508 1509 static bfd_boolean 1510 transition_applies (insn_pattern *initial_insn, 1511 const char *from_string ATTRIBUTE_UNUSED, 1512 const char *to_string ATTRIBUTE_UNUSED) 1513 { 1514 ReqOption *req_option; 1515 1516 for (req_option = initial_insn->options; 1517 req_option != NULL; 1518 req_option = req_option->next) 1519 { 1520 ReqOrOption *req_or_option = req_option->or_option_terms; 1521 1522 if (req_or_option == NULL 1523 || req_or_option->next != NULL) 1524 continue; 1525 1526 if (strncmp (req_or_option->option_name, "IsaUse", 6) == 0) 1527 { 1528 bfd_boolean option_available = FALSE; 1529 char *option_name = req_or_option->option_name + 6; 1530 if (!strcmp (option_name, "DensityInstruction")) 1531 option_available = (XCHAL_HAVE_DENSITY == 1); 1532 else if (!strcmp (option_name, "L32R")) 1533 option_available = (XCHAL_HAVE_L32R == 1); 1534 else if (!strcmp (option_name, "Const16")) 1535 option_available = (XCHAL_HAVE_CONST16 == 1); 1536 else if (!strcmp (option_name, "Loops")) 1537 option_available = (XCHAL_HAVE_LOOPS == 1); 1538 else if (!strcmp (option_name, "WideBranches")) 1539 option_available = (XCHAL_HAVE_WIDE_BRANCHES == 1); 1540 else if (!strcmp (option_name, "PredictedBranches")) 1541 option_available = (XCHAL_HAVE_PREDICTED_BRANCHES == 1); 1542 else if (!strcmp (option_name, "Booleans")) 1543 option_available = (XCHAL_HAVE_BOOLEANS == 1); 1544 else 1545 as_warn (_("invalid configuration option '%s' in transition rule '%s'"), 1546 req_or_option->option_name, from_string); 1547 if ((option_available ^ req_or_option->is_true) != 0) 1548 return FALSE; 1549 } 1550 else if (strcmp (req_or_option->option_name, "realnop") == 0) 1551 { 1552 bfd_boolean nop_available = 1553 (xtensa_opcode_lookup (xtensa_default_isa, "nop") 1554 != XTENSA_UNDEFINED); 1555 if ((nop_available ^ req_or_option->is_true) != 0) 1556 return FALSE; 1557 } 1558 } 1559 return TRUE; 1560 } 1561 1562 1563 static bfd_boolean 1564 wide_branch_opcode (const char *opcode_name, 1565 char *suffix, 1566 xtensa_opcode *popcode) 1567 { 1568 xtensa_isa isa = xtensa_default_isa; 1569 xtensa_opcode opcode; 1570 static char wbr_name_buf[20]; 1571 1572 if (strncmp (opcode_name, "WIDE.", 5) != 0) 1573 return FALSE; 1574 1575 strcpy (wbr_name_buf, opcode_name + 5); 1576 strcat (wbr_name_buf, suffix); 1577 opcode = xtensa_opcode_lookup (isa, wbr_name_buf); 1578 if (opcode != XTENSA_UNDEFINED) 1579 { 1580 *popcode = opcode; 1581 return TRUE; 1582 } 1583 1584 return FALSE; 1585 } 1586 1587 1588 static TransitionRule * 1589 build_transition (insn_pattern *initial_insn, 1590 insn_repl *replace_insns, 1591 const char *from_string, 1592 const char *to_string) 1593 { 1594 TransitionRule *tr = NULL; 1595 xtensa_opcode opcode; 1596 xtensa_isa isa = xtensa_default_isa; 1597 BuildInstr *literal_bi; 1598 1599 opname_map_e *op1; 1600 opname_map_e *op2; 1601 1602 precond_e *precond; 1603 insn_repl_e *r; 1604 1605 if (!wide_branch_opcode (initial_insn->t.opcode_name, ".w18", &opcode) 1606 && !wide_branch_opcode (initial_insn->t.opcode_name, ".w15", &opcode)) 1607 opcode = xtensa_opcode_lookup (isa, initial_insn->t.opcode_name); 1608 1609 if (opcode == XTENSA_UNDEFINED) 1610 { 1611 /* It is OK to not be able to translate some of these opcodes. */ 1612 return NULL; 1613 } 1614 1615 1616 if (xtensa_opcode_num_operands (isa, opcode) 1617 != insn_templ_operand_count (&initial_insn->t)) 1618 { 1619 /* This is also OK because there are opcodes that 1620 have different numbers of operands on different 1621 architecture variations. */ 1622 return NULL; 1623 } 1624 1625 tr = (TransitionRule *) xmalloc (sizeof (TransitionRule)); 1626 tr->opcode = opcode; 1627 tr->conditions = NULL; 1628 tr->to_instr = NULL; 1629 1630 /* Build the conditions. First, equivalent operand condition.... */ 1631 for (op1 = initial_insn->t.operand_map.head; op1 != NULL; op1 = op1->next) 1632 { 1633 for (op2 = op1->next; op2 != NULL; op2 = op2->next) 1634 { 1635 if (same_operand_name (op1, op2)) 1636 { 1637 append_value_condition (tr, OP_EQUAL, 1638 op1->operand_num, op2->operand_num); 1639 } 1640 } 1641 } 1642 1643 /* Now the condition that an operand value must be a constant.... */ 1644 for (op1 = initial_insn->t.operand_map.head; op1 != NULL; op1 = op1->next) 1645 { 1646 if (op_is_constant (op1)) 1647 { 1648 append_constant_value_condition (tr, 1649 OP_EQUAL, 1650 op1->operand_num, 1651 op_get_constant (op1)); 1652 } 1653 } 1654 1655 1656 /* Now add the explicit preconditions listed after the "|" in the spec. 1657 These are currently very limited, so we do a special case 1658 parse for them. We expect spaces, opname != opname. */ 1659 for (precond = initial_insn->preconds.head; 1660 precond != NULL; 1661 precond = precond->next) 1662 { 1663 op1 = NULL; 1664 op2 = NULL; 1665 1666 if (precond->opname1) 1667 { 1668 op1 = get_opmatch (&initial_insn->t.operand_map, precond->opname1); 1669 if (op1 == NULL) 1670 as_fatal (_("opcode '%s': no bound opname '%s' " 1671 "for precondition in '%s'"), 1672 xtensa_opcode_name (isa, opcode), 1673 precond->opname1, from_string); 1674 } 1675 1676 if (precond->opname2) 1677 { 1678 op2 = get_opmatch (&initial_insn->t.operand_map, precond->opname2); 1679 if (op2 == NULL) 1680 as_fatal (_("opcode '%s': no bound opname '%s' " 1681 "for precondition in %s"), 1682 xtensa_opcode_name (isa, opcode), 1683 precond->opname2, from_string); 1684 } 1685 1686 if (op1 == NULL && op2 == NULL) 1687 as_fatal (_("opcode '%s': precondition only contains " 1688 "constants in '%s'"), 1689 xtensa_opcode_name (isa, opcode), from_string); 1690 else if (op1 != NULL && op2 != NULL) 1691 append_value_condition (tr, precond->cmpop, 1692 op1->operand_num, op2->operand_num); 1693 else if (op2 == NULL) 1694 append_constant_value_condition (tr, precond->cmpop, 1695 op1->operand_num, precond->opval2); 1696 else 1697 append_constant_value_condition (tr, precond->cmpop, 1698 op2->operand_num, precond->opval1); 1699 } 1700 1701 tr->options = clone_req_option_list (initial_insn->options); 1702 1703 /* Generate the replacement instructions. Some of these 1704 "instructions" are actually labels and literals. There can be at 1705 most one literal and at most one label. A literal must be defined 1706 (e.g., "LITERAL %imm") before use (e.g., "%LITERAL"). The labels 1707 can be used before they are defined. Also there are a number of 1708 special operands (e.g., HI24S). */ 1709 1710 literal_bi = NULL; 1711 for (r = replace_insns->head; r != NULL; r = r->next) 1712 { 1713 BuildInstr *bi; 1714 const char *opcode_name; 1715 int operand_count; 1716 opname_map_e *op; 1717 const char *fn_name; 1718 const char *operand_arg_name; 1719 1720 bi = (BuildInstr *) xmalloc (sizeof (BuildInstr)); 1721 append_build_insn (tr, bi); 1722 1723 bi->opcode = XTENSA_UNDEFINED; 1724 bi->ops = NULL; 1725 bi->next = NULL; 1726 1727 opcode_name = r->t.opcode_name; 1728 operand_count = insn_templ_operand_count (&r->t); 1729 1730 if (strcmp (opcode_name, "LITERAL") == 0) 1731 { 1732 bi->typ = INSTR_LITERAL_DEF; 1733 if (operand_count != 1) 1734 as_fatal (_("expected one operand for generated literal")); 1735 literal_bi = bi; 1736 } 1737 else if (strcmp (opcode_name, "LABEL") == 0) 1738 { 1739 bi->typ = INSTR_LABEL_DEF; 1740 if (operand_count != 0) 1741 as_fatal (_("expected 0 operands for generated label")); 1742 } 1743 else 1744 { 1745 bi->typ = INSTR_INSTR; 1746 if (wide_branch_opcode (opcode_name, ".w18", &bi->opcode) 1747 || wide_branch_opcode (opcode_name, ".w15", &bi->opcode)) 1748 opcode_name = xtensa_opcode_name (isa, bi->opcode); 1749 else 1750 bi->opcode = xtensa_opcode_lookup (isa, opcode_name); 1751 1752 if (bi->opcode == XTENSA_UNDEFINED) 1753 { 1754 as_warn (_("invalid opcode '%s' in transition rule '%s'"), 1755 opcode_name, to_string); 1756 return NULL; 1757 } 1758 1759 /* Check for the right number of ops. */ 1760 if (xtensa_opcode_num_operands (isa, bi->opcode) 1761 != (int) operand_count) 1762 as_fatal (_("opcode '%s': replacement does not have %d ops"), 1763 opcode_name, 1764 xtensa_opcode_num_operands (isa, bi->opcode)); 1765 } 1766 1767 for (op = r->t.operand_map.head; op != NULL; op = op->next) 1768 { 1769 unsigned idnum; 1770 1771 if (op_is_constant (op)) 1772 append_constant_op (bi, op->operand_num, op_get_constant (op)); 1773 else if (strcmp (op->operand_name, "%LITERAL") == 0) 1774 { 1775 if (! literal_bi || ! literal_bi->ops || literal_bi->ops->next) 1776 as_fatal (_("opcode '%s': cannot find literal definition"), 1777 opcode_name); 1778 append_literal_op (bi, op->operand_num, 1779 literal_bi->ops->op_data); 1780 } 1781 else if (strcmp (op->operand_name, "%LABEL") == 0) 1782 append_label_op (bi, op->operand_num); 1783 else if (op->operand_name[0] == 'a' 1784 && parse_constant (op->operand_name + 1, &idnum)) 1785 append_constant_op (bi, op->operand_num, idnum); 1786 else if (op->operand_name[0] == '%') 1787 { 1788 opname_map_e *orig_op; 1789 orig_op = get_opmatch (&initial_insn->t.operand_map, 1790 op->operand_name); 1791 if (orig_op == NULL) 1792 as_fatal (_("opcode %s: unidentified operand '%s' in '%s'"), 1793 opcode_name, op->operand_name, to_string); 1794 append_field_op (bi, op->operand_num, orig_op->operand_num); 1795 } 1796 else if (parse_special_fn (op->operand_name, 1797 &fn_name, &operand_arg_name)) 1798 { 1799 opname_map_e *orig_op; 1800 OpType typ = OP_CONSTANT; 1801 1802 if (strcmp (fn_name, "LOW8") == 0) 1803 typ = OP_OPERAND_LOW8; 1804 else if (strcmp (fn_name, "HI24S") == 0) 1805 typ = OP_OPERAND_HI24S; 1806 else if (strcmp (fn_name, "F32MINUS") == 0) 1807 typ = OP_OPERAND_F32MINUS; 1808 else if (strcmp (fn_name, "LOW16U") == 0) 1809 typ = OP_OPERAND_LOW16U; 1810 else if (strcmp (fn_name, "HI16U") == 0) 1811 typ = OP_OPERAND_HI16U; 1812 else 1813 as_fatal (_("unknown user-defined function %s"), fn_name); 1814 1815 orig_op = get_opmatch (&initial_insn->t.operand_map, 1816 operand_arg_name); 1817 if (orig_op == NULL) 1818 as_fatal (_("opcode %s: unidentified operand '%s' in '%s'"), 1819 opcode_name, op->operand_name, to_string); 1820 append_user_fn_field_op (bi, op->operand_num, 1821 typ, orig_op->operand_num); 1822 } 1823 else 1824 as_fatal (_("opcode %s: could not parse operand '%s' in '%s'"), 1825 opcode_name, op->operand_name, to_string); 1826 } 1827 } 1828 1829 return tr; 1830 } 1831 1832 1833 static TransitionTable * 1834 build_transition_table (const string_pattern_pair *transitions, 1835 int transition_count, 1836 transition_cmp_fn cmp) 1837 { 1838 TransitionTable *table = NULL; 1839 int num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa); 1840 int i, tnum; 1841 1842 if (table != NULL) 1843 return table; 1844 1845 /* Otherwise, build it now. */ 1846 table = (TransitionTable *) xmalloc (sizeof (TransitionTable)); 1847 table->num_opcodes = num_opcodes; 1848 table->table = 1849 (TransitionList **) xmalloc (sizeof (TransitionTable *) * num_opcodes); 1850 1851 for (i = 0; i < num_opcodes; i++) 1852 table->table[i] = NULL; 1853 1854 for (tnum = 0; tnum < transition_count; tnum++) 1855 { 1856 const char *from_string = transitions[tnum].pattern; 1857 const char *to_string = transitions[tnum].replacement; 1858 1859 insn_pattern initial_insn; 1860 insn_repl replace_insns; 1861 TransitionRule *tr; 1862 1863 init_insn_pattern (&initial_insn); 1864 if (!parse_insn_pattern (from_string, &initial_insn)) 1865 as_fatal (_("could not parse INSN_PATTERN '%s'"), from_string); 1866 1867 init_insn_repl (&replace_insns); 1868 if (!parse_insn_repl (to_string, &replace_insns)) 1869 as_fatal (_("could not parse INSN_REPL '%s'"), to_string); 1870 1871 if (transition_applies (&initial_insn, from_string, to_string)) 1872 { 1873 tr = build_transition (&initial_insn, &replace_insns, 1874 from_string, to_string); 1875 if (tr) 1876 append_transition (table, tr->opcode, tr, cmp); 1877 else 1878 { 1879 #if TENSILICA_DEBUG 1880 as_warn (_("could not build transition for %s => %s"), 1881 from_string, to_string); 1882 #endif 1883 } 1884 } 1885 1886 clear_insn_repl (&replace_insns); 1887 clear_insn_pattern (&initial_insn); 1888 } 1889 return table; 1890 } 1891 1892 1893 extern TransitionTable * 1894 xg_build_widen_table (transition_cmp_fn cmp) 1895 { 1896 static TransitionTable *table = NULL; 1897 if (table == NULL) 1898 table = build_transition_table (widen_spec_list, WIDEN_COUNT, cmp); 1899 return table; 1900 } 1901 1902 1903 extern TransitionTable * 1904 xg_build_simplify_table (transition_cmp_fn cmp) 1905 { 1906 static TransitionTable *table = NULL; 1907 if (table == NULL) 1908 table = build_transition_table (simplify_spec_list, SIMPLIFY_COUNT, cmp); 1909 return table; 1910 } 1911