Copied remotely
[mono.git] / mono / arch / ppc / ppc-codegen.h
1 /*
2    Copyright (C)  2001 Radek Doulik
3
4    for testing do the following: ./test | as -o test.o
5 */
6
7 #ifndef __MONO_PPC_CODEGEN_H__
8 #define __MONO_PPC_CODEGEN_H__
9 #include <glib.h>
10 #include <assert.h>
11
12 typedef enum {
13         ppc_r0 = 0,
14         ppc_r1,
15         ppc_sp = ppc_r1,
16         ppc_r2,
17         ppc_r3,
18         ppc_r4,
19         ppc_r5,
20         ppc_r6,
21         ppc_r7,
22         ppc_r8,
23         ppc_r9,
24         ppc_r10,
25         ppc_r11,
26         ppc_r12,
27         ppc_r13,
28         ppc_r14,
29         ppc_r15,
30         ppc_r16,
31         ppc_r17,
32         ppc_r18,
33         ppc_r19,
34         ppc_r20,
35         ppc_r21,
36         ppc_r22,
37         ppc_r23,
38         ppc_r24,
39         ppc_r25,
40         ppc_r26,
41         ppc_r27,
42         ppc_r28,
43         ppc_r29,
44         ppc_r30,
45         ppc_r31
46 } PPCIntRegister;
47
48 typedef enum {
49         ppc_f0 = 0,
50         ppc_f1,
51         ppc_f2,
52         ppc_f3,
53         ppc_f4,
54         ppc_f5,
55         ppc_f6,
56         ppc_f7,
57         ppc_f8,
58         ppc_f9,
59         ppc_f10,
60         ppc_f11,
61         ppc_f12,
62         ppc_f13,
63         ppc_f14,
64         ppc_f15,
65         ppc_f16,
66         ppc_f17,
67         ppc_f18,
68         ppc_f19,
69         ppc_f20,
70         ppc_f21,
71         ppc_f22,
72         ppc_f23,
73         ppc_f24,
74         ppc_f25,
75         ppc_f26,
76         ppc_f27,
77         ppc_f28,
78         ppc_f29,
79         ppc_f30,
80         ppc_f31
81 } PPCFloatRegister;
82
83 typedef enum {
84         ppc_lr = 256,
85         ppc_ctr = 256 + 32,
86         ppc_xer = 32
87 } PPCSpecialRegister;
88
89 enum {
90         /* B0 operand for branches */
91         PPC_BR_DEC_CTR_NONZERO_FALSE = 0,
92         PPC_BR_LIKELY = 1, /* can be or'ed with the conditional variants */
93         PPC_BR_DEC_CTR_ZERO_FALSE = 2,
94         PPC_BR_FALSE  = 4,
95         PPC_BR_DEC_CTR_NONZERO_TRUE = 8,
96         PPC_BR_DEC_CTR_ZERO_TRUE = 10,
97         PPC_BR_TRUE   = 12,
98         PPC_BR_DEC_CTR_NONZERO = 16,
99         PPC_BR_DEC_CTR_ZERO = 18,
100         PPC_BR_ALWAYS = 20,
101         /* B1 operand for branches */
102         PPC_BR_LT     = 0,
103         PPC_BR_GT     = 1,
104         PPC_BR_EQ     = 2,
105         PPC_BR_SO     = 3
106 };
107
108 enum {
109         PPC_TRAP_LT = 1,
110         PPC_TRAP_GT = 2,
111         PPC_TRAP_EQ = 4,
112         PPC_TRAP_LT_UN = 8,
113         PPC_TRAP_GT_UN = 16,
114         PPC_TRAP_LE = 1 + PPC_TRAP_EQ,
115         PPC_TRAP_GE = 2 + PPC_TRAP_EQ,
116         PPC_TRAP_LE_UN = 8 + PPC_TRAP_EQ,
117         PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ
118 };
119
120 #define ppc_emit32(c,x) do { *((guint32 *) (c)) = x; (c) = (char *)(c) + sizeof (guint32);} while (0)
121
122 #define ppc_is_imm16(val) ((gint)(val) >= (gint)-(1<<15) && (gint)(val) <= (gint)((1<<15)-1))
123 #define ppc_is_uimm16(val) ((gint)(val) >= 0 && (gint)(val) <= 65535)
124
125 #define ppc_load(c,D,v) do {    \
126                 if (ppc_is_imm16 ((v))) {       \
127                         ppc_li ((c), (D), (guint16)(v));        \
128                 } else {        \
129                         ppc_lis ((c), (D), (guint32)(v) >> 16); \
130                         ppc_ori ((c), (D), (D), (guint32)(v) & 0xffff); \
131                 }       \
132         } while (0)
133
134 #define ppc_break(c) ppc_tw((c),31,0,0)
135 #define  ppc_addi(c,D,A,d) ppc_emit32 (c, (14 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
136 #define ppc_addis(c,D,A,d) ppc_emit32 (c, (15 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
137 #define    ppc_li(c,D,v)   ppc_addi   (c, D, 0, (guint16)(v));
138 #define   ppc_lis(c,D,v)   ppc_addis  (c, D, 0, (guint16)(v));
139 #define   ppc_lwz(c,D,d,a) ppc_emit32 (c, (32 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
140 #define   ppc_lhz(c,D,d,a) ppc_emit32 (c, (40 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
141 #define   ppc_lbz(c,D,d,a) ppc_emit32 (c, (34 << 26) | ((D) << 21) | ((a) << 16) | (guint16)(d))
142 #define   ppc_stw(c,S,d,a) ppc_emit32 (c, (36 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
143 #define   ppc_sth(c,S,d,a) ppc_emit32 (c, (44 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
144 #define   ppc_stb(c,S,d,a) ppc_emit32 (c, (38 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
145 #define  ppc_stwu(c,s,d,a) ppc_emit32 (c, (37 << 26) | ((s) << 21) | ((a) << 16) | (guint16)(d))
146 #define    ppc_or(c,a,s,b) ppc_emit32 (c, (31 << 26) | ((s) << 21) | ((a) << 16) | ((b) << 11) | 888)
147 #define   ppc_ori(c,S,A,u) ppc_emit32 (c, (24 << 26) | ((S) << 21) | ((A) << 16) | (guint16)(u))
148 #define    ppc_mr(c,a,s)   ppc_or     (c, a, s, s)
149 #define ppc_mfspr(c,D,spr) ppc_emit32 (c, (31 << 26) | ((D) << 21) | ((spr) << 11) | (339 << 1))
150 #define  ppc_mflr(c,D)     ppc_mfspr  (c, D, ppc_lr)
151 #define ppc_mtspr(c,spr,S) ppc_emit32 (c, (31 << 26) | ((S) << 21) | ((spr) << 11) | (467 << 1))
152 #define  ppc_mtlr(c,S)     ppc_mtspr  (c, ppc_lr, S)
153 #define  ppc_mtctr(c,S)     ppc_mtspr  (c, ppc_ctr, S)
154 #define  ppc_mtxer(c,S)     ppc_mtspr  (c, ppc_xer, S)
155
156 #define  ppc_b(c,li)       ppc_emit32 (c, (18 << 26) | ((li) << 2))
157 #define  ppc_bl(c,li)       ppc_emit32 (c, (18 << 26) | ((li) << 2) | 1)
158 #define  ppc_ba(c,li)       ppc_emit32 (c, (18 << 26) | ((li) << 2) | 2)
159 #define  ppc_bla(c,li)       ppc_emit32 (c, (18 << 26) | ((li) << 2) | 3)
160 #define  ppc_blrl(c)       ppc_emit32 (c, 0x4e800021)
161 #define   ppc_blr(c)       ppc_emit32 (c, 0x4e800020)
162
163 #define   ppc_lfs(c,D,d,A) ppc_emit32 (c, (48 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
164 #define   ppc_lfd(c,D,d,A) ppc_emit32 (c, (50 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d))
165 #define  ppc_stfs(c,S,d,a) ppc_emit32 (c, (52 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
166 #define  ppc_stfd(c,S,d,a) ppc_emit32 (c, (54 << 26) | ((S) << 21) | ((a) << 16) | (guint16)(d))
167
168 /***********************************************************************
169 The macros below were tapped out by Christopher Taylor <ct_AT_clemson_DOT_edu>
170 from 18 November 2002 to 19 December 2002.
171
172 Special thanks to rodo, lupus, dietmar, miguel, and duncan for patience,
173 and motivation.
174
175 The macros found in this file are based on the assembler instructions found 
176 in Motorola and Digital DNA's:
177
178 "Programming Enviornments Manual For 32-bit Implementations of the PowerPC Architecture"
179
180 MPCFPE32B/AD
181 12/2001
182 REV2
183
184 see pages 326 - 524 for detailed information regarding each instruction
185
186 Also see the "Ximian Copyright Agreement, 2002" for more information regarding
187 my and Ximian's copyright to this code. ;)
188 *************************************************************************/
189
190 #define ppc_addx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (266 << 1) | Rc)
191 #define ppc_add(c,D,A,B) ppc_addx(c,D,A,B,0,0)
192 #define ppc_addd(c,D,A,B) ppc_addx(c,D,A,B,0,1)
193 #define ppc_addo(c,D,A,B) ppc_addx(c,D,A,B,1,0)
194 #define ppc_addod(c,D,A,B) ppc_addx(c,D,A,B,1,1)
195
196 #define ppc_addcx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (10 << 1) | Rc)
197 #define ppc_addc(c,D,A,B) ppc_addcx(c,D,A,B,0,0)
198 #define ppc_addcd(c,D,A,B) ppc_addcx(c,D,A,B,0,1)
199 #define ppc_addco(c,D,A,B) ppc_addcx(c,D,A,B,1,0)
200 #define ppc_addcod(c,D,A,B) ppc_addcx(c,D,A,B,1,1)
201
202 #define ppc_addex(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | ((D) << 21) | ((A) << 16) | ((B) << 11) | (OE << 10) | (138 << 1) | Rc)
203 #define ppc_adde(c,D,A,B) ppc_addex(c,D,A,B,0,0)
204 #define ppc_added(c,D,A,B) ppc_addex(c,D,A,B,0,1)
205 #define ppc_addeo(c,D,A,B) ppc_addex(c,D,A,B,1,0)
206 #define ppc_addeod(c,D,A,B) ppc_addex(c,D,A,B,1,1)
207
208 #define ppc_addic(c,D,A,d) ppc_emit32(c, (12 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) 
209 #define ppc_addicd(c,D,A,d) ppc_emit32(c, (13 << 26) | ((D) << 21) | ((A) << 16) | (guint16)(d)) 
210
211 #define ppc_addmex(c,D,A,OE,RC) ppc_emit32(c, (31 << 26) | ((D) << 21 ) | ((A) << 16) | (0 << 11) | ((OE) << 10) | (234 << 1) | RC)
212 #define ppc_addme(c,D,A) ppc_addmex(c,D,A,0,0)
213 #define ppc_addmed(c,D,A) ppc_addmex(c,D,A,0,1)
214 #define ppc_addmeo(c,D,A) ppc_addmex(c,D,A,1,0)
215 #define ppc_addmeod(c,D,A) ppc_addmex(c,D,A,1,1)
216
217 #define ppc_addzex(c,D,A,OE,RC) ppc_emit32(c, (31 << 26) | ((D) << 21 ) | ((A) << 16) | (0 << 11) | ((OE) << 10) | (202 << 1) | RC)
218 #define ppc_addze(c,D,A) ppc_addzex(c,D,A,0,0)
219 #define ppc_addzed(c,D,A) ppc_addzex(c,D,A,0,1)
220 #define ppc_addzeo(c,D,A) ppc_addzex(c,D,A,1,0)
221 #define ppc_addzeod(c,D,A) ppc_addzex(c,D,A,1,1)
222
223 #define ppc_andx(c,S,A,B,RC) ppc_emit32(c, (31 << 26) | ((S) << 21 ) | ((A) << 16) | ((B) << 11) | (28 << 1) | RC)
224 #define ppc_and(c,S,A,B) ppc_andx(c,S,A,B,0)
225 #define ppc_andd(c,S,A,B) ppc_andx(c,S,A,B,1)
226
227 #define ppc_andcx(c,S,A,B,RC) ppc_emit32(c, (31 << 26) | ((S) << 21 ) | ((A) << 16) | ((B) << 11) | (60 << 1) | RC)
228 #define ppc_andc(c,S,A,B) ppc_andcx(c,S,A,B,0)
229 #define ppc_andcd(c,S,A,B) ppc_andcx(c,S,A,B,1)
230
231 #define ppc_andid(c,S,A,d) ppc_emit32(c, (28 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(d)))
232 #define ppc_andisd(c,S,A,d) ppc_emit32(c, (29 << 26) | ((S) << 21 ) | ((A) << 16) | ((guint16)(d)))
233
234 #define ppc_bcx(c,BO,BI,BD,AA,LK) ppc_emit32(c, (16 << 26) | (BO << 21 )| (BI << 16) | (BD << 2) | ((AA) << 1) | LK)
235 #define ppc_bc(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,0) 
236 #define ppc_bca(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,1,0)
237 #define ppc_bcl(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,0,1)
238 #define ppc_bcla(c,BO,BI,BD) ppc_bcx(c,BO,BI,BD,1,1)
239
240 #define ppc_bcctrx(c,BO,BI,LK) ppc_emit32(c, (19 << 26) | (BO << 21 )| (BI << 16) | (0 << 11) | (528 << 1) | LK)
241 #define ppc_bcctr(c,BO,BI) ppc_bcctrx(c,BO,BI,0)
242 #define ppc_bcctrl(c,BO,BI) ppc_bcctrx(c,BO,BI,1)
243
244 #define ppc_bnectrp(c,BO,BI) ppc_bcctr(c,BO,BI)
245 #define ppc_bnectrlp(c,BO,BI) ppc_bcctr(c,BO,BI)
246
247 #define ppc_bclrx(c,BO,BI,LK) ppc_emit32(c, (19 << 26) | (BO << 21 )| (BI << 16) | (0 << 11) | (16 << 1) | LK)
248 #define ppc_bclr(c,BO,BI) ppc_bclrx(c,BO,BI,0)
249 #define ppc_bclrl(c,BO,BI) ppc_bclrx(c,BO,BI,1)
250
251 #define ppc_bnelrp(c,BO,BI) ppc_bclr(c,BO,BI)
252 #define ppc_bnelrlp(c,BO,BI) ppc_bclr(c,BO,BI)
253
254 #define ppc_cmp(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (B << 11) | (0x00000 << 1) | 0 )
255 #define ppc_cmpi(c,cfrD,L,A,B) ppc_emit32(c, (11 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
256 #define ppc_cmpl(c,cfrD,L,A,B) ppc_emit32(c, (31 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (B << 11) | (32 << 1) | 0 )
257 #define ppc_cmpli(c,cfrD,L,A,B) ppc_emit32(c, (10 << 26) | (cfrD << 23) | (0 << 22) | (L << 21) | (A << 16) | (guint16)(B))
258
259 #define ppc_cntlzwx(c,S,A,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (26 << 1) | Rc)
260 #define ppc_cntlzw(c,S,A) ppc_cntlzwx(c,S,A,0)
261 #define ppc_cntlzwd(c,S,A) ppc_cntlzwx(c,S,A,1)
262
263 #define ppc_crand(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (257 << 1) | 0)
264 #define ppc_crandc(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (129 << 1) | 0)
265 #define ppc_creqv(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (289 << 1) | 0)
266 #define ppc_crnand(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (225 << 1) | 0)
267 #define ppc_crnor(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (33 << 1) | 0)
268 #define ppc_cror(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (449 << 1) | 0)
269 #define ppc_crorc(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (417 << 1) | 0)
270 #define ppc_crxor(c,D,A,B) ppc_emit32(c, (19 << 26) | (D << 21) | (A << 16) | (B << 11) | (193 << 1) | 0)
271
272 #define ppc_dcba(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (758 << 1) | 0)
273 #define ppc_dcbf(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (86 << 1) | 0)
274 #define ppc_dcbi(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (470 << 1) | 0)
275 #define ppc_dcbst(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (54 << 1) | 0)
276 #define ppc_dcbt(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (278 << 1) | 0)
277 #define ppc_dcbtst(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (246 << 1) | 0)
278 #define ppc_dcbz(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (1014 << 1) | 0)
279
280 #define ppc_divwx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (491 << 1) | Rc)
281 #define ppc_divw(c,D,A,B) ppc_divwx(c,D,A,B,0,0)
282 #define ppc_divwd(c,D,A,B) ppc_divwx(c,D,A,B,0,1)
283 #define ppc_divwo(c,D,A,B) ppc_divwx(c,D,A,B,1,0)
284 #define ppc_divwod(c,D,A,B) ppc_divwx(c,D,A,B,1,1)
285
286 #define ppc_divwux(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (459 << 1) | Rc)
287 #define ppc_divwu(c,D,A,B) ppc_divwux(c,D,A,B,0,0)
288 #define ppc_divwud(c,D,A,B) ppc_divwux(c,D,A,B,0,1)
289 #define ppc_divwuo(c,D,A,B) ppc_divwux(c,D,A,B,1,0)
290 #define ppc_divwuod(c,D,A,B) ppc_divwux(c,D,A,B,1,1)
291
292 #define ppc_eciwx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (310 << 1) | 0)
293 #define ppc_ecowx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (438 << 1) | 0)
294 #define ppc_eieio(c) ppc_emit32(c, (31 << 26) | (0 << 21) | (0 << 16) | (0 << 11) | (854 << 1) | 0)
295
296 #define ppc_eqvx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (284 << 1) | Rc)
297 #define ppc_eqv(c,A,S,B) ppc_eqvx(c,A,S,B,0)
298 #define ppc_eqvd(c,A,S,B) ppc_eqvx(c,A,S,B,1)
299
300 #define ppc_extsbx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (954 << 1) | Rc) 
301 #define ppc_extsb(c,A,S) ppc_extsbx(c,A,S,0)
302 #define ppc_extsbd(c,A,S) ppc_extsbx(c,A,S,1)
303
304 #define ppc_extshx(c,A,S,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (0 << 11) | (922 << 1) | Rc) 
305 #define ppc_extsh(c,A,S) ppc_extshx(c,A,S,0)
306 #define ppc_extshd(c,A,S) ppc_extshx(c,A,S,1)
307
308 #define ppc_fabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (264 << 1) | Rc) 
309 #define ppc_fabs(c,D,B) ppc_fabsx(c,D,B,0)
310 #define ppc_fabsd(c,D,B) ppc_fabsx(c,D,B,1)
311
312 #define ppc_faddx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
313 #define ppc_fadd(c,D,A,B) ppc_faddx(c,D,A,B,0)
314 #define ppc_faddd(c,D,A,B) ppc_faddx(c,D,A,B,1)
315
316 #define ppc_faddsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (21 << 1) | Rc)
317 #define ppc_fadds(c,D,A,B) ppc_faddsx(c,D,A,B,0)
318 #define ppc_faddsd(c,D,A,B) ppc_faddsx(c,D,A,B,1)
319
320 #define ppc_fcmpo(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (32 << 1) | 0)
321 #define ppc_fcmpu(c,crfD,A,B) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (A << 16) | (B << 11) | (0 << 1) | 0)
322
323 #define ppc_fctiwx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (14 << 1) | Rc)
324 #define ppc_fctiw(c,D,B) ppc_fctiwx(c,D,B,0)
325 #define ppc_fctiwd(c,D,B) ppc_fctiwx(c,D,B,1)
326
327 #define ppc_fctiwzx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (15 << 1) | Rc)
328 #define ppc_fctiwz(c,D,B) ppc_fctiwzx(c,D,B,0)
329 #define ppc_fctiwzd(c,D,B) ppc_fctiwzx(c,D,B,1)
330
331 #define ppc_fdivx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
332 #define ppc_fdiv(c,D,A,B) ppc_fdivx(c,D,A,B,0)
333 #define ppc_fdivd(c,D,A,B) ppc_fdivx(c,D,A,B,1)
334
335 #define ppc_fdivsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (18 << 1) | Rc)
336 #define ppc_fdivs(c,D,A,B) ppc_fdivsx(c,D,A,B,0)
337 #define ppc_fdivsd(c,D,A,B) ppc_fdivsx(c,D,A,B,1)
338
339 #define ppc_fmaddx(c,D,A,B,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
340 #define ppc_fmadd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,0)
341 #define ppc_fmaddd(c,D,A,B,C) ppc_fmaddx(c,D,A,B,C,1) 
342
343 #define ppc_fmaddsx(c,D,A,B,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (29 << 1) | Rc)
344 #define ppc_fmadds(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,0)
345 #define ppc_fmaddsd(c,D,A,B,C) ppc_fmaddsx(c,D,A,B,C,1) 
346
347 #define ppc_fmrx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (72 << 1) | Rc)
348 #define ppc_fmr(c,D,B) ppc_fmrx(c,D,B,0)
349 #define ppc_fmrd(c,D,B) ppc_fmrx(c,D,B,1)
350
351 #define ppc_fmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
352 #define ppc_fmsub(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,0)
353 #define ppc_fmsubd(c,D,A,C,B) ppc_fmsubx(c,D,A,C,B,1)
354
355 #define ppc_fmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (28 << 1) | Rc)
356 #define ppc_fmsubs(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,0)
357 #define ppc_fmsubsd(c,D,A,C,B) ppc_fmsubsx(c,D,A,C,B,1)
358
359 #define ppc_fmulx(c,D,A,C,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc) 
360 #define ppc_fmul(c,D,A,C) ppc_fmulx(c,D,A,C,0)
361 #define ppc_fmuld(c,D,A,C) ppc_fmulx(c,D,A,C,1)
362
363 #define ppc_fmulsx(c,D,A,C,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (0 << 11) | (C << 6) | (25 << 1) | Rc) 
364 #define ppc_fmuls(c,D,A,C) ppc_fmulsx(c,D,A,C,0)
365 #define ppc_fmulsd(c,D,A,C) ppc_fmulsx(c,D,A,C,1)
366
367 #define ppc_fnabsx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (136 << 1) | Rc)
368 #define ppc_fnabs(c,D,B) ppc_fnabsx(c,D,B,0)
369 #define ppc_fnabsd(c,D,B) ppc_fnabsx(c,D,B,1)
370
371 #define ppc_fnegx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (40 << 1) | Rc)
372 #define ppc_fneg(c,D,B) ppc_fnegx(c,D,B,0)
373 #define ppc_fnegd(c,D,B) ppc_fnegx(c,D,B,1)
374
375 #define ppc_fnmaddx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
376 #define ppc_fnmadd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,0)
377 #define ppc_fnmaddd(c,D,A,C,B) ppc_fnmaddx(c,D,A,C,B,1)
378
379 #define ppc_fnmaddsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (31 << 1) | Rc)
380 #define ppc_fnmadds(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,0)
381 #define ppc_fnmaddsd(c,D,A,C,B) ppc_fnmaddsx(c,D,A,C,B,1)
382
383 #define ppc_fnmsubx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
384 #define ppc_fnmsub(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,0)
385 #define ppc_fnmsubd(c,D,A,C,B) ppc_fnmsubx(c,D,A,C,B,1)
386
387 #define ppc_fnmsubsx(c,D,A,C,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (30 << 1) | Rc)
388 #define ppc_fnmsubs(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,0)
389 #define ppc_fnmsubsd(c,D,A,C,B) ppc_fnmsubsx(c,D,A,C,B,1)
390
391 #define ppc_fresx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (24 << 1) | Rc)
392 #define ppc_fres(c,D,B) ppc_fresx(c,D,B,0)
393 #define ppc_fresd(c,D,B) ppc_fresx(c,D,B,1)
394
395 #define ppc_frspx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (12 << 1) | Rc)
396 #define ppc_frsp(c,D,B) ppc_frspx(c,D,B,0)
397 #define ppc_frspd(c,D,B) ppc_frspx(c,D,B,1)
398
399 #define ppc_frsqrtex(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (26 << 1) | Rc)
400 #define ppc_frsqrte(c,D,B) ppc_frsqrtex(c,D,B,0)
401 #define ppc_frsqrted(c,D,B) ppc_frsqrtex(c,D,B,1)
402
403 #define ppc_fselx(c,D,A,C,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (C << 6) | (23 << 1) | Rc)
404 #define ppc_fsel(c,D,A,C,B) ppc_fselx(c,D,A,C,B,0)
405 #define ppc_fseld(c,D,A,C,B) ppc_fselx(c,D,A,C,B,1)
406
407 #define ppc_fsqrtx(c,D,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
408 #define ppc_fsqrt(c,D,B) ppc_fsqrtx(c,D,B,0)
409 #define ppc_fsqrtd(c,D,B) ppc_fsqrtx(c,D,B,1)
410
411 #define ppc_fsqrtsx(c,D,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (0 << 16) | (B << 11) | (0 << 6) | (22 << 1) | Rc)
412 #define ppc_fsqrts(c,D,B) ppc_fsqrtsx(c,D,B,0)
413 #define ppc_fsqrtsd(c,D,B) ppc_fsqrtsx(c,D,B,1)
414
415 #define ppc_fsubx(c,D,A,B,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
416 #define ppc_fsub(c,D,A,B) ppc_fsubx(c,D,A,B,0)
417 #define ppc_fsubd(c,D,A,B) ppc_fsubx(c,D,A,B,1)
418
419 #define ppc_fsubsx(c,D,A,B,Rc) ppc_emit32(c, (59 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 6) | (20 << 1) | Rc)
420 #define ppc_fsubs(c,D,A,B) ppc_fsubsx(c,D,A,B,0)
421 #define ppc_fsubsd(c,D,A,B) ppc_fsubsx(c,D,A,B,1)
422
423 #define ppc_icbi(c,A,B) ppc_emit32(c, (31 << 26) | (0 << 21) | (A << 16) | (B << 11) | (982 << 1) | 0)
424
425 #define ppc_isync(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (150 << 1) | 0)
426
427 #define ppc_lbzu(c,D,A,d) ppc_emit32(c, (35 << 26) | (D << 21) | (A << 16) | (guint16)d)
428 #define ppc_lbzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (119 << 1) | 0)
429 #define ppc_lbzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (87 << 1) | 0)
430
431 #define ppc_lfdu(c,D,A,d) ppc_emit32(c, (51 << 26) | (D << 21) | (A << 16) | (guint16)d)
432 #define ppc_lfdux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (631 << 1) | 0)
433 #define ppc_lfdx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (599 << 1) | 0)
434
435 #define ppc_lfsu(c,D,A,d) ppc_emit32(c, (49 << 26) | (D << 21) | (A << 16) | (guint16)d)
436 #define ppc_lfsux(c,D,A,d) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (567 << 1) | 0)
437 #define ppc_lfsx(c,D,A,d) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (535 << 1) | 0)
438
439 #define ppc_lha(c,D,A,d) ppc_emit32(c, (42 << 26) | (D << 21) | (A << 16) | (guint16)d)
440 #define ppc_lhau(c,D,A,d) ppc_emit32(c, (43 << 26) | (D << 21) | (A << 16) | (guint16)d)
441 #define ppc_lhaux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (375 << 1) | 0)
442 #define ppc_lhax(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (343 << 1) | 0)
443 #define ppc_lhbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (790 << 1) | 0)
444 #define ppc_lhzu(c,D,A,d) ppc_emit32(c, (41 << 26) | (D << 21) | (A << 16) | (guint16)d)
445
446 #define ppc_lhzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (311 << 1) | 0)
447 #define ppc_lhzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (279 << 1) | 0)
448
449 #define ppc_lmw(c,D,A,d) ppc_emit32(c, (46 << 26) | (D << 21) | (A << 16) | (guint16)d)
450
451 #define ppc_lswi(c,D,A,NB) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (NB << 11) | (597 << 1) | 0)
452 #define ppc_lswx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (533 << 1) | 0)
453 #define ppc_lwarx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (20 << 1) | 0)
454 #define ppc_lwbrx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (534 << 1) | 0)
455
456 #define ppc_lwzu(c,D,A,d) ppc_emit32(c, (33 << 26) | (D << 21) | (A << 16) | (guint16)d)
457 #define ppc_lwzux(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (55 << 1) | 0)
458 #define ppc_lwzx(c,D,A,B) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (23 << 1) | 0)
459
460 #define ppc_mcrf(c,crfD,crfS) ppc_emit32(c, (19 << 26) | (crfD << 23) | (0 << 21) | (crfS << 18) | 0)
461 #define ppc_mcrfs(c,crfD,crfS) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 21) | (crfS << 18) | (0 << 16) | (64 << 1) | 0)
462 #define ppc_mcrxr(c,crfD) ppc_emit32(c, (31 << 26) | (crfD << 23) | (0 << 16) | (512 << 1) | 0)
463
464 #define ppc_mfcr(c,D) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (19 << 1) | 0)
465 #define ppc_mffsx(c,D,Rc) ppc_emit32(c, (63 << 26) | (D << 21) | (0 << 16) | (583 << 1) | Rc)
466 #define ppc_mffs(c,D) ppc_mffsx(c,D,0)
467 #define ppc_mffsd(c,D) ppc_mffsx(c,D,1)
468 #define ppc_mfmsr(c,D) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (83 << 1) | 0)
469 #define ppc_mfsr(c,D,SR) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 20) | (SR << 16) | (0 << 11) | (595 << 1) | 0)
470 #define ppc_mfsrin(c,D,B) ppc_emit32(c, (31 << 26) | (D << 21) | (0 << 16) | (B << 11) | (659 << 1) | 0)
471 #define ppc_mftb(c,D,TBR) ppc_emit32(c, (31 << 26) | (D << 21) | (TBR << 11) | (371 << 1) | 0)
472
473 #define ppc_mtcrf(c,CRM,S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 20) | (CRM << 12) | (0 << 11) | (144 << 1) | 0)
474
475 #define ppc_mtfsb0x(c,CRB,Rc) ppc_emit32(c, (63 << 26) | (CRB << 21) | (0 << 11) | (70 << 1) | Rc)
476 #define ppc_mtfsb0(c,CRB) ppc_mtfsb0x(c,CRB,0)
477 #define ppc_mtfsb0d(c,CRB) ppc_mtfsb0x(c,CRB,1)
478
479 #define ppc_mtfsb1x(c,CRB,Rc) ppc_emit32(c, (63 << 26) | (CRB << 21) | (0 << 11) | (38 << 1) | Rc)
480 #define ppc_mtfsb1(c,CRB) ppc_mtfsb1x(c,CRB,0)
481 #define ppc_mtfsb1d(c,CRB) ppc_mtfsb1x(c,CRB,1)
482
483 #define ppc_mtfsfx(c,FM,B,Rc) ppc_emit32(c, (63 << 26) | (0 << 25) | (FM << 22) | (0 << 21) | (B << 11) | (711 << 1) | Rc)
484 #define ppc_mtfsf(c,FM,B) ppc_mtfsfx(c,FM,B,0)
485 #define ppc_mtfsfd(c,FM,B) ppc_mtfsfx(c,FM,B,1)
486
487 #define ppc_mtfsfix(c,crfD,IMM,Rc) ppc_emit32(c, (63 << 26) | (crfD << 23) | (0 << 16) | (IMM << 12) | (0 << 11) | (134 << 1) | Rc)
488 #define ppc_mtfsfi(c,crfD,IMM) ppc_mtfsfix(c,crfD,IMM,0)
489 #define ppc_mtfsfid(c,crfD,IMM) ppc_mtfsfix(c,crfD,IMM,1)
490
491 #define ppc_mtmsr(c, S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 11) | (146 << 1) | 0)
492
493 #define ppc_mtsr(c,SR,S) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 20) | (SR << 16) | (0 << 11) | (210 << 1) | 0)
494 #define ppc_mtsrin(c,S,B) ppc_emit32(c, (31 << 26) | (S << 21) | (0 << 16) | (B << 11) | (242 << 1) | 0)
495
496 #define ppc_mulhwx(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 10) | (75 << 1) | Rc)
497 #define ppc_mulhw(c,D,A,B) ppc_mulhwx(c,D,A,B,0)
498 #define ppc_mulhwd(c,D,A,B) ppc_mulhwx(c,D,A,B,1)
499
500 #define ppc_mulhwux(c,D,A,B,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (0 << 10) | (11 << 1) | Rc)
501 #define ppc_mulhwu(c,D,A,B) ppc_mulhwux(c,D,A,B,0)
502 #define ppc_mulhwud(c,D,A,B) ppc_mulhwux(c,D,A,B,1)
503
504 #define ppc_mulli(c,D,A,SIMM) ppc_emit32(c, ((07) << 26) | (D << 21) | (A << 16) | (guint16)(SIMM))
505
506 #define ppc_mullwx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (235 << 1) | Rc)
507 #define ppc_mullw(c,D,A,B) ppc_mullwx(c,D,A,B,0,0)
508 #define ppc_mullwd(c,D,A,B) ppc_mullwx(c,D,A,B,0,1)
509 #define ppc_mullwo(c,D,A,B) ppc_mullwx(c,D,A,B,1,0)
510 #define ppc_mullwod(c,D,A,B) ppc_mullwx(c,D,A,B,1,1)
511
512 #define ppc_nandx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (476 << 1) | Rc)
513 #define ppc_nand(c,A,S,B) ppc_nandx(c,A,S,B,0)
514 #define ppc_nandd(c,A,S,B) ppc_nandx(c,A,S,B,1)
515
516 #define ppc_negx(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (104 << 1) | Rc)
517 #define ppc_neg(c,D,A) ppc_negx(c,D,A,0,0)
518 #define ppc_negd(c,D,A) ppc_negx(c,D,A,0,1)
519 #define ppc_nego(c,D,A) ppc_negx(c,D,A,1,0)
520 #define ppc_negod(c,D,A) ppc_negx(c,D,A,1,1)
521
522 #define ppc_norx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (124 << 1) | Rc)
523 #define ppc_nor(c,A,S,B) ppc_norx(c,A,S,B,0)
524 #define ppc_nord(c,A,S,B) ppc_norx(c,A,S,B,1)
525
526 #define ppc_not(c,A,S) ppc_norx(c,A,S,S,0)
527
528 #define ppc_orx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (444 << 1) | Rc)
529 #define ppc_ord(c,A,S,B) ppc_orx(c,A,S,B,1)
530
531 #define ppc_orcx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (412 << 1) | Rc)
532 #define ppc_orc(c,A,S,B) ppc_orcx(c,A,S,B,0)
533 #define ppc_orcd(c,A,S,B) ppc_orcx(c,A,S,B,1)
534
535 #define ppc_oris(c,A,S,UIMM) ppc_emit32(c, (25 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
536
537 #define ppc_rfi(c) ppc_emit32(c, (19 << 26) | (0 << 11) | (50 << 1) | 0)
538
539 #define ppc_rlwimix(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (20 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
540 #define ppc_rlwimi(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,0)
541 #define ppc_rlwimid(c,A,S,SH,MB,ME) ppc_rlwimix(c,A,S,SH,MB,ME,1)
542
543 #define ppc_rlwinmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (21 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
544 #define ppc_rlwinm(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,0)
545 #define ppc_rlwinmd(c,A,S,SH,MB,ME) ppc_rlwinmx(c,A,S,SH,MB,ME,1)
546
547 #define ppc_rlwnmx(c,A,S,SH,MB,ME,Rc) ppc_emit32(c, (23 << 26) | (S << 21) | (A << 16) | (SH << 11) | (MB << 6) | (ME << 1) | Rc)
548 #define ppc_rlwnm(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,0)
549 #define ppc_rlwnmd(c,A,S,SH,MB,ME) ppc_rlwnmx(c,A,S,SH,MB,ME,1)
550
551 #define ppc_sc(c) ppc_emit32(c, (17 << 26) | (0 << 2) | (1 << 1) | 0)
552
553 #define ppc_slwx(c,S,A,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (24 << 1) | Rc)
554 #define ppc_slw(c,S,A,B) ppc_slwx(c,S,A,B,0)
555 #define ppc_slwd(c,S,A,B) ppc_slwx(c,S,A,B,1)
556
557 #define ppc_srawx(c,A,S,B,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (792 << 1) | Rc)
558 #define ppc_sraw(c,A,S,B) ppc_srawx(c,A,S,B,0)
559 #define ppc_srawd(c,A,S,B) ppc_srawx(c,A,S,B,1)
560
561 #define ppc_srawix(c,A,S,SH,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (SH << 11) | (824 << 1) | Rc)
562 #define ppc_srawi(c,A,S,B) ppc_srawix(c,A,S,B,0)
563 #define ppc_srawid(c,A,S,B) ppc_srawix(c,A,S,B,1)
564
565 #define ppc_srwx(c,A,S,SH,Rc) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (SH << 11) | (536 << 1) | Rc)
566 #define ppc_srw(c,A,S,B) ppc_srwx(c,A,S,B,0)
567 #define ppc_srwd(c,A,S,B) ppc_srwx(c,A,S,B,1)
568
569 #define ppc_stbu(c,S,A,D) ppc_emit32(c, (39 << 26) | (S << 21) | (A << 16) | (guint16)(D))
570
571 #define ppc_stbux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (247 << 1) | 0)
572 #define ppc_stbx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (215 << 1) | 0)
573
574 #define ppc_stfdu(c,S,A,D) ppc_emit32(c, (55 << 26) | (S << 21) | (A << 16) | (guint16)(D))
575
576 #define ppc_stfdx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (727 << 1) | 0)
577 #define ppc_stfiwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (983 << 1) | 0)
578
579 #define ppc_stfsu(c,S,A,D) ppc_emit32(c, (53 << 26) | (S << 21) | (A << 16) | (guint16)(D))
580 #define ppc_stfsux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (695 << 1) | 0)  
581 #define ppc_stfsx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (663 << 1) | 0)  
582 #define ppc_sthbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (918 << 1) | 0)  
583 #define ppc_sthu(c,S,A,D) ppc_emit32(c, (45 << 26) | (S << 21) | (A << 16) | (guint16)(D))
584 #define ppc_sthux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (439 << 1) | 0)
585 #define ppc_sthx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (407 << 1) | 0)
586 #define ppc_stmw(c,S,A,D) ppc_emit32(c, (47 << 26) | (S << 21) | (A << 16) | (guint16)D)
587 #define ppc_stswi(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (725 << 1) | 0)
588 #define ppc_stswx(c,S,A,NB) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (NB << 11) | (661 << 1) | 0)
589 #define ppc_stwbrx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (662 << 1) | 0)
590 #define ppc_stwcxd(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (150 << 1) | 1)
591 #define ppc_stwux(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (183 << 1) | 0)
592 #define ppc_stwx(c,S,A,B) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (151 << 1) | 0)
593
594 #define ppc_subfx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (40 << 1) | Rc)
595 #define ppc_subf(c,D,A,B) ppc_subfx(c,D,A,B,0,0)
596 #define ppc_subfd(c,D,A,B) ppc_subfx(c,D,A,B,0,1)
597 #define ppc_subfo(c,D,A,B) ppc_subfx(c,D,A,B,1,0)
598 #define ppc_subfod(c,D,A,B) ppc_subfx(c,D,A,B,1,1)
599
600 #define ppc_sub(c,D,A,B) ppc_subf(c,D,B,A)
601
602 #define ppc_subfcx(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (8 << 1) | Rc)
603 #define ppc_subfc(c,D,A,B) ppc_subfcx(c,D,A,B,0,0)
604 #define ppc_subfcd(c,D,A,B) ppc_subfcx(c,D,A,B,0,1)
605 #define ppc_subfco(c,D,A,B) ppc_subfcx(c,D,A,B,1,0)
606 #define ppc_subfcod(c,D,A,B) ppc_subfcx(c,D,A,B,1,1)
607
608 #define ppc_subfex(c,D,A,B,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (B << 11) | (OE << 10) | (136 << 1) | Rc)
609 #define ppc_subfe(c,D,A,B) ppc_subfex(c,D,A,B,0,0)
610 #define ppc_subfed(c,D,A,B) ppc_subfex(c,D,A,B,0,1)
611 #define ppc_subfeo(c,D,A,B) ppc_subfex(c,D,A,B,1,0)
612 #define ppc_subfeod(c,D,A,B) ppc_subfex(c,D,A,B,1,1)
613
614 #define ppc_subfic(c,D,A,SIMM) ppc_emit32(c, (8 << 26) | (D << 21) | (A << 16) | (guint16)(SIMM))
615
616 #define ppc_subfmex(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (232 << 1) | Rc)
617 #define ppc_subfme(c,D,A) ppc_subfmex(c,D,A,0,0)
618 #define ppc_subfmed(c,D,A) ppc_subfmex(c,D,A,0,1)
619 #define ppc_subfmeo(c,D,A) ppc_subfmex(c,D,A,1,0)
620 #define ppc_subfmeod(c,D,A) ppc_subfmex(c,D,A,1,1)
621
622 #define ppc_subfzex(c,D,A,OE,Rc) ppc_emit32(c, (31 << 26) | (D << 21) | (A << 16) | (0 << 11) | (OE << 10) | (200 << 1) | Rc)
623 #define ppc_subfze(c,D,A) ppc_subfzex(c,D,A,0,0)
624 #define ppc_subfzed(c,D,A) ppc_subfzex(c,D,A,0,1)
625 #define ppc_subfzeo(c,D,A) ppc_subfzex(c,D,A,1,0)
626 #define ppc_subfzeod(c,D,A) ppc_subfzex(c,D,A,1,1)
627
628 #define ppc_sync(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (598 << 1) | 0)
629 #define ppc_tlbia(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (370 << 1) | 0)
630 #define ppc_tlbie(c,B) ppc_emit32(c, (31 << 26) | (0 << 16) | (B << 11) | (306 << 1) | 0)
631 #define ppc_tlbsync(c) ppc_emit32(c, (31 << 26) | (0 << 11) | (566 << 1) | 0)
632
633 #define ppc_tw(c,TO,A,B) ppc_emit32(c, (31 << 26) | (TO << 21) | (A << 16) | (B << 11) | (4 << 1) | 0)
634 #define ppc_twi(c,TO,A,SIMM) ppc_emit32(c, (3 << 26) | (TO << 21) | (A << 16) | (guint16)(SIMM))
635
636 #define ppc_xorx(c,A,S,B,RC) ppc_emit32(c, (31 << 26) | (S << 21) | (A << 16) | (B << 11) | (316 << 1) | RC)
637 #define ppc_xor(c,A,S,B) ppc_xorx(c,A,S,B,0)
638 #define ppc_xord(c,A,S,B) ppc_xorx(c,A,S,B,1)
639
640 #define ppc_xori(c,S,A,UIMM) ppc_emit32(c, (26 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
641 #define ppc_xoris(c,S,A,UIMM) ppc_emit32(c, (27 << 26) | (S << 21) | (A << 16) | (guint16)(UIMM))
642
643 /* this marks the end of my work, ct */
644
645 #endif