1#include <stdio.h>
2#include <stdlib.h>
3
4#define	I64(C)	"rcrq %%rbx\n" "rclq $" #C ",%%rax\n" "rclq %%rbx\n"
5#define	I32(C)	"rcrl %%ebx\n" "rcll $" #C ",%%eax\n" "rcll %%ebx\n"
6#define	I16(C)	"rcrw %%bx\n"  "rclw $" #C ",%%ax\n"  "rclw %%bx\n"
7#define	I8(C)	"rcrb %%bl\n"  "rclb $" #C ",%%al\n"  "rclb %%bl\n"
8
9#define TRY64(C)							\
10	do { for(i = 0 ; C && (i * C < 2 * 65) ; i++) {			\
11		printf("C=" #C ", w=64, i=%-3d a=%016lx\n",i,a);	\
12		asm(I64(C) : "+a"(a), "+b"(b) : /* */);			\
13	} } while (0)
14#define TRY32(C)							\
15	do { for(i = 0 ; C && (i * C < 2 * 33) ; i++) {			\
16		printf("C=" #C ", w=32, i=%-3d a=%016lx\n",i,a);	\
17		asm(I32(C) : "+a"(a), "+b"(b) : /* */);			\
18	} } while (0)
19#define TRY16(C)							\
20	do { for(i = 0 ; C && (i * C < 2 * 17) ; i++) {			\
21		printf("C=" #C ", w=16, i=%-3d a=%016lx\n",i,a);	\
22		asm(I16(C) : "+a"(a), "+b"(b) : /* */);			\
23	} } while (0)
24#define TRY8(C)								\
25	do { for(i = 0 ; C && (i * C < 2 * 9) ; i++) {			\
26		printf("C=" #C ", w=8, i=%-3d a=%016lx\n",i,a);		\
27		asm(I8(C) : "+a"(a), "+b"(b) : /* */);			\
28	} } while (0)
29
30int main(int argc, char * argv[])
31{
32	register unsigned long a, b;
33	int i;
34	if (argc == 2)
35		a = atol(argv[1]);
36	else
37		a = 0x0017004200ab0cdUL;
38	b = 0;
39
40	TRY64(0); TRY64(1); TRY64(2); TRY64(3); TRY64(4); TRY64(5);
41	TRY64(6); TRY64(7); TRY64(8); TRY64(9); TRY64(10); TRY64(11);
42	TRY64(12); TRY64(13); TRY64(14); TRY64(15); TRY64(16); TRY64(17);
43	TRY64(18); TRY64(19); TRY64(20); TRY64(21); TRY64(22); TRY64(23);
44	TRY64(24); TRY64(25); TRY64(26); TRY64(27); TRY64(28); TRY64(29);
45	TRY64(30); TRY64(31); TRY64(32); TRY64(33); TRY64(34); TRY64(35);
46	TRY64(36); TRY64(37); TRY64(38); TRY64(39); TRY64(40); TRY64(41);
47	TRY64(42); TRY64(43); TRY64(44); TRY64(45); TRY64(46); TRY64(47);
48	TRY64(48); TRY64(49); TRY64(50); TRY64(51); TRY64(52); TRY64(53);
49	TRY64(54); TRY64(55); TRY64(56); TRY64(57); TRY64(58); TRY64(59);
50	TRY64(60); TRY64(61); TRY64(62); TRY64(63); TRY64(64); TRY64(65);
51	TRY64(66); TRY64(67); TRY64(68); TRY64(69); TRY64(70); TRY64(71);
52	TRY64(72); TRY64(73); TRY64(74); TRY64(75); TRY64(76); TRY64(77);
53	TRY64(78); TRY64(79); TRY64(80); TRY64(81); TRY64(82); TRY64(83);
54	TRY64(84); TRY64(85); TRY64(86); TRY64(87); TRY64(88); TRY64(89);
55	TRY64(90); TRY64(91); TRY64(92); TRY64(93); TRY64(94); TRY64(95);
56	TRY64(96); TRY64(97); TRY64(98); TRY64(99); TRY64(100);
57	TRY64(101); TRY64(102); TRY64(103); TRY64(104); TRY64(105);
58	TRY64(106); TRY64(107); TRY64(108); TRY64(109); TRY64(110);
59	TRY64(111); TRY64(112); TRY64(113); TRY64(114); TRY64(115);
60	TRY64(116); TRY64(117); TRY64(118); TRY64(119); TRY64(120);
61	TRY64(121); TRY64(122); TRY64(123); TRY64(124); TRY64(125);
62	TRY64(126); TRY64(127); TRY64(128);
63
64	TRY32(0); TRY32(1); TRY32(2); TRY32(3); TRY32(4); TRY32(5);
65	TRY32(6); TRY32(7); TRY32(8); TRY32(9); TRY32(10); TRY32(11);
66	TRY32(12); TRY32(13); TRY32(14); TRY32(15); TRY32(16); TRY32(17);
67	TRY32(18); TRY32(19); TRY32(20); TRY32(21); TRY32(22); TRY32(23);
68	TRY32(24); TRY32(25); TRY32(26); TRY32(27); TRY32(28); TRY32(29);
69	TRY32(30); TRY32(31); TRY32(32); TRY32(33); TRY32(34); TRY32(35);
70	TRY32(36); TRY32(37); TRY32(38); TRY32(39); TRY32(40); TRY32(41);
71	TRY32(42); TRY32(43); TRY32(44); TRY32(45); TRY32(46); TRY32(47);
72	TRY32(48); TRY32(49); TRY32(50); TRY32(51); TRY32(52); TRY32(53);
73	TRY32(54); TRY32(55); TRY32(56); TRY32(57); TRY32(58); TRY32(59);
74	TRY32(60); TRY32(61); TRY32(62); TRY32(63); TRY32(64); TRY32(65);
75	TRY32(66); TRY32(67); TRY32(68); TRY32(69); TRY32(70); TRY32(71);
76	TRY32(72); TRY32(73); TRY32(74); TRY32(75); TRY32(76); TRY32(77);
77	TRY32(78); TRY32(79); TRY32(80); TRY32(81); TRY32(82); TRY32(83);
78	TRY32(84); TRY32(85); TRY32(86); TRY32(87); TRY32(88); TRY32(89);
79	TRY32(90); TRY32(91); TRY32(92); TRY32(93); TRY32(94); TRY32(95);
80	TRY32(96); TRY32(97); TRY32(98); TRY32(99); TRY32(100);
81	TRY32(101); TRY32(102); TRY32(103); TRY32(104); TRY32(105);
82	TRY32(106); TRY32(107); TRY32(108); TRY32(109); TRY32(110);
83	TRY32(111); TRY32(112); TRY32(113); TRY32(114); TRY32(115);
84	TRY32(116); TRY32(117); TRY32(118); TRY32(119); TRY32(120);
85	TRY32(121); TRY32(122); TRY32(123); TRY32(124); TRY32(125);
86	TRY32(126); TRY32(127); TRY32(128);
87
88	TRY16(0); TRY16(1); TRY16(2); TRY16(3); TRY16(4); TRY16(5);
89	TRY16(6); TRY16(7); TRY16(8); TRY16(9); TRY16(10); TRY16(11);
90	TRY16(12); TRY16(13); TRY16(14); TRY16(15); TRY16(16); TRY16(17);
91	TRY16(18); TRY16(19); TRY16(20); TRY16(21); TRY16(22); TRY16(23);
92	TRY16(24); TRY16(25); TRY16(26); TRY16(27); TRY16(28); TRY16(29);
93	TRY16(30); TRY16(31); TRY16(32); TRY16(33); TRY16(34); TRY16(35);
94	TRY16(36); TRY16(37); TRY16(38); TRY16(39); TRY16(40); TRY16(41);
95	TRY16(42); TRY16(43); TRY16(44); TRY16(45); TRY16(46); TRY16(47);
96	TRY16(48); TRY16(49); TRY16(50); TRY16(51); TRY16(52); TRY16(53);
97	TRY16(54); TRY16(55); TRY16(56); TRY16(57); TRY16(58); TRY16(59);
98	TRY16(60); TRY16(61); TRY16(62); TRY16(63); TRY16(64); TRY16(65);
99	TRY16(66); TRY16(67); TRY16(68); TRY16(69); TRY16(70); TRY16(71);
100	TRY16(72); TRY16(73); TRY16(74); TRY16(75); TRY16(76); TRY16(77);
101	TRY16(78); TRY16(79); TRY16(80); TRY16(81); TRY16(82); TRY16(83);
102	TRY16(84); TRY16(85); TRY16(86); TRY16(87); TRY16(88); TRY16(89);
103	TRY16(90); TRY16(91); TRY16(92); TRY16(93); TRY16(94); TRY16(95);
104	TRY16(96); TRY16(97); TRY16(98); TRY16(99); TRY16(100);
105	TRY16(101); TRY16(102); TRY16(103); TRY16(104); TRY16(105);
106	TRY16(106); TRY16(107); TRY16(108); TRY16(109); TRY16(110);
107	TRY16(111); TRY16(112); TRY16(113); TRY16(114); TRY16(115);
108	TRY16(116); TRY16(117); TRY16(118); TRY16(119); TRY16(120);
109	TRY16(121); TRY16(122); TRY16(123); TRY16(124); TRY16(125);
110	TRY16(126); TRY16(127); TRY16(128);
111
112	TRY8(0); TRY8(1); TRY8(2); TRY8(3); TRY8(4); TRY8(5); TRY8(6);
113	TRY8(7); TRY8(8); TRY8(9); TRY8(10); TRY8(11); TRY8(12);
114	TRY8(13); TRY8(14); TRY8(15); TRY8(16); TRY8(17); TRY8(18);
115	TRY8(19); TRY8(20); TRY8(21); TRY8(22); TRY8(23); TRY8(24);
116	TRY8(25); TRY8(26); TRY8(27); TRY8(28); TRY8(29); TRY8(30);
117	TRY8(31); TRY8(32); TRY8(33); TRY8(34); TRY8(35); TRY8(36);
118	TRY8(37); TRY8(38); TRY8(39); TRY8(40); TRY8(41); TRY8(42);
119	TRY8(43); TRY8(44); TRY8(45); TRY8(46); TRY8(47); TRY8(48);
120	TRY8(49); TRY8(50); TRY8(51); TRY8(52); TRY8(53); TRY8(54);
121	TRY8(55); TRY8(56); TRY8(57); TRY8(58); TRY8(59); TRY8(60);
122	TRY8(61); TRY8(62); TRY8(63); TRY8(64); TRY8(65); TRY8(66);
123	TRY8(67); TRY8(68); TRY8(69); TRY8(70); TRY8(71); TRY8(72);
124	TRY8(73); TRY8(74); TRY8(75); TRY8(76); TRY8(77); TRY8(78);
125	TRY8(79); TRY8(80); TRY8(81); TRY8(82); TRY8(83); TRY8(84);
126	TRY8(85); TRY8(86); TRY8(87); TRY8(88); TRY8(89); TRY8(90);
127	TRY8(91); TRY8(92); TRY8(93); TRY8(94); TRY8(95); TRY8(96);
128	TRY8(97); TRY8(98); TRY8(99); TRY8(100); TRY8(101); TRY8(102);
129	TRY8(103); TRY8(104); TRY8(105); TRY8(106); TRY8(107); TRY8(108);
130	TRY8(109); TRY8(110); TRY8(111); TRY8(112); TRY8(113); TRY8(114);
131	TRY8(115); TRY8(116); TRY8(117); TRY8(118); TRY8(119); TRY8(120);
132	TRY8(121); TRY8(122); TRY8(123); TRY8(124); TRY8(125); TRY8(126);
133	TRY8(127); TRY8(128);
134
135	return 0;
136}
137