diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2009-08-11 18:29:41 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@codesourcery.com> | 2009-08-11 18:29:41 +0000 |
commit | d55cb1c59e12fdb19d25fab16efc564fa5d85a8a (patch) | |
tree | ec659b4ffb9f141b437493d5b0f86883048a3e5e /gas/config/bfin-parse.y | |
parent | baa3eb38dfd765a404c5c231a01f38a39f4f1482 (diff) | |
download | binutils-gdb-d55cb1c59e12fdb19d25fab16efc564fa5d85a8a.tar.gz |
gas/
* config/bfin-parse.y (gen_multi_instr_1): New function.
(asm): Use it instead of bfin_gen_multi_instr.
(error): Add a format string when calling as_bad.
* config/bfin-defs.h (insn_regmask): Declare.
* config/tc-bfin.c (DREG_MASK, DREGH_MASK, DREGL_MASK, IREG_MASK): New
macros.
(decode_ProgCtrl_0, decode_LDSTpmod_0, decode_dagMODim_0,
decode_dagMODik_0, decode_dspLDST_0, decode_LDST_0, decode_LDSTiiFP_0,
decode_LDSTii_0, decode_dsp32mac_0, decode_dsp32mult_0,
decode_dsp32alu_0, decode_dsp32shift_0, decode_dsp32shitimm_0,
insn_regmask): New functions.
gas/testsuite/
* gas/bfin/parallel.s: Add more test cases.
* gas/bfin/parallel.d: Update accordingly.
* gas/bfin/resource_conflict.l: New test.
* gas/bfin/resource_conflict.s: New test.
* gas/bfin/bfin.exp: Add resource_conflict.
Diffstat (limited to 'gas/config/bfin-parse.y')
-rw-r--r-- | gas/config/bfin-parse.y | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/gas/config/bfin-parse.y b/gas/config/bfin-parse.y index ef84a72debf..f64fc02383c 100644 --- a/gas/config/bfin-parse.y +++ b/gas/config/bfin-parse.y @@ -385,6 +385,18 @@ is_group2 (INSTR_T x) return 0; } +static INSTR_T +gen_multi_instr_1 (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2) +{ + int mask1 = dsp32 ? insn_regmask (dsp32->value, dsp32->next->value) : 0; + int mask2 = dsp16_grp1 ? insn_regmask (dsp16_grp1->value, 0) : 0; + int mask3 = dsp16_grp2 ? insn_regmask (dsp16_grp2->value, 0) : 0; + + if ((mask1 & mask2) || (mask1 & mask3) || (mask2 & mask3)) + yyerror ("resource conflict in multi-issue instruction"); + return bfin_gen_multi_instr (dsp32, dsp16_grp1, dsp16_grp2); +} + %} %union { @@ -608,27 +620,27 @@ asm: asm_1 SEMICOLON if (($1->value & 0xf800) == 0xc000) { if (is_group1 ($3) && is_group2 ($5)) - $$ = bfin_gen_multi_instr ($1, $3, $5); + $$ = gen_multi_instr_1 ($1, $3, $5); else if (is_group2 ($3) && is_group1 ($5)) - $$ = bfin_gen_multi_instr ($1, $5, $3); + $$ = gen_multi_instr_1 ($1, $5, $3); else return yyerror ("Wrong 16 bit instructions groups, slot 2 and slot 3 must be 16-bit instrution group"); } else if (($3->value & 0xf800) == 0xc000) { if (is_group1 ($1) && is_group2 ($5)) - $$ = bfin_gen_multi_instr ($3, $1, $5); + $$ = gen_multi_instr_1 ($3, $1, $5); else if (is_group2 ($1) && is_group1 ($5)) - $$ = bfin_gen_multi_instr ($3, $5, $1); + $$ = gen_multi_instr_1 ($3, $5, $1); else return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 3 must be 16-bit instrution group"); } else if (($5->value & 0xf800) == 0xc000) { if (is_group1 ($1) && is_group2 ($3)) - $$ = bfin_gen_multi_instr ($5, $1, $3); + $$ = gen_multi_instr_1 ($5, $1, $3); else if (is_group2 ($1) && is_group1 ($3)) - $$ = bfin_gen_multi_instr ($5, $3, $1); + $$ = gen_multi_instr_1 ($5, $3, $1); else return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 2 must be 16-bit instrution group"); } @@ -641,25 +653,25 @@ asm: asm_1 SEMICOLON if (($1->value & 0xf800) == 0xc000) { if (is_group1 ($3)) - $$ = bfin_gen_multi_instr ($1, $3, 0); + $$ = gen_multi_instr_1 ($1, $3, 0); else if (is_group2 ($3)) - $$ = bfin_gen_multi_instr ($1, 0, $3); + $$ = gen_multi_instr_1 ($1, 0, $3); else return yyerror ("Wrong 16 bit instructions groups, slot 2 must be the 16-bit instruction group"); } else if (($3->value & 0xf800) == 0xc000) { if (is_group1 ($1)) - $$ = bfin_gen_multi_instr ($3, $1, 0); + $$ = gen_multi_instr_1 ($3, $1, 0); else if (is_group2 ($1)) - $$ = bfin_gen_multi_instr ($3, 0, $1); + $$ = gen_multi_instr_1 ($3, 0, $1); else return yyerror ("Wrong 16 bit instructions groups, slot 1 must be the 16-bit instruction group"); } else if (is_group1 ($1) && is_group2 ($3)) - $$ = bfin_gen_multi_instr (0, $1, $3); + $$ = gen_multi_instr_1 (0, $1, $3); else if (is_group2 ($1) && is_group1 ($3)) - $$ = bfin_gen_multi_instr (0, $3, $1); + $$ = gen_multi_instr_1 (0, $3, $1); else return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 2 must be the 16-bit instruction group"); } |