1aba3533d4cf547c3950144a00dca9258631a32bdsewardj#include <stdio.h> 2aba3533d4cf547c3950144a00dca9258631a32bdsewardj#include <stdlib.h> 3d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj#include "opcodes.h" 4aba3533d4cf547c3950144a00dca9258631a32bdsewardj 5aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define LOAD_REG_MEM(insn, s, ccset, initial, mask) \ 6aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 7d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long target asm("1") = initial; \ 8aba3533d4cf547c3950144a00dca9258631a32bdsewardj unsigned long source = s; \ 9d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long *addr asm("5") = &source; \ 10aba3533d4cf547c3950144a00dca9258631a32bdsewardj unsigned int a,b; \ 11aba3533d4cf547c3950144a00dca9258631a32bdsewardj switch(ccset) { \ 12aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 0: a = 0; b = 0; break; \ 13aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 1: a = 1; b = 0; break; \ 14aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 2: a = 0xffffffff; b = 1; break; \ 15aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 3: a = 0xffffffff; b = 2; break; \ 16aba3533d4cf547c3950144a00dca9258631a32bdsewardj default: abort(); \ 17aba3533d4cf547c3950144a00dca9258631a32bdsewardj } \ 18aba3533d4cf547c3950144a00dca9258631a32bdsewardj asm volatile( "alr %1, %3\n" /* set cc */ \ 19d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj insn(1,mask,5,000,00) \ 20aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "+d" (target), "+d" (a) \ 21d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj : "Q" (source), "d" (b), "d"(addr) \ 22aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "cc"); \ 23aba3533d4cf547c3950144a00dca9258631a32bdsewardj printf(#insn " %16.16lX into %16.16lX if mask" \ 24aba3533d4cf547c3950144a00dca9258631a32bdsewardj "%d for cc %d: %16.16lX\n",s, initial, \ 25d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj 0x##mask, ccset, target); \ 26aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 27aba3533d4cf547c3950144a00dca9258631a32bdsewardj 28aba3533d4cf547c3950144a00dca9258631a32bdsewardj 29aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define LOAD_REG_REG(insn, s, ccset, initial, mask) \ 30aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 31d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long target asm("1") = initial; \ 32d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long source asm("2")= s; \ 33aba3533d4cf547c3950144a00dca9258631a32bdsewardj unsigned int a,b; \ 34aba3533d4cf547c3950144a00dca9258631a32bdsewardj switch(ccset) { \ 35aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 0: a = 0; b = 0; break; \ 36aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 1: a = 1; b = 0; break; \ 37aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 2: a = 0xffffffff; b = 1; break; \ 38aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 3: a = 0xffffffff; b = 2; break; \ 39aba3533d4cf547c3950144a00dca9258631a32bdsewardj default: abort(); \ 40aba3533d4cf547c3950144a00dca9258631a32bdsewardj } \ 41aba3533d4cf547c3950144a00dca9258631a32bdsewardj asm volatile( "alr %1, %3\n" /* set cc */ \ 42d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj insn(mask,1,2) \ 43aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "+d" (target), "+d" (a) \ 44aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "d" (source), "d" (b) \ 45aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "cc"); \ 46aba3533d4cf547c3950144a00dca9258631a32bdsewardj printf(#insn " %16.16lX into %16.16lX if mask" \ 47aba3533d4cf547c3950144a00dca9258631a32bdsewardj "%d for cc %d: %16.16lX\n",s, initial, \ 48d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj 0x##mask, ccset, target); \ 49aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 50aba3533d4cf547c3950144a00dca9258631a32bdsewardj 51aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define STORE_REG_REG(insn, s, ccset, initial, mask) \ 52aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 53aba3533d4cf547c3950144a00dca9258631a32bdsewardj unsigned long target = initial; \ 54d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long source asm("1") = s; \ 55d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj register unsigned long *addr asm("5") = ⌖ \ 56aba3533d4cf547c3950144a00dca9258631a32bdsewardj unsigned int a,b; \ 57aba3533d4cf547c3950144a00dca9258631a32bdsewardj switch(ccset) { \ 58aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 0: a = 0; b = 0; break; \ 59aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 1: a = 1; b = 0; break; \ 60aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 2: a = 0xffffffff; b = 1; break; \ 61aba3533d4cf547c3950144a00dca9258631a32bdsewardj case 3: a = 0xffffffff; b = 2; break; \ 62aba3533d4cf547c3950144a00dca9258631a32bdsewardj default: abort(); \ 63aba3533d4cf547c3950144a00dca9258631a32bdsewardj } \ 64aba3533d4cf547c3950144a00dca9258631a32bdsewardj asm volatile( "alr %1, %3\n" /* set cc */ \ 65d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj insn(1,mask,5,000,00) \ 66aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "+Q" (target), "+d" (a) \ 67d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj : "d" (source), "d" (b), "d"(addr) \ 68aba3533d4cf547c3950144a00dca9258631a32bdsewardj : "cc"); \ 69aba3533d4cf547c3950144a00dca9258631a32bdsewardj printf(#insn " %16.16lX into %16.16lX if mask" \ 70aba3533d4cf547c3950144a00dca9258631a32bdsewardj "%d for cc %d: %16.16lX\n",s, initial, \ 71d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj 0x##mask, ccset, target); \ 72aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 73aba3533d4cf547c3950144a00dca9258631a32bdsewardj 74aba3533d4cf547c3950144a00dca9258631a32bdsewardj 75aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define INSNVALCCINIT(insn, value, ccset, INIT, FUNC) \ 76aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 77aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 0); \ 78aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 1); \ 79aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 2); \ 80aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 3); \ 81aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 4); \ 82aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 5); \ 83aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 6); \ 84aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 7); \ 85aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 8); \ 86aba3533d4cf547c3950144a00dca9258631a32bdsewardj FUNC(insn, value, ccset, INIT, 9); \ 87d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, A); \ 88d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, B); \ 89d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, C); \ 90d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, D); \ 91d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, E); \ 92d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj FUNC(insn, value, ccset, INIT, F); \ 93aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 94aba3533d4cf547c3950144a00dca9258631a32bdsewardj 95aba3533d4cf547c3950144a00dca9258631a32bdsewardj 96aba3533d4cf547c3950144a00dca9258631a32bdsewardj 97aba3533d4cf547c3950144a00dca9258631a32bdsewardj 98aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define INSNVALCC(insn, value, ccset, FUNC) \ 99aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 100aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCCINIT(insn, value, ccset, 0UL, FUNC); \ 101aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCCINIT(insn, value, ccset, 0xffffffffffffffffUL, FUNC); \ 102aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 103aba3533d4cf547c3950144a00dca9258631a32bdsewardj 104aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define INSNVAL(insn, value, FUNC) \ 105aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 106aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCC(insn, value, 0, FUNC); \ 107aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCC(insn, value, 1, FUNC); \ 108aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCC(insn, value, 2, FUNC); \ 109aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVALCC(insn, value, 3, FUNC); \ 110aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 111aba3533d4cf547c3950144a00dca9258631a32bdsewardj 112aba3533d4cf547c3950144a00dca9258631a32bdsewardj#define DO_INSN(insn, FUNC) \ 113aba3533d4cf547c3950144a00dca9258631a32bdsewardj({ \ 114aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVAL(insn, 0UL, FUNC); \ 115aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVAL(insn, 0xffffffffUL, FUNC); \ 116aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVAL(insn, 0xffffffffffffffffUL, FUNC); \ 117aba3533d4cf547c3950144a00dca9258631a32bdsewardj INSNVAL(insn, 0xffffffff00000000UL, FUNC); \ 118aba3533d4cf547c3950144a00dca9258631a32bdsewardj}) 119aba3533d4cf547c3950144a00dca9258631a32bdsewardj 120aba3533d4cf547c3950144a00dca9258631a32bdsewardjint main() 121aba3533d4cf547c3950144a00dca9258631a32bdsewardj{ 122d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(LOC, LOAD_REG_MEM); 123d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(LOCG, LOAD_REG_MEM); 124d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(LOCR, LOAD_REG_REG); 125d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(LOCGR, LOAD_REG_REG); 126d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(STOC, STORE_REG_REG); 127d50650d6cb0e3577ba28b470a4e5f5df8368afaasewardj DO_INSN(STOCG, STORE_REG_REG); 128aba3533d4cf547c3950144a00dca9258631a32bdsewardj return 0; 129aba3533d4cf547c3950144a00dca9258631a32bdsewardj} 130