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