xor.h revision b32f58018498ea2225959b0ba11c18f0c433deef
1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h> 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Dummy variable. Needed to work around GCC code generation bugs */ 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvolatile long v; 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_REG_MEM(insn, s1, s2) \ 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long tmp = s1; \ 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( #insn " %0, %3\n" \ 11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp), "Q" (s2) \ 15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "0", "cc"); \ 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf(#insn " %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \ 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_REG_REG(insn, s1, s2) \ 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long tmp = s1; \ 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( #insn " %0, %3\n" \ 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp), "d" (s2) \ 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "0", "cc"); \ 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf(#insn " %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \ 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_REG_IMM(insn, s1, s2) \ 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long tmp asm("2") = s1; \ 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( insn(2,s2) \ 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp) \ 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "cc"); \ 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v = tmp; /* work around GCC code gen bug */ \ 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf(#insn " %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) 0x##s2, v, cc); \ 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_MEM_IMM(insn, s1, s2) \ 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long tmp = s1; \ 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( #insn " %0," #s2 "\n" \ 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+Q" (tmp), "=d" (cc) \ 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "Q" (tmp) \ 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "0", "cc"); \ 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf(#insn " %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) s2, tmp, cc); \ 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memsweep(i, s2) \ 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0ul, s2); \ 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 1ul, s2); \ 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0xfffful, s2); \ 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x7ffful, s2); \ 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x8000ul, s2); \ 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0xfffffffful, s2); \ 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x80000000ul, s2); \ 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x7ffffffful, s2); \ 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x8000000000000000ul, s2); \ 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0xfffffffffffffffful, s2); \ 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_MEM(i, 0x5555555555555555ul, s2); \ 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define regsweep(i, s2) \ 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0ul, s2); \ 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 1ul, s2); \ 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0xfffful, s2); \ 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x7ffful, s2); \ 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x8000ul, s2); \ 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0xfffffffful, s2); \ 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x80000000ul, s2); \ 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x7ffffffful, s2); \ 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x8000000000000000ul, s2); \ 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0xfffffffffffffffful, s2); \ 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_REG(i, 0x5555555555555555ul, s2); \ 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define immsweep(i, s2) \ 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0ul, s2); \ 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 1ul, s2); \ 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0xfffful, s2); \ 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x7ffful, s2); \ 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x8000ul, s2); \ 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0xfffffffful, s2); \ 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x80000000ul, s2); \ 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x7ffffffful, s2); \ 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x8000000000000000ul, s2); \ 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0xfffffffffffffffful, s2); \ 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_REG_IMM(i, 0x5555555555555555ul, s2); \ 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memimmsweep(i, s2) \ 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0ul, s2); \ 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 1ul, s2); \ 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0xfffful, s2); \ 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x7ffful, s2); \ 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x8000ul, s2); \ 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0xfffffffful, s2); \ 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x80000000ul, s2); \ 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x7ffffffful, s2); \ 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x8000000000000000ul, s2); \ 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0xfffffffffffffffful, s2); \ 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_MEM_IMM(i, 0x5555555555555555ul, s2); \ 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_XY(s1, s2) \ 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long tmp asm("1") = s1; \ 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long *addr asm("2") = &s2; \ 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( XY(1,0,2,000,00) \ 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp), "d"(addr) \ 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "cc"); \ 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("xy %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, s2, tmp, cc); \ 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define XOR_XIY(s1, i2) \ 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unsigned long tmp = s1; \ 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long *addr asm("2") = &tmp; \ 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( XIY(i2,2,000,00) \ 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+Q" (tmp), "=d" (cc) \ 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "Q" (tmp), "d" (addr) \ 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "cc"); \ 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("xiy %16.16lX ^ %16.16lX = %16.16lX (cc=%d)\n", s1, (unsigned long) 0x##i2, tmp, cc); \ 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define xysweep(s2) \ 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0ul, s2); \ 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(1ul, s2); \ 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0xfffful, s2); \ 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x7ffful, s2); \ 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x8000ul, s2); \ 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0xfffffffful, s2); \ 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x80000000ul, s2); \ 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x7ffffffful, s2); \ 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0xaaaaaaaaaaaaaaaaul, s2); \ 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x8000000000000000ul, s2); \ 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0xfffffffffffffffful, s2); \ 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XY(0x5555555555555555ul, s2); \ 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define xiysweep(s2) \ 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0ul, s2); \ 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(1ul, s2); \ 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0xfffful, s2); \ 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x7ffful, s2); \ 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x8000ul, s2); \ 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0xfffffffful, s2); \ 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x80000000ul, s2); \ 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x7ffffffful, s2); \ 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0xaaaaaaaaaaaaaaaaul, s2); \ 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x8000000000000000ul, s2); \ 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0xfffffffffffffffful, s2); \ 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov XOR_XIY(0x5555555555555555ul, s2); \ 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 183