1dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
2dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj#include <stdio.h>
3dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj#include <stdlib.h>
4dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj#include <assert.h>
5dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
6dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef unsigned long long int ULong;
7dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef unsigned int   UInt;
8dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef unsigned short UShort;
9dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef unsigned char  UChar;
10dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
11dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef signed int    Int;
12dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef signed short  Short;
13dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
14dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjtypedef signed long int  Word;
15dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
16dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ MEM, Q ------------ */
17dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
18dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsq_mem ( char* base, Word bitno )
19dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
20dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
21dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
22dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btsq\t%2, %0\n\t"
23dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
24dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
25dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno));
26dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Pretty meaningless to dereference base here, but that's what you
27dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      have to do to get a btsl insn which refers to memory starting at
28dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      base. */
29dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
30dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
31dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
32dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrq_mem ( char* base, Word bitno )
33dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
34dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
35dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
36dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btrq\t%2, %0\n\t"
37dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
38dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
39dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno));
40dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
41dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
42dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
43dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcq_mem ( char* base, Word bitno )
44dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
45dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
46dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
47dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btcq\t%2, %0\n\t"
48dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
49dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
50dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno));
51dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
52dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
53dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
54dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btq_mem ( char* base, Word bitno )
55dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
56dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
57dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
58dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btq\t%2, %0\n\t"
59dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
60dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
61dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno)
62dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "memory");
63dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
64dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
65dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
66dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
67dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ MEM, L ------------ */
68dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
69dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsl_mem ( char* base, Word bitno )
70dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
71dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
72dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
73dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btsl\t%2, %0\n\t"
74dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
75dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
76dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno));
77dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Pretty meaningless to dereference base here, but that's what you
78dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      have to do to get a btsl insn which refers to memory starting at
79dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      base. */
80dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
81dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
82dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
83dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrl_mem ( char* base, Word bitno )
84dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
85dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
86dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
87dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btrl\t%2, %0\n\t"
88dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
89dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
90dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno));
91dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
92dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
93dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
94dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcl_mem ( char* base, Word bitno )
95dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
96dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
97dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
98dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btcl\t%2, %0\n\t"
99dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
100dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
101dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno));
102dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
103dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
104dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
105dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btl_mem ( char* base, Word bitno )
106dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
107dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
108dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
109dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btl\t%2, %0\n\t"
110dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
111dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
112dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno)
113dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "memory");
114dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
115dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
116dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
117dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
118dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
119dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ MEM, W ------------ */
120dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
121dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsw_mem ( char* base, Word bitno )
122dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
123dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
124dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
125dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btsw\t%2, %0\n\t"
126dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
127dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
128dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno));
129dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Pretty meaningless to dereference base here, but that's what you
130dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      have to do to get a btsl insn which refers to memory starting at
131dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      base. */
132dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
133dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
134dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
135dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrw_mem ( char* base, Word bitno )
136dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
137dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
138dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
139dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btrw\t%2, %0\n\t"
140dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
141dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
142dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno));
143dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
144dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
145dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
146dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcw_mem ( char* base, Word bitno )
147dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
148dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
149dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
150dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btcw\t%2, %0\n\t"
151dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
152dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
153dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno));
154dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
155dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
156dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
157dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btw_mem ( char* base, Word bitno )
158dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
159dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
160dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
161dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("btw\t%2, %0\n\t"
162dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%1"
163dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=m" (*base), "=q" (res)
164dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno)
165dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "memory");
166dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
167dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
168dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
169dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
170dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
171dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ REG, Q ------------ */
172dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
173dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsq_reg ( ULong reg_in, Word bitno,
174dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
175dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
176dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
177dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
178dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
179dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
180dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btsq\t%2, %%rax\n\t"
181dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
182dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
183dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
184dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno), "r" (reg_in)
185dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
186dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
187dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
188dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
189dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
190dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
191dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrq_reg ( ULong reg_in, Word bitno,
192dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
193dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
194dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
195dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
196dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
197dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
198dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btrq\t%2, %%rax\n\t"
199dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
200dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
201dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
202dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno), "r" (reg_in)
203dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
204dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
205dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
206dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
207dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
208dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
209dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcq_reg ( ULong reg_in, Word bitno,
210dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
211dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
212dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
213dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
214dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
215dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
216dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btcq\t%2, %%rax\n\t"
217dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
218dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
219dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
220dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno), "r" (reg_in)
221dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
222dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
223dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
224dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
225dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
226dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
227dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btq_reg ( ULong reg_in, Word bitno,
228dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                       ULong* reg_out_p )
229dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
230dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
231dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
232dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
233dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
234dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btq\t%2, %%rax\n\t"
235dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
236dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
237dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
238dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" (bitno), "r" (reg_in)
239dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
240dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
241dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
242dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
243dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
244dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
245dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
246dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ REG, L ------------ */
247dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
248dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsl_reg ( ULong reg_in, Word bitno,
249dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
250dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
251dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
252dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
253dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
254dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
255dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btsl\t%2, %%eax\n\t"
256dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
257dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
258dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
259dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno), "r" (reg_in)
260dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
261dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
262dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
263dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
264dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
265dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
266dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrl_reg ( ULong reg_in, Word bitno,
267dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
268dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
269dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
270dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
271dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
272dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
273dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btrl\t%2, %%eax\n\t"
274dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
275dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
276dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
277dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno), "r" (reg_in)
278dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
279dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
280dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
281dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
282dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
283dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
284dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcl_reg ( ULong reg_in, Word bitno,
285dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
286dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
287dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
288dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
289dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
290dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
291dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btcl\t%2, %%eax\n\t"
292dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
293dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
294dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
295dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno), "r" (reg_in)
296dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
297dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
298dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
299dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
300dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
301dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
302dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btl_reg ( ULong reg_in, Word bitno,
303dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                       ULong* reg_out_p )
304dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
305dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
306dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
307dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
308dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
309dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btl\t%2, %%eax\n\t"
310dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
311dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
312dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
313dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Int)bitno), "r" (reg_in)
314dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
315dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
316dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
317dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
318dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
319dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
320dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
321dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj/* ------------ REG, W ------------ */
322dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
323dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btsw_reg ( ULong reg_in, Word bitno,
324dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
325dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
326dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
327dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
328dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
329dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
330dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btsw\t%2, %%ax\n\t"
331dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
332dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
333dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
334dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno), "r" (reg_in)
335dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
336dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
337dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
338dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
339dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
340dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
341dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btrw_reg ( ULong reg_in, Word bitno,
342dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
343dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
344dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
345dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
346dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
347dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
348dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btrw\t%2, %%ax\n\t"
349dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
350dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
351dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
352dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno), "r" (reg_in)
353dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
354dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
355dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
356dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
357dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
358dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
359dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btcw_reg ( ULong reg_in, Word bitno,
360dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                        ULong* reg_out_p )
361dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
362dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
363dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
364dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
365dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
366dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btcw\t%2, %%ax\n\t"
367dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
368dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
369dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
370dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno), "r" (reg_in)
371dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
372dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
373dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
374dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
375dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
376dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
377dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong btw_reg ( ULong reg_in, Word bitno,
378dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                       ULong* reg_out_p )
379dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
380dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UChar res;
381dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong reg_out;
382dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __asm__
383dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   __volatile__("movq\t%3, %%rax\n\t"
384dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "btw\t%2, %%ax\n\t"
385dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "movq\t%%rax, %1\n\t"
386dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                "setc\t%0"
387dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "=q" (res), "=r" (reg_out)
388dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "r" ((Short)bitno), "r" (reg_in)
389dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj                : "cc", "eax");
390dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   *reg_out_p = reg_out;
391dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return res;
392dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
393dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
394dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
395dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
396dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
397dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
398dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
399dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
400dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjULong rol1 ( ULong x )
401dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
402dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj  return (x << 1) | (x >> 63);
403dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
404dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
405dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardjint main ( void )
406dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj{
407dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   UInt   n, op;
408dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong  carrydep, c, res;
409654b542166d7f2e8e89f1cd8430e7ed2ba96f230florian   char*  block;
410dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   ULong  reg;
411dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   Word   bitoff;
412dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
413dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /*------------------------ MEM-L -----------------------*/
414dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
415dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   carrydep = 0;
416dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   block = calloc(200,1);
417dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   block += 100;
418dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Valid bit offsets are -800 .. 799 inclusive. */
419dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
420dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   for (n = 0; n < 10000; n++) {
421dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      bitoff = (random() % 1600) - 800;
422dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      op = random() % 12;
423dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      c = 2;
424dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      switch (op) {
425dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  0: c = btsl_mem(block, bitoff); break;
426dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  1: c = btrl_mem(block, bitoff); break;
427dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  2: c = btcl_mem(block, bitoff); break;
428dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  3: c =  btl_mem(block, bitoff); break;
429dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  4: c = btsq_mem(block, bitoff); break;
430dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  5: c = btrq_mem(block, bitoff); break;
431dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  6: c = btcq_mem(block, bitoff); break;
432dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  7: c =  btq_mem(block, bitoff); break;
433dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  8: c = btsw_mem(block, bitoff); break;
434dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  9: c = btrw_mem(block, bitoff); break;
435dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case 10: c = btcw_mem(block, bitoff); break;
436dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case 11: c =  btw_mem(block, bitoff); break;
437dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         default: assert(0);
438dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      }
439dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      assert(c == 0 || c == 1);
440dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      carrydep = c ? (rol1(carrydep) ^ bitoff) : carrydep;
441dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   }
442dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
443dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Compute final result */
444dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   block -= 100;
445dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   res = 0;
446dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   for (n = 0; n < 200; n++) {
447dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      UChar ch = block[n];
448dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      /* printf("%d ", (int)block[n]); */
449dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      res = rol1(res) ^ (UInt)ch;
450dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   }
451dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
452dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   printf("MEM-L: final res 0x%llx, carrydep 0x%llx\n", res, carrydep);
453dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
454dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /*------------------------ REG-L -----------------------*/
455dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
456dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   carrydep = 0;
457dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   reg = 0;
458dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
459dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   for (n = 0; n < 1000; n++) {
460dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      bitoff = (random() % 100) - 50;
461dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      op = random() % 12;
462dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      c = 2;
463dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      switch (op) {
464dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  0: c = btsl_reg(reg, bitoff, &reg); break;
465dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  1: c = btrl_reg(reg, bitoff, &reg); break;
466dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  2: c = btcl_reg(reg, bitoff, &reg); break;
467dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  3: c =  btl_reg(reg, bitoff, &reg); break;
468dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  4: c = btsq_reg(reg, bitoff, &reg); break;
469dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  5: c = btrq_reg(reg, bitoff, &reg); break;
470dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  6: c = btcq_reg(reg, bitoff, &reg); break;
471dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  7: c =  btq_reg(reg, bitoff, &reg); break;
472dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  8: c = btsw_reg(reg, bitoff, &reg); break;
473dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case  9: c = btrw_reg(reg, bitoff, &reg); break;
474dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case 10: c = btcw_reg(reg, bitoff, &reg); break;
475dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         case 11: c =  btw_reg(reg, bitoff, &reg); break;
476dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj         default: assert(0);
477dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      }
478dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      assert(c == 0 || c == 1);
479dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      carrydep = c ? (rol1(carrydep) ^ bitoff) : carrydep;
480dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   }
481dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
482dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   printf("REG-L: final res 0x%llx, carrydep 0x%llx\n", reg, carrydep);
483dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
484dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   block += 100;
485dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
486dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   /* Just try one of these at once; more than one can cause a
487dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj      confusing merging of error messages. */
488dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   //btsl_mem(block, -800);  /* should not complain */
489dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   //btsl_mem(block, -801);  /* should complain */
490dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   //btsl_mem(block, 799);   /* should not complain */
491dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   //btsl_mem(block, 800);   /* should complain */
492dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
493dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   block -= 100;
494dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   free(block);
495dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
496dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj   return 0;
497dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj}
498dbdb36f1bc8a08b3ca2b684559074d7f2ddc4e9esewardj
499