]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Add support for intrinsics on LA32
authormengqinggang <mengqinggang@loongson.cn>
Tue, 9 Dec 2025 11:11:30 +0000 (19:11 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Fri, 12 Dec 2025 07:56:46 +0000 (15:56 +0800)
gcc/ChangeLog:

* config/loongarch/larchintrin.h (__movgr2fcsr): Disable on soft float.
(__cacop_w): New.
(__lddir_d): Delete #error.
(__ldpte_d): Likewise.
(__crc_w_w_w): Disable on LA32
(__crc_w_d_w): Likewise.
(__crcc_w_w_w): Likewise.
* config/loongarch/loongarch-builtins.cc : Disable some builtin on LA32.

Reviewed-by: Xi Ruoyao <xry111@xry111.site>
Reviewed-by: Lulu Cheng <chenglulu@loongson.cn>
gcc/config/loongarch/larchintrin.h
gcc/config/loongarch/loongarch-builtins.cc

index b8c06545c962f88f2d01317440b22d5d27b2f06c..edf5fa6d995a710b39505382ad5f1935f3ff2e63 100644 (file)
@@ -80,6 +80,7 @@ __rdtimel_w (void)
   return __rdtime;
 }
 
+#ifdef __loongarch_hard_float
 /* Assembly instruction format:        rj, fcsr.  */
 /* Data types in instruction templates:  USI, UQI.  */
 #define __movfcsr2gr(/*ui5*/ _1) __builtin_loongarch_movfcsr2gr ((_1));
@@ -88,14 +89,16 @@ __rdtimel_w (void)
 /* Data types in instruction templates:  VOID, UQI, USI.  */
 #define __movgr2fcsr(/*ui5*/ _1, _2) \
   __builtin_loongarch_movgr2fcsr ((_1), _2);
+#endif
 
-#if defined __loongarch64
+#if __loongarch_grlen == 64
 /* Assembly instruction format:        ui5, rj, si12.  */
 /* Data types in instruction templates:  VOID, USI, UDI, SI.  */
 #define __cacop_d(/*ui5*/ _1, /*unsigned long int*/ _2, /*si12*/ _3) \
   __builtin_loongarch_cacop_d ((_1), (_2), (_3))
-#else
-#error "Unsupported ABI."
+#elif __loongarch_grlen == 32
+#define __cacop_w(/*ui5*/ _1, /*unsigned long int*/ _2, /*si12*/ _3) \
+  __builtin_loongarch_cacop_w ((_1), (_2), (_3))
 #endif
 
 /* Assembly instruction format:        rd, rj.  */
@@ -127,24 +130,21 @@ __asrtgt_d (long int _1, long int _2)
 }
 #endif
 
-#if defined __loongarch64
+#if __loongarch_grlen == 64
 /* Assembly instruction format:        rd, rj, ui5.  */
 /* Data types in instruction templates:  DI, DI, UQI.  */
 #define __lddir_d(/*long int*/ _1, /*ui5*/ _2) \
   __builtin_loongarch_lddir_d ((_1), (_2))
-#else
-#error "Unsupported ABI."
 #endif
 
-#if defined __loongarch64
+#if __loongarch_grlen == 64
 /* Assembly instruction format:        rj, ui5.  */
 /* Data types in instruction templates:  VOID, DI, UQI.  */
 #define __ldpte_d(/*long int*/ _1, /*ui5*/ _2) \
   __builtin_loongarch_ldpte_d ((_1), (_2))
-#else
-#error "Unsupported ABI."
 #endif
 
+#ifdef __loongarch64
 /* Assembly instruction format:        rd, rj, rk.  */
 /* Data types in instruction templates:  SI, QI, SI.  */
 extern __inline int
@@ -172,7 +172,6 @@ __crc_w_w_w (int _1, int _2)
   return __builtin_loongarch_crc_w_w_w (_1, _2);
 }
 
-#ifdef __loongarch64
 /* Assembly instruction format:        rd, rj, rk.  */
 /* Data types in instruction templates:  SI, DI, SI.  */
 extern __inline int
@@ -181,7 +180,6 @@ __crc_w_d_w (long int _1, int _2)
 {
   return __builtin_loongarch_crc_w_d_w (_1, _2);
 }
-#endif
 
 /* Assembly instruction format:        rd, rj, rk.  */
 /* Data types in instruction templates:  SI, QI, SI.  */
@@ -210,7 +208,6 @@ __crcc_w_w_w (int _1, int _2)
   return __builtin_loongarch_crcc_w_w_w (_1, _2);
 }
 
-#ifdef __loongarch64
 /* Assembly instruction format:        rd, rj, rk.  */
 /* Data types in instruction templates:  SI, DI, SI.  */
 extern __inline int
index 6c914c07d2998cfe2751021e855cf2b283ad82cd..c5dc19f3ee193ddefda46820520e2c650dc13a74 100644 (file)
@@ -117,6 +117,8 @@ struct loongarch_builtin_description
   unsigned int (*avail) (void);
 };
 
+AVAIL_ALL (la64, TARGET_64BIT)
+AVAIL_ALL (la64_or_la32s, (TARGET_64BIT || TARGET_32BIT_S))
 AVAIL_ALL (hard_float, TARGET_HARD_FLOAT_ABI)
 AVAIL_ALL (lsx, ISA_HAS_LSX)
 AVAIL_ALL (lasx, ISA_HAS_LASX)
@@ -893,44 +895,44 @@ static const struct loongarch_builtin_description loongarch_builtins[] = {
   DIRECT_NO_TARGET_BUILTIN (movgr2fcsr, LARCH_VOID_FTYPE_UQI_USI, hard_float),
 
   DIRECT_NO_TARGET_BUILTIN (cacop_w, LARCH_VOID_FTYPE_USI_USI_SI, default),
-  DIRECT_NO_TARGET_BUILTIN (cacop_d, LARCH_VOID_FTYPE_USI_UDI_SI, default),
+  DIRECT_NO_TARGET_BUILTIN (cacop_d, LARCH_VOID_FTYPE_USI_UDI_SI, la64),
   DIRECT_NO_TARGET_BUILTIN (dbar, LARCH_VOID_FTYPE_USI, default),
   DIRECT_NO_TARGET_BUILTIN (ibar, LARCH_VOID_FTYPE_USI, default),
 
-  DIRECT_BUILTIN (lddir_d, LARCH_DI_FTYPE_DI_UQI, default),
-  DIRECT_BUILTIN (lddir_w, LARCH_SI_FTYPE_SI_UQI, default),
-  DIRECT_NO_TARGET_BUILTIN (ldpte_d, LARCH_VOID_FTYPE_DI_UQI, default),
-  DIRECT_NO_TARGET_BUILTIN (ldpte_w, LARCH_VOID_FTYPE_SI_UQI, default),
+  DIRECT_BUILTIN (lddir_d, LARCH_DI_FTYPE_DI_UQI, la64),
+  DIRECT_BUILTIN (lddir_w, LARCH_SI_FTYPE_SI_UQI,  la64_or_la32s),
+  DIRECT_NO_TARGET_BUILTIN (ldpte_d, LARCH_VOID_FTYPE_DI_UQI, la64),
+  DIRECT_NO_TARGET_BUILTIN (ldpte_w, LARCH_VOID_FTYPE_SI_UQI,  la64_or_la32s),
 
   /* CRC Instrinsic */
 
-  DIRECT_BUILTIN (crc_w_b_w, LARCH_SI_FTYPE_QI_SI, default),
-  DIRECT_BUILTIN (crc_w_h_w, LARCH_SI_FTYPE_HI_SI, default),
-  DIRECT_BUILTIN (crc_w_w_w, LARCH_SI_FTYPE_SI_SI, default),
-  DIRECT_BUILTIN (crc_w_d_w, LARCH_SI_FTYPE_DI_SI, default),
-  DIRECT_BUILTIN (crcc_w_b_w, LARCH_SI_FTYPE_QI_SI, default),
-  DIRECT_BUILTIN (crcc_w_h_w, LARCH_SI_FTYPE_HI_SI, default),
-  DIRECT_BUILTIN (crcc_w_w_w, LARCH_SI_FTYPE_SI_SI, default),
-  DIRECT_BUILTIN (crcc_w_d_w, LARCH_SI_FTYPE_DI_SI, default),
+  DIRECT_BUILTIN (crc_w_b_w, LARCH_SI_FTYPE_QI_SI, la64),
+  DIRECT_BUILTIN (crc_w_h_w, LARCH_SI_FTYPE_HI_SI, la64),
+  DIRECT_BUILTIN (crc_w_w_w, LARCH_SI_FTYPE_SI_SI, la64),
+  DIRECT_BUILTIN (crc_w_d_w, LARCH_SI_FTYPE_DI_SI, la64),
+  DIRECT_BUILTIN (crcc_w_b_w, LARCH_SI_FTYPE_QI_SI, la64),
+  DIRECT_BUILTIN (crcc_w_h_w, LARCH_SI_FTYPE_HI_SI, la64),
+  DIRECT_BUILTIN (crcc_w_w_w, LARCH_SI_FTYPE_SI_SI, la64),
+  DIRECT_BUILTIN (crcc_w_d_w, LARCH_SI_FTYPE_DI_SI, la64),
 
   DIRECT_BUILTIN (csrrd_w, LARCH_USI_FTYPE_USI, default),
-  DIRECT_BUILTIN (csrrd_d, LARCH_UDI_FTYPE_USI, default),
+  DIRECT_BUILTIN (csrrd_d, LARCH_UDI_FTYPE_USI, la64),
   DIRECT_BUILTIN (csrwr_w, LARCH_USI_FTYPE_USI_USI, default),
-  DIRECT_BUILTIN (csrwr_d, LARCH_UDI_FTYPE_UDI_USI, default),
+  DIRECT_BUILTIN (csrwr_d, LARCH_UDI_FTYPE_UDI_USI, la64),
   DIRECT_BUILTIN (csrxchg_w, LARCH_USI_FTYPE_USI_USI_USI, default),
-  DIRECT_BUILTIN (csrxchg_d, LARCH_UDI_FTYPE_UDI_UDI_USI, default),
+  DIRECT_BUILTIN (csrxchg_d, LARCH_UDI_FTYPE_UDI_UDI_USI, la64),
   DIRECT_BUILTIN (iocsrrd_b, LARCH_UQI_FTYPE_USI, default),
   DIRECT_BUILTIN (iocsrrd_h, LARCH_UHI_FTYPE_USI, default),
   DIRECT_BUILTIN (iocsrrd_w, LARCH_USI_FTYPE_USI, default),
-  DIRECT_BUILTIN (iocsrrd_d, LARCH_UDI_FTYPE_USI, default),
+  DIRECT_BUILTIN (iocsrrd_d, LARCH_UDI_FTYPE_USI, la64),
   DIRECT_NO_TARGET_BUILTIN (iocsrwr_b, LARCH_VOID_FTYPE_UQI_USI, default),
   DIRECT_NO_TARGET_BUILTIN (iocsrwr_h, LARCH_VOID_FTYPE_UHI_USI, default),
   DIRECT_NO_TARGET_BUILTIN (iocsrwr_w, LARCH_VOID_FTYPE_USI_USI, default),
-  DIRECT_NO_TARGET_BUILTIN (iocsrwr_d, LARCH_VOID_FTYPE_UDI_USI, default),
+  DIRECT_NO_TARGET_BUILTIN (iocsrwr_d, LARCH_VOID_FTYPE_UDI_USI, la64),
 
   DIRECT_BUILTIN (cpucfg, LARCH_USI_FTYPE_USI, default),
-  DIRECT_NO_TARGET_BUILTIN (asrtle_d, LARCH_VOID_FTYPE_DI_DI, default),
-  DIRECT_NO_TARGET_BUILTIN (asrtgt_d, LARCH_VOID_FTYPE_DI_DI, default),
+  DIRECT_NO_TARGET_BUILTIN (asrtle_d, LARCH_VOID_FTYPE_DI_DI, la64),
+  DIRECT_NO_TARGET_BUILTIN (asrtgt_d, LARCH_VOID_FTYPE_DI_DI, la64),
   DIRECT_NO_TARGET_BUILTIN (syscall, LARCH_VOID_FTYPE_USI, default),
   DIRECT_NO_TARGET_BUILTIN (break, LARCH_VOID_FTYPE_USI, default),