1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <assert.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int UInt; 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Given a word, do bt/bts/btr/btc on bits 0, 1, 2 and 3 of it, and 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown also reconstruct the original bits 0, 1, 2, 3 by looking at the 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown carry flag. Returned result has mashed bits 0-3 at the bottom and 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the reconstructed original bits 0-3 as 4-7. */ 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt mash_reg_L ( UInt orig ) 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt reconstructed, mashed; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__ ( 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %2, %%edx\n\t" 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "" 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl $0, %%eax\n\t" 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btl $0, %%edx\n\t" 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btsl $1, %%edx\n\t" 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $1, %%ecx\n\t" 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btrl $2, %%edx\n\t" 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $2, %%ecx\n\t" 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btcl $3, %%edx\n\t" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $3, %%ecx\n\t" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%eax, %0\n\t" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%edx, %1" 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "=r" (reconstructed), "=r" (mashed) 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "r" (orig) 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "eax", "ecx", "edx", "cc"); 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (mashed & 0xF) | ((reconstructed & 0xF) << 4); 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt mash_mem_L ( int* origp ) 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt reconstructed, mashed; 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__ ( 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %2, %%edx\n\t" 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "" 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl $0, %%eax\n\t" 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btl $0, (%%edx)\n\t" 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btsl $1, (%%edx)\n\t" 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $1, %%ecx\n\t" 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btrl $2, (%%edx)\n\t" 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $2, %%ecx\n\t" 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btcl $3, (%%edx)\n\t" 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $3, %%ecx\n\t" 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%eax, %0\n\t" 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl (%%edx), %1" 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "=r" (reconstructed), "=r" (mashed) 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "r" (origp) 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "eax", "ecx", "edx", "cc"); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (mashed & 0xF) | ((reconstructed & 0xF) << 4); 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownUInt mash_reg_W ( UInt orig ) 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt reconstructed, mashed; 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__ ( 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %2, %%edx\n\t" 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "" 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl $0, %%eax\n\t" 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btw $0, %%dx\n\t" 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btsw $1, %%dx\n\t" 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $1, %%ecx\n\t" 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btrw $2, %%dx\n\t" 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $2, %%ecx\n\t" 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "btcw $3, %%dx\n\t" 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "setb %%cl\n\t" 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movzbl %%cl, %%ecx\n\t" 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "shll $3, %%ecx\n\t" 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "orl %%ecx, %%eax\n\t" 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "\n\t" 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%eax, %0\n\t" 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "movl %%edx, %1" 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "=r" (reconstructed), "=r" (mashed) 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "r" (orig) 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : "eax", "ecx", "edx", "cc"); 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (mashed & 0xF) | ((reconstructed & 0xF) << 4); 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void ) 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i, ii; 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < 0x10; i++) { 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ii = i; 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("0x%x -> 0x%2x 0x%2x 0x%2x\n", i, 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mash_reg_L(i), mash_mem_L(&ii), mash_reg_W(i)); 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 1; 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 151