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