Next: LoongArch SX Vector Intrinsics, Previous: FR-V Built-in Functions, Up: Target Builtins [Contents][Index]

#### 6.62.14 LoongArch Base Built-in Functions

These built-in functions are available for LoongArch.

Data Type Description:

- `imm0_31`, a compile-time constant in range 0 to 31;
- `imm0_16383`, a compile-time constant in range 0 to 16383;
- `imm0_32767`, a compile-time constant in range 0 to 32767;
- `imm_n2048_2047`, a compile-time constant in range -2048 to 2047;

The intrinsics provided are listed below:

        unsigned int __builtin_loongarch_movfcsr2gr (imm0_31)
        void __builtin_loongarch_movgr2fcsr (imm0_31, unsigned int)
        void __builtin_loongarch_cacop_d (imm0_31, unsigned long int, imm_n2048_2047)
        unsigned int __builtin_loongarch_cpucfg (unsigned int)
        void __builtin_loongarch_asrtle_d (long int, long int)
        void __builtin_loongarch_asrtgt_d (long int, long int)
        long int __builtin_loongarch_lddir_d (long int, imm0_31)
        void __builtin_loongarch_ldpte_d (long int, imm0_31)

        int __builtin_loongarch_crc_w_b_w (char, int)
        int __builtin_loongarch_crc_w_h_w (short, int)
        int __builtin_loongarch_crc_w_w_w (int, int)
        int __builtin_loongarch_crc_w_d_w (long int, int)
        int __builtin_loongarch_crcc_w_b_w (char, int)
        int __builtin_loongarch_crcc_w_h_w (short, int)
        int __builtin_loongarch_crcc_w_w_w (int, int)
        int __builtin_loongarch_crcc_w_d_w (long int, int)

        unsigned int __builtin_loongarch_csrrd_w (imm0_16383)
        unsigned int __builtin_loongarch_csrwr_w (unsigned int, imm0_16383)
        unsigned int __builtin_loongarch_csrxchg_w (unsigned int, unsigned int, imm0_16383)
        unsigned long int __builtin_loongarch_csrrd_d (imm0_16383)
        unsigned long int __builtin_loongarch_csrwr_d (unsigned long int, imm0_16383)
        unsigned long int __builtin_loongarch_csrxchg_d (unsigned long int, unsigned long int, imm0_16383)

        unsigned char __builtin_loongarch_iocsrrd_b (unsigned int)
        unsigned short __builtin_loongarch_iocsrrd_h (unsigned int)
        unsigned int __builtin_loongarch_iocsrrd_w (unsigned int)
        unsigned long int __builtin_loongarch_iocsrrd_d (unsigned int)
        void __builtin_loongarch_iocsrwr_b (unsigned char, unsigned int)
        void __builtin_loongarch_iocsrwr_h (unsigned short, unsigned int)
        void __builtin_loongarch_iocsrwr_w (unsigned int, unsigned int)
        void __builtin_loongarch_iocsrwr_d (unsigned long int, unsigned int)

        void __builtin_loongarch_dbar (imm0_32767)
        void __builtin_loongarch_ibar (imm0_32767)

        void __builtin_loongarch_syscall (imm0_32767)
        void __builtin_loongarch_break (imm0_32767)

These instrisic functions are available by using `-mfrecipe`.

        float __builtin_loongarch_frecipe_s (float);
        double  __builtin_loongarch_frecipe_d (double);
        float __builtin_loongarch_frsqrte_s (float);
        double  __builtin_loongarch_frsqrte_d (double);

Note:Since the control register is divided into 32-bit and 64-bit, but the access instruction is not distinguished. So GCC renames the control instructions when implementing intrinsics.

Take the csrrd instruction as an example, built-in functions are implemented as follows:

      __builtin_loongarch_csrrd_w  // When reading the 32-bit control register use.
      __builtin_loongarch_csrrd_d  // When reading the 64-bit control register use.

For the convenience of use, the built-in functions are encapsulated, the encapsulated functions and `__drdtime_t, __rdtime_t` are defined in the `larchintrin.h`. So if you call the following function you need to include `larchintrin.h`.

         typedef struct drdtime{
                unsigned long dvalue;
                unsigned long dtimeid;
         } __drdtime_t;

         typedef struct rdtime{
                unsigned int value;
                unsigned int timeid;
         } __rdtime_t;

        __drdtime_t __rdtime_d (void)
        __rdtime_t  __rdtimel_w (void)
        __rdtime_t  __rdtimeh_w (void)
        unsigned int  __movfcsr2gr (imm0_31)
        void __movgr2fcsr (imm0_31, unsigned int)
        void __cacop_d (imm0_31, unsigned long, imm_n2048_2047)
        unsigned int  __cpucfg (unsigned int)
        void __asrtle_d (long int, long int)
        void __asrtgt_d (long int, long int)
        long int  __lddir_d (long int, imm0_31)
        void __ldpte_d (long int, imm0_31)

        int  __crc_w_b_w (char, int)
        int  __crc_w_h_w (short, int)
        int  __crc_w_w_w (int, int)
        int  __crc_w_d_w (long int, int)
        int  __crcc_w_b_w (char, int)
        int  __crcc_w_h_w (short, int)
        int  __crcc_w_w_w (int, int)
        int  __crcc_w_d_w (long int, int)

        unsigned int  __csrrd_w (imm0_16383)
        unsigned int  __csrwr_w (unsigned int, imm0_16383)
        unsigned int  __csrxchg_w (unsigned int, unsigned int, imm0_16383)
        unsigned long  __csrrd_d (imm0_16383)
        unsigned long  __csrwr_d (unsigned long, imm0_16383)
        unsigned long  __csrxchg_d (unsigned long, unsigned long, imm0_16383)

        unsigned char   __iocsrrd_b (unsigned int)
        unsigned short  __iocsrrd_h (unsigned int)
        unsigned int  __iocsrrd_w (unsigned int)
        unsigned long  __iocsrrd_d (unsigned int)
        void __iocsrwr_b (unsigned char, unsigned int)
        void __iocsrwr_h (unsigned short, unsigned int)
        void __iocsrwr_w (unsigned int, unsigned int)
        void __iocsrwr_d (unsigned long, unsigned int)

        void __dbar (imm0_32767)
        void __ibar (imm0_32767)

        void __syscall (imm0_32767)
        void __break (imm0_32767)

These instrisic functions are available by including `larchintrin.h` and using `-mfrecipe`.

        float __frecipe_s (float);
        double __frecipe_d (double);
        float __frsqrte_s (float);
        double __frsqrte_d (double);

Additional built-in functions are available for LoongArch family processors to efficiently use 128-bit floating-point (__float128) values.

The following are the basic built-in functions supported.

    __float128 __builtin_fabsq (__float128);
    __float128 __builtin_copysignq (__float128, __float128);
    __float128 __builtin_infq (void);
    __float128 __builtin_huge_valq (void);
    __float128 __builtin_nanq (void);
    __float128 __builtin_nansq (void);

Returns the value that is currently set in the ‘`tp`’ register.

        void * __builtin_thread_pointer (void)

Next: LoongArch SX Vector Intrinsics, Previous: FR-V Built-in Functions, Up: Target Builtins [Contents][Index]