1*7f709ce7SMax Filippov /* Interface definition for configurable Xtensa ISA support. 2*7f709ce7SMax Filippov * 3*7f709ce7SMax Filippov * Copyright (c) 2001-2013 Tensilica Inc. 4*7f709ce7SMax Filippov * 5*7f709ce7SMax Filippov * Permission is hereby granted, free of charge, to any person obtaining 6*7f709ce7SMax Filippov * a copy of this software and associated documentation files (the 7*7f709ce7SMax Filippov * "Software"), to deal in the Software without restriction, including 8*7f709ce7SMax Filippov * without limitation the rights to use, copy, modify, merge, publish, 9*7f709ce7SMax Filippov * distribute, sublicense, and/or sell copies of the Software, and to 10*7f709ce7SMax Filippov * permit persons to whom the Software is furnished to do so, subject to 11*7f709ce7SMax Filippov * the following conditions: 12*7f709ce7SMax Filippov * 13*7f709ce7SMax Filippov * The above copyright notice and this permission notice shall be included 14*7f709ce7SMax Filippov * in all copies or substantial portions of the Software. 15*7f709ce7SMax Filippov * 16*7f709ce7SMax Filippov * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17*7f709ce7SMax Filippov * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18*7f709ce7SMax Filippov * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19*7f709ce7SMax Filippov * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20*7f709ce7SMax Filippov * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21*7f709ce7SMax Filippov * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22*7f709ce7SMax Filippov * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23*7f709ce7SMax Filippov */ 24*7f709ce7SMax Filippov 25*7f709ce7SMax Filippov #ifndef XTENSA_LIBISA_H 26*7f709ce7SMax Filippov #define XTENSA_LIBISA_H 27*7f709ce7SMax Filippov 28*7f709ce7SMax Filippov #include <stdint.h> 29*7f709ce7SMax Filippov 30*7f709ce7SMax Filippov #ifdef __cplusplus 31*7f709ce7SMax Filippov extern "C" { 32*7f709ce7SMax Filippov #endif 33*7f709ce7SMax Filippov 34*7f709ce7SMax Filippov /* 35*7f709ce7SMax Filippov * Version number: This is intended to help support code that works with 36*7f709ce7SMax Filippov * versions of this library from multiple Xtensa releases. 37*7f709ce7SMax Filippov */ 38*7f709ce7SMax Filippov 39*7f709ce7SMax Filippov #define XTENSA_ISA_VERSION 7000 40*7f709ce7SMax Filippov 41*7f709ce7SMax Filippov /* 42*7f709ce7SMax Filippov * This file defines the interface to the Xtensa ISA library. This 43*7f709ce7SMax Filippov * library contains most of the ISA-specific information for a 44*7f709ce7SMax Filippov * particular Xtensa processor. For example, the set of valid 45*7f709ce7SMax Filippov * instructions, their opcode encodings and operand fields are all 46*7f709ce7SMax Filippov * included here. 47*7f709ce7SMax Filippov * 48*7f709ce7SMax Filippov * This interface basically defines a number of abstract data types. 49*7f709ce7SMax Filippov * 50*7f709ce7SMax Filippov * . an instruction buffer - for holding the raw instruction bits 51*7f709ce7SMax Filippov * . ISA info - information about the ISA as a whole 52*7f709ce7SMax Filippov * . instruction formats - instruction size and slot structure 53*7f709ce7SMax Filippov * . opcodes - information about individual instructions 54*7f709ce7SMax Filippov * . operands - information about register and immediate instruction operands 55*7f709ce7SMax Filippov * . stateOperands - information about processor state instruction operands 56*7f709ce7SMax Filippov * . interfaceOperands - information about interface instruction operands 57*7f709ce7SMax Filippov * . register files - register file information 58*7f709ce7SMax Filippov * . processor states - internal processor state information 59*7f709ce7SMax Filippov * . system registers - "special registers" and "user registers" 60*7f709ce7SMax Filippov * . interfaces - TIE interfaces that are external to the processor 61*7f709ce7SMax Filippov * . functional units - TIE shared functions 62*7f709ce7SMax Filippov * 63*7f709ce7SMax Filippov * The interface defines a set of functions to access each data type. 64*7f709ce7SMax Filippov * With the exception of the instruction buffer, the internal 65*7f709ce7SMax Filippov * representations of the data structures are hidden. All accesses must 66*7f709ce7SMax Filippov * be made through the functions defined here. 67*7f709ce7SMax Filippov */ 68*7f709ce7SMax Filippov 69*7f709ce7SMax Filippov typedef struct xtensa_isa_opaque { int unused; } *xtensa_isa; 70*7f709ce7SMax Filippov 71*7f709ce7SMax Filippov 72*7f709ce7SMax Filippov /* 73*7f709ce7SMax Filippov * Most of the Xtensa ISA entities (e.g., opcodes, regfiles, etc.) are 74*7f709ce7SMax Filippov * represented here using sequential integers beginning with 0. The 75*7f709ce7SMax Filippov * specific values are only fixed for a particular instantiation of an 76*7f709ce7SMax Filippov * xtensa_isa structure, so these values should only be used 77*7f709ce7SMax Filippov * internally. 78*7f709ce7SMax Filippov */ 79*7f709ce7SMax Filippov 80*7f709ce7SMax Filippov typedef int xtensa_opcode; 81*7f709ce7SMax Filippov typedef int xtensa_format; 82*7f709ce7SMax Filippov typedef int xtensa_regfile; 83*7f709ce7SMax Filippov typedef int xtensa_state; 84*7f709ce7SMax Filippov typedef int xtensa_sysreg; 85*7f709ce7SMax Filippov typedef int xtensa_interface; 86*7f709ce7SMax Filippov typedef int xtensa_funcUnit; 87*7f709ce7SMax Filippov 88*7f709ce7SMax Filippov 89*7f709ce7SMax Filippov /* Define a unique value for undefined items. */ 90*7f709ce7SMax Filippov 91*7f709ce7SMax Filippov #define XTENSA_UNDEFINED -1 92*7f709ce7SMax Filippov 93*7f709ce7SMax Filippov 94*7f709ce7SMax Filippov /* 95*7f709ce7SMax Filippov * Overview of using this interface to decode/encode instructions: 96*7f709ce7SMax Filippov * 97*7f709ce7SMax Filippov * Each Xtensa instruction is associated with a particular instruction 98*7f709ce7SMax Filippov * format, where the format defines a fixed number of slots for 99*7f709ce7SMax Filippov * operations. The formats for the core Xtensa ISA have only one slot, 100*7f709ce7SMax Filippov * but FLIX instructions may have multiple slots. Within each slot, 101*7f709ce7SMax Filippov * there is a single opcode and some number of associated operands. 102*7f709ce7SMax Filippov * 103*7f709ce7SMax Filippov * The encoding and decoding functions operate on instruction buffers, 104*7f709ce7SMax Filippov * not on the raw bytes of the instructions. The same instruction 105*7f709ce7SMax Filippov * buffer data structure is used for both entire instructions and 106*7f709ce7SMax Filippov * individual slots in those instructions -- the contents of a slot need 107*7f709ce7SMax Filippov * to be extracted from or inserted into the buffer for the instruction 108*7f709ce7SMax Filippov * as a whole. 109*7f709ce7SMax Filippov * 110*7f709ce7SMax Filippov * Decoding an instruction involves first finding the format, which 111*7f709ce7SMax Filippov * identifies the number of slots, and then decoding each slot 112*7f709ce7SMax Filippov * separately. A slot is decoded by finding the opcode and then using 113*7f709ce7SMax Filippov * the opcode to determine how many operands there are. For example: 114*7f709ce7SMax Filippov * 115*7f709ce7SMax Filippov * xtensa_insnbuf_from_chars 116*7f709ce7SMax Filippov * xtensa_format_decode 117*7f709ce7SMax Filippov * for each slot { 118*7f709ce7SMax Filippov * xtensa_format_get_slot 119*7f709ce7SMax Filippov * xtensa_opcode_decode 120*7f709ce7SMax Filippov * for each operand { 121*7f709ce7SMax Filippov * xtensa_operand_get_field 122*7f709ce7SMax Filippov * xtensa_operand_decode 123*7f709ce7SMax Filippov * } 124*7f709ce7SMax Filippov * } 125*7f709ce7SMax Filippov * 126*7f709ce7SMax Filippov * Encoding an instruction is roughly the same procedure in reverse: 127*7f709ce7SMax Filippov * 128*7f709ce7SMax Filippov * xtensa_format_encode 129*7f709ce7SMax Filippov * for each slot { 130*7f709ce7SMax Filippov * xtensa_opcode_encode 131*7f709ce7SMax Filippov * for each operand { 132*7f709ce7SMax Filippov * xtensa_operand_encode 133*7f709ce7SMax Filippov * xtensa_operand_set_field 134*7f709ce7SMax Filippov * } 135*7f709ce7SMax Filippov * xtensa_format_set_slot 136*7f709ce7SMax Filippov * } 137*7f709ce7SMax Filippov * xtensa_insnbuf_to_chars 138*7f709ce7SMax Filippov */ 139*7f709ce7SMax Filippov 140*7f709ce7SMax Filippov 141*7f709ce7SMax Filippov /* Error handling. */ 142*7f709ce7SMax Filippov 143*7f709ce7SMax Filippov /* 144*7f709ce7SMax Filippov * Error codes. The code for the most recent error condition can be 145*7f709ce7SMax Filippov * retrieved with the "errno" function. For any result other than 146*7f709ce7SMax Filippov * xtensa_isa_ok, an error message containing additional information 147*7f709ce7SMax Filippov * about the problem can be retrieved using the "error_msg" function. 148*7f709ce7SMax Filippov * The error messages are stored in an internal buffer, which should 149*7f709ce7SMax Filippov * not be freed and may be overwritten by subsequent operations. 150*7f709ce7SMax Filippov */ 151*7f709ce7SMax Filippov 152*7f709ce7SMax Filippov typedef enum xtensa_isa_status_enum { 153*7f709ce7SMax Filippov xtensa_isa_ok = 0, 154*7f709ce7SMax Filippov xtensa_isa_bad_format, 155*7f709ce7SMax Filippov xtensa_isa_bad_slot, 156*7f709ce7SMax Filippov xtensa_isa_bad_opcode, 157*7f709ce7SMax Filippov xtensa_isa_bad_operand, 158*7f709ce7SMax Filippov xtensa_isa_bad_field, 159*7f709ce7SMax Filippov xtensa_isa_bad_iclass, 160*7f709ce7SMax Filippov xtensa_isa_bad_regfile, 161*7f709ce7SMax Filippov xtensa_isa_bad_sysreg, 162*7f709ce7SMax Filippov xtensa_isa_bad_state, 163*7f709ce7SMax Filippov xtensa_isa_bad_interface, 164*7f709ce7SMax Filippov xtensa_isa_bad_funcUnit, 165*7f709ce7SMax Filippov xtensa_isa_wrong_slot, 166*7f709ce7SMax Filippov xtensa_isa_no_field, 167*7f709ce7SMax Filippov xtensa_isa_out_of_memory, 168*7f709ce7SMax Filippov xtensa_isa_buffer_overflow, 169*7f709ce7SMax Filippov xtensa_isa_internal_error, 170*7f709ce7SMax Filippov xtensa_isa_bad_value 171*7f709ce7SMax Filippov } xtensa_isa_status; 172*7f709ce7SMax Filippov 173*7f709ce7SMax Filippov xtensa_isa_status xtensa_isa_errno(xtensa_isa isa); 174*7f709ce7SMax Filippov 175*7f709ce7SMax Filippov char *xtensa_isa_error_msg(xtensa_isa isa); 176*7f709ce7SMax Filippov 177*7f709ce7SMax Filippov 178*7f709ce7SMax Filippov 179*7f709ce7SMax Filippov /* Instruction buffers. */ 180*7f709ce7SMax Filippov 181*7f709ce7SMax Filippov typedef uint32_t xtensa_insnbuf_word; 182*7f709ce7SMax Filippov typedef xtensa_insnbuf_word *xtensa_insnbuf; 183*7f709ce7SMax Filippov 184*7f709ce7SMax Filippov 185*7f709ce7SMax Filippov /* Get the size in "insnbuf_words" of the xtensa_insnbuf array. */ 186*7f709ce7SMax Filippov 187*7f709ce7SMax Filippov int xtensa_insnbuf_size(xtensa_isa isa); 188*7f709ce7SMax Filippov 189*7f709ce7SMax Filippov 190*7f709ce7SMax Filippov /* Allocate an xtensa_insnbuf of the right size. */ 191*7f709ce7SMax Filippov 192*7f709ce7SMax Filippov xtensa_insnbuf xtensa_insnbuf_alloc(xtensa_isa isa); 193*7f709ce7SMax Filippov 194*7f709ce7SMax Filippov 195*7f709ce7SMax Filippov /* Release an xtensa_insnbuf. */ 196*7f709ce7SMax Filippov 197*7f709ce7SMax Filippov void xtensa_insnbuf_free(xtensa_isa isa, xtensa_insnbuf buf); 198*7f709ce7SMax Filippov 199*7f709ce7SMax Filippov 200*7f709ce7SMax Filippov /* 201*7f709ce7SMax Filippov * Conversion between raw memory (char arrays) and our internal 202*7f709ce7SMax Filippov * instruction representation. This is complicated by the Xtensa ISA's 203*7f709ce7SMax Filippov * variable instruction lengths. When converting to chars, the buffer 204*7f709ce7SMax Filippov * must contain a valid instruction so we know how many bytes to copy; 205*7f709ce7SMax Filippov * thus, the "to_chars" function returns the number of bytes copied or 206*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. The "from_chars" function first reads the 207*7f709ce7SMax Filippov * minimal number of bytes required to decode the instruction length and 208*7f709ce7SMax Filippov * then proceeds to copy the entire instruction into the buffer; if the 209*7f709ce7SMax Filippov * memory does not contain a valid instruction, it copies the maximum 210*7f709ce7SMax Filippov * number of bytes required for the longest Xtensa instruction. The 211*7f709ce7SMax Filippov * "num_chars" argument may be used to limit the number of bytes that 212*7f709ce7SMax Filippov * can be read or written. Otherwise, if "num_chars" is zero, the 213*7f709ce7SMax Filippov * functions may read or write past the end of the code. 214*7f709ce7SMax Filippov */ 215*7f709ce7SMax Filippov 216*7f709ce7SMax Filippov int xtensa_insnbuf_to_chars(xtensa_isa isa, const xtensa_insnbuf insn, 217*7f709ce7SMax Filippov unsigned char *cp, int num_chars); 218*7f709ce7SMax Filippov 219*7f709ce7SMax Filippov void xtensa_insnbuf_from_chars(xtensa_isa isa, xtensa_insnbuf insn, 220*7f709ce7SMax Filippov const unsigned char *cp, int num_chars); 221*7f709ce7SMax Filippov 222*7f709ce7SMax Filippov 223*7f709ce7SMax Filippov 224*7f709ce7SMax Filippov /* ISA information. */ 225*7f709ce7SMax Filippov 226*7f709ce7SMax Filippov /* Initialize the ISA information. */ 227*7f709ce7SMax Filippov 228*7f709ce7SMax Filippov xtensa_isa xtensa_isa_init(void *xtensa_modules, xtensa_isa_status *errno_p, 229*7f709ce7SMax Filippov char **error_msg_p); 230*7f709ce7SMax Filippov 231*7f709ce7SMax Filippov 232*7f709ce7SMax Filippov /* Deallocate an xtensa_isa structure. */ 233*7f709ce7SMax Filippov 234*7f709ce7SMax Filippov void xtensa_isa_free(xtensa_isa isa); 235*7f709ce7SMax Filippov 236*7f709ce7SMax Filippov 237*7f709ce7SMax Filippov /* Get the maximum instruction size in bytes. */ 238*7f709ce7SMax Filippov 239*7f709ce7SMax Filippov int xtensa_isa_maxlength(xtensa_isa isa); 240*7f709ce7SMax Filippov 241*7f709ce7SMax Filippov 242*7f709ce7SMax Filippov /* 243*7f709ce7SMax Filippov * Decode the length in bytes of an instruction in raw memory (not an 244*7f709ce7SMax Filippov * insnbuf). This function reads only the minimal number of bytes 245*7f709ce7SMax Filippov * required to decode the instruction length. Returns 246*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 247*7f709ce7SMax Filippov */ 248*7f709ce7SMax Filippov 249*7f709ce7SMax Filippov int xtensa_isa_length_from_chars(xtensa_isa isa, const unsigned char *cp); 250*7f709ce7SMax Filippov 251*7f709ce7SMax Filippov 252*7f709ce7SMax Filippov /* 253*7f709ce7SMax Filippov * Get the number of stages in the processor's pipeline. The pipeline 254*7f709ce7SMax Filippov * stage values returned by other functions in this library will range 255*7f709ce7SMax Filippov * from 0 to N-1, where N is the value returned by this function. 256*7f709ce7SMax Filippov * Note that the stage numbers used here may not correspond to the 257*7f709ce7SMax Filippov * actual processor hardware, e.g., the hardware may have additional 258*7f709ce7SMax Filippov * stages before stage 0. Returns XTENSA_UNDEFINED on error. 259*7f709ce7SMax Filippov */ 260*7f709ce7SMax Filippov 261*7f709ce7SMax Filippov int xtensa_isa_num_pipe_stages(xtensa_isa isa); 262*7f709ce7SMax Filippov 263*7f709ce7SMax Filippov 264*7f709ce7SMax Filippov /* Get the number of various entities that are defined for this processor. */ 265*7f709ce7SMax Filippov 266*7f709ce7SMax Filippov int xtensa_isa_num_formats(xtensa_isa isa); 267*7f709ce7SMax Filippov 268*7f709ce7SMax Filippov int xtensa_isa_num_opcodes(xtensa_isa isa); 269*7f709ce7SMax Filippov 270*7f709ce7SMax Filippov int xtensa_isa_num_regfiles(xtensa_isa isa); 271*7f709ce7SMax Filippov 272*7f709ce7SMax Filippov int xtensa_isa_num_states(xtensa_isa isa); 273*7f709ce7SMax Filippov 274*7f709ce7SMax Filippov int xtensa_isa_num_sysregs(xtensa_isa isa); 275*7f709ce7SMax Filippov 276*7f709ce7SMax Filippov int xtensa_isa_num_interfaces(xtensa_isa isa); 277*7f709ce7SMax Filippov 278*7f709ce7SMax Filippov int xtensa_isa_num_funcUnits(xtensa_isa isa); 279*7f709ce7SMax Filippov 280*7f709ce7SMax Filippov 281*7f709ce7SMax Filippov 282*7f709ce7SMax Filippov /* Instruction formats. */ 283*7f709ce7SMax Filippov 284*7f709ce7SMax Filippov /* Get the name of a format. Returns null on error. */ 285*7f709ce7SMax Filippov 286*7f709ce7SMax Filippov const char *xtensa_format_name(xtensa_isa isa, xtensa_format fmt); 287*7f709ce7SMax Filippov 288*7f709ce7SMax Filippov 289*7f709ce7SMax Filippov /* 290*7f709ce7SMax Filippov * Given a format name, return the format number. Returns 291*7f709ce7SMax Filippov * XTENSA_UNDEFINED if the name is not a valid format. 292*7f709ce7SMax Filippov */ 293*7f709ce7SMax Filippov 294*7f709ce7SMax Filippov xtensa_format xtensa_format_lookup(xtensa_isa isa, const char *fmtname); 295*7f709ce7SMax Filippov 296*7f709ce7SMax Filippov 297*7f709ce7SMax Filippov /* 298*7f709ce7SMax Filippov * Decode the instruction format from a binary instruction buffer. 299*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED if the format is not recognized. 300*7f709ce7SMax Filippov */ 301*7f709ce7SMax Filippov 302*7f709ce7SMax Filippov xtensa_format xtensa_format_decode(xtensa_isa isa, const xtensa_insnbuf insn); 303*7f709ce7SMax Filippov 304*7f709ce7SMax Filippov 305*7f709ce7SMax Filippov /* 306*7f709ce7SMax Filippov * Set the instruction format field(s) in a binary instruction buffer. 307*7f709ce7SMax Filippov * All the other fields are set to zero. Returns non-zero on error. 308*7f709ce7SMax Filippov */ 309*7f709ce7SMax Filippov 310*7f709ce7SMax Filippov int xtensa_format_encode(xtensa_isa isa, xtensa_format fmt, 311*7f709ce7SMax Filippov xtensa_insnbuf insn); 312*7f709ce7SMax Filippov 313*7f709ce7SMax Filippov 314*7f709ce7SMax Filippov /* 315*7f709ce7SMax Filippov * Find the length (in bytes) of an instruction. Returns 316*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 317*7f709ce7SMax Filippov */ 318*7f709ce7SMax Filippov 319*7f709ce7SMax Filippov int xtensa_format_length(xtensa_isa isa, xtensa_format fmt); 320*7f709ce7SMax Filippov 321*7f709ce7SMax Filippov 322*7f709ce7SMax Filippov /* 323*7f709ce7SMax Filippov * Get the number of slots in an instruction. Returns XTENSA_UNDEFINED 324*7f709ce7SMax Filippov * on error. 325*7f709ce7SMax Filippov */ 326*7f709ce7SMax Filippov 327*7f709ce7SMax Filippov int xtensa_format_num_slots(xtensa_isa isa, xtensa_format fmt); 328*7f709ce7SMax Filippov 329*7f709ce7SMax Filippov 330*7f709ce7SMax Filippov /* 331*7f709ce7SMax Filippov * Get the opcode for a no-op in a particular slot. 332*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. 333*7f709ce7SMax Filippov */ 334*7f709ce7SMax Filippov 335*7f709ce7SMax Filippov xtensa_opcode xtensa_format_slot_nop_opcode(xtensa_isa isa, xtensa_format fmt, 336*7f709ce7SMax Filippov int slot); 337*7f709ce7SMax Filippov 338*7f709ce7SMax Filippov 339*7f709ce7SMax Filippov /* 340*7f709ce7SMax Filippov * Get the bits for a specified slot out of an insnbuf for the 341*7f709ce7SMax Filippov * instruction as a whole and put them into an insnbuf for that one 342*7f709ce7SMax Filippov * slot, and do the opposite to set a slot. Return non-zero on error. 343*7f709ce7SMax Filippov */ 344*7f709ce7SMax Filippov 345*7f709ce7SMax Filippov int xtensa_format_get_slot(xtensa_isa isa, xtensa_format fmt, int slot, 346*7f709ce7SMax Filippov const xtensa_insnbuf insn, xtensa_insnbuf slotbuf); 347*7f709ce7SMax Filippov 348*7f709ce7SMax Filippov int xtensa_format_set_slot(xtensa_isa isa, xtensa_format fmt, int slot, 349*7f709ce7SMax Filippov xtensa_insnbuf insn, const xtensa_insnbuf slotbuf); 350*7f709ce7SMax Filippov 351*7f709ce7SMax Filippov 352*7f709ce7SMax Filippov 353*7f709ce7SMax Filippov /* Opcode information. */ 354*7f709ce7SMax Filippov 355*7f709ce7SMax Filippov /* 356*7f709ce7SMax Filippov * Translate a mnemonic name to an opcode. Returns XTENSA_UNDEFINED if 357*7f709ce7SMax Filippov * the name is not a valid opcode mnemonic. 358*7f709ce7SMax Filippov */ 359*7f709ce7SMax Filippov 360*7f709ce7SMax Filippov xtensa_opcode xtensa_opcode_lookup(xtensa_isa isa, const char *opname); 361*7f709ce7SMax Filippov 362*7f709ce7SMax Filippov 363*7f709ce7SMax Filippov /* 364*7f709ce7SMax Filippov * Decode the opcode for one instruction slot from a binary instruction 365*7f709ce7SMax Filippov * buffer. Returns the opcode or XTENSA_UNDEFINED if the opcode is 366*7f709ce7SMax Filippov * illegal. 367*7f709ce7SMax Filippov */ 368*7f709ce7SMax Filippov 369*7f709ce7SMax Filippov xtensa_opcode xtensa_opcode_decode(xtensa_isa isa, xtensa_format fmt, int slot, 370*7f709ce7SMax Filippov const xtensa_insnbuf slotbuf); 371*7f709ce7SMax Filippov 372*7f709ce7SMax Filippov 373*7f709ce7SMax Filippov /* 374*7f709ce7SMax Filippov * Set the opcode field(s) for an instruction slot. All other fields 375*7f709ce7SMax Filippov * in the slot are set to zero. Returns non-zero if the opcode cannot 376*7f709ce7SMax Filippov * be encoded. 377*7f709ce7SMax Filippov */ 378*7f709ce7SMax Filippov 379*7f709ce7SMax Filippov int xtensa_opcode_encode(xtensa_isa isa, xtensa_format fmt, int slot, 380*7f709ce7SMax Filippov xtensa_insnbuf slotbuf, xtensa_opcode opc); 381*7f709ce7SMax Filippov 382*7f709ce7SMax Filippov 383*7f709ce7SMax Filippov /* Get the mnemonic name for an opcode. Returns null on error. */ 384*7f709ce7SMax Filippov 385*7f709ce7SMax Filippov const char *xtensa_opcode_name(xtensa_isa isa, xtensa_opcode opc); 386*7f709ce7SMax Filippov 387*7f709ce7SMax Filippov 388*7f709ce7SMax Filippov /* Check various properties of opcodes. These functions return 0 if 389*7f709ce7SMax Filippov * the condition is false, 1 if the condition is true, and 390*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. The instructions are classified as 391*7f709ce7SMax Filippov * follows: 392*7f709ce7SMax Filippov * 393*7f709ce7SMax Filippov * branch: conditional branch; may fall through to next instruction (B*) 394*7f709ce7SMax Filippov * jump: unconditional branch (J, JX, RET*, RF*) 395*7f709ce7SMax Filippov * loop: zero-overhead loop (LOOP*) 396*7f709ce7SMax Filippov * call: unconditional call; control returns to next instruction (CALL*) 397*7f709ce7SMax Filippov * 398*7f709ce7SMax Filippov * For the opcodes that affect control flow in some way, the branch 399*7f709ce7SMax Filippov * target may be specified by an immediate operand or it may be an 400*7f709ce7SMax Filippov * address stored in a register. You can distinguish these by 401*7f709ce7SMax Filippov * checking if the instruction has a PC-relative immediate 402*7f709ce7SMax Filippov * operand. 403*7f709ce7SMax Filippov */ 404*7f709ce7SMax Filippov 405*7f709ce7SMax Filippov int xtensa_opcode_is_branch(xtensa_isa isa, xtensa_opcode opc); 406*7f709ce7SMax Filippov 407*7f709ce7SMax Filippov int xtensa_opcode_is_jump(xtensa_isa isa, xtensa_opcode opc); 408*7f709ce7SMax Filippov 409*7f709ce7SMax Filippov int xtensa_opcode_is_loop(xtensa_isa isa, xtensa_opcode opc); 410*7f709ce7SMax Filippov 411*7f709ce7SMax Filippov int xtensa_opcode_is_call(xtensa_isa isa, xtensa_opcode opc); 412*7f709ce7SMax Filippov 413*7f709ce7SMax Filippov 414*7f709ce7SMax Filippov /* 415*7f709ce7SMax Filippov * Find the number of ordinary operands, state operands, and interface 416*7f709ce7SMax Filippov * operands for an instruction. These return XTENSA_UNDEFINED on 417*7f709ce7SMax Filippov * error. 418*7f709ce7SMax Filippov */ 419*7f709ce7SMax Filippov 420*7f709ce7SMax Filippov int xtensa_opcode_num_operands(xtensa_isa isa, xtensa_opcode opc); 421*7f709ce7SMax Filippov 422*7f709ce7SMax Filippov int xtensa_opcode_num_stateOperands(xtensa_isa isa, xtensa_opcode opc); 423*7f709ce7SMax Filippov 424*7f709ce7SMax Filippov int xtensa_opcode_num_interfaceOperands(xtensa_isa isa, xtensa_opcode opc); 425*7f709ce7SMax Filippov 426*7f709ce7SMax Filippov 427*7f709ce7SMax Filippov /* 428*7f709ce7SMax Filippov * Get functional unit usage requirements for an opcode. Each "use" 429*7f709ce7SMax Filippov * is identified by a <functional unit, pipeline stage> pair. The 430*7f709ce7SMax Filippov * "num_funcUnit_uses" function returns the number of these "uses" or 431*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. The "funcUnit_use" function returns 432*7f709ce7SMax Filippov * a pointer to a "use" pair or null on error. 433*7f709ce7SMax Filippov */ 434*7f709ce7SMax Filippov 435*7f709ce7SMax Filippov typedef struct xtensa_funcUnit_use_struct { 436*7f709ce7SMax Filippov xtensa_funcUnit unit; 437*7f709ce7SMax Filippov int stage; 438*7f709ce7SMax Filippov } xtensa_funcUnit_use; 439*7f709ce7SMax Filippov 440*7f709ce7SMax Filippov int xtensa_opcode_num_funcUnit_uses(xtensa_isa isa, xtensa_opcode opc); 441*7f709ce7SMax Filippov 442*7f709ce7SMax Filippov xtensa_funcUnit_use *xtensa_opcode_funcUnit_use(xtensa_isa isa, 443*7f709ce7SMax Filippov xtensa_opcode opc, int u); 444*7f709ce7SMax Filippov 445*7f709ce7SMax Filippov 446*7f709ce7SMax Filippov 447*7f709ce7SMax Filippov /* Operand information. */ 448*7f709ce7SMax Filippov 449*7f709ce7SMax Filippov /* Get the name of an operand. Returns null on error. */ 450*7f709ce7SMax Filippov 451*7f709ce7SMax Filippov const char *xtensa_operand_name(xtensa_isa isa, xtensa_opcode opc, int opnd); 452*7f709ce7SMax Filippov 453*7f709ce7SMax Filippov 454*7f709ce7SMax Filippov /* 455*7f709ce7SMax Filippov * Some operands are "invisible", i.e., not explicitly specified in 456*7f709ce7SMax Filippov * assembly language. When assembling an instruction, you need not set 457*7f709ce7SMax Filippov * the values of invisible operands, since they are either hardwired or 458*7f709ce7SMax Filippov * derived from other field values. The values of invisible operands 459*7f709ce7SMax Filippov * can be examined in the same way as other operands, but remember that 460*7f709ce7SMax Filippov * an invisible operand may get its value from another visible one, so 461*7f709ce7SMax Filippov * the entire instruction must be available before examining the 462*7f709ce7SMax Filippov * invisible operand values. This function returns 1 if an operand is 463*7f709ce7SMax Filippov * visible, 0 if it is invisible, or XTENSA_UNDEFINED on error. Note 464*7f709ce7SMax Filippov * that whether an operand is visible is orthogonal to whether it is 465*7f709ce7SMax Filippov * "implicit", i.e., whether it is encoded in a field in the 466*7f709ce7SMax Filippov * instruction. 467*7f709ce7SMax Filippov */ 468*7f709ce7SMax Filippov 469*7f709ce7SMax Filippov int xtensa_operand_is_visible(xtensa_isa isa, xtensa_opcode opc, int opnd); 470*7f709ce7SMax Filippov 471*7f709ce7SMax Filippov 472*7f709ce7SMax Filippov /* 473*7f709ce7SMax Filippov * Check if an operand is an input ('i'), output ('o'), or inout ('m') 474*7f709ce7SMax Filippov * operand. Note: The output operand of a conditional assignment 475*7f709ce7SMax Filippov * (e.g., movnez) appears here as an inout ('m') even if it is declared 476*7f709ce7SMax Filippov * in the TIE code as an output ('o'); this allows the compiler to 477*7f709ce7SMax Filippov * properly handle register allocation for conditional assignments. 478*7f709ce7SMax Filippov * Returns 0 on error. 479*7f709ce7SMax Filippov */ 480*7f709ce7SMax Filippov 481*7f709ce7SMax Filippov char xtensa_operand_inout(xtensa_isa isa, xtensa_opcode opc, int opnd); 482*7f709ce7SMax Filippov 483*7f709ce7SMax Filippov 484*7f709ce7SMax Filippov /* 485*7f709ce7SMax Filippov * Get and set the raw (encoded) value of the field for the specified 486*7f709ce7SMax Filippov * operand. The "set" function does not check if the value fits in the 487*7f709ce7SMax Filippov * field; that is done by the "encode" function below. Both of these 488*7f709ce7SMax Filippov * functions return non-zero on error, e.g., if the field is not defined 489*7f709ce7SMax Filippov * for the specified slot. 490*7f709ce7SMax Filippov */ 491*7f709ce7SMax Filippov 492*7f709ce7SMax Filippov int xtensa_operand_get_field(xtensa_isa isa, xtensa_opcode opc, int opnd, 493*7f709ce7SMax Filippov xtensa_format fmt, int slot, 494*7f709ce7SMax Filippov const xtensa_insnbuf slotbuf, uint32_t *valp); 495*7f709ce7SMax Filippov 496*7f709ce7SMax Filippov int xtensa_operand_set_field(xtensa_isa isa, xtensa_opcode opc, int opnd, 497*7f709ce7SMax Filippov xtensa_format fmt, int slot, 498*7f709ce7SMax Filippov xtensa_insnbuf slotbuf, uint32_t val); 499*7f709ce7SMax Filippov 500*7f709ce7SMax Filippov 501*7f709ce7SMax Filippov /* 502*7f709ce7SMax Filippov * Encode and decode operands. The raw bits in the operand field may 503*7f709ce7SMax Filippov * be encoded in a variety of different ways. These functions hide 504*7f709ce7SMax Filippov * the details of that encoding. The result values are returned through 505*7f709ce7SMax Filippov * the argument pointer. The return value is non-zero on error. 506*7f709ce7SMax Filippov */ 507*7f709ce7SMax Filippov 508*7f709ce7SMax Filippov int xtensa_operand_encode(xtensa_isa isa, xtensa_opcode opc, int opnd, 509*7f709ce7SMax Filippov uint32_t *valp); 510*7f709ce7SMax Filippov 511*7f709ce7SMax Filippov int xtensa_operand_decode(xtensa_isa isa, xtensa_opcode opc, int opnd, 512*7f709ce7SMax Filippov uint32_t *valp); 513*7f709ce7SMax Filippov 514*7f709ce7SMax Filippov 515*7f709ce7SMax Filippov /* 516*7f709ce7SMax Filippov * An operand may be either a register operand or an immediate of some 517*7f709ce7SMax Filippov * sort (e.g., PC-relative or not). The "is_register" function returns 518*7f709ce7SMax Filippov * 0 if the operand is an immediate, 1 if it is a register, and 519*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. The "regfile" function returns the 520*7f709ce7SMax Filippov * regfile for a register operand, or XTENSA_UNDEFINED on error. 521*7f709ce7SMax Filippov */ 522*7f709ce7SMax Filippov 523*7f709ce7SMax Filippov int xtensa_operand_is_register(xtensa_isa isa, xtensa_opcode opc, int opnd); 524*7f709ce7SMax Filippov 525*7f709ce7SMax Filippov xtensa_regfile xtensa_operand_regfile(xtensa_isa isa, xtensa_opcode opc, 526*7f709ce7SMax Filippov int opnd); 527*7f709ce7SMax Filippov 528*7f709ce7SMax Filippov 529*7f709ce7SMax Filippov /* 530*7f709ce7SMax Filippov * Register operands may span multiple consecutive registers, e.g., a 531*7f709ce7SMax Filippov * 64-bit data type may occupy two 32-bit registers. Only the first 532*7f709ce7SMax Filippov * register is encoded in the operand field. This function specifies 533*7f709ce7SMax Filippov * the number of consecutive registers occupied by this operand. For 534*7f709ce7SMax Filippov * non-register operands, the return value is undefined. Returns 535*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 536*7f709ce7SMax Filippov */ 537*7f709ce7SMax Filippov 538*7f709ce7SMax Filippov int xtensa_operand_num_regs(xtensa_isa isa, xtensa_opcode opc, int opnd); 539*7f709ce7SMax Filippov 540*7f709ce7SMax Filippov 541*7f709ce7SMax Filippov /* 542*7f709ce7SMax Filippov * Some register operands do not completely identify the register being 543*7f709ce7SMax Filippov * accessed. For example, the operand value may be added to an internal 544*7f709ce7SMax Filippov * state value. By definition, this implies that the corresponding 545*7f709ce7SMax Filippov * regfile is not allocatable. Unknown registers should generally be 546*7f709ce7SMax Filippov * treated with worst-case assumptions. The function returns 0 if the 547*7f709ce7SMax Filippov * register value is unknown, 1 if known, and XTENSA_UNDEFINED on 548*7f709ce7SMax Filippov * error. 549*7f709ce7SMax Filippov */ 550*7f709ce7SMax Filippov 551*7f709ce7SMax Filippov int xtensa_operand_is_known_reg(xtensa_isa isa, xtensa_opcode opc, int opnd); 552*7f709ce7SMax Filippov 553*7f709ce7SMax Filippov 554*7f709ce7SMax Filippov /* 555*7f709ce7SMax Filippov * Check if an immediate operand is PC-relative. Returns 0 for register 556*7f709ce7SMax Filippov * operands and non-PC-relative immediates, 1 for PC-relative 557*7f709ce7SMax Filippov * immediates, and XTENSA_UNDEFINED on error. 558*7f709ce7SMax Filippov */ 559*7f709ce7SMax Filippov 560*7f709ce7SMax Filippov int xtensa_operand_is_PCrelative(xtensa_isa isa, xtensa_opcode opc, int opnd); 561*7f709ce7SMax Filippov 562*7f709ce7SMax Filippov 563*7f709ce7SMax Filippov /* 564*7f709ce7SMax Filippov * For PC-relative offset operands, the interpretation of the offset may 565*7f709ce7SMax Filippov * vary between opcodes, e.g., is it relative to the current PC or that 566*7f709ce7SMax Filippov * of the next instruction? The following functions are defined to 567*7f709ce7SMax Filippov * perform PC-relative relocations and to undo them (as in the 568*7f709ce7SMax Filippov * disassembler). The "do_reloc" function takes the desired address 569*7f709ce7SMax Filippov * value and the PC of the current instruction and sets the value to the 570*7f709ce7SMax Filippov * corresponding PC-relative offset (which can then be encoded and 571*7f709ce7SMax Filippov * stored into the operand field). The "undo_reloc" function takes the 572*7f709ce7SMax Filippov * unencoded offset value and the current PC and sets the value to the 573*7f709ce7SMax Filippov * appropriate address. The return values are non-zero on error. Note 574*7f709ce7SMax Filippov * that these functions do not replace the encode/decode functions; the 575*7f709ce7SMax Filippov * operands must be encoded/decoded separately and the encode functions 576*7f709ce7SMax Filippov * are responsible for detecting invalid operand values. 577*7f709ce7SMax Filippov */ 578*7f709ce7SMax Filippov 579*7f709ce7SMax Filippov int xtensa_operand_do_reloc(xtensa_isa isa, xtensa_opcode opc, int opnd, 580*7f709ce7SMax Filippov uint32_t *valp, uint32_t pc); 581*7f709ce7SMax Filippov 582*7f709ce7SMax Filippov int xtensa_operand_undo_reloc(xtensa_isa isa, xtensa_opcode opc, int opnd, 583*7f709ce7SMax Filippov uint32_t *valp, uint32_t pc); 584*7f709ce7SMax Filippov 585*7f709ce7SMax Filippov 586*7f709ce7SMax Filippov 587*7f709ce7SMax Filippov /* State Operands. */ 588*7f709ce7SMax Filippov 589*7f709ce7SMax Filippov /* 590*7f709ce7SMax Filippov * Get the state accessed by a state operand. Returns XTENSA_UNDEFINED 591*7f709ce7SMax Filippov * on error. 592*7f709ce7SMax Filippov */ 593*7f709ce7SMax Filippov 594*7f709ce7SMax Filippov xtensa_state xtensa_stateOperand_state(xtensa_isa isa, xtensa_opcode opc, 595*7f709ce7SMax Filippov int stOp); 596*7f709ce7SMax Filippov 597*7f709ce7SMax Filippov 598*7f709ce7SMax Filippov /* 599*7f709ce7SMax Filippov * Check if a state operand is an input ('i'), output ('o'), or inout 600*7f709ce7SMax Filippov * ('m') operand. Returns 0 on error. 601*7f709ce7SMax Filippov */ 602*7f709ce7SMax Filippov 603*7f709ce7SMax Filippov char xtensa_stateOperand_inout(xtensa_isa isa, xtensa_opcode opc, int stOp); 604*7f709ce7SMax Filippov 605*7f709ce7SMax Filippov 606*7f709ce7SMax Filippov 607*7f709ce7SMax Filippov /* Interface Operands. */ 608*7f709ce7SMax Filippov 609*7f709ce7SMax Filippov /* 610*7f709ce7SMax Filippov * Get the external interface accessed by an interface operand. 611*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. 612*7f709ce7SMax Filippov */ 613*7f709ce7SMax Filippov 614*7f709ce7SMax Filippov xtensa_interface xtensa_interfaceOperand_interface(xtensa_isa isa, 615*7f709ce7SMax Filippov xtensa_opcode opc, 616*7f709ce7SMax Filippov int ifOp); 617*7f709ce7SMax Filippov 618*7f709ce7SMax Filippov 619*7f709ce7SMax Filippov 620*7f709ce7SMax Filippov /* Register Files. */ 621*7f709ce7SMax Filippov 622*7f709ce7SMax Filippov /* 623*7f709ce7SMax Filippov * Regfiles include both "real" regfiles and "views", where a view 624*7f709ce7SMax Filippov * allows a group of adjacent registers in a real "parent" regfile to be 625*7f709ce7SMax Filippov * viewed as a single register. A regfile view has all the same 626*7f709ce7SMax Filippov * properties as its parent except for its (long) name, bit width, number 627*7f709ce7SMax Filippov * of entries, and default ctype. You can use the parent function to 628*7f709ce7SMax Filippov * distinguish these two classes. 629*7f709ce7SMax Filippov */ 630*7f709ce7SMax Filippov 631*7f709ce7SMax Filippov /* 632*7f709ce7SMax Filippov * Look up a regfile by either its name or its abbreviated "short name". 633*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. The "lookup_shortname" function 634*7f709ce7SMax Filippov * ignores "view" regfiles since they always have the same shortname as 635*7f709ce7SMax Filippov * their parents. 636*7f709ce7SMax Filippov */ 637*7f709ce7SMax Filippov 638*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_lookup(xtensa_isa isa, const char *name); 639*7f709ce7SMax Filippov 640*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_lookup_shortname(xtensa_isa isa, 641*7f709ce7SMax Filippov const char *shortname); 642*7f709ce7SMax Filippov 643*7f709ce7SMax Filippov 644*7f709ce7SMax Filippov /* 645*7f709ce7SMax Filippov * Get the name or abbreviated "short name" of a regfile. 646*7f709ce7SMax Filippov * Returns null on error. 647*7f709ce7SMax Filippov */ 648*7f709ce7SMax Filippov 649*7f709ce7SMax Filippov const char *xtensa_regfile_name(xtensa_isa isa, xtensa_regfile rf); 650*7f709ce7SMax Filippov 651*7f709ce7SMax Filippov const char *xtensa_regfile_shortname(xtensa_isa isa, xtensa_regfile rf); 652*7f709ce7SMax Filippov 653*7f709ce7SMax Filippov 654*7f709ce7SMax Filippov /* 655*7f709ce7SMax Filippov * Get the parent regfile of a "view" regfile. If the regfile is not a 656*7f709ce7SMax Filippov * view, the result is the same as the input parameter. Returns 657*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 658*7f709ce7SMax Filippov */ 659*7f709ce7SMax Filippov 660*7f709ce7SMax Filippov xtensa_regfile xtensa_regfile_view_parent(xtensa_isa isa, xtensa_regfile rf); 661*7f709ce7SMax Filippov 662*7f709ce7SMax Filippov 663*7f709ce7SMax Filippov /* 664*7f709ce7SMax Filippov * Get the bit width of a regfile or regfile view. 665*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. 666*7f709ce7SMax Filippov */ 667*7f709ce7SMax Filippov 668*7f709ce7SMax Filippov int xtensa_regfile_num_bits(xtensa_isa isa, xtensa_regfile rf); 669*7f709ce7SMax Filippov 670*7f709ce7SMax Filippov 671*7f709ce7SMax Filippov /* 672*7f709ce7SMax Filippov * Get the number of regfile entries. Returns XTENSA_UNDEFINED on 673*7f709ce7SMax Filippov * error. 674*7f709ce7SMax Filippov */ 675*7f709ce7SMax Filippov 676*7f709ce7SMax Filippov int xtensa_regfile_num_entries(xtensa_isa isa, xtensa_regfile rf); 677*7f709ce7SMax Filippov 678*7f709ce7SMax Filippov 679*7f709ce7SMax Filippov 680*7f709ce7SMax Filippov /* Processor States. */ 681*7f709ce7SMax Filippov 682*7f709ce7SMax Filippov /* Look up a state by name. Returns XTENSA_UNDEFINED on error. */ 683*7f709ce7SMax Filippov 684*7f709ce7SMax Filippov xtensa_state xtensa_state_lookup(xtensa_isa isa, const char *name); 685*7f709ce7SMax Filippov 686*7f709ce7SMax Filippov 687*7f709ce7SMax Filippov /* Get the name for a processor state. Returns null on error. */ 688*7f709ce7SMax Filippov 689*7f709ce7SMax Filippov const char *xtensa_state_name(xtensa_isa isa, xtensa_state st); 690*7f709ce7SMax Filippov 691*7f709ce7SMax Filippov 692*7f709ce7SMax Filippov /* 693*7f709ce7SMax Filippov * Get the bit width for a processor state. 694*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. 695*7f709ce7SMax Filippov */ 696*7f709ce7SMax Filippov 697*7f709ce7SMax Filippov int xtensa_state_num_bits(xtensa_isa isa, xtensa_state st); 698*7f709ce7SMax Filippov 699*7f709ce7SMax Filippov 700*7f709ce7SMax Filippov /* 701*7f709ce7SMax Filippov * Check if a state is exported from the processor core. Returns 0 if 702*7f709ce7SMax Filippov * the condition is false, 1 if the condition is true, and 703*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 704*7f709ce7SMax Filippov */ 705*7f709ce7SMax Filippov 706*7f709ce7SMax Filippov int xtensa_state_is_exported(xtensa_isa isa, xtensa_state st); 707*7f709ce7SMax Filippov 708*7f709ce7SMax Filippov 709*7f709ce7SMax Filippov /* 710*7f709ce7SMax Filippov * Check for a "shared_or" state. Returns 0 if the condition is false, 711*7f709ce7SMax Filippov * 1 if the condition is true, and XTENSA_UNDEFINED on error. 712*7f709ce7SMax Filippov */ 713*7f709ce7SMax Filippov 714*7f709ce7SMax Filippov int xtensa_state_is_shared_or(xtensa_isa isa, xtensa_state st); 715*7f709ce7SMax Filippov 716*7f709ce7SMax Filippov 717*7f709ce7SMax Filippov 718*7f709ce7SMax Filippov /* Sysregs ("special registers" and "user registers"). */ 719*7f709ce7SMax Filippov 720*7f709ce7SMax Filippov /* 721*7f709ce7SMax Filippov * Look up a register by its number and whether it is a "user register" 722*7f709ce7SMax Filippov * or a "special register". Returns XTENSA_UNDEFINED if the sysreg does 723*7f709ce7SMax Filippov * not exist. 724*7f709ce7SMax Filippov */ 725*7f709ce7SMax Filippov 726*7f709ce7SMax Filippov xtensa_sysreg xtensa_sysreg_lookup(xtensa_isa isa, int num, int is_user); 727*7f709ce7SMax Filippov 728*7f709ce7SMax Filippov 729*7f709ce7SMax Filippov /* 730*7f709ce7SMax Filippov * Check if there exists a sysreg with a given name. 731*7f709ce7SMax Filippov * If not, this function returns XTENSA_UNDEFINED. 732*7f709ce7SMax Filippov */ 733*7f709ce7SMax Filippov 734*7f709ce7SMax Filippov xtensa_sysreg xtensa_sysreg_lookup_name(xtensa_isa isa, const char *name); 735*7f709ce7SMax Filippov 736*7f709ce7SMax Filippov 737*7f709ce7SMax Filippov /* Get the name of a sysreg. Returns null on error. */ 738*7f709ce7SMax Filippov 739*7f709ce7SMax Filippov const char *xtensa_sysreg_name(xtensa_isa isa, xtensa_sysreg sysreg); 740*7f709ce7SMax Filippov 741*7f709ce7SMax Filippov 742*7f709ce7SMax Filippov /* Get the register number. Returns XTENSA_UNDEFINED on error. */ 743*7f709ce7SMax Filippov 744*7f709ce7SMax Filippov int xtensa_sysreg_number(xtensa_isa isa, xtensa_sysreg sysreg); 745*7f709ce7SMax Filippov 746*7f709ce7SMax Filippov 747*7f709ce7SMax Filippov /* 748*7f709ce7SMax Filippov * Check if a sysreg is a "special register" or a "user register". 749*7f709ce7SMax Filippov * Returns 0 for special registers, 1 for user registers and 750*7f709ce7SMax Filippov * XTENSA_UNDEFINED on error. 751*7f709ce7SMax Filippov */ 752*7f709ce7SMax Filippov 753*7f709ce7SMax Filippov int xtensa_sysreg_is_user(xtensa_isa isa, xtensa_sysreg sysreg); 754*7f709ce7SMax Filippov 755*7f709ce7SMax Filippov 756*7f709ce7SMax Filippov 757*7f709ce7SMax Filippov /* Interfaces. */ 758*7f709ce7SMax Filippov 759*7f709ce7SMax Filippov /* 760*7f709ce7SMax Filippov * Find an interface by name. The return value is XTENSA_UNDEFINED if 761*7f709ce7SMax Filippov * the specified interface is not found. 762*7f709ce7SMax Filippov */ 763*7f709ce7SMax Filippov 764*7f709ce7SMax Filippov xtensa_interface xtensa_interface_lookup(xtensa_isa isa, const char *ifname); 765*7f709ce7SMax Filippov 766*7f709ce7SMax Filippov 767*7f709ce7SMax Filippov /* Get the name of an interface. Returns null on error. */ 768*7f709ce7SMax Filippov 769*7f709ce7SMax Filippov const char *xtensa_interface_name(xtensa_isa isa, xtensa_interface intf); 770*7f709ce7SMax Filippov 771*7f709ce7SMax Filippov 772*7f709ce7SMax Filippov /* 773*7f709ce7SMax Filippov * Get the bit width for an interface. 774*7f709ce7SMax Filippov * Returns XTENSA_UNDEFINED on error. 775*7f709ce7SMax Filippov */ 776*7f709ce7SMax Filippov 777*7f709ce7SMax Filippov int xtensa_interface_num_bits(xtensa_isa isa, xtensa_interface intf); 778*7f709ce7SMax Filippov 779*7f709ce7SMax Filippov 780*7f709ce7SMax Filippov /* 781*7f709ce7SMax Filippov * Check if an interface is an input ('i') or output ('o') with respect 782*7f709ce7SMax Filippov * to the Xtensa processor core. Returns 0 on error. 783*7f709ce7SMax Filippov */ 784*7f709ce7SMax Filippov 785*7f709ce7SMax Filippov char xtensa_interface_inout(xtensa_isa isa, xtensa_interface intf); 786*7f709ce7SMax Filippov 787*7f709ce7SMax Filippov 788*7f709ce7SMax Filippov /* 789*7f709ce7SMax Filippov * Check if accessing an interface has potential side effects. 790*7f709ce7SMax Filippov * Currently "data" interfaces have side effects and "control" 791*7f709ce7SMax Filippov * interfaces do not. Returns 1 if there are side effects, 0 if not, 792*7f709ce7SMax Filippov * and XTENSA_UNDEFINED on error. 793*7f709ce7SMax Filippov */ 794*7f709ce7SMax Filippov 795*7f709ce7SMax Filippov int xtensa_interface_has_side_effect(xtensa_isa isa, xtensa_interface intf); 796*7f709ce7SMax Filippov 797*7f709ce7SMax Filippov 798*7f709ce7SMax Filippov /* 799*7f709ce7SMax Filippov * Some interfaces may be related such that accessing one interface 800*7f709ce7SMax Filippov * has side effects on a set of related interfaces. The interfaces 801*7f709ce7SMax Filippov * are partitioned into equivalence classes of related interfaces, and 802*7f709ce7SMax Filippov * each class is assigned a unique identifier number. This function 803*7f709ce7SMax Filippov * returns the class identifier for an interface, or XTENSA_UNDEFINED 804*7f709ce7SMax Filippov * on error. These identifiers can be compared to determine if two 805*7f709ce7SMax Filippov * interfaces are related; the specific values of the identifiers have 806*7f709ce7SMax Filippov * no particular meaning otherwise. 807*7f709ce7SMax Filippov */ 808*7f709ce7SMax Filippov 809*7f709ce7SMax Filippov int xtensa_interface_class_id(xtensa_isa isa, xtensa_interface intf); 810*7f709ce7SMax Filippov 811*7f709ce7SMax Filippov 812*7f709ce7SMax Filippov /* Functional Units. */ 813*7f709ce7SMax Filippov 814*7f709ce7SMax Filippov /* 815*7f709ce7SMax Filippov * Find a functional unit by name. The return value is XTENSA_UNDEFINED if 816*7f709ce7SMax Filippov * the specified unit is not found. 817*7f709ce7SMax Filippov */ 818*7f709ce7SMax Filippov 819*7f709ce7SMax Filippov xtensa_funcUnit xtensa_funcUnit_lookup(xtensa_isa isa, const char *fname); 820*7f709ce7SMax Filippov 821*7f709ce7SMax Filippov 822*7f709ce7SMax Filippov /* Get the name of a functional unit. Returns null on error. */ 823*7f709ce7SMax Filippov 824*7f709ce7SMax Filippov const char *xtensa_funcUnit_name(xtensa_isa isa, xtensa_funcUnit fun); 825*7f709ce7SMax Filippov 826*7f709ce7SMax Filippov 827*7f709ce7SMax Filippov /* 828*7f709ce7SMax Filippov * Functional units may be replicated. See how many instances of a 829*7f709ce7SMax Filippov * particular function unit exist. Returns XTENSA_UNDEFINED on error. 830*7f709ce7SMax Filippov */ 831*7f709ce7SMax Filippov 832*7f709ce7SMax Filippov int xtensa_funcUnit_num_copies(xtensa_isa isa, xtensa_funcUnit fun); 833*7f709ce7SMax Filippov 834*7f709ce7SMax Filippov 835*7f709ce7SMax Filippov #ifdef __cplusplus 836*7f709ce7SMax Filippov } 837*7f709ce7SMax Filippov #endif 838*7f709ce7SMax Filippov #endif /* XTENSA_LIBISA_H */ 839