104 uint8_t opWidth = 64;
117 std::stringstream
ss;
128 std::stringstream
ss;
140 std::stringstream
ss;
153 std::stringstream
ss;
167 std::stringstream
ss;
186 std::stringstream
ss;
209 std::stringstream
ss;
235 std::stringstream
ss;
253 std::stringstream
ss;
268 std::stringstream
ss;
286 std::stringstream
ss;
298 std::stringstream
ss;
312 std::stringstream
ss;
324 std::stringstream
ss;
336 std::stringstream
ss;
351 std::stringstream
ss;
365 std::stringstream
ss;
381 std::stringstream
ss;
395 std::stringstream
ss;
411 std::stringstream
ss;
430 std::stringstream
ss;
444 std::stringstream
ss;
461 std::stringstream
ss;
481 std::stringstream
ss;
494 std::stringstream
ss;
510 std::stringstream
ss;
526 std::stringstream
ss;
542 std::stringstream
ss;
556 std::stringstream
ss;
572 std::stringstream
ss;
589 std::stringstream
ss;
603 std::stringstream
ss;
619 std::stringstream
ss;
633 std::stringstream
ss;
643 std::stringstream
ss;
663 std::stringstream
ss;
678 std::stringstream
ss;
689 }
else if (
mult != 1) {
693 ss << __builtin_ctz(
mult);
703 static const char suffix[9] =
704 {
'\0',
'b',
'h',
'\0',
'w',
'\0',
'\0',
'\0',
'd'};
705 std::stringstream
ss;
721 ss << std::to_string(
imm);
731 std::stringstream
ss;
745 std::stringstream
ss;
761 std::stringstream
ss;
787 std::stringstream
ss;
800 std::stringstream
ss;
814 std::stringstream
ss;
830 std::stringstream
ss;
842 std::stringstream
ss;
854 std::stringstream
ss;
864 std::stringstream
ss;
877 std::stringstream
ss;
887 std::stringstream
ss;
896 std::stringstream
ss;
912 std::stringstream
ss;
927 std::stringstream
ss;
943 std::stringstream
ss;
960 std::stringstream
ss;
974 std::stringstream
ss;
984 const char *rotstr[4] = {
"0",
"90",
"180",
"270"};
994 std::stringstream
ss;
1002 const char* rotstr[4] = {
"0",
"90",
"180",
"270"};
1012 std::stringstream
ss;
1020 ss << (uint64_t)
imm;
1022 const char* rotstr[4] = {
"0",
"90",
"180",
"270"};
1031 std::stringstream
ss;
1045 std::stringstream
ss;
1059 std::stringstream
ss;
1073 std::stringstream
ss;
1088 std::stringstream
ss;
1113 return "VL" + std::to_string(
imm);
1120 return "VL" + std::to_string(1 << ((
imm & 0x7) + 3));
1128 return "#" + std::to_string(
imm);
1135 assert(num_elems > 0);
1140 return 1 << (31 - __builtin_clz((uint32_t) num_elems));
1149 return (num_elems >=
imm) ?
imm : 0;
1158 unsigned int pcount = 1 << ((
imm & 0x7) + 3);
1159 return (num_elems >= pcount) ? pcount : 0;
1163 return num_elems - (num_elems % 4);
1166 return num_elems - (num_elems % 3);
1178 static constexpr uint16_t fpOne16 = 0x3c00;
1179 static constexpr uint16_t fpPointFive16 = 0x3800;
1180 static constexpr uint32_t fpOne32 = 0x3f800000;
1181 static constexpr uint32_t fpPointFive32 = 0x3f000000;
1182 static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
1183 static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
1187 return imm ? fpOne16 : fpPointFive16;
1189 return imm ? fpOne32 : fpPointFive32;
1191 return imm ? fpOne64 : fpPointFive64;
1193 panic(
"Unsupported size");
1200 static constexpr uint16_t fpOne16 = 0x3c00;
1201 static constexpr uint32_t fpOne32 = 0x3f800000;
1202 static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
1206 return imm ? fpOne16 : 0x0;
1208 return imm ? fpOne32 : 0x0;
1210 return imm ? fpOne64 : 0x0;
1212 panic(
"Unsupported size");
1219 static constexpr uint16_t fpTwo16 = 0x4000;
1220 static constexpr uint16_t fpPointFive16 = 0x3800;
1221 static constexpr uint32_t fpTwo32 = 0x40000000;
1222 static constexpr uint32_t fpPointFive32 = 0x3f000000;
1223 static constexpr uint64_t fpTwo64 = 0x4000000000000000;
1224 static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
1228 return imm ? fpTwo16 : fpPointFive16;
1230 return imm ? fpTwo32 : fpPointFive32;
1232 return imm ? fpTwo64 : fpPointFive64;
1234 panic(
"Unsupported size");
1240 unsigned pred_width,
unsigned vl,
unsigned regidx)
1242 uint8_t tail_zero =
bits(
pred, 3, 0);
1243 unsigned elem_cnt = 0;
1248 if ((tail_zero & 0x1) == 0x1) {
1249 elem_cnt = pred_width;
1251 auto auxMask = pred_mask.as<uint8_t>();
1252 for (
unsigned e = 0;
e < elem_cnt;
e++) {
1253 bool pbit = ((
e + regidx * elem_cnt) <
count) ?
true :
false;
1259 }
else if ((tail_zero & 0x2) == 0x2) {
1260 elem_cnt = pred_width / 2;
1262 auto auxMask = pred_mask.as<uint16_t>();
1263 for (
unsigned e = 0;
e < elem_cnt;
e++) {
1264 bool pbit = ((
e + regidx * elem_cnt) <
count) ?
true :
false;
1270 }
else if ((tail_zero & 0x4) == 0x4) {
1271 elem_cnt = pred_width / 4;
1273 auto auxMask = pred_mask.as<uint32_t>();
1274 for (
unsigned e = 0;
e < elem_cnt;
e++) {
1275 bool pbit = ((
e + regidx * elem_cnt) <
count) ?
true :
false;
1281 }
else if ((tail_zero & 0x8) == 0x8) {
1282 elem_cnt = pred_width / 8;
1284 auto auxMask = pred_mask.as<uint64_t>();
1285 for (
unsigned e = 0;
e < elem_cnt;
e++) {
1286 bool pbit = ((
e + regidx * elem_cnt) <
count) ?
true :
false;
1298 uint16_t
count = count_in;
1299 uint16_t invert = invert_in;
1301 if (count_in == 0) {
1307 }
else if (
count == elements) {
1311 uint16_t
inv = invert ? 0x1 : 0x0;
1316 }
else if (esize == 2) {
1318 }
else if (esize == 4) {
1320 }
else if (esize == 8) {
void printMnemonic(std::ostream &os, const std::string &suffix="", bool withPred=true, bool withCond64=false, ConditionCode cond64=COND_UC) const
void printVecPredReg(std::ostream &os, RegIndex reg_idx, bool is_png=false) const
void printVecReg(std::ostream &os, RegIndex reg_idx, bool isSveVecReg=false) const
void printIntReg(std::ostream &os, RegIndex reg_idx, uint8_t opWidth=0) const
Print a register name for disassembly given the unique dependence tag number (FP or int).
void printFloatReg(std::ostream &os, RegIndex reg_idx) const
SveAdrOffsetFormat offsetFormat
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
@ SveAdrOffsetUnpackedUnsigned
@ SveAdrOffsetUnpackedSigned
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
const char * mnemonic
Base mnemonic (e.g., "add").
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
#define panic(...)
This implements a cprintf based panic() function.
void sveCounterToPredicate(VecPredRegContainer &pred_mask, uint16_t pred, unsigned pred_width, unsigned vl, unsigned regidx)
Decocde predicate-as-counter to predicate-as-mask.
uint64_t sveExpandFpImmAddSub(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.5 or 1.0 (FADD, FSUB, FSUBR).
unsigned int sveDecodePredCount(uint8_t imm, unsigned int num_elems)
Returns the actual number of elements active for PTRUE(S) instructions.
const char * svePredTypeToStr(SvePredType pt)
Returns the specifier for the predication type pt as a string.
uint16_t sveEncodePredCount(int esize, int elements, int count_in, bool invert_in)
Encode predicate-as-mark to predicate-as-counter.
std::string sveDisasmPredCountImm(uint8_t imm)
Returns the symbolic name associated with pattern imm for PTRUE(S) instructions.
VecPredReg::Container VecPredRegContainer
uint64_t sveExpandFpImmMul(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.5 or 2.0 (FMUL).
uint64_t sveExpandFpImmMaxMin(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.0 or 1.0 (FMAX, FMAXNM, FMIN, FMINNM).
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void ccprintf(cp::Print &print)