5 #define LOAD_REG_MEM(insn, s, ccset, initial, mask) \
7 register unsigned long target asm("1") = initial; \
8 unsigned long source = s; \
9 register unsigned long *addr asm("5") = &source; \
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; \
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) \
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); \
29 #define LOAD_REG_REG(insn, s, ccset, initial, mask) \
31 register unsigned long target asm("1") = initial; \
32 register unsigned long source asm("2")= s; \
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; \
41 asm volatile( "alr %1, %3\n" /* set cc */ \
43 : "+d" (target), "+d" (a) \
44 : "d" (source), "d" (b) \
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); \
51 #define STORE_REG_REG(insn, s, ccset, initial, mask) \
53 unsigned long target = initial; \
54 register unsigned long source asm("1") = s; \
55 register unsigned long *addr asm("5") = ⌖ \
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; \
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) \
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); \
75 #define INSNVALCCINIT(insn, value, ccset, INIT, FUNC) \
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); \
98 #define INSNVALCC(insn, value, ccset, FUNC) \
100 INSNVALCCINIT(insn, value, ccset, 0UL, FUNC); \
101 INSNVALCCINIT(insn, value, ccset, 0xffffffffffffffffUL, FUNC); \
104 #define INSNVAL(insn, value, FUNC) \
106 INSNVALCC(insn, value, 0, FUNC); \
107 INSNVALCC(insn, value, 1, FUNC); \
108 INSNVALCC(insn, value, 2, FUNC); \
109 INSNVALCC(insn, value, 3, FUNC); \
112 #define DO_INSN(insn, FUNC) \
114 INSNVAL(insn, 0UL, FUNC); \
115 INSNVAL(insn, 0xffffffffUL, FUNC); \
116 INSNVAL(insn, 0xffffffffffffffffUL, FUNC); \
117 INSNVAL(insn, 0xffffffff00000000UL, FUNC); \
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
);