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