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 57
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic unsigned int val[NVALS]
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    = { 0x00, 0x01, 0x02, 0x03,
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x3F, 0x40, 0x41,
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x7E, 0x7F, 0x80, 0x81, 0x82,
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xBF, 0xC0, 0xC1,
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFC, 0xFD, 0xFE, 0xFF,
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF00, 0xFF01, 0xFF02, 0xFF03,
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF3F, 0xFF40, 0xFF41,
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82,
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFBF, 0xFFC0, 0xFFC1,
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF00, 0xFFFFFF01, 0xFFFFFF02, 0xFFFFFF03,
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF3F, 0xFFFFFF40, 0xFFFFFF41,
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF7E, 0xFFFFFF7F, 0xFFFFFF80, 0xFFFFFF81, 0xFFFFFF82,
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFBF, 0xFFFFFFC0, 0xFFFFFFC1,
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFC, 0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFF
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// shortened version, for use as valgrind regtest
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define NVALS 27
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic unsigned int val[NVALS]
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    = { 0x00, 0x01,
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x3F, 0x40,
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0x7F, 0x80,
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xBF, 0xC0,
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF,
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF00, 0xFF01,
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF3F, 0xFF40,
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFF7F, 0xFF80,
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFBF, 0xFFC0,
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFF,
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF00, 0xFFFFFF01,
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF3F, 0xFFFFFF40,
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFF7F, 0xFFFFFF80,
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFBF, 0xFFFFFFC0,
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        0xFFFFFFFF
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      };
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_C    0x0001
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_P    0x0004
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_A    0x0010
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_Z    0x0040
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_S    0x0080
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_O    0x0800
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CC_MASK (CC_C | CC_P | CC_A | CC_Z | CC_S | CC_O)
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_G_E(_name,_eax)   \
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_G_E_##_name ( void )  \
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile int e_val, g_val, e_val_before;   \
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int o, s, z, a, c, p, v1, v2, flags_in;   \
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int block[4];   \
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v1 = 0; v1 < NVALS; v1++) {   \
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      g_val = val[v1];   \
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = g_val;   \
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = (int)(long)&e_val;   \
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[3] = 0;   \
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 0(%0), %%eax\n\t"   \
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushl %%eax\n\t"   \
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfl\n\t"   \
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 4(%0), %%eax\n\t"   \
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 8(%0), %%ebx\n\t"   \
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " %%" #_eax ",(%%ebx)\n\t"   \
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfl\n\t"   \
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popl %%eax\n\t"   \
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl %%eax, 12(%0)\n\t"   \
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "eax","ebx","cc","memory"   \
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         sprintf(outBuf,                                        \
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "%s G=%08x E=%08x CCIN=%08x -> E=%08x CCOUT=%08x\n", \
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 #_name, g_val, e_val_before, flags_in,   \
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 e_val, block[3] & CC_MASK) );            \
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}   \
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addb,al)
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addw,ax)
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(addl,eax)
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orb, al)
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orw, ax)
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(orl, eax)
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcb,al)
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcw,ax)
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(adcl,eax)
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbb,al)
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbw,ax)
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(sbbl,eax)
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andb,al)
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andw,ax)
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(andl,eax)
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subb,al)
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subw,ax)
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(subl,eax)
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorb,al)
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorw,ax)
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_G_E(xorl,eax)
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_imm_E(_name,_eax,_imm)        \
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_imm_E_##_name##_##_imm ( void )  \
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile int e_val, e_val_before;   \
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int o, s, z, a, c, p, v2, flags_in;   \
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int block[3];   \
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = (int)(long)&e_val;   \
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = 0;   \
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 0(%0), %%eax\n\t"   \
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushl %%eax\n\t"   \
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfl\n\t"   \
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 4(%0), %%ebx\n\t"   \
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " $" #_imm ",(%%ebx)\n\t"   \
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfl\n\t"   \
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popl %%eax\n\t"   \
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl %%eax, 8(%0)\n\t"   \
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "eax","ebx","cc","memory"   \
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        sprintf(outBuf, \
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             "%s I=%s E=%08x CCIN=%08x -> E=%08x CCOUT=%08x\n",       \
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             #_name, #_imm, e_val_before, flags_in,         \
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                e_val, block[2] & CC_MASK) );               \
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }   \
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addb,al,0x7F)
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addb,al,0xF1)
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addw,ax,0x7E)
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addw,ax,0x9325)
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addl,eax,0x7D)
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(addl,eax,0x31415927)
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orb,al,0x7F)
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orb,al,0xF1)
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orw,ax,0x7E)
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orw,ax,0x9325)
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orl,eax,0x7D)
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(orl,eax,0x31415927)
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcb,al,0x7F)
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcb,al,0xF1)
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcw,ax,0x7E)
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcw,ax,0x9325)
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcl,eax,0x7D)
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(adcl,eax,0x31415927)
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbb,al,0x7F)
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbb,al,0xF1)
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbw,ax,0x7E)
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbw,ax,0x9325)
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbl,eax,0x7D)
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(sbbl,eax,0x31415927)
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andb,al,0x7F)
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andb,al,0xF1)
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andw,ax,0x7E)
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andw,ax,0x9325)
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andl,eax,0x7D)
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(andl,eax,0x31415927)
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subb,al,0x7F)
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subb,al,0xF1)
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subw,ax,0x7E)
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subw,ax,0x9325)
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subl,eax,0x7D)
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(subl,eax,0x31415927)
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorb,al,0x7F)
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorb,al,0xF1)
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorw,ax,0x7E)
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorw,ax,0x9325)
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorl,eax,0x7D)
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_imm_E(xorl,eax,0x31415927)
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GEN_do_locked_unary_E(_name,_eax)        \
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  \
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __attribute__((noinline)) void do_locked_unary_E_##_name ( void )  \
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {   \
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    volatile int e_val, e_val_before;   \
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int o, s, z, a, c, p, v2, flags_in;   \
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    int block[3];   \
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (v2 = 0; v2 < NVALS; v2++) {   \
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (o = 0; o < 2; o++) {   \
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (s = 0; s < 2; s++) {   \
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (z = 0; z < 2; z++) {   \
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (a = 0; a < 2; a++) {   \
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (c = 0; c < 2; c++) {   \
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    for (p = 0; p < 2; p++) {   \
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      flags_in = (o ? CC_O : 0)   \
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (s ? CC_S : 0)   \
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (z ? CC_Z : 0)   \
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (a ? CC_A : 0)   \
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (c ? CC_C : 0)   \
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown               | (p ? CC_P : 0);   \
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val = val[v2];   \
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      e_val_before = e_val;   \
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[0] = flags_in;   \
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[1] = (int)(long)&e_val;   \
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      block[2] = 0;   \
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      __asm__ __volatile__(   \
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 0(%0), %%eax\n\t"   \
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushl %%eax\n\t"   \
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popfl\n\t"   \
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl 4(%0), %%ebx\n\t"   \
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "lock; " #_name " (%%ebx)\n\t"   \
430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "pushfl\n\t"   \
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "popl %%eax\n\t"   \
432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          "movl %%eax, 8(%0)\n\t"   \
433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown          : : "r"(&block[0]) : "eax","ebx","cc","memory"   \
434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      );   \
435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      send( \
437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         sprintf(outBuf, \
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "%s E=%08x CCIN=%08x -> E=%08x CCOUT=%08x\n",   \
439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown             #_name, e_val_before, flags_in,         \
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                e_val, block[2] & CC_MASK));         \
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      \
442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }}}}}}   \
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    \
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }   \
445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decb,al)
448ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decw,ax)
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(decl,eax)
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incb,al)
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incw,ax)
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(incl,eax)
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negb,al)
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negw,ax)
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(negl,eax)
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notb,al)
460ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notw,ax)
461ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownGEN_do_locked_unary_E(notl,eax)
462ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
463ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btsl_mem ( UChar* base, int bitno )
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btsl\t%2, %0\n\t"
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Pretty meaningless to dereference base here, but that's what you
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      have to do to get a btsl insn which refers to memory starting at
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      base. */
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btsw_mem ( UChar* base, int bitno )
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btsw\t%w2, %0\n\t"
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btrl_mem ( UChar* base, int bitno )
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btrl\t%2, %0\n\t"
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btrw_mem ( UChar* base, int bitno )
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btrw\t%w2, %0\n\t"
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btcl_mem ( UChar* base, int bitno )
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btcl\t%2, %0\n\t"
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btcw_mem ( UChar* base, int bitno )
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("lock; btcw\t%w2, %0\n\t"
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btl_mem ( UChar* base, int bitno )
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("btl\t%2, %0\n\t"
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno)
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "cc", "memory");
541ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
542ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
543ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunsigned int btw_mem ( UChar* base, int bitno )
544ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
545ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   unsigned char res;
546ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __asm__
547ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __volatile__("btw\t%w2, %0\n\t"
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                "setc\t%1"
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "=m" (*base), "=q" (res)
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                : "r" (bitno));
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return res;
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rol1 ( ULong x )
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (x << 1) | (x >> 63);
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_bt_G_E_tests ( void )
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt   n, bitoff, op;
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UInt   c;
563ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   UChar* block;
564ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ULong  carrydep, res;;
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*------------------------ MEM-L -----------------------*/
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carrydep = 0;
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block = calloc(200,1);
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block += 100;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Valid bit offsets are -800 .. 799 inclusive. */
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 10000; n++) {
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bitoff = (random() % 1600) - 800;
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op = random() % 4;
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = 2;
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (op) {
578ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 0: c = btsl_mem(block, bitoff); break;
579ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: c = btrl_mem(block, bitoff); break;
580ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: c = btcl_mem(block, bitoff); break;
581ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 3: c = btl_mem(block, bitoff); break;
582ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
583ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c &= 255;
584ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(c == 0 || c == 1);
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      carrydep = c ? (rol1(carrydep) ^ (Long)(Int)bitoff) : carrydep;
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compute final result */
589ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block -= 100;
590ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0;
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 200; n++) {
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch = block[n];
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* printf("%d ", (int)block[n]); */
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = rol1(res) ^ (ULong)ch;
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
596ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
597ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   send( sprintf(outBuf,
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "bt{s,r,c}l: final res 0x%llx, carrydep 0x%llx\n",
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 res, carrydep ));
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(block);
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*------------------------ MEM-W -----------------------*/
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carrydep = 0;
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block = calloc(200,1);
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block += 100;
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Valid bit offsets are -800 .. 799 inclusive. */
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 10000; n++) {
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      bitoff = (random() % 1600) - 800;
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      op = random() % 4;
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c = 2;
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      switch (op) {
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 0: c = btsw_mem(block, bitoff); break;
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 1: c = btrw_mem(block, bitoff); break;
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 2: c = btcw_mem(block, bitoff); break;
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         case 3: c = btw_mem(block, bitoff); break;
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      }
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      c &= 255;
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      assert(c == 0 || c == 1);
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      carrydep = c ? (rol1(carrydep) ^ (Long)(Int)bitoff) : carrydep;
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Compute final result */
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   block -= 100;
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0;
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for (n = 0; n < 200; n++) {
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar ch = block[n];
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* printf("%d ", (int)block[n]); */
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      res = rol1(res) ^ (ULong)ch;
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   send( sprintf(outBuf,
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 "bt{s,r,c}w: final res 0x%llx, carrydep 0x%llx\n",
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                 res, carrydep ));
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   free(block);
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Given a word, do bt/bts/btr/btc on bits 0, 1, 2 and 3 of it, and
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   also reconstruct the original bits 0, 1, 2, 3 by looking at the
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   carry flag.  Returned result has mashed bits 0-3 at the bottom and
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the reconstructed original bits 0-3 as 4-7. */
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt mash_mem_L ( UInt* origp )
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UInt reconstructed, mashed;
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __asm__ __volatile__ (
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl %2, %%edx\n\t"
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ""
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl $0, %%eax\n\t"
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "btl  $0, (%%edx)\n\t"
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btsl $1, (%%edx)\n\t"
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $1, %%ecx\n\t"
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btrl $2, (%%edx)\n\t"
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $2, %%ecx\n\t"
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btcl $3, (%%edx)\n\t"
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $3, %%ecx\n\t"
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl %%eax, %0\n\t"
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl (%%edx), %1"
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "=r" (reconstructed), "=r" (mashed)
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "r" (origp)
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "eax", "ecx", "edx", "cc");
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (mashed & 0xF) | ((reconstructed & 0xF) << 4);
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt mash_mem_W ( UShort* origp )
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UInt reconstructed, mashed;
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  __asm__ __volatile__ (
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl %2, %%edx\n\t"
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     ""
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl $0, %%eax\n\t"
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "btw  $0, (%%edx)\n\t"
696ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
697ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
698ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
699ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
700ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btsw $1, (%%edx)\n\t"
701ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
702ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
703ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $1, %%ecx\n\t"
704ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
705ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
706ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btrw $2, (%%edx)\n\t"
707ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
708ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
709ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $2, %%ecx\n\t"
710ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
711ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
712ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "lock; btcw $3, (%%edx)\n\t"
713ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "setb %%cl\n\t"
714ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzbl %%cl, %%ecx\n\t"
715ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "shll $3, %%ecx\n\t"
716ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "orl %%ecx, %%eax\n\t"
717ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "\n\t"
718ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movl %%eax, %0\n\t"
719ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     "movzwl (%%edx), %1"
720ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
721ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "=r" (reconstructed), "=r" (mashed)
722ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "r" (origp)
723ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     : "eax", "ecx", "edx", "cc");
724ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return (mashed & 0xF) | ((reconstructed & 0xF) << 4);
725ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
726ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
727ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
728ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_bt_imm_E_tests( void )
729ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
730ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int i;
731ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UInt*   iil = malloc(sizeof(UInt));
732ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  UShort* iiw = malloc(sizeof(UShort));
733ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  for (i = 0; i < 0x10; i++) {
734ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *iil = i;
735ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    *iiw = i;
736ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    send( sprintf(outBuf, "0x%x -> 0x%02x 0x%02x\n", i,
737ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  mash_mem_L(iil), mash_mem_W(iiw)));
738ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
739ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free(iil);
740ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  free(iiw);
741ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
742ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
743ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
744ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
745ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/////////////////////////////////////////////////////////////////
746ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
747ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
748ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
749ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addb();
750ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addw();
751ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_addl();
752ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
753ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orb();
754ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orw();
755ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_orl();
756ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
757ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcb();
758ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcw();
759ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_adcl();
760ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
761ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbb();
762ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbw();
763ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_sbbl();
764ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
765ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andb();
766ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andw();
767ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_andl();
768ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
769ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subb();
770ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subw();
771ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_subl();
772ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
773ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorb();
774ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorw();
775ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_G_E_xorl();
776ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  //21
777ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addb_0x7F();
778ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addb_0xF1();
779ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addw_0x7E();
780ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addw_0x9325();
781ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addl_0x7D();
782ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_addl_0x31415927();
783ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
784ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orb_0x7F();
785ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orb_0xF1();
786ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orw_0x7E();
787ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orw_0x9325();
788ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orl_0x7D();
789ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_orl_0x31415927();
790ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
791ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcb_0x7F();
792ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcb_0xF1();
793ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcw_0x7E();
794ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcw_0x9325();
795ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcl_0x7D();
796ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_adcl_0x31415927();
797ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
798ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbb_0x7F();
799ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbb_0xF1();
800ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbw_0x7E();
801ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbw_0x9325();
802ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbl_0x7D();
803ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_sbbl_0x31415927();
804ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
805ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andb_0x7F();
806ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andb_0xF1();
807ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andw_0x7E();
808ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andw_0x9325();
809ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andl_0x7D();
810ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_andl_0x31415927();
811ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
812ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subb_0x7F();
813ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subb_0xF1();
814ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subw_0x7E();
815ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subw_0x9325();
816ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subl_0x7D();
817ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_subl_0x31415927();
818ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
819ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorb_0x7F();
820ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorb_0xF1();
821ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorw_0x7E();
822ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorw_0x9325();
823ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorl_0x7D();
824ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_imm_E_xorl_0x31415927();
825ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 63
826ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decb();
827ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decw();
828ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_decl();
829ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
830ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incb();
831ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incw();
832ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_incl();
833ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
834ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negb();
835ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negw();
836ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_negl();
837ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
838ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notb();
839ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notw();
840ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_locked_unary_E_notl();
841ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 75
842ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_bt_G_E_tests();
843ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 81
844ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  do_bt_imm_E_tests();
845ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // 87
846ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // So there should be 87 lock-prefixed instructions in the
847ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // disassembly of this compilation unit.
848ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // confirm with
849ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  // objdump -d ./x86locked | grep lock | grep -v do_lock | grep -v elf32 | wc
850ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
851ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  { UInt crcExpd = 0x8235DC9C;
852ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    theCRC = crcFinalise( theCRC );
853ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    if (theCRC == crcExpd) {
854ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("x86locked: PASS: CRCs actual 0x%08X expected 0x%08X\n",
855ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              theCRC, crcExpd);
856ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    } else {
857ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("x86locked: FAIL: CRCs actual 0x%08X expected 0x%08X\n",
858ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown              theCRC, crcExpd);
859ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       printf("x86locked: set #define VERBOSE 1 to diagnose\n");
860ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    }
861ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
862ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
863ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
864ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
865