/* bfin-aux.h ADI Blackfin Header file for gas
   Copyright 2005, 2007
   Free Software Foundation, Inc.

   This file is part of GAS, the GNU Assembler.

   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */

#include "bfin-defs.h"

#define REG_T Register *

INSTR_T
bfin_gen_dsp32mac (int op1, int mm, int mmod, int w1, int p,
              int h01, int h11, int h00, int h10,
	      int op0, REG_T dst, REG_T src0, REG_T src1, int w0);

INSTR_T
bfin_gen_dsp32mult (int op1, int mm, int mmod, int w1, int p,
               int h01, int h11, int h00, int h10,
	       int op0, REG_T dst, REG_T src0, REG_T src1, int w0);

INSTR_T
bfin_gen_dsp32alu (int HL, int aopcde, int aop, int s, int x,
              REG_T dst0, REG_T dst1, REG_T src0, REG_T src1);

INSTR_T
bfin_gen_dsp32shift (int sopcde, REG_T dst0, REG_T src0, REG_T src1,
                int sop, int hls);

INSTR_T
bfin_gen_dsp32shiftimm (int sopcde, REG_T dst0, int immag, REG_T src1,
                   int sop, int hls);

INSTR_T
bfin_gen_ldimmhalf (REG_T reg, int h, int s, int z, Expr_Node *hword,
               int reloc);

INSTR_T
bfin_gen_ldstidxi (REG_T ptr, REG_T reg, int w, int sz, int z,
              Expr_Node *offset);

INSTR_T
bfin_gen_ldst (REG_T ptr, REG_T reg, int aop, int sz, int z, int w);

INSTR_T
bfin_gen_ldstii (REG_T ptr, REG_T reg, Expr_Node *offset, int w, int op);

INSTR_T
bfin_gen_ldstiifp (REG_T reg, Expr_Node *offset, int w);

INSTR_T
bfin_gen_ldstpmod (REG_T ptr, REG_T reg, int aop, int w, REG_T idx);

INSTR_T
bfin_gen_dspldst (REG_T i, REG_T reg, int aop, int w, int m);

INSTR_T
bfin_gen_alu2op (REG_T dst, REG_T src, int opc);

INSTR_T
bfin_gen_compi2opd (REG_T dst, int src, int op);

INSTR_T
bfin_gen_compi2opp (REG_T dst, int src, int op);

INSTR_T
bfin_gen_dagmodik (REG_T i, int op);

INSTR_T
bfin_gen_dagmodim (REG_T i, REG_T m, int op, int br);

INSTR_T
bfin_gen_ptr2op (REG_T dst, REG_T src, int opc);

INSTR_T
bfin_gen_logi2op (int dst, int src, int opc);

INSTR_T
bfin_gen_comp3op (REG_T src0, REG_T src1, REG_T dst, int opc);

INSTR_T
bfin_gen_ccmv (REG_T src, REG_T dst, int t);

INSTR_T
bfin_gen_ccflag (REG_T x, int y, int opc, int i, int g);

INSTR_T
bfin_gen_cc2stat (int cbit, int op, int d);

INSTR_T
bfin_gen_regmv (REG_T src, REG_T dst);

INSTR_T
bfin_gen_cc2dreg (int op, REG_T reg);

INSTR_T
bfin_gen_brcc (int t, int b, Expr_Node *offset);

INSTR_T
bfin_gen_ujump (Expr_Node *offset);

INSTR_T
bfin_gen_cactrl (REG_T reg, int a, int op);

INSTR_T
bfin_gen_progctrl (int prgfunc, int poprnd);

INSTR_T
bfin_gen_loopsetup (Expr_Node *soffset, REG_T c, int rop,
               Expr_Node *eoffset, REG_T reg);

INSTR_T
bfin_gen_loop (Expr_Node *expr, REG_T reg, int rop, REG_T preg);

INSTR_T
bfin_gen_pushpopmultiple (int dr, int pr, int d, int p, int w);

INSTR_T
bfin_gen_pushpopreg (REG_T reg, int w);

INSTR_T
bfin_gen_calla (Expr_Node *addr, int s);

INSTR_T
bfin_gen_linkage (int r, int framesize);

INSTR_T
bfin_gen_pseudodbg (int fn, int reg, int grp);

INSTR_T
bfin_gen_pseudodbg_assert (int dbgop, REG_T regtest, int expected);

bfd_boolean
bfin_resource_conflict (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2);

INSTR_T
bfin_gen_multi_instr (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2);
