From: Cooper Qu Date: Thu, 10 Sep 2020 09:36:24 +0000 (+0800) Subject: CSKY: Add new arches while refine the cpu option process. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=525a0aa301bb60cbd169c6ff6c83eb4d4c06be1f;p=binutils-gdb.git CSKY: Add new arches while refine the cpu option process. Add arches CK804, CK805 and CK800. CK800 is an special arch which support all instructions for CSKYV2. Refine the cpu tables to simplify adding a new cpu. Co-Authored-By: Lifang Xia gas/ * config/tc-csky.c (struct csky_cpu_info): Add new members isa_flag, features and ver. (struct csky_cpu_feature): New. (struct csky_cpu_version): New. (CSKY_FEATURE_MAX): Define. (CSKY_CPU_REVERISON_MAX): Define. (FEATURE_DSP_EXT, FEATURE_DSP, FEATURE_MMU, FEATURE_VDSP, FEATURE_FLOAT, FEATURE_TRUST, FEATURE_JAVA, FEATURE_SHIELD): Define, each standard one collection of instructions. (CSKY_FEATURES_DEF_NULL, CSKY_FEATURES_DEF_e, CSKY_FEATURES_DEF_t, CSKY_FEATURES_DEF_f, CSKY_FEATURES_DEF_v, CSKY_FEATURES_DEF_ef, CSKY_FEATURES_DEF_jt, CSKY_FEATURES_DEF_efht, CSKY_FEATURES_DEF_efv, CSKY_FEATURES_DEF_eft, CSKY_FEATURES_DEF_d, CSKY_FEATURES_DEF_df, CSKY_FEATURES_DEF_ft, CSKY_FEATURES_DEF_tv, CSKY_FEATURES_DEF_fv, CSKY_FEATURES_DEF_dft, CSKY_FEATURES_DEF_dfv, CSKY_FEATURES_DEF_ftv, CSKY_FEATURES_DEF_eftv): Define, the features combination used by cpu. (CSKY_CPU_REVERISON_r0p0, CSKY_CPU_REVERISON_r1p0, CSKY_CPU_REVERISON_r2p0, CSKY_CPU_REVERISON_r3p0, CSKY_CPU_REVERISON_RESERVED, CSKY_CPU_REVERISON_R3): Define, version information used by cpu. (csky_cpus): Refine, and add CK804, CK805 and CK800. (parse_cpu): Refine. (parse_arch): Refine. (md_show_usage): Refine. (md_begin): Refine. include/ * opcode/csky.h (CSKY_ARCH_804): Define. (CSKY_ARCH_805): Define. (CSKY_ARCH_800): Define. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 122d27fc41c..72b1fc886a6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,34 @@ +2020-09-10 Cooper Qu + + * config/tc-csky.c (struct csky_cpu_info): Add new members + isa_flag, features and ver. + (struct csky_cpu_feature): New. + (struct csky_cpu_version): New. + (CSKY_FEATURE_MAX): Define. + (CSKY_CPU_REVERISON_MAX): Define. + (FEATURE_DSP_EXT, FEATURE_DSP, FEATURE_MMU, FEATURE_VDSP, + FEATURE_FLOAT, FEATURE_TRUST, FEATURE_JAVA, FEATURE_SHIELD): + Define, each standard one collection of instructions. + (CSKY_FEATURES_DEF_NULL, CSKY_FEATURES_DEF_e, + CSKY_FEATURES_DEF_t, CSKY_FEATURES_DEF_f, CSKY_FEATURES_DEF_v, + CSKY_FEATURES_DEF_ef, CSKY_FEATURES_DEF_jt, + CSKY_FEATURES_DEF_efht, CSKY_FEATURES_DEF_efv, + CSKY_FEATURES_DEF_eft, CSKY_FEATURES_DEF_d, + CSKY_FEATURES_DEF_df, CSKY_FEATURES_DEF_ft, + CSKY_FEATURES_DEF_tv, CSKY_FEATURES_DEF_fv, + CSKY_FEATURES_DEF_dft, CSKY_FEATURES_DEF_dfv, + CSKY_FEATURES_DEF_ftv, CSKY_FEATURES_DEF_eftv): Define, + the features combination used by cpu. + (CSKY_CPU_REVERISON_r0p0, CSKY_CPU_REVERISON_r1p0, + CSKY_CPU_REVERISON_r2p0, CSKY_CPU_REVERISON_r3p0, + CSKY_CPU_REVERISON_RESERVED, CSKY_CPU_REVERISON_R3): + Define, version information used by cpu. + (csky_cpus): Refine, and add CK804, CK805 and CK800. + (parse_cpu): Refine. + (parse_arch): Refine. + (md_show_usage): Refine. + (md_begin): Refine. + 2020-09-09 Alan Modra * config/tc-ppc.c (md_assemble): Emit prefix insn by parts when diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c index 2d57bd24698..cafadcc942f 100644 --- a/gas/config/tc-csky.c +++ b/gas/config/tc-csky.c @@ -231,13 +231,6 @@ struct csky_arch_info unsigned int bfd_mach_flag; }; -struct csky_cpu_info -{ - const char *name; - unsigned int mach_flag; - BFD_HOST_U_64_BIT isa_flag; -}; - typedef enum { INSN_OPCODE, @@ -266,6 +259,8 @@ struct csky_insn_info char *output; /* End of instruction. */ char *opcode_end; + /* CPU infomations. */ + const struct csky_cpu_info *cpu; /* Flag for INSN_OPCODE16F, INSN_OPCODE32F, INSN_OPCODE, INSN_MACRO. */ inst_flag flag_force; /* Operand number. */ @@ -591,129 +586,356 @@ const struct csky_arch_info csky_archs[] = #define CSKY_ARCH_807_BASE CSKY_ARCH_807 | CSKY_ARCH_DSP #define CSKY_ARCH_810_BASE CSKY_ARCH_810 | CSKY_ARCH_DSP -/* C-SKY cpus table. */ +struct csky_cpu_feature +{ + const char unique; + unsigned int arch_flag; + bfd_uint64_t isa_flag; +}; + +struct csky_cpu_version +{ + int r; + int p; + bfd_uint64_t isa_flag; +}; + +#define CSKY_FEATURE_MAX 10 +#define CSKY_CPU_REVERISON_MAX 10 + +struct csky_cpu_info +{ + const char *name; + unsigned int arch_flag; + bfd_uint64_t isa_flag; + struct csky_cpu_feature features[CSKY_FEATURE_MAX]; + struct csky_cpu_version ver[CSKY_CPU_REVERISON_MAX]; +}; + +#define FEATURE_DSP_EXT(isa) \ + {'e', CSKY_ARCH_DSP, isa} +#define FEATURE_DSP(isa) \ + {'d', CSKY_ARCH_DSP, isa} +#define FEATURE_MMU() \ + {'m', 0, 0} +#define FEATURE_VDSP(isa) \ + {'v', CSKY_ARCH_DSP, isa} +#define FEATURE_FLOAT(isa) \ + {'f', CSKY_ARCH_FLOAT, isa} +#define FEATURE_TRUST(isa) \ + {'t', 0, isa} +#define FEATURE_JAVA(isa) \ + {'j', CSKY_ARCH_JAVA, isa} +#define FEATURE_SHIELD(isa) \ + {'h', 0, isa} + + +#define CSKY_FEATURES_DEF_NULL() \ + {{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_e(isa_e) \ + {FEATURE_DSP_EXT(isa_e), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_t(isa_t) \ + {FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_f(isa_f) \ + {FEATURE_FLOAT(isa_f), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_v(isa_v) \ + {FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_ef(isa_e, isa_f) \ + {FEATURE_DSP_EXT(isa_e), \ + FEATURE_FLOAT(isa_f), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_jt(isa_j, isa_t) \ + {FEATURE_JAVA(isa_j), \ + FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_efht(isa_e, isa_f, isa_h, isa_t) \ + {FEATURE_DSP_EXT(isa_e), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_SHIELD(isa_h), \ + FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_efv(isa_e, isa_f, isa_v) \ + {FEATURE_DSP_EXT(isa_e), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_eft(isa_e, isa_f, isa_t) \ + {FEATURE_DSP_EXT(isa_e), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_d(isa_d) \ + {FEATURE_DSP(isa_d), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_df(isa_d, isa_f) \ + {FEATURE_DSP(isa_d), \ + FEATURE_FLOAT(isa_f), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_ft(isa_f, isa_t) \ + {FEATURE_FLOAT(isa_f), \ + FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_tv(isa_t, isa_v) \ + {FEATURE_TRUST(isa_t), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_fv(isa_f, isa_v) \ + {FEATURE_FLOAT(isa_f), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + + +#define CSKY_FEATURES_DEF_dft(isa_d, isa_f, isa_t) \ + {FEATURE_DSP(isa_d), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_TRUST(isa_t), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_dfv(isa_d, isa_f, isa_v) \ + {FEATURE_DSP(isa_d), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_ftv(isa_f, isa_t, isa_v) \ + {FEATURE_FLOAT(isa_f), \ + FEATURE_TRUST(isa_t), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_FEATURES_DEF_eftv(isa_e, isa_f, isa_t, isa_v) \ + {FEATURE_DSP_EXT(isa_e), \ + FEATURE_FLOAT(isa_f), \ + FEATURE_TRUST(isa_t), \ + FEATURE_VDSP(isa_v), \ + {0}, {0}, {0}, {0}, {0}, {0}} + + +#define CSKY_CPU_REVERISON_r0p0(isa) \ + {0, 0, 0} +#define CSKY_CPU_REVERISON_r1p0(isa) \ + {1, 0, isa} +#define CSKY_CPU_REVERISON_r2p0(isa) \ + {2, 0, isa} +#define CSKY_CPU_REVERISON_r3p0(isa) \ + {3, 0, isa} + +#define CSKY_CPU_REVERISON_RESERVED() \ +{{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +#define CSKY_CPU_REVERISON_R3(isa1, isa2, isa3) \ + {CSKY_CPU_REVERISON_r1p0(isa1), \ + CSKY_CPU_REVERISON_r2p0(isa2), \ + CSKY_CPU_REVERISON_r3p0(isa3), \ + {0}, {0}, {0}, {0}, {0}, {0}, {0}} + +/* CSKY cpus table. */ const struct csky_cpu_info csky_cpus[] = { - /* CK510 series. */ -#define CSKYV1_ISA_DSP CSKY_ISA_DSP | CSKY_ISA_MAC_DSP - {"ck510", CSKY_ARCH_510, CSKYV1_ISA_E1}, - {"ck510e", CSKY_ARCH_510 | CSKY_ARCH_DSP, CSKYV1_ISA_E1 | CSKYV1_ISA_DSP}, - {"ck520", CSKY_ARCH_510 | CSKY_ARCH_MAC, CSKYV1_ISA_E1 | CSKY_ISA_MAC | CSKY_ISA_MAC_DSP}, - -#define CSKY_ISA_610 CSKYV1_ISA_E1 | CSKY_ISA_CP - /* CK610 series. */ - {"ck610", CSKY_ARCH_610, CSKY_ISA_610}, - {"ck610e", CSKY_ARCH_610 | CSKY_ARCH_DSP, CSKY_ISA_610 | CSKYV1_ISA_DSP}, - {"ck610f", CSKY_ARCH_610 | CSKY_ARCH_FLOAT, CSKY_ISA_610 | CSKY_ISA_FLOAT_E1}, - {"ck610ef", CSKY_ARCH_610 | CSKY_ARCH_FLOAT | CSKY_ARCH_DSP, CSKY_ISA_610 | CSKY_ISA_FLOAT_E1 | CSKYV1_ISA_DSP}, - {"ck610fe", CSKY_ARCH_610 | CSKY_ARCH_FLOAT | CSKY_ARCH_DSP, CSKY_ISA_610 | CSKY_ISA_FLOAT_E1 | CSKYV1_ISA_DSP}, - {"ck620", CSKY_ARCH_610 | CSKY_ARCH_MAC, CSKY_ISA_610 | CSKY_ISA_MAC | CSKY_ISA_MAC_DSP}, - - /* CK801 series. */ -#define CSKY_ISA_801 CSKYV2_ISA_E1 +#define CSKYV1_ISA_DSP (CSKY_ISA_DSP | CSKY_ISA_MAC_DSP) +#define CSKY_ISA_510 (CSKYV1_ISA_E1) +#define CSKY_ISA_610 (CSKYV1_ISA_E1 | CSKY_ISA_CP) + {"ck510", + CSKY_ARCH_510, + CSKY_ISA_510, + CSKY_FEATURES_DEF_e(CSKYV1_ISA_DSP), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck520", + CSKY_ARCH_510 | CSKY_ARCH_MAC, + CSKY_ISA_510 | CSKY_ISA_MAC | CSKY_ISA_MAC_DSP, + CSKY_FEATURES_DEF_NULL(), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck610", CSKY_ARCH_610, CSKY_ISA_610, + CSKY_FEATURES_DEF_ef(CSKYV1_ISA_DSP, CSKY_ISA_FLOAT_E1), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck620", + CSKY_ARCH_610 | CSKY_ARCH_MAC, + CSKY_ISA_610 | CSKY_ISA_MAC | CSKY_ISA_MAC_DSP, + CSKY_FEATURES_DEF_NULL(), + CSKY_CPU_REVERISON_RESERVED()}, + +#define CSKY_ISA_801 (CSKYV2_ISA_E1 | CSKY_ISA_TRUST) #define CSKYV2_ISA_DSP (CSKY_ISA_DSP | CSKY_ISA_DSP_1E2 | CSKY_ISA_DSPE60) - {"ck801", CSKY_ARCH_801, CSKY_ISA_801}, - {"ck801t", CSKY_ARCH_801, CSKY_ISA_801 | CSKY_ISA_TRUST}, - - /* CK802 series. */ + {"ck801", + CSKY_ARCH_801, + CSKY_ISA_801, + CSKY_FEATURES_DEF_t(0), + CSKY_CPU_REVERISON_RESERVED()}, #define CSKY_ISA_802 (CSKY_ISA_801 | CSKYV2_ISA_1E2 | CSKY_ISA_NVIC) - {"ck802", CSKY_ARCH_802, CSKY_ISA_802}, - {"ck802j", CSKY_ARCH_802 | CSKY_ARCH_JAVA, CSKY_ISA_802 | CSKY_ISA_JAVA}, - {"ck802t", CSKY_ARCH_802, CSKY_ISA_802 | CSKY_ISA_TRUST}, - - /* CK803 series. */ + {"ck802", + CSKY_ARCH_802, + CSKY_ISA_802, + CSKY_FEATURES_DEF_jt(CSKY_ISA_JAVA, 0), + CSKY_CPU_REVERISON_RESERVED()}, #define CSKY_ISA_803 (CSKY_ISA_802 | CSKYV2_ISA_2E3 | CSKY_ISA_MP) -#define CSKY_ISA_803R1 (CSKY_ISA_803 | CSKYV2_ISA_3E3R1) +#define CSKY_ISA_803R1 (CSKYV2_ISA_3E3R1) +#define CSKY_ISA_803R2 (CSKYV2_ISA_3E3R1 | CSKYV2_ISA_3E3R2) +#define CSKY_ISA_803R3 (CSKYV2_ISA_3E3R1 | CSKYV2_ISA_3E3R2 | CSKYV2_ISA_3E3R3) #define CSKY_ISA_FLOAT_803 (CSKY_ISA_FLOAT_E1 | CSKY_ISA_FLOAT_1E3) -#define CSKY_ISA_EDSP (CSKYV2_ISA_3E3R3 | CSKY_ISA_DSP_ENHANCE) - {"ck803", CSKY_ARCH_803, CSKY_ISA_803 }, - {"ck803h", CSKY_ARCH_803, CSKY_ISA_803 }, - {"ck803t", CSKY_ARCH_803, CSKY_ISA_803 | CSKY_ISA_TRUST}, - {"ck803ht", CSKY_ARCH_803, CSKY_ISA_803 | CSKY_ISA_TRUST}, - {"ck803f", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKY_ISA_FLOAT_803}, - {"ck803fh", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKY_ISA_FLOAT_803}, - {"ck803e", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803 | CSKYV2_ISA_DSP}, - {"ck803eh", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803 | CSKYV2_ISA_DSP}, - {"ck803et", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_TRUST}, - {"ck803eht", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_TRUST}, - {"ck803ef", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_803}, - {"ck803efh", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_803}, - {"ck803ft", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803eft", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803efht", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803r1", CSKY_ARCH_803, CSKY_ISA_803R1 }, - {"ck803hr1", CSKY_ARCH_803, CSKY_ISA_803R1 }, - {"ck803tr1", CSKY_ARCH_803, CSKY_ISA_803R1 | CSKY_ISA_TRUST}, - {"ck803htr1", CSKY_ARCH_803, CSKY_ISA_803R1 | CSKY_ISA_TRUST}, - {"ck803fr1", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_FLOAT_803}, - {"ck803fhr1", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_FLOAT_803}, - {"ck803er1", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R1 | CSKY_ISA_EDSP}, - {"ck803ehr1", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R1 | CSKY_ISA_EDSP}, - {"ck803etr1", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_TRUST}, - {"ck803ehtr1", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_TRUST}, - {"ck803efr1", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803}, - {"ck803efhr1", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803}, - {"ck803ftr1", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803eftr1", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803ehftr1", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - -#define CSKY_ISA_803R2 (CSKY_ISA_803R1 | CSKYV2_ISA_3E3R2) - {"ck803r2", CSKY_ARCH_803, CSKY_ISA_803R2}, - {"ck803hr2", CSKY_ARCH_803, CSKY_ISA_803R2}, - {"ck803tr2", CSKY_ARCH_803, CSKY_ISA_803R2 | CSKY_ISA_TRUST}, - {"ck803htr2", CSKY_ARCH_803, CSKY_ISA_803R2 | CSKY_ISA_TRUST}, - {"ck803fr2", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_FLOAT_803}, - {"ck803fhr2", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_FLOAT_803}, - {"ck803er2", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R2 | CSKY_ISA_EDSP}, - {"ck803ehr2", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R2 | CSKY_ISA_EDSP}, - {"ck803etr2", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_TRUST}, - {"ck803ehtr2", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_TRUST}, - {"ck803efr2", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803}, - {"ck803efhr2", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803}, - {"ck803ftr2", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803eftr2", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - {"ck803efhtr2", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R2 | CSKY_ISA_EDSP | CSKY_ISA_FLOAT_803 | CSKY_ISA_TRUST}, - -#define CSKY_ISA_803R3 (CSKY_ISA_803R2 | CSKYV2_ISA_3E3R3) - {"ck803r3", CSKY_ARCH_803, CSKY_ISA_803R3}, - - {"ck803s", CSKY_ARCH_803, CSKY_ISA_803R1 }, - {"ck803se", CSKY_ARCH_803 | CSKY_ARCH_DSP, CSKY_ISA_803R1 | CSKYV2_ISA_DSP}, - {"ck803sj", CSKY_ARCH_803 | CSKY_ARCH_JAVA, CSKY_ISA_803R1 | CSKY_ISA_JAVA}, - {"ck803sf", CSKY_ARCH_803 | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKY_ISA_FLOAT_803}, - {"ck803sef", CSKY_ARCH_803 | CSKY_ARCH_DSP | CSKY_ARCH_FLOAT, CSKY_ISA_803R1 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_803}, - {"ck803st", CSKY_ARCH_803, CSKY_ISA_803R1 | CSKY_ISA_TRUST}, - - /* CK807 series. */ -#define CSKY_ISA_807 (CSKY_ISA_803 | CSKYV2_ISA_3E7 | CSKY_ISA_DSP | CSKY_ISA_MP_1E2 | CSKY_ISA_CACHE) +#define CSKY_ISA_EDSP (CSKYV2_ISA_3E3R1 | CSKYV2_ISA_3E3R3 | CSKY_ISA_DSP_ENHANCE) + {"ck803s", + CSKY_ARCH_803, + CSKY_ISA_803 | CSKY_ISA_803R1, + CSKY_FEATURES_DEF_eft(CSKYV2_ISA_DSP, CSKY_ISA_FLOAT_803, 0), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck803", + CSKY_ARCH_803, + CSKY_ISA_803, + CSKY_FEATURES_DEF_efht(CSKYV2_ISA_DSP, CSKY_ISA_FLOAT_803, 0, 0), + CSKY_CPU_REVERISON_R3(CSKY_ISA_803R1, CSKY_ISA_803R2, CSKY_ISA_803R3)}, +#define CSKY_ISA_804 (CSKY_ISA_803 | CSKY_ISA_803R3) + {"ck804", + CSKY_ARCH_804, + CSKY_ISA_804, + CSKY_FEATURES_DEF_efht(CSKY_ISA_EDSP, CSKY_ISA_FLOAT_803, 0, 0), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_805 (CSKY_ISA_804 | CSKY_ISA_VDSP_2) +#define CSKY_ARCH_805V (CSKY_ARCH_805 | CSKY_ARCH_DSP) +#define CSKY_ISA_FLOAT_805 CSKY_ISA_FLOAT_803 + {"ck805", + CSKY_ARCH_805, + CSKY_ISA_805, + CSKY_FEATURES_DEF_eft(CSKY_ISA_EDSP, CSKY_ISA_FLOAT_805, 0), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_807 (CSKY_ISA_803 | CSKYV2_ISA_3E7 | CSKY_ISA_MP_1E2 | CSKY_ISA_CACHE | CSKYV2_ISA_DSP) #define CSKY_ISA_FLOAT_807 (CSKY_ISA_FLOAT_803 | CSKY_ISA_FLOAT_3E4 | CSKY_ISA_FLOAT_1E2) - {"ck807e", CSKY_ARCH_807_BASE, CSKY_ISA_807 | CSKYV2_ISA_DSP}, - {"ck807ef", CSKY_ARCH_807_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_807 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_807}, - {"ck807", CSKY_ARCH_807_BASE, CSKY_ISA_807 | CSKYV2_ISA_DSP}, - {"ck807f", CSKY_ARCH_807_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_807 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_807}, - - /* CK810 series. */ -#define CSKY_ISA_810 (CSKY_ISA_807 | CSKYV2_ISA_7E10) + {"ck807", + CSKY_ARCH_807, + CSKY_ISA_807, + CSKY_FEATURES_DEF_ef(CSKYV2_ISA_DSP, CSKY_ISA_FLOAT_807), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_810 (CSKY_ISA_807 | CSKYV2_ISA_7E10) #define CSKY_ISA_FLOAT_810 (CSKY_ISA_FLOAT_E1 | CSKY_ISA_FLOAT_1E2) - {"ck810e", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP}, - {"ck810et", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_TRUST}, - {"ck810ef", CSKY_ARCH_810_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_810}, - {"ck810eft", CSKY_ARCH_810_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_810 | CSKY_ISA_TRUST}, - {"ck810", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP}, - {"ck810v", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_VDSP}, - {"ck810f", CSKY_ARCH_810_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_FLOAT_810}, - {"ck810t", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_TRUST}, - {"ck810tv", CSKY_ARCH_810_BASE, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_TRUST}, - {"ck810ft", CSKY_ARCH_810_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_VDSP | CSKY_ISA_FLOAT_810 | CSKY_ISA_TRUST}, - {"ck810ftv", CSKY_ARCH_810_BASE | CSKY_ARCH_FLOAT, CSKY_ISA_810 | CSKYV2_ISA_DSP | CSKY_ISA_VDSP | CSKY_ISA_FLOAT_810 | CSKY_ISA_TRUST}, - - /* CK860 Series. */ -#define CSKY_ISA_860 (CSKY_ISA_810 | CSKYV2_ISA_10E60 | CSKYV2_ISA_3E3R3 | CSKY_ISA_DSPE60) -#define CSKY_ISA_860F (CSKY_ISA_860 | CSKY_ISA_FLOAT_7E60) - {"ck860", CSKY_ARCH_860, CSKY_ISA_860}, - {"ck860f", CSKY_ARCH_860, CSKY_ISA_860F}, - - {NULL, 0, 0} + {"ck810v", + CSKY_ARCH_810 | CSKY_ARCH_DSP, + CSKY_ISA_810 | CSKY_ISA_VDSP, + CSKY_FEATURES_DEF_NULL (), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck810", + CSKY_ARCH_810, + CSKY_ISA_810, + CSKY_FEATURES_DEF_eftv(0, CSKY_ISA_FLOAT_810, 0, CSKY_ISA_VDSP), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_860 ((CSKY_ISA_810 & ~(CSKYV2_ISA_DSP)) | CSKYV2_ISA_10E60 | CSKY_ISA_803R3 | CSKY_ISA_DSPE60) +#define CSKY_ISA_860F (CSKY_ISA_860 | CSKY_ISA_FLOAT_7E60) +#define CSKY_ISA_VDSP_860 (CSKY_ISA_VDSP_2) + {"ck860v", + CSKY_ARCH_860 | CSKY_ARCH_DSP, + CSKY_ISA_860 | CSKY_ISA_VDSP_860, + CSKY_FEATURES_DEF_f(CSKY_ISA_FLOAT_7E60), + CSKY_CPU_REVERISON_RESERVED()}, + {"ck860", + CSKY_ARCH_860, + CSKY_ISA_860, + CSKY_FEATURES_DEF_fv(CSKY_ISA_FLOAT_7E60, CSKY_ISA_VDSP_860), + CSKY_CPU_REVERISON_RESERVED()}, + + /* It is a special cpu, support all instructions. */ +#define CSKY_ISA_800 (CSKY_ISA_860 | CSKY_ISA_810 | CSKY_ISA_807 | CSKY_ISA_803) + {"ck800", + CSKY_ARCH_800, + CSKY_ISA_800, + CSKY_FEATURES_DEF_NULL(), + CSKY_CPU_REVERISON_RESERVED()}, + + +#define CSKY_ISA_E801 (CSKY_ISA_801) +#define CSKY_ISA_E802 (CSKY_ISA_E801 | CSKYV2_ISA_1E2 | CSKY_ISA_NVIC) +#define CSKY_ISA_E803 (CSKY_ISA_E802 | CSKYV2_ISA_2E3 | CSKY_ISA_MP | CSKYV2_ISA_3E3R1 | CSKYV2_ISA_3E3R2 | CSKYV2_ISA_3E3R3) +#define CSKY_ISA_E804 (CSKY_ISA_E803) +#define CSKY_ISA_FLOAT_V1 (CSKY_ISA_FLOAT_E1 | CSKY_ISA_FLOAT_1E3) + {"e801", + CSKY_ARCH_801, + CSKY_ISA_E801, + CSKY_FEATURES_DEF_NULL(), + CSKY_CPU_REVERISON_RESERVED()}, + {"e802", + CSKY_ARCH_802, + CSKY_ISA_E802, + CSKY_FEATURES_DEF_t(0), + CSKY_CPU_REVERISON_RESERVED()}, + {"e803", + CSKY_ARCH_803, + CSKY_ISA_E803, + CSKY_FEATURES_DEF_t(0), + CSKY_CPU_REVERISON_RESERVED()}, + {"e804", + CSKY_ARCH_804, + CSKY_ISA_E804, + CSKY_FEATURES_DEF_dft(CSKY_ISA_EDSP, CSKY_ISA_FLOAT_V1, 0), + CSKY_CPU_REVERISON_RESERVED()}, + +#define CSKY_ISA_S802 (CSKY_ISA_E801 | CSKYV2_ISA_1E2 | CSKY_ISA_NVIC | CSKY_ISA_TRUST) +#define CSKY_ISA_S803 (CSKY_ISA_S802 | CSKYV2_ISA_2E3 | CSKY_ISA_MP | CSKYV2_ISA_3E3R1 | CSKYV2_ISA_3E3R2 | CSKYV2_ISA_3E3R3) + {"s802", + CSKY_ARCH_802, + CSKY_ISA_S802, + CSKY_FEATURES_DEF_t(0), + CSKY_CPU_REVERISON_RESERVED()}, + {"s803", + CSKY_ARCH_803, + CSKY_ISA_S803, + CSKY_FEATURES_DEF_t(0), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_I805 (CSKY_ISA_S803) + {"i805", + CSKY_ARCH_805 | CSKY_ARCH_DSP, + CSKY_ISA_I805 | CSKY_ISA_VDSP_2, + CSKY_FEATURES_DEF_ft(CSKY_ISA_FLOAT_V1, 0), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKYV2_ISA_DSP (CSKY_ISA_DSP | CSKY_ISA_DSP_1E2 | CSKY_ISA_DSPE60) +#define CSKY_ISA_C807 (CSKY_ISA_E802 | CSKYV2_ISA_2E3 | CSKY_ISA_MP | CSKYV2_ISA_3E7 | CSKY_ISA_MP_1E2 | CSKY_ISA_CACHE | CSKYV2_ISA_DSP) +#define CSKY_ISA_FLOAT_C807 (CSKY_ISA_FLOAT_V1 | CSKY_ISA_FLOAT_3E4 | CSKY_ISA_FLOAT_1E2) +#define CSKY_ISA_FLOAT_C810 (CSKY_ISA_FLOAT_E1 | CSKY_ISA_FLOAT_1E2) +#define CSKY_ARCH_C810 (CSKY_ARCH_810 | CSKY_ARCH_FLOAT) +#define CSKY_ISA_C810 (CSKY_ISA_C807 | CSKYV2_ISA_7E10 | CSKY_ISA_FLOAT_C810) +#define CSKY_ARCH_C860 (CSKY_ARCH_860 | CSKY_ARCH_FLOAT) +#define CSKY_ISA_C860 (CSKY_ISA_860 | CSKY_ISA_FLOAT_7E60) + {"c807", + CSKY_ARCH_807, + CSKY_ISA_C807, + CSKY_FEATURES_DEF_fv(CSKY_ISA_FLOAT_C807, CSKY_ISA_VDSP), + CSKY_CPU_REVERISON_RESERVED()}, + {"c810", + CSKY_ARCH_C810, + CSKY_ISA_C810, + CSKY_FEATURES_DEF_tv(0, CSKY_ISA_VDSP), + CSKY_CPU_REVERISON_RESERVED()}, + {"c860", + CSKY_ARCH_C860, + CSKY_ISA_C860, + CSKY_FEATURES_DEF_v(CSKY_ISA_VDSP_2), + CSKY_CPU_REVERISON_RESERVED()}, +#define CSKY_ISA_R807 (CSKY_ISA_E802 | CSKYV2_ISA_2E3 | CSKY_ISA_MP | CSKYV2_ISA_3E7 | CSKY_ISA_MP_1E2 | CSKY_ISA_CACHE | CSKYV2_ISA_DSP) +#define CSKY_ISA_FLOAT_R807 (CSKY_ISA_FLOAT_V1 | CSKY_ISA_FLOAT_3E4 | CSKY_ISA_FLOAT_1E2) + {"r807", + CSKY_ARCH_807, + CSKY_ISA_R807, + CSKY_FEATURES_DEF_f(CSKY_ISA_FLOAT_R807), + CSKY_CPU_REVERISON_RESERVED()}, + +/* Start of private CPUs. */ +/* End of private CPUs. */ + + {NULL}, }; int md_short_jump_size = 2; @@ -938,13 +1160,60 @@ parse_cpu (const char *str) int i = 0; for (; csky_cpus[i].name != NULL; i++) - if (strcasecmp (str, csky_cpus[i].name) == 0) + if (strncasecmp (str, csky_cpus[i].name, strlen (csky_cpus[i].name)) == 0) { - mach_flag |= csky_cpus[i].mach_flag; + csky_insn.cpu = &csky_cpus[i]; + mach_flag |= csky_cpus[i].arch_flag; isa_flag = csky_cpus[i].isa_flag; - other_flag |= (csky_cpus[i].mach_flag & ~CSKY_ARCH_MASK); + const char *s = str + strlen (csky_cpus[i].name); + while (*s) + { + const struct csky_cpu_feature *feature = csky_cpus[i].features; + const struct csky_cpu_version *version = csky_cpus[i].ver; + char *next; + + if (*s == 'r') + { + s++; + while (version->r) + { + if (version->r == strtol (s, &next, 10)) + break; + version++; + } + if (version->r) + { + isa_flag |= version->isa_flag; + s = next; + } + else + goto unknown_cpu; + isa_flag = isa_flag & ~CSKYV2_ISA_DSP; + isa_flag |= CSKY_ISA_EDSP; + continue; + } + + /* Parse csky features. */ + while (feature->unique) + { + if (feature->unique == *s) + break; + feature++; + } + if (feature->unique) + { + isa_flag |= feature->isa_flag; + mach_flag |= feature->arch_flag; + } + else + goto unknown_cpu; + + s++; + } return; } + +unknown_cpu: as_bad (_("unknown cpu `%s'"), str); } @@ -954,10 +1223,12 @@ static void parse_arch (const char *str) { int i = 0; - for (; csky_archs[i].name != NULL; i++) - if (strcasecmp (str, csky_archs[i].name) == 0) + for (; csky_cpus[i].name != NULL; i++) + if (strcasecmp (str, csky_cpus[i].name) == 0) { - arch_flag |= csky_archs[i].arch_flag; + csky_insn.cpu = &csky_cpus[i]; + arch_flag |= csky_cpus[i].arch_flag; + isa_flag |= csky_cpus[i].isa_flag; return; } as_bad (_("unknown architecture `%s'"), str); @@ -1156,20 +1427,28 @@ md_show_usage (FILE *fp) fprintf (fp, _("\ -mcpu=CPU select processor CPU:")); - for (i = 0, n = margin; csky_cpus[i].name != NULL; i++) - { - int l = strlen (csky_cpus[i].name); - if (n + l >= margin) - { - fprintf (fp, "\n\t\t\t\t"); - n = l; - } - else - { - fprintf (fp, " "); - n += l + 1; - } - fprintf (fp, "%s", csky_cpus[i].name); + const struct csky_cpu_feature *feature = NULL; + const struct csky_cpu_version *version = NULL; + for (i = 0; csky_cpus[i].name != NULL; i++) + { + fprintf (fp, "\t\t\t\t%s", csky_cpus[i].name); + feature = csky_cpus[i].features; + version = csky_cpus[i].ver; + while (feature->unique) + { + if ((feature + 1)->unique) + fprintf (fp, "[%c]", feature->unique); + feature++; + } + while (version->r) + { + if (csky_cpus[i].name[0] == 'c' + && csky_cpus[i].name[1] == 'k') + fprintf (fp, "[r%d]", version->r); + else + fprintf (fp, "[-r%dp%d]", version->r, version->p); + version++; + } } fprintf (fp, "\n"); @@ -1346,50 +1625,34 @@ md_begin (void) struct csky_macro_info const *macro; struct csky_arch_info const *p_arch; struct csky_cpu_info const *p_cpu; - unsigned int flags = (other_flag | do_opt_mmp | do_opt_mcp | do_opt_mcache - | do_opt_msecurity | do_opt_mhard_float); + int flags; + other_flag = (do_opt_mmp | do_opt_mcp | do_opt_mcache + | do_opt_msecurity | do_opt_mhard_float); dsp_flag |= do_opt_mdsp | do_opt_medsp; isa_flag |= do_opt_mtrust | do_opt_mvdsp; + flags = other_flag; if (dsp_flag) flags |= CSKY_ARCH_DSP; if (mach_flag != 0) { - if (((mach_flag & CSKY_ARCH_MASK) != (arch_flag & CSKY_ARCH_MASK)) - && arch_flag != 0) - as_warn (_("-mcpu conflict with -march option, using -mcpu")); - if (((mach_flag & ~CSKY_ARCH_MASK) != (flags & ~CSKY_ARCH_MASK)) - && flags != 0) - as_warn (_("-mcpu conflict with other model parameters, using -mcpu")); + if (((mach_flag & CSKY_ARCH_MASK) + != (arch_flag & CSKY_ARCH_MASK)) + && arch_flag != 0) + as_warn ("-mcpu conflict with -march option, actually use -mcpu"); } else if (arch_flag != 0) - { - if ((arch_flag & CSKY_ARCH_MASK) == CSKY_ARCH_810 - || ((arch_flag & CSKY_ARCH_MASK) == CSKY_ARCH_807)) { - /* CK807 and CK810 have DSP instruction by default. */ - mach_flag |= CSKY_ARCH_DSP; - } - mach_flag |= arch_flag | flags; - } + mach_flag |= arch_flag | other_flag; else { #ifdef TARGET_WITH_CPU - int i = 0; - for (; csky_cpus[i].name != NULL; i++) - { - if (strcmp (TARGET_WITH_CPU, csky_cpus[i].name) == 0) - { - mach_flag |= csky_cpus[i].mach_flag; - isa_flag = csky_cpus[i].isa_flag; - break; - } - } + parse_cpu (TARGET_WITH_CPU); #else #if _CSKY_ABI==1 - mach_flag |= CSKY_ARCH_610 | flags; + parse_cpu ("ck610"); #else - mach_flag |= CSKY_ARCH_810_BASE | flags; + parse_cpu ("ck810"); #endif #endif } @@ -1420,8 +1683,8 @@ md_begin (void) } /* Find isa_flag. */ - for (p_cpu = csky_cpus; p_cpu->mach_flag != 0; p_cpu++) - if ((mach_flag & CPU_ARCH_MASK) == p_cpu->mach_flag) + for (p_cpu = csky_cpus; p_cpu->arch_flag != 0; p_cpu++) + if ((mach_flag & CPU_ARCH_MASK) == p_cpu->arch_flag) { bfd_elf_add_obj_attr_string (stdoutput, OBJ_ATTR_PROC, Tag_CSKY_CPU_NAME, p_cpu->name); diff --git a/include/ChangeLog b/include/ChangeLog index 2c0a0085f58..cc29c6da6a9 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,9 @@ +2020-09-10 Cooper Qu + + * opcode/csky.h (CSKY_ARCH_804): Define. + (CSKY_ARCH_805): Define. + (CSKY_ARCH_800): Define. + 2020-09-10 Nick Clifton * opcode/csky.h (CSKY_ISA_FLOAT_7E60): Use a long long type for diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c index 450a9bed0bf..ba0f4605f54 100644 --- a/opcodes/csky-dis.c +++ b/opcodes/csky-dis.c @@ -649,6 +649,7 @@ csky_output_operand (char *str, struct operand const *oprnd, memcpy (&f, &value, sizeof (float)); sprintf (buf, "%f\t// imm9:%4d, imm4:%2d", f, imm8, imm4); strcat (str, buf); + break; } @@ -677,6 +678,7 @@ csky_output_operand (char *str, struct operand const *oprnd, memcpy (&d, &dvalue, sizeof (double)); sprintf (buf, "%lf\t// imm9:%4ld, imm4:%2ld", d, (long) imm8, (long) imm4); strcat (str, buf); + break; } case OPRND_TYPE_LABEL_WITH_BRACKET: