Index: include/opcode/cr16.h |
diff --git a/include/opcode/cr16.h b/include/opcode/cr16.h |
index 2d322882e4c727c2b658eedbb69d14499db84204..1f1191dc664a4454fca20c920b3fe702c974f0a6 100644 |
--- a/include/opcode/cr16.h |
+++ b/include/opcode/cr16.h |
@@ -1,5 +1,5 @@ |
/* cr16.h -- Header file for CR16 opcode and register tables. |
- Copyright 2007, 2008, 2010 Free Software Foundation, Inc. |
+ Copyright 2007, 2008, 2010, 2013 Free Software Foundation, Inc. |
Contributed by M R Swami Reddy |
This file is part of GAS, GDB and the GNU binutils. |
@@ -26,21 +26,21 @@ |
Therefore, order MUST be preserved. */ |
typedef enum |
- { |
- /* 16-bit general purpose registers. */ |
- r0, r1, r2, r3, |
- r4, r5, r6, r7, |
- r8, r9, r10, r11, |
- r12_L = 12, r13_L = 13, ra = 14, sp_L = 15, |
- |
- /* 32-bit general purpose registers. */ |
- r12 = 12, r13 = 13, r14 = 14, r15 = 15, |
- era = 14, sp = 15, RA, |
- |
- /* Not a register. */ |
- nullregister, |
- MAX_REG |
- } |
+{ |
+ /* 16-bit general purpose registers. */ |
+ r0, r1, r2, r3, |
+ r4, r5, r6, r7, |
+ r8, r9, r10, r11, |
+ r12_L = 12, r13_L = 13, ra = 14, sp_L = 15, |
+ |
+ /* 32-bit general purpose registers. */ |
+ r12 = 12, r13 = 13, r14 = 14, r15 = 15, |
+ era = 14, sp = 15, RA, |
+ |
+ /* Not a register. */ |
+ nullregister, |
+ MAX_REG |
+} |
reg; |
/* CR16 processor registers and special registers : |
@@ -48,33 +48,33 @@ reg; |
(cr16_pregtab). Therefore, order MUST be preserved. */ |
typedef enum |
- { |
- /* processor registers. */ |
- dbs = MAX_REG, |
- dsr, dcrl, dcrh, |
- car0l, car0h, car1l, car1h, |
- cfg, psr, intbasel, intbaseh, |
- ispl, isph, uspl, usph, |
- dcr = dcrl, |
- car0 = car0l, |
- car1 = car1l, |
- intbase = intbasel, |
- isp = ispl, |
- usp = uspl, |
- /* Not a processor register. */ |
- nullpregister = usph + 1, |
- MAX_PREG |
- } |
+{ |
+ /* processor registers. */ |
+ dbs = MAX_REG, |
+ dsr, dcrl, dcrh, |
+ car0l, car0h, car1l, car1h, |
+ cfg, psr, intbasel, intbaseh, |
+ ispl, isph, uspl, usph, |
+ dcr = dcrl, |
+ car0 = car0l, |
+ car1 = car1l, |
+ intbase = intbasel, |
+ isp = ispl, |
+ usp = uspl, |
+ /* Not a processor register. */ |
+ nullpregister = usph + 1, |
+ MAX_PREG |
+} |
preg; |
/* CR16 Register types. */ |
typedef enum |
- { |
- CR16_R_REGTYPE, /* r<N> */ |
- CR16_RP_REGTYPE, /* reg pair */ |
- CR16_P_REGTYPE /* Processor register */ |
- } |
+{ |
+ CR16_R_REGTYPE, /* r<N> */ |
+ CR16_RP_REGTYPE, /* reg pair */ |
+ CR16_P_REGTYPE /* Processor register */ |
+} |
reg_type; |
/* CR16 argument types : |
@@ -89,69 +89,69 @@ reg_type; |
idxrp - index with register pair |
rbase - register base |
rpbase - register pair base |
- pr - processor register */ |
+ pr - processor register. */ |
typedef enum |
- { |
- arg_r, |
- arg_c, |
- arg_cr, |
- arg_crp, |
- arg_ic, |
- arg_icr, |
- arg_idxr, |
- arg_idxrp, |
- arg_rbase, |
- arg_rpbase, |
- arg_rp, |
- arg_pr, |
- arg_prp, |
- arg_cc, |
- arg_ra, |
- /* Not an argument. */ |
- nullargs |
- } |
+{ |
+ arg_r, |
+ arg_c, |
+ arg_cr, |
+ arg_crp, |
+ arg_ic, |
+ arg_icr, |
+ arg_idxr, |
+ arg_idxrp, |
+ arg_rbase, |
+ arg_rpbase, |
+ arg_rp, |
+ arg_pr, |
+ arg_prp, |
+ arg_cc, |
+ arg_ra, |
+ /* Not an argument. */ |
+ nullargs |
+} |
argtype; |
-/* CR16 operand types:The operand types correspond to instructions operands.*/ |
+/* CR16 operand types:The operand types correspond to instructions operands. */ |
typedef enum |
- { |
- dummy, |
- /* N-bit signed immediate. */ |
- imm3, imm4, imm5, imm6, imm16, imm20, imm32, |
- /* N-bit unsigned immediate. */ |
- uimm3, uimm3_1, uimm4, uimm4_1, uimm5, uimm16, uimm20, uimm32, |
- /* N-bit signed displacement. */ |
- disps5, disps17, disps25, |
- /* N-bit unsigned displacement. */ |
- dispe9, |
- /* N-bit absolute address. */ |
- abs20, abs24, |
- /* Register relative. */ |
- rra, rbase, rbase_disps20, rbase_dispe20, |
- /* Register pair relative. */ |
- rpbase_disps0, rpbase_dispe4, rpbase_disps4, rpbase_disps16, |
- rpbase_disps20, rpbase_dispe20, |
- /* Register index. */ |
- rindex7_abs20, rindex8_abs20, |
- /* Register pair index. */ |
- rpindex_disps0, rpindex_disps14, rpindex_disps20, |
- /* register. */ |
- regr, |
- /* register pair. */ |
- regp, |
- /* processor register. */ |
- pregr, |
- /* processor register 32 bit. */ |
- pregrp, |
- /* condition code - 4 bit. */ |
- cc, |
- /* Not an operand. */ |
- nulloperand, |
- /* Maximum supported operand. */ |
- MAX_OPRD |
- } |
+{ |
+ dummy, |
+ /* N-bit signed immediate. */ |
+ imm3, imm4, imm5, imm6, imm16, imm20, imm32, |
+ /* N-bit unsigned immediate. */ |
+ uimm3, uimm3_1, uimm4, uimm4_1, uimm5, uimm16, uimm20, uimm32, |
+ /* N-bit signed displacement. */ |
+ disps5, disps17, disps25, |
+ /* N-bit unsigned displacement. */ |
+ dispe9, |
+ /* N-bit absolute address. */ |
+ abs20, abs24, |
+ /* Register relative. */ |
+ rra, rbase, rbase_disps20, rbase_dispe20, |
+ /* Register pair relative. */ |
+ rpbase_disps0, rpbase_dispe4, rpbase_disps4, rpbase_disps16, |
+ rpbase_disps20, rpbase_dispe20, |
+ /* Register index. */ |
+ rindex7_abs20, rindex8_abs20, |
+ /* Register pair index. */ |
+ rpindex_disps0, rpindex_disps14, rpindex_disps20, |
+ /* register. */ |
+ regr, |
+ /* register pair. */ |
+ regp, |
+ /* processor register. */ |
+ pregr, |
+ /* processor register 32 bit. */ |
+ pregrp, |
+ /* condition code - 4 bit. */ |
+ cc, |
+ /* Not an operand. */ |
+ nulloperand, |
+ /* Maximum supported operand. */ |
+ MAX_OPRD |
+} |
operand_type; |
/* CR16 instruction types. */ |
@@ -239,126 +239,126 @@ operand_type; |
/* Single operand description. */ |
typedef struct |
- { |
- /* Operand type. */ |
- operand_type op_type; |
- /* Operand location within the opcode. */ |
- unsigned int shift; |
- } |
+{ |
+ /* Operand type. */ |
+ operand_type op_type; |
+ /* Operand location within the opcode. */ |
+ unsigned int shift; |
+} |
operand_desc; |
/* Instruction data structure used in instruction table. */ |
typedef struct |
- { |
- /* Name. */ |
- const char *mnemonic; |
- /* Size (in words). */ |
- unsigned int size; |
- /* Constant prefix (matched by the disassembler). */ |
- unsigned long match; /* ie opcode */ |
- /* Match size (in bits). */ |
- /* MASK: if( (i & match_bits) == match ) then match */ |
- int match_bits; |
- /* Attributes. */ |
- unsigned int flags; |
- /* Operands (always last, so unreferenced operands are initialized). */ |
- operand_desc operands[MAX_OPERANDS]; |
- } |
+{ |
+ /* Name. */ |
+ const char *mnemonic; |
+ /* Size (in words). */ |
+ unsigned int size; |
+ /* Constant prefix (matched by the disassembler). */ |
+ unsigned long match; /* ie opcode */ |
+ /* Match size (in bits). */ |
+ /* MASK: if( (i & match_bits) == match ) then match */ |
+ int match_bits; |
+ /* Attributes. */ |
+ unsigned int flags; |
+ /* Operands (always last, so unreferenced operands are initialized). */ |
+ operand_desc operands[MAX_OPERANDS]; |
+} |
inst; |
/* Data structure for a single instruction's arguments (Operands). */ |
typedef struct |
- { |
- /* Register or base register. */ |
- reg r; |
- /* Register pair register. */ |
- reg rp; |
- /* Index register. */ |
- reg i_r; |
- /* Processor register. */ |
- preg pr; |
- /* Processor register. 32 bit */ |
- preg prp; |
- /* Constant/immediate/absolute value. */ |
- long constant; |
- /* CC code. */ |
- unsigned int cc; |
- /* Scaled index mode. */ |
- unsigned int scale; |
- /* Argument type. */ |
- argtype type; |
- /* Size of the argument (in bits) required to represent. */ |
- int size; |
+{ |
+ /* Register or base register. */ |
+ reg r; |
+ /* Register pair register. */ |
+ reg rp; |
+ /* Index register. */ |
+ reg i_r; |
+ /* Processor register. */ |
+ preg pr; |
+ /* Processor register. 32 bit */ |
+ preg prp; |
+ /* Constant/immediate/absolute value. */ |
+ long constant; |
+ /* CC code. */ |
+ unsigned int cc; |
+ /* Scaled index mode. */ |
+ unsigned int scale; |
+ /* Argument type. */ |
+ argtype type; |
+ /* Size of the argument (in bits) required to represent. */ |
+ int size; |
/* The type of the expression. */ |
- unsigned char X_op; |
- } |
+ unsigned char X_op; |
+} |
argument; |
/* Internal structure to hold the various entities |
corresponding to the current assembling instruction. */ |
typedef struct |
- { |
- /* Number of arguments. */ |
- int nargs; |
- /* The argument data structure for storing args (operands). */ |
- argument arg[MAX_OPERANDS]; |
+{ |
+ /* Number of arguments. */ |
+ int nargs; |
+ /* The argument data structure for storing args (operands). */ |
+ argument arg[MAX_OPERANDS]; |
/* The following fields are required only by CR16-assembler. */ |
#ifdef TC_CR16 |
- /* Expression used for setting the fixups (if any). */ |
- expressionS exp; |
- bfd_reloc_code_real_type rtype; |
+ /* Expression used for setting the fixups (if any). */ |
+ expressionS exp; |
+ bfd_reloc_code_real_type rtype; |
#endif /* TC_CR16 */ |
- /* Instruction size (in bytes). */ |
- int size; |
- } |
+ /* Instruction size (in bytes). */ |
+ int size; |
+} |
ins; |
/* Structure to hold information about predefined operands. */ |
typedef struct |
- { |
- /* Size (in bits). */ |
- unsigned int bit_size; |
- /* Argument type. */ |
- argtype arg_type; |
- /* One bit syntax flags. */ |
- int flags; |
- } |
+{ |
+ /* Size (in bits). */ |
+ unsigned int bit_size; |
+ /* Argument type. */ |
+ argtype arg_type; |
+ /* One bit syntax flags. */ |
+ int flags; |
+} |
operand_entry; |
/* Structure to hold trap handler information. */ |
typedef struct |
- { |
- /* Trap name. */ |
- char *name; |
- /* Index in dispatch table. */ |
- unsigned int entry; |
- } |
+{ |
+ /* Trap name. */ |
+ char *name; |
+ /* Index in dispatch table. */ |
+ unsigned int entry; |
+} |
trap_entry; |
/* Structure to hold information about predefined registers. */ |
typedef struct |
+{ |
+ /* Name (string representation). */ |
+ char *name; |
+ /* Value (enum representation). */ |
+ union |
{ |
- /* Name (string representation). */ |
- char *name; |
- /* Value (enum representation). */ |
- union |
- { |
- /* Register. */ |
- reg reg_val; |
- /* processor register. */ |
- preg preg_val; |
- } value; |
- /* Register image. */ |
- int image; |
- /* Register type. */ |
- reg_type type; |
- } |
+ /* Register. */ |
+ reg reg_val; |
+ /* processor register. */ |
+ preg preg_val; |
+ } value; |
+ /* Register image. */ |
+ int image; |
+ /* Register type. */ |
+ reg_type type; |
+} |
reg_entry; |
/* CR16 opcode table. */ |
@@ -435,4 +435,17 @@ extern const inst *instruction; |
typedef long long int LONGLONG; |
typedef unsigned long long ULONGLONG; |
+/* Data types for opcode handling. */ |
+typedef unsigned long dwordU; |
+typedef unsigned short wordU; |
+ |
+/* Globals to store opcode data and build the instruction. */ |
+extern wordU cr16_words[3]; |
+extern ULONGLONG cr16_allWords; |
+extern ins cr16_currInsn; |
+ |
+/* Prototypes for function in cr16-dis.c. */ |
+extern void cr16_make_instruction (void); |
+extern int cr16_match_opcode (void); |
+ |
#endif /* _CR16_H_ */ |