* cgen.h (CGEN_FIELDS): Define here.

(CGEN_HW_ENTRY): New member `type'.
	(hw_list): Delete decl.
	(enum cgen_mode): Declare.
	(CGEN_OPERAND): New member `hw'.
	(enum cgen_operand_instance_type): Declare.
	(CGEN_OPERAND_INSTANCE): New type.
	(CGEN_INSN): New member `operands'.
	(CGEN_OPCODE_DATA): Make hw_list const.
	(get_insn_operands,lookup_insn): Add prototypes for.
This commit is contained in:
Doug Evans
1998-02-12 01:42:43 +00:00
parent 00aa5b172e
commit 42d56c40a2
2 changed files with 133 additions and 31 deletions

View File

@ -1,3 +1,22 @@
Wed Feb 11 17:31:53 1998 Doug Evans <devans@seba.cygnus.com>
* cgen.h (CGEN_FIELDS): Define here.
(CGEN_HW_ENTRY): New member `type'.
(hw_list): Delete decl.
(enum cgen_mode): Declare.
(CGEN_OPERAND): New member `hw'.
(enum cgen_operand_instance_type): Declare.
(CGEN_OPERAND_INSTANCE): New type.
(CGEN_INSN): New member `operands'.
(CGEN_OPCODE_DATA): Make hw_list const.
(get_insn_operands,lookup_insn): Add prototypes for.
start-sanitize-sky
Tue Feb 10 13:04:06 1998 Doug Evans <devans@canuck.cygnus.com>
* dvp.h (*): PKE->VIF, GPUIF->GIF.
end-sanitize-sky
Tue Feb 3 17:11:23 1998 Doug Evans <devans@seba.cygnus.com> Tue Feb 3 17:11:23 1998 Doug Evans <devans@seba.cygnus.com>
* cgen.h (CGEN_INSN_MAX_ATTRS): Renamed from CGEN_MAX_INSN_ATTRS. * cgen.h (CGEN_INSN_MAX_ATTRS): Renamed from CGEN_MAX_INSN_ATTRS.

View File

@ -145,7 +145,7 @@ typedef struct
where it varies. where it varies.
*/ */
struct cgen_fields; typedef struct cgen_fields CGEN_FIELDS;
/* Total length of the insn, as recorded in the `fields' struct. */ /* Total length of the insn, as recorded in the `fields' struct. */
/* ??? The field insert handler has lots of opportunities for optimization /* ??? The field insert handler has lots of opportunities for optimization
@ -171,7 +171,7 @@ typedef struct cgen_insn CGEN_INSN;
The result is NULL if success or an error message. */ The result is NULL if success or an error message. */
typedef const char * (cgen_parse_fn) PARAMS ((const struct cgen_insn *, typedef const char * (cgen_parse_fn) PARAMS ((const struct cgen_insn *,
const char **, const char **,
struct cgen_fields *)); CGEN_FIELDS *));
/* Print handler. /* Print handler.
The first argument is a pointer to the disassembly info. The first argument is a pointer to the disassembly info.
@ -185,7 +185,7 @@ typedef const char * (cgen_parse_fn) PARAMS ((const struct cgen_insn *,
/* Don't require bfd.h unnecessarily. */ /* Don't require bfd.h unnecessarily. */
#ifdef BFD_VERSION #ifdef BFD_VERSION
typedef void (cgen_print_fn) PARAMS ((PTR, const struct cgen_insn *, typedef void (cgen_print_fn) PARAMS ((PTR, const struct cgen_insn *,
struct cgen_fields *, bfd_vma, int)); CGEN_FIELDS *, bfd_vma, int));
#else #else
typedef void (cgen_print_fn) (); typedef void (cgen_print_fn) ();
#endif #endif
@ -197,7 +197,7 @@ typedef void (cgen_print_fn) ();
from which the values are fetched. from which the values are fetched.
The third argument is a pointer to a buffer in which to place the insn. */ The third argument is a pointer to a buffer in which to place the insn. */
typedef void (cgen_insert_fn) PARAMS ((const struct cgen_insn *, typedef void (cgen_insert_fn) PARAMS ((const struct cgen_insn *,
struct cgen_fields *, cgen_insn_t *)); CGEN_FIELDS *, cgen_insn_t *));
/* Extract handler. /* Extract handler.
The first argument is a pointer to a struct describing the insn being The first argument is a pointer to a struct describing the insn being
@ -210,7 +210,7 @@ typedef void (cgen_insert_fn) PARAMS ((const struct cgen_insn *,
The result is the length of the insn or zero if not recognized. */ The result is the length of the insn or zero if not recognized. */
typedef int (cgen_extract_fn) PARAMS ((const struct cgen_insn *, typedef int (cgen_extract_fn) PARAMS ((const struct cgen_insn *,
void *, cgen_insn_t, void *, cgen_insn_t,
struct cgen_fields *)); CGEN_FIELDS *));
/* The `parse' and `insert' fields are indices into these tables. /* The `parse' and `insert' fields are indices into these tables.
The elements are pointer to specialized handler functions. The elements are pointer to specialized handler functions.
@ -234,8 +234,8 @@ extern cgen_print_fn * CGEN_SYM (print_handlers) [];
It's a collection of the common elements needed to parse, insert, extract, It's a collection of the common elements needed to parse, insert, extract,
and print each of them. */ and print each of them. */
#ifndef CGEN_MAX_INSN_ATTRS #ifndef CGEN_INSN_MAX_ATTRS
#define CGEN_MAX_INSN_ATTRS 1 #define CGEN_INSN_MAX_ATTRS 1
#endif #endif
struct cgen_base struct cgen_base
@ -345,18 +345,19 @@ enum cgen_asm_type
typedef struct cgen_hw_entry typedef struct cgen_hw_entry
{ {
struct cgen_hw_entry * next; /* The type of this entry, one of `enum hw_type'.
This is an int and not the enum as the latter may not be declared yet. */
int type;
const struct cgen_hw_entry * next;
char * name; char * name;
enum cgen_asm_type asm_type; enum cgen_asm_type asm_type;
PTR asm_data; PTR asm_data;
} CGEN_HW_ENTRY; } CGEN_HW_ENTRY;
extern CGEN_HW_ENTRY * CGEN_SYM (hw_list); const CGEN_HW_ENTRY * cgen_hw_lookup PARAMS ((const char *));
CGEN_HW_ENTRY * cgen_hw_lookup PARAMS ((const char *)); #ifndef CGEN_KEYWORD_MAX_ATTRS
#define CGEN_KEYWORD_MAX_ATTRS 1
#ifndef CGEN_MAX_KEYWORD_ATTRS
#define CGEN_MAX_KEYWORD_ATTRS 1
#endif #endif
/* This struct is used to describe things like register names, etc. */ /* This struct is used to describe things like register names, etc. */
@ -379,7 +380,7 @@ typedef struct cgen_keyword_entry
/* ??? Moving this last should be done by treating keywords like insn lists /* ??? Moving this last should be done by treating keywords like insn lists
and moving the `next' fields into a CGEN_KEYWORD_LIST struct. */ and moving the `next' fields into a CGEN_KEYWORD_LIST struct. */
/* FIXME: Not used yet. */ /* FIXME: Not used yet. */
CGEN_ATTR_TYPE (CGEN_MAX_KEYWORD_ATTRS) attrs; CGEN_ATTR_TYPE (CGEN_KEYWORD_MAX_ATTRS) attrs;
/* Next name hash table entry. */ /* Next name hash table entry. */
struct cgen_keyword_entry *next_name; struct cgen_keyword_entry *next_name;
@ -464,10 +465,28 @@ const char * cgen_validate_unsigned_integer PARAMS ((unsigned long,
unsigned long, unsigned long,
unsigned long)); unsigned long));
/* Operand modes. */
/* ??? This duplicates the values in arch.h. Revisit.
These however need the CGEN_ prefix [as does everything in this file]. */
/* ??? Targets may need to add their own modes so we may wish to move this
to <arch>-opc.h, or add a hook. */
enum cgen_mode {
CGEN_MODE_VOID, /* FIXME: rename simulator's VM to VOID */
CGEN_MODE_BI, CGEN_MODE_QI, CGEN_MODE_HI, CGEN_MODE_SI, CGEN_MODE_DI,
CGEN_MODE_UBI, CGEN_MODE_UQI, CGEN_MODE_UHI, CGEN_MODE_USI, CGEN_MODE_UDI,
CGEN_MODE_SF, CGEN_MODE_DF, CGEN_MODE_XF, CGEN_MODE_TF,
CGEN_MODE_MAX
};
/* FIXME: Until simulator is updated. */
#define CGEN_MODE_VM CGEN_MODE_VOID
/* This struct defines each entry in the operand table. */ /* This struct defines each entry in the operand table. */
#ifndef CGEN_MAX_OPERAND_ATTRS #ifndef CGEN_OPERAND_MAX_ATTRS
#define CGEN_MAX_OPERAND_ATTRS 1 #define CGEN_OPERAND_MAX_ATTRS 1
#endif #endif
typedef struct cgen_operand typedef struct cgen_operand
@ -475,6 +494,17 @@ typedef struct cgen_operand
/* Name as it appears in the syntax string. */ /* Name as it appears in the syntax string. */
char * name; char * name;
/* The hardware element associated with this operand. */
const CGEN_HW_ENTRY *hw;
/* FIXME: We don't yet record ifield definitions, which we should.
When we do it might make sense to delete start/length (since they will
be duplicated in the ifield's definition) and replace them with a
pointer to the ifield entry. Note that as more complicated situations
need to be handled, going more and more with an OOP paradigm will help
keep the complication under control. Of course, this was the goal from
the start, but getting there in one step was too much too soon. */
/* Bit position (msb of first byte = bit 0). /* Bit position (msb of first byte = bit 0).
This is just a hint, and may be unused in more complex operands. This is just a hint, and may be unused in more complex operands.
May be unused for a modifier. */ May be unused for a modifier. */
@ -496,7 +526,7 @@ typedef struct cgen_operand
array in that one architecture may have 1 nonbool attribute and another array in that one architecture may have 1 nonbool attribute and another
may have more. Having this last means the non-architecture specific code may have more. Having this last means the non-architecture specific code
needn't care, now or tomorrow. */ needn't care, now or tomorrow. */
CGEN_ATTR_TYPE (CGEN_MAX_OPERAND_ATTRS) attrs; CGEN_ATTR_TYPE (CGEN_OPERAND_MAX_ATTRS) attrs;
#define CGEN_OPERAND_ATTRS(operand) (&(operand)->attrs) #define CGEN_OPERAND_ATTRS(operand) (&(operand)->attrs)
} CGEN_OPERAND; } CGEN_OPERAND;
@ -514,6 +544,42 @@ enum cgen_operand_type;
#define CGEN_OPERAND_TYPE(operand) ((enum cgen_operand_type) CGEN_OPERAND_INDEX (operand)) #define CGEN_OPERAND_TYPE(operand) ((enum cgen_operand_type) CGEN_OPERAND_INDEX (operand))
#define CGEN_OPERAND_ENTRY(n) (& CGEN_SYM (operand_table) [n]) #define CGEN_OPERAND_ENTRY(n) (& CGEN_SYM (operand_table) [n])
/* Instruction operand instances.
For each instruction, a list of the hardware elements that are read and
written are recorded. */
/* The type of the instance. */
enum cgen_operand_instance_type {
/* End of table marker. */
CGEN_OPERAND_INSTANCE_END = 0,
CGEN_OPERAND_INSTANCE_INPUT, CGEN_OPERAND_INSTANCE_OUTPUT
};
typedef struct
{
/* The type of this operand. */
enum cgen_operand_instance_type type;
#define CGEN_OPERAND_INSTANCE_TYPE(opinst) ((opinst)->type)
/* The hardware element referenced. */
const CGEN_HW_ENTRY *hw;
#define CGEN_OPERAND_INSTANCE_HW(opinst) ((opinst)->hw)
/* The mode in which the operand is being used. */
enum cgen_mode mode;
#define CGEN_OPERAND_INSTANCE_MODE(opinst) ((opinst)->mode)
/* The operand table entry or NULL if there is none (i.e. an explicit
hardware reference). */
const CGEN_OPERAND *operand;
#define CGEN_OPERAND_INSTANCE_OPERAND(opinst) ((opinst)->operand)
/* If `operand' is NULL, the index (e.g. into array of registers). */
int index;
#define CGEN_OPERAND_INSTANCE_INDEX(opinst) ((opinst)->index)
} CGEN_OPERAND_INSTANCE;
/* Syntax string. /* Syntax string.
Each insn format and subexpression has one of these. Each insn format and subexpression has one of these.
@ -613,12 +679,17 @@ struct cgen_insn
#define CGEN_INSN_VALUE(insn) ((insn)->value) #define CGEN_INSN_VALUE(insn) ((insn)->value)
#define CGEN_INSN_MASK(insn) (((CGEN_FORMAT *) (insn)->format)->mask) #define CGEN_INSN_MASK(insn) (((CGEN_FORMAT *) (insn)->format)->mask)
/* Pointer to NULL entry terminated table of operands used,
or NULL if none. */
const CGEN_OPERAND_INSTANCE *operands;
#define CGEN_INSN_OPERANDS(insn) ((insn)->operands)
/* Attributes. /* Attributes.
This must appear last. It is a variable sized array in that one This must appear last. It is a variable sized array in that one
architecture may have 1 nonbool attribute and another may have more. architecture may have 1 nonbool attribute and another may have more.
Having this last means the non-architecture specific code needn't Having this last means the non-architecture specific code needn't
care. */ care. */
CGEN_ATTR_TYPE (CGEN_MAX_INSN_ATTRS) attrs; CGEN_ATTR_TYPE (CGEN_INSN_MAX_ATTRS) attrs;
#define CGEN_INSN_ATTRS(insn) (&(insn)->attrs) #define CGEN_INSN_ATTRS(insn) (&(insn)->attrs)
/* Return value of attribute ATTR in INSN. */ /* Return value of attribute ATTR in INSN. */
#define CGEN_INSN_ATTR(insn, attr) \ #define CGEN_INSN_ATTR(insn, attr) \
@ -718,7 +789,7 @@ CGEN_INSN_LIST * cgen_dis_lookup_insn PARAMS ((const char *, unsigned long));
typedef struct typedef struct
{ {
CGEN_HW_ENTRY * hw_list; const CGEN_HW_ENTRY * hw_list;
/*CGEN_OPERAND_TABLE * operand_table; - FIXME:wip */ /*CGEN_OPERAND_TABLE * operand_table; - FIXME:wip */
CGEN_INSN_TABLE * insn_table; CGEN_INSN_TABLE * insn_table;
} CGEN_OPCODE_DATA; } CGEN_OPCODE_DATA;
@ -738,7 +809,7 @@ extern enum cgen_endian cgen_current_endian;
/* Prototypes of major functions. */ /* Prototypes of major functions. */
/* Set the current cpu (+ mach number, endian, etc.). *? /* Set the current cpu (+ mach number, endian, etc.). */
void cgen_set_cpu PARAMS ((CGEN_OPCODE_DATA *, int, enum cgen_endian)); void cgen_set_cpu PARAMS ((CGEN_OPCODE_DATA *, int, enum cgen_endian));
/* Initialize the assembler, disassembler. */ /* Initialize the assembler, disassembler. */
@ -753,8 +824,13 @@ void CGEN_SYM (init_parse) PARAMS ((void));
void CGEN_SYM (init_print) PARAMS ((void)); void CGEN_SYM (init_print) PARAMS ((void));
void CGEN_SYM (init_insert) PARAMS ((void)); void CGEN_SYM (init_insert) PARAMS ((void));
void CGEN_SYM (init_extract) PARAMS ((void)); void CGEN_SYM (init_extract) PARAMS ((void));
/* FIXME: This prototype is wrong ifndef CGEN_INT_INSN.
Furthermore, ifdef CGEN_INT_INSN, the insn is created in
target byte order (in which case why use int's at all).
Perhaps replace cgen_insn_t * with char *? */
const struct cgen_insn * const struct cgen_insn *
CGEN_SYM (assemble_insn) PARAMS ((const char *, struct cgen_fields *, CGEN_SYM (assemble_insn) PARAMS ((const char *, CGEN_FIELDS *,
cgen_insn_t *, char **)); cgen_insn_t *, char **));
#if 0 /* old */ #if 0 /* old */
int CGEN_SYM (insn_supported) PARAMS ((const struct cgen_insn *)); int CGEN_SYM (insn_supported) PARAMS ((const struct cgen_insn *));
@ -764,17 +840,24 @@ int CGEN_SYM (opval_supported) PARAMS ((const struct cgen_opval *));
extern const CGEN_KEYWORD CGEN_SYM (operand_mach); extern const CGEN_KEYWORD CGEN_SYM (operand_mach);
int CGEN_SYM (get_mach) PARAMS ((const char *)); int CGEN_SYM (get_mach) PARAMS ((const char *));
const CGEN_INSN *
CGEN_SYM (get_insn_operands) PARAMS ((const CGEN_INSN *, cgen_insn_t,
int, int *));
const CGEN_INSN *
CGEN_SYM (lookup_insn) PARAMS ((const CGEN_INSN *, cgen_insn_t,
int, CGEN_FIELDS *));
CGEN_INLINE void CGEN_INLINE void
CGEN_SYM (put_operand) PARAMS ((int, const long *, CGEN_SYM (put_operand) PARAMS ((int, const long *,
struct cgen_fields *)); CGEN_FIELDS *));
CGEN_INLINE long CGEN_INLINE long
CGEN_SYM (get_operand) PARAMS ((int, const struct cgen_fields *)); CGEN_SYM (get_operand) PARAMS ((int, const CGEN_FIELDS *));
CGEN_INLINE const char * CGEN_INLINE const char *
CGEN_SYM (parse_operand) PARAMS ((int, const char **, struct cgen_fields *)); CGEN_SYM (parse_operand) PARAMS ((int, const char **, CGEN_FIELDS *));
CGEN_INLINE const char * CGEN_INLINE const char *
CGEN_SYM (validate_operand) PARAMS ((int, const struct cgen_fields *)); CGEN_SYM (validate_operand) PARAMS ((int, const CGEN_FIELDS *));
/* Default insn parser, printer. */ /* Default insn parser, printer. */
extern cgen_parse_fn CGEN_SYM (parse_insn); extern cgen_parse_fn CGEN_SYM (parse_insn);