1#include <stdio.h>
2
3#define MUL_REG_MEM(insn, m1, m2)			\
4({							\
5	unsigned long tmp1 = m1;			\
6	unsigned long tmp2 = m1;			\
7	asm volatile(	"lgr 2, %0\n"			\
8			"lgr 3, %1\n"			\
9			#insn " 2, %2\n"		\
10			"lgr %0,2\n"			\
11			"lgr %1,3\n"			\
12			: "+d" (tmp1), "+d" (tmp2)	\
13			: "Q" (m2)			\
14			: "2","3");			\
15	printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \
16})
17
18#define MUL_REG_REG(insn, m1, m2)			\
19({							\
20	unsigned long tmp1 = m1;			\
21	unsigned long tmp2 = m1;			\
22	asm volatile(	"lgr 2, %0\n"			\
23			"lgr 3, %1\n"			\
24			#insn " 2, %2\n"		\
25			"lgr %0,2\n"			\
26			"lgr %1,3\n"			\
27			: "+d" (tmp1), "+d" (tmp2)	\
28			: "d" (m2)			\
29			: "2","3");			\
30	printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \
31})
32
33#define MUL_REG_IMM(insn, m1, m2)			\
34({							\
35	unsigned long tmp1 = m1;			\
36	unsigned long tmp2 = m1;			\
37	asm volatile(	"lgr 2, %0\n"			\
38			"lgr 3, %1\n"			\
39			#insn " 2, " #m2 "\n"		\
40			"lgr %0,2\n"			\
41			"lgr %1,3\n"			\
42			: "+d" (tmp1), "+d" (tmp2)	\
43			:: "2","3");			\
44	printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, (unsigned long) m2, tmp1, tmp2); \
45})
46
47#define MUL_REG_XIMM(insn, m1, um2, m2)			\
48({							\
49	unsigned long tmp1 = m1;			\
50	unsigned long tmp2 = m1;			\
51	asm volatile(	"lgr 2, %0\n"			\
52			"lgr 3, %1\n"			\
53			insn(2,m2)			\
54			"lgr %0,2\n"			\
55			"lgr %1,3\n"			\
56			: "+d" (tmp1), "+d" (tmp2)	\
57			:: "2","3");			\
58	printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, (unsigned long) 0x##um2##m2, tmp1, tmp2); \
59})
60
61
62#define memsweep(i, m2)					\
63({							\
64	MUL_REG_MEM(i, 0ul, m2);			\
65	MUL_REG_MEM(i, 1ul, m2);			\
66	MUL_REG_MEM(i, 0xfffful, m2);			\
67	MUL_REG_MEM(i, 0x7ffful, m2);			\
68	MUL_REG_MEM(i, 0x8000ul, m2);			\
69	MUL_REG_MEM(i, 0xfffffffful, m2);		\
70	MUL_REG_MEM(i, 0x80000000ul, m2);		\
71	MUL_REG_MEM(i, 0x7ffffffful, m2);		\
72	MUL_REG_MEM(i, 0xfffffffffffffffful, m2);	\
73	MUL_REG_MEM(i, 0x8000000000000000ul, m2);	\
74	MUL_REG_MEM(i, 0x7ffffffffffffffful, m2);	\
75})
76
77#define regsweep(i, m2)					\
78({							\
79	MUL_REG_REG(i, 0ul, m2);			\
80	MUL_REG_REG(i, 1ul, m2);			\
81	MUL_REG_REG(i, 0xfffful, m2);			\
82	MUL_REG_REG(i, 0x7ffful, m2);			\
83	MUL_REG_REG(i, 0x8000ul, m2);			\
84	MUL_REG_REG(i, 0xfffffffful, m2);		\
85	MUL_REG_REG(i, 0x80000000ul, m2);		\
86	MUL_REG_REG(i, 0x7ffffffful, m2);		\
87	MUL_REG_REG(i, 0xfffffffffffffffful, m2);	\
88	MUL_REG_REG(i, 0x8000000000000000ul, m2);	\
89	MUL_REG_REG(i, 0x7ffffffffffffffful, m2);	\
90})
91
92#define immsweep(i, m2)					\
93({							\
94	MUL_REG_IMM(i, 0ul, m2);			\
95	MUL_REG_IMM(i, 1ul, m2);			\
96	MUL_REG_IMM(i, 0xfffful, m2);			\
97	MUL_REG_IMM(i, 0x7ffful, m2);			\
98	MUL_REG_IMM(i, 0x8000ul, m2);			\
99	MUL_REG_IMM(i, 0xfffffffful, m2);		\
100	MUL_REG_IMM(i, 0x80000000ul, m2);		\
101	MUL_REG_IMM(i, 0x7ffffffful, m2);		\
102	MUL_REG_IMM(i, 0xfffffffffffffffful, m2);	\
103	MUL_REG_IMM(i, 0x8000000000000000ul, m2);	\
104	MUL_REG_IMM(i, 0x7ffffffffffffffful, m2);	\
105})
106
107#define ximmsweep(i, um2, m2)				\
108({							\
109	MUL_REG_XIMM(i, 0ul, um2, m2);			\
110	MUL_REG_XIMM(i, 1ul, um2, m2);			\
111	MUL_REG_XIMM(i, 0xfffful, um2, m2);		\
112	MUL_REG_XIMM(i, 0x7ffful, um2, m2);		\
113	MUL_REG_XIMM(i, 0x8000ul, um2, m2);		\
114	MUL_REG_XIMM(i, 0xfffffffful, um2, m2);		\
115	MUL_REG_XIMM(i, 0x80000000ul, um2, m2);		\
116	MUL_REG_XIMM(i, 0x7ffffffful, um2, m2);		\
117	MUL_REG_XIMM(i, 0xfffffffffffffffful, um2, m2);	\
118	MUL_REG_XIMM(i, 0x8000000000000000ul, um2, m2);	\
119	MUL_REG_XIMM(i, 0x7ffffffffffffffful, um2, m2);	\
120})
121
122#define MUL_MSY(m1, m2)					\
123({							\
124	unsigned long tmp1 = m1;			\
125	unsigned long tmp2 = m1;			\
126	register unsigned long *addr asm("5") = &m2;	\
127	asm volatile(	"lgr 2, %0\n"			\
128			"lgr 3, %1\n"			\
129			MSY(2,0,5,000,00)		\
130			"lgr %0,2\n"			\
131			"lgr %1,3\n"			\
132			: "+d" (tmp1), "+d" (tmp2)	\
133			: "Q" (m2), "d" (addr)		\
134			: "2","3");			\
135	printf("msy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \
136})
137
138#define msysweep(s2)				\
139({						\
140	MUL_MSY(0ul, s2);			\
141	MUL_MSY(1ul, s2);			\
142	MUL_MSY(0xfffful, s2);			\
143	MUL_MSY(0x7ffful, s2);			\
144	MUL_MSY(0x8000ul, s2);			\
145	MUL_MSY(0xfffffffful, s2);		\
146	MUL_MSY(0x80000000ul, s2);		\
147	MUL_MSY(0x7ffffffful, s2);		\
148	MUL_MSY(0xfffffffffffffffful, s2);	\
149	MUL_MSY(0x8000000000000000ul, s2);	\
150	MUL_MSY(0x7ffffffffffffffful, s2);	\
151})
152
153#define MUL_MHY(m1, m2)					\
154({							\
155	unsigned long tmp1 = m1;			\
156	unsigned long tmp2 = m1;			\
157	register unsigned long *addr asm("5") = &m2;	\
158	asm volatile(	"lgr 2, %0\n"			\
159			"lgr 3, %1\n"			\
160			MHY(2,0,5,000,00)		\
161			"lgr %0,2\n"			\
162			"lgr %1,3\n"			\
163			: "+d" (tmp1), "+d" (tmp2)	\
164			: "Q" (m2), "d" (addr)		\
165			: "2","3");			\
166	printf("mhy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \
167})
168
169#define mhysweep(s2)				\
170({						\
171	MUL_MHY(0ul, s2);			\
172	MUL_MHY(1ul, s2);			\
173	MUL_MHY(0xfffful, s2);			\
174	MUL_MHY(0x7ffful, s2);			\
175	MUL_MHY(0x8000ul, s2);			\
176	MUL_MHY(0xfffffffful, s2);		\
177	MUL_MHY(0x80000000ul, s2);		\
178	MUL_MHY(0x7ffffffful, s2);		\
179	MUL_MHY(0xfffffffffffffffful, s2);	\
180	MUL_MHY(0x8000000000000000ul, s2);	\
181	MUL_MHY(0x7ffffffffffffffful, s2);	\
182})
183
184#define MUL_MFY(m1, m2)					\
185({							\
186	unsigned long tmp1 = m1;			\
187	unsigned long tmp2 = m1;			\
188	register unsigned long *addr asm("5") = &m2;	\
189	asm volatile(	"lgr 2, %0\n"			\
190			"lgr 3, %1\n"			\
191			MFY(2,0,5,000,00)		\
192			"lgr %0,2\n"			\
193			"lgr %1,3\n"			\
194			: "+d" (tmp1), "+d" (tmp2)	\
195			: "Q" (m2), "d" (addr)		\
196			: "2","3");			\
197	printf("mfy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \
198})
199
200#define mfysweep(s2)				\
201({						\
202	MUL_MFY(0ul, s2);			\
203	MUL_MFY(1ul, s2);			\
204	MUL_MFY(0xfffful, s2);			\
205	MUL_MFY(0x7ffful, s2);			\
206	MUL_MFY(0x8000ul, s2);			\
207	MUL_MFY(0xfffffffful, s2);		\
208	MUL_MFY(0x80000000ul, s2);		\
209	MUL_MFY(0x7ffffffful, s2);		\
210	MUL_MFY(0xfffffffffffffffful, s2);	\
211	MUL_MFY(0x8000000000000000ul, s2);	\
212	MUL_MFY(0x7ffffffffffffffful, s2);	\
213})
214