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