20enum class EKittyArmCond : uint8_t
22 EQ, NE, HS, LO, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV,
29enum class EKittyInsnTypeArm32
124 EKittyInsnTypeArm32 type;
130 int rd = -1, rn = -1, rt = -1;
137 EKittyArmCond
cond = EKittyArmCond::None;
213 : type(EKittyInsnTypeArm32::UNKNOWN),
word(0),
address(0), immediate(0), target(0),
224 return word != 0 && type != EKittyInsnTypeArm32::UNKNOWN;
236enum class EKittyInsnTypeArm64
416 EKittyInsnTypeArm64 type = EKittyInsnTypeArm64::UNKNOWN;
424 int rd = -1, rn = -1, rt = -1;
435 EKittyArmCond
cond = EKittyArmCond::None;
476 return word != 0 && type != EKittyInsnTypeArm64::UNKNOWN;
500 uint32_t
bits(uint32_t v,
int hi,
int lo);
509 inline bool bit(uint32_t v,
int pos)
511 return bits(v, pos, pos) != 0;
521 inline uint8_t
ror8(uint8_t value,
unsigned int shift)
524 return static_cast<uint8_t
>((value >> shift) | (value << ((8 - shift) & 7u)));
534 inline uint8_t
rol8(uint8_t value,
unsigned int shift)
537 return static_cast<uint8_t
>((value << shift) | (value >> ((8 - shift) & 7u)));
547 inline uint16_t
ror16(uint16_t value,
unsigned int shift)
550 return static_cast<uint16_t
>((value >> shift) | (value << ((16 - shift) & 15u)));
560 inline uint16_t
rol16(uint16_t value,
unsigned int shift)
563 return static_cast<uint16_t
>((value << shift) | (value >> ((16 - shift) & 15u)));
573 inline uint32_t
ror32(uint32_t value,
unsigned int shift)
576 return (value >> shift) | (value << ((32 - shift) & 31u));
586 inline uint32_t
rol32(uint32_t value,
unsigned int shift)
589 return (value << shift) | (value >> ((32 - shift) & 31u));
599 inline uint64_t
ror64(uint64_t value,
unsigned int shift)
602 return (value >> shift) | (value << ((64 - shift) & 63u));
612 inline uint64_t
rol64(uint64_t value,
unsigned int shift)
615 return (value << shift) | (value >> ((64 - shift) & 63u));
626 return static_cast<uint16_t
>((value >> 8) | (value << 8));
637 return ((value & 0x000000FFu) << 24) |
638 ((value & 0x0000FF00u) << 8) |
639 ((value & 0x00FF0000u) >> 8) |
640 ((value & 0xFF000000u) >> 24);
651 return ((value & 0x00000000000000FFull) << 56) |
652 ((value & 0x000000000000FF00ull) << 40) |
653 ((value & 0x0000000000FF0000ull) << 24) |
654 ((value & 0x00000000FF000000ull) << 8) |
655 ((value & 0x000000FF00000000ull) >> 8) |
656 ((value & 0x0000FF0000000000ull) >> 24) |
657 ((value & 0x00FF000000000000ull) >> 40) |
658 ((value & 0xFF00000000000000ull) >> 56);
671 std::snprintf(Buf,
sizeof(Buf),
"0x%llX",
static_cast<unsigned long long>(v));
723 if (bits <= 0 || bits >= 32)
726 uint32_t m = 1u << (bits - 1);
727 return (int32_t)((val ^ m) - m);
747 std::string reg =
"r";
748 return reg + std::to_string(r);
776 static const char *names[16] =
777 {
"EQ",
"NE",
"CS/HS",
"CC/LO",
"MI",
"PL",
"VS",
"VC",
"HI",
"LS",
"GE",
"LT",
"GT",
"LE",
"AL",
"NV"};
778 return names[cond & 0xF];
865 if (bits <= 0 || bits >= 64)
868 uint64_t m = 1ULL << (bits - 1);
869 return (int64_t)((val ^ m) - m);
900 return std::string(
"X") + std::to_string(reg);
912 return std::string(
"W") + std::to_string(reg);
933 return static_cast<int>(reg);
955 static const char *names[16] =
956 {
"EQ",
"NE",
"HS",
"LO",
"MI",
"PL",
"VS",
"VC",
"HI",
"LS",
"GE",
"LT",
"GT",
"LE",
"AL",
"NV"};
957 uint32_t index = cond & 0xF;
958 return index < 16 ? names[index] :
"";
Namespace containing utility functions for ARM32 instructions.
Definition KittyAsm.hpp:682
EKittyInsnTypeArm32 decodeInsnType(uint32_t instr)
Decodes type of an ARM32 instruction.
int32_t signExtend(uint32_t val, int bits)
Sign-extends a 32-bit unsigned integer to a 32-bit signed integer.
Definition KittyAsm.hpp:717
bool isLoad(EKittyInsnTypeArm32 t)
True when t is one of the load instruction types.
std::string branchCondName(uint32_t cond)
Returns the name of a conditional execution flag.
Definition KittyAsm.hpp:770
constexpr uint32_t kPcBias
Definition KittyAsm.hpp:695
constexpr uint32_t kInstructionStride
Definition KittyAsm.hpp:689
bool isStore(EKittyInsnTypeArm32 t)
True when t is one of the store instruction types.
constexpr int kLinkRegister
Definition KittyAsm.hpp:699
std::string typeToString(EKittyInsnTypeArm32 t)
Converts an EKittyInsnTypeArm32 to a string representation.
constexpr int kNumGPRegisters
Definition KittyAsm.hpp:706
int regIndex(const std::string &name)
Inverse of regName(): maps a decoded register name back to its index.
uint8_t loadStoreWidth(EKittyInsnTypeArm32 t)
Load/Store access width in bytes for an ARM32 instruction type.
std::string regName(unsigned r)
Returns the name of an ARM32 general-purpose register.
Definition KittyAsm.hpp:738
KittyInsnArm32 decodeInsn(uint32_t instr, uint32_t address=0)
Decodes an ARM32 instruction.
Namespace containing utility functions for ARM64 instructions.
Definition KittyAsm.hpp:841
EKittyInsnTypeArm64 decodeInsnType(uint32_t instr)
Decodes type of an ARM64 instruction.
EZeroRegOrStackPointer
What register index 31 means in a given instruction field.
Definition KittyAsm.hpp:886
@ ZeroRegister
register 31 denotes XZR/WZR
Definition KittyAsm.hpp:887
@ StackPointer
register 31 denotes SP
Definition KittyAsm.hpp:888
int resolveRegIndex(unsigned reg, EZeroRegOrStackPointer at31)
Resolves a raw 5-bit encoded register field into a trackable index, without naming it.
Definition KittyAsm.hpp:929
uint8_t loadStoreWidth(EKittyInsnTypeArm64 t)
Load/Store access width in bytes for an AArch64 instruction type.
std::string typeToString(EKittyInsnTypeArm64 t)
Converts an EKittyInsnTypeArm64 to a string representation.
std::string wRegName(unsigned reg, EZeroRegOrStackPointer at31)
Returns the name of an ARM64 general-purpose W-register.
Definition KittyAsm.hpp:906
constexpr int kNumGPRegisters
Definition KittyAsm.hpp:852
KittyInsnArm64 decodeInsn(uint32_t instr, uint64_t address=0)
Decodes an ARM64 instruction.
std::string xRegName(unsigned reg, EZeroRegOrStackPointer at31)
Returns the name of an ARM64 general-purpose X-register.
Definition KittyAsm.hpp:894
constexpr uint32_t kInstructionStride
Definition KittyAsm.hpp:847
std::string branchCondName(uint32_t cond)
Returns the name of a conditional execution flag.
Definition KittyAsm.hpp:953
int64_t signExtend(uint32_t val, int bits)
Sign-extends a 32-bit unsigned integer to a 64-bit signed integer.
Definition KittyAsm.hpp:863
bool isStore(EKittyInsnTypeArm64 t)
True when t is one of the store instruction types.
bool isLoad(EKittyInsnTypeArm64 t)
True when t is one of the load instruction types.
int regIndex(const std::string &name)
Inverse of xRegName()/wRegName(): maps a decoded register name back to its index.
Namespace containing utility functions for asm instructions.
Definition KittyAsm.hpp:491
uint16_t rol16(uint16_t value, unsigned int shift)
Rotates a 16-bit unsigned integer to the left by a specified amount.
Definition KittyAsm.hpp:560
uint8_t rol8(uint8_t value, unsigned int shift)
Rotates an 8-bit unsigned integer to the left by a specified amount.
Definition KittyAsm.hpp:534
uint64_t rol64(uint64_t value, unsigned int shift)
Rotates a 64-bit unsigned integer to the left by a specified amount.
Definition KittyAsm.hpp:612
uint64_t swap64(uint64_t value)
Reverses the byte order of a 64-bit unsigned integer.
Definition KittyAsm.hpp:649
uint32_t ror32(uint32_t value, unsigned int shift)
Rotates a 32-bit unsigned integer to the right by a specified amount.
Definition KittyAsm.hpp:573
uint8_t ror8(uint8_t value, unsigned int shift)
Rotates an 8-bit unsigned integer to the right by a specified amount.
Definition KittyAsm.hpp:521
uint32_t bits(uint32_t v, int hi, int lo)
Extracts a bit value from a 32-bit unsigned integer.
bool bit(uint32_t v, int pos)
Checks if a specific bit is set in a 32-bit unsigned integer.
Definition KittyAsm.hpp:509
uint16_t ror16(uint16_t value, unsigned int shift)
Rotates a 16-bit unsigned integer to the right by a specified amount.
Definition KittyAsm.hpp:547
uint16_t swap16(uint16_t value)
Reverses the byte order of a 16-bit unsigned integer.
Definition KittyAsm.hpp:624
std::string toHexString(uint64_t v)
Formats a value as a "0x"-prefixed, upper-case hex string.
Definition KittyAsm.hpp:668
uint32_t rol32(uint32_t value, unsigned int shift)
Rotates a 32-bit unsigned integer to the left by a specified amount.
Definition KittyAsm.hpp:586
uint64_t ror64(uint64_t value, unsigned int shift)
Rotates a 64-bit unsigned integer to the right by a specified amount.
Definition KittyAsm.hpp:599
uint32_t swap32(uint32_t value)
Reverses the byte order of a 32-bit unsigned integer.
Definition KittyAsm.hpp:635
Struct representing an ARM32 instruction.
Definition KittyAsm.hpp:123
uint32_t address
Where it lives, for PC-relative targets.
Definition KittyAsm.hpp:132
EKittyArmCond cond
Definition KittyAsm.hpp:137
bool isValid() const
Checks if the instruction is valid.
Definition KittyAsm.hpp:222
uint32_t word
The instruction word itself, as decoded.
Definition KittyAsm.hpp:131
bool shiftedOperand
The second operand / offset register is a shifted register.
Definition KittyAsm.hpp:175
bool pcRelative
Rn is PC, so the address is relative to this instruction.
Definition KittyAsm.hpp:210
bool writeback
The instruction updates its base register (Rn) as a side effect.
Definition KittyAsm.hpp:146
int rd
Definition KittyAsm.hpp:130
bool registerOffset
The offset is a register (held in rt), not immediate.
Definition KittyAsm.hpp:162
bool postIndexed
The access happens at [Rn]; immediate is applied afterwards.
Definition KittyAsm.hpp:154
bool subtractsOffset
The register operand is subtracted rather than added.
Definition KittyAsm.hpp:188
std::string ToString() const
Renders the instruction as a single line of ARM32 assembly text.
bool registerForm
The second operand is a register (held in rt), not immediate.
Definition KittyAsm.hpp:199
Struct representing an ARM64 instruction.
Definition KittyAsm.hpp:415
int rd
Definition KittyAsm.hpp:424
uint64_t address
Where it lives, for PC-relative targets.
Definition KittyAsm.hpp:429
EKittyArmCond cond
Definition KittyAsm.hpp:435
bool writeback
The instruction updates its base register (Rn) as a side effect.
Definition KittyAsm.hpp:444
int64_t immediate
Decoded immediate, sign-applied. 0 when there is none.
Definition KittyAsm.hpp:430
int rm
Definition KittyAsm.hpp:427
bool isValid() const
Checks if the instruction is valid.
Definition KittyAsm.hpp:474
uint64_t target
Definition KittyAsm.hpp:432
int64_t bitpos
Bit position for the bitfield/test forms; -1 when n/a.
Definition KittyAsm.hpp:431
uint32_t word
The instruction word itself, as decoded.
Definition KittyAsm.hpp:428
std::string ToString() const
Renders the instruction as a single line of ARM64 assembly text.
bool registerOffset
The offset is a register (held in rm), not immediate.
Definition KittyAsm.hpp:463
bool postIndexed
The access happens at [Rn]; immediate is applied afterwards.
Definition KittyAsm.hpp:452