drc: rm unneeded writebacks in stubs, as suggested by Ari64
[pcsx_rearmed.git] / libpcsxcore / ppc / ppc_mnemonics.h
CommitLineData
ef79bbde
P
1// ppc_mnemonics.h
2
3#define INSTR (*(ppcPtr)++)
4
5/* Link register related */
6#define MFLR(REG) \
7 {int _reg = (REG); \
8 INSTR = (0x7C0802A6 | (_reg << 21));}
9
10#define MTLR(REG) \
11 {int _reg = (REG); \
12 INSTR = (0x7C0803A6 | (_reg << 21));}
13
14#define MTCTR(REG) \
15 {int _reg = (REG); \
16 INSTR = (0x7C0903A6 | (_reg << 21));}
17
18#define BLR() \
19 {INSTR = (0x4E800020);}
20
21#define BGTLR() \
22 {INSTR = (0x4D810020);}
23
24
25/* Load ops */
26#define LI(REG, IMM) \
27 {int _reg = (REG); \
28 INSTR = (0x38000000 | (_reg << 21) | ((IMM) & 0xffff));}
29
30#define LIS(REG_DST, IMM) \
31 {int _dst = (REG_DST); \
32 INSTR = (0x3C000000 | (_dst << 21) | ((IMM) & 0xffff));}
33
34#define LWZ(REG_DST, OFFSET, REG) \
35 {int _reg = (REG); int _dst=(REG_DST); \
36 INSTR = (0x80000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
37
38#define LWZX(REG_DST, REG, REG_OFF) \
39 {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \
40 INSTR = (0x7C00002E | (_dst << 21) | (_reg << 16) | (_off << 11));}
41
42#define LWBRX(REG_DST, REG, REG_OFF) \
43 {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \
44 INSTR = (0x7C00042C | (_dst << 21) | (_reg << 16) | (_off << 11));}
45
46#define LHZ(REG_DST, OFFSET, REG) \
47 {int _reg = (REG); int _dst=(REG_DST); \
48 INSTR = (0xA0000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
49
50#define LHA(REG_DST, OFFSET, REG) \
51 {int _reg = (REG); int _dst=(REG_DST); \
52 INSTR = (0xA8000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
53
54#define LHBRX(REG_DST, REG, REG_OFF) \
55 {int _reg = (REG), _off = (REG_OFF); int _dst=(REG_DST); \
56 INSTR = (0x7C00062C | (_dst << 21) | (_reg << 16) | (_off << 11));}
57
58#define LBZ(REG_DST, OFFSET, REG) \
59 {int _reg = (REG); int _dst=(REG_DST); \
60 INSTR = (0x88000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
61
62#define LMW(REG_DST, OFFSET, REG) \
63 {int _reg = (REG); int _dst=(REG_DST); \
64 INSTR = (0xB8000000 | (_dst << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
65
66
67
68/* Store ops */
69#define STMW(REG_SRC, OFFSET, REG) \
70 {int _reg = (REG), _src=(REG_SRC); \
71 INSTR = (0xBC000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
72
73#define STW(REG_SRC, OFFSET, REG) \
74 {int _reg = (REG), _src=(REG_SRC); \
75 INSTR = (0x90000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
76
77#define STWBRX(REG_SRC, REG, REG_OFF) \
78 {int _reg = (REG), _src=(REG_SRC), _off = (REG_OFF); \
79 INSTR = (0x7C00052C | (_src << 21) | (_reg << 16) | (_off << 11));}
80
81#define STH(REG_SRC, OFFSET, REG) \
82 {int _reg = (REG), _src=(REG_SRC); \
83 INSTR = (0xB0000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
84
85#define STHBRX(REG_SRC, REG, REG_OFF) \
86 {int _reg = (REG), _src=(REG_SRC), _off = (REG_OFF); \
87 INSTR = (0x7C00072C | (_src << 21) | (_reg << 16) | (_off << 11));}
88
89#define STB(REG_SRC, OFFSET, REG) \
90 {int _reg = (REG), _src=(REG_SRC); \
91 INSTR = (0x98000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
92
93#define STWU(REG_SRC, OFFSET, REG) \
94 {int _reg = (REG), _src=(REG_SRC); \
95 INSTR = (0x94000000 | (_src << 21) | (_reg << 16) | ((OFFSET) & 0xffff));}
96
97
98/* Arithmic ops */
99#define ADDI(REG_DST, REG_SRC, IMM) \
100 {int _src = (REG_SRC); int _dst=(REG_DST); \
101 INSTR = (0x38000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));}
102
103#define ADDIS(REG_DST, REG_SRC, IMM) \
104 {int _src = (REG_SRC); int _dst=(REG_DST); \
105 INSTR = (0x3C000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));}
106
107#define MR(REG_DST, REG_SRC) \
108 {int __src = (REG_SRC); int __dst=(REG_DST); \
109 if (__src != __dst) {ADDI(__dst, __src, 0)}}
110
111#define ADD(REG_DST, REG1, REG2) \
112 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
113 INSTR = (0x7C000214 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
114
115#define ADDO(REG_DST, REG1, REG2) \
116 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
117 INSTR = (0x7C000614 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
118
119#define ADDEO(REG_DST, REG1, REG2) \
120 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
121 INSTR = (0x7C000514 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
122
123#define ADDE(REG_DST, REG1, REG2) \
124 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
125 INSTR = (0x7C000114 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
126
127#define ADDCO(REG_DST, REG1, REG2) \
128 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
129 INSTR = (0x7C000414 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
130
131#define ADDIC(REG_DST, REG_SRC, IMM) \
132 {int _src = (REG_SRC); int _dst=(REG_DST); \
133 INSTR = (0x30000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));}
134
135#define ADDIC_(REG_DST, REG_SRC, IMM) \
136 {int _src = (REG_SRC); int _dst=(REG_DST); \
137 INSTR = (0x34000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));}
138
139#define ADDZE(REG_DST, REG_SRC) \
140 {int _src = (REG_SRC); int _dst=(REG_DST); \
141 INSTR = (0x7C000194 | (_dst << 21) | (_src << 16));}
142
143#define SUBF(REG_DST, REG1, REG2) \
144 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
145 INSTR = (0x7C000050 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
146
147#define SUBFO(REG_DST, REG1, REG2) \
148 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
149 INSTR = (0x7C000450 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
150
151#define SUBFC(REG_DST, REG1, REG2) \
152 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
153 INSTR = (0x7C000010 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
154
155#define SUBFE(REG_DST, REG1, REG2) \
156 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
157 INSTR = (0x7C000110 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
158
159#define SUBFCO(REG_DST, REG1, REG2) \
160 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
161 INSTR = (0x7C000410 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
162
163#define SUBFCO_(REG_DST, REG1, REG2) \
164 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
165 INSTR = (0x7C000411 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
166
167#define SUB(REG_DST, REG1, REG2) \
168 {SUBF(REG_DST, REG2, REG1)}
169
170#define SUBO(REG_DST, REG1, REG2) \
171 {SUBFO(REG_DST, REG2, REG1)}
172
173#define SUBCO(REG_DST, REG1, REG2) \
174 {SUBFCO(REG_DST, REG2, REG1)}
175
176#define SUBCO_(REG_DST, REG1, REG2) \
177 {SUBFCO_(REG_DST, REG2, REG1)}
178
179#define SRAWI(REG_DST, REG_SRC, SHIFT) \
180 {int _src = (REG_SRC); int _dst=(REG_DST); \
181 INSTR = (0x7C000670 | (_src << 21) | (_dst << 16) | (SHIFT << 11));}
182
183#define MULHW(REG_DST, REG1, REG2) \
184 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
185 INSTR = (0x7C000096 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
186
187#define MULLW(REG_DST, REG1, REG2) \
188 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
189 INSTR = (0x7C0001D6 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
190
191#define MULHWU(REG_DST, REG1, REG2) \
192 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
193 INSTR = (0x7C000016 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
194
195#define MULLI(REG_DST, REG_SRC, IMM) \
196 {int _src = (REG_SRC); int _dst=(REG_DST); \
197 INSTR = (0x1C000000 | (_dst << 21) | (_src << 16) | ((IMM) & 0xffff));}
198
199#define DIVW(REG_DST, REG1, REG2) \
200 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
201 INSTR = (0x7C0003D6 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
202
203#define DIVWU(REG_DST, REG1, REG2) \
204 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
205 INSTR = (0x7C000396 | (_dst << 21) | (_reg1 << 16) | (_reg2 << 11));}
206
207
208/* Branch ops */
209#define B_FROM(VAR) VAR = ppcPtr
210#define B_DST(VAR) *VAR = *VAR | (((s16)((u32)ppcPtr - (u32)VAR)) & 0xfffc)
211
212#define B(DST) \
213 {INSTR = (0x48000000 | (((s32)(((DST)+1)<<2)) & 0x3fffffc));}
214
215#define B_L(VAR) \
216 {B_FROM(VAR); INSTR = (0x48000000);}
217
218#define BA(DST) \
219 {INSTR = (0x48000002 | ((s32)((DST) & 0x3fffffc)));}
220
221#define BLA(DST) \
222 {INSTR = (0x48000003 | ((s32)((DST) & 0x3fffffc)));}
223
224#define BNS(DST) \
225 {INSTR = (0x40830000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
226
227#define BNE(DST) \
228 {INSTR = (0x40820000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
229
230#define BNE_L(VAR) \
231 {B_FROM(VAR); INSTR = (0x40820000);}
232
233#define BEQ(DST) \
234 {INSTR = (0x41820000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
235
236#define BEQ_L(VAR) \
237 {B_FROM(VAR); INSTR = (0x41820000);}
238
239#define BLT(DST) \
240 {INSTR = (0x41800000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
241
242#define BLT_L(VAR) \
243 {B_FROM(VAR); INSTR = (0x41800000);}
244
245#define BGT(DST) \
246 {INSTR = (0x41810000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
247
248#define BGT_L(VAR) \
249 {B_FROM(VAR); INSTR = (0x41810000);}
250
251#define BGE(DST) \
252 {INSTR = (0x40800000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
253
254#define BGE_L(VAR) \
255 {B_FROM(VAR); INSTR = (0x40800000);}
256
257#define BLE(DST) \
258 {INSTR = (0x40810000 | (((s16)(((DST)+1)<<2)) & 0xfffc));}
259
260#define BLE_L(VAR) \
261 {B_FROM(VAR); INSTR = (0x40810000);}
262
263#define BCTRL() \
264 {INSTR = (0x4E800421);}
265
266#define BCTR() \
267 {INSTR = (0x4E800420);}
268
269
270/* compare ops */
271#define CMPLWI(REG, IMM) \
272 {int _reg = (REG); \
273 INSTR = (0x28000000 | (_reg << 16) | ((IMM) & 0xffff));}
274
275#define CMPLWI2(REG, IMM) \
276 {int _reg = (REG); \
277 INSTR = (0x29000000 | (_reg << 16) | ((IMM) & 0xffff));}
278
279#define CMPLWI7(REG, IMM) \
280 {int _reg = (REG); \
281 INSTR = (0x2B800000 | (_reg << 16) | ((IMM) & 0xffff));}
282
283#define CMPLW(REG1, REG2) \
284 {int _reg1 = (REG1), _reg2 = (REG2); \
285 INSTR = (0x7C000040 | (_reg1 << 16) | (_reg2 << 11));}
286
287#define CMPLW1(REG1, REG2) \
288 {int _reg1 = (REG1), _reg2 = (REG2); \
289 INSTR = (0x7C800040 | (_reg1 << 16) | (_reg2 << 11));}
290
291#define CMPLW2(REG1, REG2) \
292 {int _reg1 = (REG1), _reg2 = (REG2); \
293 INSTR = (0x7D000040 | (_reg1 << 16) | (_reg2 << 11));}
294
295#define CMPW(REG1, REG2) \
296 {int _reg1 = (REG1), _reg2 = (REG2); \
297 INSTR = (0x7C000000 | (_reg1 << 16) | (_reg2 << 11));}
298
299#define CMPW1(REG1, REG2) \
300 {int _reg1 = (REG1), _reg2 = (REG2); \
301 INSTR = (0x7C800000 | (_reg1 << 16) | (_reg2 << 11));}
302
303#define CMPW2(REG1, REG2) \
304 {int _reg1 = (REG1), _reg2 = (REG2); \
305 INSTR = (0x7D000000 | (_reg1 << 16) | (_reg2 << 11));}
306
307#define CMPWI(REG, IMM) \
308 {int _reg = (REG); \
309 INSTR = (0x2C000000 | (_reg << 16) | ((IMM) & 0xffff));}
310
311#define CMPWI2(REG, IMM) \
312 {int _reg = (REG); \
313 INSTR = (0x2D000000 | (_reg << 16) | ((IMM) & 0xffff));}
314
315#define MTCRF(MASK, REG) \
316 {int _reg = (REG); \
317 INSTR = (0x7C000120 | (_reg << 21) | (((MASK)&0xff)<<12));}
318
319#define MFCR(REG) \
320 {int _reg = (REG); \
321 INSTR = (0x7C000026 | (_reg << 21));}
322
323#define CROR(CR_DST, CR1, CR2) \
324 {INSTR = (0x4C000382 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));}
325
326#define CRXOR(CR_DST, CR1, CR2) \
327 {INSTR = (0x4C000182 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));}
328
329#define CRNAND(CR_DST, CR1, CR2) \
330 {INSTR = (0x4C0001C2 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));}
331
332#define CRANDC(CR_DST, CR1, CR2) \
333 {INSTR = (0x4C000102 | ((CR_DST) << 21) | ((CR1) << 16) | ((CR2) << 11));}
334
335
336/* shift ops */
337#define RLWINM(REG_DST, REG_SRC, SHIFT, START, END) \
338 {int _src = (REG_SRC); int _dst = (REG_DST); \
339 INSTR = (0x54000000 | (_src << 21) | (_dst << 16) | (SHIFT << 11) | (START << 6) | (END << 1));}
340
341#define RLWINM_(REG_DST, REG_SRC, SHIFT, START, END) \
342 {int _src = (REG_SRC); int _dst = (REG_DST); \
343 INSTR = (0x54000001 | (_src << 21) | (_dst << 16) | (SHIFT << 11) | (START << 6) | (END << 1));}
344
345#define CLRRWI(REG_DST, REG_SRC, LEN) \
346 RLWINM(REG_DST, REG_SRC, 0, 0, 31-LEN)
347
348#define SLWI(REG_DST, REG_SRC, SHIFT) \
349 {int _shift = (SHIFT); \
350 if (_shift==0) {MR(REG_DST, REG_SRC)} else \
351 {RLWINM(REG_DST, REG_SRC, _shift, 0, 31-_shift)}}
352
353#define SRWI(REG_DST, REG_SRC, SHIFT) \
354 {int _shift = (SHIFT); \
355 if (_shift==0) {MR(REG_DST, REG_SRC)} else \
356 RLWINM(REG_DST, REG_SRC, 32-_shift, _shift, 31)}
357
358#define SLW(REG_DST, REG_SRC, REG_SHIFT) \
359 {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \
360 INSTR = (0x7C000030 | (_src << 21) | (_dst << 16) | (_shift << 11));}
361
362#define SRW(REG_DST, REG_SRC, REG_SHIFT) \
363 {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \
364 INSTR = (0x7C000430 | (_src << 21) | (_dst << 16) | (_shift << 11));}
365
366#define SRAW(REG_DST, REG_SRC, REG_SHIFT) \
367 {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \
368 INSTR = (0x7C000630 | (_src << 21) | (_dst << 16) | (_shift << 11));}
369
370#define SRAWI(REG_DST, REG_SRC, SHIFT) \
371 {int _src = (REG_SRC); int _dst = (REG_DST); int _shift = (SHIFT); \
372 if (_shift==0) {MR(REG_DST, REG_SRC)} else \
373 INSTR = (0x7C000670 | (_src << 21) | (_dst << 16) | (_shift << 11));}
374
375#define RLWNM(REG_DST, REG_SRC, REG_SHIFT, START, END) \
376 {int _src = (REG_SRC), _shift = (REG_SHIFT); int _dst = (REG_DST); \
377 INSTR = (0x5C000000 | (_src << 21) | (_dst << 16) | (_shift << 11) | (START << 6) | (END << 1));}
378
379/* other ops */
380#define ORI(REG_DST, REG_SRC, IMM) \
381 {int _src = (REG_SRC), _imm = (IMM); int _dst = (REG_DST); \
382 if (!((_imm == 0) && ((_src^_dst) == 0))) \
383 INSTR = (0x60000000 | (_src << 21) | (_dst << 16) | (_imm & 0xffff));}
384
385#define ORIS(REG_DST, REG_SRC, IMM) \
386 {int _src = (REG_SRC), _imm = (IMM); int _dst = (REG_DST); \
387 if (!((_imm == 0) && ((_src^_dst) == 0))) \
388 INSTR = (0x64000000 | (_src << 21) | (_dst << 16) | (_imm & 0xffff));}
389
390#define OR(REG_DST, REG1, REG2) \
391 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
392 INSTR = (0x7C000378 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
393
394#define OR_(REG_DST, REG1, REG2) \
395 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
396 INSTR = (0x7C000379 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
397
398#define XORI(REG_DST, REG_SRC, IMM) \
399 {int _src = (REG_SRC); int _dst=(REG_DST); \
400 INSTR = (0x68000000 | (_src << 21) | (_dst << 16) | ((IMM) & 0xffff));}
401
402#define XOR(REG_DST, REG1, REG2) \
403 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
404 INSTR = (0x7C000278 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
405
406#define XOR_(REG_DST, REG1, REG2) \
407 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
408 INSTR = (0x7C000279 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
409
410#define ANDI_(REG_DST, REG_SRC, IMM) \
411 {int _src = (REG_SRC); int _dst=(REG_DST); \
412 INSTR = (0x70000000 | (_src << 21) | (_dst << 16) | ((IMM) & 0xffff));}
413
414#define AND(REG_DST, REG1, REG2) \
415 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
416 INSTR = (0x7C000038 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
417
418#define NOR(REG_DST, REG1, REG2) \
419 {int _reg1 = (REG1), _reg2 = (REG2); int _dst=(REG_DST); \
420 INSTR = (0x7C0000f8 | (_reg1 << 21) | (_dst << 16) | (_reg2 << 11));}
421
422#define NEG(REG_DST, REG_SRC) \
423 {int _src = (REG_SRC); int _dst=(REG_DST); \
424 INSTR = (0x7C0000D0 | (_dst << 21) | (_src << 16));}
425
426#define NOP() \
427 {INSTR = 0x60000000;}
428
429#define MCRXR(CR_DST) \
430 {INSTR = (0x7C000400 | (CR_DST << 23));}
431
432#define EXTSB(REG_DST, REG_SRC) \
433 {int _src = (REG_SRC); int _dst=(REG_DST); \
434 INSTR = (0x7C000774 | (_src << 21) | (_dst << 16));}
435
436#define EXTSH(REG_DST, REG_SRC) \
437 {int _src = (REG_SRC); int _dst=(REG_DST); \
438 INSTR = (0x7C000734 | (_src << 21) | (_dst << 16));}
439
440
441/* floating point ops */
442#define FDIVS(FPR_DST, FPR1, FPR2) \
443 {INSTR = (0xEC000024 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
444
445#define FDIV(FPR_DST, FPR1, FPR2) \
446 {INSTR = (0xFC000024 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
447
448#define FMULS(FPR_DST, FPR1, FPR2) \
449 {INSTR = (0xEC000032 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
450
451#define FMUL(FPR_DST, FPR1, FPR2) \
452 {INSTR = (0xFC000032 | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
453
454#define FADDS(FPR_DST, FPR1, FPR2) \
455 {INSTR = (0xEC00002A | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
456
457#define FADD(FPR_DST, FPR1, FPR2) \
458 {INSTR = (0xFC00002A | (FPR_DST << 21) | (FPR1 << 16) | (FPR2 << 11));}
459
460#define FRSP(FPR_DST, FPR_SRC) \
461 {INSTR = (0xFC000018 | (FPR_DST << 21) | (FPR_SRC << 11));}
462
463#define FCTIW(FPR_DST, FPR_SRC) \
464 {INSTR = (0xFC00001C | (FPR_DST << 21) | (FPR_SRC << 11));}
465
466
467#define LFS(FPR_DST, OFFSET, REG) \
468 {INSTR = (0xC0000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));}
469
470#define STFS(FPR_DST, OFFSET, REG) \
471 {INSTR = (0xD0000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));}
472
473#define LFD(FPR_DST, OFFSET, REG) \
474 {INSTR = (0xC8000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));}
475
476#define STFD(FPR_DST, OFFSET, REG) \
477 {INSTR = (0xD8000000 | (FPR_DST << 21) | (REG << 16) | ((OFFSET) & 0xffff));}
478
479
480
481/* extra combined opcodes */
482#if 1
483#define LIW(REG, IMM) /* Load Immidiate Word */ \
484{ \
485 int __reg = (REG); u32 __imm = (u32)(IMM); \
486 if ((s32)__imm == (s32)((s16)__imm)) \
487 { \
488 LI(__reg, (s32)((s16)__imm)); \
489 } else if (__reg == 0) { \
490 LIS(__reg, (((u32)__imm)>>16)); \
491 if ((((u32)__imm) & 0xffff) != 0) \
492 { \
493 ORI(__reg, __reg, __imm); \
494 } \
495 } else { \
496 if ((((u32)__imm) & 0xffff) == 0) { \
497 LIS(__reg, (((u32)__imm)>>16)); \
498 } else { \
499 LI(__reg, __imm); \
500 if ((__imm & 0x8000) == 0) { \
501 ADDIS(__reg, __reg, ((u32)__imm)>>16); \
502 } else { \
503 ADDIS(__reg, __reg, ((((u32)__imm)>>16) & 0xffff) + 1); \
504 } \
505 } \
506 /*if ((((u32)__imm) & 0xffff) != 0) \
507 { \
508 ORI(__reg, __reg, __imm); \
509 }*/ \
510 } \
511}
512#else
513#define LIW(REG, IMM) /* Load Immidiate Word */ \
514{ \
515 int __reg = (REG); u32 __imm = (u32)(IMM); \
516 if ((s32)__imm == (s32)((s16)__imm)) \
517 { \
518 LI(__reg, (s32)((s16)__imm)); \
519 } \
520 else \
521 { \
522 LIS(__reg, (((u32)__imm)>>16)); \
523 if ((((u32)__imm) & 0xffff) != 0) \
524 { \
525 ORI(__reg, __reg, __imm); \
526 } \
527 } \
528}
529#endif