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