/* bfd back-end for TMS320C[34]x support
   Copyright (C) 1996-2021 Free Software Foundation, Inc.

   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz)

   This file is part of BFD, the Binary File Descriptor library.

   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.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"

static bool
tic4x_scan (const struct bfd_arch_info *info,
	    const char *string)
{
  /* Allow strings of form [ti][Cc][34][0-9], let's not be too picky
     about strange numbered machines in C3x or C4x series.  */
  if (string[0] == 't' && string[1] == 'i')
    string += 2;
  if (*string == 'C' || *string == 'c')
    string++;
  if (string[1] < '0' && string[1] > '9')
    return false;

  if (*string == '3')
    return (info->mach == bfd_mach_tic3x);
  else if (*string == '4')
    return info->mach == bfd_mach_tic4x;

  return false;
}

#define N(NUMBER, NAME, PRINT, DEFAULT, NEXT)		\
  {							\
    32,        /* Bits in a word.  */			\
    32,        /* Bits in an address.  */		\
    32,	       /* Bits in a byte.  */			\
    bfd_arch_tic4x,					\
    NUMBER,						\
    NAME,						\
    PRINT,						\
    0,		/* Section alignment power.  */		\
    DEFAULT,						\
    bfd_default_compatible,				\
    tic4x_scan,						\
    bfd_arch_default_fill,				\
    NEXT,						\
    0 /* Maximum offset of a reloc from the start of an insn.  */ \
  }

const bfd_arch_info_type bfd_tic3x_arch =
  N (bfd_mach_tic3x, "tic3x", "tms320c3x", false, NULL);

const bfd_arch_info_type bfd_tic4x_arch =
  N (bfd_mach_tic4x, "tic4x", "tms320c4x", true, &bfd_tic3x_arch);
