1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Dummy variable. Needed to work around GCC code generation bugs */
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvolatile long v;
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_REG_MEM(insn, s1, s2)			\
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	unsigned long tmp = s1;				\
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	#insn " %0, %3\n"		\
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)		\
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp), "Q" (s2)		\
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "0", "cc");			\
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf(#insn " + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_REG_REG(insn, s1, s2)			\
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	unsigned long tmp = s1;				\
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	#insn " %0, %3\n"		\
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)		\
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp), "d" (s2)		\
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "0", "cc");			\
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf(#insn " + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_REG_IMM(insn, s1, s2)			\
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long tmp asm("2") = s1;	\
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	insn(2,s2) 			\
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)		\
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp)			\
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "cc");			\
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	v = tmp; /* work around GCC code gen bug */     \
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf(#insn " + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) 0x##s2, v, cc); \
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_MEM_IMM(insn, s1, s2)			\
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	unsigned long tmp = s1;				\
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	#insn " %0," #s2 "\n"		\
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+Q" (tmp), "=d" (cc)		\
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "Q" (tmp)			\
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "0", "cc");			\
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf(#insn " + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) s2, tmp, cc); \
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memsweep(i, s2)					\
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0ul, s2);			\
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 1ul, s2);			\
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0xfffful, s2);			\
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x7ffful, s2);			\
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x8000ul, s2);			\
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0xfffffffful, s2);		\
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x80000000ul, s2);		\
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x7ffffffful, s2);		\
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x8000000000000000ul, s2);	\
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0xfffffffffffffffful, s2);	\
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_MEM(i, 0x5555555555555555ul, s2);	\
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define regsweep(i, s2)					\
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0ul, s2);			\
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 1ul, s2);			\
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0xfffful, s2);			\
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x7ffful, s2);			\
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x8000ul, s2);			\
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0xfffffffful, s2);		\
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x80000000ul, s2);		\
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x7ffffffful, s2);		\
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x8000000000000000ul, s2);	\
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0xfffffffffffffffful, s2);	\
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_REG(i, 0x5555555555555555ul, s2);	\
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define immsweep(i, s2)					\
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0ul, s2);			\
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 1ul, s2);			\
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0xfffful, s2);			\
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x7ffful, s2);			\
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x8000ul, s2);			\
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0xfffffffful, s2);		\
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x80000000ul, s2);		\
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x7ffffffful, s2);		\
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x8000000000000000ul, s2);	\
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0xfffffffffffffffful, s2);	\
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_REG_IMM(i, 0x5555555555555555ul, s2);	\
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memimmsweep(i, s2)				\
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0ul, s2);			\
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 1ul, s2);			\
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0xfffful, s2);			\
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x7ffful, s2);			\
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x8000ul, s2);			\
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0xfffffffful, s2);		\
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x80000000ul, s2);		\
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x7ffffffful, s2);		\
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x8000000000000000ul, s2);	\
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0xfffffffffffffffful, s2);	\
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_MEM_IMM(i, 0x5555555555555555ul, s2);	\
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_NY(s1, s2)					\
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long tmp asm("1") = s1;	\
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long *addr asm("2") = &s2;	\
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	NY(1,0,2,000,00)		\
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)		\
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp), "d"(addr)		\
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "cc");		\
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf("ny + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define AND_NIY(s1, i2)					\
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	unsigned long tmp = s1;				\
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long *addr asm("2") = &tmp;	\
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	NIY(i2,2,000,00)		\
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+Q" (tmp), "=d" (cc)		\
147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "Q" (tmp), "d" (addr)		\
148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "cc");		\
149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf("niy + %16.16lX & %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) 0x##i2, tmp, cc); \
150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define nysweep(s2)				\
153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({						\
154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0ul, s2);			\
155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(1ul, s2);			\
156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0xfffful, s2);			\
157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x7ffful, s2);			\
158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x8000ul, s2);			\
159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0xfffffffful, s2);		\
160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x80000000ul, s2);		\
161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x7ffffffful, s2);		\
162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0xaaaaaaaaaaaaaaaaul, s2);	\
163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x8000000000000000ul, s2);	\
164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0xfffffffffffffffful, s2);	\
165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NY(0x5555555555555555ul, s2);	\
166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define niysweep(s2)				\
169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({						\
170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0ul, s2);			\
171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(1ul, s2);			\
172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0xfffful, s2);			\
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x7ffful, s2);			\
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x8000ul, s2);			\
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0xfffffffful, s2);		\
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x80000000ul, s2);		\
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x7ffffffful, s2);		\
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0xaaaaaaaaaaaaaaaaul, s2);	\
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x8000000000000000ul, s2);	\
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0xfffffffffffffffful, s2);	\
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	AND_NIY(0x5555555555555555ul, s2);	\
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
183