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