1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef  unsigned long long int  ULong;
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef  unsigned int            UInt;
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_andn64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg1, ULong arg2 )
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "andn %2, %3, %0"         "\n\t"
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc"
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "andn %2, %3, %0"         "\n\t"
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc"
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_andn32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg1, UInt arg2 )
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "andn %2, %3, %k0"        "\n\t"
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=r" (flag) : "r" (arg1), "r" (arg2) : "cc"
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "andn %2, %3, %k0"        "\n\t"
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=r" (flag) : "m" (arg1), "r" (arg2) : "cc"
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_mulx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2,
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 ULong arg1, ULong arg2 )
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem1, tem2, flag1, flag2, flag3, flag4;
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %1" "\n\t"
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq %4, %%rdx"          "\n\t"
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "mulx %5, %1, %0"         "\n\t"
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %3"        "\n\t"
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2)
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "g" (arg1), "r" (arg2) : "cc", "rdx"
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res1 = tem1;
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res2 = tem2;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %1" "\n\t"
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq %4, %%rdx"          "\n\t"
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %2"                 "\n\t"
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "mulx %5, %1, %0"         "\n\t"
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %3"                 "\n"
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4)
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "g" (arg1), "m" (arg2) : "cc", "rdx"
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res1 != tem1 || *res2 != tem2)
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_mulx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2,
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UInt arg1, UInt arg2 )
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem1, tem2, flag1, flag2, flag3, flag4;
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %1" "\n\t"
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movl %4, %%edx"          "\n\t"
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                    "\n\t"
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "mulx %5, %k1, %k0"       "\n\t"
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %3"        "\n\t"
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem1), "=&r" (tem2), "=&r" (flag1), "=r" (flag2)
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "g" (arg1), "r" (arg2) : "cc", "rdx"
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res1 = tem1;
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res2 = tem2;
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %1" "\n\t"
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movl %4, %%edx"          "\n\t"
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %2"                 "\n\t"
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "mulx %5, %k1, %k0"       "\n\t"
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %3"                 "\n"
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem1), "=&r" (tem2), "=&r" (flag3), "=r" (flag4)
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "g" (arg1), "m" (arg2) : "cc", "rdx"
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res1 != tem1 || *res2 != tem2)
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_sarx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "sarx %3, %4, %0"         "\n\t"
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "sarx %3, %4, %0"         "\n\t"
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_sarx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "sarx %3, %4, %k0"        "\n\t"
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "sarx %3, %4, %k0"        "\n\t"
204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shlx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shlx %3, %4, %0"         "\n\t"
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shlx %3, %4, %0"         "\n\t"
244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shlx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shlx %3, %4, %k0"        "\n\t"
268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shlx %3, %4, %k0"        "\n\t"
283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shrx64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shrx %3, %4, %0"         "\n\t"
308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shrx %3, %4, %0"         "\n\t"
323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_shrx32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shrx %3, %4, %k0"        "\n\t"
347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "shrx %3, %4, %k0"        "\n\t"
362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "m" (arg2) : "cc"
368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_rorx64 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, ULong arg )
378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "rorx $12, %3, %0"        "\n\t"
387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc"
392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res1 = tem;
394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "rorx $67, %3, %0"        "\n\t"
401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc"
406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res2 = tem;
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_rorx32 ( /*OUT*/ULong* res1, /*OUT*/ULong* res2, UInt arg )
414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "rorx $12, %3, %k0"       "\n\t"
423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2) : "r" (arg) : "cc"
428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res1 = tem;
430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "rorx $67, %3, %k0"       "\n\t"
437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4) : "m" (arg) : "cc"
442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res2 = tem;
444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsi %2, %0"             "\n\t"
456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsi %2, %0"             "\n\t"
465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsi %2, %k0"            "\n\t"
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsi %2, %k0"            "\n\t"
489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsmsk64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsmsk %2, %0"           "\n\t"
505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsmsk %2, %0"           "\n\t"
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsmsk32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsmsk %2, %k0"          "\n\t"
529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsmsk %2, %k0"          "\n\t"
538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, ULong arg )
549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsr %2, %0"             "\n\t"
554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsr %2, %0"             "\n\t"
563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_blsr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res, UInt arg )
573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsr %2, %k0"            "\n\t"
578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg) : "cc"
581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "blsr %2, %k0"            "\n\t"
587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "m" (arg) : "cc"
590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bextr64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  ULong arg1, ULong arg2 )
599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bextr %2, %3, %0"        "\n\t"
604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bextr %2, %3, %0"        "\n\t"
613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bextr32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt arg1, UInt arg2 )
624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bextr %2, %3, %k0"       "\n\t"
629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bextr %2, %3, %k0"       "\n\t"
638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bzhi64 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 ULong arg1, ULong arg2 )
650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bzhi %2, %3, %0"         "\n\t"
655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bzhi %2, %3, %0"         "\n\t"
664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_bzhi32 ( /*OUT*/UInt* flags, /*OUT*/ULong* res,
674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 UInt arg1, UInt arg2 )
675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag;
677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bzhi %2, %3, %k0"        "\n\t"
680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "r" (arg2) : "cc"
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *flags = flag & 0x8d5;
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "bzhi %2, %3, %k0"        "\n\t"
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"		      "\n\t"
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popq %1"                 "\n"
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag) : "r" (arg1), "m" (arg2) : "cc"
692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem || *flags != (flag & 0x8d5))
694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pdep64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pdep %3, %4, %0"         "\n\t"
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pdep %3, %4, %0"         "\n\t"
724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "m" (arg1), "r" (arg2) : "cc"
730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pdep32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pdep %3, %4, %k0"        "\n\t"
748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pdep %3, %4, %k0"        "\n\t"
763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "m" (arg1), "r" (arg2) : "cc"
769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pext64 ( /*OUT*/ULong* res, ULong arg1, ULong arg2 )
779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pext %3, %4, %0"         "\n\t"
788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pext %3, %4, %0"         "\n\t"
803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "m" (arg1), "r" (arg2) : "cc"
809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov__attribute__((noinline))
817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid do_pext32 ( /*OUT*/ULong* res, UInt arg1, UInt arg2 )
818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ULong tem, flag1, flag2, flag3, flag4;
820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pext %3, %4, %k0"        "\n\t"
827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag1), "=r" (flag2)
832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "r" (arg1), "r" (arg2) : "cc"
833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  *res = tem;
835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  __asm__ __volatile__(
836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movabsq $0x5555555555555555, %0" "\n\t"
837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %1"        "\n\t"
840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n\t"
841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pext %3, %4, %k0"        "\n\t"
842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "pushfq"                  "\n\t"
843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "movq (%%rsp), %2"        "\n\t"
844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "xorq $0x8d5, (%%rsp)"    "\n\t"
845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    "popfq"                   "\n"
846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "=&r" (tem), "=&r" (flag3), "=r" (flag4)
847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    : "m" (arg1), "r" (arg2) : "cc"
848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  );
849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (*res != tem)
850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Difference between r and m variants\n");
851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (((flag1 ^ flag2) | (flag3 ^ flag4)) & 0x8d5)
852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     printf ("Flags changed\n");
853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main ( void )
857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ULong w1, w2;
859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_andn64(&flags, &res, w1, w2);
866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("andn64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_andn32(&flags, &res, w1, w2);
878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("andn32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res1, res2;
888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_mulx64(&res1, &res2, w1, w2);
889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("mulx64 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2);
890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res1, res2;
899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_mulx32(&res1, &res2, w1, w2);
900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("mulx32 %016llx %016llx -> %016llx %016llx\n", w1, w2, res1, res2);
901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_sarx64(&res, w1, w2);
911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("sarx64 %016llx %016llx -> %016llx\n", w1, w2, res);
912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_sarx32(&res, w1, w2);
922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("sarx32 %016llx %016llx -> %016llx\n", w1, w2, res);
923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_shlx64(&res, w1, w2);
933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("shlx64 %016llx %016llx -> %016llx\n", w1, w2, res);
934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_shlx32(&res, w1, w2);
944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("shlx32 %016llx %016llx -> %016llx\n", w1, w2, res);
945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_shrx64(&res, w1, w2);
955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("shrx64 %016llx %016llx -> %016llx\n", w1, w2, res);
956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_shrx32(&res, w1, w2);
966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("shrx32 %016llx %016llx -> %016llx\n", w1, w2, res);
967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res1, res2;
975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_rorx64(&res1, &res2, w1);
976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("rorx64 %016llx -> %016llx %016llx\n", w1, res1, res2);
977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res1, res2;
984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_rorx32(&res1, &res2, w1);
985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("rorx32 %016llx -> %016llx %016llx\n", w1, res1, res2);
986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsi64(&flags, &res, w1);
995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsi64 %016llx -> %016llx %04x\n", w1, res, flags);
996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsi32(&flags, &res, w1);
1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsi32 %016llx -> %016llx %04x\n", w1, res, flags);
1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsmsk64(&flags, &res, w1);
1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsmsk64 %016llx -> %016llx %04x\n", w1, res, flags);
1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsmsk32(&flags, &res, w1);
1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsmsk32 %016llx -> %016llx %04x\n", w1, res, flags);
1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsr64(&flags, &res, w1);
1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsr64 %016llx -> %016llx %04x\n", w1, res, flags);
1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_blsr32(&flags, &res, w1);
1045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("blsr32 %016llx -> %016llx %04x\n", w1, res, flags);
1046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_bextr64(&flags, &res, w1, w2);
1056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("bextr64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
1057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_bextr32(&flags, &res, w1, w2);
1068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("bextr32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
1069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_bzhi64(&flags, &res, w1, w2);
1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("bzhi64 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt  flags;
1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_bzhi32(&flags, &res, w1, w2);
1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("bzhi32 %016llx %016llx -> %016llx %04x\n", w1, w2, res, flags);
1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_pdep64(&res, w1, w2);
1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("pdep64 %016llx %016llx -> %016llx\n", w1, w2, res);
1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_pdep32(&res, w1, w2);
1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("pdep32 %016llx %016llx -> %016llx\n", w1, w2, res);
1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_pext64(&res, w1, w2);
1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("pext64 %016llx %016llx -> %016llx\n", w1, w2, res);
1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w1 = 0xFEDC192837475675ULL;
1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   w2 = 0x57657438291CDEF0ULL;
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (1) {
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ULong res;
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      do_pext32(&res, w1, w2);
1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("pext32 %016llx %016llx -> %016llx\n", w1, w2, res);
1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (w1 == 0) break;
1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w1 = ((w1 >> 2) | (w1 >> 1)) + (w1 / 17ULL);
1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      w2 = ((w2 >> 2) | (w2 >> 1)) + (w2 / 17ULL);
1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1144