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