Line data Source code
1 : #ifdef __PLUMED_HAS_ASMJIT
2 : // This file is part of AsmJit project <https://asmjit.com>
3 : //
4 : // See asmjit.h or LICENSE.md for license and copyright information
5 : // SPDX-License-Identifier: Zlib
6 :
7 : #ifndef ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
8 : #define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
9 :
10 : #include "codeholder.h"
11 : #include "a64instdb.h"
12 : #include "a64operand.h"
13 :
14 : ASMJIT_BEGIN_SUB_NAMESPACE(a64)
15 :
16 : //! \cond INTERNAL
17 : //! \addtogroup asmjit_a64
18 : //! \{
19 :
20 : namespace InstDB {
21 :
22 : // a64::InstDB - Constants Used by Instructions
23 : // ============================================
24 :
25 : // GP register types supported by base instructions.
26 : static constexpr uint32_t kW = 0x1;
27 : static constexpr uint32_t kX = 0x2;
28 : static constexpr uint32_t kWX = 0x3;
29 :
30 : // GP high register IDs supported by the instruction.
31 : static constexpr uint32_t kZR = Gp::kIdZr;
32 : static constexpr uint32_t kSP = Gp::kIdSp;
33 :
34 : // a64::InstDB - RWInfo
35 : // ====================
36 :
37 : enum RWInfoType : uint32_t {
38 : kRWI_R,
39 : kRWI_RW,
40 : kRWI_RX,
41 : kRWI_RRW,
42 : kRWI_RWX,
43 : kRWI_W,
44 : kRWI_WRW,
45 : kRWI_WRX,
46 : kRWI_WRRW,
47 : kRWI_WRRX,
48 : kRWI_WW,
49 : kRWI_X,
50 : kRWI_XRX,
51 : kRWI_XXRRX,
52 :
53 : kRWI_LDn,
54 : kRWI_STn,
55 :
56 : kRWI_SpecialStart = kRWI_LDn
57 : };
58 :
59 : // a64::InstDB - ElementType
60 : // =========================
61 :
62 : enum ElementType : uint8_t {
63 : kET_None = Vec::kElementTypeNone,
64 : kET_B = Vec::kElementTypeB,
65 : kET_H = Vec::kElementTypeH,
66 : kET_S = Vec::kElementTypeS,
67 : kET_D = Vec::kElementTypeD,
68 : kET_2H = Vec::kElementTypeH2,
69 : kET_4B = Vec::kElementTypeB4
70 : };
71 :
72 : // a64::InstDB - GpType
73 : // ====================
74 :
75 : enum GpType : uint8_t {
76 : kGp_W,
77 : kGp_X,
78 : kGp_X_SP
79 : };
80 :
81 : // a64::InstDB - OPSig
82 : // ===================
83 :
84 : enum kOpSignature : uint32_t {
85 : kOp_GpW = GpW::kSignature,
86 : kOp_GpX = GpX::kSignature,
87 :
88 : kOp_B = VecB::kSignature,
89 : kOp_H = VecH::kSignature,
90 : kOp_S = VecS::kSignature,
91 : kOp_D = VecD::kSignature,
92 : kOp_Q = VecV::kSignature,
93 :
94 : kOp_V8B = VecD::kSignature | Vec::kSignatureElementB,
95 : kOp_V4H = VecD::kSignature | Vec::kSignatureElementH,
96 : kOp_V2S = VecD::kSignature | Vec::kSignatureElementS,
97 :
98 : kOp_V16B = VecV::kSignature | Vec::kSignatureElementB,
99 : kOp_V8H = VecV::kSignature | Vec::kSignatureElementH,
100 : kOp_V4S = VecV::kSignature | Vec::kSignatureElementS,
101 : kOp_V2D = VecV::kSignature | Vec::kSignatureElementD
102 : };
103 :
104 : // a64::InstDB - HFConv
105 : // ====================
106 :
107 : enum kHFConv : uint32_t {
108 : //! FP16 version of the instruction is not available.
109 : kHF_N,
110 :
111 : //! Doesn't do any change to the opcode.
112 : kHF_0,
113 :
114 : kHF_A,
115 : kHF_B,
116 : kHF_C,
117 : kHF_D,
118 :
119 : kHF_Count
120 : };
121 :
122 : // a64::InstDB - VOType
123 : // ====================
124 :
125 : //! Vector operand type combinations used by FP&SIMD instructions.
126 : enum VOType : uint32_t {
127 : kVO_V_B,
128 : kVO_V_BH,
129 : kVO_V_BH_4S,
130 : kVO_V_BHS,
131 : kVO_V_BHS_D2,
132 : kVO_V_HS,
133 : kVO_V_S,
134 :
135 : kVO_V_B8H4,
136 : kVO_V_B8H4S2,
137 : kVO_V_B8D1,
138 : kVO_V_H4S2,
139 :
140 : kVO_V_B16,
141 : kVO_V_B16H8,
142 : kVO_V_B16H8S4,
143 : kVO_V_B16D2,
144 : kVO_V_H8S4,
145 : kVO_V_S4,
146 : kVO_V_D2,
147 :
148 : kVO_SV_BHS,
149 : kVO_SV_B8H4S2,
150 : kVO_SV_HS,
151 : kVO_V_Any,
152 : kVO_SV_Any,
153 :
154 : kVO_Count
155 : };
156 :
157 : // a64::InstDB - EncodingId
158 : // ========================
159 :
160 : // ${EncodingId:Begin}
161 : // ------------------- Automatically generated, do not edit -------------------
162 : enum EncodingId : uint32_t {
163 : kEncodingNone = 0,
164 : kEncodingBaseAddSub,
165 : kEncodingBaseAdr,
166 : kEncodingBaseAtDcIcTlbi,
167 : kEncodingBaseAtomicCasp,
168 : kEncodingBaseAtomicOp,
169 : kEncodingBaseAtomicSt,
170 : kEncodingBaseBfc,
171 : kEncodingBaseBfi,
172 : kEncodingBaseBfm,
173 : kEncodingBaseBfx,
174 : kEncodingBaseBranchCmp,
175 : kEncodingBaseBranchReg,
176 : kEncodingBaseBranchRel,
177 : kEncodingBaseBranchTst,
178 : kEncodingBaseCCmp,
179 : kEncodingBaseCInc,
180 : kEncodingBaseCSel,
181 : kEncodingBaseCSet,
182 : kEncodingBaseCmpCmn,
183 : kEncodingBaseExtend,
184 : kEncodingBaseExtract,
185 : kEncodingBaseLdSt,
186 : kEncodingBaseLdpStp,
187 : kEncodingBaseLdxp,
188 : kEncodingBaseLogical,
189 : kEncodingBaseMov,
190 : kEncodingBaseMovKNZ,
191 : kEncodingBaseMrs,
192 : kEncodingBaseMsr,
193 : kEncodingBaseMvnNeg,
194 : kEncodingBaseOp,
195 : kEncodingBaseOpImm,
196 : kEncodingBaseR,
197 : kEncodingBaseRM_NoImm,
198 : kEncodingBaseRM_SImm10,
199 : kEncodingBaseRM_SImm9,
200 : kEncodingBaseRR,
201 : kEncodingBaseRRII,
202 : kEncodingBaseRRR,
203 : kEncodingBaseRRRR,
204 : kEncodingBaseRev,
205 : kEncodingBaseShift,
206 : kEncodingBaseStx,
207 : kEncodingBaseStxp,
208 : kEncodingBaseSys,
209 : kEncodingBaseTst,
210 : kEncodingFSimdPair,
211 : kEncodingFSimdSV,
212 : kEncodingFSimdVV,
213 : kEncodingFSimdVVV,
214 : kEncodingFSimdVVVV,
215 : kEncodingFSimdVVVe,
216 : kEncodingISimdPair,
217 : kEncodingISimdSV,
218 : kEncodingISimdVV,
219 : kEncodingISimdVVV,
220 : kEncodingISimdVVVI,
221 : kEncodingISimdVVVV,
222 : kEncodingISimdVVVVx,
223 : kEncodingISimdVVVe,
224 : kEncodingISimdVVVx,
225 : kEncodingISimdVVx,
226 : kEncodingISimdWWV,
227 : kEncodingSimdBicOrr,
228 : kEncodingSimdCmp,
229 : kEncodingSimdDot,
230 : kEncodingSimdDup,
231 : kEncodingSimdFcadd,
232 : kEncodingSimdFccmpFccmpe,
233 : kEncodingSimdFcm,
234 : kEncodingSimdFcmla,
235 : kEncodingSimdFcmpFcmpe,
236 : kEncodingSimdFcsel,
237 : kEncodingSimdFcvt,
238 : kEncodingSimdFcvtLN,
239 : kEncodingSimdFcvtSV,
240 : kEncodingSimdFmlal,
241 : kEncodingSimdFmov,
242 : kEncodingSimdIns,
243 : kEncodingSimdLdNStN,
244 : kEncodingSimdLdSt,
245 : kEncodingSimdLdpStp,
246 : kEncodingSimdLdurStur,
247 : kEncodingSimdMov,
248 : kEncodingSimdMoviMvni,
249 : kEncodingSimdShift,
250 : kEncodingSimdShiftES,
251 : kEncodingSimdSm3tt,
252 : kEncodingSimdSmovUmov,
253 : kEncodingSimdSxtlUxtl,
254 : kEncodingSimdTblTbx
255 : };
256 : // ----------------------------------------------------------------------------
257 : // ${EncodingId:End}
258 :
259 : // a64::InstDB::EncodingData
260 : // =========================
261 :
262 : namespace EncodingData {
263 :
264 : #define M_OPCODE(field, bits) \
265 : uint32_t _##field : bits; \
266 : inline constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); }
267 :
268 : struct BaseOp {
269 : uint32_t opcode;
270 : };
271 :
272 : struct BaseOpImm {
273 : uint32_t opcode;
274 : uint16_t immBits;
275 : uint16_t immOffset;
276 : };
277 :
278 : struct BaseR {
279 : uint32_t opcode;
280 : uint32_t rType : 8;
281 : uint32_t rHiId : 8;
282 : uint32_t rShift : 8;
283 : };
284 :
285 : struct BaseRR {
286 : uint32_t opcode;
287 : uint32_t aType : 2;
288 : uint32_t aHiId : 6;
289 : uint32_t aShift : 5;
290 : uint32_t bType : 2;
291 : uint32_t bHiId : 6;
292 : uint32_t bShift : 5;
293 : uint32_t uniform : 1;
294 : };
295 :
296 : struct BaseRRR {
297 0 : M_OPCODE(opcode, 22)
298 : uint32_t aType : 2;
299 : uint32_t aHiId : 6;
300 : uint32_t bType : 2;
301 : uint32_t bHiId : 6;
302 : uint32_t cType : 2;
303 : uint32_t cHiId : 6;
304 : uint32_t uniform : 1;
305 : };
306 :
307 : struct BaseRRRR {
308 0 : M_OPCODE(opcode, 22)
309 : uint32_t aType : 2;
310 : uint32_t aHiId : 6;
311 : uint32_t bType : 2;
312 : uint32_t bHiId : 6;
313 : uint32_t cType : 2;
314 : uint32_t cHiId : 6;
315 : uint32_t dType : 2;
316 : uint32_t dHiId : 6;
317 : uint32_t uniform : 1;
318 : };
319 :
320 : struct BaseRRII {
321 0 : M_OPCODE(opcode, 22)
322 : uint32_t aType : 2;
323 : uint32_t aHiId : 6;
324 : uint32_t bType : 2;
325 : uint32_t bHiId : 6;
326 : uint32_t aImmSize : 6;
327 : uint32_t aImmDiscardLsb : 5;
328 : uint32_t aImmOffset : 5;
329 : uint32_t bImmSize : 6;
330 : uint32_t bImmDiscardLsb : 5;
331 : uint32_t bImmOffset : 5;
332 : };
333 :
334 : struct BaseAtDcIcTlbi {
335 : uint32_t immVerifyMask : 14;
336 : uint32_t immVerifyData : 14;
337 : uint32_t mandatoryReg : 1;
338 : };
339 :
340 : struct BaseAdcSbc {
341 : uint32_t opcode;
342 : };
343 :
344 : struct BaseAddSub {
345 : uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
346 : uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|Rd|
347 : uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|Rd|
348 : };
349 :
350 : struct BaseAdr {
351 0 : M_OPCODE(opcode, 22)
352 : OffsetType offsetType : 8;
353 : };
354 :
355 : struct BaseBfm {
356 : uint32_t opcode; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
357 : };
358 :
359 : struct BaseCmpCmn {
360 : uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
361 : uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|11111|
362 : uint32_t immediateOp: 10; // sf|.......|Sh| Imm:12 |Rn|11111|
363 : };
364 :
365 : struct BaseExtend {
366 0 : M_OPCODE(opcode, 22) // sf|........|N|......|......|Rn|Rd|
367 : uint32_t rType : 2;
368 : uint32_t u : 1;
369 : };
370 :
371 : struct BaseLogical {
372 : uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|Rd|
373 : uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
374 : uint32_t negateImm : 1 ; // True if this is an operation that must negate IMM.
375 : };
376 :
377 : struct BaseMvnNeg {
378 : uint32_t opcode;
379 : };
380 :
381 : struct BaseShift {
382 0 : M_OPCODE(registerOp, 22)
383 0 : M_OPCODE(immediateOp, 22)
384 : uint32_t ror : 2;
385 : };
386 :
387 : struct BaseTst {
388 : uint32_t shiftedOp : 10; // sf|.......|Sh|.|Rm| Imm:6 |Rn|11111|
389 : uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|11111|
390 : };
391 :
392 : struct BaseRM_NoImm {
393 0 : M_OPCODE(opcode, 22)
394 : uint32_t rType : 2;
395 : uint32_t rHiId : 6;
396 : uint32_t xOffset : 5;
397 : };
398 :
399 : struct BaseRM_SImm9 {
400 0 : M_OPCODE(offsetOp, 22)
401 0 : M_OPCODE(prePostOp, 22)
402 : uint32_t rType : 2;
403 : uint32_t rHiId : 6;
404 : uint32_t xOffset : 5;
405 : uint32_t immShift : 4;
406 : };
407 :
408 : struct BaseRM_SImm10 {
409 0 : M_OPCODE(opcode, 22)
410 : uint32_t rType : 2;
411 : uint32_t rHiId : 6;
412 : uint32_t xOffset : 5;
413 : uint32_t immShift : 4;
414 : };
415 :
416 : struct BaseLdSt {
417 : uint32_t uOffsetOp : 10;
418 : uint32_t prePostOp : 11;
419 : uint32_t registerOp : 11;
420 : uint32_t literalOp : 8;
421 : uint32_t rType : 2;
422 : uint32_t xOffset : 5;
423 : uint32_t uOffsetShift : 3;
424 : uint32_t uAltInstId : 14;
425 : };
426 :
427 : struct BaseLdpStp {
428 : uint32_t offsetOp : 10;
429 : uint32_t prePostOp : 10;
430 : uint32_t rType : 2;
431 : uint32_t xOffset : 5;
432 : uint32_t offsetShift : 3;
433 : };
434 :
435 : struct BaseStx {
436 0 : M_OPCODE(opcode, 22)
437 : uint32_t rType : 2;
438 : uint32_t xOffset : 5;
439 : };
440 :
441 : struct BaseLdxp {
442 0 : M_OPCODE(opcode, 22)
443 : uint32_t rType : 2;
444 : uint32_t xOffset : 5;
445 : };
446 :
447 : struct BaseStxp {
448 0 : M_OPCODE(opcode, 22)
449 : uint32_t rType : 2;
450 : uint32_t xOffset : 5;
451 : };
452 :
453 : struct BaseAtomicOp {
454 0 : M_OPCODE(opcode, 22)
455 : uint32_t rType : 2;
456 : uint32_t xOffset : 5;
457 : uint32_t zr : 1;
458 : };
459 :
460 : struct BaseAtomicSt {
461 0 : M_OPCODE(opcode, 22)
462 : uint32_t rType : 2;
463 : uint32_t xOffset : 5;
464 : };
465 :
466 : struct BaseAtomicCasp {
467 0 : M_OPCODE(opcode, 22)
468 : uint32_t rType : 2;
469 : uint32_t xOffset : 5;
470 : };
471 :
472 : typedef BaseOp BaseBranchReg;
473 : typedef BaseOp BaseBranchRel;
474 : typedef BaseOp BaseBranchCmp;
475 : typedef BaseOp BaseBranchTst;
476 : typedef BaseOp BaseExtract;
477 : typedef BaseOp BaseBfc;
478 : typedef BaseOp BaseBfi;
479 : typedef BaseOp BaseBfx;
480 : typedef BaseOp BaseCCmp;
481 : typedef BaseOp BaseCInc;
482 : typedef BaseOp BaseCSet;
483 : typedef BaseOp BaseCSel;
484 : typedef BaseOp BaseMovKNZ;
485 : typedef BaseOp BaseMull;
486 :
487 : struct FSimdGeneric {
488 : uint32_t _scalarOp : 28;
489 : uint32_t _scalarHf : 4;
490 : uint32_t _vectorOp : 28;
491 : uint32_t _vectorHf : 4;
492 :
493 0 : constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
494 0 : constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
495 0 : constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); }
496 0 : constexpr uint32_t vectorHf() const noexcept { return uint32_t(_vectorHf); }
497 : };
498 :
499 : typedef FSimdGeneric FSimdVV;
500 : typedef FSimdGeneric FSimdVVV;
501 : typedef FSimdGeneric FSimdVVVV;
502 :
503 : struct FSimdSV {
504 : uint32_t opcode;
505 : };
506 :
507 : struct FSimdVVVe {
508 : uint32_t _scalarOp : 28;
509 : uint32_t _scalarHf : 4;
510 : uint32_t _vectorOp;
511 : uint32_t _elementOp;
512 :
513 0 : constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
514 0 : constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); };
515 0 : constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
516 : constexpr uint32_t vectorHf() const noexcept { return kHF_C; }
517 0 : constexpr uint32_t elementScalarOp() const noexcept { return (uint32_t(_elementOp) << 10) | (0x5u << 28); }
518 0 : constexpr uint32_t elementVectorOp() const noexcept { return (uint32_t(_elementOp) << 10); }
519 : };
520 :
521 : struct SimdFcadd {
522 : uint32_t _opcode;
523 :
524 0 : constexpr uint32_t opcode() const noexcept { return _opcode << 10; }
525 : };
526 :
527 : struct SimdFcmla {
528 : uint32_t _regularOp;
529 : uint32_t _elementOp;
530 :
531 0 : constexpr uint32_t regularOp() const noexcept { return uint32_t(_regularOp) << 10; }
532 0 : constexpr uint32_t elementOp() const noexcept { return (uint32_t(_elementOp) << 10); }
533 : };
534 :
535 : struct SimdFccmpFccmpe {
536 : uint32_t _opcode;
537 0 : constexpr uint32_t opcode() const noexcept { return _opcode; }
538 : };
539 :
540 : struct SimdFcm {
541 : uint32_t _registerOp : 28;
542 : uint32_t _registerHf : 4;
543 :
544 : uint32_t _zeroOp : 28;
545 :
546 0 : constexpr bool hasRegisterOp() const noexcept { return _registerOp != 0; }
547 0 : constexpr bool hasZeroOp() const noexcept { return _zeroOp != 0; }
548 :
549 0 : constexpr uint32_t registerScalarOp() const noexcept { return (uint32_t(_registerOp) << 10) | (0x5u << 28); }
550 0 : constexpr uint32_t registerVectorOp() const noexcept { return uint32_t(_registerOp) << 10; }
551 : constexpr uint32_t registerScalarHf() const noexcept { return uint32_t(_registerHf); }
552 0 : constexpr uint32_t registerVectorHf() const noexcept { return uint32_t(_registerHf); }
553 :
554 0 : constexpr uint32_t zeroScalarOp() const noexcept { return (uint32_t(_zeroOp) << 10) | (0x5u << 28); }
555 0 : constexpr uint32_t zeroVectorOp() const noexcept { return (uint32_t(_zeroOp) << 10); }
556 : };
557 :
558 : struct SimdFcmpFcmpe {
559 : uint32_t _opcode;
560 0 : constexpr uint32_t opcode() const noexcept { return _opcode; }
561 : };
562 :
563 : struct SimdFcvtLN {
564 : uint32_t _opcode : 22;
565 : uint32_t _isCvtxn : 1;
566 : uint32_t _hasScalar : 1;
567 :
568 0 : constexpr uint32_t scalarOp() const noexcept { return (uint32_t(_opcode) << 10) | (0x5u << 28); }
569 0 : constexpr uint32_t vectorOp() const noexcept { return (uint32_t(_opcode) << 10); }
570 :
571 0 : constexpr uint32_t isCvtxn() const noexcept { return _isCvtxn; }
572 0 : constexpr uint32_t hasScalar() const noexcept { return _hasScalar; }
573 : };
574 :
575 : struct SimdFcvtSV {
576 : uint32_t _vectorIntOp;
577 : uint32_t _vectorFpOp;
578 : uint32_t _generalOp : 31;
579 : uint32_t _isFloatToInt : 1;
580 :
581 0 : constexpr uint32_t scalarIntOp() const noexcept { return (uint32_t(_vectorIntOp) << 10) | (0x5u << 28); }
582 0 : constexpr uint32_t vectorIntOp() const noexcept { return uint32_t(_vectorIntOp) << 10; }
583 0 : constexpr uint32_t scalarFpOp() const noexcept { return (uint32_t(_vectorFpOp) << 10) | (0x5u << 28); }
584 0 : constexpr uint32_t vectorFpOp() const noexcept { return uint32_t(_vectorFpOp) << 10; }
585 0 : constexpr uint32_t generalOp() const noexcept { return (uint32_t(_generalOp) << 10); }
586 :
587 0 : constexpr uint32_t isFloatToInt() const noexcept { return _isFloatToInt; }
588 0 : constexpr uint32_t isFixedPoint() const noexcept { return _vectorFpOp != 0; }
589 : };
590 :
591 : struct SimdFmlal {
592 : uint32_t _vectorOp;
593 : uint32_t _elementOp;
594 : uint8_t _optionalQ;
595 : uint8_t tA;
596 : uint8_t tB;
597 : uint8_t tElement;
598 :
599 0 : constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
600 0 : constexpr uint32_t elementOp() const noexcept { return uint32_t(_elementOp) << 10; }
601 0 : constexpr uint32_t optionalQ() const noexcept { return _optionalQ; }
602 : };
603 :
604 : struct FSimdPair {
605 : uint32_t _scalarOp;
606 : uint32_t _vectorOp;
607 :
608 0 : constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
609 0 : constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
610 : };
611 :
612 : struct ISimdVV {
613 0 : M_OPCODE(opcode, 22)
614 : uint32_t vecOpType : 6;
615 : };
616 :
617 : struct ISimdVVx {
618 0 : M_OPCODE(opcode, 22)
619 : uint32_t op0Signature;
620 : uint32_t op1Signature;
621 : };
622 :
623 : struct ISimdSV {
624 0 : M_OPCODE(opcode, 22)
625 : uint32_t vecOpType : 6;
626 : };
627 :
628 : struct ISimdVVV {
629 0 : M_OPCODE(opcode, 22)
630 : uint32_t vecOpType : 6;
631 : };
632 :
633 : struct ISimdVVVx {
634 0 : M_OPCODE(opcode, 22)
635 : uint32_t op0Signature;
636 : uint32_t op1Signature;
637 : uint32_t op2Signature;
638 : };
639 :
640 : struct ISimdWWV {
641 0 : M_OPCODE(opcode, 22)
642 : uint32_t vecOpType : 6;
643 : };
644 :
645 : struct ISimdVVVe {
646 : uint32_t regularOp : 26; // 22 bits used.
647 : uint32_t regularVecType : 6;
648 : uint32_t elementOp : 26; // 22 bits used.
649 : uint32_t elementVecType : 6;
650 : };
651 :
652 : struct ISimdVVVI {
653 0 : M_OPCODE(opcode, 22)
654 : uint32_t vecOpType : 6;
655 : uint32_t immSize : 4;
656 : uint32_t immShift : 4;
657 : uint32_t imm64HasOneBitLess : 1;
658 : };
659 :
660 : struct ISimdVVVV {
661 : uint32_t opcode : 22;
662 : uint32_t vecOpType : 6;
663 : };
664 :
665 : struct ISimdVVVVx {
666 : uint32_t opcode;
667 : uint32_t op0Signature;
668 : uint32_t op1Signature;
669 : uint32_t op2Signature;
670 : uint32_t op3Signature;
671 : };
672 :
673 : struct SimdBicOrr {
674 : uint32_t registerOp; // 22 bits used.
675 : uint32_t immediateOp; // 22 bits used.
676 : };
677 :
678 : struct SimdCmp {
679 : uint32_t regOp;
680 : uint32_t zeroOp : 22;
681 : uint32_t vecOpType : 6;
682 : };
683 :
684 : struct SimdDot {
685 : uint32_t vectorOp; // 22 bits used.
686 : uint32_t elementOp; // 22 bits used.
687 : uint8_t tA; // Element-type of the first operand.
688 : uint8_t tB; // Element-type of the second and third operands.
689 : uint8_t tElement; // Element-type of the element index[] operand.
690 : };
691 :
692 : struct SimdMoviMvni {
693 : uint32_t opcode : 31;
694 : uint32_t inverted : 1;
695 : };
696 :
697 : struct SimdLdSt {
698 : uint32_t uOffsetOp : 10;
699 : uint32_t prePostOp : 11;
700 : uint32_t registerOp : 11;
701 : uint32_t literalOp : 8;
702 : uint32_t uAltInstId : 16;
703 : };
704 :
705 : struct SimdLdNStN {
706 : uint32_t singleOp;
707 : uint32_t multipleOp : 22;
708 : uint32_t n : 3;
709 : uint32_t replicate : 1;
710 : };
711 :
712 : struct SimdLdpStp {
713 : uint32_t offsetOp : 10;
714 : uint32_t prePostOp : 10;
715 : };
716 :
717 : struct SimdLdurStur {
718 : uint32_t opcode;
719 : };
720 :
721 : struct ISimdPair {
722 : uint32_t opcode2; // 22 bits used.
723 : uint32_t opcode3 : 26; // 22 bits used.
724 : uint32_t opType3 : 6;
725 : };
726 :
727 : struct SimdShift {
728 : uint32_t registerOp; // 22 bits used.
729 : uint32_t immediateOp : 22; // 22 bits used.
730 : uint32_t invertedImm : 1;
731 : uint32_t vecOpType : 6;
732 : };
733 :
734 : struct SimdShiftES {
735 : uint32_t opcode : 22;
736 : uint32_t vecOpType : 6;
737 : };
738 :
739 : struct SimdSm3tt {
740 : uint32_t opcode;
741 : };
742 :
743 : struct SimdSmovUmov {
744 : uint32_t opcode : 22;
745 : uint32_t vecOpType : 6;
746 : uint32_t isSigned : 1;
747 : };
748 :
749 : struct SimdSxtlUxtl {
750 : uint32_t opcode : 22;
751 : uint32_t vecOpType : 6;
752 : };
753 :
754 : struct SimdTblTbx {
755 : uint32_t opcode;
756 : };
757 :
758 : #undef M_OPCODE
759 :
760 : // ${EncodingDataForward:Begin}
761 : // ------------------- Automatically generated, do not edit -------------------
762 : extern const BaseAddSub baseAddSub[4];
763 : extern const BaseAdr baseAdr[2];
764 : extern const BaseAtDcIcTlbi baseAtDcIcTlbi[4];
765 : extern const BaseAtomicCasp baseAtomicCasp[4];
766 : extern const BaseAtomicOp baseAtomicOp[123];
767 : extern const BaseAtomicSt baseAtomicSt[48];
768 : extern const BaseBfc baseBfc[1];
769 : extern const BaseBfi baseBfi[3];
770 : extern const BaseBfm baseBfm[3];
771 : extern const BaseBfx baseBfx[3];
772 : extern const BaseBranchCmp baseBranchCmp[2];
773 : extern const BaseBranchReg baseBranchReg[3];
774 : extern const BaseBranchRel baseBranchRel[2];
775 : extern const BaseBranchTst baseBranchTst[2];
776 : extern const BaseCCmp baseCCmp[2];
777 : extern const BaseCInc baseCInc[3];
778 : extern const BaseCSel baseCSel[4];
779 : extern const BaseCSet baseCSet[2];
780 : extern const BaseCmpCmn baseCmpCmn[2];
781 : extern const BaseExtend baseExtend[5];
782 : extern const BaseExtract baseExtract[1];
783 : extern const BaseLdSt baseLdSt[9];
784 : extern const BaseLdpStp baseLdpStp[6];
785 : extern const BaseLdxp baseLdxp[2];
786 : extern const BaseLogical baseLogical[8];
787 : extern const BaseMovKNZ baseMovKNZ[3];
788 : extern const BaseMvnNeg baseMvnNeg[3];
789 : extern const BaseOp baseOp[23];
790 : extern const BaseOpImm baseOpImm[14];
791 : extern const BaseR baseR[10];
792 : extern const BaseRM_NoImm baseRM_NoImm[21];
793 : extern const BaseRM_SImm10 baseRM_SImm10[2];
794 : extern const BaseRM_SImm9 baseRM_SImm9[23];
795 : extern const BaseRR baseRR[15];
796 : extern const BaseRRII baseRRII[2];
797 : extern const BaseRRR baseRRR[26];
798 : extern const BaseRRRR baseRRRR[6];
799 : extern const BaseShift baseShift[8];
800 : extern const BaseStx baseStx[3];
801 : extern const BaseStxp baseStxp[2];
802 : extern const BaseTst baseTst[1];
803 : extern const FSimdPair fSimdPair[5];
804 : extern const FSimdSV fSimdSV[4];
805 : extern const FSimdVV fSimdVV[17];
806 : extern const FSimdVVV fSimdVVV[13];
807 : extern const FSimdVVVV fSimdVVVV[4];
808 : extern const FSimdVVVe fSimdVVVe[4];
809 : extern const ISimdPair iSimdPair[1];
810 : extern const ISimdSV iSimdSV[7];
811 : extern const ISimdVV iSimdVV[29];
812 : extern const ISimdVVV iSimdVVV[65];
813 : extern const ISimdVVVI iSimdVVVI[2];
814 : extern const ISimdVVVV iSimdVVVV[2];
815 : extern const ISimdVVVVx iSimdVVVVx[1];
816 : extern const ISimdVVVe iSimdVVVe[25];
817 : extern const ISimdVVVx iSimdVVVx[17];
818 : extern const ISimdVVx iSimdVVx[13];
819 : extern const ISimdWWV iSimdWWV[8];
820 : extern const SimdBicOrr simdBicOrr[2];
821 : extern const SimdCmp simdCmp[7];
822 : extern const SimdDot simdDot[5];
823 : extern const SimdFcadd simdFcadd[1];
824 : extern const SimdFccmpFccmpe simdFccmpFccmpe[2];
825 : extern const SimdFcm simdFcm[5];
826 : extern const SimdFcmla simdFcmla[1];
827 : extern const SimdFcmpFcmpe simdFcmpFcmpe[2];
828 : extern const SimdFcvtLN simdFcvtLN[6];
829 : extern const SimdFcvtSV simdFcvtSV[12];
830 : extern const SimdFmlal simdFmlal[6];
831 : extern const SimdLdNStN simdLdNStN[12];
832 : extern const SimdLdSt simdLdSt[2];
833 : extern const SimdLdpStp simdLdpStp[4];
834 : extern const SimdLdurStur simdLdurStur[2];
835 : extern const SimdMoviMvni simdMoviMvni[2];
836 : extern const SimdShift simdShift[40];
837 : extern const SimdShiftES simdShiftES[2];
838 : extern const SimdSm3tt simdSm3tt[4];
839 : extern const SimdSmovUmov simdSmovUmov[2];
840 : extern const SimdSxtlUxtl simdSxtlUxtl[4];
841 : extern const SimdTblTbx simdTblTbx[2];
842 : // ----------------------------------------------------------------------------
843 : // ${EncodingDataForward:End}
844 :
845 : } // {EncodingData}
846 :
847 : // a64::InstDB - InstNameIndex
848 : // ===========================
849 :
850 : // ${NameLimits:Begin}
851 : // ------------------- Automatically generated, do not edit -------------------
852 : enum : uint32_t { kMaxNameSize = 9 };
853 : // ----------------------------------------------------------------------------
854 : // ${NameLimits:End}
855 :
856 : struct InstNameIndex {
857 : uint16_t start;
858 : uint16_t end;
859 : };
860 :
861 : // a64::InstDB - Tables
862 : // ====================
863 :
864 : #ifndef ASMJIT_NO_TEXT
865 : extern const char _nameData[];
866 : extern const InstNameIndex instNameIndex[26];
867 : #endif // !ASMJIT_NO_TEXT
868 :
869 : } // {InstDB}
870 :
871 : //! \}
872 : //! \endcond
873 :
874 : ASMJIT_END_SUB_NAMESPACE
875 :
876 : #endif // ASMJIT_A64_ARMINSTDB_H_P_INCLUDED
877 :
878 :
879 : #endif // __PLUMED_HAS_ASMJIT
|