xref: /OK3568_Linux_fs/kernel/arch/alpha/include/asm/special_insns.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ALPHA_SPECIAL_INSNS_H
3*4882a593Smuzhiyun #define __ALPHA_SPECIAL_INSNS_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun enum implver_enum {
6*4882a593Smuzhiyun 	IMPLVER_EV4,
7*4882a593Smuzhiyun 	IMPLVER_EV5,
8*4882a593Smuzhiyun 	IMPLVER_EV6
9*4882a593Smuzhiyun };
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifdef CONFIG_ALPHA_GENERIC
12*4882a593Smuzhiyun #define implver()				\
13*4882a593Smuzhiyun ({ unsigned long __implver;			\
14*4882a593Smuzhiyun    __asm__ ("implver %0" : "=r"(__implver));	\
15*4882a593Smuzhiyun    (enum implver_enum) __implver; })
16*4882a593Smuzhiyun #else
17*4882a593Smuzhiyun /* Try to eliminate some dead code.  */
18*4882a593Smuzhiyun #ifdef CONFIG_ALPHA_EV4
19*4882a593Smuzhiyun #define implver() IMPLVER_EV4
20*4882a593Smuzhiyun #endif
21*4882a593Smuzhiyun #ifdef CONFIG_ALPHA_EV5
22*4882a593Smuzhiyun #define implver() IMPLVER_EV5
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun #if defined(CONFIG_ALPHA_EV6)
25*4882a593Smuzhiyun #define implver() IMPLVER_EV6
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun #endif
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum amask_enum {
30*4882a593Smuzhiyun 	AMASK_BWX = (1UL << 0),
31*4882a593Smuzhiyun 	AMASK_FIX = (1UL << 1),
32*4882a593Smuzhiyun 	AMASK_CIX = (1UL << 2),
33*4882a593Smuzhiyun 	AMASK_MAX = (1UL << 8),
34*4882a593Smuzhiyun 	AMASK_PRECISE_TRAP = (1UL << 9),
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define amask(mask)						\
38*4882a593Smuzhiyun ({ unsigned long __amask, __input = (mask);			\
39*4882a593Smuzhiyun    __asm__ ("amask %1,%0" : "=r"(__amask) : "rI"(__input));	\
40*4882a593Smuzhiyun    __amask; })
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #endif /* __ALPHA_SPECIAL_INSNS_H */
43