diff options
author | Cooper Qu <cooper.qu@linux.alibaba.com> | 2020-09-07 17:24:11 +0800 |
---|---|---|
committer | Lifang Xia <lifang_xia@c-sky.com> | 2020-09-09 19:25:40 +0800 |
commit | 1feede9b384ef80a268ffe0b18e75bd60574f7c7 (patch) | |
tree | 2981852750a2405cc1cdf1cfade31ca5d7574ba0 /opcodes/csky-dis.c | |
parent | dfbee68088e822453fdc82f6b8a3a5bc468944b1 (diff) | |
download | gdb-1feede9b384ef80a268ffe0b18e75bd60574f7c7.zip gdb-1feede9b384ef80a268ffe0b18e75bd60574f7c7.tar.gz gdb-1feede9b384ef80a268ffe0b18e75bd60574f7c7.tar.bz2 |
CSKY: Add FPUV3 instructions, which supported by ck860f.
Co-Authored-By: Lifang Xia <lifang_xia@c-sky.com>
gas/
* config/tc-csky.c (float_work_fpuv3_fmovi): New function,
helper function to encode fpuv3 fmovi instructions.
(float_work_fpuv3_fstore): New function.
(struct literal): Add new member 'offset'.
(csky_cpus): New cpu CK860f.
(enter_literal): Return literal pool pointer instead of offset.
(parse_rt): Adjust the change of enter_literal.
(parse_rtf): Likewise.
(v1_work_lrw): Likewise.
(v1_work_jbsr): Likewise.
(v2_work_lrw): Likewise.
(v2_work_jbsr): Likewise.
(v2_work_jsri): Likewise.
(vdsp_work_vlrw): Likewise.
(is_freglist_legal): Add handler for FPUV3.
(parse_type_freg): Likewise.
(is_imm_within_range): Set e.X_add_number if it is a signed and
negtive number.
(get_operand_value): Add handler for OPRND_TYPE_IMM9b,
OPRND_TYPE_HFLOAT_FMOVI, OPRND_TYPE_SFLOAT_FMOVI
and OPRND_TYPE_DFLOAT_FMOVI.
(float_to_half): Convert float number to harf float.
opcodes/
* csky-dis.c (csky_output_operand): Add handlers for
OPRND_TYPE_HFLOAT_FMOVI, OPRND_TYPE_SFLOAT_FMOVI and
OPRND_TYPE_DFLOAT_FMOVI. Refine OPRND_TYPE_FREGLIST_DASH
to support FPUV3 instructions.
* csky-opc.h (enum operand_type): New enum OPRND_TYPE_IMM9b,
OPRND_TYPE_HFLOAT_FMOVI, OPRND_TYPE_SFLOAT_FMOVI and
OPRND_TYPE_DFLOAT_FMOVI.
(OPRND_MASK_4_5, OPRND_MASK_6, OPRND_MASK_6_7, OPRND_MASK_6_8,
OPRND_MASK_7, OPRND_MASK_7_8, OPRND_MASK_17_24,
OPRND_MASK_20, OPRND_MASK_20_21, OPRND_MASK_20_22,
OPRND_MASK_20_23, OPRND_MASK_20_24, OPRND_MASK_20_25,
OPRND_MASK_0_3or5_8, OPRND_MASK_0_3or6_7, OPRND_MASK_0_3or25,
OPRND_MASK_0_4or21_24, OPRND_MASK_5or20_21,
OPRND_MASK_5or20_22, OPRND_MASK_5or20_23, OPRND_MASK_5or20_24,
OPRND_MASK_5or20_25, OPRND_MASK_8_9or21_25,
OPRND_MASK_8_9or16_25, OPRND_MASK_4_6or20, OPRND_MASK_5_7or20,
OPRND_MASK_4_5or20or25, OPRND_MASK_4_6or20or25,
OPRND_MASK_4_7or20or25, OPRND_MASK_6_9or17_24,
OPRND_MASK_6_7or20, OPRND_MASK_6or20, OPRND_MASK_7or20,
OPRND_MASK_5or8_9or16_25, OPRND_MASK_5or8_9or20_25): Define.
(csky_v2_opcodes): Add FPUV3 instructions.
include/
* opcode/csky.h (CSKY_ISA_FLOAT_7E60): Define.
Diffstat (limited to 'opcodes/csky-dis.c')
-rw-r--r-- | opcodes/csky-dis.c | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c index f815679..89f1c6b 100644 --- a/opcodes/csky-dis.c +++ b/opcodes/csky-dis.c @@ -623,6 +623,62 @@ csky_output_operand (char *str, struct operand const *oprnd, strcat (str, buf); break; } + case OPRND_TYPE_HFLOAT_FMOVI: + case OPRND_TYPE_SFLOAT_FMOVI: + { + int imm4; + int imm8; + imm4 = ((inst >> 16) & 0xf); + imm4 = (138 - imm4) << 23; + + imm8 = ((inst >> 8) & 0x3); + imm8 |= (((inst >> 20) & 0x3f) << 2); + imm8 <<= 15; + + value = ((inst >> 5) & 1) << 31; + value |= imm4 | imm8; + + imm4 = 138 - (imm4 >> 23); + imm8 >>= 15; + if ((inst >> 5) & 1) + { + imm8 = 0 - imm8; + } + + float f = 0; + memcpy (&f, &value, sizeof (float)); + sprintf (str, "%s%f\t// imm9:%4d, imm4:%2d", str, f, imm8, imm4); + + break; + } + + case OPRND_TYPE_DFLOAT_FMOVI: + { + uint64_t imm4; + uint64_t imm8; + uint64_t dvalue; + imm4 = ((inst >> 16) & 0xf); + imm4 = (1034 - imm4) << 52; + + imm8 = ((inst >> 8) & 0x3); + imm8 |= (((inst >> 20) & 0x3f) << 2); + imm8 <<= 44; + + dvalue = (((uint64_t)inst >> 5) & 1) << 63; + dvalue |= imm4 | imm8; + + imm4 = 1034 - (imm4 >> 52); + imm8 >>= 44; + if (inst >> 5) + { + imm8 = 0 - imm8; + } + double d = 0; + memcpy (&d, &dvalue, sizeof (double)); + sprintf (str, "%s%lf\t// imm9:%4ld, imm4:%2ld", str, d, imm8, imm4); + + break; + } case OPRND_TYPE_LABEL_WITH_BRACKET: sprintf (buf, "[0x%x]", (unsigned int)value); strcat (str, buf); @@ -653,8 +709,20 @@ csky_output_operand (char *str, struct operand const *oprnd, case OPRND_TYPE_FREGLIST_DASH: if (IS_CSKY_V2 (mach_flag)) { - int vrx = value & 0xf; - int vry = vrx + (value >> 4); + int vrx = 0; + int vry = 0; + if (dis_info.isa & CSKY_ISA_FLOAT_7E60 + && (strstr (str, "fstm") != NULL + || strstr (str, "fldm") != NULL)) + { + vrx = value & 0x1f; + vry = vrx + (value >> 5); + } + else + { + vrx = value & 0xf; + vry = vrx + (value >> 4); + } sprintf (buf, "fr%d-fr%d", vrx, vry); strcat (str, buf); } |