Home | History | Annotate | Line # | Download | only in riscv
      1  1.1  mrg /* RISC-V-specific code for C family languages.
      2  1.1  mrg    Copyright (C) 2011-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andrew Waterman (andrew (at) sifive.com).
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful,
     13  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #define IN_TARGET_CODE 1
     22  1.1  mrg 
     23  1.1  mrg #define INCLUDE_STRING
     24  1.1  mrg #include "config.h"
     25  1.1  mrg #include "system.h"
     26  1.1  mrg #include "coretypes.h"
     27  1.1  mrg #include "tm.h"
     28  1.1  mrg #include "c-family/c-common.h"
     29  1.1  mrg #include "cpplib.h"
     30  1.1  mrg #include "riscv-subset.h"
     31  1.1  mrg 
     32  1.1  mrg #define builtin_define(TXT) cpp_define (pfile, TXT)
     33  1.1  mrg 
     34  1.1  mrg /* Implement TARGET_CPU_CPP_BUILTINS.  */
     35  1.1  mrg 
     36  1.1  mrg void
     37  1.1  mrg riscv_cpu_cpp_builtins (cpp_reader *pfile)
     38  1.1  mrg {
     39  1.1  mrg   builtin_define ("__riscv");
     40  1.1  mrg 
     41  1.1  mrg   if (TARGET_RVC)
     42  1.1  mrg     builtin_define ("__riscv_compressed");
     43  1.1  mrg 
     44  1.1  mrg   if (TARGET_RVE)
     45  1.1  mrg     builtin_define ("__riscv_32e");
     46  1.1  mrg 
     47  1.1  mrg   if (TARGET_ATOMIC)
     48  1.1  mrg     builtin_define ("__riscv_atomic");
     49  1.1  mrg 
     50  1.1  mrg   if (TARGET_MUL)
     51  1.1  mrg     builtin_define ("__riscv_mul");
     52  1.1  mrg   if (TARGET_DIV)
     53  1.1  mrg     builtin_define ("__riscv_div");
     54  1.1  mrg   if (TARGET_DIV && TARGET_MUL)
     55  1.1  mrg     builtin_define ("__riscv_muldiv");
     56  1.1  mrg 
     57  1.1  mrg   builtin_define_with_int_value ("__riscv_xlen", UNITS_PER_WORD * 8);
     58  1.1  mrg   if (TARGET_HARD_FLOAT)
     59  1.1  mrg     builtin_define_with_int_value ("__riscv_flen", UNITS_PER_FP_REG * 8);
     60  1.1  mrg 
     61  1.1  mrg   if (TARGET_HARD_FLOAT && TARGET_FDIV)
     62  1.1  mrg     {
     63  1.1  mrg       builtin_define ("__riscv_fdiv");
     64  1.1  mrg       builtin_define ("__riscv_fsqrt");
     65  1.1  mrg     }
     66  1.1  mrg 
     67  1.1  mrg   switch (riscv_abi)
     68  1.1  mrg     {
     69  1.1  mrg     case ABI_ILP32E:
     70  1.1  mrg       builtin_define ("__riscv_abi_rve");
     71  1.1  mrg       gcc_fallthrough ();
     72  1.1  mrg 
     73  1.1  mrg     case ABI_ILP32:
     74  1.1  mrg     case ABI_LP64:
     75  1.1  mrg       builtin_define ("__riscv_float_abi_soft");
     76  1.1  mrg       break;
     77  1.1  mrg 
     78  1.1  mrg     case ABI_ILP32F:
     79  1.1  mrg     case ABI_LP64F:
     80  1.1  mrg       builtin_define ("__riscv_float_abi_single");
     81  1.1  mrg       break;
     82  1.1  mrg 
     83  1.1  mrg     case ABI_ILP32D:
     84  1.1  mrg     case ABI_LP64D:
     85  1.1  mrg       builtin_define ("__riscv_float_abi_double");
     86  1.1  mrg       break;
     87  1.1  mrg     }
     88  1.1  mrg 
     89  1.1  mrg   switch (riscv_cmodel)
     90  1.1  mrg     {
     91  1.1  mrg     case CM_MEDLOW:
     92  1.1  mrg       builtin_define ("__riscv_cmodel_medlow");
     93  1.1  mrg       break;
     94  1.1  mrg 
     95  1.1  mrg     case CM_PIC:
     96  1.1  mrg       /* __riscv_cmodel_pic is deprecated, and will removed in next GCC release.
     97  1.1  mrg 	 see https://github.com/riscv/riscv-c-api-doc/pull/11  */
     98  1.1  mrg       builtin_define ("__riscv_cmodel_pic");
     99  1.1  mrg       /* FALLTHROUGH. */
    100  1.1  mrg 
    101  1.1  mrg     case CM_MEDANY:
    102  1.1  mrg       builtin_define ("__riscv_cmodel_medany");
    103  1.1  mrg       break;
    104  1.1  mrg 
    105  1.1  mrg     }
    106  1.1  mrg 
    107  1.1  mrg   if (TARGET_MIN_VLEN != 0)
    108  1.1  mrg     builtin_define_with_int_value ("__riscv_v_min_vlen", TARGET_MIN_VLEN);
    109  1.1  mrg 
    110  1.1  mrg   if (TARGET_VECTOR_ELEN_64)
    111  1.1  mrg     builtin_define_with_int_value ("__riscv_v_elen", 64);
    112  1.1  mrg   else if (TARGET_VECTOR_ELEN_32)
    113  1.1  mrg     builtin_define_with_int_value ("__riscv_v_elen", 32);
    114  1.1  mrg 
    115  1.1  mrg   if (TARGET_VECTOR_ELEN_FP_64)
    116  1.1  mrg     builtin_define_with_int_value ("__riscv_v_elen_fp", 64);
    117  1.1  mrg   else if (TARGET_VECTOR_ELEN_FP_32)
    118  1.1  mrg     builtin_define_with_int_value ("__riscv_v_elen_fp", 32);
    119  1.1  mrg   else if (TARGET_MIN_VLEN != 0)
    120  1.1  mrg     builtin_define_with_int_value ("__riscv_v_elen_fp", 0);
    121  1.1  mrg 
    122  1.1  mrg   if (TARGET_MIN_VLEN)
    123  1.1  mrg     builtin_define ("__riscv_vector");
    124  1.1  mrg 
    125  1.1  mrg   /* Define architecture extension test macros.  */
    126  1.1  mrg   builtin_define_with_int_value ("__riscv_arch_test", 1);
    127  1.1  mrg 
    128  1.1  mrg   const riscv_subset_list *subset_list = riscv_current_subset_list ();
    129  1.1  mrg   if (!subset_list)
    130  1.1  mrg     return;
    131  1.1  mrg 
    132  1.1  mrg   size_t max_ext_len = 0;
    133  1.1  mrg 
    134  1.1  mrg   /* Figure out the max length of extension name for reserving buffer.   */
    135  1.1  mrg   for (const riscv_subset_t *subset = subset_list->begin ();
    136  1.1  mrg        subset != subset_list->end ();
    137  1.1  mrg        subset = subset->next)
    138  1.1  mrg     max_ext_len = MAX (max_ext_len, subset->name.length ());
    139  1.1  mrg 
    140  1.1  mrg   char *buf = (char *)alloca (max_ext_len + 10 /* For __riscv_ and '\0'.  */);
    141  1.1  mrg 
    142  1.1  mrg   for (const riscv_subset_t *subset = subset_list->begin ();
    143  1.1  mrg        subset != subset_list->end ();
    144  1.1  mrg        subset = subset->next)
    145  1.1  mrg     {
    146  1.1  mrg       int version_value = (subset->major_version * 1000000)
    147  1.1  mrg 			   + (subset->minor_version * 1000);
    148  1.1  mrg       /* Special rule for zicsr and zifencei, it's used for ISA spec 2.2 or
    149  1.1  mrg 	 earlier.  */
    150  1.1  mrg       if ((subset->name == "zicsr" || subset->name == "zifencei")
    151  1.1  mrg 	  && version_value == 0)
    152  1.1  mrg 	version_value = 2000000;
    153  1.1  mrg 
    154  1.1  mrg       sprintf (buf, "__riscv_%s", subset->name.c_str ());
    155  1.1  mrg       builtin_define_with_int_value (buf, version_value);
    156  1.1  mrg     }
    157  1.1  mrg }
    158