OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [tools/] [riscv-gnu-toolchain-master/] [gcc/] [gcc/] [common/] [config/] [riscv/] [riscv-common.c] - Rev 13

Compare with Previous | Blame | View Log

/* Common hooks for RISC-V.
   Copyright (C) 1989-2014 Free Software Foundation, Inc.
 
This file is part of GCC.
 
GCC 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.
 
GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
 
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
#include "common/common-target.h"
#include "common/common-target-def.h"
#include "opts.h"
#include "flags.h"
#include "errors.h"
 
/* Parse a RISC-V ISA string into an option mask.  */
 
static void
riscv_parse_arch_string (const char *isa, int *flags)
{
  const char *p = isa;
 
  if (strncmp (p, "RV32", 4) == 0)
    *flags |= MASK_32BIT, p += 4;
  else if (strncmp (p, "RV64", 4) == 0)
    *flags &= ~MASK_32BIT, p += 4;
 
  if (*p++ != 'I')
    {
      error ("-march=%s: ISA strings must begin with I, RV32I, or RV64I", isa);
      return;
    }
 
  *flags &= ~MASK_MULDIV;
  if (*p == 'M')
    *flags |= MASK_MULDIV, p++;
 
  *flags &= ~MASK_ATOMIC;
  if (*p == 'A')
    *flags |= MASK_ATOMIC, p++;
 
  *flags |= MASK_SOFT_FLOAT_ABI;
  if (*p == 'F')
    *flags &= ~MASK_SOFT_FLOAT_ABI, p++;
 
  if (*p == 'D')
    {
      p++;
      if (!TARGET_HARD_FLOAT)
	{
	  error ("-march=%s: the D extension requires the F extension", isa);
	  return;
	}
    }
  else if (TARGET_HARD_FLOAT)
    {
      error ("-march=%s: single-precision-only is not yet supported", isa);
      return;
    }
 
  *flags &= ~MASK_RVC;
  if (*p == 'C')
    *flags |= MASK_RVC, p++;
 
  /* FIXME: For now we just stop parsing when faced with a
     non-standard RISC-V ISA extension, partially becauses of a
     problem with the naming scheme. */
  if (*p == 'X')
    return;
 
  if (*p)
    {
      error ("-march=%s: unsupported ISA substring %s", isa, p);
      return;
    }
}
 
static int
riscv_flags_from_arch_string (const char *isa)
{
  int flags = 0;
  riscv_parse_arch_string (isa, &flags);
  return flags;
}
 
/* Implement TARGET_HANDLE_OPTION.  */
 
static bool
riscv_handle_option (struct gcc_options *opts,
		     struct gcc_options *opts_set ATTRIBUTE_UNUSED,
		     const struct cl_decoded_option *decoded,
		     location_t loc ATTRIBUTE_UNUSED)
{
  switch (decoded->opt_index)
    {
    case OPT_march_:
      riscv_parse_arch_string (decoded->arg, &opts->x_target_flags);
      return true;
 
    default:
      return true;
    }
}
 
/* Implement TARGET_OPTION_OPTIMIZATION_TABLE.  */
static const struct default_options riscv_option_optimization_table[] =
  {
    { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
    { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
    { OPT_LEVELS_NONE, 0, NULL, 0 }
  };
 
#undef TARGET_OPTION_OPTIMIZATION_TABLE
#define TARGET_OPTION_OPTIMIZATION_TABLE riscv_option_optimization_table
 
#undef TARGET_DEFAULT_TARGET_FLAGS
#define TARGET_DEFAULT_TARGET_FLAGS				\
  (TARGET_DEFAULT						\
   | riscv_flags_from_arch_string (RISCV_ARCH_STRING_DEFAULT)	\
   | (TARGET_64BIT_DEFAULT ? 0 : MASK_32BIT))
 
#undef TARGET_HANDLE_OPTION
#define TARGET_HANDLE_OPTION riscv_handle_option
 
struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.