1*bed243d3SAndroid Build Coastguard Worker /*===------------ larchintrin.h - LoongArch intrinsics ---------------------=== 2*bed243d3SAndroid Build Coastguard Worker * 3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information. 5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bed243d3SAndroid Build Coastguard Worker * 7*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------=== 8*bed243d3SAndroid Build Coastguard Worker */ 9*bed243d3SAndroid Build Coastguard Worker 10*bed243d3SAndroid Build Coastguard Worker #ifndef _LOONGARCH_BASE_INTRIN_H 11*bed243d3SAndroid Build Coastguard Worker #define _LOONGARCH_BASE_INTRIN_H 12*bed243d3SAndroid Build Coastguard Worker 13*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus 14*bed243d3SAndroid Build Coastguard Worker extern "C" { 15*bed243d3SAndroid Build Coastguard Worker #endif 16*bed243d3SAndroid Build Coastguard Worker 17*bed243d3SAndroid Build Coastguard Worker typedef struct rdtime { 18*bed243d3SAndroid Build Coastguard Worker unsigned int value; 19*bed243d3SAndroid Build Coastguard Worker unsigned int timeid; 20*bed243d3SAndroid Build Coastguard Worker } __rdtime_t; 21*bed243d3SAndroid Build Coastguard Worker 22*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 23*bed243d3SAndroid Build Coastguard Worker typedef struct drdtime { 24*bed243d3SAndroid Build Coastguard Worker unsigned long dvalue; 25*bed243d3SAndroid Build Coastguard Worker unsigned long dtimeid; 26*bed243d3SAndroid Build Coastguard Worker } __drdtime_t; 27*bed243d3SAndroid Build Coastguard Worker 28*bed243d3SAndroid Build Coastguard Worker extern __inline __drdtime_t 29*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __rdtime_d(void)30*bed243d3SAndroid Build Coastguard Worker __rdtime_d(void) { 31*bed243d3SAndroid Build Coastguard Worker __drdtime_t __drdtime; 32*bed243d3SAndroid Build Coastguard Worker __asm__ volatile( 33*bed243d3SAndroid Build Coastguard Worker "rdtime.d %[val], %[tid]\n\t" 34*bed243d3SAndroid Build Coastguard Worker : [val] "=&r"(__drdtime.dvalue), [tid] "=&r"(__drdtime.dtimeid)); 35*bed243d3SAndroid Build Coastguard Worker return __drdtime; 36*bed243d3SAndroid Build Coastguard Worker } 37*bed243d3SAndroid Build Coastguard Worker #endif 38*bed243d3SAndroid Build Coastguard Worker 39*bed243d3SAndroid Build Coastguard Worker extern __inline __rdtime_t 40*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __rdtimeh_w(void)41*bed243d3SAndroid Build Coastguard Worker __rdtimeh_w(void) { 42*bed243d3SAndroid Build Coastguard Worker __rdtime_t __rdtime; 43*bed243d3SAndroid Build Coastguard Worker __asm__ volatile("rdtimeh.w %[val], %[tid]\n\t" 44*bed243d3SAndroid Build Coastguard Worker : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid)); 45*bed243d3SAndroid Build Coastguard Worker return __rdtime; 46*bed243d3SAndroid Build Coastguard Worker } 47*bed243d3SAndroid Build Coastguard Worker 48*bed243d3SAndroid Build Coastguard Worker extern __inline __rdtime_t 49*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __rdtimel_w(void)50*bed243d3SAndroid Build Coastguard Worker __rdtimel_w(void) { 51*bed243d3SAndroid Build Coastguard Worker __rdtime_t __rdtime; 52*bed243d3SAndroid Build Coastguard Worker __asm__ volatile("rdtimel.w %[val], %[tid]\n\t" 53*bed243d3SAndroid Build Coastguard Worker : [val] "=&r"(__rdtime.value), [tid] "=&r"(__rdtime.timeid)); 54*bed243d3SAndroid Build Coastguard Worker return __rdtime; 55*bed243d3SAndroid Build Coastguard Worker } 56*bed243d3SAndroid Build Coastguard Worker 57*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 58*bed243d3SAndroid Build Coastguard Worker extern __inline int 59*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crc_w_b_w(char _1,int _2)60*bed243d3SAndroid Build Coastguard Worker __crc_w_b_w(char _1, int _2) { 61*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crc_w_b_w((char)_1, (int)_2); 62*bed243d3SAndroid Build Coastguard Worker } 63*bed243d3SAndroid Build Coastguard Worker 64*bed243d3SAndroid Build Coastguard Worker extern __inline int 65*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crc_w_h_w(short _1,int _2)66*bed243d3SAndroid Build Coastguard Worker __crc_w_h_w(short _1, int _2) { 67*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crc_w_h_w((short)_1, (int)_2); 68*bed243d3SAndroid Build Coastguard Worker } 69*bed243d3SAndroid Build Coastguard Worker 70*bed243d3SAndroid Build Coastguard Worker extern __inline int 71*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crc_w_w_w(int _1,int _2)72*bed243d3SAndroid Build Coastguard Worker __crc_w_w_w(int _1, int _2) { 73*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crc_w_w_w((int)_1, (int)_2); 74*bed243d3SAndroid Build Coastguard Worker } 75*bed243d3SAndroid Build Coastguard Worker 76*bed243d3SAndroid Build Coastguard Worker extern __inline int 77*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crc_w_d_w(long int _1,int _2)78*bed243d3SAndroid Build Coastguard Worker __crc_w_d_w(long int _1, int _2) { 79*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crc_w_d_w((long int)_1, (int)_2); 80*bed243d3SAndroid Build Coastguard Worker } 81*bed243d3SAndroid Build Coastguard Worker 82*bed243d3SAndroid Build Coastguard Worker extern __inline int 83*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crcc_w_b_w(char _1,int _2)84*bed243d3SAndroid Build Coastguard Worker __crcc_w_b_w(char _1, int _2) { 85*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crcc_w_b_w((char)_1, (int)_2); 86*bed243d3SAndroid Build Coastguard Worker } 87*bed243d3SAndroid Build Coastguard Worker 88*bed243d3SAndroid Build Coastguard Worker extern __inline int 89*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crcc_w_h_w(short _1,int _2)90*bed243d3SAndroid Build Coastguard Worker __crcc_w_h_w(short _1, int _2) { 91*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crcc_w_h_w((short)_1, (int)_2); 92*bed243d3SAndroid Build Coastguard Worker } 93*bed243d3SAndroid Build Coastguard Worker 94*bed243d3SAndroid Build Coastguard Worker extern __inline int 95*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crcc_w_w_w(int _1,int _2)96*bed243d3SAndroid Build Coastguard Worker __crcc_w_w_w(int _1, int _2) { 97*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crcc_w_w_w((int)_1, (int)_2); 98*bed243d3SAndroid Build Coastguard Worker } 99*bed243d3SAndroid Build Coastguard Worker 100*bed243d3SAndroid Build Coastguard Worker extern __inline int 101*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __crcc_w_d_w(long int _1,int _2)102*bed243d3SAndroid Build Coastguard Worker __crcc_w_d_w(long int _1, int _2) { 103*bed243d3SAndroid Build Coastguard Worker return (int)__builtin_loongarch_crcc_w_d_w((long int)_1, (int)_2); 104*bed243d3SAndroid Build Coastguard Worker } 105*bed243d3SAndroid Build Coastguard Worker #endif 106*bed243d3SAndroid Build Coastguard Worker 107*bed243d3SAndroid Build Coastguard Worker #define __break(/*ui15*/ _1) __builtin_loongarch_break((_1)) 108*bed243d3SAndroid Build Coastguard Worker 109*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 32 110*bed243d3SAndroid Build Coastguard Worker #define __cacop_w(/*uimm5*/ _1, /*unsigned int*/ _2, /*simm12*/ _3) \ 111*bed243d3SAndroid Build Coastguard Worker ((void)__builtin_loongarch_cacop_w((_1), (unsigned int)(_2), (_3))) 112*bed243d3SAndroid Build Coastguard Worker #endif 113*bed243d3SAndroid Build Coastguard Worker 114*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 115*bed243d3SAndroid Build Coastguard Worker #define __cacop_d(/*uimm5*/ _1, /*unsigned long int*/ _2, /*simm12*/ _3) \ 116*bed243d3SAndroid Build Coastguard Worker ((void)__builtin_loongarch_cacop_d((_1), (unsigned long int)(_2), (_3))) 117*bed243d3SAndroid Build Coastguard Worker #endif 118*bed243d3SAndroid Build Coastguard Worker 119*bed243d3SAndroid Build Coastguard Worker #define __dbar(/*ui15*/ _1) __builtin_loongarch_dbar((_1)) 120*bed243d3SAndroid Build Coastguard Worker 121*bed243d3SAndroid Build Coastguard Worker #define __ibar(/*ui15*/ _1) __builtin_loongarch_ibar((_1)) 122*bed243d3SAndroid Build Coastguard Worker 123*bed243d3SAndroid Build Coastguard Worker #define __movfcsr2gr(/*ui5*/ _1) __builtin_loongarch_movfcsr2gr((_1)); 124*bed243d3SAndroid Build Coastguard Worker 125*bed243d3SAndroid Build Coastguard Worker #define __movgr2fcsr(/*ui5*/ _1, _2) \ 126*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_movgr2fcsr((_1), (unsigned int)_2); 127*bed243d3SAndroid Build Coastguard Worker 128*bed243d3SAndroid Build Coastguard Worker #define __syscall(/*ui15*/ _1) __builtin_loongarch_syscall((_1)) 129*bed243d3SAndroid Build Coastguard Worker 130*bed243d3SAndroid Build Coastguard Worker #define __csrrd_w(/*ui14*/ _1) ((unsigned int)__builtin_loongarch_csrrd_w((_1))) 131*bed243d3SAndroid Build Coastguard Worker 132*bed243d3SAndroid Build Coastguard Worker #define __csrwr_w(/*unsigned int*/ _1, /*ui14*/ _2) \ 133*bed243d3SAndroid Build Coastguard Worker ((unsigned int)__builtin_loongarch_csrwr_w((unsigned int)(_1), (_2))) 134*bed243d3SAndroid Build Coastguard Worker 135*bed243d3SAndroid Build Coastguard Worker #define __csrxchg_w(/*unsigned int*/ _1, /*unsigned int*/ _2, /*ui14*/ _3) \ 136*bed243d3SAndroid Build Coastguard Worker ((unsigned int)__builtin_loongarch_csrxchg_w((unsigned int)(_1), \ 137*bed243d3SAndroid Build Coastguard Worker (unsigned int)(_2), (_3))) 138*bed243d3SAndroid Build Coastguard Worker 139*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 140*bed243d3SAndroid Build Coastguard Worker #define __csrrd_d(/*ui14*/ _1) \ 141*bed243d3SAndroid Build Coastguard Worker ((unsigned long int)__builtin_loongarch_csrrd_d((_1))) 142*bed243d3SAndroid Build Coastguard Worker 143*bed243d3SAndroid Build Coastguard Worker #define __csrwr_d(/*unsigned long int*/ _1, /*ui14*/ _2) \ 144*bed243d3SAndroid Build Coastguard Worker ((unsigned long int)__builtin_loongarch_csrwr_d((unsigned long int)(_1), \ 145*bed243d3SAndroid Build Coastguard Worker (_2))) 146*bed243d3SAndroid Build Coastguard Worker 147*bed243d3SAndroid Build Coastguard Worker #define __csrxchg_d(/*unsigned long int*/ _1, /*unsigned long int*/ _2, \ 148*bed243d3SAndroid Build Coastguard Worker /*ui14*/ _3) \ 149*bed243d3SAndroid Build Coastguard Worker ((unsigned long int)__builtin_loongarch_csrxchg_d( \ 150*bed243d3SAndroid Build Coastguard Worker (unsigned long int)(_1), (unsigned long int)(_2), (_3))) 151*bed243d3SAndroid Build Coastguard Worker #endif 152*bed243d3SAndroid Build Coastguard Worker 153*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned char 154*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrrd_b(unsigned int _1)155*bed243d3SAndroid Build Coastguard Worker __iocsrrd_b(unsigned int _1) { 156*bed243d3SAndroid Build Coastguard Worker return (unsigned char)__builtin_loongarch_iocsrrd_b((unsigned int)_1); 157*bed243d3SAndroid Build Coastguard Worker } 158*bed243d3SAndroid Build Coastguard Worker 159*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned short 160*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrrd_h(unsigned int _1)161*bed243d3SAndroid Build Coastguard Worker __iocsrrd_h(unsigned int _1) { 162*bed243d3SAndroid Build Coastguard Worker return (unsigned short)__builtin_loongarch_iocsrrd_h((unsigned int)_1); 163*bed243d3SAndroid Build Coastguard Worker } 164*bed243d3SAndroid Build Coastguard Worker 165*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned int 166*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrrd_w(unsigned int _1)167*bed243d3SAndroid Build Coastguard Worker __iocsrrd_w(unsigned int _1) { 168*bed243d3SAndroid Build Coastguard Worker return (unsigned int)__builtin_loongarch_iocsrrd_w((unsigned int)_1); 169*bed243d3SAndroid Build Coastguard Worker } 170*bed243d3SAndroid Build Coastguard Worker 171*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 172*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned long int 173*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrrd_d(unsigned int _1)174*bed243d3SAndroid Build Coastguard Worker __iocsrrd_d(unsigned int _1) { 175*bed243d3SAndroid Build Coastguard Worker return (unsigned long int)__builtin_loongarch_iocsrrd_d((unsigned int)_1); 176*bed243d3SAndroid Build Coastguard Worker } 177*bed243d3SAndroid Build Coastguard Worker #endif 178*bed243d3SAndroid Build Coastguard Worker 179*bed243d3SAndroid Build Coastguard Worker extern __inline void 180*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrwr_b(unsigned char _1,unsigned int _2)181*bed243d3SAndroid Build Coastguard Worker __iocsrwr_b(unsigned char _1, unsigned int _2) { 182*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_iocsrwr_b((unsigned char)_1, (unsigned int)_2); 183*bed243d3SAndroid Build Coastguard Worker } 184*bed243d3SAndroid Build Coastguard Worker 185*bed243d3SAndroid Build Coastguard Worker extern __inline void 186*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrwr_h(unsigned short _1,unsigned int _2)187*bed243d3SAndroid Build Coastguard Worker __iocsrwr_h(unsigned short _1, unsigned int _2) { 188*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_iocsrwr_h((unsigned short)_1, (unsigned int)_2); 189*bed243d3SAndroid Build Coastguard Worker } 190*bed243d3SAndroid Build Coastguard Worker 191*bed243d3SAndroid Build Coastguard Worker extern __inline void 192*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrwr_w(unsigned int _1,unsigned int _2)193*bed243d3SAndroid Build Coastguard Worker __iocsrwr_w(unsigned int _1, unsigned int _2) { 194*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_iocsrwr_w((unsigned int)_1, (unsigned int)_2); 195*bed243d3SAndroid Build Coastguard Worker } 196*bed243d3SAndroid Build Coastguard Worker 197*bed243d3SAndroid Build Coastguard Worker extern __inline unsigned int 198*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __cpucfg(unsigned int _1)199*bed243d3SAndroid Build Coastguard Worker __cpucfg(unsigned int _1) { 200*bed243d3SAndroid Build Coastguard Worker return (unsigned int)__builtin_loongarch_cpucfg((unsigned int)_1); 201*bed243d3SAndroid Build Coastguard Worker } 202*bed243d3SAndroid Build Coastguard Worker 203*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 204*bed243d3SAndroid Build Coastguard Worker extern __inline void 205*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __iocsrwr_d(unsigned long int _1,unsigned int _2)206*bed243d3SAndroid Build Coastguard Worker __iocsrwr_d(unsigned long int _1, unsigned int _2) { 207*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_iocsrwr_d((unsigned long int)_1, (unsigned int)_2); 208*bed243d3SAndroid Build Coastguard Worker } 209*bed243d3SAndroid Build Coastguard Worker 210*bed243d3SAndroid Build Coastguard Worker extern __inline void 211*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __asrtgt_d(long int _1,long int _2)212*bed243d3SAndroid Build Coastguard Worker __asrtgt_d(long int _1, long int _2) { 213*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_asrtgt_d((long int)_1, (long int)_2); 214*bed243d3SAndroid Build Coastguard Worker } 215*bed243d3SAndroid Build Coastguard Worker 216*bed243d3SAndroid Build Coastguard Worker extern __inline void 217*bed243d3SAndroid Build Coastguard Worker __attribute__((__gnu_inline__, __always_inline__, __artificial__)) __asrtle_d(long int _1,long int _2)218*bed243d3SAndroid Build Coastguard Worker __asrtle_d(long int _1, long int _2) { 219*bed243d3SAndroid Build Coastguard Worker __builtin_loongarch_asrtle_d((long int)_1, (long int)_2); 220*bed243d3SAndroid Build Coastguard Worker } 221*bed243d3SAndroid Build Coastguard Worker #endif 222*bed243d3SAndroid Build Coastguard Worker 223*bed243d3SAndroid Build Coastguard Worker #if __loongarch_grlen == 64 224*bed243d3SAndroid Build Coastguard Worker #define __lddir_d(/*long int*/ _1, /*ui5*/ _2) \ 225*bed243d3SAndroid Build Coastguard Worker ((long int)__builtin_loongarch_lddir_d((long int)(_1), (_2))) 226*bed243d3SAndroid Build Coastguard Worker 227*bed243d3SAndroid Build Coastguard Worker #define __ldpte_d(/*long int*/ _1, /*ui5*/ _2) \ 228*bed243d3SAndroid Build Coastguard Worker ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2))) 229*bed243d3SAndroid Build Coastguard Worker #endif 230*bed243d3SAndroid Build Coastguard Worker 231*bed243d3SAndroid Build Coastguard Worker #define __frecipe_s(/*float*/ _1) \ 232*bed243d3SAndroid Build Coastguard Worker (float)__builtin_loongarch_frecipe_s((float)_1) 233*bed243d3SAndroid Build Coastguard Worker 234*bed243d3SAndroid Build Coastguard Worker #define __frecipe_d(/*double*/ _1) \ 235*bed243d3SAndroid Build Coastguard Worker (double)__builtin_loongarch_frecipe_d((double)_1) 236*bed243d3SAndroid Build Coastguard Worker 237*bed243d3SAndroid Build Coastguard Worker #define __frsqrte_s(/*float*/ _1) \ 238*bed243d3SAndroid Build Coastguard Worker (float)__builtin_loongarch_frsqrte_s((float)_1) 239*bed243d3SAndroid Build Coastguard Worker 240*bed243d3SAndroid Build Coastguard Worker #define __frsqrte_d(/*double*/ _1) \ 241*bed243d3SAndroid Build Coastguard Worker (double)__builtin_loongarch_frsqrte_d((double)_1) 242*bed243d3SAndroid Build Coastguard Worker 243*bed243d3SAndroid Build Coastguard Worker #ifdef __cplusplus 244*bed243d3SAndroid Build Coastguard Worker } 245*bed243d3SAndroid Build Coastguard Worker #endif 246*bed243d3SAndroid Build Coastguard Worker #endif /* _LOONGARCH_BASE_INTRIN_H */ 247