/* tc-tilegx.h - Macros and type defines for a TILE-Gx chip.
   Copyright 2011 Free Software Foundation, Inc.

   This file is part of GAS, the GNU Assembler.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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 this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef TC_TILEGX

#include "opcode/tilegx.h"

#define TC_TILEGX

#define TARGET_BYTES_BIG_ENDIAN 0

#define WORKING_DOT_WORD

#define TARGET_ARCH			bfd_arch_tilegx

extern const char * tilegx_target_format (void);
#define TARGET_FORMAT tilegx_target_format ()

#define DWARF2_LINE_MIN_INSN_LENGTH	8

#define md_number_to_chars		number_to_chars_littleendian

#define DIFF_EXPR_OK   /* foo-. gets turned into PC relative relocs */

#define HANDLE_ALIGN(fragp) tilegx_handle_align (fragp)
extern void tilegx_handle_align (struct frag *);

#define MAX_MEM_FOR_RS_ALIGN_CODE (7 + 8)

struct tilegx_operand;
#define TC_FIX_TYPE const struct tilegx_operand *

/* Initialize the TC_FIX_TYPE field.  */
#define TC_INIT_FIX_DATA(FIX) \
  FIX->tc_fix_data = 0

extern void tilegx_cons_fix_new (struct frag *, int,
				 int, struct expressionS *);
#define TC_CONS_FIX_NEW(FRAG, WHERE, NBYTES, EXP) \
  tilegx_cons_fix_new (FRAG, WHERE, NBYTES, EXP)

extern int tilegx_parse_name (char *, expressionS *, char *);
#define md_parse_name(name, e, m, nextP) tilegx_parse_name (name, e, nextP)

extern int tilegx_fix_adjustable (struct fix *);
#define tc_fix_adjustable(FIX)   tilegx_fix_adjustable (FIX)

extern int tilegx_unrecognized_line (int);
#define tc_unrecognized_line(ch) tilegx_unrecognized_line (ch)

/* Values passed to md_apply_fix3 don't include the symbol value.  */
#define MD_APPLY_SYM_VALUE(FIX) 0

#define md_convert_frag(b,s,f) \
  as_fatal ("tilegx convert_frag called")
#define md_estimate_size_before_relax(f,s) \
  (as_fatal ("tilegx estimate_size_before_relax called"),1)
#define md_operand(x)

#define md_section_align(seg,size)	(size)

/* We want .cfi_* pseudo-ops for generating unwind info.  */
#define TARGET_USE_CFIPOP 1

#define tc_cfi_frame_initial_instructions tilegx_cfi_frame_initial_instructions
extern void tilegx_cfi_frame_initial_instructions (void);

#define tc_regname_to_dw2regnum tc_tilegx_regname_to_dw2regnum
extern int tc_tilegx_regname_to_dw2regnum (char *);

extern int tilegx_cie_data_alignment;

#define DWARF2_DEFAULT_RETURN_COLUMN 55
#define DWARF2_CIE_DATA_ALIGNMENT tilegx_cie_data_alignment

#endif /* TC_TILEGX */
