1  /* LoongArch definitions.
       2     Copyright (C) 2021-2023 Free Software Foundation, Inc.
       3     Contributed by Loongson Ltd.
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify
       8  it under the terms of the GNU General Public License as published by
       9  the Free Software Foundation; either version 3, or (at your option)
      10  any later version.
      11  
      12  GCC is distributed in the hope that it will be useful,
      13  but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15  GNU General Public License for more details.
      16  
      17  You should have received a copy of the GNU General Public License
      18  along with GCC; see the file COPYING3.  If not see
      19  <http://www.gnu.org/licenses/>.  */
      20  
      21  /* Definition of standard codes for:
      22      - base architecture types	(isa_base),
      23      - ISA extensions		(isa_ext),
      24      - base ABI types		(abi_base),
      25      - ABI extension types	(abi_ext).
      26  
      27      - code models		      (cmodel)
      28      - other command-line switches     (switch)
      29  
      30     These values are primarily used for implementing option handling
      31     logic in "loongarch.opt", "loongarch-driver.c" and "loongarch-opt.c".
      32  
      33     As for the result of this option handling process, the following
      34     scheme is adopted to represent the final configuration:
      35  
      36      - The target ABI is encoded with a tuple (abi_base, abi_ext)
      37        using the code defined below.
      38  
      39      - The target ISA is encoded with a "struct loongarch_isa" defined
      40        in loongarch-cpu.h.
      41  
      42      - The target microarchitecture is represented with a cpu model
      43        index defined in loongarch-cpu.h.
      44  */
      45  
      46  #ifndef LOONGARCH_DEF_H
      47  #define LOONGARCH_DEF_H
      48  
      49  #include "loongarch-tune.h"
      50  
      51  #ifdef __cplusplus
      52  extern "C" {
      53  #endif
      54  
      55  /* enum isa_base */
      56  extern const char* loongarch_isa_base_strings[];
      57  #define ISA_BASE_LA64V100     0
      58  #define N_ISA_BASE_TYPES      1
      59  
      60  /* enum isa_ext_* */
      61  extern const char* loongarch_isa_ext_strings[];
      62  #define ISA_EXT_NOFPU	      0
      63  #define ISA_EXT_FPU32	      1
      64  #define ISA_EXT_FPU64	      2
      65  #define N_ISA_EXT_FPU_TYPES   3
      66  #define N_ISA_EXT_TYPES	      3
      67  
      68  /* enum abi_base */
      69  extern const char* loongarch_abi_base_strings[];
      70  #define ABI_BASE_LP64D	      0
      71  #define ABI_BASE_LP64F	      1
      72  #define ABI_BASE_LP64S	      2
      73  #define N_ABI_BASE_TYPES      3
      74  
      75  /* enum abi_ext */
      76  extern const char* loongarch_abi_ext_strings[];
      77  #define ABI_EXT_BASE	      0
      78  #define N_ABI_EXT_TYPES	      1
      79  
      80  /* enum cmodel */
      81  extern const char* loongarch_cmodel_strings[];
      82  #define CMODEL_NORMAL	      0
      83  #define CMODEL_TINY	      1
      84  #define CMODEL_TINY_STATIC    2
      85  #define CMODEL_MEDIUM	      3
      86  #define CMODEL_LARGE	      4
      87  #define CMODEL_EXTREME	      5
      88  #define N_CMODEL_TYPES	      6
      89  
      90  /* enum switches */
      91  /* The "SW_" codes represent command-line switches (options that
      92     accept no parameters). Definition for other switches that affects
      93     the target ISA / ABI configuration will also be appended here
      94     in the future.  */
      95  
      96  extern const char* loongarch_switch_strings[];
      97  #define SW_SOFT_FLOAT	      0
      98  #define SW_SINGLE_FLOAT	      1
      99  #define SW_DOUBLE_FLOAT	      2
     100  #define N_SWITCH_TYPES	      3
     101  
     102  /* The common default value for variables whose assignments
     103     are triggered by command-line options.  */
     104  
     105  #define M_OPTION_NOT_SEEN -1
     106  #define M_OPT_ABSENT(opt_enum)  ((opt_enum) == M_OPTION_NOT_SEEN)
     107  
     108  
     109  /* Internal representation of the target.  */
     110  struct loongarch_isa
     111  {
     112    unsigned char base;	    /* ISA_BASE_ */
     113    unsigned char fpu;	    /* ISA_EXT_FPU_ */
     114  };
     115  
     116  struct loongarch_abi
     117  {
     118    unsigned char base;	    /* ABI_BASE_ */
     119    unsigned char ext;	    /* ABI_EXT_ */
     120  };
     121  
     122  struct loongarch_target
     123  {
     124    struct loongarch_isa isa;
     125    struct loongarch_abi abi;
     126    unsigned char cpu_arch;   /* CPU_ */
     127    unsigned char cpu_tune;   /* same */
     128    unsigned char cpu_native; /* same */
     129    unsigned char cmodel;	    /* CMODEL_ */
     130  };
     131  
     132  /* CPU properties.  */
     133  /* index */
     134  #define CPU_NATIVE	  0
     135  #define CPU_LOONGARCH64	  1
     136  #define CPU_LA464	  2
     137  #define N_ARCH_TYPES	  3
     138  #define N_TUNE_TYPES	  3
     139  
     140  /* parallel tables.  */
     141  extern const char* loongarch_cpu_strings[];
     142  extern struct loongarch_isa loongarch_cpu_default_isa[];
     143  extern int loongarch_cpu_issue_rate[];
     144  extern int loongarch_cpu_multipass_dfa_lookahead[];
     145  
     146  extern struct loongarch_cache loongarch_cpu_cache[];
     147  extern struct loongarch_rtx_cost_data loongarch_cpu_rtx_cost_data[];
     148  
     149  #ifdef __cplusplus
     150  }
     151  #endif
     152  #endif /* LOONGARCH_DEF_H */