Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _ASM_IA64_INTEL_INTRIN_H |
| 2 | #define _ASM_IA64_INTEL_INTRIN_H |
| 3 | /* |
| 4 | * Intel Compiler Intrinsics |
| 5 | * |
| 6 | * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com> |
| 7 | * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com> |
| 8 | * |
| 9 | */ |
| 10 | #include <asm/types.h> |
| 11 | |
| 12 | void __lfetch(int lfhint, void *y); |
| 13 | void __lfetch_excl(int lfhint, void *y); |
| 14 | void __lfetch_fault(int lfhint, void *y); |
| 15 | void __lfetch_fault_excl(int lfhint, void *y); |
| 16 | |
| 17 | /* In the following, whichFloatReg should be an integer from 0-127 */ |
| 18 | void __ldfs(const int whichFloatReg, void *src); |
| 19 | void __ldfd(const int whichFloatReg, void *src); |
| 20 | void __ldfe(const int whichFloatReg, void *src); |
| 21 | void __ldf8(const int whichFloatReg, void *src); |
| 22 | void __ldf_fill(const int whichFloatReg, void *src); |
| 23 | void __stfs(void *dst, const int whichFloatReg); |
| 24 | void __stfd(void *dst, const int whichFloatReg); |
| 25 | void __stfe(void *dst, const int whichFloatReg); |
| 26 | void __stf8(void *dst, const int whichFloatReg); |
| 27 | void __stf_spill(void *dst, const int whichFloatReg); |
| 28 | |
| 29 | void __st1_rel(void *dst, const __s8 value); |
| 30 | void __st2_rel(void *dst, const __s16 value); |
| 31 | void __st4_rel(void *dst, const __s32 value); |
| 32 | void __st8_rel(void *dst, const __s64 value); |
| 33 | __u8 __ld1_acq(void *src); |
| 34 | __u16 __ld2_acq(void *src); |
| 35 | __u32 __ld4_acq(void *src); |
| 36 | __u64 __ld8_acq(void *src); |
| 37 | |
| 38 | __u64 __fetchadd4_acq(__u32 *addend, const int increment); |
| 39 | __u64 __fetchadd4_rel(__u32 *addend, const int increment); |
| 40 | __u64 __fetchadd8_acq(__u64 *addend, const int increment); |
| 41 | __u64 __fetchadd8_rel(__u64 *addend, const int increment); |
| 42 | |
| 43 | __u64 __getf_exp(double d); |
| 44 | |
| 45 | /* OS Related Itanium(R) Intrinsics */ |
| 46 | |
| 47 | /* The names to use for whichReg and whichIndReg below come from |
| 48 | the include file asm/ia64regs.h */ |
| 49 | |
| 50 | __u64 __getIndReg(const int whichIndReg, __s64 index); |
| 51 | __u64 __getReg(const int whichReg); |
| 52 | |
| 53 | void __setIndReg(const int whichIndReg, __s64 index, __u64 value); |
| 54 | void __setReg(const int whichReg, __u64 value); |
| 55 | |
| 56 | void __mf(void); |
| 57 | void __mfa(void); |
| 58 | void __synci(void); |
| 59 | void __itcd(__s64 pa); |
| 60 | void __itci(__s64 pa); |
| 61 | void __itrd(__s64 whichTransReg, __s64 pa); |
| 62 | void __itri(__s64 whichTransReg, __s64 pa); |
| 63 | void __ptce(__s64 va); |
| 64 | void __ptcl(__s64 va, __s64 pagesz); |
| 65 | void __ptcg(__s64 va, __s64 pagesz); |
| 66 | void __ptcga(__s64 va, __s64 pagesz); |
| 67 | void __ptri(__s64 va, __s64 pagesz); |
| 68 | void __ptrd(__s64 va, __s64 pagesz); |
| 69 | void __invala (void); |
| 70 | void __invala_gr(const int whichGeneralReg /* 0-127 */ ); |
| 71 | void __invala_fr(const int whichFloatReg /* 0-127 */ ); |
| 72 | void __nop(const int); |
| 73 | void __fc(__u64 *addr); |
| 74 | void __sum(int mask); |
| 75 | void __rum(int mask); |
| 76 | void __ssm(int mask); |
| 77 | void __rsm(int mask); |
| 78 | __u64 __thash(__s64); |
| 79 | __u64 __ttag(__s64); |
| 80 | __s64 __tpa(__s64); |
| 81 | |
| 82 | /* Intrinsics for implementing get/put_user macros */ |
| 83 | void __st_user(const char *tableName, __u64 addr, char size, char relocType, __u64 val); |
| 84 | void __ld_user(const char *tableName, __u64 addr, char size, char relocType); |
| 85 | |
| 86 | /* This intrinsic does not generate code, it creates a barrier across which |
| 87 | * the compiler will not schedule data access instructions. |
| 88 | */ |
| 89 | void __memory_barrier(void); |
| 90 | |
| 91 | void __isrlz(void); |
| 92 | void __dsrlz(void); |
| 93 | |
| 94 | __u64 _m64_mux1(__u64 a, const int n); |
| 95 | __u64 __thash(__u64); |
| 96 | |
| 97 | /* Lock and Atomic Operation Related Intrinsics */ |
| 98 | __u64 _InterlockedExchange8(volatile __u8 *trgt, __u8 value); |
| 99 | __u64 _InterlockedExchange16(volatile __u16 *trgt, __u16 value); |
| 100 | __s64 _InterlockedExchange(volatile __u32 *trgt, __u32 value); |
| 101 | __s64 _InterlockedExchange64(volatile __u64 *trgt, __u64 value); |
| 102 | |
| 103 | __u64 _InterlockedCompareExchange8_rel(volatile __u8 *dest, __u64 xchg, __u64 comp); |
| 104 | __u64 _InterlockedCompareExchange8_acq(volatile __u8 *dest, __u64 xchg, __u64 comp); |
| 105 | __u64 _InterlockedCompareExchange16_rel(volatile __u16 *dest, __u64 xchg, __u64 comp); |
| 106 | __u64 _InterlockedCompareExchange16_acq(volatile __u16 *dest, __u64 xchg, __u64 comp); |
| 107 | __u64 _InterlockedCompareExchange_rel(volatile __u32 *dest, __u64 xchg, __u64 comp); |
| 108 | __u64 _InterlockedCompareExchange_acq(volatile __u32 *dest, __u64 xchg, __u64 comp); |
| 109 | __u64 _InterlockedCompareExchange64_rel(volatile __u64 *dest, __u64 xchg, __u64 comp); |
| 110 | __u64 _InterlockedCompareExchange64_acq(volatile __u64 *dest, __u64 xchg, __u64 comp); |
| 111 | |
| 112 | __s64 _m64_dep_mi(const int v, __s64 s, const int p, const int len); |
| 113 | __s64 _m64_shrp(__s64 a, __s64 b, const int count); |
| 114 | __s64 _m64_popcnt(__s64 a); |
| 115 | |
| 116 | #define ia64_barrier() __memory_barrier() |
| 117 | |
| 118 | #define ia64_stop() /* Nothing: As of now stop bit is generated for each |
| 119 | * intrinsic |
| 120 | */ |
| 121 | |
| 122 | #define ia64_getreg __getReg |
| 123 | #define ia64_setreg __setReg |
| 124 | |
| 125 | #define ia64_hint(x) |
| 126 | |
| 127 | #define ia64_mux1_brcst 0 |
| 128 | #define ia64_mux1_mix 8 |
| 129 | #define ia64_mux1_shuf 9 |
| 130 | #define ia64_mux1_alt 10 |
| 131 | #define ia64_mux1_rev 11 |
| 132 | |
| 133 | #define ia64_mux1 _m64_mux1 |
| 134 | #define ia64_popcnt _m64_popcnt |
| 135 | #define ia64_getf_exp __getf_exp |
| 136 | #define ia64_shrp _m64_shrp |
| 137 | |
| 138 | #define ia64_tpa __tpa |
| 139 | #define ia64_invala __invala |
| 140 | #define ia64_invala_gr __invala_gr |
| 141 | #define ia64_invala_fr __invala_fr |
| 142 | #define ia64_nop __nop |
| 143 | #define ia64_sum __sum |
| 144 | #define ia64_ssm __ssm |
| 145 | #define ia64_rum __rum |
| 146 | #define ia64_rsm __rsm |
| 147 | #define ia64_fc __fc |
| 148 | |
| 149 | #define ia64_ldfs __ldfs |
| 150 | #define ia64_ldfd __ldfd |
| 151 | #define ia64_ldfe __ldfe |
| 152 | #define ia64_ldf8 __ldf8 |
| 153 | #define ia64_ldf_fill __ldf_fill |
| 154 | |
| 155 | #define ia64_stfs __stfs |
| 156 | #define ia64_stfd __stfd |
| 157 | #define ia64_stfe __stfe |
| 158 | #define ia64_stf8 __stf8 |
| 159 | #define ia64_stf_spill __stf_spill |
| 160 | |
| 161 | #define ia64_mf __mf |
| 162 | #define ia64_mfa __mfa |
| 163 | |
| 164 | #define ia64_fetchadd4_acq __fetchadd4_acq |
| 165 | #define ia64_fetchadd4_rel __fetchadd4_rel |
| 166 | #define ia64_fetchadd8_acq __fetchadd8_acq |
| 167 | #define ia64_fetchadd8_rel __fetchadd8_rel |
| 168 | |
| 169 | #define ia64_xchg1 _InterlockedExchange8 |
| 170 | #define ia64_xchg2 _InterlockedExchange16 |
| 171 | #define ia64_xchg4 _InterlockedExchange |
| 172 | #define ia64_xchg8 _InterlockedExchange64 |
| 173 | |
| 174 | #define ia64_cmpxchg1_rel _InterlockedCompareExchange8_rel |
| 175 | #define ia64_cmpxchg1_acq _InterlockedCompareExchange8_acq |
| 176 | #define ia64_cmpxchg2_rel _InterlockedCompareExchange16_rel |
| 177 | #define ia64_cmpxchg2_acq _InterlockedCompareExchange16_acq |
| 178 | #define ia64_cmpxchg4_rel _InterlockedCompareExchange_rel |
| 179 | #define ia64_cmpxchg4_acq _InterlockedCompareExchange_acq |
| 180 | #define ia64_cmpxchg8_rel _InterlockedCompareExchange64_rel |
| 181 | #define ia64_cmpxchg8_acq _InterlockedCompareExchange64_acq |
| 182 | |
| 183 | #define __ia64_set_dbr(index, val) \ |
| 184 | __setIndReg(_IA64_REG_INDR_DBR, index, val) |
| 185 | #define ia64_set_ibr(index, val) \ |
| 186 | __setIndReg(_IA64_REG_INDR_IBR, index, val) |
| 187 | #define ia64_set_pkr(index, val) \ |
| 188 | __setIndReg(_IA64_REG_INDR_PKR, index, val) |
| 189 | #define ia64_set_pmc(index, val) \ |
| 190 | __setIndReg(_IA64_REG_INDR_PMC, index, val) |
| 191 | #define ia64_set_pmd(index, val) \ |
| 192 | __setIndReg(_IA64_REG_INDR_PMD, index, val) |
| 193 | #define ia64_set_rr(index, val) \ |
| 194 | __setIndReg(_IA64_REG_INDR_RR, index, val) |
| 195 | |
| 196 | #define ia64_get_cpuid(index) __getIndReg(_IA64_REG_INDR_CPUID, index) |
| 197 | #define __ia64_get_dbr(index) __getIndReg(_IA64_REG_INDR_DBR, index) |
| 198 | #define ia64_get_ibr(index) __getIndReg(_IA64_REG_INDR_IBR, index) |
| 199 | #define ia64_get_pkr(index) __getIndReg(_IA64_REG_INDR_PKR, index) |
| 200 | #define ia64_get_pmc(index) __getIndReg(_IA64_REG_INDR_PMC, index) |
| 201 | #define ia64_get_pmd(index) __getIndReg(_IA64_REG_INDR_PMD, index) |
| 202 | #define ia64_get_rr(index) __getIndReg(_IA64_REG_INDR_RR, index) |
| 203 | |
| 204 | #define ia64_srlz_d __dsrlz |
| 205 | #define ia64_srlz_i __isrlz |
| 206 | |
| 207 | #define ia64_dv_serialize_data() |
| 208 | #define ia64_dv_serialize_instruction() |
| 209 | |
| 210 | #define ia64_st1_rel __st1_rel |
| 211 | #define ia64_st2_rel __st2_rel |
| 212 | #define ia64_st4_rel __st4_rel |
| 213 | #define ia64_st8_rel __st8_rel |
| 214 | |
| 215 | #define ia64_ld1_acq __ld1_acq |
| 216 | #define ia64_ld2_acq __ld2_acq |
| 217 | #define ia64_ld4_acq __ld4_acq |
| 218 | #define ia64_ld8_acq __ld8_acq |
| 219 | |
| 220 | #define ia64_sync_i __synci |
| 221 | #define ia64_thash __thash |
| 222 | #define ia64_ttag __ttag |
| 223 | #define ia64_itcd __itcd |
| 224 | #define ia64_itci __itci |
| 225 | #define ia64_itrd __itrd |
| 226 | #define ia64_itri __itri |
| 227 | #define ia64_ptce __ptce |
| 228 | #define ia64_ptcl __ptcl |
| 229 | #define ia64_ptcg __ptcg |
| 230 | #define ia64_ptcga __ptcga |
| 231 | #define ia64_ptri __ptri |
| 232 | #define ia64_ptrd __ptrd |
| 233 | #define ia64_dep_mi _m64_dep_mi |
| 234 | |
| 235 | /* Values for lfhint in __lfetch and __lfetch_fault */ |
| 236 | |
| 237 | #define ia64_lfhint_none 0 |
| 238 | #define ia64_lfhint_nt1 1 |
| 239 | #define ia64_lfhint_nt2 2 |
| 240 | #define ia64_lfhint_nta 3 |
| 241 | |
| 242 | #define ia64_lfetch __lfetch |
| 243 | #define ia64_lfetch_excl __lfetch_excl |
| 244 | #define ia64_lfetch_fault __lfetch_fault |
| 245 | #define ia64_lfetch_fault_excl __lfetch_fault_excl |
| 246 | |
| 247 | #define ia64_intrin_local_irq_restore(x) \ |
| 248 | do { \ |
| 249 | if ((x) != 0) { \ |
| 250 | ia64_ssm(IA64_PSR_I); \ |
| 251 | ia64_srlz_d(); \ |
| 252 | } else { \ |
| 253 | ia64_rsm(IA64_PSR_I); \ |
| 254 | } \ |
| 255 | } while (0) |
| 256 | |
| 257 | #endif /* _ASM_IA64_INTEL_INTRIN_H */ |