Telkin
Loading...
Searching...
No Matches
Assembly.h
Go to the documentation of this file.
1#pragma once
2
3#include <telkin/Preprocessor.h>
4#include <cafe.h>
5
6// thx to mkwcat/nsmbw-project for some of these
7
8#if defined(TELKIN_NO_REGISTERS) || defined(TELKIN_REGISTERS)
9#error The TELKIN_REGISTERS macro system is deprecated. Instead, simply include telkin/DefineRegisters.h or telkin/UndefineRegisters.h throughout your file as needed.
10#endif
11
12#define tAssembly(...) __attribute__((naked)) __attribute__((__noinline__)) { __asm__ volatile (PP_STR_VAL(__VA_ARGS__)); }
13
14#ifdef __clangd__
15 #define tRegSave __attribute__(())
16#else
17 #define tRegSave __attribute__((preserve_all)) // red hills compiler magic for ppc
18#endif
19
20namespace tk::ppc {
21
22 enum GPR : u8 {
23 r0, r1, r2, r3, r4,
24 r5, r6, r7, r8, r9,
30
32 };
33
34 enum FPR : u8 {
35 f0, f1, f2, f3, f4,
36 f5, f6, f7, f8, f9,
42 };
43
44 enum CR : u8 {
46 };
47
48 using R = GPR;
49 using F = FPR;
50
51 namespace internal {
52 // I-form: [ op:6 | LI:24 | AA:1 | LK:1 ]
53 consteval u32 I_form(u8 op, s32 li, bool aa, bool lk) {
54 return (u32(op) << 26)
55 | (u32(li & 0xFF'FF'FF) << 2)
56 | (u32(aa) << 1)
57 | u32(lk);
58 }
59
60 // B-form: [ op:6 | BO:5 | BI:5 | BD:14 | AA:1 | LK:1 ]
61 consteval u32 B_form(u8 op, u8 bo, u8 bi, s16 bd, bool aa, bool lk) {
62 return (u32(op) << 26)
63 | (u32(bo & 0x1F) << 21)
64 | (u32(bi & 0x1F) << 16)
65 | (u32(bd & 0x3FFF) << 2)
66 | (u32(aa) << 1)
67 | u32(lk);
68 }
69
70 // D-form: [ op:6 | RT/RS:5 | RA:5 | D:16 ]
71 consteval u32 D_form(u8 op, u8 rsd, u8 ra, s16 d) {
72 return (u32(op) << 26)
73 | (u32(rsd & 0x1F) << 21)
74 | (u32(ra & 0x1F) << 16)
75 | u16(d);
76 }
77
78 // X-form: [ op:6 | RT/RS:5 | RA:5 | RB:5 | XO:10 | Rc:1 ]
79 consteval u32 X_form(u8 op, u8 rsd, u8 ra, u8 rb, u16 xo, bool rc) {
80 return (u32(op) << 26)
81 | (u32(rsd & 0x1F) << 21)
82 | (u32(ra & 0x1F) << 16)
83 | (u32(rb & 0x1F) << 11)
84 | (u32(xo & 0x3FF) << 1)
85 | u32(rc);
86 }
87
88 // XO-form: [ op:6 | RT:5 | RA:5 | RB:5 | OE:1 | XO:9 | Rc:1 ]
89 consteval u32 XO_form(u8 op, u8 rt, u8 ra, u8 rb, bool oe, u16 xo, bool rc) {
90 return (u32(op) << 26)
91 | (u32(rt & 0x1F) << 21)
92 | (u32(ra & 0x1F) << 16)
93 | (u32(rb & 0x1F) << 11)
94 | (u32(oe) << 10)
95 | (u32(xo & 0x1FF) << 1)
96 | u32(rc);
97 }
98
99 // A-form: [ op:6 | FRT/RT:5 | FRA/RA:5 | FRB/RB:5 | FRC/BC:5 | XO:5 | Rc:1 ]
100 consteval u32 A_form(u8 op, u8 frt, u8 fra, u8 frb, u8 frc, u8 xo, bool rc) {
101 return (u32(op) << 26)
102 | (u32(frt & 0x1F) << 21)
103 | (u32(fra & 0x1F) << 16)
104 | (u32(frb & 0x1F) << 11)
105 | (u32(frc & 0x1F) << 6)
106 | (u32(xo & 0x1F) << 1)
107 | u32(rc);
108 }
109
110 // M-form: [ op:6 | RS:5 | RA:5 | SH/RB:5 | MB:5 | ME:5 | Rc:1 ]
111 consteval u32 M_form(u8 op, u8 rs, u8 ra, u8 sh, u8 mb, u8 me, bool rc) {
112 return (u32(op) << 26)
113 | (u32(rs & 0x1F) << 21)
114 | (u32(ra & 0x1F) << 16)
115 | (u32(sh & 0x1F) << 11)
116 | (u32(mb & 0x1F) << 6)
117 | (u32(me & 0x1F) << 1)
118 | u32(rc);
119 }
120
121 // XL-form: [ op:6 | BT/BO:5 | BA/BI:5 | BB/BH:5 | XO:10 | LK:1 ]
122 consteval u32 XL_form(u8 op, u8 bt, u8 ba, u8 bb, u16 xo, bool lk) {
123 return (u32(op) << 26)
124 | (u32(bt & 0x1F) << 21)
125 | (u32(ba & 0x1F) << 16)
126 | (u32(bb & 0x1F) << 11)
127 | (u32(xo & 0x3FF) << 1)
128 | u32(lk);
129 }
130
131 // XFX-form SPR/TBR variant. The two five-bit halves of SPR are encoded swapped.
132 consteval u32 XFX_spr_form(u8 op, u8 rsd, u16 spr, u16 xo) {
133 return X_form(op, rsd, spr & 0x1F, (spr >> 5) & 0x1F, xo, false);
134 }
135
136 // XFX-form CRM variant: [ op:6 | RS:5 | 0:1 | CRM:8 | 0:1 | XO:10 | 0:1 ]
137 consteval u32 XFX_crm_form(u8 op, u8 rs, u8 crm, u16 xo) {
138 return (u32(op) << 26)
139 | (u32(rs & 0x1F) << 21)
140 | (u32(crm) << 12)
141 | (u32(xo & 0x3FF) << 1);
142 }
143
144 // XFL-form: [ op:6 | 0:1 | FM:8 | 0:1 | FRB:5 | XO:10 | Rc:1 ]
145 consteval u32 XFL_form(u8 op, u8 fm, u8 frb, u16 xo, bool rc) {
146 return (u32(op) << 26)
147 | (u32(fm) << 17)
148 | (u32(frb & 0x1F) << 11)
149 | (u32(xo & 0x3FF) << 1)
150 | u32(rc);
151 }
152
153 // Paired-single DW-form: [ op:6 | FRT/FRS:5 | RA:5 | W:1 | I:3 | D:12 ]
154 consteval u32 DW_form(u8 op, u8 frsd, u8 ra, s16 d, bool w, u8 i) {
155 return (u32(op) << 26)
156 | (u32(frsd & 0x1F) << 21)
157 | (u32(ra & 0x1F) << 16)
158 | (u32(w) << 15)
159 | (u32(i & 0x7) << 12)
160 | u32(d & 0x0FFF);
161 }
162
163 // Paired-single XW-form: [ 4:6 | FRT/FRS:5 | RA:5 | RB:5 | W:1 | I:3 | XO:6 | 0:1 ]
164 consteval u32 XW_form(u8 xo, u8 frsd, u8 ra, u8 rb, bool w, u8 i) {
165 return (u32(4) << 26)
166 | (u32(frsd & 0x1F) << 21)
167 | (u32(ra & 0x1F) << 16)
168 | (u32(rb & 0x1F) << 11)
169 | (u32(w) << 10)
170 | (u32(i & 0x7) << 7)
171 | (u32(xo & 0x3F) << 1);
172 }
173
174 consteval u8 cr_field(CR cr) { return (u8(cr) & 0x7) << 2; }
175
177 return base | (u32((s32(byte_offset) / 4) & 0x3FFF) << 2);
178 }
179
180 consteval u32 branch_bi(u32 base, u8 bi, s16 byte_offset) {
181 return branch_disp(base | (u32(bi & 0x1F) << 16), byte_offset);
182 }
183
184 consteval u32 branch_cr(u32 base, CR cr, s16 byte_offset) {
185 return branch_disp(base | (u32(u8(cr) & 0x7) << 18), byte_offset);
186 }
187
188 consteval u32 branch_xl_bi(u32 base, u8 bi) {
189 return base | (u32(bi & 0x1F) << 16);
190 }
191
192 consteval u32 branch_xl_cr(u32 base, CR cr) {
193 return base | (u32(u8(cr) & 0x7) << 18);
194 }
195 }
196
197 // Integer arithmetic
198 consteval u32 addi(R rt, R ra, s16 si) { return internal::D_form(14, u8(rt), u8(ra), si); }
199 consteval u32 addis(R rt, R ra, s16 si) { return internal::D_form(15, u8(rt), u8(ra), si); }
200 consteval u32 addic(R rt, R ra, s16 si) { return internal::D_form(12, u8(rt), u8(ra), si); }
201 consteval u32 addic_dot(R rt, R ra, s16 si) { return internal::D_form(13, u8(rt), u8(ra), si); }
202 consteval u32 subfic(R rt, R ra, s16 si) { return internal::D_form(8, u8(rt), u8(ra), si); }
203 consteval u32 mulli(R rt, R ra, s16 si) { return internal::D_form(7, u8(rt), u8(ra), si); }
204 consteval u32 subi(R rt, R ra, s16 si) { return addi(rt, ra, s16(-s32(si))); }
205 consteval u32 subis(R rt, R ra, s16 si) { return addis(rt, ra, s16(-s32(si))); }
206 consteval u32 subic(R rt, R ra, s16 si) { return addic(rt, ra, s16(-s32(si))); }
207 consteval u32 subic_dot(R rt, R ra, s16 si) { return addic_dot(rt, ra, s16(-s32(si))); }
208 consteval u32 la(R rt, R ra, s16 d) { return addi(rt, ra, d); }
209 consteval u32 li(R rt, s16 si) { return addi(rt, R::r0, si); }
210 consteval u32 lis(R rt, s16 si) { return addis(rt, R::r0, si); }
211
212 consteval u32 add(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 266, rc); }
213 consteval u32 addo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 266, rc); }
214 consteval u32 addc(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 10, rc); }
215 consteval u32 addco(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 10, rc); }
216 consteval u32 subfc(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 8, rc); }
217 consteval u32 subfco(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 8, rc); }
218 consteval u32 adde(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 138, rc); }
219 consteval u32 addeo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 138, rc); }
220 consteval u32 subfe(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 136, rc); }
221 consteval u32 subfeo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 136, rc); }
222 consteval u32 subf(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 40, rc); }
223 consteval u32 subfo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 40, rc); }
224 consteval u32 mullw(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 235, rc); }
225 consteval u32 mullwo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 235, rc); }
226 consteval u32 mulhw(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 75, rc); }
227 consteval u32 mulhwu(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 11, rc); }
228 consteval u32 divw(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 491, rc); }
229 consteval u32 divwo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 491, rc); }
230 consteval u32 divwu(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), false, 459, rc); }
231 consteval u32 divwuo(R rt, R ra, R rb, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), u8(rb), true, 459, rc); }
232 consteval u32 sub(R rt, R lhs, R rhs, bool rc = false) { return subf(rt, rhs, lhs, rc); }
233 consteval u32 subo(R rt, R lhs, R rhs, bool rc = false) { return subfo(rt, rhs, lhs, rc); }
234 consteval u32 subc(R rt, R lhs, R rhs, bool rc = false) { return subfc(rt, rhs, lhs, rc); }
235 consteval u32 subco(R rt, R lhs, R rhs, bool rc = false) { return subfco(rt, rhs, lhs, rc); }
236 consteval u32 addme(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, false, 234, rc); }
237 consteval u32 addmeo(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, true, 234, rc); }
238 consteval u32 subfme(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, false, 232, rc); }
239 consteval u32 subfmeo(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, true, 232, rc); }
240 consteval u32 addze(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, false, 202, rc); }
241 consteval u32 addzeo(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, true, 202, rc); }
242 consteval u32 subfze(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, false, 200, rc); }
243 consteval u32 subfzeo(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, true, 200, rc); }
244 consteval u32 neg(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, false, 104, rc); }
245 consteval u32 nego(R rt, R ra, bool rc = false) { return internal::XO_form(31, u8(rt), u8(ra), 0, true, 104, rc); }
246
247 // Integer compare
248 consteval u32 cmpi(R ra, s16 si, CR cr = CR::cr0) { return internal::D_form(11, internal::cr_field(cr), u8(ra), si); }
249 consteval u32 cmpli(R ra, u16 ui, CR cr = CR::cr0) { return internal::D_form(10, internal::cr_field(cr), u8(ra), s16(ui)); }
250 consteval u32 cmp(R ra, R rb, CR cr = CR::cr0) { return internal::X_form(31, internal::cr_field(cr), u8(ra), u8(rb), 0, false); }
251 consteval u32 cmpl(R ra, R rb, CR cr = CR::cr0) { return internal::X_form(31, internal::cr_field(cr), u8(ra), u8(rb), 32, false); }
252 consteval u32 cmpwi(R ra, s16 si, CR cr = CR::cr0) { return cmpi(ra, si, cr); }
253 consteval u32 cmplwi(R ra, u16 ui, CR cr = CR::cr0) { return cmpli(ra, ui, cr); }
254 consteval u32 cmpw(R ra, R rb, CR cr = CR::cr0) { return cmp(ra, rb, cr); }
255 consteval u32 cmplw(R ra, R rb, CR cr = CR::cr0) { return cmpl(ra, rb, cr); }
256
257 // Integer logical
258 consteval u32 andi(R ra, R rs, u16 ui) { return internal::D_form(28, u8(rs), u8(ra), s16(ui)); }
259 consteval u32 andis(R ra, R rs, u16 ui) { return internal::D_form(29, u8(rs), u8(ra), s16(ui)); }
260 consteval u32 ori(R ra, R rs, u16 ui) { return internal::D_form(24, u8(rs), u8(ra), s16(ui)); }
261 consteval u32 oris(R ra, R rs, u16 ui) { return internal::D_form(25, u8(rs), u8(ra), s16(ui)); }
262 consteval u32 xori(R ra, R rs, u16 ui) { return internal::D_form(26, u8(rs), u8(ra), s16(ui)); }
263 consteval u32 xoris(R ra, R rs, u16 ui) { return internal::D_form(27, u8(rs), u8(ra), s16(ui)); }
264 consteval u32 andr(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 28, rc); }
265 consteval u32 xorr(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 316, rc); }
266 consteval u32 orr(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 444, rc); }
267 consteval u32 nand(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 476, rc); }
268 consteval u32 norr(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 124, rc); }
269 consteval u32 andc(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 60, rc); }
270 consteval u32 eqv(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 284, rc); }
271 consteval u32 orc(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 412, rc); }
272 consteval u32 extsb(R ra, R rs, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), 0, 954, rc); }
273 consteval u32 extsh(R ra, R rs, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), 0, 922, rc); }
274 consteval u32 cntlzw(R ra, R rs, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), 0, 26, rc); }
275 consteval u32 mr(R ra, R rs, bool rc = false) { return orr(ra, rs, rs, rc); }
276 consteval u32 notr(R ra, R rs, bool rc = false) { return norr(ra, rs, rs, rc); }
277 consteval u32 isel(R rt, R ra, R rb, u8 bc) { return internal::A_form(31, u8(rt), u8(ra), u8(rb), bc, 15, false); }
278 consteval u32 isellt(R rt, R ra, R rb) { return isel(rt, ra, rb, 0); }
279 consteval u32 iselgt(R rt, R ra, R rb) { return isel(rt, ra, rb, 1); }
280 consteval u32 iseleq(R rt, R ra, R rb) { return isel(rt, ra, rb, 2); }
281 consteval u32 yield() { return 0x7F7BDB78u; }
282 consteval u32 mdoio() { return 0x7FBDEB78u; }
283 consteval u32 mdoom() { return 0x7FDEF378u; }
284 consteval u32 nop() { return ori(R::r0, R::r0, 0); }
285
286 // Integer rotate and shift
287 consteval u32 rlwinm(R ra, R rs, u8 sh, u8 mb, u8 me, bool rc = false) { return internal::M_form(21, u8(rs), u8(ra), sh, mb, me, rc); }
288 consteval u32 rlwnm(R ra, R rs, R rb, u8 mb, u8 me, bool rc = false) { return internal::M_form(23, u8(rs), u8(ra), u8(rb), mb, me, rc); }
289 consteval u32 rlwimi(R ra, R rs, u8 sh, u8 mb, u8 me, bool rc = false) { return internal::M_form(20, u8(rs), u8(ra), sh, mb, me, rc); }
290 consteval u32 extlwi(R ra, R rs, u8 n, u8 b, bool rc = false) { return rlwinm(ra, rs, b, 0, u8(n - 1), rc); }
291 consteval u32 extrwi(R ra, R rs, u8 n, u8 b, bool rc = false) { return rlwinm(ra, rs, u8(b + n), u8(32 - n), 31, rc); }
292 consteval u32 inslwi(R ra, R rs, u8 n, u8 b, bool rc = false) { return rlwimi(ra, rs, u8(32 - b), b, u8(b + n - 1), rc); }
293 consteval u32 insrwi(R ra, R rs, u8 n, u8 b, bool rc = false) { return rlwimi(ra, rs, u8(32 - (b + n)), b, u8(b + n - 1), rc); }
294 consteval u32 rotlwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, n, 0, 31, rc); }
295 consteval u32 rotrwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, u8(32 - n), 0, 31, rc); }
296 consteval u32 rotlw(R ra, R rs, R rb, bool rc = false) { return rlwnm(ra, rs, rb, 0, 31, rc); }
297 consteval u32 slwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, n, 0, u8(31 - n), rc); }
298 consteval u32 srwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, u8(32 - n), n, 31, rc); }
299 consteval u32 clrlwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, 0, n, 31, rc); }
300 consteval u32 clrrwi(R ra, R rs, u8 n, bool rc = false) { return rlwinm(ra, rs, 0, 0, u8(31 - n), rc); }
301 consteval u32 clrlslwi(R ra, R rs, u8 b, u8 n, bool rc = false) { return rlwinm(ra, rs, n, u8(b - n), u8(31 - n), rc); }
302 consteval u32 slw(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 24, rc); }
303 consteval u32 srw(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 536, rc); }
304 consteval u32 srawi(R ra, R rs, u8 sh, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), sh, 824, rc); }
305 consteval u32 sraw(R ra, R rs, R rb, bool rc = false) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 792, rc); }
306
307 // Floating-point arithmetic
308 consteval u32 fadd(F fd, F fa, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), 0, 21, rc); }
309 consteval u32 fadds(F fd, F fa, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), 0, 21, rc); }
310 consteval u32 fsub(F fd, F fa, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), 0, 20, rc); }
311 consteval u32 fsubs(F fd, F fa, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), 0, 20, rc); }
312 consteval u32 fmul(F fd, F fa, F fc, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), 0, u8(fc), 25, rc); }
313 consteval u32 fmuls(F fd, F fa, F fc, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), 0, u8(fc), 25, rc); }
314 consteval u32 fdiv(F fd, F fa, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), 0, 18, rc); }
315 consteval u32 fdivs(F fd, F fa, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), 0, 18, rc); }
316 consteval u32 fmadd(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), u8(fc), 29, rc); }
317 consteval u32 fmadds(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), u8(fc), 29, rc); }
318 consteval u32 fmsub(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), u8(fc), 28, rc); }
319 consteval u32 fmsubs(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), u8(fc), 28, rc); }
320 consteval u32 fnmadd(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), u8(fc), 31, rc); }
321 consteval u32 fnmadds(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), u8(fc), 31, rc); }
322 consteval u32 fnmsub(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), u8(fc), 30, rc); }
323 consteval u32 fnmsubs(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(59, u8(fd), u8(fa), u8(fb), u8(fc), 30, rc); }
324 consteval u32 frsp(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 12, rc); }
325 consteval u32 fctiw(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 14, rc); }
326 consteval u32 fctiwz(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 15, rc); }
327 consteval u32 fcmpu(CR cr, F fa, F fb) { return internal::X_form(63, internal::cr_field(cr), u8(fa), u8(fb), 0, false); }
328 consteval u32 fcmpo(CR cr, F fa, F fb) { return internal::X_form(63, internal::cr_field(cr), u8(fa), u8(fb), 32, false); }
329 consteval u32 mffs(F fd, bool rc = false) { return internal::X_form(63, u8(fd), 0, 0, 583, rc); }
330 consteval u32 mcrfs(CR crd, CR crs) { return internal::X_form(63, internal::cr_field(crd), internal::cr_field(crs), 0, 64, false); }
331 consteval u32 mtfsfi(CR crd, u8 imm4, bool rc = false) { return 0xFC00010Cu | (u32(internal::cr_field(crd)) << 21) | (u32(imm4 & 0xF) << 12) | u32(rc); }
332 consteval u32 mtfsf(u8 fm, F fb, bool rc = false) { return internal::XFL_form(63, fm, u8(fb), 711, rc); }
333 consteval u32 mtfsb0(u8 crb, bool rc = false) { return internal::X_form(63, crb, 0, 0, 70, rc); }
334 consteval u32 mtfsb1(u8 crb, bool rc = false) { return internal::X_form(63, crb, 0, 0, 38, rc); }
335
336 // Integer loads and stores
337 consteval u32 lbz(R rt, R ra, s16 d) { return internal::D_form(34, u8(rt), u8(ra), d); }
338 consteval u32 lbzu(R rt, R ra, s16 d) { return internal::D_form(35, u8(rt), u8(ra), d); }
339 consteval u32 lhz(R rt, R ra, s16 d) { return internal::D_form(40, u8(rt), u8(ra), d); }
340 consteval u32 lhzu(R rt, R ra, s16 d) { return internal::D_form(41, u8(rt), u8(ra), d); }
341 consteval u32 lha(R rt, R ra, s16 d) { return internal::D_form(42, u8(rt), u8(ra), d); }
342 consteval u32 lhau(R rt, R ra, s16 d) { return internal::D_form(43, u8(rt), u8(ra), d); }
343 consteval u32 lwz(R rt, R ra, s16 d) { return internal::D_form(32, u8(rt), u8(ra), d); }
344 consteval u32 lwzu(R rt, R ra, s16 d) { return internal::D_form(33, u8(rt), u8(ra), d); }
345 consteval u32 lbzx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 87, false); }
346 consteval u32 lbzux(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 119, false); }
347 consteval u32 lhzx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 279, false); }
348 consteval u32 lhzux(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 311, false); }
349 consteval u32 lhax(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 343, false); }
350 consteval u32 lhaux(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 375, false); }
351 consteval u32 lwzx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 23, false); }
352 consteval u32 lwzux(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 55, false); }
353 consteval u32 stb(R rs, R ra, s16 d) { return internal::D_form(38, u8(rs), u8(ra), d); }
354 consteval u32 stbu(R rs, R ra, s16 d) { return internal::D_form(39, u8(rs), u8(ra), d); }
355 consteval u32 sth(R rs, R ra, s16 d) { return internal::D_form(44, u8(rs), u8(ra), d); }
356 consteval u32 sthu(R rs, R ra, s16 d) { return internal::D_form(45, u8(rs), u8(ra), d); }
357 consteval u32 stw(R rs, R ra, s16 d) { return internal::D_form(36, u8(rs), u8(ra), d); }
358 consteval u32 stwu(R rs, R ra, s16 d) { return internal::D_form(37, u8(rs), u8(ra), d); }
359 consteval u32 stbx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 215, false); }
360 consteval u32 stbux(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 247, false); }
361 consteval u32 sthx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 407, false); }
362 consteval u32 sthux(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 439, false); }
363 consteval u32 stwx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 151, false); }
364 consteval u32 stwux(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 183, false); }
365 consteval u32 lhbrx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 790, false); }
366 consteval u32 lwbrx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 534, false); }
367 consteval u32 sthbrx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 918, false); }
368 consteval u32 stwbrx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 662, false); }
369 consteval u32 lmw(R rt, R ra, s16 d) { return internal::D_form(46, u8(rt), u8(ra), d); }
370 consteval u32 stmw(R rs, R ra, s16 d) { return internal::D_form(47, u8(rs), u8(ra), d); }
371 consteval u32 lswi(R rt, R ra, u8 nb) { return internal::X_form(31, u8(rt), u8(ra), nb, 597, false); }
372 consteval u32 lswx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 533, false); }
373 consteval u32 stswi(R rs, R ra, u8 nb) { return internal::X_form(31, u8(rs), u8(ra), nb, 725, false); }
374 consteval u32 stswx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 661, false); }
375
376 // Memory synchronization
377 consteval u32 sync(u8 l = 0) { return internal::X_form(31, l, 0, 0, 598, false); }
378 consteval u32 lwsync() { return sync(1); }
379 consteval u32 ptesync() { return sync(2); }
380 consteval u32 isync() { return internal::XL_form(19, 0, 0, 0, 150, false); }
381 consteval u32 eieio() { return internal::X_form(31, 0, 0, 0, 854, false); }
382 consteval u32 lwarx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 20, false); }
383 consteval u32 stwcx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 150, true); }
384
385 // Floating-point loads and stores
386 consteval u32 lfs(F ft, R ra, s16 d) { return internal::D_form(48, u8(ft), u8(ra), d); }
387 consteval u32 lfsu(F ft, R ra, s16 d) { return internal::D_form(49, u8(ft), u8(ra), d); }
388 consteval u32 lfd(F ft, R ra, s16 d) { return internal::D_form(50, u8(ft), u8(ra), d); }
389 consteval u32 lfdu(F ft, R ra, s16 d) { return internal::D_form(51, u8(ft), u8(ra), d); }
390 consteval u32 lfsx(F ft, R ra, R rb) { return internal::X_form(31, u8(ft), u8(ra), u8(rb), 535, false); }
391 consteval u32 lfsux(F ft, R ra, R rb) { return internal::X_form(31, u8(ft), u8(ra), u8(rb), 567, false); }
392 consteval u32 lfdx(F ft, R ra, R rb) { return internal::X_form(31, u8(ft), u8(ra), u8(rb), 599, false); }
393 consteval u32 lfdux(F ft, R ra, R rb) { return internal::X_form(31, u8(ft), u8(ra), u8(rb), 631, false); }
394 consteval u32 stfs(F fs, R ra, s16 d) { return internal::D_form(52, u8(fs), u8(ra), d); }
395 consteval u32 stfsu(F fs, R ra, s16 d) { return internal::D_form(53, u8(fs), u8(ra), d); }
396 consteval u32 stfd(F fs, R ra, s16 d) { return internal::D_form(54, u8(fs), u8(ra), d); }
397 consteval u32 stfdu(F fs, R ra, s16 d) { return internal::D_form(55, u8(fs), u8(ra), d); }
398 consteval u32 stfsx(F fs, R ra, R rb) { return internal::X_form(31, u8(fs), u8(ra), u8(rb), 663, false); }
399 consteval u32 stfsux(F fs, R ra, R rb) { return internal::X_form(31, u8(fs), u8(ra), u8(rb), 695, false); }
400 consteval u32 stfdx(F fs, R ra, R rb) { return internal::X_form(31, u8(fs), u8(ra), u8(rb), 727, false); }
401 consteval u32 stfdux(F fs, R ra, R rb) { return internal::X_form(31, u8(fs), u8(ra), u8(rb), 759, false); }
402 consteval u32 fmr(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 72, rc); }
403 consteval u32 fabs(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 264, rc); }
404 consteval u32 fneg(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 40, rc); }
405 consteval u32 fnabs(F fd, F fb, bool rc = false) { return internal::X_form(63, u8(fd), 0, u8(fb), 136, rc); }
406
407 // Branch instructions
408 consteval u32 bt(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41800000u, bi, byte_offset); }
409 consteval u32 bf(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40800000u, bi, byte_offset); }
410 consteval u32 bdnz(s16 byte_offset) { return internal::branch_disp(0x42000000u, byte_offset); }
411 consteval u32 bdnzt(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41000000u, bi, byte_offset); }
412 consteval u32 bdnzf(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40000000u, bi, byte_offset); }
413 consteval u32 bdz(s16 byte_offset) { return internal::branch_disp(0x42400000u, byte_offset); }
414 consteval u32 bdzt(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41400000u, bi, byte_offset); }
415 consteval u32 bdzf(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40400000u, bi, byte_offset); }
416 consteval u32 bta(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41800002u, bi, byte_offset); }
417 consteval u32 bfa(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40800002u, bi, byte_offset); }
418 consteval u32 bdnza(s16 byte_offset) { return internal::branch_disp(0x42000002u, byte_offset); }
419 consteval u32 bdnzta(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41000002u, bi, byte_offset); }
420 consteval u32 bdnzfa(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40000002u, bi, byte_offset); }
421 consteval u32 bdza(s16 byte_offset) { return internal::branch_disp(0x42400002u, byte_offset); }
422 consteval u32 bdzta(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41400002u, bi, byte_offset); }
423 consteval u32 bdzfa(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40400002u, bi, byte_offset); }
424 consteval u32 btl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41800001u, bi, byte_offset); }
425 consteval u32 bfl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40800001u, bi, byte_offset); }
426 consteval u32 bdnzl(s16 byte_offset) { return internal::branch_disp(0x42000001u, byte_offset); }
427 consteval u32 bdnztl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41000001u, bi, byte_offset); }
428 consteval u32 bdnzfl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40000001u, bi, byte_offset); }
429 consteval u32 bdzl(s16 byte_offset) { return internal::branch_disp(0x42400001u, byte_offset); }
430 consteval u32 bdztl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41400001u, bi, byte_offset); }
431 consteval u32 bdzfl(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40400001u, bi, byte_offset); }
432 consteval u32 btla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41800003u, bi, byte_offset); }
433 consteval u32 bfla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40800003u, bi, byte_offset); }
434 consteval u32 bdnzla(s16 byte_offset) { return internal::branch_disp(0x42000003u, byte_offset); }
435 consteval u32 bdnztla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41000003u, bi, byte_offset); }
436 consteval u32 bdnzfla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40000003u, bi, byte_offset); }
437 consteval u32 bdzla(s16 byte_offset) { return internal::branch_disp(0x42400003u, byte_offset); }
438 consteval u32 bdztla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x41400003u, bi, byte_offset); }
439 consteval u32 bdzfla(u8 bi, s16 byte_offset) { return internal::branch_bi(0x40400003u, bi, byte_offset); }
440 consteval u32 btlr(u8 bi) { return internal::branch_xl_bi(0x4D800020u, bi); }
441 consteval u32 bflr(u8 bi) { return internal::branch_xl_bi(0x4C800020u, bi); }
442 consteval u32 bdnzlr() { return 0x4E000020u; }
443 consteval u32 bdnztlr(u8 bi) { return internal::branch_xl_bi(0x4D000020u, bi); }
444 consteval u32 bdnzflr(u8 bi) { return internal::branch_xl_bi(0x4C000020u, bi); }
445 consteval u32 bdzlr() { return 0x4E400020u; }
446 consteval u32 bdztlr(u8 bi) { return internal::branch_xl_bi(0x4D400020u, bi); }
447 consteval u32 bdzflr(u8 bi) { return internal::branch_xl_bi(0x4C400020u, bi); }
448 consteval u32 btctr(u8 bi) { return internal::branch_xl_bi(0x4D800420u, bi); }
449 consteval u32 bfctr(u8 bi) { return internal::branch_xl_bi(0x4C800420u, bi); }
450 consteval u32 btlrl(u8 bi) { return internal::branch_xl_bi(0x4D800021u, bi); }
451 consteval u32 bflrl(u8 bi) { return internal::branch_xl_bi(0x4C800021u, bi); }
452 consteval u32 bdnzlrl() { return 0x4E000021u; }
453 consteval u32 bdnztlrl(u8 bi) { return internal::branch_xl_bi(0x4D000021u, bi); }
454 consteval u32 bdnzflrl(u8 bi) { return internal::branch_xl_bi(0x4C000021u, bi); }
455 consteval u32 bdzlrl() { return 0x4E400021u; }
456 consteval u32 bdztlrl(u8 bi) { return internal::branch_xl_bi(0x4D400021u, bi); }
457 consteval u32 bdzflrl(u8 bi) { return internal::branch_xl_bi(0x4C400021u, bi); }
458 consteval u32 btctrl(u8 bi) { return internal::branch_xl_bi(0x4D800421u, bi); }
459 consteval u32 bfctrl(u8 bi) { return internal::branch_xl_bi(0x4C800421u, bi); }
460 consteval u32 bltlr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D800020u, cr); }
461 consteval u32 blelr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810020u, cr); }
462 consteval u32 beqlr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D820020u, cr); }
463 consteval u32 bgelr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800020u, cr); }
464 consteval u32 bgtlr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D810020u, cr); }
465 consteval u32 bnllr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800020u, cr); }
466 consteval u32 bnelr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C820020u, cr); }
467 consteval u32 bnglr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810020u, cr); }
468 consteval u32 bsolr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830020u, cr); }
469 consteval u32 bnslr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830020u, cr); }
470 consteval u32 bunlr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830020u, cr); }
471 consteval u32 bnulr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830020u, cr); }
472 consteval u32 bltctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D800420u, cr); }
473 consteval u32 blectr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810420u, cr); }
474 consteval u32 beqctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D820420u, cr); }
475 consteval u32 bgectr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800420u, cr); }
476 consteval u32 bgtctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D810420u, cr); }
477 consteval u32 bnlctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800420u, cr); }
478 consteval u32 bnectr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C820420u, cr); }
479 consteval u32 bngctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810420u, cr); }
480 consteval u32 bsoctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830420u, cr); }
481 consteval u32 bnsctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830420u, cr); }
482 consteval u32 bunctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830420u, cr); }
483 consteval u32 bnuctr(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830420u, cr); }
484 consteval u32 bltlrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D800021u, cr); }
485 consteval u32 blelrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810021u, cr); }
486 consteval u32 beqlrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D820021u, cr); }
487 consteval u32 bgelrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800021u, cr); }
488 consteval u32 bgtlrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D810021u, cr); }
489 consteval u32 bnllrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800021u, cr); }
490 consteval u32 bnelrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C820021u, cr); }
491 consteval u32 bnglrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810021u, cr); }
492 consteval u32 bsolrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830021u, cr); }
493 consteval u32 bnslrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830021u, cr); }
494 consteval u32 bunlrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830021u, cr); }
495 consteval u32 bnulrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830021u, cr); }
496 consteval u32 bltctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D800421u, cr); }
497 consteval u32 blectrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810421u, cr); }
498 consteval u32 beqctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D820421u, cr); }
499 consteval u32 bgectrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800421u, cr); }
500 consteval u32 bgtctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D810421u, cr); }
501 consteval u32 bnlctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C800421u, cr); }
502 consteval u32 bnectrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C820421u, cr); }
503 consteval u32 bngctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C810421u, cr); }
504 consteval u32 bsoctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830421u, cr); }
505 consteval u32 bnsctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830421u, cr); }
506 consteval u32 bunctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4D830421u, cr); }
507 consteval u32 bnuctrl(CR cr = CR::cr0) { return internal::branch_xl_cr(0x4C830421u, cr); }
508 consteval u32 b(s32 byte_offset) { return internal::I_form(18, byte_offset / 4, false, false); }
509 consteval u32 ba(s32 byte_offset) { return internal::I_form(18, byte_offset / 4, true, false); }
510 consteval u32 bl(s32 byte_offset) { return internal::I_form(18, byte_offset / 4, false, true); }
511 consteval u32 bla(s32 byte_offset) { return internal::I_form(18, byte_offset / 4, true, true); }
512 consteval u32 blr() { return 0x4E800020u; }
513 consteval u32 bctr() { return 0x4E800420u; }
514 consteval u32 blrl() { return 0x4E800021u; }
515 consteval u32 bctrl() { return 0x4E800421u; }
516 consteval u32 bclr(u8 bo, u8 bi) { return internal::XL_form(19, bo, bi, 0, 16, false); }
517 consteval u32 bclrl(u8 bo, u8 bi) { return internal::XL_form(19, bo, bi, 0, 16, true); }
518 consteval u32 bcctr(u8 bo, u8 bi) { return internal::XL_form(19, bo, bi, 0, 528, false); }
519 consteval u32 bcctrl(u8 bo, u8 bi) { return internal::XL_form(19, bo, bi, 0, 528, true); }
520 consteval u32 bc(u8 bo, u8 bi, s16 byte_offset) { return internal::B_form(16, bo, bi, s16(s32(byte_offset) / 4), false, false); }
521 consteval u32 bca(u8 bo, u8 bi, s16 byte_offset) { return internal::B_form(16, bo, bi, s16(s32(byte_offset) / 4), true, false); }
522 consteval u32 bcl(u8 bo, u8 bi, s16 byte_offset) { return internal::B_form(16, bo, bi, s16(s32(byte_offset) / 4), false, true); }
523 consteval u32 bcla(u8 bo, u8 bi, s16 byte_offset) { return internal::B_form(16, bo, bi, s16(s32(byte_offset) / 4), true, true); }
524 consteval u32 blt(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41800000u, cr, byte_offset); }
525 consteval u32 ble(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810000u, cr, byte_offset); }
526 consteval u32 beq(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41820000u, cr, byte_offset); }
527 consteval u32 bge(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800000u, cr, byte_offset); }
528 consteval u32 bgt(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41810000u, cr, byte_offset); }
529 consteval u32 bnl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800000u, cr, byte_offset); }
530 consteval u32 bne(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40820000u, cr, byte_offset); }
531 consteval u32 bng(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810000u, cr, byte_offset); }
532 consteval u32 bso(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830000u, cr, byte_offset); }
533 consteval u32 bns(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830000u, cr, byte_offset); }
534 consteval u32 bun(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830000u, cr, byte_offset); }
535 consteval u32 bnu(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830000u, cr, byte_offset); }
536 consteval u32 blta(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41800002u, cr, byte_offset); }
537 consteval u32 blea(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810002u, cr, byte_offset); }
538 consteval u32 beqa(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41820002u, cr, byte_offset); }
539 consteval u32 bgea(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800002u, cr, byte_offset); }
540 consteval u32 bgta(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41810002u, cr, byte_offset); }
541 consteval u32 bnla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800002u, cr, byte_offset); }
542 consteval u32 bnea(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40820002u, cr, byte_offset); }
543 consteval u32 bnga(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810002u, cr, byte_offset); }
544 consteval u32 bsoa(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830002u, cr, byte_offset); }
545 consteval u32 bnsa(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830002u, cr, byte_offset); }
546 consteval u32 buna(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830002u, cr, byte_offset); }
547 consteval u32 bnua(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830002u, cr, byte_offset); }
548 consteval u32 bltl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41800001u, cr, byte_offset); }
549 consteval u32 blel(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810001u, cr, byte_offset); }
550 consteval u32 beql(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41820001u, cr, byte_offset); }
551 consteval u32 bgel(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800001u, cr, byte_offset); }
552 consteval u32 bgtl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41810001u, cr, byte_offset); }
553 consteval u32 bnll(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800001u, cr, byte_offset); }
554 consteval u32 bnel(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40820001u, cr, byte_offset); }
555 consteval u32 bngl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810001u, cr, byte_offset); }
556 consteval u32 bsol(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830001u, cr, byte_offset); }
557 consteval u32 bnsl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830001u, cr, byte_offset); }
558 consteval u32 bunl(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830001u, cr, byte_offset); }
559 consteval u32 bnul(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830001u, cr, byte_offset); }
560 consteval u32 bltla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41800003u, cr, byte_offset); }
561 consteval u32 blela(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810003u, cr, byte_offset); }
562 consteval u32 beqla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41820003u, cr, byte_offset); }
563 consteval u32 bgela(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800003u, cr, byte_offset); }
564 consteval u32 bgtla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41810003u, cr, byte_offset); }
565 consteval u32 bnlla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40800003u, cr, byte_offset); }
566 consteval u32 bnela(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40820003u, cr, byte_offset); }
567 consteval u32 bngla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40810003u, cr, byte_offset); }
568 consteval u32 bsola(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830003u, cr, byte_offset); }
569 consteval u32 bnsla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830003u, cr, byte_offset); }
570 consteval u32 bunla(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x41830003u, cr, byte_offset); }
571 consteval u32 bnula(s16 byte_offset, CR cr = CR::cr0) { return internal::branch_cr(0x40830003u, cr, byte_offset); }
572
573
574 // Condition-register
575 consteval u32 mcrf(CR crd, CR crs) { return internal::XL_form(19, internal::cr_field(crd), internal::cr_field(crs), 0, 0, false); }
576 consteval u32 crand(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 257, false); }
577 consteval u32 crxor(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 193, false); }
578 consteval u32 cror(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 449, false); }
579 consteval u32 crnand(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 225, false); }
580 consteval u32 crnor(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 33, false); }
581 consteval u32 crandc(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 129, false); }
582 consteval u32 creqv(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 289, false); }
583 consteval u32 crorc(u8 crbd, u8 crba, u8 crbb) { return internal::XL_form(19, crbd, crba, crbb, 417, false); }
584 consteval u32 crset(u8 crbd) { return creqv(crbd, crbd, crbd); }
585 consteval u32 crclr(u8 crbd) { return crxor(crbd, crbd, crbd); }
586 consteval u32 crmove(u8 crbd, u8 crba) { return cror(crbd, crba, crba); }
587 consteval u32 crnot(u8 crbd, u8 crba) { return crnor(crbd, crba, crba); }
588
589 // System
590 consteval u32 sc() { return 0x44000002u; }
591 consteval u32 rfi() { return 0x4C000064u; }
592
593 // Trap instructions
594 consteval u32 twi(u8 to, R ra, s16 si) { return internal::D_form(3, to, u8(ra), si); }
595 consteval u32 tw(u8 to, R ra, R rb) { return internal::X_form(31, to, u8(ra), u8(rb), 4, false); }
596 consteval u32 twlti(R ra, s16 imm) { return 0x0E000000u | (u32(u8(ra)) << 16) | u16(imm); }
597 consteval u32 twlei(R ra, s16 imm) { return 0x0E800000u | (u32(u8(ra)) << 16) | u16(imm); }
598 consteval u32 tweqi(R ra, s16 imm) { return 0x0C800000u | (u32(u8(ra)) << 16) | u16(imm); }
599 consteval u32 twgei(R ra, s16 imm) { return 0x0D800000u | (u32(u8(ra)) << 16) | u16(imm); }
600 consteval u32 twgti(R ra, s16 imm) { return 0x0D000000u | (u32(u8(ra)) << 16) | u16(imm); }
601 consteval u32 twnli(R ra, s16 imm) { return 0x0D800000u | (u32(u8(ra)) << 16) | u16(imm); }
602 consteval u32 twnei(R ra, s16 imm) { return 0x0F000000u | (u32(u8(ra)) << 16) | u16(imm); }
603 consteval u32 twngi(R ra, s16 imm) { return 0x0E800000u | (u32(u8(ra)) << 16) | u16(imm); }
604 consteval u32 twllti(R ra, u16 imm) { return 0x0C400000u | (u32(u8(ra)) << 16) | u16(imm); }
605 consteval u32 twllei(R ra, u16 imm) { return 0x0CC00000u | (u32(u8(ra)) << 16) | u16(imm); }
606 consteval u32 twlgei(R ra, u16 imm) { return 0x0CA00000u | (u32(u8(ra)) << 16) | u16(imm); }
607 consteval u32 twlgti(R ra, u16 imm) { return 0x0C200000u | (u32(u8(ra)) << 16) | u16(imm); }
608 consteval u32 twlnli(R ra, u16 imm) { return 0x0CA00000u | (u32(u8(ra)) << 16) | u16(imm); }
609 consteval u32 twlngi(R ra, u16 imm) { return 0x0CC00000u | (u32(u8(ra)) << 16) | u16(imm); }
610 consteval u32 trap() { return 0x7FE00008u; }
611 consteval u32 twlt(R ra, R rb) { return 0x7E000008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
612 consteval u32 twle(R ra, R rb) { return 0x7E800008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
613 consteval u32 tweq(R ra, R rb) { return 0x7C800008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
614 consteval u32 twge(R ra, R rb) { return 0x7D800008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
615 consteval u32 twgt(R ra, R rb) { return 0x7D000008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
616 consteval u32 twnl(R ra, R rb) { return 0x7D800008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
617 consteval u32 twne(R ra, R rb) { return 0x7F000008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
618 consteval u32 twng(R ra, R rb) { return 0x7E800008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
619 consteval u32 twllt(R ra, R rb) { return 0x7C400008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
620 consteval u32 twlle(R ra, R rb) { return 0x7CC00008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
621 consteval u32 twlge(R ra, R rb) { return 0x7CA00008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
622 consteval u32 twlgt(R ra, R rb) { return 0x7C200008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
623 consteval u32 twlnl(R ra, R rb) { return 0x7CA00008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
624 consteval u32 twlng(R ra, R rb) { return 0x7CC00008u | (u32(u8(ra)) << 16) | (u32(u8(rb)) << 11); }
625
626
627 // Special register ops
628 consteval u32 mtmsr(R rs) { return internal::X_form(31, u8(rs), 0, 0, 146, false); }
629 consteval u32 mfmsr(R rt) { return internal::X_form(31, u8(rt), 0, 0, 83, false); }
630 consteval u32 mtspr(u16 spr, R rs) { return internal::XFX_spr_form(31, u8(rs), spr, 467); }
631 consteval u32 mfspr(R rt, u16 spr) { return internal::XFX_spr_form(31, u8(rt), spr, 339); }
632 consteval u32 mtlr(R rs) { return mtspr(8, rs); }
633 consteval u32 mflr(R rt) { return mfspr(rt, 8); }
634 consteval u32 mtctr(R rs) { return mtspr(9, rs); }
635 consteval u32 mfctr(R rt) { return mfspr(rt, 9); }
636 consteval u32 mtxer(R rs) { return mtspr(1, rs); }
637 consteval u32 mfxer(R rt) { return mfspr(rt, 1); }
638 consteval u32 mfpvr(R rt) { return mfspr(rt, 287); }
639 consteval u32 mtdsisr(R rs) { return mtspr(18, rs); }
640 consteval u32 mfdsisr(R rt) { return mfspr(rt, 18); }
641 consteval u32 mtdar(R rs) { return mtspr(19, rs); }
642 consteval u32 mfdar(R rt) { return mfspr(rt, 19); }
643 consteval u32 mtdec(R rs) { return mtspr(22, rs); }
644 consteval u32 mfdec(R rt) { return mfspr(rt, 22); }
645 consteval u32 mtsrr0(R rs) { return mtspr(26, rs); }
646 consteval u32 mfsrr0(R rt) { return mfspr(rt, 26); }
647 consteval u32 mtsrr1(R rs) { return mtspr(27, rs); }
648 consteval u32 mfsrr1(R rt) { return mfspr(rt, 27); }
649 consteval u32 mtsdr1(R rs) { return mtspr(25, rs); }
650 consteval u32 mfsdr1(R rt) { return mfspr(rt, 25); }
651 consteval u32 mtear(R rs) { return mtspr(282, rs); }
652 consteval u32 mfear(R rt) { return mfspr(rt, 282); }
653 consteval u32 mtsprg(u8 sprg, R rs) { return mtspr(u16(272 + (sprg & 3)), rs); }
654 consteval u32 mfsprg(R rt, u8 sprg) { return mfspr(rt, u16(272 + (sprg & 3))); }
655 consteval u32 mtibatl(u8 bat, R rs) { return mtspr(u16(529 + ((bat & 3) * 2)), rs); }
656 consteval u32 mtibatu(u8 bat, R rs) { return mtspr(u16(528 + ((bat & 3) * 2)), rs); }
657 consteval u32 mfibatl(R rt, u8 bat) { return mfspr(rt, u16(529 + ((bat & 3) * 2))); }
658 consteval u32 mfibatu(R rt, u8 bat) { return mfspr(rt, u16(528 + ((bat & 3) * 2))); }
659 consteval u32 mtdbatl(u8 bat, R rs) { return mtspr(u16(537 + ((bat & 3) * 2)), rs); }
660 consteval u32 mtdbatu(u8 bat, R rs) { return mtspr(u16(536 + ((bat & 3) * 2)), rs); }
661 consteval u32 mfdbatl(R rt, u8 bat) { return mfspr(rt, u16(537 + ((bat & 3) * 2))); }
662 consteval u32 mfdbatu(R rt, u8 bat) { return mfspr(rt, u16(536 + ((bat & 3) * 2))); }
663 consteval u32 mttbl(R rs) { return mtspr(284, rs); }
664 consteval u32 mttbu(R rs) { return mtspr(285, rs); }
665 consteval u32 mftbl(R rt) { return mfspr(rt, 268); }
666 consteval u32 mftbu(R rt) { return mfspr(rt, 269); }
667 consteval u32 mtcrf(u8 crm, R rs) { return internal::XFX_crm_form(31, u8(rs), crm, 144); }
668 consteval u32 mtcr(R rs) { return mtcrf(0xFF, rs); }
669 consteval u32 mfcr(R rt) { return internal::X_form(31, u8(rt), 0, 0, 19, false); }
670 consteval u32 mcrxr(CR crd) { return internal::X_form(31, internal::cr_field(crd), 0, 0, 512, false); }
671
672 // Cache management
673 consteval u32 dcbz(R ra, R rb) { return internal::X_form(31, 0, u8(ra), u8(rb), 1014, false); }
674 consteval u32 dcbst(R ra, R rb) { return internal::X_form(31, 0, u8(ra), u8(rb), 54, false); }
675 consteval u32 dcbf(R ra, R rb) { return internal::X_form(31, 0, u8(ra), u8(rb), 86, false); }
676 consteval u32 dcbi(R ra, R rb) { return internal::X_form(31, 0, u8(ra), u8(rb), 470, false); }
677 consteval u32 icbi(R ra, R rb) { return internal::X_form(31, 0, u8(ra), u8(rb), 982, false); }
678
679 // Segment-register manipulation
680 consteval u32 mtsr(u8 sr, R rs) { return internal::X_form(31, u8(rs), sr & 0xF, 0, 210, false); }
681 consteval u32 mfsr(R rt, u8 sr) { return internal::X_form(31, u8(rt), sr & 0xF, 0, 595, false); }
682 consteval u32 mtsrin(R rs, R rb) { return internal::X_form(31, u8(rs), 0, u8(rb), 242, false); }
683 consteval u32 mfsrin(R rt, R rb) { return internal::X_form(31, u8(rt), 0, u8(rb), 659, false); }
684
685 // TLB and external-control
686 consteval u32 tlbie(R rb) { return internal::X_form(31, 0, 0, u8(rb), 306, false); }
687 consteval u32 eciwx(R rt, R ra, R rb) { return internal::X_form(31, u8(rt), u8(ra), u8(rb), 310, false); }
688 consteval u32 ecowx(R rs, R ra, R rb) { return internal::X_form(31, u8(rs), u8(ra), u8(rb), 438, false); }
689
690 // Standard extensions
691 consteval u32 fres(F fd, F fb, bool rc = false) { return internal::A_form(59, u8(fd), 0, u8(fb), 0, 24, rc); }
692 consteval u32 frsqrte(F fd, F fb, bool rc = false) { return internal::A_form(63, u8(fd), 0, u8(fb), 0, 26, rc); }
693 consteval u32 fsel(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(63, u8(fd), u8(fa), u8(fb), u8(fc), 23, rc); }
694 consteval u32 stfiwx(F fs, R ra, R rb) { return internal::X_form(31, u8(fs), u8(ra), u8(rb), 983, false); }
695 consteval u32 tlbsync() { return internal::X_form(31, 0, 0, 0, 566, false); }
696
697 // Paired singles
698 consteval u32 psq_l(F ft, R ra, s16 d, bool w, u8 i) { return internal::DW_form(56, u8(ft), u8(ra), d, w, i); }
699 consteval u32 psq_lu(F ft, R ra, s16 d, bool w, u8 i) { return internal::DW_form(57, u8(ft), u8(ra), d, w, i); }
700 consteval u32 psq_lux(F ft, R ra, R rb, bool w, u8 i) { return internal::XW_form(38, u8(ft), u8(ra), u8(rb), w, i); }
701 consteval u32 psq_lx(F ft, R ra, R rb, bool w, u8 i) { return internal::XW_form(6, u8(ft), u8(ra), u8(rb), w, i); }
702 consteval u32 psq_st(F fs, R ra, s16 d, bool w, u8 i) { return internal::DW_form(60, u8(fs), u8(ra), d, w, i); }
703 consteval u32 psq_stu(F fs, R ra, s16 d, bool w, u8 i) { return internal::DW_form(61, u8(fs), u8(ra), d, w, i); }
704 consteval u32 psq_stux(F fs, R ra, R rb, bool w, u8 i) { return internal::XW_form(39, u8(fs), u8(ra), u8(rb), w, i); }
705 consteval u32 psq_stx(F fs, R ra, R rb, bool w, u8 i) { return internal::XW_form(7, u8(fs), u8(ra), u8(rb), w, i); }
706 consteval u32 ps_mr(F fd, F fb, bool rc = false) { return internal::X_form(4, u8(fd), 0, u8(fb), 72, rc); }
707 consteval u32 ps_add(F fd, F fa, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), 0, 21, rc); }
708 consteval u32 ps_sub(F fd, F fa, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), 0, 20, rc); }
709 consteval u32 ps_mul(F fd, F fa, F fc, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), 0, u8(fc), 25, rc); }
710 consteval u32 ps_div(F fd, F fa, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), 0, 18, rc); }
711 consteval u32 ps_madd(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 29, rc); }
712 consteval u32 ps_msub(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 28, rc); }
713 consteval u32 ps_nmadd(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 31, rc); }
714 consteval u32 ps_nmsub(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 30, rc); }
715 consteval u32 ps_sel(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 23, rc); }
716 consteval u32 ps_abs(F fd, F fb, bool rc = false) { return internal::X_form(4, u8(fd), 0, u8(fb), 264, rc); }
717 consteval u32 ps_nabs(F fd, F fb, bool rc = false) { return internal::X_form(4, u8(fd), 0, u8(fb), 136, rc); }
718 consteval u32 ps_neg(F fd, F fb, bool rc = false) { return internal::X_form(4, u8(fd), 0, u8(fb), 40, rc); }
719 consteval u32 ps_res(F fd, F fb, bool rc = false) { return internal::A_form(4, u8(fd), 0, u8(fb), 0, 24, rc); }
720 consteval u32 ps_rsqrte(F fd, F fb, bool rc = false) { return internal::A_form(4, u8(fd), 0, u8(fb), 0, 26, rc); }
721 consteval u32 ps_muls0(F fd, F fa, F fc, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), 0, u8(fc), 12, rc); }
722 consteval u32 ps_muls1(F fd, F fa, F fc, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), 0, u8(fc), 13, rc); }
723 consteval u32 ps_madds0(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 14, rc); }
724 consteval u32 ps_madds1(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 15, rc); }
725 consteval u32 ps_sum0(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 10, rc); }
726 consteval u32 ps_sum1(F fd, F fa, F fc, F fb, bool rc = false) { return internal::A_form(4, u8(fd), u8(fa), u8(fb), u8(fc), 11, rc); }
727 consteval u32 ps_merge00(F fd, F fa, F fb, bool rc = false) { return internal::X_form(4, u8(fd), u8(fa), u8(fb), 528, rc); }
728 consteval u32 ps_merge01(F fd, F fa, F fb, bool rc = false) { return internal::X_form(4, u8(fd), u8(fa), u8(fb), 560, rc); }
729 consteval u32 ps_merge10(F fd, F fa, F fb, bool rc = false) { return internal::X_form(4, u8(fd), u8(fa), u8(fb), 592, rc); }
730 consteval u32 ps_merge11(F fd, F fa, F fb, bool rc = false) { return internal::X_form(4, u8(fd), u8(fa), u8(fb), 624, rc); }
731 consteval u32 ps_cmpo0(CR cr, F fa, F fb) { return internal::X_form(4, internal::cr_field(cr), u8(fa), u8(fb), 32, false); }
732 consteval u32 ps_cmpo1(CR cr, F fa, F fb) { return internal::X_form(4, internal::cr_field(cr), u8(fa), u8(fb), 96, false); }
733 consteval u32 ps_cmpu0(CR cr, F fa, F fb) { return internal::X_form(4, internal::cr_field(cr), u8(fa), u8(fb), 0, false); }
734 consteval u32 ps_cmpu1(CR cr, F fa, F fb) { return internal::X_form(4, internal::cr_field(cr), u8(fa), u8(fb), 64, false); }
735 consteval u32 dcbz_l(R ra, R rb) { return internal::X_form(4, 0, u8(ra), u8(rb), 1014, false); }
736}
737
738// It's recommended to use the tRegSave attribute directly in C++ instead of the below macros
739#define tSaveVolatileRegisters
740 stwu r1, -0x3C(r1);
741 stw r0, 0x08(r1);
742 stw r3, 0x0C(r1);
743 stw r4, 0x10(r1);
744 stw r5, 0x14(r1);
745 stw r6, 0x18(r1);
746 stw r7, 0x1C(r1);
747 stw r8, 0x20(r1);
748 stw r9, 0x24(r1);
749 stw r10, 0x28(r1);
750 stw r11, 0x2C(r1);
751 stw r12, 0x30(r1);
752 mfcr r0;
753 stw r0, 0x34(r1);
754 mfctr r0;
755 stw r0, 0x38(r1);
756 mflr r0;
757 stw r0, 0x40(r1)
758
759#define tRestoreVolatileRegisters
760 lwz r0, 0x38(r1);
761 mtctr r0;
762 lwz r0, 0x34(r1);
763 mtcr r0;
764 lwz r0, 0x40(r1);
765 mtlr r0;
766 lwz r0, 0x08(r1);
767 lwz r3, 0x0C(r1);
768 lwz r4, 0x10(r1);
769 lwz r5, 0x14(r1);
770 lwz r6, 0x18(r1);
771 lwz r7, 0x1C(r1);
772 lwz r8, 0x20(r1);
773 lwz r9, 0x24(r1);
774 lwz r10, 0x28(r1);
775 lwz r11, 0x2C(r1);
776 lwz r12, 0x30(r1);
777 addi r1, r1, 0x3C
778
779#define tSaveLR
780 stwu r1, -0x10(r1);
781 mflr r2;
782 stw r2, 0x14(r1)
783
784#define tRestoreLR
785 lwz r2, 0x14(r1);
786 mtlr r2;
787 addi r1, r1, 0x10
Definition Assembly.h:51
FPR F
Definition Assembly.h:49
GPR
Definition Assembly.h:22
@ r12
Definition Assembly.h:25
@ r27
Definition Assembly.h:28
@ sp
Definition Assembly.h:31
@ r0
Definition Assembly.h:23
@ r16
Definition Assembly.h:26
@ r2
Definition Assembly.h:23
@ r30
Definition Assembly.h:29
@ r13
Definition Assembly.h:25
@ r8
Definition Assembly.h:24
@ r15
Definition Assembly.h:26
@ r29
Definition Assembly.h:28
@ r6
Definition Assembly.h:24
@ r21
Definition Assembly.h:27
@ r26
Definition Assembly.h:28
@ r23
Definition Assembly.h:27
@ r1
Definition Assembly.h:23
@ r11
Definition Assembly.h:25
@ r3
Definition Assembly.h:23
@ r10
Definition Assembly.h:25
@ r25
Definition Assembly.h:28
@ r4
Definition Assembly.h:23
@ r22
Definition Assembly.h:27
@ r19
Definition Assembly.h:26
@ r17
Definition Assembly.h:26
@ r24
Definition Assembly.h:27
@ r31
Definition Assembly.h:29
@ r7
Definition Assembly.h:24
@ r18
Definition Assembly.h:26
@ r9
Definition Assembly.h:24
@ r20
Definition Assembly.h:27
@ r5
Definition Assembly.h:24
@ r14
Definition Assembly.h:25
@ r28
Definition Assembly.h:28
GPR R
Definition Assembly.h:48
FPR
Definition Assembly.h:34
@ f24
Definition Assembly.h:39
@ f19
Definition Assembly.h:38
@ f21
Definition Assembly.h:39
@ f4
Definition Assembly.h:35
@ f28
Definition Assembly.h:40
@ f25
Definition Assembly.h:40
@ f14
Definition Assembly.h:37
@ f6
Definition Assembly.h:36
@ f27
Definition Assembly.h:40
@ f11
Definition Assembly.h:37
@ f31
Definition Assembly.h:41
@ f9
Definition Assembly.h:36
@ f3
Definition Assembly.h:35
@ f12
Definition Assembly.h:37
@ f15
Definition Assembly.h:38
@ f23
Definition Assembly.h:39
@ f5
Definition Assembly.h:36
@ f29
Definition Assembly.h:40
@ f22
Definition Assembly.h:39
@ f8
Definition Assembly.h:36
@ f16
Definition Assembly.h:38
@ f26
Definition Assembly.h:40
@ f2
Definition Assembly.h:35
@ f7
Definition Assembly.h:36
@ f20
Definition Assembly.h:39
@ f1
Definition Assembly.h:35
@ f10
Definition Assembly.h:37
@ f17
Definition Assembly.h:38
@ f13
Definition Assembly.h:37
@ f30
Definition Assembly.h:41
@ f0
Definition Assembly.h:35
@ f18
Definition Assembly.h:38
CR
Definition Assembly.h:44
@ cr4
Definition Assembly.h:45
@ cr5
Definition Assembly.h:45
@ cr1
Definition Assembly.h:45
@ cr2
Definition Assembly.h:45
@ cr3
Definition Assembly.h:45
@ cr0
Definition Assembly.h:45
@ cr7
Definition Assembly.h:45
@ cr6
Definition Assembly.h:45
Definition Assembly.h:20
u64(*)() getTitleID_t
Definition Mod.h:16