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 INSERT_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\n", s1, s2, tmp); \ 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INSERT_REG_IMM(insn, s1, s2) \ 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long tmp asm("2") = s1; \ 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( insn(2,s2) \ 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp) \ 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "cc"); \ 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov v = tmp; /* work around GCC code gen bug */ \ 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf(#insn " %16.16lX <- %16.16lX = %16.16lX\n", s1, (unsigned long) 0x##s2, v); \ 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define memsweep(i, s2) \ 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0ul, s2); \ 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 1ul, s2); \ 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0xfffful, s2); \ 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x7ffful, s2); \ 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x8000ul, s2); \ 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0xfffffffful, s2); \ 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x80000000ul, s2); \ 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x7ffffffful, s2); \ 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x8000000000000000ul, s2); \ 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0xfffffffffffffffful, s2); \ 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_MEM(i, 0x5555555555555555ul, s2); \ 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define immsweep(i, s2) \ 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0ul, s2); \ 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 1ul, s2); \ 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0xfffful, s2); \ 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x7ffful, s2); \ 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x8000ul, s2); \ 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0xfffffffful, s2); \ 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x80000000ul, s2); \ 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x7ffffffful, s2); \ 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x8000000000000000ul, s2); \ 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0xfffffffffffffffful, s2); \ 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_REG_IMM(i, 0x5555555555555555ul, s2); \ 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define INSERT_ICY(s1, s2) \ 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long tmp asm("1") = s1; \ 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov register unsigned long *addr asm("2") = &s2; \ 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int cc; \ 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov asm volatile( ICY(1,0,2,000,00) \ 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "ipm %1\n" \ 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov "srl %1,28\n" \ 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "+d" (tmp), "=d" (cc) \ 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "d" (tmp), "Q" (s2), "d" (addr) \ 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov : "cc"); \ 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov printf("icy %16.16lX <- %16.16lX = %16.16lX\n", s1, s2, tmp); \ 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define icysweep(s2) \ 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov({ \ 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0ul, s2); \ 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(1ul, s2); \ 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0xfffful, s2); \ 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x7ffful, s2); \ 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x8000ul, s2); \ 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0xfffffffful, s2); \ 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x80000000ul, s2); \ 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x7ffffffful, s2); \ 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0xaaaaaaaaaaaaaaaaul, s2); \ 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x8000000000000000ul, s2); \ 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0xfffffffffffffffful, s2); \ 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov INSERT_ICY(0x5555555555555555ul, s2); \ 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}) 95