261 lines · c
1/*===------------ larchintrin.h - LoongArch intrinsics ---------------------===2 *3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4 * See https://llvm.org/LICENSE.txt for license information.5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6 *7 *===-----------------------------------------------------------------------===8 */9 10#ifndef _LOONGARCH_BASE_INTRIN_H11#define _LOONGARCH_BASE_INTRIN_H12 13#ifdef __cplusplus14extern "C" {15#endif16 17typedef struct rdtime {18 unsigned int value;19 unsigned int timeid;20} __rdtime_t;21 22#if __loongarch_grlen == 6423typedef struct drdtime {24 unsigned long dvalue;25 unsigned long dtimeid;26} __drdtime_t;27 28extern __inline __drdtime_t29 __attribute__((__gnu_inline__, __always_inline__, __artificial__))30 __rdtime_d(void) {31 __drdtime_t __drdtime;32 __asm__ volatile(33 "rdtime.d %[val], %[tid]\n\t"34 : [val] "=&r"(__drdtime.dvalue), [tid] "=&r"(__drdtime.dtimeid));35 return __drdtime;36}37#endif38 39extern __inline __rdtime_t40 __attribute__((__gnu_inline__, __always_inline__, __artificial__))41 __rdtimeh_w(void) {42 __rdtime_t __rdtime;43 __asm__ volatile("rdtimeh.w %[val], %[tid]\n\t"44 : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid));45 return __rdtime;46}47 48extern __inline __rdtime_t49 __attribute__((__gnu_inline__, __always_inline__, __artificial__))50 __rdtimel_w(void) {51 __rdtime_t __rdtime;52 __asm__ volatile("rdtimel.w %[val], %[tid]\n\t"53 : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid));54 return __rdtime;55}56 57#if __loongarch_grlen == 6458extern __inline int59 __attribute__((__gnu_inline__, __always_inline__, __artificial__))60 __crc_w_b_w(char _1, int _2) {61 return (int)__builtin_loongarch_crc_w_b_w((char)_1, (int)_2);62}63 64extern __inline int65 __attribute__((__gnu_inline__, __always_inline__, __artificial__))66 __crc_w_h_w(short _1, int _2) {67 return (int)__builtin_loongarch_crc_w_h_w((short)_1, (int)_2);68}69 70extern __inline int71 __attribute__((__gnu_inline__, __always_inline__, __artificial__))72 __crc_w_w_w(int _1, int _2) {73 return (int)__builtin_loongarch_crc_w_w_w((int)_1, (int)_2);74}75 76extern __inline int77 __attribute__((__gnu_inline__, __always_inline__, __artificial__))78 __crc_w_d_w(long int _1, int _2) {79 return (int)__builtin_loongarch_crc_w_d_w((long int)_1, (int)_2);80}81 82extern __inline int83 __attribute__((__gnu_inline__, __always_inline__, __artificial__))84 __crcc_w_b_w(char _1, int _2) {85 return (int)__builtin_loongarch_crcc_w_b_w((char)_1, (int)_2);86}87 88extern __inline int89 __attribute__((__gnu_inline__, __always_inline__, __artificial__))90 __crcc_w_h_w(short _1, int _2) {91 return (int)__builtin_loongarch_crcc_w_h_w((short)_1, (int)_2);92}93 94extern __inline int95 __attribute__((__gnu_inline__, __always_inline__, __artificial__))96 __crcc_w_w_w(int _1, int _2) {97 return (int)__builtin_loongarch_crcc_w_w_w((int)_1, (int)_2);98}99 100extern __inline int101 __attribute__((__gnu_inline__, __always_inline__, __artificial__))102 __crcc_w_d_w(long int _1, int _2) {103 return (int)__builtin_loongarch_crcc_w_d_w((long int)_1, (int)_2);104}105#endif106 107#define __break(/*ui15*/ _1) __builtin_loongarch_break((_1))108 109#if __loongarch_grlen == 32110#define __cacop_w(/*uimm5*/ _1, /*unsigned int*/ _2, /*simm12*/ _3) \111 ((void)__builtin_loongarch_cacop_w((_1), (unsigned int)(_2), (_3)))112#endif113 114#if __loongarch_grlen == 64115#define __cacop_d(/*uimm5*/ _1, /*unsigned long int*/ _2, /*simm12*/ _3) \116 ((void)__builtin_loongarch_cacop_d((_1), (unsigned long int)(_2), (_3)))117#endif118 119#define __dbar(/*ui15*/ _1) __builtin_loongarch_dbar((_1))120 121#define __ibar(/*ui15*/ _1) __builtin_loongarch_ibar((_1))122 123#define __movfcsr2gr(/*ui5*/ _1) __builtin_loongarch_movfcsr2gr((_1));124 125#define __movgr2fcsr(/*ui5*/ _1, _2) \126 __builtin_loongarch_movgr2fcsr((_1), (unsigned int)_2);127 128#define __syscall(/*ui15*/ _1) __builtin_loongarch_syscall((_1))129 130#define __csrrd_w(/*ui14*/ _1) ((unsigned int)__builtin_loongarch_csrrd_w((_1)))131 132#define __csrwr_w(/*unsigned int*/ _1, /*ui14*/ _2) \133 ((unsigned int)__builtin_loongarch_csrwr_w((unsigned int)(_1), (_2)))134 135#define __csrxchg_w(/*unsigned int*/ _1, /*unsigned int*/ _2, /*ui14*/ _3) \136 ((unsigned int)__builtin_loongarch_csrxchg_w((unsigned int)(_1), \137 (unsigned int)(_2), (_3)))138 139#if __loongarch_grlen == 64140#define __csrrd_d(/*ui14*/ _1) \141 ((unsigned long int)__builtin_loongarch_csrrd_d((_1)))142 143#define __csrwr_d(/*unsigned long int*/ _1, /*ui14*/ _2) \144 ((unsigned long int)__builtin_loongarch_csrwr_d((unsigned long int)(_1), \145 (_2)))146 147#define __csrxchg_d(/*unsigned long int*/ _1, /*unsigned long int*/ _2, \148 /*ui14*/ _3) \149 ((unsigned long int)__builtin_loongarch_csrxchg_d( \150 (unsigned long int)(_1), (unsigned long int)(_2), (_3)))151#endif152 153extern __inline unsigned char154 __attribute__((__gnu_inline__, __always_inline__, __artificial__))155 __iocsrrd_b(unsigned int _1) {156 return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1);157}158 159extern __inline unsigned short160 __attribute__((__gnu_inline__, __always_inline__, __artificial__))161 __iocsrrd_h(unsigned int _1) {162 return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1);163}164 165extern __inline unsigned int166 __attribute__((__gnu_inline__, __always_inline__, __artificial__))167 __iocsrrd_w(unsigned int _1) {168 return (unsigned int)__builtin_loongarch_iocsrrd_w((unsigned int)_1);169}170 171#if __loongarch_grlen == 64172extern __inline unsigned long int173 __attribute__((__gnu_inline__, __always_inline__, __artificial__))174 __iocsrrd_d(unsigned int _1) {175 return (unsigned long int)__builtin_loongarch_iocsrrd_d((unsigned int)_1);176}177#endif178 179extern __inline void180 __attribute__((__gnu_inline__, __always_inline__, __artificial__))181 __iocsrwr_b(unsigned char _1, unsigned int _2) {182 __builtin_loongarch_iocsrwr_b((unsigned char)_1, (unsigned int)_2);183}184 185extern __inline void186 __attribute__((__gnu_inline__, __always_inline__, __artificial__))187 __iocsrwr_h(unsigned short _1, unsigned int _2) {188 __builtin_loongarch_iocsrwr_h((unsigned short)_1, (unsigned int)_2);189}190 191extern __inline void192 __attribute__((__gnu_inline__, __always_inline__, __artificial__))193 __iocsrwr_w(unsigned int _1, unsigned int _2) {194 __builtin_loongarch_iocsrwr_w((unsigned int)_1, (unsigned int)_2);195}196 197extern __inline unsigned int198 __attribute__((__gnu_inline__, __always_inline__, __artificial__))199 __cpucfg(unsigned int _1) {200 return (unsigned int)__builtin_loongarch_cpucfg((unsigned int)_1);201}202 203#if __loongarch_grlen == 64204extern __inline void205 __attribute__((__gnu_inline__, __always_inline__, __artificial__))206 __iocsrwr_d(unsigned long int _1, unsigned int _2) {207 __builtin_loongarch_iocsrwr_d((unsigned long int)_1, (unsigned int)_2);208}209 210extern __inline void211 __attribute__((__gnu_inline__, __always_inline__, __artificial__))212 __asrtgt_d(long int _1, long int _2) {213 __builtin_loongarch_asrtgt_d((long int)_1, (long int)_2);214}215 216extern __inline void217 __attribute__((__gnu_inline__, __always_inline__, __artificial__))218 __asrtle_d(long int _1, long int _2) {219 __builtin_loongarch_asrtle_d((long int)_1, (long int)_2);220}221#endif222 223#if __loongarch_grlen == 64224#define __lddir_d(/*long int*/ _1, /*ui5*/ _2) \225 ((long int)__builtin_loongarch_lddir_d((long int)(_1), (_2)))226 227#define __ldpte_d(/*long int*/ _1, /*ui5*/ _2) \228 ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2)))229#endif230 231#ifdef __loongarch_frecipe232extern __inline float233 __attribute__((__gnu_inline__, __always_inline__, __artificial__))234 __frecipe_s(float _1) {235 return __builtin_loongarch_frecipe_s(_1);236}237 238extern __inline double239 __attribute__((__gnu_inline__, __always_inline__, __artificial__))240 __frecipe_d(double _1) {241 return __builtin_loongarch_frecipe_d(_1);242}243 244extern __inline float245 __attribute__((__gnu_inline__, __always_inline__, __artificial__))246 __frsqrte_s(float _1) {247 return __builtin_loongarch_frsqrte_s(_1);248}249 250extern __inline double251 __attribute__((__gnu_inline__, __always_inline__, __artificial__))252 __frsqrte_d(double _1) {253 return __builtin_loongarch_frsqrte_d(_1);254}255#endif256 257#ifdef __cplusplus258}259#endif260#endif /* _LOONGARCH_BASE_INTRIN_H */261