linux/arch/ia64/include/uapi/asm/gcc_intrin.h
<<
>>
Prefs
   1/*
   2 *
   3 * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
   4 * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
   5 */
   6#ifndef _UAPI_ASM_IA64_GCC_INTRIN_H
   7#define _UAPI_ASM_IA64_GCC_INTRIN_H
   8
   9#include <linux/types.h>
  10#include <linux/compiler.h>
  11
  12/* define this macro to get some asm stmts included in 'c' files */
  13#define ASM_SUPPORTED
  14
  15/* Optimization barrier */
  16/* The "volatile" is due to gcc bugs */
  17#define ia64_barrier()  asm volatile ("":::"memory")
  18
  19#define ia64_stop()     asm volatile (";;"::)
  20
  21#define ia64_invala_gr(regnum)  asm volatile ("invala.e r%0" :: "i"(regnum))
  22
  23#define ia64_invala_fr(regnum)  asm volatile ("invala.e f%0" :: "i"(regnum))
  24
  25#define ia64_flushrs() asm volatile ("flushrs;;":::"memory")
  26
  27#define ia64_loadrs() asm volatile ("loadrs;;":::"memory")
  28
  29extern void ia64_bad_param_for_setreg (void);
  30extern void ia64_bad_param_for_getreg (void);
  31
  32
  33#define ia64_native_setreg(regnum, val)                                         \
  34({                                                                              \
  35        switch (regnum) {                                                       \
  36            case _IA64_REG_PSR_L:                                               \
  37                    asm volatile ("mov psr.l=%0" :: "r"(val) : "memory");       \
  38                    break;                                                      \
  39            case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:                          \
  40                    asm volatile ("mov ar%0=%1" ::                              \
  41                                          "i" (regnum - _IA64_REG_AR_KR0),      \
  42                                          "r"(val): "memory");                  \
  43                    break;                                                      \
  44            case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:                        \
  45                    asm volatile ("mov cr%0=%1" ::                              \
  46                                          "i" (regnum - _IA64_REG_CR_DCR),      \
  47                                          "r"(val): "memory" );                 \
  48                    break;                                                      \
  49            case _IA64_REG_SP:                                                  \
  50                    asm volatile ("mov r12=%0" ::                               \
  51                                          "r"(val): "memory");                  \
  52                    break;                                                      \
  53            case _IA64_REG_GP:                                                  \
  54                    asm volatile ("mov gp=%0" :: "r"(val) : "memory");          \
  55                break;                                                          \
  56            default:                                                            \
  57                    ia64_bad_param_for_setreg();                                \
  58                    break;                                                      \
  59        }                                                                       \
  60})
  61
  62#define ia64_native_getreg(regnum)                                              \
  63({                                                                              \
  64        __u64 ia64_intri_res;                                                   \
  65                                                                                \
  66        switch (regnum) {                                                       \
  67        case _IA64_REG_GP:                                                      \
  68                asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));              \
  69                break;                                                          \
  70        case _IA64_REG_IP:                                                      \
  71                asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));              \
  72                break;                                                          \
  73        case _IA64_REG_PSR:                                                     \
  74                asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));             \
  75                break;                                                          \
  76        case _IA64_REG_TP:      /* for current() */                             \
  77                ia64_intri_res = ia64_r13;                                      \
  78                break;                                                          \
  79        case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:                              \
  80                asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)             \
  81                                      : "i"(regnum - _IA64_REG_AR_KR0));        \
  82                break;                                                          \
  83        case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:                            \
  84                asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)             \
  85                                      : "i" (regnum - _IA64_REG_CR_DCR));       \
  86                break;                                                          \
  87        case _IA64_REG_SP:                                                      \
  88                asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));             \
  89                break;                                                          \
  90        default:                                                                \
  91                ia64_bad_param_for_getreg();                                    \
  92                break;                                                          \
  93        }                                                                       \
  94        ia64_intri_res;                                                         \
  95})
  96
  97#define ia64_hint_pause 0
  98
  99#define ia64_hint(mode)                                         \
 100({                                                              \
 101        switch (mode) {                                         \
 102        case ia64_hint_pause:                                   \
 103                asm volatile ("hint @pause" ::: "memory");      \
 104                break;                                          \
 105        }                                                       \
 106})
 107
 108
 109/* Integer values for mux1 instruction */
 110#define ia64_mux1_brcst 0
 111#define ia64_mux1_mix   8
 112#define ia64_mux1_shuf  9
 113#define ia64_mux1_alt  10
 114#define ia64_mux1_rev  11
 115
 116#define ia64_mux1(x, mode)                                                      \
 117({                                                                              \
 118        __u64 ia64_intri_res;                                                   \
 119                                                                                \
 120        switch (mode) {                                                         \
 121        case ia64_mux1_brcst:                                                   \
 122                asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x));    \
 123                break;                                                          \
 124        case ia64_mux1_mix:                                                     \
 125                asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x));      \
 126                break;                                                          \
 127        case ia64_mux1_shuf:                                                    \
 128                asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x));     \
 129                break;                                                          \
 130        case ia64_mux1_alt:                                                     \
 131                asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x));      \
 132                break;                                                          \
 133        case ia64_mux1_rev:                                                     \
 134                asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x));      \
 135                break;                                                          \
 136        }                                                                       \
 137        ia64_intri_res;                                                         \
 138})
 139
 140#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
 141# define ia64_popcnt(x)         __builtin_popcountl(x)
 142#else
 143# define ia64_popcnt(x)                                         \
 144  ({                                                            \
 145        __u64 ia64_intri_res;                                   \
 146        asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \
 147                                                                \
 148        ia64_intri_res;                                         \
 149  })
 150#endif
 151
 152#define ia64_getf_exp(x)                                        \
 153({                                                              \
 154        long ia64_intri_res;                                    \
 155                                                                \
 156        asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x)); \
 157                                                                \
 158        ia64_intri_res;                                         \
 159})
 160
 161#define ia64_shrp(a, b, count)                                                          \
 162({                                                                                      \
 163        __u64 ia64_intri_res;                                                           \
 164        asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count));   \
 165        ia64_intri_res;                                                                 \
 166})
 167
 168#define ia64_ldfs(regnum, x)                                    \
 169({                                                              \
 170        register double __f__ asm ("f"#regnum);                 \
 171        asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x));     \
 172})
 173
 174#define ia64_ldfd(regnum, x)                                    \
 175({                                                              \
 176        register double __f__ asm ("f"#regnum);                 \
 177        asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x));     \
 178})
 179
 180#define ia64_ldfe(regnum, x)                                    \
 181({                                                              \
 182        register double __f__ asm ("f"#regnum);                 \
 183        asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x));     \
 184})
 185
 186#define ia64_ldf8(regnum, x)                                    \
 187({                                                              \
 188        register double __f__ asm ("f"#regnum);                 \
 189        asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x));     \
 190})
 191
 192#define ia64_ldf_fill(regnum, x)                                \
 193({                                                              \
 194        register double __f__ asm ("f"#regnum);                 \
 195        asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x)); \
 196})
 197
 198#define ia64_st4_rel_nta(m, val)                                        \
 199({                                                                      \
 200        asm volatile ("st4.rel.nta [%0] = %1\n\t" :: "r"(m), "r"(val)); \
 201})
 202
 203#define ia64_stfs(x, regnum)                                            \
 204({                                                                      \
 205        register double __f__ asm ("f"#regnum);                         \
 206        asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
 207})
 208
 209#define ia64_stfd(x, regnum)                                            \
 210({                                                                      \
 211        register double __f__ asm ("f"#regnum);                         \
 212        asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
 213})
 214
 215#define ia64_stfe(x, regnum)                                            \
 216({                                                                      \
 217        register double __f__ asm ("f"#regnum);                         \
 218        asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
 219})
 220
 221#define ia64_stf8(x, regnum)                                            \
 222({                                                                      \
 223        register double __f__ asm ("f"#regnum);                         \
 224        asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
 225})
 226
 227#define ia64_stf_spill(x, regnum)                                               \
 228({                                                                              \
 229        register double __f__ asm ("f"#regnum);                                 \
 230        asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory");    \
 231})
 232
 233#define ia64_fetchadd4_acq(p, inc)                                              \
 234({                                                                              \
 235                                                                                \
 236        __u64 ia64_intri_res;                                                   \
 237        asm volatile ("fetchadd4.acq %0=[%1],%2"                                \
 238                                : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
 239                                : "memory");                                    \
 240                                                                                \
 241        ia64_intri_res;                                                         \
 242})
 243
 244#define ia64_fetchadd4_rel(p, inc)                                              \
 245({                                                                              \
 246        __u64 ia64_intri_res;                                                   \
 247        asm volatile ("fetchadd4.rel %0=[%1],%2"                                \
 248                                : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
 249                                : "memory");                                    \
 250                                                                                \
 251        ia64_intri_res;                                                         \
 252})
 253
 254#define ia64_fetchadd8_acq(p, inc)                                              \
 255({                                                                              \
 256                                                                                \
 257        __u64 ia64_intri_res;                                                   \
 258        asm volatile ("fetchadd8.acq %0=[%1],%2"                                \
 259                                : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
 260                                : "memory");                                    \
 261                                                                                \
 262        ia64_intri_res;                                                         \
 263})
 264
 265#define ia64_fetchadd8_rel(p, inc)                                              \
 266({                                                                              \
 267        __u64 ia64_intri_res;                                                   \
 268        asm volatile ("fetchadd8.rel %0=[%1],%2"                                \
 269                                : "=r"(ia64_intri_res) : "r"(p), "i" (inc)      \
 270                                : "memory");                                    \
 271                                                                                \
 272        ia64_intri_res;                                                         \
 273})
 274
 275#define ia64_xchg1(ptr,x)                                                       \
 276({                                                                              \
 277        __u64 ia64_intri_res;                                                   \
 278        asm volatile ("xchg1 %0=[%1],%2"                                        \
 279                      : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory"); \
 280        ia64_intri_res;                                                         \
 281})
 282
 283#define ia64_xchg2(ptr,x)                                               \
 284({                                                                      \
 285        __u64 ia64_intri_res;                                           \
 286        asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res)        \
 287                      : "r" (ptr), "r" (x) : "memory");                 \
 288        ia64_intri_res;                                                 \
 289})
 290
 291#define ia64_xchg4(ptr,x)                                               \
 292({                                                                      \
 293        __u64 ia64_intri_res;                                           \
 294        asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res)        \
 295                      : "r" (ptr), "r" (x) : "memory");                 \
 296        ia64_intri_res;                                                 \
 297})
 298
 299#define ia64_xchg8(ptr,x)                                               \
 300({                                                                      \
 301        __u64 ia64_intri_res;                                           \
 302        asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res)        \
 303                      : "r" (ptr), "r" (x) : "memory");                 \
 304        ia64_intri_res;                                                 \
 305})
 306
 307#define ia64_cmpxchg1_acq(ptr, new, old)                                                \
 308({                                                                                      \
 309        __u64 ia64_intri_res;                                                           \
 310        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 311        asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":                                 \
 312                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 313        ia64_intri_res;                                                                 \
 314})
 315
 316#define ia64_cmpxchg1_rel(ptr, new, old)                                                \
 317({                                                                                      \
 318        __u64 ia64_intri_res;                                                           \
 319        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 320        asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":                                 \
 321                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 322        ia64_intri_res;                                                                 \
 323})
 324
 325#define ia64_cmpxchg2_acq(ptr, new, old)                                                \
 326({                                                                                      \
 327        __u64 ia64_intri_res;                                                           \
 328        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 329        asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":                                 \
 330                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 331        ia64_intri_res;                                                                 \
 332})
 333
 334#define ia64_cmpxchg2_rel(ptr, new, old)                                                \
 335({                                                                                      \
 336        __u64 ia64_intri_res;                                                           \
 337        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 338                                                                                        \
 339        asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":                                 \
 340                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 341        ia64_intri_res;                                                                 \
 342})
 343
 344#define ia64_cmpxchg4_acq(ptr, new, old)                                                \
 345({                                                                                      \
 346        __u64 ia64_intri_res;                                                           \
 347        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 348        asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":                                 \
 349                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 350        ia64_intri_res;                                                                 \
 351})
 352
 353#define ia64_cmpxchg4_rel(ptr, new, old)                                                \
 354({                                                                                      \
 355        __u64 ia64_intri_res;                                                           \
 356        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 357        asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":                                 \
 358                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 359        ia64_intri_res;                                                                 \
 360})
 361
 362#define ia64_cmpxchg8_acq(ptr, new, old)                                                \
 363({                                                                                      \
 364        __u64 ia64_intri_res;                                                           \
 365        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 366        asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":                                 \
 367                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 368        ia64_intri_res;                                                                 \
 369})
 370
 371#define ia64_cmpxchg8_rel(ptr, new, old)                                                \
 372({                                                                                      \
 373        __u64 ia64_intri_res;                                                           \
 374        asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
 375                                                                                        \
 376        asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":                                 \
 377                              "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
 378        ia64_intri_res;                                                                 \
 379})
 380
 381#define ia64_mf()       asm volatile ("mf" ::: "memory")
 382#define ia64_mfa()      asm volatile ("mf.a" ::: "memory")
 383
 384#define ia64_invala() asm volatile ("invala" ::: "memory")
 385
 386#define ia64_native_thash(addr)                                                 \
 387({                                                                              \
 388        unsigned long ia64_intri_res;                                           \
 389        asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr));       \
 390        ia64_intri_res;                                                         \
 391})
 392
 393#define ia64_srlz_i()   asm volatile (";; srlz.i ;;" ::: "memory")
 394#define ia64_srlz_d()   asm volatile (";; srlz.d" ::: "memory");
 395
 396#ifdef HAVE_SERIALIZE_DIRECTIVE
 397# define ia64_dv_serialize_data()               asm volatile (".serialize.data");
 398# define ia64_dv_serialize_instruction()        asm volatile (".serialize.instruction");
 399#else
 400# define ia64_dv_serialize_data()
 401# define ia64_dv_serialize_instruction()
 402#endif
 403
 404#define ia64_nop(x)     asm volatile ("nop %0"::"i"(x));
 405
 406#define ia64_itci(addr) asm volatile ("itc.i %0;;" :: "r"(addr) : "memory")
 407
 408#define ia64_itcd(addr) asm volatile ("itc.d %0;;" :: "r"(addr) : "memory")
 409
 410
 411#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1"                         \
 412                                             :: "r"(trnum), "r"(addr) : "memory")
 413
 414#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1"                         \
 415                                             :: "r"(trnum), "r"(addr) : "memory")
 416
 417#define ia64_tpa(addr)                                                          \
 418({                                                                              \
 419        unsigned long ia64_pa;                                                  \
 420        asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory");    \
 421        ia64_pa;                                                                \
 422})
 423
 424#define __ia64_set_dbr(index, val)                                              \
 425        asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory")
 426
 427#define ia64_set_ibr(index, val)                                                \
 428        asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory")
 429
 430#define ia64_set_pkr(index, val)                                                \
 431        asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory")
 432
 433#define ia64_set_pmc(index, val)                                                \
 434        asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory")
 435
 436#define ia64_set_pmd(index, val)                                                \
 437        asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory")
 438
 439#define ia64_native_set_rr(index, val)                                                  \
 440        asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
 441
 442#define ia64_native_get_cpuid(index)                                                    \
 443({                                                                                      \
 444        unsigned long ia64_intri_res;                                                   \
 445        asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index));        \
 446        ia64_intri_res;                                                                 \
 447})
 448
 449#define __ia64_get_dbr(index)                                                   \
 450({                                                                              \
 451        unsigned long ia64_intri_res;                                           \
 452        asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
 453        ia64_intri_res;                                                         \
 454})
 455
 456#define ia64_get_ibr(index)                                                     \
 457({                                                                              \
 458        unsigned long ia64_intri_res;                                           \
 459        asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
 460        ia64_intri_res;                                                         \
 461})
 462
 463#define ia64_get_pkr(index)                                                     \
 464({                                                                              \
 465        unsigned long ia64_intri_res;                                           \
 466        asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
 467        ia64_intri_res;                                                         \
 468})
 469
 470#define ia64_get_pmc(index)                                                     \
 471({                                                                              \
 472        unsigned long ia64_intri_res;                                           \
 473        asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
 474        ia64_intri_res;                                                         \
 475})
 476
 477
 478#define ia64_native_get_pmd(index)                                              \
 479({                                                                              \
 480        unsigned long ia64_intri_res;                                           \
 481        asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index));    \
 482        ia64_intri_res;                                                         \
 483})
 484
 485#define ia64_native_get_rr(index)                                               \
 486({                                                                              \
 487        unsigned long ia64_intri_res;                                           \
 488        asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index));    \
 489        ia64_intri_res;                                                         \
 490})
 491
 492#define ia64_native_fc(addr)    asm volatile ("fc %0" :: "r"(addr) : "memory")
 493
 494
 495#define ia64_sync_i()   asm volatile (";; sync.i" ::: "memory")
 496
 497#define ia64_native_ssm(mask)   asm volatile ("ssm %0":: "i"((mask)) : "memory")
 498#define ia64_native_rsm(mask)   asm volatile ("rsm %0":: "i"((mask)) : "memory")
 499#define ia64_sum(mask)  asm volatile ("sum %0":: "i"((mask)) : "memory")
 500#define ia64_rum(mask)  asm volatile ("rum %0":: "i"((mask)) : "memory")
 501
 502#define ia64_ptce(addr) asm volatile ("ptc.e %0" :: "r"(addr))
 503
 504#define ia64_native_ptcga(addr, size)                                           \
 505do {                                                                            \
 506        asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory");       \
 507        ia64_dv_serialize_data();                                               \
 508} while (0)
 509
 510#define ia64_ptcl(addr, size)                                                   \
 511do {                                                                            \
 512        asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory");        \
 513        ia64_dv_serialize_data();                                               \
 514} while (0)
 515
 516#define ia64_ptri(addr, size)                                           \
 517        asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory")
 518
 519#define ia64_ptrd(addr, size)                                           \
 520        asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory")
 521
 522#define ia64_ttag(addr)                                                 \
 523({                                                                        \
 524        __u64 ia64_intri_res;                                              \
 525        asm volatile ("ttag %0=%1" : "=r"(ia64_intri_res) : "r" (addr));   \
 526        ia64_intri_res;                                                  \
 527})
 528
 529
 530/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */
 531
 532#define ia64_lfhint_none   0
 533#define ia64_lfhint_nt1    1
 534#define ia64_lfhint_nt2    2
 535#define ia64_lfhint_nta    3
 536
 537#define ia64_lfetch(lfhint, y)                                  \
 538({                                                              \
 539        switch (lfhint) {                                       \
 540        case ia64_lfhint_none:                                  \
 541                asm volatile ("lfetch [%0]" : : "r"(y));        \
 542                break;                                          \
 543        case ia64_lfhint_nt1:                                   \
 544                asm volatile ("lfetch.nt1 [%0]" : : "r"(y));    \
 545                break;                                          \
 546        case ia64_lfhint_nt2:                                   \
 547                asm volatile ("lfetch.nt2 [%0]" : : "r"(y));    \
 548                break;                                          \
 549        case ia64_lfhint_nta:                                   \
 550                asm volatile ("lfetch.nta [%0]" : : "r"(y));    \
 551                break;                                          \
 552        }                                                       \
 553})
 554
 555#define ia64_lfetch_excl(lfhint, y)                                     \
 556({                                                                      \
 557        switch (lfhint) {                                               \
 558        case ia64_lfhint_none:                                          \
 559                asm volatile ("lfetch.excl [%0]" :: "r"(y));            \
 560                break;                                                  \
 561        case ia64_lfhint_nt1:                                           \
 562                asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y));        \
 563                break;                                                  \
 564        case ia64_lfhint_nt2:                                           \
 565                asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y));        \
 566                break;                                                  \
 567        case ia64_lfhint_nta:                                           \
 568                asm volatile ("lfetch.excl.nta [%0]" :: "r"(y));        \
 569                break;                                                  \
 570        }                                                               \
 571})
 572
 573#define ia64_lfetch_fault(lfhint, y)                                    \
 574({                                                                      \
 575        switch (lfhint) {                                               \
 576        case ia64_lfhint_none:                                          \
 577                asm volatile ("lfetch.fault [%0]" : : "r"(y));          \
 578                break;                                                  \
 579        case ia64_lfhint_nt1:                                           \
 580                asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y));      \
 581                break;                                                  \
 582        case ia64_lfhint_nt2:                                           \
 583                asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y));      \
 584                break;                                                  \
 585        case ia64_lfhint_nta:                                           \
 586                asm volatile ("lfetch.fault.nta [%0]" : : "r"(y));      \
 587                break;                                                  \
 588        }                                                               \
 589})
 590
 591#define ia64_lfetch_fault_excl(lfhint, y)                               \
 592({                                                                      \
 593        switch (lfhint) {                                               \
 594        case ia64_lfhint_none:                                          \
 595                asm volatile ("lfetch.fault.excl [%0]" :: "r"(y));      \
 596                break;                                                  \
 597        case ia64_lfhint_nt1:                                           \
 598                asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y));  \
 599                break;                                                  \
 600        case ia64_lfhint_nt2:                                           \
 601                asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y));  \
 602                break;                                                  \
 603        case ia64_lfhint_nta:                                           \
 604                asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y));  \
 605                break;                                                  \
 606        }                                                               \
 607})
 608
 609#define ia64_native_intrin_local_irq_restore(x)                 \
 610do {                                                            \
 611        asm volatile (";;   cmp.ne p6,p7=%0,r0;;"               \
 612                      "(p6) ssm psr.i;"                         \
 613                      "(p7) rsm psr.i;;"                        \
 614                      "(p6) srlz.d"                             \
 615                      :: "r"((x)) : "p6", "p7", "memory");      \
 616} while (0)
 617
 618#endif /* _UAPI_ASM_IA64_GCC_INTRIN_H */
 619