]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Add LA664 support.
authorLulu Cheng <chenglulu@loongson.cn>
Thu, 16 Nov 2023 12:43:53 +0000 (20:43 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Sat, 18 Nov 2023 08:14:40 +0000 (16:14 +0800)
Define ISA_BASE_LA64V110, which represents the base instruction set defined in LoongArch1.1.
Support the configure setting --with-arch =la664, and support -march=la664,-mtune=la664.

gcc/ChangeLog:

* config.gcc: Support LA664.
* config/loongarch/genopts/loongarch-strings: Likewise.
* config/loongarch/genopts/loongarch.opt.in: Likewise.
* config/loongarch/loongarch-cpu.cc (fill_native_cpu_config): Likewise.
* config/loongarch/loongarch-def.c: Likewise.
* config/loongarch/loongarch-def.h (N_ISA_BASE_TYPES): Likewise.
(ISA_BASE_LA64V110): Define macro.
(N_ARCH_TYPES): Update value.
(N_TUNE_TYPES): Update value.
(CPU_LA664): New macro.
* config/loongarch/loongarch-opts.cc (isa_default_abi): Likewise.
(isa_base_compat_p): Likewise.
* config/loongarch/loongarch-opts.h (TARGET_64BIT): This parameter is enabled
when la_target.isa.base is equal to ISA_BASE_LA64V100 or ISA_BASE_LA64V110.
(TARGET_uARCH_LA664): Define macro.
* config/loongarch/loongarch-str.h (STR_CPU_LA664): Likewise.
* config/loongarch/loongarch.cc (loongarch_cpu_sched_reassociation_width):
Add LA664 support.
* config/loongarch/loongarch.opt: Regenerate.

gcc/config.gcc
gcc/config/loongarch/genopts/loongarch-strings
gcc/config/loongarch/genopts/loongarch.opt.in
gcc/config/loongarch/loongarch-cpu.cc
gcc/config/loongarch/loongarch-def.c
gcc/config/loongarch/loongarch-def.h
gcc/config/loongarch/loongarch-opts.cc
gcc/config/loongarch/loongarch-opts.h
gcc/config/loongarch/loongarch-str.h
gcc/config/loongarch/loongarch.cc
gcc/config/loongarch/loongarch.opt

index 6d51bd93f3ffb79e2d7b3759068c42d90818ca44..b88591b6fd86afa84111062b07bf1174df6a0428 100644 (file)
@@ -5039,7 +5039,7 @@ case "${target}" in
 
                # Perform initial sanity checks on --with-* options.
                case ${with_arch} in
-               "" | abi-default | loongarch64 | la464) ;; # OK, append here.
+               "" | abi-default | loongarch64 | la[46]64) ;; # OK, append here.
                native)
                        if test x${host} != x${target}; then
                                echo "--with-arch=native is illegal for cross-compiler." 1>&2
@@ -5088,7 +5088,7 @@ case "${target}" in
                case ${abi_base}/${abi_ext} in
                lp64*/base)
                        # architectures that support lp64* ABI
-                       arch_pattern="native|abi-default|loongarch64|la464"
+                       arch_pattern="native|abi-default|loongarch64|la[46]64"
                        # default architecture for lp64* ABI
                        arch_default="abi-default"
                        ;;
@@ -5163,7 +5163,7 @@ case "${target}" in
                # Check default with_tune configuration using with_arch.
                case ${with_arch} in
                loongarch64)
-                       tune_pattern="native|abi-default|loongarch64|la464"
+                       tune_pattern="native|abi-default|loongarch64|la[46]64"
                        ;;
                *)
                        # By default, $with_tune == $with_arch
@@ -5219,7 +5219,7 @@ case "${target}" in
                                        # Fixed: use the default gcc configuration for all multilib
                                        # builds by default.
                                        with_multilib_default="" ;;
-                               arch,native|arch,loongarch64|arch,la464) # OK, append here.
+                               arch,native|arch,loongarch64|arch,la[46]64) # OK, append here.
                                        with_multilib_default="/march=${component}" ;;
                                arch,*)
                                        with_multilib_default="/march=abi-default"
@@ -5307,7 +5307,7 @@ case "${target}" in
                                if test x${parse_state} = x"arch"; then
                                        # -march option
                                        case ${component} in
-                                       native | abi-default | loongarch64 | la464) # OK, append here.
+                                       native | abi-default | loongarch64 | la[46]64) # OK, append here.
                                                # Append -march spec for each multilib variant.
                                                loongarch_multilib_list_make="${loongarch_multilib_list_make}/march=${component}"
                                                parse_state="opts"
index 8e412f7536ea4f59591ab69880ea9a5be538fbb5..7bc4824007e23b9b2a8bec0a26f290f689ff9ddf 100644 (file)
@@ -26,6 +26,7 @@ STR_CPU_NATIVE              native
 STR_CPU_ABI_DEFAULT   abi-default
 STR_CPU_LOONGARCH64   loongarch64
 STR_CPU_LA464        la464
+STR_CPU_LA664        la664
 
 # Base architecture
 STR_ISA_BASE_LA64V100 la64
index 158701d327a7d09e5373e5985153be9a08b5263f..00b4733d75bb91e2407c044006070bc3f9686118 100644 (file)
@@ -107,6 +107,9 @@ Enum(cpu_type) String(@@STR_CPU_LOONGARCH64@@) Value(CPU_LOONGARCH64)
 EnumValue
 Enum(cpu_type) String(@@STR_CPU_LA464@@) Value(CPU_LA464)
 
+EnumValue
+Enum(cpu_type) String(@@STR_CPU_LA664@@) Value(CPU_LA664)
+
 m@@OPTSTR_ARCH@@=
 Target RejectNegative Joined Enum(cpu_type) Var(la_opt_cpu_arch) Init(M_OPT_UNSET)
 -m@@OPTSTR_ARCH@@=PROCESSOR    Generate code for the given PROCESSOR ISA.
index 7a2866f60f98c5f78825b036c8ad23312db4bef5..f3a134141439c61c833b0b71492d2f91e3cd4f39 100644 (file)
@@ -106,6 +106,10 @@ fill_native_cpu_config (struct loongarch_target *tgt)
       native_cpu_type = CPU_LA464;
       break;
 
+    case 0x0014d000:   /* LA664 */
+      native_cpu_type = CPU_LA664;
+      break;
+
     default:
       /* Unknown PRID.  */
       if (tune_native_p)
index 430ef8b2d9571af30ee159383ce065a34eb17916..067629141b6c6a374935e6817e49e99e9c83793f 100644 (file)
@@ -28,6 +28,7 @@ loongarch_cpu_strings[N_TUNE_TYPES] = {
   [CPU_ABI_DEFAULT]      = STR_CPU_ABI_DEFAULT,
   [CPU_LOONGARCH64]      = STR_CPU_LOONGARCH64,
   [CPU_LA464]            = STR_CPU_LA464,
+  [CPU_LA664]            = STR_CPU_LA664,
 };
 
 struct loongarch_isa
@@ -42,6 +43,11 @@ loongarch_cpu_default_isa[N_ARCH_TYPES] = {
       .fpu = ISA_EXT_FPU64,
       .simd = ISA_EXT_SIMD_LASX,
   },
+  [CPU_LA664] = {
+      .base = ISA_BASE_LA64V110,
+      .fpu = ISA_EXT_FPU64,
+      .simd = ISA_EXT_SIMD_LASX,
+  },
 };
 
 struct loongarch_cache
@@ -58,6 +64,12 @@ loongarch_cpu_cache[N_TUNE_TYPES] = {
       .l2d_size = 256,
       .simultaneous_prefetches = 4,
   },
+  [CPU_LA664] = {
+      .l1d_line_size = 64,
+      .l1d_size = 64,
+      .l2d_size = 256,
+      .simultaneous_prefetches = 4,
+  },
 };
 
 struct loongarch_align
@@ -70,6 +82,10 @@ loongarch_cpu_align[N_TUNE_TYPES] = {
     .function = "32",
     .label = "16",
   },
+  [CPU_LA664] = {
+    .function = "32",
+    .label = "16",
+  },
 };
 
 
@@ -104,6 +120,9 @@ loongarch_cpu_rtx_cost_data[N_TUNE_TYPES] = {
   [CPU_LA464] = {
       DEFAULT_COSTS
   },
+  [CPU_LA664] = {
+      DEFAULT_COSTS
+  },
 };
 
 /* RTX costs to use when optimizing for size.  */
@@ -127,6 +146,7 @@ loongarch_cpu_issue_rate[N_TUNE_TYPES] = {
   [CPU_NATIVE]       = 4,
   [CPU_LOONGARCH64]   = 4,
   [CPU_LA464]        = 4,
+  [CPU_LA664]        = 6,
 };
 
 int
@@ -134,6 +154,7 @@ loongarch_cpu_multipass_dfa_lookahead[N_TUNE_TYPES] = {
   [CPU_NATIVE]       = 4,
   [CPU_LOONGARCH64]   = 4,
   [CPU_LA464]        = 4,
+  [CPU_LA664]        = 6,
 };
 
 /* Wiring string definitions from loongarch-str.h to global arrays
index 6e2a6987910d198182cc9632fb437801eedd097b..db497f3ffe274d3662cddf31c51708ce432354e8 100644 (file)
@@ -55,7 +55,8 @@ 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_LA64V110     1
+#define N_ISA_BASE_TYPES      2
 
 /* enum isa_ext_* */
 extern const char* loongarch_isa_ext_strings[];
@@ -141,8 +142,9 @@ struct loongarch_target
 #define CPU_ABI_DEFAULT   1
 #define CPU_LOONGARCH64          2
 #define CPU_LA464        3
-#define N_ARCH_TYPES     4
-#define N_TUNE_TYPES     4
+#define CPU_LA664        4
+#define N_ARCH_TYPES     5
+#define N_TUNE_TYPES     5
 
 /* parallel tables.  */
 extern const char* loongarch_cpu_strings[];
index e5921189a06426101b066880a250661b32219fb3..67a59152a013108fbab8c220b87a57fb13265b7d 100644 (file)
@@ -552,17 +552,17 @@ 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_LA64V100)
          abi.base = ABI_BASE_LP64D;
        break;
 
       case ISA_EXT_FPU32:
-       if (isa->base == ISA_BASE_LA64V100)
+       if (isa->base >= ISA_BASE_LA64V100)
          abi.base = ABI_BASE_LP64F;
        break;
 
       case ISA_EXT_NONE:
-       if (isa->base == ISA_BASE_LA64V100)
+       if (isa->base >= ISA_BASE_LA64V100)
          abi.base = ABI_BASE_LP64S;
        break;
 
@@ -582,7 +582,7 @@ isa_base_compat_p (const struct loongarch_isa *set1,
   switch (set2->base)
     {
       case ISA_BASE_LA64V100:
-       return (set1->base == ISA_BASE_LA64V100);
+       return (set1->base >= ISA_BASE_LA64V100);
 
       default:
        gcc_unreachable ();
index 6dd309aad96514a453ef47640ca83480bd953fee..0e1b3e528a1d01335a3972df5b4b50657b117a5e 100644 (file)
@@ -76,7 +76,8 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target,
 #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_64BIT             (la_target.isa.base == ISA_BASE_LA64V100)
+#define TARGET_64BIT             (la_target.isa.base == ISA_BASE_LA64V100 \
+                                  || la_target.isa.base == ISA_BASE_LA64V110)
 #define TARGET_ABI_LP64                  (la_target.abi.base == ABI_BASE_LP64D \
                                   || la_target.abi.base == ABI_BASE_LP64F \
                                   || la_target.abi.base == ABI_BASE_LP64S)
@@ -88,6 +89,7 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target,
 
 /* TARGET_ macros for use in *.md template conditionals */
 #define TARGET_uARCH_LA464       (la_target.cpu_tune == CPU_LA464)
+#define TARGET_uARCH_LA664       (la_target.cpu_tune == CPU_LA664)
 
 /* Note: optimize_size may vary across functions,
    while -m[no]-memcpy imposes a global constraint.  */
index 072558c28f1ab851ff8674a49b087828a1f8a058..fc4f41bfc1eb0ae5e3217e92c01fdad30d405e49 100644 (file)
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3.  If not see
 #define STR_CPU_ABI_DEFAULT "abi-default"
 #define STR_CPU_LOONGARCH64 "loongarch64"
 #define STR_CPU_LA464 "la464"
+#define STR_CPU_LA664 "la664"
 
 #define STR_ISA_BASE_LA64V100 "la64"
 
index 22ca24a18784b26271d86d6689be6a0bab6f49eb..4cd509f11c6dafa773a73ec4ebd0dbb57db74df2 100644 (file)
@@ -10177,6 +10177,7 @@ loongarch_cpu_sched_reassociation_width (struct loongarch_target *target,
     {
     case CPU_LOONGARCH64:
     case CPU_LA464:
+    case CPU_LA664:
       /* Vector part.  */
       if (LSX_SUPPORTED_MODE_P (mode) || LASX_SUPPORTED_MODE_P (mode))
        {
index a5988411fbb2fdb2c8d0097062b1ff403b00bcab..7f129e53ba5d338e34fc59c42eb319ea3cdc9ea0 100644 (file)
@@ -114,6 +114,9 @@ Enum(cpu_type) String(loongarch64) Value(CPU_LOONGARCH64)
 EnumValue
 Enum(cpu_type) String(la464) Value(CPU_LA464)
 
+EnumValue
+Enum(cpu_type) String(la664) Value(CPU_LA664)
+
 march=
 Target RejectNegative Joined Enum(cpu_type) Var(la_opt_cpu_arch) Init(M_OPT_UNSET)
 -march=PROCESSOR       Generate code for the given PROCESSOR ISA.