Hi Jiajie,


Thanks for you contribution. But we need some time to
define/write/public ilp32d abi doc.

Jiajie Chen via Gcc-patches writes:

> Introduce loongarch32 target and ilp32 abi variants. The ilp32d abi
> variant is selected as the default abi of loongarch32 target.
>
> contrib/ChangeLog:
>
>       * config-list.mk: Add loongarch32-linux-gnu*.
>
> gcc/ChangeLog:
>
>       * config.gcc: Add target triple loongarch32-*-*-* and
>         corresponding abi ilp32f, ilp32d and ilp32s.
>       * config/loongarch/genopts/loongarch-strings: Add strings for
>         loongarch32 and ilp32 abi variants.
>       * config/loongarch/genopts/loongarch.opt.in: Add
>         -march=loongarch32 and -mabi=ilp32d/ilp32f/ilp32s.
>       * config/loongarch/gnu-user.h: Add ilp32 abi variants to spec.
>       * config/loongarch/linux.h: Add ABI_LIBDIR for ilp32 abi
>         variants.
>       * config/loongarch/loongarch-c.cc (loongarch_cpu_cpp_builtins):
>         Add builtin definitions for loongarch32 target.
>       * config/loongarch/loongarch-def.c: Add loongarch32 and ilp32
>         definitions.
>       * config/loongarch/loongarch-def.h: Add loongarch32 and ilp32
>         definitions.
>       * config/loongarch/loongarch-driver.h: Add ilp32 abi variants to
>         spec.
>       * config/loongarch/loongarch-opts.cc: Handle ilp32 abi variants.
>       * config/loongarch/loongarch-opts.h: Add loongarch32 case to
>         macros.
>       * config/loongarch/loongarch-str.h: Add loongarch32 and ilp32
>         strings.
>       * config/loongarch/loongarch.cc: Disable -fpcc-struct-return for
>         ilp32.
>       * config/loongarch/loongarch.opt: Add -march=loongarch32 and
>         -mabi=ilp32d/ilp32f/ilp32s.
>       * config/loongarch/t-linux: Add ilp32 abi variants to multilib.
> ---
>  contrib/config-list.mk                        |  1 +
>  gcc/config.gcc                                | 61 ++++++++++++++++---
>  .../loongarch/genopts/loongarch-strings       |  5 ++
>  gcc/config/loongarch/genopts/loongarch.opt.in | 12 ++++
>  gcc/config/loongarch/gnu-user.h               |  3 +
>  gcc/config/loongarch/linux.h                  |  8 ++-
>  gcc/config/loongarch/loongarch-c.cc           | 12 ++++
>  gcc/config/loongarch/loongarch-def.c          | 33 ++++++++++
>  gcc/config/loongarch/loongarch-def.h          | 25 +++++---
>  gcc/config/loongarch/loongarch-driver.h       |  4 ++
>  gcc/config/loongarch/loongarch-opts.cc        | 22 ++++++-
>  gcc/config/loongarch/loongarch-opts.h         | 20 ++++--
>  gcc/config/loongarch/loongarch-str.h          |  5 ++
>  gcc/config/loongarch/loongarch.cc             |  2 +-
>  gcc/config/loongarch/loongarch.opt            | 12 ++++
>  gcc/config/loongarch/t-linux                  | 16 ++++-
>  16 files changed, 210 insertions(+), 31 deletions(-)
>
> diff --git a/contrib/config-list.mk b/contrib/config-list.mk
> index e570b13c71b..3c00ce5410a 100644
> --- a/contrib/config-list.mk
> +++ b/contrib/config-list.mk
> @@ -57,6 +57,7 @@ LIST = aarch64-elf aarch64-freebsd13 aarch64-linux-gnu 
> aarch64-rtems \
>    i686-cygwinOPT-enable-threads=yes i686-mingw32crt ia64-elf \
>    ia64-linux ia64-hpux ia64-hp-vms iq2000-elf lm32-elf \
>    lm32-rtems lm32-uclinux \
> +  loongarch32-linux-gnuf64 loongarch32-linux-gnuf32 loongarch32-linux-gnusf \
>    loongarch64-linux-gnuf64 loongarch64-linux-gnuf32 loongarch64-linux-gnusf \
>    m32c-elf m32r-elf m32rle-elf \
>    m68k-elf m68k-netbsdelf \
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 415e0e1ebc5..45e69b24b44 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -4901,10 +4901,24 @@ case "${target}" in
>                       arch_pattern     arch_default   \
>                       fpu_pattern      fpu_default    \
>                       tune_pattern     tune_default   \
> -                     triplet_os       triplet_abi
> +                     triplet_os       triplet_abi    \
> +                     triplet_cpu
>  
>               # Infer ABI from the triplet.
>               case ${target} in
> +             loongarch32-*-*-*f64)
> +                     abi_pattern="ilp32d"
> +                     ;;
> +             loongarch32-*-*-*f32)
> +                     abi_pattern="ilp32f"
> +                     ;;
> +             loongarch32-*-*-*sf)
> +                     abi_pattern="ilp32s"
> +                     ;;
> +             loongarch32-*-*-*)
> +                     abi_pattern="ilp32[dfs]"
> +                     abi_default="ilp32d"
> +                     ;;
>               loongarch64-*-*-*f64)
>                       abi_pattern="lp64d"
>                       ;;
> @@ -4939,7 +4953,7 @@ case "${target}" in
>  
>               # Perform initial sanity checks on --with-* options.
>               case ${with_arch} in
> -             "" | loongarch64 | la464) ;; # OK, append here.
> +             "" | loongarch32 | loongarch64 | la464) ;; # OK, append here.
>               native)
>                       if test x${host} != x${target}; then
>                               echo "--with-arch=native is illegal for 
> cross-compiler." 1>&2
> @@ -4958,7 +4972,7 @@ case "${target}" in
>               esac
>  
>               case ${with_abi} in
> -             "" | lp64d | lp64f | lp64s) ;; # OK, append here.
> +             "" | ilp32d | ilp32f | ilp32s | lp64d | lp64f | lp64s) ;; # OK, 
> append here.
>               *)
>                       echo "Unsupported ABI given in --with-abi=$with_abi" 
> 1>&2
>                       exit 1
> @@ -5007,12 +5021,21 @@ case "${target}" in
>                       ;;
>               esac
>  
> +             case ${target} in
> +             loongarch32-*-*-*)
> +                     triplet_cpu="loongarch32"
> +                     ;;
> +             loongarch64-*-*-*)
> +                     triplet_cpu="loongarch64"
> +                     ;;
> +             esac
> +
>               case ${with_abi} in
> -               "lp64d") triplet_abi="";;
> -               "lp64f") triplet_abi="f32";;
> -               "lp64s") triplet_abi="sf";;
> +               "ilp32d" | "lp64d") triplet_abi="";;
> +               "ilp32f" | "lp64f") triplet_abi="f32";;
> +               "ilp32s" | "lp64s") triplet_abi="sf";;
>               esac
> -             la_canonical_triplet="loongarch64-${triplet_os}${triplet_abi}"
> +             
> la_canonical_triplet="${triplet_cpu}-${triplet_os}${triplet_abi}"
>  
>               # Set default value for with_abiext (internal)
>               case ${with_abiext} in
> @@ -5038,6 +5061,12 @@ case "${target}" in
>  
>               # Infer ISA-related default options from the ABI: pass 1
>               case ${with_abi}/${with_abiext} in
> +             ilp32*/base)
> +                     # architectures that support ilp32* ABI
> +                     arch_pattern="native|loongarch32"
> +                     # default architecture for ilp32* ABI
> +                     arch_default="loongarch32"
> +                     ;;
>               lp64*/base)
>                       # architectures that support lp64* ABI
>                       arch_pattern="native|loongarch64|la464"
> @@ -5052,14 +5081,14 @@ case "${target}" in
>  
>               # Infer ISA-related default options from the ABI: pass 2
>               case ${with_abi}/${with_abiext} in
> -             lp64d/base)
> +             ilp32d/base | lp64d/base)
>                       fpu_pattern="64"
>                       ;;
> -             lp64f/base)
> +             ilp32f/base | lp64f/base)
>                       fpu_pattern="32|64"
>                       fpu_default="32"
>                       ;;
> -             lp64s/base)
> +             ilp32s/base | lp64s/base)
>                       fpu_pattern="none|32|64"
>                       fpu_default="none"
>                       ;;
> @@ -5118,6 +5147,10 @@ case "${target}" in
>                       tune_pattern="*"
>                       tune_default="native"
>                       ;;
> +             loongarch32)
> +                     tune_pattern="loongarch32"
> +                     tune_default="loongarch32"
> +                     ;;
>               loongarch64)
>                       tune_pattern="loongarch64|la464"
>                       tune_default="la464"
> @@ -5187,6 +5220,9 @@ case "${target}" in
>                               1)
>                                       # Component 1: Base ABI type
>                                       case ${component} in
> +                                     ilp32d) elem_tmp="ABI_BASE_ILP32D,";;
> +                                     ilp32f) elem_tmp="ABI_BASE_ILP32F,";;
> +                                     ilp32s) elem_tmp="ABI_BASE_ILP32S,";;
>                                       lp64d) elem_tmp="ABI_BASE_LP64D,";;
>                                       lp64f) elem_tmp="ABI_BASE_LP64F,";;
>                                       lp64s) elem_tmp="ABI_BASE_LP64S,";;
> @@ -5741,17 +5777,22 @@ case ${target} in
>               # See macro definitions from loongarch-opts.h and 
> loongarch-cpu.h.
>               case ${with_arch} in
>               native)         tm_defines="${tm_defines} 
> DEFAULT_CPU_ARCH=CPU_NATIVE" ;;
> +             loongarch32)    tm_defines="${tm_defines} 
> DEFAULT_CPU_ARCH=CPU_LOONGARCH32" ;;
>               la464)          tm_defines="${tm_defines} 
> DEFAULT_CPU_ARCH=CPU_LA464" ;;
>               loongarch64)    tm_defines="${tm_defines} 
> DEFAULT_CPU_ARCH=CPU_LOONGARCH64" ;;
>               esac
>  
>               case ${with_tune} in
>               native)         tm_defines="${tm_defines} 
> DEFAULT_CPU_TUNE=CPU_NATIVE" ;;
> +             loongarch32)    tm_defines="${tm_defines} 
> DEFAULT_CPU_TUNE=CPU_LOONGARCH32" ;;
>               la464)          tm_defines="${tm_defines} 
> DEFAULT_CPU_TUNE=CPU_LA464" ;;
>               loongarch64)    tm_defines="${tm_defines} 
> DEFAULT_CPU_TUNE=CPU_LOONGARCH64" ;;
>               esac
>  
>               case ${with_abi} in
> +             ilp32d)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_ILP32D" ;;
> +             ilp32f)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_ILP32F" ;;
> +             ilp32s)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_ILP32S" ;;
>               lp64d)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_LP64D" ;;
>               lp64f)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_LP64F" ;;
>               lp64s)     tm_defines="${tm_defines} 
> DEFAULT_ABI_BASE=ABI_BASE_LP64S" ;;
> diff --git a/gcc/config/loongarch/genopts/loongarch-strings 
> b/gcc/config/loongarch/genopts/loongarch-strings
> index a40998ead97..1e20b70dde2 100644
> --- a/gcc/config/loongarch/genopts/loongarch-strings
> +++ b/gcc/config/loongarch/genopts/loongarch-strings
> @@ -23,10 +23,12 @@ OPTSTR_ARCH             arch
>  OPTSTR_TUNE        tune
>  
>  STR_CPU_NATIVE             native
> +STR_CPU_LOONGARCH32   loongarch32
>  STR_CPU_LOONGARCH64   loongarch64
>  STR_CPU_LA464              la464
>  
>  # Base architecture
> +STR_ISA_BASE_LA32V100 la32
>  STR_ISA_BASE_LA64V100 la64
>  
>  # -mfpu
> @@ -42,6 +44,9 @@ OPTSTR_DOUBLE_FLOAT   double-float
>  
>  # -mabi=
>  OPTSTR_ABI_BASE            abi
> +STR_ABI_BASE_ILP32D   ilp32d
> +STR_ABI_BASE_ILP32F   ilp32f
> +STR_ABI_BASE_ILP32S   ilp32s
>  STR_ABI_BASE_LP64D    lp64d
>  STR_ABI_BASE_LP64F    lp64f
>  STR_ABI_BASE_LP64S    lp64s
> diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in 
> b/gcc/config/loongarch/genopts/loongarch.opt.in
> index 4b9b4ac273e..47f77345890 100644
> --- a/gcc/config/loongarch/genopts/loongarch.opt.in
> +++ b/gcc/config/loongarch/genopts/loongarch.opt.in
> @@ -85,6 +85,9 @@ LoongArch CPU types:
>  EnumValue
>  Enum(cpu_type) String(@@STR_CPU_NATIVE@@) Value(CPU_NATIVE)
>  
> +EnumValue
> +Enum(cpu_type) String(@@STR_CPU_LOONGARCH32@@) Value(CPU_LOONGARCH32)
> +
>  EnumValue
>  Enum(cpu_type) String(@@STR_CPU_LOONGARCH64@@) Value(CPU_LOONGARCH64)
>  
> @@ -108,6 +111,15 @@ Enum
>  Name(abi_base) Type(int)
>  Base ABI types for LoongArch:
>  
> +EnumValue
> +Enum(abi_base) String(@@STR_ABI_BASE_ILP32D@@) Value(ABI_BASE_ILP32D)
> +
> +EnumValue
> +Enum(abi_base) String(@@STR_ABI_BASE_ILP32F@@) Value(ABI_BASE_ILP32F)
> +
> +EnumValue
> +Enum(abi_base) String(@@STR_ABI_BASE_ILP32S@@) Value(ABI_BASE_ILP32S)
> +
>  EnumValue
>  Enum(abi_base) String(@@STR_ABI_BASE_LP64D@@) Value(ABI_BASE_LP64D)
>  
> diff --git a/gcc/config/loongarch/gnu-user.h b/gcc/config/loongarch/gnu-user.h
> index fa1a5211419..bf6d3a4fe98 100644
> --- a/gcc/config/loongarch/gnu-user.h
> +++ b/gcc/config/loongarch/gnu-user.h
> @@ -34,6 +34,9 @@ along with GCC; see the file COPYING3.  If not see
>    "/lib" ABI_GRLEN_SPEC "/ld-linux-loongarch-" ABI_SPEC ".so.1"
>  
>  #define MUSL_ABI_SPEC \
> +  "%{mabi=ilp32d:-ilp32d}" \
> +  "%{mabi=ilp32f:-ilp32f}" \
> +  "%{mabi=ilp32s:-ilp32s}" \
>    "%{mabi=lp64d:-lp64d}" \
>    "%{mabi=lp64f:-lp64f}" \
>    "%{mabi=lp64s:-lp64s}"
> diff --git a/gcc/config/loongarch/linux.h b/gcc/config/loongarch/linux.h
> index 9059d244190..45aa3531cd3 100644
> --- a/gcc/config/loongarch/linux.h
> +++ b/gcc/config/loongarch/linux.h
> @@ -23,7 +23,13 @@ along with GCC; see the file COPYING3.  If not see
>  
>  #if defined(LA_DISABLE_MULTILIB) && defined(LA_DISABLE_MULTIARCH)
>  
> -  #if DEFAULT_ABI_BASE == ABI_BASE_LP64D
> +  #if DEFAULT_ABI_BASE == ABI_BASE_ILP32D
> +    #define ABI_LIBDIR "lib32"
> +  #elif DEFAULT_ABI_BASE == ABI_BASE_ILP32F
> +    #define ABI_LIBDIR "lib32/f32"
> +  #elif DEFAULT_ABI_BASE == ABI_BASE_ILP32S
> +    #define ABI_LIBDIR "lib32/sf"
> +  #elif DEFAULT_ABI_BASE == ABI_BASE_LP64D
>      #define ABI_LIBDIR "lib64"
>    #elif DEFAULT_ABI_BASE == ABI_BASE_LP64F
>      #define ABI_LIBDIR "lib64/f32"
> diff --git a/gcc/config/loongarch/loongarch-c.cc 
> b/gcc/config/loongarch/loongarch-c.cc
> index 67911b78f28..e3783a325d7 100644
> --- a/gcc/config/loongarch/loongarch-c.cc
> +++ b/gcc/config/loongarch/loongarch-c.cc
> @@ -65,12 +65,24 @@ loongarch_cpu_cpp_builtins (cpp_reader *pfile)
>    LARCH_CPP_SET_PROCESSOR ("_LOONGARCH_TUNE", LARCH_ACTUAL_TUNE);
>  
>    /* Base architecture / ABI.  */
> +  if (TARGET_32BIT)
> +    {
> +      builtin_define ("__loongarch_grlen=32");
> +      builtin_define ("__loongarch32");
> +    }
>    if (TARGET_64BIT)
>      {
>        builtin_define ("__loongarch_grlen=64");
>        builtin_define ("__loongarch64");
>      }
>  
> +  if (TARGET_ABI_ILP32)
> +    {
> +      builtin_define ("_ABILP32=3");
> +      builtin_define ("_LOONGARCH_SIM=_ABILP32");
> +      builtin_define ("__loongarch_ilp32");
> +    }
> +
>    if (TARGET_ABI_LP64)
>      {
>        builtin_define ("_ABILP64=3");
> diff --git a/gcc/config/loongarch/loongarch-def.c 
> b/gcc/config/loongarch/loongarch-def.c
> index 6729c857f7c..5ae8bd24c9f 100644
> --- a/gcc/config/loongarch/loongarch-def.c
> +++ b/gcc/config/loongarch/loongarch-def.c
> @@ -40,12 +40,17 @@ along with GCC; see the file COPYING3.  If not see
>  const char*
>  loongarch_cpu_strings[N_TUNE_TYPES] = {
>    [CPU_NATIVE]                 = STR_CPU_NATIVE,
> +  [CPU_LOONGARCH32]    = STR_CPU_LOONGARCH32,
>    [CPU_LOONGARCH64]    = STR_CPU_LOONGARCH64,
>    [CPU_LA464]                  = STR_CPU_LA464,
>  };
>  
>  struct loongarch_isa
>  loongarch_cpu_default_isa[N_ARCH_TYPES] = {
> +  [CPU_LOONGARCH32] = {
> +      .base = ISA_BASE_LA32V100,
> +      .fpu = ISA_EXT_FPU32,
> +  },
>    [CPU_LOONGARCH64] = {
>        .base = ISA_BASE_LA64V100,
>        .fpu = ISA_EXT_FPU64,
> @@ -58,6 +63,12 @@ loongarch_cpu_default_isa[N_ARCH_TYPES] = {
>  
>  struct loongarch_cache
>  loongarch_cpu_cache[N_TUNE_TYPES] = {
> +  [CPU_LOONGARCH32] = {
> +      .l1d_line_size = 64,
> +      .l1d_size = 64,
> +      .l2d_size = 256,
> +      .simultaneous_prefetches = 4,
> +  },
>    [CPU_LOONGARCH64] = {
>        .l1d_line_size = 64,
>        .l1d_size = 64,
> @@ -74,6 +85,10 @@ loongarch_cpu_cache[N_TUNE_TYPES] = {
>  
>  struct loongarch_align
>  loongarch_cpu_align[N_TUNE_TYPES] = {
> +  [CPU_LOONGARCH32] = {
> +    .function = "32",
> +    .label = "16",
> +  },
>    [CPU_LOONGARCH64] = {
>      .function = "32",
>      .label = "16",
> @@ -94,6 +109,9 @@ loongarch_cpu_rtx_cost_data[N_TUNE_TYPES] = {
>    [CPU_NATIVE] = {
>        DEFAULT_COSTS
>    },
> +  [CPU_LOONGARCH32] = {
> +      DEFAULT_COSTS
> +  },
>    [CPU_LOONGARCH64] = {
>        DEFAULT_COSTS
>    },
> @@ -121,6 +139,7 @@ loongarch_rtx_cost_optimize_size = {
>  int
>  loongarch_cpu_issue_rate[N_TUNE_TYPES] = {
>    [CPU_NATIVE]             = 4,
> +  [CPU_LOONGARCH32]   = 4,
>    [CPU_LOONGARCH64]   = 4,
>    [CPU_LA464]              = 4,
>  };
> @@ -128,6 +147,7 @@ loongarch_cpu_issue_rate[N_TUNE_TYPES] = {
>  int
>  loongarch_cpu_multipass_dfa_lookahead[N_TUNE_TYPES] = {
>    [CPU_NATIVE]             = 4,
> +  [CPU_LOONGARCH32]   = 4,
>    [CPU_LOONGARCH64]   = 4,
>    [CPU_LA464]              = 4,
>  };
> @@ -139,6 +159,7 @@ loongarch_cpu_multipass_dfa_lookahead[N_TUNE_TYPES] = {
>  
>  const char*
>  loongarch_isa_base_strings[N_ISA_BASE_TYPES] = {
> +  [ISA_BASE_LA32V100] = STR_ISA_BASE_LA32V100,
>    [ISA_BASE_LA64V100] = STR_ISA_BASE_LA64V100,
>  };
>  
> @@ -151,6 +172,9 @@ loongarch_isa_ext_strings[N_ISA_EXT_TYPES] = {
>  
>  const char*
>  loongarch_abi_base_strings[N_ABI_BASE_TYPES] = {
> +  [ABI_BASE_ILP32D] = STR_ABI_BASE_ILP32D,
> +  [ABI_BASE_ILP32F] = STR_ABI_BASE_ILP32F,
> +  [ABI_BASE_ILP32S] = STR_ABI_BASE_ILP32S,
>    [ABI_BASE_LP64D] = STR_ABI_BASE_LP64D,
>    [ABI_BASE_LP64F] = STR_ABI_BASE_LP64F,
>    [ABI_BASE_LP64S] = STR_ABI_BASE_LP64S,
> @@ -182,6 +206,15 @@ loongarch_switch_strings[] = {
>  /* ABI-related definitions.  */
>  const struct loongarch_isa
>  abi_minimal_isa[N_ABI_BASE_TYPES][N_ABI_EXT_TYPES] = {
> +  [ABI_BASE_ILP32D] = {
> +      [ABI_EXT_BASE] = {.base = ISA_BASE_LA32V100, .fpu = ISA_EXT_FPU64},
> +  },
> +  [ABI_BASE_ILP32F] = {
> +      [ABI_EXT_BASE] = {.base = ISA_BASE_LA32V100, .fpu = ISA_EXT_FPU32},
> +  },
> +  [ABI_BASE_ILP32S] = {
> +      [ABI_EXT_BASE] = {.base = ISA_BASE_LA32V100, .fpu = ISA_EXT_NOFPU},
> +  },
>    [ABI_BASE_LP64D] = {
>        [ABI_EXT_BASE] = {.base = ISA_BASE_LA64V100, .fpu = ISA_EXT_FPU64},
>    },
> diff --git a/gcc/config/loongarch/loongarch-def.h 
> b/gcc/config/loongarch/loongarch-def.h
> index fb8bb88eb52..6c4b9fa3385 100644
> --- a/gcc/config/loongarch/loongarch-def.h
> +++ b/gcc/config/loongarch/loongarch-def.h
> @@ -54,8 +54,9 @@ extern "C" {
>  
>  /* enum isa_base */
>  extern const char* loongarch_isa_base_strings[];
> -#define ISA_BASE_LA64V100     0
> -#define N_ISA_BASE_TYPES      1
> +#define ISA_BASE_LA32V100     0
> +#define ISA_BASE_LA64V100     1
> +#define N_ISA_BASE_TYPES      2
>  
>  /* enum isa_ext_* */
>  extern const char* loongarch_isa_ext_strings[];
> @@ -67,10 +68,13 @@ extern const char* loongarch_isa_ext_strings[];
>  
>  /* enum abi_base */
>  extern const char* loongarch_abi_base_strings[];
> -#define ABI_BASE_LP64D             0
> -#define ABI_BASE_LP64F             1
> -#define ABI_BASE_LP64S             2
> -#define N_ABI_BASE_TYPES      3
> +#define ABI_BASE_ILP32D            0
> +#define ABI_BASE_ILP32F            1
> +#define ABI_BASE_ILP32S            2
> +#define ABI_BASE_LP64D             3
> +#define ABI_BASE_LP64F             4
> +#define ABI_BASE_LP64S             5
> +#define N_ABI_BASE_TYPES      6
>  
>  /* enum abi_ext */
>  extern const char* loongarch_abi_ext_strings[];
> @@ -132,10 +136,11 @@ struct loongarch_target
>  /* CPU properties.  */
>  /* index */
>  #define CPU_NATIVE     0
> -#define CPU_LOONGARCH64        1
> -#define CPU_LA464      2
> -#define N_ARCH_TYPES   3
> -#define N_TUNE_TYPES   3
> +#define CPU_LOONGARCH32        1
> +#define CPU_LOONGARCH64        2
> +#define CPU_LA464      3
> +#define N_ARCH_TYPES   4
> +#define N_TUNE_TYPES   4
>  
>  /* parallel tables.  */
>  extern const char* loongarch_cpu_strings[];
> diff --git a/gcc/config/loongarch/loongarch-driver.h 
> b/gcc/config/loongarch/loongarch-driver.h
> index ba8817a4621..0a22acab803 100644
> --- a/gcc/config/loongarch/loongarch-driver.h
> +++ b/gcc/config/loongarch/loongarch-driver.h
> @@ -58,9 +58,13 @@ driver_get_normalized_m_opts (int argc, const char **argv);
>  
>  /* ABI spec strings.  */
>  #define ABI_GRLEN_SPEC \
> +  "%{mabi=ilp32*:32}"   \
>    "%{mabi=lp64*:64}"   \
>  
>  #define ABI_SPEC \
> +  "%{mabi=ilp32d:ilp32d}" \
> +  "%{mabi=ilp32f:ilp32f}" \
> +  "%{mabi=ilp32s:ilp32s}" \
>    "%{mabi=lp64d:lp64d}" \
>    "%{mabi=lp64f:lp64f}" \
>    "%{mabi=lp64s:lp64s}" \
> diff --git a/gcc/config/loongarch/loongarch-opts.cc 
> b/gcc/config/loongarch/loongarch-opts.cc
> index a52e25236ea..9fc0bbbcb6e 100644
> --- a/gcc/config/loongarch/loongarch-opts.cc
> +++ b/gcc/config/loongarch/loongarch-opts.cc
> @@ -36,6 +36,9 @@ struct loongarch_target la_target;
>  #define ABI_COUNT (sizeof(abi_priority_list)/sizeof(struct loongarch_abi))
>  static const struct loongarch_abi
>  abi_priority_list[] = {
> +    {ABI_BASE_ILP32D, ABI_EXT_BASE},
> +    {ABI_BASE_ILP32F, ABI_EXT_BASE},
> +    {ABI_BASE_ILP32S, ABI_EXT_BASE},
>      {ABI_BASE_LP64D, ABI_EXT_BASE},
>      {ABI_BASE_LP64F, ABI_EXT_BASE},
>      {ABI_BASE_LP64S, ABI_EXT_BASE},
> @@ -410,17 +413,23 @@ isa_default_abi (const struct loongarch_isa *isa)
>    switch (isa->fpu)
>      {
>        case ISA_EXT_FPU64:
> -     if (isa->base == ISA_BASE_LA64V100)
> +     if (isa->base == ISA_BASE_LA32V100)
> +       abi.base = ABI_BASE_ILP32D;
> +     else if (isa->base == ISA_BASE_LA64V100)
>         abi.base = ABI_BASE_LP64D;
>       break;
>  
>        case ISA_EXT_FPU32:
> -     if (isa->base == ISA_BASE_LA64V100)
> +     if (isa->base == ISA_BASE_LA32V100)
> +       abi.base = ABI_BASE_ILP32F;
> +     else if (isa->base == ISA_BASE_LA64V100)
>         abi.base = ABI_BASE_LP64F;
>       break;
>  
>        case ISA_EXT_NOFPU:
> -     if (isa->base == ISA_BASE_LA64V100)
> +     if (isa->base == ISA_BASE_LA32V100)
> +       abi.base = ABI_BASE_ILP32S;
> +     else if (isa->base == ISA_BASE_LA64V100)
>         abi.base = ABI_BASE_LP64S;
>       break;
>  
> @@ -439,6 +448,8 @@ isa_base_compat_p (const struct loongarch_isa *set1,
>  {
>    switch (set2->base)
>      {
> +      case ISA_BASE_LA32V100:
> +     return (set1->base == ISA_BASE_LA32V100);
>        case ISA_BASE_LA64V100:
>       return (set1->base == ISA_BASE_LA64V100);
>  
> @@ -487,6 +498,11 @@ abi_default_cpu_arch (struct loongarch_abi abi)
>  {
>    switch (abi.base)
>      {
> +      case ABI_BASE_ILP32D:
> +      case ABI_BASE_ILP32F:
> +      case ABI_BASE_ILP32S:
> +     if (abi.ext == ABI_EXT_BASE)
> +       return CPU_LOONGARCH32;
>        case ABI_BASE_LP64D:
>        case ABI_BASE_LP64F:
>        case ABI_BASE_LP64S:
> diff --git a/gcc/config/loongarch/loongarch-opts.h 
> b/gcc/config/loongarch/loongarch-opts.h
> index b1ff54426e4..c8794dff0ad 100644
> --- a/gcc/config/loongarch/loongarch-opts.h
> +++ b/gcc/config/loongarch/loongarch-opts.h
> @@ -51,15 +51,25 @@ loongarch_config_target (struct loongarch_target *target,
>  #define TARGET_CMODEL_EXTREME            (la_target.cmodel == CMODEL_EXTREME)
>  
>  #define TARGET_HARD_FLOAT        (la_target.isa.fpu != ISA_EXT_NOFPU)
> -#define TARGET_HARD_FLOAT_ABI            (la_target.abi.base == 
> ABI_BASE_LP64D \
> +#define TARGET_HARD_FLOAT_ABI            (la_target.abi.base == 
> ABI_BASE_ILP32D \
> +                                  || la_target.abi.base == ABI_BASE_ILP32F \
> +                                  || la_target.abi.base == ABI_BASE_LP64D \
>                                    || la_target.abi.base == ABI_BASE_LP64F)
>  
>  #define TARGET_SOFT_FLOAT      (la_target.isa.fpu == ISA_EXT_NOFPU)
> -#define TARGET_SOFT_FLOAT_ABI          (la_target.abi.base == ABI_BASE_LP64S)
> +#define TARGET_SOFT_FLOAT_ABI          (la_target.abi.base == 
> ABI_BASE_ILP32S \
> +                                  || la_target.abi.base == ABI_BASE_LP64S)
>  #define TARGET_SINGLE_FLOAT    (la_target.isa.fpu == ISA_EXT_FPU32)
> -#define TARGET_SINGLE_FLOAT_ABI        (la_target.abi.base == ABI_BASE_LP64F)
> +#define TARGET_SINGLE_FLOAT_ABI        (la_target.abi.base == 
> ABI_BASE_ILP32F \
> +                                  || la_target.abi.base == ABI_BASE_LP64F)
>  #define TARGET_DOUBLE_FLOAT    (la_target.isa.fpu == ISA_EXT_FPU64)
> -#define TARGET_DOUBLE_FLOAT_ABI        (la_target.abi.base == ABI_BASE_LP64D)
> +#define TARGET_DOUBLE_FLOAT_ABI        (la_target.abi.base == 
> ABI_BASE_ILP32D \
> +                                  || la_target.abi.base == ABI_BASE_LP64D)
> +
> +#define TARGET_32BIT           (la_target.isa.base == ISA_BASE_LA32V100)
> +#define TARGET_ABI_ILP32       (la_target.abi.base == ABI_BASE_ILP32D \
> +                                || la_target.abi.base == ABI_BASE_ILP32F \
> +                                || la_target.abi.base == ABI_BASE_ILP32S)
>  
>  #define TARGET_64BIT           (la_target.isa.base == ISA_BASE_LA64V100)
>  #define TARGET_ABI_LP64                (la_target.abi.base == ABI_BASE_LP64D 
> \
> @@ -78,9 +88,11 @@ loongarch_config_target (struct loongarch_target *target,
>                                   ? (la_target.cpu_native) : (CPU_NATIVE)) \
>                                   : (la_target.cpu_tune))
>  
> +#define TARGET_ARCH_LOONGARCH32        (LARCH_ACTUAL_ARCH == CPU_LOONGARCH32)
>  #define TARGET_ARCH_LOONGARCH64        (LARCH_ACTUAL_ARCH == CPU_LOONGARCH64)
>  #define TARGET_ARCH_LA464      (LARCH_ACTUAL_ARCH == CPU_LA464)
>  
> +#define TARGET_TUNE_LOONGARCH32        (LARCH_ACTUAL_TUNE == CPU_LOONGARCH32)
>  #define TARGET_TUNE_LOONGARCH64        (LARCH_ACTUAL_TUNE == CPU_LOONGARCH64)
>  #define TARGET_TUNE_LA464      (LARCH_ACTUAL_TUNE == CPU_LA464)
>  
> diff --git a/gcc/config/loongarch/loongarch-str.h 
> b/gcc/config/loongarch/loongarch-str.h
> index af2e82a321f..60588da45e2 100644
> --- a/gcc/config/loongarch/loongarch-str.h
> +++ b/gcc/config/loongarch/loongarch-str.h
> @@ -27,9 +27,11 @@ along with GCC; see the file COPYING3.  If not see
>  #define OPTSTR_TUNE "tune"
>  
>  #define STR_CPU_NATIVE "native"
> +#define STR_CPU_LOONGARCH32 "loongarch32"
>  #define STR_CPU_LOONGARCH64 "loongarch64"
>  #define STR_CPU_LA464 "la464"
>  
> +#define STR_ISA_BASE_LA32V100 "la32"
>  #define STR_ISA_BASE_LA64V100 "la64"
>  
>  #define OPTSTR_ISA_EXT_FPU "fpu"
> @@ -43,6 +45,9 @@ along with GCC; see the file COPYING3.  If not see
>  #define OPTSTR_DOUBLE_FLOAT "double-float"
>  
>  #define OPTSTR_ABI_BASE "abi"
> +#define STR_ABI_BASE_ILP32D "ilp32d"
> +#define STR_ABI_BASE_ILP32F "ilp32f"
> +#define STR_ABI_BASE_ILP32S "ilp32s"
>  #define STR_ABI_BASE_LP64D "lp64d"
>  #define STR_ABI_BASE_LP64F "lp64f"
>  #define STR_ABI_BASE_LP64S "lp64s"
> diff --git a/gcc/config/loongarch/loongarch.cc 
> b/gcc/config/loongarch/loongarch.cc
> index 5b8b93eb24b..ff7904d49d5 100644
> --- a/gcc/config/loongarch/loongarch.cc
> +++ b/gcc/config/loongarch/loongarch.cc
> @@ -6208,7 +6208,7 @@ loongarch_option_override_internal (struct gcc_options 
> *opts)
>                          la_opt_cpu_arch, la_opt_cpu_tune, la_opt_fpu,
>                          la_opt_abi_base, la_opt_abi_ext, la_opt_cmodel, 0);
>  
> -  if (TARGET_ABI_LP64)
> +  if (TARGET_ABI_LP64 || TARGET_ABI_ILP32)
>      flag_pcc_struct_return = 0;
>  
>    /* Decide which rtx_costs structure to use.  */
> diff --git a/gcc/config/loongarch/loongarch.opt 
> b/gcc/config/loongarch/loongarch.opt
> index 68018ade73f..2cd36c5e8fa 100644
> --- a/gcc/config/loongarch/loongarch.opt
> +++ b/gcc/config/loongarch/loongarch.opt
> @@ -92,6 +92,9 @@ LoongArch CPU types:
>  EnumValue
>  Enum(cpu_type) String(native) Value(CPU_NATIVE)
>  
> +EnumValue
> +Enum(cpu_type) String(loongarch32) Value(CPU_LOONGARCH32)
> +
>  EnumValue
>  Enum(cpu_type) String(loongarch64) Value(CPU_LOONGARCH64)
>  
> @@ -115,6 +118,15 @@ Enum
>  Name(abi_base) Type(int)
>  Base ABI types for LoongArch:
>  
> +EnumValue
> +Enum(abi_base) String(ilp32d) Value(ABI_BASE_ILP32D)
> +
> +EnumValue
> +Enum(abi_base) String(ilp32f) Value(ABI_BASE_ILP32F)
> +
> +EnumValue
> +Enum(abi_base) String(ilp32s) Value(ABI_BASE_ILP32S)
> +
>  EnumValue
>  Enum(abi_base) String(lp64d) Value(ABI_BASE_LP64D)
>  
> diff --git a/gcc/config/loongarch/t-linux b/gcc/config/loongarch/t-linux
> index e40da179203..1718c3e11a2 100644
> --- a/gcc/config/loongarch/t-linux
> +++ b/gcc/config/loongarch/t-linux
> @@ -17,8 +17,8 @@
>  # <http://www.gnu.org/licenses/>.
>  
>  # Multilib
> -MULTILIB_OPTIONS = mabi=lp64d/mabi=lp64f/mabi=lp64s
> -MULTILIB_DIRNAMES = base/lp64d base/lp64f base/lp64s
> +MULTILIB_OPTIONS = 
> mabi=ilp32d/mabi=ilp32f/mabi=ilp32s/mabi=lp64d/mabi=lp64f/mabi=lp64s
> +MULTILIB_DIRNAMES = base/ilp32d base/ilp32f base/ilp32s base/lp64d 
> base/lp64f base/lp64s
>  
>  # The GCC driver always gets all abi-related options on the command line.
>  # (see loongarch-driver.c:driver_get_normalized_m_opts)
> @@ -38,6 +38,18 @@ endif
>  # Don't define MULTILIB_OSDIRNAMES if multilib is disabled.
>  ifeq ($(filter LA_DISABLE_MULTILIB,$(tm_defines)),)
>  
> +    MULTILIB_OSDIRNAMES = \
> +      mabi.ilp32d=../lib32$\
> +      $(call if_multiarch,:loongarch32-linux-gnu)
> +
> +    MULTILIB_OSDIRNAMES += \
> +      mabi.ilp32f=../lib32/f32$\
> +      $(call if_multiarch,:loongarch32-linux-gnuf32)
> +
> +    MULTILIB_OSDIRNAMES += \
> +      mabi.ilp32s=../lib32/sf$\
> +      $(call if_multiarch,:loongarch32-linux-gnusf)
> +
>      MULTILIB_OSDIRNAMES = \
>        mabi.lp64d=../lib64$\
>        $(call if_multiarch,:loongarch64-linux-gnu)

Reply via email to