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