Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/dep/biscuit/src/assembler_vector.cpp
4253 views
1
#include <biscuit/assert.hpp>
2
#include <biscuit/assembler.hpp>
3
4
namespace biscuit {
5
namespace {
6
7
enum class AddressingMode : uint32_t {
8
// clang-format off
9
UnitStride = 0b00,
10
IndexedUnordered = 0b01,
11
Strided = 0b10,
12
IndexedOrdered = 0b11,
13
// clang-format on
14
};
15
16
enum class UnitStrideLoadAddressingMode : uint32_t {
17
// clang-format off
18
Load = 0b00000,
19
MaskLoad = 0b01011,
20
LoadFaultOnlyFirst = 0b10000,
21
// clang-format on
22
};
23
24
enum class UnitStrideStoreAddressingMode : uint32_t {
25
// clang-format off
26
Store = 0b00000,
27
MaskStore = 0b01011,
28
// clang-format on
29
};
30
31
enum class WidthEncoding : uint32_t {
32
// clang-format off
33
E8 = 0b000,
34
E16 = 0b101,
35
E32 = 0b110,
36
E64 = 0b111,
37
// clang-format on
38
};
39
40
void EmitVectorLoadImpl(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
41
VecMask vm, uint32_t lumop, GPR rs, WidthEncoding width, Vec vd) noexcept {
42
BISCUIT_ASSERT(nf <= 8);
43
44
// Fit to encoding space. Allows for being more explicit about the size in calling functions
45
// (e.g. using 8 for 8 elements instead of 7).
46
if (nf != 0) {
47
nf -= 1;
48
}
49
50
// clang-format off
51
const auto value = (nf << 29) |
52
(static_cast<uint32_t>(mew) << 28) |
53
(static_cast<uint32_t>(mop) << 26) |
54
(static_cast<uint32_t>(vm) << 25) |
55
(lumop << 20) |
56
(rs.Index() << 15) |
57
(static_cast<uint32_t>(width) << 12) |
58
(vd.Index() << 7);
59
// clang-format on
60
61
buffer.Emit32(value | 0b111);
62
}
63
64
void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
65
VecMask vm, UnitStrideLoadAddressingMode lumop, GPR rs,
66
WidthEncoding width, Vec vd) noexcept {
67
EmitVectorLoadImpl(buffer, nf, mew, mop, vm, static_cast<uint32_t>(lumop), rs, width, vd);
68
}
69
70
void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
71
VecMask vm, GPR rs2, GPR rs1, WidthEncoding width, Vec vd) noexcept {
72
EmitVectorLoadImpl(buffer, nf, mew, mop, vm, rs2.Index(), rs1, width, vd);
73
}
74
75
void EmitVectorLoad(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
76
VecMask vm, Vec vs2, GPR rs1, WidthEncoding width, Vec vd) noexcept {
77
EmitVectorLoadImpl(buffer, nf, mew, mop, vm, vs2.Index(), rs1, width, vd);
78
}
79
80
void EmitVectorLoadWholeReg(CodeBuffer& buffer, uint32_t nf, bool mew, GPR rs,
81
WidthEncoding width, Vec vd) noexcept {
82
// RISC-V V extension spec (as of 1.0RC) only allows these nf values.
83
BISCUIT_ASSERT(nf == 1 || nf == 2 || nf == 4 || nf == 8);
84
85
EmitVectorLoadImpl(buffer, nf, mew, AddressingMode::UnitStride,
86
VecMask::No, 0b01000, rs, width, vd);
87
}
88
89
void EmitVectorStoreImpl(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
90
VecMask vm, uint32_t sumop, GPR rs, WidthEncoding width, Vec vd) noexcept {
91
BISCUIT_ASSERT(nf <= 8);
92
93
// Fit to encoding space. Allows for being more explicit about the size in calling functions
94
// (e.g. using 8 for 8 elements instead of 7).
95
if (nf != 0) {
96
nf -= 1;
97
}
98
99
// clang-format off
100
const auto value = (nf << 29) |
101
(static_cast<uint32_t>(mew) << 28) |
102
(static_cast<uint32_t>(mop) << 26) |
103
(static_cast<uint32_t>(vm) << 25) |
104
(sumop << 20) |
105
(rs.Index() << 15) |
106
(static_cast<uint32_t>(width) << 12) |
107
(vd.Index() << 7);
108
// clang-format on
109
110
buffer.Emit32(value | 0b100111);
111
}
112
113
void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
114
VecMask vm, UnitStrideStoreAddressingMode lumop, GPR rs,
115
WidthEncoding width, Vec vs) noexcept {
116
EmitVectorStoreImpl(buffer, nf, mew, mop, vm, static_cast<uint32_t>(lumop), rs, width, vs);
117
}
118
119
void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
120
VecMask vm, GPR rs2, GPR rs1, WidthEncoding width, Vec vs3) noexcept {
121
EmitVectorStoreImpl(buffer, nf, mew, mop, vm, rs2.Index(), rs1, width, vs3);
122
}
123
124
void EmitVectorStore(CodeBuffer& buffer, uint32_t nf, bool mew, AddressingMode mop,
125
VecMask vm, Vec vs2, GPR rs1, WidthEncoding width, Vec vs3) noexcept {
126
EmitVectorStoreImpl(buffer, nf, mew, mop, vm, vs2.Index(), rs1, width, vs3);
127
}
128
129
void EmitVectorStoreWholeReg(CodeBuffer& buffer, uint32_t nf, GPR rs, Vec vs) noexcept {
130
// RISC-V V extension spec (as of 1.0RC) only allows these nf values.
131
BISCUIT_ASSERT(nf == 1 || nf == 2 || nf == 4 || nf == 8);
132
133
EmitVectorStoreImpl(buffer, nf, false, AddressingMode::UnitStride, VecMask::No,
134
0b01000, rs, WidthEncoding::E8, vs);
135
}
136
137
void EmitVectorOPIVIImpl(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, uint32_t imm5, Vec vd) noexcept {
138
// clang-format off
139
const auto value = (funct6 << 26) |
140
(static_cast<uint32_t>(vm) << 25) |
141
(vs2.Index() << 20) |
142
((imm5 & 0b11111) << 15) |
143
(0b011U << 12) |
144
(vd.Index() << 7);
145
// clang-format on
146
147
buffer.Emit32(value | 0b1010111);
148
}
149
150
void EmitVectorOPIVI(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, int32_t simm5, Vec vd) noexcept {
151
BISCUIT_ASSERT(simm5 >= -16 && simm5 <= 15);
152
EmitVectorOPIVIImpl(buffer, funct6, vm, vs2, static_cast<uint32_t>(simm5), vd);
153
}
154
155
void EmitVectorOPIVUI(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, uint32_t uimm5, Vec vd) noexcept {
156
BISCUIT_ASSERT(uimm5 <= 31);
157
EmitVectorOPIVIImpl(buffer, funct6, vm, vs2, uimm5, vd);
158
}
159
160
void EmitVectorOPIVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {
161
// clang-format off
162
const auto value = (funct6 << 26) |
163
(static_cast<uint32_t>(vm) << 25) |
164
(vs2.Index() << 20) |
165
(vs1.Index() << 15) |
166
(vd.Index() << 7);
167
// clang-format on
168
169
buffer.Emit32(value | 0b1010111);
170
}
171
172
void EmitVectorOPIVX(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, GPR rs1, Vec vd) noexcept {
173
// clang-format off
174
const auto value = (funct6 << 26) |
175
(static_cast<uint32_t>(vm) << 25) |
176
(vs2.Index() << 20) |
177
(rs1.Index() << 15) |
178
(0b100U << 12) |
179
(vd.Index() << 7);
180
// clang-format on
181
182
buffer.Emit32(value | 0b1010111);
183
}
184
185
void EmitVectorOPMVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {
186
// clang-format off
187
const auto value = (funct6 << 26) |
188
(static_cast<uint32_t>(vm) << 25) |
189
(vs2.Index() << 20) |
190
(vs1.Index() << 15) |
191
(0b010U << 12) |
192
(vd.Index() << 7);
193
// clang-format on
194
195
buffer.Emit32(value | 0b1010111);
196
}
197
198
void EmitVectorOPMVX(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, GPR rs1, Vec vd) noexcept {
199
// clang-format off
200
const auto value = (funct6 << 26) |
201
(static_cast<uint32_t>(vm) << 25) |
202
(vs2.Index() << 20) |
203
(rs1.Index() << 15) |
204
(0b110U << 12) |
205
(vd.Index() << 7);
206
// clang-format on
207
208
buffer.Emit32(value | 0b1010111);
209
}
210
211
void EmitVectorOPFVV(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, Vec vs1, Vec vd) noexcept {
212
// clang-format off
213
const auto value = (funct6 << 26) |
214
(static_cast<uint32_t>(vm) << 25) |
215
(vs2.Index() << 20) |
216
(vs1.Index() << 15) |
217
(0b001U << 12) |
218
(vd.Index() << 7);
219
// clang-format on
220
221
buffer.Emit32(value | 0b1010111);
222
}
223
224
void EmitVectorOPFVF(CodeBuffer& buffer, uint32_t funct6, VecMask vm, Vec vs2, FPR rs1, Vec vd) noexcept {
225
// clang-format off
226
const auto value = (funct6 << 26) |
227
(static_cast<uint32_t>(vm) << 25) |
228
(vs2.Index() << 20) |
229
(rs1.Index() << 15) |
230
(0b101U << 12) |
231
(vd.Index() << 7);
232
// clang-format on
233
234
buffer.Emit32(value | 0b1010111);
235
}
236
} // Anonymous namespace
237
238
// Vector Integer Arithmetic Instructions
239
240
void Assembler::VAADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
241
EmitVectorOPMVV(m_buffer, 0b001001, mask, vs2, vs1, vd);
242
}
243
244
void Assembler::VAADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
245
EmitVectorOPMVX(m_buffer, 0b001001, mask, vs2, rs1, vd);
246
}
247
248
void Assembler::VAADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
249
EmitVectorOPMVV(m_buffer, 0b001000, mask, vs2, vs1, vd);
250
}
251
252
void Assembler::VAADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
253
EmitVectorOPMVX(m_buffer, 0b001000, mask, vs2, rs1, vd);
254
}
255
256
void Assembler::VADC(Vec vd, Vec vs2, Vec vs1) noexcept {
257
EmitVectorOPIVV(m_buffer, 0b010000, VecMask::Yes, vs2, vs1, vd);
258
}
259
260
void Assembler::VADC(Vec vd, Vec vs2, GPR rs1) noexcept {
261
EmitVectorOPIVX(m_buffer, 0b010000, VecMask::Yes, vs2, rs1, vd);
262
}
263
264
void Assembler::VADC(Vec vd, Vec vs2, int32_t simm) noexcept {
265
EmitVectorOPIVI(m_buffer, 0b010000, VecMask::Yes, vs2, simm, vd);
266
}
267
268
void Assembler::VADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
269
EmitVectorOPIVV(m_buffer, 0b000000, mask, vs2, vs1, vd);
270
}
271
272
void Assembler::VADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
273
EmitVectorOPIVX(m_buffer, 0b000000, mask, vs2, rs1, vd);
274
}
275
276
void Assembler::VADD(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
277
EmitVectorOPIVI(m_buffer, 0b000000, mask, vs2, simm, vd);
278
}
279
280
void Assembler::VAND(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
281
EmitVectorOPIVV(m_buffer, 0b001001, mask, vs2, vs1, vd);
282
}
283
284
void Assembler::VAND(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
285
EmitVectorOPIVX(m_buffer, 0b001001, mask, vs2, rs1, vd);
286
}
287
288
void Assembler::VAND(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
289
EmitVectorOPIVI(m_buffer, 0b001001, mask, vs2, simm, vd);
290
}
291
292
void Assembler::VASUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
293
EmitVectorOPMVV(m_buffer, 0b001011, mask, vs2, vs1, vd);
294
}
295
296
void Assembler::VASUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
297
EmitVectorOPMVX(m_buffer, 0b001011, mask, vs2, rs1, vd);
298
}
299
300
void Assembler::VASUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
301
EmitVectorOPMVV(m_buffer, 0b001010, mask, vs2, vs1, vd);
302
}
303
304
void Assembler::VASUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
305
EmitVectorOPMVX(m_buffer, 0b001010, mask, vs2, rs1, vd);
306
}
307
308
void Assembler::VCOMPRESS(Vec vd, Vec vs2, Vec vs1) noexcept {
309
// Note: Destination register may not overlap any of the source registers,
310
// as per the RVV spec (as of 1.0RC; see section 16.5)
311
EmitVectorOPMVV(m_buffer, 0b010111, VecMask::No, vs2, vs1, vd);
312
}
313
314
void Assembler::VDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
315
EmitVectorOPMVV(m_buffer, 0b100001, mask, vs2, vs1, vd);
316
}
317
318
void Assembler::VDIV(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
319
EmitVectorOPMVX(m_buffer, 0b100001, mask, vs2, rs1, vd);
320
}
321
322
void Assembler::VDIVU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
323
EmitVectorOPMVV(m_buffer, 0b100000, mask, vs2, vs1, vd);
324
}
325
326
void Assembler::VDIVU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
327
EmitVectorOPMVX(m_buffer, 0b100000, mask, vs2, rs1, vd);
328
}
329
330
void Assembler::VFIRST(GPR rd, Vec vs, VecMask mask) noexcept {
331
EmitVectorOPMVV(m_buffer, 0b010000, mask, vs, v17, Vec{rd.Index()});
332
}
333
334
void Assembler::VID(Vec vd, VecMask mask) noexcept {
335
EmitVectorOPMVV(m_buffer, 0b010100, mask, v0, v17, vd);
336
}
337
338
void Assembler::VIOTA(Vec vd, Vec vs, VecMask mask) noexcept {
339
EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v16, vd);
340
}
341
342
void Assembler::VMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
343
EmitVectorOPMVV(m_buffer, 0b101101, mask, vs2, vs1, vd);
344
}
345
346
void Assembler::VMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
347
EmitVectorOPMVX(m_buffer, 0b101101, mask, vs2, rs1, vd);
348
}
349
350
void Assembler::VMADC(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
351
EmitVectorOPIVV(m_buffer, 0b010001, mask, vs2, vs1, vd);
352
}
353
354
void Assembler::VMADC(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
355
EmitVectorOPIVX(m_buffer, 0b010001, mask, vs2, rs1, vd);
356
}
357
358
void Assembler::VMADC(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
359
EmitVectorOPIVI(m_buffer, 0b010001, mask, vs2, simm, vd);
360
}
361
362
void Assembler::VMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
363
EmitVectorOPMVV(m_buffer, 0b101001, mask, vs2, vs1, vd);
364
}
365
366
void Assembler::VMADD(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
367
EmitVectorOPMVX(m_buffer, 0b101001, mask, vs2, rs1, vd);
368
}
369
370
void Assembler::VMAND(Vec vd, Vec vs2, Vec vs1) noexcept {
371
EmitVectorOPMVV(m_buffer, 0b011001, VecMask::No, vs2, vs1, vd);
372
}
373
374
void Assembler::VMANDNOT(Vec vd, Vec vs2, Vec vs1) noexcept {
375
EmitVectorOPMVV(m_buffer, 0b011000, VecMask::No, vs2, vs1, vd);
376
}
377
378
void Assembler::VMNAND(Vec vd, Vec vs2, Vec vs1) noexcept {
379
EmitVectorOPMVV(m_buffer, 0b011101, VecMask::No, vs2, vs1, vd);
380
}
381
382
void Assembler::VMNOR(Vec vd, Vec vs2, Vec vs1) noexcept {
383
EmitVectorOPMVV(m_buffer, 0b011110, VecMask::No, vs2, vs1, vd);
384
}
385
386
void Assembler::VMOR(Vec vd, Vec vs2, Vec vs1) noexcept {
387
EmitVectorOPMVV(m_buffer, 0b011010, VecMask::No, vs2, vs1, vd);
388
}
389
390
void Assembler::VMORNOT(Vec vd, Vec vs2, Vec vs1) noexcept {
391
EmitVectorOPMVV(m_buffer, 0b011100, VecMask::No, vs2, vs1, vd);
392
}
393
394
void Assembler::VMXNOR(Vec vd, Vec vs2, Vec vs1) noexcept {
395
EmitVectorOPMVV(m_buffer, 0b011111, VecMask::No, vs2, vs1, vd);
396
}
397
398
void Assembler::VMXOR(Vec vd, Vec vs2, Vec vs1) noexcept {
399
EmitVectorOPMVV(m_buffer, 0b011011, VecMask::No, vs2, vs1, vd);
400
}
401
402
void Assembler::VMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
403
EmitVectorOPIVV(m_buffer, 0b000111, mask, vs2, vs1, vd);
404
}
405
406
void Assembler::VMAX(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
407
EmitVectorOPIVX(m_buffer, 0b000111, mask, vs2, rs1, vd);
408
}
409
410
void Assembler::VMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
411
EmitVectorOPIVV(m_buffer, 0b000110, mask, vs2, vs1, vd);
412
}
413
414
void Assembler::VMAXU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
415
EmitVectorOPIVX(m_buffer, 0b000110, mask, vs2, rs1, vd);
416
}
417
418
void Assembler::VMERGE(Vec vd, Vec vs2, Vec vs1) noexcept {
419
EmitVectorOPIVV(m_buffer, 0b010111, VecMask::Yes, vs2, vs1, vd);
420
}
421
422
void Assembler::VMERGE(Vec vd, Vec vs2, GPR rs1) noexcept {
423
EmitVectorOPIVX(m_buffer, 0b010111, VecMask::Yes, vs2, rs1, vd);
424
}
425
426
void Assembler::VMERGE(Vec vd, Vec vs2, int32_t simm) noexcept {
427
EmitVectorOPIVI(m_buffer, 0b010111, VecMask::Yes, vs2, simm, vd);
428
}
429
430
void Assembler::VMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
431
EmitVectorOPIVV(m_buffer, 0b000101, mask, vs2, vs1, vd);
432
}
433
434
void Assembler::VMIN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
435
EmitVectorOPIVX(m_buffer, 0b000101, mask, vs2, rs1, vd);
436
}
437
438
void Assembler::VMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
439
EmitVectorOPIVV(m_buffer, 0b000100, mask, vs2, vs1, vd);
440
}
441
442
void Assembler::VMINU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
443
EmitVectorOPIVX(m_buffer, 0b000100, mask, vs2, rs1, vd);
444
}
445
446
void Assembler::VMSBC(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
447
EmitVectorOPIVV(m_buffer, 0b010011, mask, vs2, vs1, vd);
448
}
449
450
void Assembler::VMSBC(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
451
EmitVectorOPIVX(m_buffer, 0b010011, mask, vs2, rs1, vd);
452
}
453
454
void Assembler::VMSBF(Vec vd, Vec vs, VecMask mask) noexcept {
455
EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v1, vd);
456
}
457
458
void Assembler::VMSIF(Vec vd, Vec vs, VecMask mask) noexcept {
459
EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v3, vd);
460
}
461
462
void Assembler::VMSOF(Vec vd, Vec vs, VecMask mask) noexcept {
463
EmitVectorOPMVV(m_buffer, 0b010100, mask, vs, v2, vd);
464
}
465
466
void Assembler::VMSEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
467
EmitVectorOPIVV(m_buffer, 0b011000, mask, vs2, vs1, vd);
468
}
469
470
void Assembler::VMSEQ(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
471
EmitVectorOPIVX(m_buffer, 0b011000, mask, vs2, rs1, vd);
472
}
473
474
void Assembler::VMSEQ(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
475
EmitVectorOPIVI(m_buffer, 0b011000, mask, vs2, simm, vd);
476
}
477
478
void Assembler::VMSGT(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
479
EmitVectorOPIVX(m_buffer, 0b011111, mask, vs2, rs1, vd);
480
}
481
482
void Assembler::VMSGT(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
483
EmitVectorOPIVI(m_buffer, 0b011111, mask, vs2, simm, vd);
484
}
485
486
void Assembler::VMSGTU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
487
EmitVectorOPIVX(m_buffer, 0b011110, mask, vs2, rs1, vd);
488
}
489
490
void Assembler::VMSGTU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
491
EmitVectorOPIVI(m_buffer, 0b011110, mask, vs2, simm, vd);
492
}
493
494
void Assembler::VMSLE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
495
EmitVectorOPIVV(m_buffer, 0b011101, mask, vs2, vs1, vd);
496
}
497
498
void Assembler::VMSLE(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
499
EmitVectorOPIVX(m_buffer, 0b011101, mask, vs2, rs1, vd);
500
}
501
502
void Assembler::VMSLE(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
503
EmitVectorOPIVI(m_buffer, 0b011101, mask, vs2, simm, vd);
504
}
505
506
void Assembler::VMSLEU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
507
EmitVectorOPIVV(m_buffer, 0b011100, mask, vs2, vs1, vd);
508
}
509
510
void Assembler::VMSLEU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
511
EmitVectorOPIVX(m_buffer, 0b011100, mask, vs2, rs1, vd);
512
}
513
514
void Assembler::VMSLEU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
515
EmitVectorOPIVI(m_buffer, 0b011100, mask, vs2, simm, vd);
516
}
517
518
void Assembler::VMSLT(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
519
EmitVectorOPIVV(m_buffer, 0b011011, mask, vs2, vs1, vd);
520
}
521
522
void Assembler::VMSLT(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
523
EmitVectorOPIVX(m_buffer, 0b011011, mask, vs2, rs1, vd);
524
}
525
526
void Assembler::VMSLTU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
527
EmitVectorOPIVV(m_buffer, 0b011010, mask, vs2, vs1, vd);
528
}
529
530
void Assembler::VMSLTU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
531
EmitVectorOPIVX(m_buffer, 0b011010, mask, vs2, rs1, vd);
532
}
533
534
void Assembler::VMSNE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
535
EmitVectorOPIVV(m_buffer, 0b011001, mask, vs2, vs1, vd);
536
}
537
538
void Assembler::VMSNE(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
539
EmitVectorOPIVX(m_buffer, 0b011001, mask, vs2, rs1, vd);
540
}
541
542
void Assembler::VMSNE(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
543
EmitVectorOPIVI(m_buffer, 0b011001, mask, vs2, simm, vd);
544
}
545
546
void Assembler::VMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
547
EmitVectorOPMVV(m_buffer, 0b100101, mask, vs2, vs1, vd);
548
}
549
550
void Assembler::VMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
551
EmitVectorOPMVX(m_buffer, 0b100101, mask, vs2, rs1, vd);
552
}
553
554
void Assembler::VMULH(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
555
EmitVectorOPMVV(m_buffer, 0b100111, mask, vs2, vs1, vd);
556
}
557
558
void Assembler::VMULH(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
559
EmitVectorOPMVX(m_buffer, 0b100111, mask, vs2, rs1, vd);
560
}
561
562
void Assembler::VMULHSU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
563
EmitVectorOPMVV(m_buffer, 0b100110, mask, vs2, vs1, vd);
564
}
565
566
void Assembler::VMULHSU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
567
EmitVectorOPMVX(m_buffer, 0b100110, mask, vs2, rs1, vd);
568
}
569
570
void Assembler::VMULHU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
571
EmitVectorOPMVV(m_buffer, 0b100100, mask, vs2, vs1, vd);
572
}
573
574
void Assembler::VMULHU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
575
EmitVectorOPMVX(m_buffer, 0b100100, mask, vs2, rs1, vd);
576
}
577
578
void Assembler::VMV(Vec vd, Vec vs1) noexcept {
579
EmitVectorOPIVV(m_buffer, 0b010111, VecMask::No, v0, vs1, vd);
580
}
581
582
void Assembler::VMV(Vec vd, GPR rs1) noexcept {
583
EmitVectorOPIVX(m_buffer, 0b010111, VecMask::No, v0, rs1, vd);
584
}
585
586
void Assembler::VMV(Vec vd, int32_t simm) noexcept {
587
EmitVectorOPIVI(m_buffer, 0b010111, VecMask::No, v0, simm, vd);
588
}
589
590
void Assembler::VMV1R(Vec vd, Vec vs) noexcept {
591
EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00000, vd);
592
}
593
594
void Assembler::VMV2R(Vec vd, Vec vs) noexcept {
595
// Registers must be aligned to the register group size, per the
596
// RVV spec (as of 1.0RC)
597
BISCUIT_ASSERT(vd.Index() % 2 == 0);
598
BISCUIT_ASSERT(vs.Index() % 2 == 0);
599
600
EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00001, vd);
601
}
602
603
void Assembler::VMV4R(Vec vd, Vec vs) noexcept {
604
// Registers must be aligned to the register group size, per the
605
// RVV spec (as of 1.0RC)
606
BISCUIT_ASSERT(vd.Index() % 4 == 0);
607
BISCUIT_ASSERT(vs.Index() % 4 == 0);
608
609
EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00011, vd);
610
}
611
612
void Assembler::VMV8R(Vec vd, Vec vs) noexcept {
613
// Registers must be aligned to the register group size, per the
614
// RVV spec (as of 1.0RC)
615
BISCUIT_ASSERT(vd.Index() % 8 == 0);
616
BISCUIT_ASSERT(vs.Index() % 8 == 0);
617
618
EmitVectorOPIVI(m_buffer, 0b100111, VecMask::No, vs, 0b00111, vd);
619
}
620
621
void Assembler::VMV_SX(Vec vd, GPR rs) noexcept {
622
EmitVectorOPMVX(m_buffer, 0b010000, VecMask::No, v0, rs, vd);
623
}
624
625
void Assembler::VMV_XS(GPR rd, Vec vs) noexcept {
626
EmitVectorOPMVV(m_buffer, 0b010000, VecMask::No, vs, v0, Vec{rd.Index()});
627
}
628
629
void Assembler::VNCLIP(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
630
EmitVectorOPIVV(m_buffer, 0b101111, mask, vs2, vs1, vd);
631
}
632
633
void Assembler::VNCLIP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
634
EmitVectorOPIVX(m_buffer, 0b101111, mask, vs2, rs1, vd);
635
}
636
637
void Assembler::VNCLIP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
638
EmitVectorOPIVUI(m_buffer, 0b101111, mask, vs2, uimm, vd);
639
}
640
641
void Assembler::VNCLIPU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
642
EmitVectorOPIVV(m_buffer, 0b101110, mask, vs2, vs1, vd);
643
}
644
645
void Assembler::VNCLIPU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
646
EmitVectorOPIVX(m_buffer, 0b101110, mask, vs2, rs1, vd);
647
}
648
649
void Assembler::VNCLIPU(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
650
EmitVectorOPIVUI(m_buffer, 0b101110, mask, vs2, uimm, vd);
651
}
652
653
void Assembler::VNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
654
EmitVectorOPMVV(m_buffer, 0b101111, mask, vs2, vs1, vd);
655
}
656
657
void Assembler::VNMSAC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
658
EmitVectorOPMVX(m_buffer, 0b101111, mask, vs2, rs1, vd);
659
}
660
661
void Assembler::VNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
662
EmitVectorOPMVV(m_buffer, 0b101011, mask, vs2, vs1, vd);
663
}
664
665
void Assembler::VNMSUB(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
666
EmitVectorOPMVX(m_buffer, 0b101011, mask, vs2, rs1, vd);
667
}
668
669
void Assembler::VNSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
670
EmitVectorOPIVV(m_buffer, 0b101101, mask, vs2, vs1, vd);
671
}
672
673
void Assembler::VNSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
674
EmitVectorOPIVX(m_buffer, 0b101101, mask, vs2, rs1, vd);
675
}
676
677
void Assembler::VNSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
678
EmitVectorOPIVUI(m_buffer, 0b101101, mask, vs2, uimm, vd);
679
}
680
681
void Assembler::VNSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
682
EmitVectorOPIVV(m_buffer, 0b101100, mask, vs2, vs1, vd);
683
}
684
685
void Assembler::VNSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
686
EmitVectorOPIVX(m_buffer, 0b101100, mask, vs2, rs1, vd);
687
}
688
689
void Assembler::VNSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
690
EmitVectorOPIVUI(m_buffer, 0b101100, mask, vs2, uimm, vd);
691
}
692
693
void Assembler::VOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
694
EmitVectorOPIVV(m_buffer, 0b001010, mask, vs2, vs1, vd);
695
}
696
697
void Assembler::VOR(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
698
EmitVectorOPIVX(m_buffer, 0b001010, mask, vs2, rs1, vd);
699
}
700
701
void Assembler::VOR(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
702
EmitVectorOPIVI(m_buffer, 0b001010, mask, vs2, simm, vd);
703
}
704
705
void Assembler::VPOPC(GPR rd, Vec vs, VecMask mask) noexcept {
706
EmitVectorOPMVV(m_buffer, 0b010000, mask, vs, v16, Vec{rd.Index()});
707
}
708
709
void Assembler::VREDAND(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
710
EmitVectorOPMVV(m_buffer, 0b000001, mask, vs2, vs1, vd);
711
}
712
713
void Assembler::VREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
714
EmitVectorOPMVV(m_buffer, 0b000111, mask, vs2, vs1, vd);
715
}
716
717
void Assembler::VREDMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
718
EmitVectorOPMVV(m_buffer, 0b000110, mask, vs2, vs1, vd);
719
}
720
721
void Assembler::VREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
722
EmitVectorOPMVV(m_buffer, 0b000101, mask, vs2, vs1, vd);
723
}
724
725
void Assembler::VREDMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
726
EmitVectorOPMVV(m_buffer, 0b000100, mask, vs2, vs1, vd);
727
}
728
729
void Assembler::VREDOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
730
EmitVectorOPMVV(m_buffer, 0b000010, mask, vs2, vs1, vd);
731
}
732
733
void Assembler::VREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
734
EmitVectorOPMVV(m_buffer, 0b000000, mask, vs2, vs1, vd);
735
}
736
737
void Assembler::VREDXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
738
EmitVectorOPMVV(m_buffer, 0b000011, mask, vs2, vs1, vd);
739
}
740
741
void Assembler::VREM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
742
EmitVectorOPMVV(m_buffer, 0b100011, mask, vs2, vs1, vd);
743
}
744
745
void Assembler::VREM(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
746
EmitVectorOPMVX(m_buffer, 0b100011, mask, vs2, rs1, vd);
747
}
748
749
void Assembler::VREMU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
750
EmitVectorOPMVV(m_buffer, 0b100010, mask, vs2, vs1, vd);
751
}
752
753
void Assembler::VREMU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
754
EmitVectorOPMVX(m_buffer, 0b100010, mask, vs2, rs1, vd);
755
}
756
757
void Assembler::VRGATHER(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
758
EmitVectorOPIVV(m_buffer, 0b001100, mask, vs2, vs1, vd);
759
}
760
761
void Assembler::VRGATHER(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
762
EmitVectorOPIVX(m_buffer, 0b001100, mask, vs2, rs1, vd);
763
}
764
765
void Assembler::VRGATHER(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
766
EmitVectorOPIVUI(m_buffer, 0b001100, mask, vs2, uimm, vd);
767
}
768
769
void Assembler::VRGATHEREI16(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
770
EmitVectorOPIVV(m_buffer, 0b001110, mask, vs2, vs1, vd);
771
}
772
773
void Assembler::VRSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
774
EmitVectorOPIVX(m_buffer, 0b000011, mask, vs2, rs1, vd);
775
}
776
777
void Assembler::VRSUB(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
778
EmitVectorOPIVI(m_buffer, 0b000011, mask, vs2, simm, vd);
779
}
780
781
void Assembler::VSADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
782
EmitVectorOPIVV(m_buffer, 0b100001, mask, vs2, vs1, vd);
783
}
784
785
void Assembler::VSADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
786
EmitVectorOPIVX(m_buffer, 0b100001, mask, vs2, rs1, vd);
787
}
788
789
void Assembler::VSADD(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
790
EmitVectorOPIVI(m_buffer, 0b100001, mask, vs2, simm, vd);
791
}
792
793
void Assembler::VSADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
794
EmitVectorOPIVV(m_buffer, 0b100000, mask, vs2, vs1, vd);
795
}
796
797
void Assembler::VSADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
798
EmitVectorOPIVX(m_buffer, 0b100000, mask, vs2, rs1, vd);
799
}
800
801
void Assembler::VSADDU(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
802
EmitVectorOPIVI(m_buffer, 0b100000, mask, vs2, simm, vd);
803
}
804
805
void Assembler::VSBC(Vec vd, Vec vs2, Vec vs1) noexcept {
806
EmitVectorOPIVV(m_buffer, 0b010010, VecMask::Yes, vs2, vs1, vd);
807
}
808
809
void Assembler::VSBC(Vec vd, Vec vs2, GPR rs1) noexcept {
810
EmitVectorOPIVX(m_buffer, 0b010010, VecMask::Yes, vs2, rs1, vd);
811
}
812
813
void Assembler::VSEXTVF2(Vec vd, Vec vs, VecMask mask) noexcept {
814
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v7, vd);
815
}
816
817
void Assembler::VSEXTVF4(Vec vd, Vec vs, VecMask mask) noexcept {
818
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v5, vd);
819
}
820
821
void Assembler::VSEXTVF8(Vec vd, Vec vs, VecMask mask) noexcept {
822
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v3, vd);
823
}
824
825
void Assembler::VSLIDE1DOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
826
EmitVectorOPMVX(m_buffer, 0b001111, mask, vs2, rs1, vd);
827
}
828
829
void Assembler::VSLIDEDOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
830
EmitVectorOPIVX(m_buffer, 0b001111, mask, vs2, rs1, vd);
831
}
832
833
void Assembler::VSLIDEDOWN(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
834
EmitVectorOPIVUI(m_buffer, 0b001111, mask, vs2, uimm, vd);
835
}
836
837
void Assembler::VSLIDE1UP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
838
EmitVectorOPMVX(m_buffer, 0b001110, mask, vs2, rs1, vd);
839
}
840
841
void Assembler::VSLIDEUP(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
842
EmitVectorOPIVX(m_buffer, 0b001110, mask, vs2, rs1, vd);
843
}
844
845
void Assembler::VSLIDEUP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
846
EmitVectorOPIVUI(m_buffer, 0b001110, mask, vs2, uimm, vd);
847
}
848
849
void Assembler::VSLL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
850
EmitVectorOPIVV(m_buffer, 0b100101, mask, vs2, vs1, vd);
851
}
852
853
void Assembler::VSLL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
854
EmitVectorOPIVX(m_buffer, 0b100101, mask, vs2, rs1, vd);
855
}
856
857
void Assembler::VSLL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
858
EmitVectorOPIVUI(m_buffer, 0b100101, mask, vs2, uimm, vd);
859
}
860
861
void Assembler::VSMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
862
EmitVectorOPIVV(m_buffer, 0b100111, mask, vs2, vs1, vd);
863
}
864
865
void Assembler::VSMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
866
EmitVectorOPIVX(m_buffer, 0b100111, mask, vs2, rs1, vd);
867
}
868
869
void Assembler::VSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
870
EmitVectorOPIVV(m_buffer, 0b101001, mask, vs2, vs1, vd);
871
}
872
873
void Assembler::VSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
874
EmitVectorOPIVX(m_buffer, 0b101001, mask, vs2, rs1, vd);
875
}
876
877
void Assembler::VSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
878
EmitVectorOPIVUI(m_buffer, 0b101001, mask, vs2, uimm, vd);
879
}
880
881
void Assembler::VSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
882
EmitVectorOPIVV(m_buffer, 0b101000, mask, vs2, vs1, vd);
883
}
884
885
void Assembler::VSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
886
EmitVectorOPIVX(m_buffer, 0b101000, mask, vs2, rs1, vd);
887
}
888
889
void Assembler::VSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
890
EmitVectorOPIVUI(m_buffer, 0b101000, mask, vs2, uimm, vd);
891
}
892
893
void Assembler::VSSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
894
EmitVectorOPIVV(m_buffer, 0b101011, mask, vs2, vs1, vd);
895
}
896
897
void Assembler::VSSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
898
EmitVectorOPIVX(m_buffer, 0b101011, mask, vs2, rs1, vd);
899
}
900
901
void Assembler::VSSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
902
EmitVectorOPIVUI(m_buffer, 0b101011, mask, vs2, uimm, vd);
903
}
904
905
void Assembler::VSSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
906
EmitVectorOPIVV(m_buffer, 0b101010, mask, vs2, vs1, vd);
907
}
908
909
void Assembler::VSSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
910
EmitVectorOPIVX(m_buffer, 0b101010, mask, vs2, rs1, vd);
911
}
912
913
void Assembler::VSSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask) noexcept {
914
EmitVectorOPIVUI(m_buffer, 0b101010, mask, vs2, uimm, vd);
915
}
916
917
void Assembler::VSSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
918
EmitVectorOPIVV(m_buffer, 0b100011, mask, vs2, vs1, vd);
919
}
920
921
void Assembler::VSSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
922
EmitVectorOPIVX(m_buffer, 0b100011, mask, vs2, rs1, vd);
923
}
924
925
void Assembler::VSSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
926
EmitVectorOPIVV(m_buffer, 0b100010, mask, vs2, vs1, vd);
927
}
928
929
void Assembler::VSSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
930
EmitVectorOPIVX(m_buffer, 0b100010, mask, vs2, rs1, vd);
931
}
932
933
void Assembler::VSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
934
EmitVectorOPIVV(m_buffer, 0b000010, mask, vs2, vs1, vd);
935
}
936
937
void Assembler::VSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
938
EmitVectorOPIVX(m_buffer, 0b000010, mask, vs2, rs1, vd);
939
}
940
941
void Assembler::VWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
942
EmitVectorOPMVV(m_buffer, 0b110001, mask, vs2, vs1, vd);
943
}
944
945
void Assembler::VWADD(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
946
EmitVectorOPMVX(m_buffer, 0b110001, mask, vs2, rs1, vd);
947
}
948
949
void Assembler::VWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
950
EmitVectorOPMVV(m_buffer, 0b110101, mask, vs2, vs1, vd);
951
}
952
953
void Assembler::VWADDW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
954
EmitVectorOPMVX(m_buffer, 0b110101, mask, vs2, rs1, vd);
955
}
956
957
void Assembler::VWADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
958
EmitVectorOPMVV(m_buffer, 0b110000, mask, vs2, vs1, vd);
959
}
960
961
void Assembler::VWADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
962
EmitVectorOPMVX(m_buffer, 0b110000, mask, vs2, rs1, vd);
963
}
964
965
void Assembler::VWADDUW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
966
EmitVectorOPMVV(m_buffer, 0b110100, mask, vs2, vs1, vd);
967
}
968
969
void Assembler::VWADDUW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
970
EmitVectorOPMVX(m_buffer, 0b110100, mask, vs2, rs1, vd);
971
}
972
973
void Assembler::VWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
974
EmitVectorOPMVV(m_buffer, 0b111101, mask, vs2, vs1, vd);
975
}
976
977
void Assembler::VWMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
978
EmitVectorOPMVX(m_buffer, 0b111101, mask, vs2, rs1, vd);
979
}
980
981
void Assembler::VWMACCSU(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
982
EmitVectorOPMVV(m_buffer, 0b111111, mask, vs2, vs1, vd);
983
}
984
985
void Assembler::VWMACCSU(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
986
EmitVectorOPMVX(m_buffer, 0b111111, mask, vs2, rs1, vd);
987
}
988
989
void Assembler::VWMACCU(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
990
EmitVectorOPMVV(m_buffer, 0b111100, mask, vs2, vs1, vd);
991
}
992
993
void Assembler::VWMACCU(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
994
EmitVectorOPMVX(m_buffer, 0b111100, mask, vs2, rs1, vd);
995
}
996
997
void Assembler::VWMACCUS(Vec vd, GPR rs1, Vec vs2, VecMask mask) noexcept {
998
EmitVectorOPMVX(m_buffer, 0b111110, mask, vs2, rs1, vd);
999
}
1000
1001
void Assembler::VWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1002
EmitVectorOPMVV(m_buffer, 0b111011, mask, vs2, vs1, vd);
1003
}
1004
1005
void Assembler::VWMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1006
EmitVectorOPMVX(m_buffer, 0b111011, mask, vs2, rs1, vd);
1007
}
1008
1009
void Assembler::VWMULSU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1010
EmitVectorOPMVV(m_buffer, 0b111010, mask, vs2, vs1, vd);
1011
}
1012
1013
void Assembler::VWMULSU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1014
EmitVectorOPMVX(m_buffer, 0b111010, mask, vs2, rs1, vd);
1015
}
1016
1017
void Assembler::VWMULU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1018
EmitVectorOPMVV(m_buffer, 0b111000, mask, vs2, vs1, vd);
1019
}
1020
1021
void Assembler::VWMULU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1022
EmitVectorOPMVX(m_buffer, 0b111000, mask, vs2, rs1, vd);
1023
}
1024
1025
void Assembler::VWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1026
EmitVectorOPIVV(m_buffer, 0b110001, mask, vs2, vs1, vd);
1027
}
1028
1029
void Assembler::VWREDSUMU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1030
EmitVectorOPIVV(m_buffer, 0b110000, mask, vs2, vs1, vd);
1031
}
1032
1033
void Assembler::VWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1034
EmitVectorOPMVV(m_buffer, 0b110011, mask, vs2, vs1, vd);
1035
}
1036
1037
void Assembler::VWSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1038
EmitVectorOPMVX(m_buffer, 0b110011, mask, vs2, rs1, vd);
1039
}
1040
1041
void Assembler::VWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1042
EmitVectorOPMVV(m_buffer, 0b110111, mask, vs2, vs1, vd);
1043
}
1044
1045
void Assembler::VWSUBW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1046
EmitVectorOPMVX(m_buffer, 0b110111, mask, vs2, rs1, vd);
1047
}
1048
1049
void Assembler::VWSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1050
EmitVectorOPMVV(m_buffer, 0b110010, mask, vs2, vs1, vd);
1051
}
1052
1053
void Assembler::VWSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1054
EmitVectorOPMVX(m_buffer, 0b110010, mask, vs2, rs1, vd);
1055
}
1056
1057
void Assembler::VWSUBUW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1058
EmitVectorOPMVV(m_buffer, 0b110110, mask, vs2, vs1, vd);
1059
}
1060
1061
void Assembler::VWSUBUW(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1062
EmitVectorOPMVX(m_buffer, 0b110110, mask, vs2, rs1, vd);
1063
}
1064
1065
void Assembler::VXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1066
EmitVectorOPIVV(m_buffer, 0b001011, mask, vs2, vs1, vd);
1067
}
1068
1069
void Assembler::VXOR(Vec vd, Vec vs2, GPR rs1, VecMask mask) noexcept {
1070
EmitVectorOPIVX(m_buffer, 0b001011, mask, vs2, rs1, vd);
1071
}
1072
1073
void Assembler::VXOR(Vec vd, Vec vs2, int32_t simm, VecMask mask) noexcept {
1074
EmitVectorOPIVI(m_buffer, 0b001011, mask, vs2, simm, vd);
1075
}
1076
1077
void Assembler::VZEXTVF2(Vec vd, Vec vs, VecMask mask) noexcept {
1078
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v6, vd);
1079
}
1080
1081
void Assembler::VZEXTVF4(Vec vd, Vec vs, VecMask mask) noexcept {
1082
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v4, vd);
1083
}
1084
1085
void Assembler::VZEXTVF8(Vec vd, Vec vs, VecMask mask) noexcept {
1086
EmitVectorOPMVV(m_buffer, 0b010010, mask, vs, v2, vd);
1087
}
1088
1089
// Vector Floating-Point Instructions
1090
1091
void Assembler::VFADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1092
EmitVectorOPFVV(m_buffer, 0b000000, mask, vs2, vs1, vd);
1093
}
1094
1095
void Assembler::VFADD(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1096
EmitVectorOPFVF(m_buffer, 0b000000, mask, vs2, rs1, vd);
1097
}
1098
1099
void Assembler::VFCLASS(Vec vd, Vec vs, VecMask mask) noexcept {
1100
EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v16, vd);
1101
}
1102
1103
void Assembler::VFCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {
1104
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v3, vd);
1105
}
1106
1107
void Assembler::VFCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {
1108
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v2, vd);
1109
}
1110
1111
void Assembler::VFCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1112
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v7, vd);
1113
}
1114
1115
void Assembler::VFCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1116
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v6, vd);
1117
}
1118
1119
void Assembler::VFCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1120
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v1, vd);
1121
}
1122
1123
void Assembler::VFCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1124
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v0, vd);
1125
}
1126
1127
void Assembler::VFNCVT_F_F(Vec vd, Vec vs, VecMask mask) noexcept {
1128
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v20, vd);
1129
}
1130
1131
void Assembler::VFNCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {
1132
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v19, vd);
1133
}
1134
1135
void Assembler::VFNCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {
1136
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v18, vd);
1137
}
1138
1139
void Assembler::VFNCVT_ROD_F_F(Vec vd, Vec vs, VecMask mask) noexcept {
1140
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v21, vd);
1141
}
1142
1143
void Assembler::VFNCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1144
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v23, vd);
1145
}
1146
1147
void Assembler::VFNCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1148
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v22, vd);
1149
}
1150
1151
void Assembler::VFNCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1152
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v17, vd);
1153
}
1154
1155
void Assembler::VFNCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1156
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v16, vd);
1157
}
1158
1159
void Assembler::VFWCVT_F_F(Vec vd, Vec vs, VecMask mask) noexcept {
1160
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v12, vd);
1161
}
1162
1163
void Assembler::VFWCVT_F_X(Vec vd, Vec vs, VecMask mask) noexcept {
1164
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v11, vd);
1165
}
1166
1167
void Assembler::VFWCVT_F_XU(Vec vd, Vec vs, VecMask mask) noexcept {
1168
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v10, vd);
1169
}
1170
1171
void Assembler::VFWCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1172
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v15, vd);
1173
}
1174
1175
void Assembler::VFWCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1176
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v14, vd);
1177
}
1178
1179
void Assembler::VFWCVT_X_F(Vec vd, Vec vs, VecMask mask) noexcept {
1180
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v9, vd);
1181
}
1182
1183
void Assembler::VFWCVT_XU_F(Vec vd, Vec vs, VecMask mask) noexcept {
1184
EmitVectorOPFVV(m_buffer, 0b010010, mask, vs, v8, vd);
1185
}
1186
1187
void Assembler::VFDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1188
EmitVectorOPFVV(m_buffer, 0b100000, mask, vs2, vs1, vd);
1189
}
1190
1191
void Assembler::VFDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1192
EmitVectorOPFVF(m_buffer, 0b100000, mask, vs2, rs1, vd);
1193
}
1194
1195
void Assembler::VFRDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1196
EmitVectorOPFVF(m_buffer, 0b100001, mask, vs2, rs1, vd);
1197
}
1198
1199
void Assembler::VFREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1200
EmitVectorOPFVV(m_buffer, 0b000111, mask, vs2, vs1, vd);
1201
}
1202
1203
void Assembler::VFREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1204
EmitVectorOPFVV(m_buffer, 0b000101, mask, vs2, vs1, vd);
1205
}
1206
1207
void Assembler::VFREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1208
EmitVectorOPFVV(m_buffer, 0b000001, mask, vs2, vs1, vd);
1209
}
1210
1211
void Assembler::VFREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1212
EmitVectorOPFVV(m_buffer, 0b000011, mask, vs2, vs1, vd);
1213
}
1214
1215
void Assembler::VFMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1216
EmitVectorOPFVV(m_buffer, 0b101100, mask, vs2, vs1, vd);
1217
}
1218
1219
void Assembler::VFMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1220
EmitVectorOPFVF(m_buffer, 0b101100, mask, vs2, rs1, vd);
1221
}
1222
1223
void Assembler::VFMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1224
EmitVectorOPFVV(m_buffer, 0b101000, mask, vs2, vs1, vd);
1225
}
1226
1227
void Assembler::VFMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1228
EmitVectorOPFVF(m_buffer, 0b101000, mask, vs2, rs1, vd);
1229
}
1230
1231
void Assembler::VFMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1232
EmitVectorOPFVV(m_buffer, 0b000110, mask, vs2, vs1, vd);
1233
}
1234
1235
void Assembler::VFMAX(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1236
EmitVectorOPFVF(m_buffer, 0b000110, mask, vs2, rs1, vd);
1237
}
1238
1239
void Assembler::VFMERGE(Vec vd, Vec vs2, FPR rs1) noexcept {
1240
EmitVectorOPFVF(m_buffer, 0b010111, VecMask::Yes, vs2, rs1, vd);
1241
}
1242
1243
void Assembler::VFMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1244
EmitVectorOPFVV(m_buffer, 0b000100, mask, vs2, vs1, vd);
1245
}
1246
1247
void Assembler::VFMIN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1248
EmitVectorOPFVF(m_buffer, 0b000100, mask, vs2, rs1, vd);
1249
}
1250
1251
void Assembler::VFMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1252
EmitVectorOPFVV(m_buffer, 0b101110, mask, vs2, vs1, vd);
1253
}
1254
1255
void Assembler::VFMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1256
EmitVectorOPFVF(m_buffer, 0b101110, mask, vs2, rs1, vd);
1257
}
1258
1259
void Assembler::VFMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1260
EmitVectorOPFVV(m_buffer, 0b101010, mask, vs2, vs1, vd);
1261
}
1262
1263
void Assembler::VFMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1264
EmitVectorOPFVF(m_buffer, 0b101010, mask, vs2, rs1, vd);
1265
}
1266
1267
void Assembler::VFMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1268
EmitVectorOPFVV(m_buffer, 0b100100, mask, vs2, vs1, vd);
1269
}
1270
1271
void Assembler::VFMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1272
EmitVectorOPFVF(m_buffer, 0b100100, mask, vs2, rs1, vd);
1273
}
1274
1275
void Assembler::VFMV(Vec vd, FPR rs) noexcept {
1276
EmitVectorOPFVF(m_buffer, 0b010111, VecMask::No, v0, rs, vd);
1277
}
1278
1279
void Assembler::VFMV_FS(FPR rd, Vec vs) noexcept {
1280
EmitVectorOPFVV(m_buffer, 0b010000, VecMask::No, vs, v0, Vec{rd.Index()});
1281
}
1282
1283
void Assembler::VFMV_SF(Vec vd, FPR rs) noexcept {
1284
EmitVectorOPFVF(m_buffer, 0b010000, VecMask::No, v0, rs, vd);
1285
}
1286
1287
void Assembler::VFNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1288
EmitVectorOPFVV(m_buffer, 0b101101, mask, vs2, vs1, vd);
1289
}
1290
1291
void Assembler::VFNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1292
EmitVectorOPFVF(m_buffer, 0b101101, mask, vs2, rs1, vd);
1293
}
1294
1295
void Assembler::VFNMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1296
EmitVectorOPFVV(m_buffer, 0b101001, mask, vs2, vs1, vd);
1297
}
1298
1299
void Assembler::VFNMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1300
EmitVectorOPFVF(m_buffer, 0b101001, mask, vs2, rs1, vd);
1301
}
1302
1303
void Assembler::VFNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1304
EmitVectorOPFVV(m_buffer, 0b101111, mask, vs2, vs1, vd);
1305
}
1306
1307
void Assembler::VFNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1308
EmitVectorOPFVF(m_buffer, 0b101111, mask, vs2, rs1, vd);
1309
}
1310
1311
void Assembler::VFNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1312
EmitVectorOPFVV(m_buffer, 0b101011, mask, vs2, vs1, vd);
1313
}
1314
1315
void Assembler::VFNMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1316
EmitVectorOPFVF(m_buffer, 0b101011, mask, vs2, rs1, vd);
1317
}
1318
1319
void Assembler::VFREC7(Vec vd, Vec vs, VecMask mask) noexcept {
1320
EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v5, vd);
1321
}
1322
1323
void Assembler::VFSGNJ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1324
EmitVectorOPFVV(m_buffer, 0b001000, mask, vs2, vs1, vd);
1325
}
1326
1327
void Assembler::VFSGNJ(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1328
EmitVectorOPFVF(m_buffer, 0b001000, mask, vs2, rs1, vd);
1329
}
1330
1331
void Assembler::VFSGNJN(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1332
EmitVectorOPFVV(m_buffer, 0b001001, mask, vs2, vs1, vd);
1333
}
1334
1335
void Assembler::VFSGNJN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1336
EmitVectorOPFVF(m_buffer, 0b001001, mask, vs2, rs1, vd);
1337
}
1338
1339
void Assembler::VFSGNJX(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1340
EmitVectorOPFVV(m_buffer, 0b001010, mask, vs2, vs1, vd);
1341
}
1342
1343
void Assembler::VFSGNJX(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1344
EmitVectorOPFVF(m_buffer, 0b001010, mask, vs2, rs1, vd);
1345
}
1346
1347
void Assembler::VFSQRT(Vec vd, Vec vs, VecMask mask) noexcept {
1348
EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v0, vd);
1349
}
1350
1351
void Assembler::VFRSQRT7(Vec vd, Vec vs, VecMask mask) noexcept {
1352
EmitVectorOPFVV(m_buffer, 0b010011, mask, vs, v4, vd);
1353
}
1354
1355
void Assembler::VFSLIDE1DOWN(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1356
EmitVectorOPFVF(m_buffer, 0b001111, mask, vs2, rs1, vd);
1357
}
1358
1359
void Assembler::VFSLIDE1UP(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1360
EmitVectorOPFVF(m_buffer, 0b001110, mask, vs2, rs1, vd);
1361
}
1362
1363
void Assembler::VFSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1364
EmitVectorOPFVV(m_buffer, 0b000010, mask, vs2, vs1, vd);
1365
}
1366
1367
void Assembler::VFSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1368
EmitVectorOPFVF(m_buffer, 0b000010, mask, vs2, rs1, vd);
1369
}
1370
1371
void Assembler::VFRSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1372
EmitVectorOPFVF(m_buffer, 0b100111, mask, vs2, rs1, vd);
1373
}
1374
1375
void Assembler::VFWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1376
EmitVectorOPFVV(m_buffer, 0b110000, mask, vs2, vs1, vd);
1377
}
1378
1379
void Assembler::VFWADD(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1380
EmitVectorOPFVF(m_buffer, 0b110000, mask, vs2, rs1, vd);
1381
}
1382
1383
void Assembler::VFWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1384
EmitVectorOPFVV(m_buffer, 0b110100, mask, vs2, vs1, vd);
1385
}
1386
1387
void Assembler::VFWADDW(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1388
EmitVectorOPFVF(m_buffer, 0b110100, mask, vs2, rs1, vd);
1389
}
1390
1391
void Assembler::VFWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1392
EmitVectorOPFVV(m_buffer, 0b111100, mask, vs2, vs1, vd);
1393
}
1394
1395
void Assembler::VFWMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1396
EmitVectorOPFVF(m_buffer, 0b111100, mask, vs2, rs1, vd);
1397
}
1398
1399
void Assembler::VFWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1400
EmitVectorOPFVV(m_buffer, 0b111000, mask, vs2, vs1, vd);
1401
}
1402
1403
void Assembler::VFWMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1404
EmitVectorOPFVF(m_buffer, 0b111000, mask, vs2, rs1, vd);
1405
}
1406
1407
void Assembler::VFWNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1408
EmitVectorOPFVV(m_buffer, 0b111101, mask, vs2, vs1, vd);
1409
}
1410
1411
void Assembler::VFWNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1412
EmitVectorOPFVF(m_buffer, 0b111101, mask, vs2, rs1, vd);
1413
}
1414
1415
void Assembler::VFWNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1416
EmitVectorOPFVV(m_buffer, 0b111111, mask, vs2, vs1, vd);
1417
}
1418
1419
void Assembler::VFWNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1420
EmitVectorOPFVF(m_buffer, 0b111111, mask, vs2, rs1, vd);
1421
}
1422
1423
void Assembler::VFWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1424
EmitVectorOPFVV(m_buffer, 0b110001, mask, vs2, vs1, vd);
1425
}
1426
1427
void Assembler::VFWREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1428
EmitVectorOPFVV(m_buffer, 0b110011, mask, vs2, vs1, vd);
1429
}
1430
1431
void Assembler::VFWMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask) noexcept {
1432
EmitVectorOPFVV(m_buffer, 0b111110, mask, vs2, vs1, vd);
1433
}
1434
1435
void Assembler::VFWMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask) noexcept {
1436
EmitVectorOPFVF(m_buffer, 0b111110, mask, vs2, rs1, vd);
1437
}
1438
1439
void Assembler::VFWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1440
EmitVectorOPFVV(m_buffer, 0b110010, mask, vs2, vs1, vd);
1441
}
1442
1443
void Assembler::VFWSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1444
EmitVectorOPFVF(m_buffer, 0b110010, mask, vs2, rs1, vd);
1445
}
1446
1447
void Assembler::VFWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1448
EmitVectorOPFVV(m_buffer, 0b110110, mask, vs2, vs1, vd);
1449
}
1450
1451
void Assembler::VFWSUBW(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1452
EmitVectorOPFVF(m_buffer, 0b110110, mask, vs2, rs1, vd);
1453
}
1454
1455
void Assembler::VMFEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1456
EmitVectorOPFVV(m_buffer, 0b011000, mask, vs2, vs1, vd);
1457
}
1458
1459
void Assembler::VMFEQ(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1460
EmitVectorOPFVF(m_buffer, 0b011000, mask, vs2, rs1, vd);
1461
}
1462
1463
void Assembler::VMFGE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1464
EmitVectorOPFVF(m_buffer, 0b011111, mask, vs2, rs1, vd);
1465
}
1466
1467
void Assembler::VMFGT(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1468
EmitVectorOPFVF(m_buffer, 0b011101, mask, vs2, rs1, vd);
1469
}
1470
1471
void Assembler::VMFLE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1472
EmitVectorOPFVV(m_buffer, 0b011001, mask, vs2, vs1, vd);
1473
}
1474
1475
void Assembler::VMFLE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1476
EmitVectorOPFVF(m_buffer, 0b011001, mask, vs2, rs1, vd);
1477
}
1478
1479
void Assembler::VMFLT(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1480
EmitVectorOPFVV(m_buffer, 0b011011, mask, vs2, vs1, vd);
1481
}
1482
1483
void Assembler::VMFLT(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1484
EmitVectorOPFVF(m_buffer, 0b011011, mask, vs2, rs1, vd);
1485
}
1486
1487
void Assembler::VMFNE(Vec vd, Vec vs2, Vec vs1, VecMask mask) noexcept {
1488
EmitVectorOPFVV(m_buffer, 0b011100, mask, vs2, vs1, vd);
1489
}
1490
1491
void Assembler::VMFNE(Vec vd, Vec vs2, FPR rs1, VecMask mask) noexcept {
1492
EmitVectorOPFVF(m_buffer, 0b011100, mask, vs2, rs1, vd);
1493
}
1494
1495
// Vector Load/Store Instructions
1496
1497
void Assembler::VLE8(Vec vd, GPR rs, VecMask mask) noexcept {
1498
VLSEGE8(1, vd, rs, mask);
1499
}
1500
1501
void Assembler::VLE16(Vec vd, GPR rs, VecMask mask) noexcept {
1502
VLSEGE16(1, vd, rs, mask);
1503
}
1504
1505
void Assembler::VLE32(Vec vd, GPR rs, VecMask mask) noexcept {
1506
VLSEGE32(1, vd, rs, mask);
1507
}
1508
1509
void Assembler::VLE64(Vec vd, GPR rs, VecMask mask) noexcept {
1510
VLSEGE64(1, vd, rs, mask);
1511
}
1512
1513
void Assembler::VLM(Vec vd, GPR rs) noexcept {
1514
EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, VecMask::No,
1515
UnitStrideLoadAddressingMode::MaskLoad, rs, WidthEncoding::E8, vd);
1516
}
1517
1518
void Assembler::VLSE8(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1519
VLSSEGE8(1, vd, rs1, rs2, mask);
1520
}
1521
1522
void Assembler::VLSE16(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1523
VLSSEGE16(1, vd, rs1, rs2, mask);
1524
}
1525
1526
void Assembler::VLSE32(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1527
VLSSEGE32(1, vd, rs1, rs2, mask);
1528
}
1529
1530
void Assembler::VLSE64(Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1531
VLSSEGE64(1, vd, rs1, rs2, mask);
1532
}
1533
1534
void Assembler::VLOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1535
VLOXSEGEI8(1, vd, rs, vs, mask);
1536
}
1537
1538
void Assembler::VLOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1539
VLOXSEGEI16(1, vd, rs, vs, mask);
1540
}
1541
1542
void Assembler::VLOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1543
VLOXSEGEI32(1, vd, rs, vs, mask);
1544
}
1545
1546
void Assembler::VLOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1547
VLOXSEGEI64(1, vd, rs, vs, mask);
1548
}
1549
1550
void Assembler::VLUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1551
VLUXSEGEI8(1, vd, rs, vs, mask);
1552
}
1553
1554
void Assembler::VLUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1555
VLUXSEGEI16(1, vd, rs, vs, mask);
1556
}
1557
1558
void Assembler::VLUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1559
VLUXSEGEI32(1, vd, rs, vs, mask);
1560
}
1561
1562
void Assembler::VLUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1563
VLUXSEGEI64(1, vd, rs, vs, mask);
1564
}
1565
1566
void Assembler::VLE8FF(Vec vd, GPR rs, VecMask mask) noexcept {
1567
EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,
1568
UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E8, vd);
1569
}
1570
1571
void Assembler::VLE16FF(Vec vd, GPR rs, VecMask mask) noexcept {
1572
EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,
1573
UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E16, vd);
1574
}
1575
1576
void Assembler::VLE32FF(Vec vd, GPR rs, VecMask mask) noexcept {
1577
EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,
1578
UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E32, vd);
1579
}
1580
1581
void Assembler::VLE64FF(Vec vd, GPR rs, VecMask mask) noexcept {
1582
EmitVectorLoad(m_buffer, 0b000, false, AddressingMode::UnitStride, mask,
1583
UnitStrideLoadAddressingMode::LoadFaultOnlyFirst, rs, WidthEncoding::E64, vd);
1584
}
1585
1586
void Assembler::VLSEGE8(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {
1587
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1588
UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E8, vd);
1589
}
1590
1591
void Assembler::VLSEGE16(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {
1592
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1593
UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E16, vd);
1594
}
1595
1596
void Assembler::VLSEGE32(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {
1597
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1598
UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E32, vd);
1599
}
1600
1601
void Assembler::VLSEGE64(uint32_t num_segments, Vec vd, GPR rs, VecMask mask) noexcept {
1602
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1603
UnitStrideLoadAddressingMode::Load, rs, WidthEncoding::E64, vd);
1604
}
1605
1606
void Assembler::VLSSEGE8(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1607
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1608
rs2, rs1, WidthEncoding::E8, vd);
1609
}
1610
1611
void Assembler::VLSSEGE16(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1612
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1613
rs2, rs1, WidthEncoding::E16, vd);
1614
}
1615
1616
void Assembler::VLSSEGE32(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1617
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1618
rs2, rs1, WidthEncoding::E32, vd);
1619
}
1620
1621
void Assembler::VLSSEGE64(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask) noexcept {
1622
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1623
rs2, rs1, WidthEncoding::E64, vd);
1624
}
1625
1626
void Assembler::VLOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1627
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1628
vs, rs, WidthEncoding::E8, vd);
1629
}
1630
1631
void Assembler::VLOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1632
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1633
vs, rs, WidthEncoding::E16, vd);
1634
}
1635
1636
void Assembler::VLOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1637
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1638
vs, rs, WidthEncoding::E32, vd);
1639
}
1640
1641
void Assembler::VLOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1642
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1643
vs, rs, WidthEncoding::E64, vd);
1644
}
1645
1646
void Assembler::VLUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1647
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1648
vs, rs, WidthEncoding::E8, vd);
1649
}
1650
1651
void Assembler::VLUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1652
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1653
vs, rs, WidthEncoding::E16, vd);
1654
}
1655
1656
void Assembler::VLUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1657
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1658
vs, rs, WidthEncoding::E32, vd);
1659
}
1660
1661
void Assembler::VLUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1662
EmitVectorLoad(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1663
vs, rs, WidthEncoding::E64, vd);
1664
}
1665
1666
void Assembler::VLRE8(uint32_t num_registers, Vec vd, GPR rs) noexcept {
1667
BISCUIT_ASSERT(vd.Index() % num_registers == 0);
1668
EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E8, vd);
1669
}
1670
1671
void Assembler::VL1RE8(Vec vd, GPR rs) noexcept {
1672
VLRE8(1, vd, rs);
1673
}
1674
1675
void Assembler::VL2RE8(Vec vd, GPR rs) noexcept {
1676
VLRE8(2, vd, rs);
1677
}
1678
1679
void Assembler::VL4RE8(Vec vd, GPR rs) noexcept {
1680
VLRE8(4, vd, rs);
1681
}
1682
1683
void Assembler::VL8RE8(Vec vd, GPR rs) noexcept {
1684
VLRE8(8, vd, rs);
1685
}
1686
1687
void Assembler::VLRE16(uint32_t num_registers, Vec vd, GPR rs) noexcept {
1688
BISCUIT_ASSERT(vd.Index() % num_registers == 0);
1689
EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E16, vd);
1690
}
1691
1692
void Assembler::VL1RE16(Vec vd, GPR rs) noexcept {
1693
VLRE16(1, vd, rs);
1694
}
1695
1696
void Assembler::VL2RE16(Vec vd, GPR rs) noexcept {
1697
VLRE16(2, vd, rs);
1698
}
1699
1700
void Assembler::VL4RE16(Vec vd, GPR rs) noexcept {
1701
VLRE16(4, vd, rs);
1702
}
1703
1704
void Assembler::VL8RE16(Vec vd, GPR rs) noexcept {
1705
VLRE16(8, vd, rs);
1706
}
1707
1708
void Assembler::VLRE32(uint32_t num_registers, Vec vd, GPR rs) noexcept {
1709
BISCUIT_ASSERT(vd.Index() % num_registers == 0);
1710
EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E32, vd);
1711
}
1712
1713
void Assembler::VL1RE32(Vec vd, GPR rs) noexcept {
1714
VLRE32(1, vd, rs);
1715
}
1716
1717
void Assembler::VL2RE32(Vec vd, GPR rs) noexcept {
1718
VLRE32(2, vd, rs);
1719
}
1720
1721
void Assembler::VL4RE32(Vec vd, GPR rs) noexcept {
1722
VLRE32(4, vd, rs);
1723
}
1724
1725
void Assembler::VL8RE32(Vec vd, GPR rs) noexcept {
1726
VLRE32(8, vd, rs);
1727
}
1728
1729
void Assembler::VLRE64(uint32_t num_registers, Vec vd, GPR rs) noexcept {
1730
BISCUIT_ASSERT(vd.Index() % num_registers == 0);
1731
EmitVectorLoadWholeReg(m_buffer, num_registers, false, rs, WidthEncoding::E64, vd);
1732
}
1733
1734
void Assembler::VL1RE64(Vec vd, GPR rs) noexcept {
1735
VLRE64(1, vd, rs);
1736
}
1737
1738
void Assembler::VL2RE64(Vec vd, GPR rs) noexcept {
1739
VLRE64(2, vd, rs);
1740
}
1741
1742
void Assembler::VL4RE64(Vec vd, GPR rs) noexcept {
1743
VLRE64(4, vd, rs);
1744
}
1745
1746
void Assembler::VL8RE64(Vec vd, GPR rs) noexcept {
1747
VLRE64(8, vd, rs);
1748
}
1749
1750
void Assembler::VSE8(Vec vs, GPR rs, VecMask mask) noexcept {
1751
VSSEGE8(1, vs, rs, mask);
1752
}
1753
1754
void Assembler::VSE16(Vec vs, GPR rs, VecMask mask) noexcept {
1755
VSSEGE16(1, vs, rs, mask);
1756
}
1757
1758
void Assembler::VSE32(Vec vs, GPR rs, VecMask mask) noexcept {
1759
VSSEGE32(1, vs, rs, mask);
1760
}
1761
1762
void Assembler::VSE64(Vec vs, GPR rs, VecMask mask) noexcept {
1763
VSSEGE64(1, vs, rs, mask);
1764
}
1765
1766
void Assembler::VSM(Vec vs, GPR rs) noexcept {
1767
EmitVectorStore(m_buffer, 0b000, false, AddressingMode::UnitStride, VecMask::No,
1768
UnitStrideStoreAddressingMode::MaskStore, rs, WidthEncoding::E8, vs);
1769
}
1770
1771
void Assembler::VSSE8(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1772
VSSSEGE8(1, vs, rs1, rs2, mask);
1773
}
1774
1775
void Assembler::VSSE16(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1776
VSSSEGE16(1, vs, rs1, rs2, mask);
1777
}
1778
1779
void Assembler::VSSE32(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1780
VSSSEGE32(1, vs, rs1, rs2, mask);
1781
}
1782
1783
void Assembler::VSSE64(Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1784
VSSSEGE64(1, vs, rs1, rs2, mask);
1785
}
1786
1787
void Assembler::VSOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1788
VSOXSEGEI8(1, vd, rs, vs, mask);
1789
}
1790
1791
void Assembler::VSOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1792
VSOXSEGEI16(1, vd, rs, vs, mask);
1793
}
1794
1795
void Assembler::VSOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1796
VSOXSEGEI32(1, vd, rs, vs, mask);
1797
}
1798
1799
void Assembler::VSOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1800
VSOXSEGEI64(1, vd, rs, vs, mask);
1801
}
1802
1803
void Assembler::VSUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1804
VSUXSEGEI8(1, vd, rs, vs, mask);
1805
}
1806
1807
void Assembler::VSUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1808
VSUXSEGEI16(1, vd, rs, vs, mask);
1809
}
1810
1811
void Assembler::VSUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1812
VSUXSEGEI32(1, vd, rs, vs, mask);
1813
}
1814
1815
void Assembler::VSUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1816
VSUXSEGEI64(1, vd, rs, vs, mask);
1817
}
1818
1819
void Assembler::VSSEGE8(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {
1820
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1821
UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E8, vs);
1822
}
1823
1824
void Assembler::VSSEGE16(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {
1825
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1826
UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E16, vs);
1827
}
1828
1829
void Assembler::VSSEGE32(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {
1830
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1831
UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E32, vs);
1832
}
1833
1834
void Assembler::VSSEGE64(uint32_t num_segments, Vec vs, GPR rs, VecMask mask) noexcept {
1835
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::UnitStride, mask,
1836
UnitStrideStoreAddressingMode::Store, rs, WidthEncoding::E64, vs);
1837
}
1838
1839
void Assembler::VSSSEGE8(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1840
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1841
rs2, rs1, WidthEncoding::E8, vs);
1842
}
1843
1844
void Assembler::VSSSEGE16(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1845
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1846
rs2, rs1, WidthEncoding::E16, vs);
1847
}
1848
1849
void Assembler::VSSSEGE32(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1850
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1851
rs2, rs1, WidthEncoding::E32, vs);
1852
}
1853
1854
void Assembler::VSSSEGE64(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask) noexcept {
1855
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::Strided, mask,
1856
rs2, rs1, WidthEncoding::E64, vs);
1857
}
1858
1859
void Assembler::VSOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1860
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1861
vs, rs, WidthEncoding::E8, vd);
1862
}
1863
1864
void Assembler::VSOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1865
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1866
vs, rs, WidthEncoding::E16, vd);
1867
}
1868
1869
void Assembler::VSOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1870
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1871
vs, rs, WidthEncoding::E32, vd);
1872
}
1873
1874
void Assembler::VSOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1875
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedOrdered, mask,
1876
vs, rs, WidthEncoding::E64, vd);
1877
}
1878
1879
void Assembler::VSUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1880
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1881
vs, rs, WidthEncoding::E8, vd);
1882
}
1883
1884
void Assembler::VSUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1885
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1886
vs, rs, WidthEncoding::E16, vd);
1887
}
1888
1889
void Assembler::VSUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1890
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1891
vs, rs, WidthEncoding::E32, vd);
1892
}
1893
1894
void Assembler::VSUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask) noexcept {
1895
EmitVectorStore(m_buffer, num_segments, false, AddressingMode::IndexedUnordered, mask,
1896
vs, rs, WidthEncoding::E64, vd);
1897
}
1898
1899
void Assembler::VSR(uint32_t num_registers, Vec vs, GPR rs) noexcept {
1900
EmitVectorStoreWholeReg(m_buffer, num_registers, rs, vs);
1901
}
1902
1903
void Assembler::VS1R(Vec vs, GPR rs) noexcept {
1904
VSR(1, vs, rs);
1905
}
1906
1907
void Assembler::VS2R(Vec vs, GPR rs) noexcept {
1908
BISCUIT_ASSERT(vs.Index() % 2 == 0);
1909
VSR(2, vs, rs);
1910
}
1911
1912
void Assembler::VS4R(Vec vs, GPR rs) noexcept {
1913
BISCUIT_ASSERT(vs.Index() % 4 == 0);
1914
VSR(4, vs, rs);
1915
}
1916
1917
void Assembler::VS8R(Vec vs, GPR rs) noexcept {
1918
BISCUIT_ASSERT(vs.Index() % 8 == 0);
1919
VSR(8, vs, rs);
1920
}
1921
1922
void Assembler::VSETIVLI(GPR rd, uint32_t imm, SEW sew, LMUL lmul, VTA vta, VMA vma) noexcept {
1923
// Immediate must be able to fit in 5 bits.
1924
BISCUIT_ASSERT(imm <= 31);
1925
1926
// clang-format off
1927
const auto zimm = static_cast<uint32_t>(lmul) |
1928
(static_cast<uint32_t>(sew) << 3) |
1929
(static_cast<uint32_t>(vta) << 6) |
1930
(static_cast<uint32_t>(vma) << 7);
1931
// clang-format on
1932
1933
m_buffer.Emit32(0xC0007057U | (zimm << 20) | (imm << 15) | (rd.Index() << 7));
1934
}
1935
1936
void Assembler::VSETVL(GPR rd, GPR rs1, GPR rs2) noexcept {
1937
m_buffer.Emit32(0x80007057U | (rs2.Index() << 20) | (rs1.Index() << 15) | (rd.Index() << 7));
1938
}
1939
1940
void Assembler::VSETVLI(GPR rd, GPR rs, SEW sew, LMUL lmul, VTA vta, VMA vma) noexcept {
1941
// clang-format off
1942
const auto zimm = static_cast<uint32_t>(lmul) |
1943
(static_cast<uint32_t>(sew) << 3) |
1944
(static_cast<uint32_t>(vta) << 6) |
1945
(static_cast<uint32_t>(vma) << 7);
1946
// clang-format on
1947
1948
m_buffer.Emit32(0x00007057U | (zimm << 20) | (rs.Index() << 15) | (rd.Index() << 7));
1949
}
1950
1951
} // namespace biscuit
1952
1953