162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
562306a36Sopenharmony_ci * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef _UAPI_ASM_IA64_GCC_INTRIN_H
862306a36Sopenharmony_ci#define _UAPI_ASM_IA64_GCC_INTRIN_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci#include <linux/compiler.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* define this macro to get some asm stmts included in 'c' files */
1462306a36Sopenharmony_ci#define ASM_SUPPORTED
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Optimization barrier */
1762306a36Sopenharmony_ci/* The "volatile" is due to gcc bugs */
1862306a36Sopenharmony_ci#define ia64_barrier()	asm volatile ("":::"memory")
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define ia64_stop()	asm volatile (";;"::)
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define ia64_invala_gr(regnum)	asm volatile ("invala.e r%0" :: "i"(regnum))
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define ia64_invala_fr(regnum)	asm volatile ("invala.e f%0" :: "i"(regnum))
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define ia64_flushrs() asm volatile ("flushrs;;":::"memory")
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define ia64_loadrs() asm volatile ("loadrs;;":::"memory")
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciextern void ia64_bad_param_for_setreg (void);
3162306a36Sopenharmony_ciextern void ia64_bad_param_for_getreg (void);
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define ia64_setreg(regnum, val)						\
3562306a36Sopenharmony_ci({										\
3662306a36Sopenharmony_ci	switch (regnum) {							\
3762306a36Sopenharmony_ci	    case _IA64_REG_PSR_L:						\
3862306a36Sopenharmony_ci		    asm volatile ("mov psr.l=%0" :: "r"(val) : "memory");	\
3962306a36Sopenharmony_ci		    break;							\
4062306a36Sopenharmony_ci	    case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\
4162306a36Sopenharmony_ci		    asm volatile ("mov ar%0=%1" ::				\
4262306a36Sopenharmony_ci		    			  "i" (regnum - _IA64_REG_AR_KR0),	\
4362306a36Sopenharmony_ci					  "r"(val): "memory");			\
4462306a36Sopenharmony_ci		    break;							\
4562306a36Sopenharmony_ci	    case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:			\
4662306a36Sopenharmony_ci		    asm volatile ("mov cr%0=%1" ::				\
4762306a36Sopenharmony_ci				          "i" (regnum - _IA64_REG_CR_DCR),	\
4862306a36Sopenharmony_ci					  "r"(val): "memory" );			\
4962306a36Sopenharmony_ci		    break;							\
5062306a36Sopenharmony_ci	    case _IA64_REG_SP:							\
5162306a36Sopenharmony_ci		    asm volatile ("mov r12=%0" ::				\
5262306a36Sopenharmony_ci			    		  "r"(val): "memory");			\
5362306a36Sopenharmony_ci		    break;							\
5462306a36Sopenharmony_ci	    case _IA64_REG_GP:							\
5562306a36Sopenharmony_ci		    asm volatile ("mov gp=%0" :: "r"(val) : "memory");		\
5662306a36Sopenharmony_ci		break;								\
5762306a36Sopenharmony_ci	    default:								\
5862306a36Sopenharmony_ci		    ia64_bad_param_for_setreg();				\
5962306a36Sopenharmony_ci		    break;							\
6062306a36Sopenharmony_ci	}									\
6162306a36Sopenharmony_ci})
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define ia64_getreg(regnum)							\
6462306a36Sopenharmony_ci({										\
6562306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
6662306a36Sopenharmony_ci										\
6762306a36Sopenharmony_ci	switch (regnum) {							\
6862306a36Sopenharmony_ci	case _IA64_REG_GP:							\
6962306a36Sopenharmony_ci		asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));		\
7062306a36Sopenharmony_ci		break;								\
7162306a36Sopenharmony_ci	case _IA64_REG_IP:							\
7262306a36Sopenharmony_ci		asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));		\
7362306a36Sopenharmony_ci		break;								\
7462306a36Sopenharmony_ci	case _IA64_REG_PSR:							\
7562306a36Sopenharmony_ci		asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));		\
7662306a36Sopenharmony_ci		break;								\
7762306a36Sopenharmony_ci	case _IA64_REG_TP:	/* for current() */				\
7862306a36Sopenharmony_ci		ia64_intri_res = ia64_r13;					\
7962306a36Sopenharmony_ci		break;								\
8062306a36Sopenharmony_ci	case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\
8162306a36Sopenharmony_ci		asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)		\
8262306a36Sopenharmony_ci				      : "i"(regnum - _IA64_REG_AR_KR0));	\
8362306a36Sopenharmony_ci		break;								\
8462306a36Sopenharmony_ci	case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:				\
8562306a36Sopenharmony_ci		asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)		\
8662306a36Sopenharmony_ci				      : "i" (regnum - _IA64_REG_CR_DCR));	\
8762306a36Sopenharmony_ci		break;								\
8862306a36Sopenharmony_ci	case _IA64_REG_SP:							\
8962306a36Sopenharmony_ci		asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));		\
9062306a36Sopenharmony_ci		break;								\
9162306a36Sopenharmony_ci	default:								\
9262306a36Sopenharmony_ci		ia64_bad_param_for_getreg();					\
9362306a36Sopenharmony_ci		break;								\
9462306a36Sopenharmony_ci	}									\
9562306a36Sopenharmony_ci	ia64_intri_res;								\
9662306a36Sopenharmony_ci})
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#define ia64_hint_pause 0
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#define ia64_hint(mode)						\
10162306a36Sopenharmony_ci({								\
10262306a36Sopenharmony_ci	switch (mode) {						\
10362306a36Sopenharmony_ci	case ia64_hint_pause:					\
10462306a36Sopenharmony_ci		asm volatile ("hint @pause" ::: "memory");	\
10562306a36Sopenharmony_ci		break;						\
10662306a36Sopenharmony_ci	}							\
10762306a36Sopenharmony_ci})
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/* Integer values for mux1 instruction */
11162306a36Sopenharmony_ci#define ia64_mux1_brcst 0
11262306a36Sopenharmony_ci#define ia64_mux1_mix   8
11362306a36Sopenharmony_ci#define ia64_mux1_shuf  9
11462306a36Sopenharmony_ci#define ia64_mux1_alt  10
11562306a36Sopenharmony_ci#define ia64_mux1_rev  11
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define ia64_mux1(x, mode)							\
11862306a36Sopenharmony_ci({										\
11962306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
12062306a36Sopenharmony_ci										\
12162306a36Sopenharmony_ci	switch (mode) {								\
12262306a36Sopenharmony_ci	case ia64_mux1_brcst:							\
12362306a36Sopenharmony_ci		asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x));	\
12462306a36Sopenharmony_ci		break;								\
12562306a36Sopenharmony_ci	case ia64_mux1_mix:							\
12662306a36Sopenharmony_ci		asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x));	\
12762306a36Sopenharmony_ci		break;								\
12862306a36Sopenharmony_ci	case ia64_mux1_shuf:							\
12962306a36Sopenharmony_ci		asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x));	\
13062306a36Sopenharmony_ci		break;								\
13162306a36Sopenharmony_ci	case ia64_mux1_alt:							\
13262306a36Sopenharmony_ci		asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x));	\
13362306a36Sopenharmony_ci		break;								\
13462306a36Sopenharmony_ci	case ia64_mux1_rev:							\
13562306a36Sopenharmony_ci		asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x));	\
13662306a36Sopenharmony_ci		break;								\
13762306a36Sopenharmony_ci	}									\
13862306a36Sopenharmony_ci	ia64_intri_res;								\
13962306a36Sopenharmony_ci})
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
14262306a36Sopenharmony_ci# define ia64_popcnt(x)		__builtin_popcountl(x)
14362306a36Sopenharmony_ci#else
14462306a36Sopenharmony_ci# define ia64_popcnt(x)						\
14562306a36Sopenharmony_ci  ({								\
14662306a36Sopenharmony_ci	__u64 ia64_intri_res;					\
14762306a36Sopenharmony_ci	asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x));	\
14862306a36Sopenharmony_ci								\
14962306a36Sopenharmony_ci	ia64_intri_res;						\
15062306a36Sopenharmony_ci  })
15162306a36Sopenharmony_ci#endif
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define ia64_getf_exp(x)					\
15462306a36Sopenharmony_ci({								\
15562306a36Sopenharmony_ci	long ia64_intri_res;					\
15662306a36Sopenharmony_ci								\
15762306a36Sopenharmony_ci	asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x));	\
15862306a36Sopenharmony_ci								\
15962306a36Sopenharmony_ci	ia64_intri_res;						\
16062306a36Sopenharmony_ci})
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci#define ia64_shrp(a, b, count)								\
16362306a36Sopenharmony_ci({											\
16462306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
16562306a36Sopenharmony_ci	asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count));	\
16662306a36Sopenharmony_ci	ia64_intri_res;									\
16762306a36Sopenharmony_ci})
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#define ia64_ldfs(regnum, x)					\
17062306a36Sopenharmony_ci({								\
17162306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);			\
17262306a36Sopenharmony_ci	asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x));	\
17362306a36Sopenharmony_ci})
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#define ia64_ldfd(regnum, x)					\
17662306a36Sopenharmony_ci({								\
17762306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);			\
17862306a36Sopenharmony_ci	asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x));	\
17962306a36Sopenharmony_ci})
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci#define ia64_ldfe(regnum, x)					\
18262306a36Sopenharmony_ci({								\
18362306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);			\
18462306a36Sopenharmony_ci	asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x));	\
18562306a36Sopenharmony_ci})
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci#define ia64_ldf8(regnum, x)					\
18862306a36Sopenharmony_ci({								\
18962306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);			\
19062306a36Sopenharmony_ci	asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x));	\
19162306a36Sopenharmony_ci})
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#define ia64_ldf_fill(regnum, x)				\
19462306a36Sopenharmony_ci({								\
19562306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);			\
19662306a36Sopenharmony_ci	asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x));	\
19762306a36Sopenharmony_ci})
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci#define ia64_st4_rel_nta(m, val)					\
20062306a36Sopenharmony_ci({									\
20162306a36Sopenharmony_ci	asm volatile ("st4.rel.nta [%0] = %1\n\t" :: "r"(m), "r"(val));	\
20262306a36Sopenharmony_ci})
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci#define ia64_stfs(x, regnum)						\
20562306a36Sopenharmony_ci({									\
20662306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);				\
20762306a36Sopenharmony_ci	asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\
20862306a36Sopenharmony_ci})
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci#define ia64_stfd(x, regnum)						\
21162306a36Sopenharmony_ci({									\
21262306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);				\
21362306a36Sopenharmony_ci	asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\
21462306a36Sopenharmony_ci})
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci#define ia64_stfe(x, regnum)						\
21762306a36Sopenharmony_ci({									\
21862306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);				\
21962306a36Sopenharmony_ci	asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\
22062306a36Sopenharmony_ci})
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci#define ia64_stf8(x, regnum)						\
22362306a36Sopenharmony_ci({									\
22462306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);				\
22562306a36Sopenharmony_ci	asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\
22662306a36Sopenharmony_ci})
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci#define ia64_stf_spill(x, regnum)						\
22962306a36Sopenharmony_ci({										\
23062306a36Sopenharmony_ci	register double __f__ asm ("f"#regnum);					\
23162306a36Sopenharmony_ci	asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\
23262306a36Sopenharmony_ci})
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci#define ia64_fetchadd4_acq(p, inc)						\
23562306a36Sopenharmony_ci({										\
23662306a36Sopenharmony_ci										\
23762306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
23862306a36Sopenharmony_ci	asm volatile ("fetchadd4.acq %0=[%1],%2"				\
23962306a36Sopenharmony_ci				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\
24062306a36Sopenharmony_ci				: "memory");					\
24162306a36Sopenharmony_ci										\
24262306a36Sopenharmony_ci	ia64_intri_res;								\
24362306a36Sopenharmony_ci})
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci#define ia64_fetchadd4_rel(p, inc)						\
24662306a36Sopenharmony_ci({										\
24762306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
24862306a36Sopenharmony_ci	asm volatile ("fetchadd4.rel %0=[%1],%2"				\
24962306a36Sopenharmony_ci				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\
25062306a36Sopenharmony_ci				: "memory");					\
25162306a36Sopenharmony_ci										\
25262306a36Sopenharmony_ci	ia64_intri_res;								\
25362306a36Sopenharmony_ci})
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci#define ia64_fetchadd8_acq(p, inc)						\
25662306a36Sopenharmony_ci({										\
25762306a36Sopenharmony_ci										\
25862306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
25962306a36Sopenharmony_ci	asm volatile ("fetchadd8.acq %0=[%1],%2"				\
26062306a36Sopenharmony_ci				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\
26162306a36Sopenharmony_ci				: "memory");					\
26262306a36Sopenharmony_ci										\
26362306a36Sopenharmony_ci	ia64_intri_res;								\
26462306a36Sopenharmony_ci})
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci#define ia64_fetchadd8_rel(p, inc)						\
26762306a36Sopenharmony_ci({										\
26862306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
26962306a36Sopenharmony_ci	asm volatile ("fetchadd8.rel %0=[%1],%2"				\
27062306a36Sopenharmony_ci				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\
27162306a36Sopenharmony_ci				: "memory");					\
27262306a36Sopenharmony_ci										\
27362306a36Sopenharmony_ci	ia64_intri_res;								\
27462306a36Sopenharmony_ci})
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci#define ia64_xchg1(ptr,x)							\
27762306a36Sopenharmony_ci({										\
27862306a36Sopenharmony_ci	__u64 ia64_intri_res;							\
27962306a36Sopenharmony_ci	asm volatile ("xchg1 %0=[%1],%2"					\
28062306a36Sopenharmony_ci		      : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory");	\
28162306a36Sopenharmony_ci	ia64_intri_res;								\
28262306a36Sopenharmony_ci})
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci#define ia64_xchg2(ptr,x)						\
28562306a36Sopenharmony_ci({									\
28662306a36Sopenharmony_ci	__u64 ia64_intri_res;						\
28762306a36Sopenharmony_ci	asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res)	\
28862306a36Sopenharmony_ci		      : "r" (ptr), "r" (x) : "memory");			\
28962306a36Sopenharmony_ci	ia64_intri_res;							\
29062306a36Sopenharmony_ci})
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci#define ia64_xchg4(ptr,x)						\
29362306a36Sopenharmony_ci({									\
29462306a36Sopenharmony_ci	__u64 ia64_intri_res;						\
29562306a36Sopenharmony_ci	asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res)	\
29662306a36Sopenharmony_ci		      : "r" (ptr), "r" (x) : "memory");			\
29762306a36Sopenharmony_ci	ia64_intri_res;							\
29862306a36Sopenharmony_ci})
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci#define ia64_xchg8(ptr,x)						\
30162306a36Sopenharmony_ci({									\
30262306a36Sopenharmony_ci	__u64 ia64_intri_res;						\
30362306a36Sopenharmony_ci	asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res)	\
30462306a36Sopenharmony_ci		      : "r" (ptr), "r" (x) : "memory");			\
30562306a36Sopenharmony_ci	ia64_intri_res;							\
30662306a36Sopenharmony_ci})
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci#define ia64_cmpxchg1_acq(ptr, new, old)						\
30962306a36Sopenharmony_ci({											\
31062306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
31162306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
31262306a36Sopenharmony_ci	asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":					\
31362306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
31462306a36Sopenharmony_ci	ia64_intri_res;									\
31562306a36Sopenharmony_ci})
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci#define ia64_cmpxchg1_rel(ptr, new, old)						\
31862306a36Sopenharmony_ci({											\
31962306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
32062306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
32162306a36Sopenharmony_ci	asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":					\
32262306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
32362306a36Sopenharmony_ci	ia64_intri_res;									\
32462306a36Sopenharmony_ci})
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci#define ia64_cmpxchg2_acq(ptr, new, old)						\
32762306a36Sopenharmony_ci({											\
32862306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
32962306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
33062306a36Sopenharmony_ci	asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":					\
33162306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
33262306a36Sopenharmony_ci	ia64_intri_res;									\
33362306a36Sopenharmony_ci})
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci#define ia64_cmpxchg2_rel(ptr, new, old)						\
33662306a36Sopenharmony_ci({											\
33762306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
33862306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
33962306a36Sopenharmony_ci											\
34062306a36Sopenharmony_ci	asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":					\
34162306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
34262306a36Sopenharmony_ci	ia64_intri_res;									\
34362306a36Sopenharmony_ci})
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci#define ia64_cmpxchg4_acq(ptr, new, old)						\
34662306a36Sopenharmony_ci({											\
34762306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
34862306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
34962306a36Sopenharmony_ci	asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":					\
35062306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
35162306a36Sopenharmony_ci	ia64_intri_res;									\
35262306a36Sopenharmony_ci})
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci#define ia64_cmpxchg4_rel(ptr, new, old)						\
35562306a36Sopenharmony_ci({											\
35662306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
35762306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
35862306a36Sopenharmony_ci	asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":					\
35962306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
36062306a36Sopenharmony_ci	ia64_intri_res;									\
36162306a36Sopenharmony_ci})
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci#define ia64_cmpxchg8_acq(ptr, new, old)						\
36462306a36Sopenharmony_ci({											\
36562306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
36662306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
36762306a36Sopenharmony_ci	asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":					\
36862306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
36962306a36Sopenharmony_ci	ia64_intri_res;									\
37062306a36Sopenharmony_ci})
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci#define ia64_cmpxchg8_rel(ptr, new, old)						\
37362306a36Sopenharmony_ci({											\
37462306a36Sopenharmony_ci	__u64 ia64_intri_res;								\
37562306a36Sopenharmony_ci	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\
37662306a36Sopenharmony_ci											\
37762306a36Sopenharmony_ci	asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":					\
37862306a36Sopenharmony_ci			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\
37962306a36Sopenharmony_ci	ia64_intri_res;									\
38062306a36Sopenharmony_ci})
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci#define ia64_mf()	asm volatile ("mf" ::: "memory")
38362306a36Sopenharmony_ci#define ia64_mfa()	asm volatile ("mf.a" ::: "memory")
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci#define ia64_invala() asm volatile ("invala" ::: "memory")
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci#define ia64_thash(addr)							\
38862306a36Sopenharmony_ci({										\
38962306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
39062306a36Sopenharmony_ci	asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr));	\
39162306a36Sopenharmony_ci	ia64_intri_res;								\
39262306a36Sopenharmony_ci})
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci#define ia64_srlz_i()	asm volatile (";; srlz.i ;;" ::: "memory")
39562306a36Sopenharmony_ci#define ia64_srlz_d()	asm volatile (";; srlz.d" ::: "memory");
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci#ifdef HAVE_SERIALIZE_DIRECTIVE
39862306a36Sopenharmony_ci# define ia64_dv_serialize_data()		asm volatile (".serialize.data");
39962306a36Sopenharmony_ci# define ia64_dv_serialize_instruction()	asm volatile (".serialize.instruction");
40062306a36Sopenharmony_ci#else
40162306a36Sopenharmony_ci# define ia64_dv_serialize_data()
40262306a36Sopenharmony_ci# define ia64_dv_serialize_instruction()
40362306a36Sopenharmony_ci#endif
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci#define ia64_nop(x)	asm volatile ("nop %0"::"i"(x));
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci#define ia64_itci(addr)	asm volatile ("itc.i %0;;" :: "r"(addr) : "memory")
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci#define ia64_itcd(addr)	asm volatile ("itc.d %0;;" :: "r"(addr) : "memory")
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1"				\
41362306a36Sopenharmony_ci					     :: "r"(trnum), "r"(addr) : "memory")
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1"				\
41662306a36Sopenharmony_ci					     :: "r"(trnum), "r"(addr) : "memory")
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci#define ia64_tpa(addr)								\
41962306a36Sopenharmony_ci({										\
42062306a36Sopenharmony_ci	unsigned long ia64_pa;							\
42162306a36Sopenharmony_ci	asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory");	\
42262306a36Sopenharmony_ci	ia64_pa;								\
42362306a36Sopenharmony_ci})
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci#define __ia64_set_dbr(index, val)						\
42662306a36Sopenharmony_ci	asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory")
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci#define ia64_set_ibr(index, val)						\
42962306a36Sopenharmony_ci	asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory")
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci#define ia64_set_pkr(index, val)						\
43262306a36Sopenharmony_ci	asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory")
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci#define ia64_set_pmc(index, val)						\
43562306a36Sopenharmony_ci	asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory")
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci#define ia64_set_pmd(index, val)						\
43862306a36Sopenharmony_ci	asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory")
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci#define ia64_set_rr(index, val)							\
44162306a36Sopenharmony_ci	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci#define ia64_get_cpuid(index)								\
44462306a36Sopenharmony_ci({											\
44562306a36Sopenharmony_ci	unsigned long ia64_intri_res;							\
44662306a36Sopenharmony_ci	asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index));	\
44762306a36Sopenharmony_ci	ia64_intri_res;									\
44862306a36Sopenharmony_ci})
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci#define __ia64_get_dbr(index)							\
45162306a36Sopenharmony_ci({										\
45262306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
45362306a36Sopenharmony_ci	asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\
45462306a36Sopenharmony_ci	ia64_intri_res;								\
45562306a36Sopenharmony_ci})
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci#define ia64_get_ibr(index)							\
45862306a36Sopenharmony_ci({										\
45962306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
46062306a36Sopenharmony_ci	asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\
46162306a36Sopenharmony_ci	ia64_intri_res;								\
46262306a36Sopenharmony_ci})
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci#define ia64_get_pkr(index)							\
46562306a36Sopenharmony_ci({										\
46662306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
46762306a36Sopenharmony_ci	asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\
46862306a36Sopenharmony_ci	ia64_intri_res;								\
46962306a36Sopenharmony_ci})
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci#define ia64_get_pmc(index)							\
47262306a36Sopenharmony_ci({										\
47362306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
47462306a36Sopenharmony_ci	asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index));	\
47562306a36Sopenharmony_ci	ia64_intri_res;								\
47662306a36Sopenharmony_ci})
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci#define ia64_get_pmd(index)							\
48062306a36Sopenharmony_ci({										\
48162306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
48262306a36Sopenharmony_ci	asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index));	\
48362306a36Sopenharmony_ci	ia64_intri_res;								\
48462306a36Sopenharmony_ci})
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci#define ia64_get_rr(index)							\
48762306a36Sopenharmony_ci({										\
48862306a36Sopenharmony_ci	unsigned long ia64_intri_res;						\
48962306a36Sopenharmony_ci	asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index));	\
49062306a36Sopenharmony_ci	ia64_intri_res;								\
49162306a36Sopenharmony_ci})
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci#define ia64_fc(addr)	asm volatile ("fc %0" :: "r"(addr) : "memory")
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci#define ia64_sync_i()	asm volatile (";; sync.i" ::: "memory")
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci#define ia64_ssm(mask)	asm volatile ("ssm %0":: "i"((mask)) : "memory")
49962306a36Sopenharmony_ci#define ia64_rsm(mask)	asm volatile ("rsm %0":: "i"((mask)) : "memory")
50062306a36Sopenharmony_ci#define ia64_sum(mask)	asm volatile ("sum %0":: "i"((mask)) : "memory")
50162306a36Sopenharmony_ci#define ia64_rum(mask)	asm volatile ("rum %0":: "i"((mask)) : "memory")
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci#define ia64_ptce(addr)	asm volatile ("ptc.e %0" :: "r"(addr))
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci#define ia64_ptcga(addr, size)							\
50662306a36Sopenharmony_cido {										\
50762306a36Sopenharmony_ci	asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory");	\
50862306a36Sopenharmony_ci	ia64_dv_serialize_data();						\
50962306a36Sopenharmony_ci} while (0)
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci#define ia64_ptcl(addr, size)							\
51262306a36Sopenharmony_cido {										\
51362306a36Sopenharmony_ci	asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory");	\
51462306a36Sopenharmony_ci	ia64_dv_serialize_data();						\
51562306a36Sopenharmony_ci} while (0)
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci#define ia64_ptri(addr, size)						\
51862306a36Sopenharmony_ci	asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory")
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci#define ia64_ptrd(addr, size)						\
52162306a36Sopenharmony_ci	asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory")
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci#define ia64_ttag(addr)							\
52462306a36Sopenharmony_ci({									  \
52562306a36Sopenharmony_ci	__u64 ia64_intri_res;						   \
52662306a36Sopenharmony_ci	asm volatile ("ttag %0=%1" : "=r"(ia64_intri_res) : "r" (addr));   \
52762306a36Sopenharmony_ci	ia64_intri_res;							 \
52862306a36Sopenharmony_ci})
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci#define ia64_lfhint_none   0
53462306a36Sopenharmony_ci#define ia64_lfhint_nt1    1
53562306a36Sopenharmony_ci#define ia64_lfhint_nt2    2
53662306a36Sopenharmony_ci#define ia64_lfhint_nta    3
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ci#define ia64_lfetch(lfhint, y)					\
53962306a36Sopenharmony_ci({								\
54062306a36Sopenharmony_ci        switch (lfhint) {					\
54162306a36Sopenharmony_ci        case ia64_lfhint_none:					\
54262306a36Sopenharmony_ci                asm volatile ("lfetch [%0]" : : "r"(y));	\
54362306a36Sopenharmony_ci                break;						\
54462306a36Sopenharmony_ci        case ia64_lfhint_nt1:					\
54562306a36Sopenharmony_ci                asm volatile ("lfetch.nt1 [%0]" : : "r"(y));	\
54662306a36Sopenharmony_ci                break;						\
54762306a36Sopenharmony_ci        case ia64_lfhint_nt2:					\
54862306a36Sopenharmony_ci                asm volatile ("lfetch.nt2 [%0]" : : "r"(y));	\
54962306a36Sopenharmony_ci                break;						\
55062306a36Sopenharmony_ci        case ia64_lfhint_nta:					\
55162306a36Sopenharmony_ci                asm volatile ("lfetch.nta [%0]" : : "r"(y));	\
55262306a36Sopenharmony_ci                break;						\
55362306a36Sopenharmony_ci        }							\
55462306a36Sopenharmony_ci})
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci#define ia64_lfetch_excl(lfhint, y)					\
55762306a36Sopenharmony_ci({									\
55862306a36Sopenharmony_ci        switch (lfhint) {						\
55962306a36Sopenharmony_ci        case ia64_lfhint_none:						\
56062306a36Sopenharmony_ci                asm volatile ("lfetch.excl [%0]" :: "r"(y));		\
56162306a36Sopenharmony_ci                break;							\
56262306a36Sopenharmony_ci        case ia64_lfhint_nt1:						\
56362306a36Sopenharmony_ci                asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y));	\
56462306a36Sopenharmony_ci                break;							\
56562306a36Sopenharmony_ci        case ia64_lfhint_nt2:						\
56662306a36Sopenharmony_ci                asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y));	\
56762306a36Sopenharmony_ci                break;							\
56862306a36Sopenharmony_ci        case ia64_lfhint_nta:						\
56962306a36Sopenharmony_ci                asm volatile ("lfetch.excl.nta [%0]" :: "r"(y));	\
57062306a36Sopenharmony_ci                break;							\
57162306a36Sopenharmony_ci        }								\
57262306a36Sopenharmony_ci})
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci#define ia64_lfetch_fault(lfhint, y)					\
57562306a36Sopenharmony_ci({									\
57662306a36Sopenharmony_ci        switch (lfhint) {						\
57762306a36Sopenharmony_ci        case ia64_lfhint_none:						\
57862306a36Sopenharmony_ci                asm volatile ("lfetch.fault [%0]" : : "r"(y));		\
57962306a36Sopenharmony_ci                break;							\
58062306a36Sopenharmony_ci        case ia64_lfhint_nt1:						\
58162306a36Sopenharmony_ci                asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y));	\
58262306a36Sopenharmony_ci                break;							\
58362306a36Sopenharmony_ci        case ia64_lfhint_nt2:						\
58462306a36Sopenharmony_ci                asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y));	\
58562306a36Sopenharmony_ci                break;							\
58662306a36Sopenharmony_ci        case ia64_lfhint_nta:						\
58762306a36Sopenharmony_ci                asm volatile ("lfetch.fault.nta [%0]" : : "r"(y));	\
58862306a36Sopenharmony_ci                break;							\
58962306a36Sopenharmony_ci        }								\
59062306a36Sopenharmony_ci})
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci#define ia64_lfetch_fault_excl(lfhint, y)				\
59362306a36Sopenharmony_ci({									\
59462306a36Sopenharmony_ci        switch (lfhint) {						\
59562306a36Sopenharmony_ci        case ia64_lfhint_none:						\
59662306a36Sopenharmony_ci                asm volatile ("lfetch.fault.excl [%0]" :: "r"(y));	\
59762306a36Sopenharmony_ci                break;							\
59862306a36Sopenharmony_ci        case ia64_lfhint_nt1:						\
59962306a36Sopenharmony_ci                asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y));	\
60062306a36Sopenharmony_ci                break;							\
60162306a36Sopenharmony_ci        case ia64_lfhint_nt2:						\
60262306a36Sopenharmony_ci                asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y));	\
60362306a36Sopenharmony_ci                break;							\
60462306a36Sopenharmony_ci        case ia64_lfhint_nta:						\
60562306a36Sopenharmony_ci                asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y));	\
60662306a36Sopenharmony_ci                break;							\
60762306a36Sopenharmony_ci        }								\
60862306a36Sopenharmony_ci})
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci#define ia64_intrin_local_irq_restore(x)			\
61162306a36Sopenharmony_cido {								\
61262306a36Sopenharmony_ci	asm volatile (";;   cmp.ne p6,p7=%0,r0;;"		\
61362306a36Sopenharmony_ci		      "(p6) ssm psr.i;"				\
61462306a36Sopenharmony_ci		      "(p7) rsm psr.i;;"			\
61562306a36Sopenharmony_ci		      "(p6) srlz.d"				\
61662306a36Sopenharmony_ci		      :: "r"((x)) : "p6", "p7", "memory");	\
61762306a36Sopenharmony_ci} while (0)
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci#endif /* _UAPI_ASM_IA64_GCC_INTRIN_H */
620