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 INSERT_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\n", s1, s2, tmp); \
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INSERT_REG_IMM(insn, s1, s2)			\
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long tmp asm("2") = s1;	\
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;						\
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	insn(2,s2)			\
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"			\
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"			\
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)		\
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp)			\
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "cc");			\
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	v = tmp; /* work around GCC code gen bug */     \
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf(#insn " %16.16lX <- %16.16lX = %16.16lX\n", s1, (unsigned long) 0x##s2, v); \
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memsweep(i, s2)					\
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0ul, s2);			\
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 1ul, s2);			\
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0xfffful, s2);		\
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x7ffful, s2);		\
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x8000ul, s2);		\
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0xfffffffful, s2);		\
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x80000000ul, s2);		\
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x7ffffffful, s2);		\
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x8000000000000000ul, s2);	\
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0xfffffffffffffffful, s2);	\
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_MEM(i, 0x5555555555555555ul, s2);	\
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define immsweep(i, s2)					\
51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({							\
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0ul, s2);			\
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 1ul, s2);			\
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0xfffful, s2);		\
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x7ffful, s2);		\
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x8000ul, s2);		\
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0xfffffffful, s2);		\
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x80000000ul, s2);		\
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x7ffffffful, s2);		\
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2);	\
61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x8000000000000000ul, s2);	\
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0xfffffffffffffffful, s2);	\
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_REG_IMM(i, 0x5555555555555555ul, s2);	\
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INSERT_ICY(s1, s2)			       		\
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({								\
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long tmp asm("1") = s1;		\
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	register unsigned long *addr asm("2") = &s2;		\
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	int cc;							\
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	asm volatile(	ICY(1,0,2,000,00)			\
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"ipm %1\n"				\
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			"srl %1,28\n"				\
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "+d" (tmp), "=d" (cc)			\
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "d" (tmp), "Q" (s2), "d" (addr)	\
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov			: "cc");				\
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	printf("icy %16.16lX <- %16.16lX = %16.16lX\n", s1, s2, tmp); \
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define icysweep(s2)				\
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({						\
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0ul, s2);			\
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(1ul, s2);			\
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0xfffful, s2);		\
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x7ffful, s2);		\
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x8000ul, s2);		\
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0xfffffffful, s2);		\
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x80000000ul, s2);		\
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x7ffffffful, s2);		\
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0xaaaaaaaaaaaaaaaaul, s2);	\
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x8000000000000000ul, s2);	\
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0xfffffffffffffffful, s2);	\
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	INSERT_ICY(0x5555555555555555ul, s2);	\
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov})
95