[PATCH v2] CSKY: Support two operands form for bloop.
Lifang Xia
lifang_xia@c-sky.com
Fri Aug 21 08:51:54 GMT 2020
I added the changelog and merged.
Lifang Xia
在 2020/8/21 16:17, Cooper Qu 写道:
> gas/
> * config/tc-csky.c (csky_insn_info): Add member last_isize.
> (md_assemble): Assign value to csky_insn.last_isize.
> * testsuite/gas/csky/enhance_dsp.d: Test bloop's two operands form.
> * testsuite/gas/csky/enhance_dsp.s: Likewise.
>
> opcodes/
> * csky-opc.h (csky_v2_opcodes): Add two operands form for bloop.
>
> ---
> gas/config/tc-csky.c | 22 +++++++++++++++++++++-
> gas/testsuite/gas/csky/enhance_dsp.d | 1 +
> gas/testsuite/gas/csky/enhance_dsp.s | 1 +
> opcodes/csky-opc.h | 11 +++++++----
> 4 files changed, 30 insertions(+), 5 deletions(-)
>
> diff --git a/gas/config/tc-csky.c b/gas/config/tc-csky.c
> index d56bcc222a3..49a52d442a0 100644
> --- a/gas/config/tc-csky.c
> +++ b/gas/config/tc-csky.c
> @@ -272,6 +272,7 @@ struct csky_insn_info
> struct csky_macro_info *macro;
> /* Insn size for check_literal. */
> unsigned int isize;
> + unsigned int last_isize;
> /* Max size of insn for relax frag_var. */
> unsigned int max;
> /* Indicates which element is in csky_opcode_info op[] array. */
> @@ -4145,6 +4146,7 @@ md_assemble (char *str)
> check_literals (csky_insn.opcode->transfer, csky_insn.max);
> }
>
> + csky_insn.last_isize = csky_insn.isize;
> insn_reloc = BFD_RELOC_NONE;
> }
>
> @@ -6900,7 +6902,8 @@ dsp_work_bloop (void)
> csky_insn.inst = csky_insn.opcode->op32[0].opcode | (reg << 16);
> csky_insn.isize = 4;
>
> - if (csky_insn.e1.X_op == O_symbol
> + if (csky_insn.number == 3
> + && csky_insn.e1.X_op == O_symbol
> && csky_insn.e2.X_op == O_symbol)
> {
> fix_new_exp (frag_now, csky_insn.output - frag_now->fr_literal,
> @@ -6910,6 +6913,23 @@ dsp_work_bloop (void)
> 4, &csky_insn.e2, 1,
> BFD_RELOC_CKCORE_PCREL_BLOOP_IMM4BY4);
> }
> + else if (csky_insn.number == 2
> + && csky_insn.e1.X_op == O_symbol)
> + {
> + fix_new_exp (frag_now, csky_insn.output-frag_now->fr_literal,
> + 4, &csky_insn.e1, 1,
> + BFD_RELOC_CKCORE_PCREL_BLOOP_IMM12BY4);
> + if (csky_insn.last_isize == 2)
> + csky_insn.inst |= (0xf << 12);
> + else if (csky_insn.last_isize != 0)
> + csky_insn.inst |= (0xe << 12);
> + else
> + {
> + void *arg = (void *)"bloop can not be the first instruction"\
> + "when the end label is not specified.\n";
> + csky_show_error (ERROR_UNDEFINE, 0, arg, NULL);
> + }
> + }
>
> csky_write_insn (csky_insn.output, csky_insn.inst, csky_insn.isize);
> return TRUE;
> diff --git a/gas/testsuite/gas/csky/enhance_dsp.d b/gas/testsuite/gas/csky/enhance_dsp.d
> index 431703821f1..eaf91259f8b 100644
> --- a/gas/testsuite/gas/csky/enhance_dsp.d
> +++ b/gas/testsuite/gas/csky/enhance_dsp.d
> @@ -11,6 +11,7 @@ Disassembly of section \.text:
> \s*[0-9a-f]*:\s*d0038802\s*ldbi.w\s*r2,\s*\(r3\)
> #...
> \s*[0-9a-f]*:\s*e9c20ffa\s*bloop\s*r2,\s*0x0,\s*0xc.*
> +\s*[0-9a-f]*:\s*e9c2eff8\s*bloop\s*r2,\s*0x0,\s*0xc.*
> \s*[0-9a-f]*:\s*d0038c02\s*pldbi.d\s*r2,\s*\(r3\)
> \s*[0-9a-f]*:\s*d0039002\s*ldbi.hs\s*r2,\s*\(r3\)
> \s*[0-9a-f]*:\s*d0039402\s*ldbi.bs\s*r2,\s*\(r3\)
> diff --git a/gas/testsuite/gas/csky/enhance_dsp.s b/gas/testsuite/gas/csky/enhance_dsp.s
> index 0491a53e32b..755235dab3a 100644
> --- a/gas/testsuite/gas/csky/enhance_dsp.s
> +++ b/gas/testsuite/gas/csky/enhance_dsp.s
> @@ -7,6 +7,7 @@ hello:
> ldbi.w r2, (r3)
> .loop_end:
> bloop r2, .loop_start, .loop_end
> + bloop r2, .loop_start
> pldbi.d r2, (r3)
> ldbi.hs r2, (r3)
> ldbi.bs r2, (r3)
> diff --git a/opcodes/csky-opc.h b/opcodes/csky-opc.h
> index bb35fe1f86e..6dcf742e482 100644
> --- a/opcodes/csky-opc.h
> +++ b/opcodes/csky-opc.h
> @@ -4675,13 +4675,16 @@ const struct csky_opcode csky_v2_opcodes[] =
> #define _RELAX 0
>
> /* The followings are enhance DSP instructions. */
> - OP32_WITH_WORK ("bloop",
> - OPCODE_INFO3 (0xe9c00000,
> + DOP32_WITH_WORK ("bloop",
> + OPCODE_INFO3 (0xe9c00000,
> (16_20, AREG, OPRND_SHIFT_0_BIT),
> (0_11, BLOOP_OFF12b, OPRND_SHIFT_1_BIT),
> (12_15, BLOOP_OFF4b, OPRND_SHIFT_1_BIT)),
> - CSKY_ISA_DSP_ENHANCE,
> - dsp_work_bloop),
> + OPCODE_INFO2 (0xe9c00000,
> + (16_20, AREG, OPRND_SHIFT_0_BIT),
> + (0_11, BLOOP_OFF12b, OPRND_SHIFT_1_BIT)),
> + CSKY_ISA_DSP_ENHANCE,
> + dsp_work_bloop),
> /* The followings are ld/st instructions. */
> OP32 ("ldbi.b",
> OPCODE_INFO2 (0xd0008000,
More information about the Binutils
mailing list