Linux Audio

Check our new training course

Loading...
  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_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_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_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_set_rr(index, val)							\
441	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
442
443#define ia64_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_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_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_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_ssm(mask)	asm volatile ("ssm %0":: "i"((mask)) : "memory")
499#define ia64_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_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_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 */