brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · a1247d1 Raw
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