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