https://gcc.gnu.org/g:78f125d4fcd09508f475afa2d5f33c9b180e4458
commit r16-6053-g78f125d4fcd09508f475afa2d5f33c9b180e4458 Author: mengqinggang <[email protected]> Date: Tue Dec 9 19:11:30 2025 +0800 LoongArch: Add support for intrinsics on LA32 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 <[email protected]> Reviewed-by: Lulu Cheng <[email protected]> Diff: --- gcc/config/loongarch/larchintrin.h | 21 +++++++-------- gcc/config/loongarch/loongarch-builtins.cc | 42 ++++++++++++++++-------------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/gcc/config/loongarch/larchintrin.h b/gcc/config/loongarch/larchintrin.h index b8c06545c962..edf5fa6d995a 100644 --- a/gcc/config/loongarch/larchintrin.h +++ b/gcc/config/loongarch/larchintrin.h @@ -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 diff --git a/gcc/config/loongarch/loongarch-builtins.cc b/gcc/config/loongarch/loongarch-builtins.cc index 6c914c07d299..c5dc19f3ee19 100644 --- a/gcc/config/loongarch/loongarch-builtins.cc +++ b/gcc/config/loongarch/loongarch-builtins.cc @@ -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),
