1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h>
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VERBOSE 0
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned int            UInt;
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned char           UChar;
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned long long int  ULong;
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  signed long long int    Long;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  signed int              Int;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned short          UShort;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  unsigned long           UWord;
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef  char                    HChar;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// BEGIN crc32 stuff                                           //
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic const UInt crc32Table[256] = {
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*-- Ugly, innit? --*/
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define UPDATE_CRC(crcVar,cha)                 \
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{                                              \
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   crcVar = (crcVar << 8) ^                    \
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            crc32Table[(crcVar >> 24) ^        \
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       ((UChar)cha)];          \
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt crcBytes ( UChar* bytes, UWord nBytes, UInt crcIn )
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt crc = crcIn;
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (nBytes >= 4) {
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UPDATE_CRC(crc, bytes[0]);
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UPDATE_CRC(crc, bytes[1]);
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UPDATE_CRC(crc, bytes[2]);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UPDATE_CRC(crc, bytes[3]);
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bytes += 4;
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nBytes -= 4;
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   while (nBytes >= 1) {
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UPDATE_CRC(crc, bytes[0]);
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bytes += 1;
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      nBytes -= 1;
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return crc;
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt crcFinalise ( UInt crc ) {
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return ~crc;
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown////////
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic UInt theCRC = 0xFFFFFFFF;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic HChar outBuf[1024];
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// take output that's in outBuf, length as specified, and
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// update the running crc.
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic void send ( int nbytes )
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert( ((unsigned int)nbytes) < sizeof(outBuf)-1);
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   assert(outBuf[nbytes] == 0);
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   theCRC = crcBytes( (UChar*)&outBuf[0], nbytes, theCRC );
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (VERBOSE) printf("SEND %08x %s", theCRC, outBuf);
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// END crc32 stuff                                             //
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// full version
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define NVALS 76
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic ULong val[NVALS]
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    = { 0x00ULL, 0x01ULL, 0x02ULL, 0x03ULL,
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x3FULL, 0x40ULL, 0x41ULL,
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x7EULL, 0x7FULL, 0x80ULL, 0x81ULL, 0x82ULL,
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xBFULL, 0xC0ULL, 0xC1ULL,
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFCULL, 0xFDULL, 0xFEULL, 0xFFULL,
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF00ULL, 0xFF01ULL, 0xFF02ULL, 0xFF03ULL,
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF3FULL, 0xFF40ULL, 0xFF41ULL,
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF7EULL, 0xFF7FULL, 0xFF80ULL, 0xFF81ULL, 0xFF82ULL,
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFBFULL, 0xFFC0ULL, 0xFFC1ULL,
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFCULL, 0xFFFDULL, 0xFFFEULL, 0xFFFFULL,
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF00ULL, 0xFFFFFF01ULL, 0xFFFFFF02ULL, 0xFFFFFF03ULL,
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF3FULL, 0xFFFFFF40ULL, 0xFFFFFF41ULL,
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF7EULL, 0xFFFFFF7FULL, 0xFFFFFF80ULL, 0xFFFFFF81ULL, 0xFFFFFF82ULL,
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFBFULL, 0xFFFFFFC0ULL, 0xFFFFFFC1ULL,
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFCULL, 0xFFFFFFFDULL, 0xFFFFFFFEULL, 0xFFFFFFFFULL,
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF00ULL, 0xFFFFFFFFFFFFFF01ULL, 0xFFFFFFFFFFFFFF02ULL,
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               0xFFFFFFFFFFFFFF03ULL,
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF3FULL, 0xFFFFFFFFFFFFFF40ULL, 0xFFFFFFFFFFFFFF41ULL,
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF7EULL, 0xFFFFFFFFFFFFFF7FULL, 0xFFFFFFFFFFFFFF80ULL,
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               0xFFFFFFFFFFFFFF81ULL, 0xFFFFFFFFFFFFFF82ULL,
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFFBFULL, 0xFFFFFFFFFFFFFFC0ULL, 0xFFFFFFFFFFFFFFC1ULL,
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFFFCULL, 0xFFFFFFFFFFFFFFFDULL, 0xFFFFFFFFFFFFFFFEULL,
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               0xFFFFFFFFFFFFFFFFULL
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// shortened version, for use as valgrind regtest
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define NVALS 36
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic ULong val[NVALS]
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    = { 0x00ULL, 0x01ULL,
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x3FULL, 0x40ULL,
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x7FULL, 0x80ULL,
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xBFULL, 0xC0ULL,
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFULL,
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF00ULL, 0xFF01ULL,
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF3FULL, 0xFF40ULL,
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF7FULL, 0xFF80ULL,
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFBFULL, 0xFFC0ULL,
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFULL,
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF00ULL, 0xFFFFFF01ULL,
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF3FULL, 0xFFFFFF40ULL,
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF7EULL, 0xFFFFFF7FULL,
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFBFULL, 0xFFFFFFC0ULL,
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFULL,
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF00ULL, 0xFFFFFFFFFFFFFF01ULL,
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF3FULL, 0xFFFFFFFFFFFFFF40ULL,
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFF7FULL, 0xFFFFFFFFFFFFFF80ULL,
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFFBFULL, 0xFFFFFFFFFFFFFFC0ULL,
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFFFFFFFFFFULL
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_C    0x0001
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_P    0x0004
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_A    0x0010
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_Z    0x0040
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_S    0x0080
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_O    0x0800
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_MASK (CC_C | CC_P | CC_A | CC_Z | CC_S | CC_O)
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_G_E(_name,_eax)   \
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_G_E_##_name ( void )  \
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile Long e_val, g_val, e_val_before;   \
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long o, s, z, a, c, p, v1, v2, flags_in;       \
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long block[4];   \
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v1 = 0; v1 < NVALS; v1++) {   \
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      g_val = val[v1];   \
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = g_val;   \
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = (long)&e_val;   \
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[3] = 0;   \
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 0(%0), %%rax\n\t"   \
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushq %%rax\n\t"   \
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfq\n\t"   \
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 8(%0), %%rax\n\t"   \
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 16(%0), %%rbx\n\t"   \
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " %%" #_eax ",(%%rbx)\n\t"   \
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfq\n\t"   \
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popq %%rax\n\t"   \
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq %%rax, 24(%0)\n\t"   \
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "rax","rbx","cc","memory"   \
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      sprintf(outBuf, \
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             "%s G=%016llx E=%016llx CCIN=%08llx -> E=%016llx CCOUT=%08llx\n",       \
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             #_name, g_val, e_val_before, flags_in,   \
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              e_val, block[3] & CC_MASK));            \
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}   \
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addb,al)
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addw,ax)
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addl,eax)
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addq,rax)
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orb, al)
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orw, ax)
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orl, eax)
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orq, rax)
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcb,al)
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcw,ax)
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcl,eax)
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcq,rax)
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbb,al)
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbw,ax)
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbl,eax)
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbq,rax)
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andb,al)
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andw,ax)
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andl,eax)
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andq,rax)
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subb,al)
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subw,ax)
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subl,eax)
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subq,rax)
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorb,al)
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorw,ax)
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorl,eax)
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorq,rax)
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_imm_E(_name,_eax,_imm)        \
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_imm_E_##_name##_##_imm ( void )  \
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile Long e_val, e_val_before;   \
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long o, s, z, a, c, p, v2, flags_in;   \
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long block[3];   \
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = (long)&e_val;   \
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = 0;   \
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 0(%0), %%rax\n\t"   \
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushq %%rax\n\t"   \
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfq\n\t"   \
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 8(%0), %%rbx\n\t"   \
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " $" #_imm ",(%%rbx)\n\t"   \
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfq\n\t"   \
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popq %%rax\n\t"   \
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq %%rax, 16(%0)\n\t"   \
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "rax","rbx","cc","memory"   \
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           sprintf(outBuf, \
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           "%s I=%s E=%016llx CCIN=%08llx -> E=%016llx CCOUT=%08llx\n",    \
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             #_name, #_imm, e_val_before, flags_in,         \
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                   e_val, block[2] & CC_MASK));             \
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }   \
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addb,al,0x7F)
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addb,al,0xF1)
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addw,ax,0x7E)
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addw,ax,0x9325)
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addl,eax,0x7D)
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addl,eax,0x31415927)
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addq,rax,0x7D)
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addq,rax,0x31415927)
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orb,al,0x7F)
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orb,al,0xF1)
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orw,ax,0x7E)
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orw,ax,0x9325)
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orl,eax,0x7D)
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orl,eax,0x31415927)
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orq,rax,0x7D)
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orq,rax,0x31415927)
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcb,al,0x7F)
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcb,al,0xF1)
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcw,ax,0x7E)
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcw,ax,0x9325)
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcl,eax,0x7D)
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcl,eax,0x31415927)
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcq,rax,0x7D)
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcq,rax,0x31415927)
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbb,al,0x7F)
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbb,al,0xF1)
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbw,ax,0x7E)
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbw,ax,0x9325)
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbl,eax,0x7D)
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbl,eax,0x31415927)
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbq,rax,0x7D)
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbq,rax,0x31415927)
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andb,al,0x7F)
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andb,al,0xF1)
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andw,ax,0x7E)
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andw,ax,0x9325)
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andl,eax,0x7D)
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andl,eax,0x31415927)
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andq,rax,0x7D)
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andq,rax,0x31415927)
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subb,al,0x7F)
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subb,al,0xF1)
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subw,ax,0x7E)
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subw,ax,0x9325)
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subl,eax,0x7D)
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subl,eax,0x31415927)
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subq,rax,0x7D)
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subq,rax,0x31415927)
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorb,al,0x7F)
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorb,al,0xF1)
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorw,ax,0x7E)
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorw,ax,0x9325)
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorl,eax,0x7D)
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorl,eax,0x31415927)
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorq,rax,0x7D)
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorq,rax,0x31415927)
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_unary_E(_name,_eax)        \
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_unary_E_##_name ( void )  \
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile Long e_val, e_val_before;   \
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long o, s, z, a, c, p, v2, flags_in;     \
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Long block[3];   \
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = (long)&e_val;   \
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = 0;   \
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 0(%0), %%rax\n\t"   \
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushq %%rax\n\t"   \
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfq\n\t"   \
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq 8(%0), %%rbx\n\t"   \
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " (%%rbx)\n\t"   \
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfq\n\t"   \
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popq %%rax\n\t"   \
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movq %%rax, 16(%0)\n\t"   \
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "rax","rbx","cc","memory"   \
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           sprintf(outBuf, \
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            "%s E=%016llx CCIN=%08llx -> E=%016llx CCOUT=%08llx\n", \
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             #_name, e_val_before, flags_in,         \
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            e_val, block[2] & CC_MASK));                       \
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }   \
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decb,al)
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decw,ax)
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decl,eax)
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decq,rax)
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incb,al)
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incw,ax)
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incl,eax)
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incq,rax)
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negb,al)
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negw,ax)
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negl,eax)
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negq,rax)
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notb,al)
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notw,ax)
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notl,eax)
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notq,rax)
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btsq_mem ( UChar* base, int bitno )
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btsq\t%2, %0\n\t"
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno) : "rdx","cc","memory" );
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Pretty meaningless to dereference base here, but that's what you
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      have to do to get a btsl insn which refers to memory starting at
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      base. */
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btsl_mem ( UChar* base, int bitno )
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btsl\t%2, %0\n\t"
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((UInt)bitno));
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btsw_mem ( UChar* base, int bitno )
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btsw\t%w2, %0\n\t"
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btrq_mem ( UChar* base, int bitno )
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btrq\t%2, %0\n\t"
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btrl_mem ( UChar* base, int bitno )
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btrl\t%2, %0\n\t"
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((UInt)bitno));
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btrw_mem ( UChar* base, int bitno )
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btrw\t%w2, %0\n\t"
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btcq_mem ( UChar* base, int bitno )
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btcq\t%2, %0\n\t"
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btcl_mem ( UChar* base, int bitno )
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btcl\t%2, %0\n\t"
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((UInt)bitno));
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btcw_mem ( UChar* base, int bitno )
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btcw\t%w2, %0\n\t"
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btq_mem ( UChar* base, int bitno )
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("btq\t%2, %0\n\t"
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno)
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "cc", "memory");
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btl_mem ( UChar* base, int bitno )
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("btl\t%2, %0\n\t"
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((UInt)bitno)
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "cc", "memory");
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong btw_mem ( UChar* base, int bitno )
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong res;
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("btw\t%w2, %0\n\t"
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc   %%dl\n\t"
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "movzbq %%dl,%1\n"
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=r" (res)
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" ((ULong)bitno));
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rol1 ( ULong x )
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (x << 1) | (x >> 63);
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_bt_G_E_tests ( void )
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong  n, bitoff, op;
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong  c;
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* block;
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong  carrydep, res;;
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*------------------------ MEM-Q -----------------------*/
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carrydep = 0;
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block = calloc(200,1);
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block += 100;
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Valid bit offsets are -800 .. 799 inclusive. */
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 10000; n++) {
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bitoff = (random() % 1600) - 800;
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op = random() % 4;
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = 2;
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (op) {
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 0: c = btsq_mem(block, bitoff); break;
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: c = btrq_mem(block, bitoff); break;
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: c = btcq_mem(block, bitoff); break;
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 3: c = btq_mem(block, bitoff); break;
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c &= 255;
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(c == 0 || c == 1);
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      carrydep = c ? (rol1(carrydep) ^ (Long)bitoff) : carrydep;
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compute final result */
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block -= 100;
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0;
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 200; n++) {
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch = block[n];
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* printf("%d ", (int)block[n]); */
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = rol1(res) ^ (ULong)ch;
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   send( sprintf(outBuf,
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "bt{s,r,c}q: final res 0x%llx, carrydep 0x%llx\n",
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 res, carrydep));
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(block);
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*------------------------ MEM-L -----------------------*/
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carrydep = 0;
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block = calloc(200,1);
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block += 100;
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Valid bit offsets are -800 .. 799 inclusive. */
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 10000; n++) {
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bitoff = (random() % 1600) - 800;
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op = random() % 4;
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = 2;
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (op) {
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 0: c = btsl_mem(block, bitoff); break;
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: c = btrl_mem(block, bitoff); break;
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: c = btcl_mem(block, bitoff); break;
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 3: c = btl_mem(block, bitoff); break;
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c &= 255;
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(c == 0 || c == 1);
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      carrydep = c ? (rol1(carrydep) ^ (Long)(Int)bitoff) : carrydep;
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compute final result */
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block -= 100;
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0;
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 200; n++) {
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch = block[n];
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* printf("%d ", (int)block[n]); */
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = rol1(res) ^ (ULong)ch;
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   send( sprintf(outBuf,
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "bt{s,r,c}l: final res 0x%llx, carrydep 0x%llx\n",
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 res, carrydep));
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(block);
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*------------------------ MEM-W -----------------------*/
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carrydep = 0;
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block = calloc(200,1);
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block += 100;
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Valid bit offsets are -800 .. 799 inclusive. */
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 10000; n++) {
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bitoff = (random() % 1600) - 800;
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op = random() % 4;
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = 2;
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (op) {
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 0: c = btsw_mem(block, bitoff); break;
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: c = btrw_mem(block, bitoff); break;
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: c = btcw_mem(block, bitoff); break;
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 3: c = btw_mem(block, bitoff); break;
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c &= 255;
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(c == 0 || c == 1);
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      carrydep = c ? (rol1(carrydep) ^ (Long)(Int)bitoff) : carrydep;
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compute final result */
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block -= 100;
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0;
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 200; n++) {
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch = block[n];
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* printf("%d ", (int)block[n]); */
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = rol1(res) ^ (ULong)ch;
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   send(sprintf(outBuf,
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "bt{s,r,c}w: final res 0x%llx, carrydep 0x%llx\n",
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                res, carrydep));
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(block);
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Given a word, do bt/bts/btr/btc on bits 0, 1, 2 and 3 of it, and
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   also reconstruct the original bits 0, 1, 2, 3 by looking at the
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carry flag.  Returned result has mashed bits 0-3 at the bottom and
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the reconstructed original bits 0-3 as 4-7. */
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong mash_mem_Q ( ULong* origp )
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ULong reconstructed, mashed;
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __asm__ __volatile__ (
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %2, %%rdx\n\t"
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ""
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq $0, %%rax\n\t"
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "btq  $0, (%%rdx)\n\t"
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btsq $1, (%%rdx)\n\t"
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $1, %%rcx\n\t"
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btrq $2, (%%rdx)\n\t"
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $2, %%rcx\n\t"
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btcq $3, (%%rdx)\n\t"
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $3, %%rcx\n\t"
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %%rax, %0\n\t"
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq (%%rdx), %1"
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "=r" (reconstructed), "=r" (mashed)
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "r" (origp)
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "rax", "rcx", "rdx", "cc");
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (mashed & 0xF) | ((reconstructed & 0xF) << 4);
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong mash_mem_L ( UInt* origp )
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ULong reconstructed; UInt mashed;
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __asm__ __volatile__ (
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %2, %%rdx\n\t"
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ""
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq $0, %%rax\n\t"
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "btl  $0, (%%rdx)\n\t"
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btsl $1, (%%rdx)\n\t"
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $1, %%rcx\n\t"
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btrl $2, (%%rdx)\n\t"
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $2, %%rcx\n\t"
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btcl $3, (%%rdx)\n\t"
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $3, %%rcx\n\t"
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %%rax, %0\n\t"
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl (%%rdx), %1"
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "=r" (reconstructed), "=r" (mashed)
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "r" (origp)
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "rax", "rcx", "rdx", "cc");
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (mashed & 0xF) | ((reconstructed & 0xF) << 4);
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong mash_mem_W ( UShort* origp )
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ULong reconstructed, mashed;
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __asm__ __volatile__ (
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %2, %%rdx\n\t"
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ""
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq $0, %%rax\n\t"
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "btw  $0, (%%rdx)\n\t"
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
865ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
866ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
867ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btsw $1, (%%rdx)\n\t"
868ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
869ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
870ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $1, %%rcx\n\t"
871ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
872ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
873ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btrw $2, (%%rdx)\n\t"
874ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
875ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
876ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $2, %%rcx\n\t"
877ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
878ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
879ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btcw $3, (%%rdx)\n\t"
880ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
881ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbq %%cl, %%rcx\n\t"
882ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shlq $3, %%rcx\n\t"
883ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orq %%rcx, %%rax\n\t"
884ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
885ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movq %%rax, %0\n\t"
886ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzwq (%%rdx), %1"
887ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "=r" (reconstructed), "=r" (mashed)
888ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "r" (origp)
889ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "rax", "rcx", "rdx", "cc");
890ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (mashed & 0xF) | ((reconstructed & 0xF) << 4);
891ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
892ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
893ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
894ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_bt_imm_E_tests( void )
895ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
896ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ULong i;
897ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  ULong*  iiq = malloc(sizeof(ULong));
898ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UInt*   iil = malloc(sizeof(UInt));
899ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UShort* iiw = malloc(sizeof(UShort));
900ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 0x10; i++) {
901ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *iiq = i;
902ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *iil = i;
903ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *iiw = i;
904ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    send(sprintf(outBuf,"0x%llx -> 0x%02llx 0x%02llx 0x%02llx\n", i,
905ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 mash_mem_Q(iiq), mash_mem_L(iil), mash_mem_W(iiw)));
906ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
907ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free(iiq);
908ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free(iil);
909ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free(iiw);
910ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
911ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
912ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
913ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
914ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
915ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
916ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
917ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addb();
918ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addw();
919ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addl();
920ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addq();
921ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
922ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orb();
923ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orw();
924ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orl();
925ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orq();
926ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
927ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcb();
928ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcw();
929ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcl();
930ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcq();
931ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
932ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbb();
933ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbw();
934ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbl();
935ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbq();
936ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
937ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andb();
938ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andw();
939ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andl();
940ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andq();
941ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
942ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subb();
943ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subw();
944ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subl();
945ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subq();
946ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
947ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorb();
948ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorw();
949ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorl();
950ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorq();
951ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 4 * 7
952ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
953ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addb_0x7F();
954ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addb_0xF1();
955ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addw_0x7E();
956ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addw_0x9325();
957ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addl_0x7D();
958ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addl_0x31415927();
959ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addq_0x7D();
960ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addq_0x31415927();
961ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
962ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orb_0x7F();
963ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orb_0xF1();
964ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orw_0x7E();
965ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orw_0x9325();
966ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orl_0x7D();
967ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orl_0x31415927();
968ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orq_0x7D();
969ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orq_0x31415927();
970ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
971ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcb_0x7F();
972ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcb_0xF1();
973ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcw_0x7E();
974ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcw_0x9325();
975ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcl_0x7D();
976ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcl_0x31415927();
977ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcq_0x7D();
978ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcq_0x31415927();
979ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
980ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbb_0x7F();
981ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbb_0xF1();
982ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbw_0x7E();
983ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbw_0x9325();
984ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbl_0x7D();
985ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbl_0x31415927();
986ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbq_0x7D();
987ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbq_0x31415927();
988ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
989ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andb_0x7F();
990ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andb_0xF1();
991ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andw_0x7E();
992ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andw_0x9325();
993ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andl_0x7D();
994ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andl_0x31415927();
995ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andq_0x7D();
996ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andq_0x31415927();
997ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
998ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subb_0x7F();
999ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subb_0xF1();
1000ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subw_0x7E();
1001ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subw_0x9325();
1002ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subl_0x7D();
1003ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subl_0x31415927();
1004ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subq_0x7D();
1005ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subq_0x31415927();
1006ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1007ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorb_0x7F();
1008ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorb_0xF1();
1009ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorw_0x7E();
1010ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorw_0x9325();
1011ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorl_0x7D();
1012ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorl_0x31415927();
1013ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorq_0x7D();
1014ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorq_0x31415927();
1015ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 4 * 7 + 8 * 7 == 84
1016ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1017ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decb();
1018ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decw();
1019ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decl();
1020ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decq();
1021ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1022ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incb();
1023ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incw();
1024ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incl();
1025ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incq();
1026ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1027ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negb();
1028ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negw();
1029ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negl();
1030ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negq();
1031ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1032ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notb();
1033ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notw();
1034ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notl();
1035ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notq();
1036ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 100
1037ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1038ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_bt_G_E_tests();
1039ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 109
1040ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_bt_imm_E_tests();
1041ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 118
1042ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1043ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // So there should be 118 lock-prefixed instructions in the
1044ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // disassembly of this compilation unit.
1045ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // confirm with
1046ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // objdump -d ./amd64locked | grep lock | grep -v do_lock | grep -v elf64 | wc
1047ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1048ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1049ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  { UInt crcExpd = 0x1F677629;
1050ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    theCRC = crcFinalise( theCRC );
1051ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    if (theCRC == crcExpd) {
1052ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("amd64locked: PASS: CRCs actual 0x%08X expected 0x%08X\n",
1053ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              theCRC, crcExpd);
1054ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    } else {
1055ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("amd64locked: FAIL: CRCs actual 0x%08X expected 0x%08X\n",
1056ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              theCRC, crcExpd);
1057ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("amd64locked: set #define VERBOSE 1 to diagnose\n");
1058ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
1059ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
1060ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
1061ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
1062ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
1063