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") = &target;	\
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