summaryrefslogtreecommitdiff
path: root/arch/arm64/arch_arm64.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2024-03-04 15:53:28 -0500
committerRusty Wagner <rusty.wagner@gmail.com>2024-03-15 15:12:50 -0400
commit7ba5163f45803debbbc496d2981343a5ffa8a172 (patch)
treec251f4ebc5e58a8cc55382cb7a5afc1222e59d16 /arch/arm64/arch_arm64.cpp
parentf0b152f29e3b0da7224ea18a0dfb9892a87660f6 (diff)
Separate local variable tokens in higher level ILs from stack variable tokens in lower levels, and improve token usage in disassembly
Diffstat (limited to 'arch/arm64/arch_arm64.cpp')
-rw-r--r--arch/arm64/arch_arm64.cpp64
1 files changed, 38 insertions, 26 deletions
diff --git a/arch/arm64/arch_arm64.cpp b/arch/arm64/arch_arm64.cpp
index d0a4c38e..ffa05fe8 100644
--- a/arch/arm64/arch_arm64.cpp
+++ b/arch/arm64/arch_arm64.cpp
@@ -429,7 +429,7 @@ class Arm64Architecture : public Architecture
{
char buf[64] = {0};
snprintf(buf, sizeof(buf), "%#x", (uint32_t)operand->shiftValue);
- result.emplace_back(TextToken, " #");
+ result.emplace_back(OperationToken, " #");
result.emplace_back(IntegerToken, buf, operand->shiftValue);
}
}
@@ -463,18 +463,18 @@ class Arm64Architecture : public Architecture
} f;
f.intValue = (uint32_t)operand->immediate;
snprintf(buf, sizeof(buf), "%.08f", f.floatValue);
- result.emplace_back(TextToken, "#");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(FloatingPointToken, buf);
break;
}
case IMM32:
snprintf(buf, sizeof(buf), "%s%#x", sign, (uint32_t)imm);
- result.emplace_back(TextToken, "#");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(IntegerToken, buf, operand->immediate);
break;
case IMM64:
snprintf(buf, sizeof(buf), "%s%#" PRIx64, sign, imm);
- result.emplace_back(TextToken, "#");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(IntegerToken, buf, operand->immediate);
break;
case LABEL:
@@ -548,9 +548,9 @@ class Arm64Architecture : public Architecture
if (operand->operandClass == REG && operand->laneUsed)
{
snprintf(buf, sizeof(buf), "%u", operand->lane);
- result.emplace_back(TextToken, "[");
+ result.emplace_back(BraceToken, "[");
result.emplace_back(IntegerToken, buf);
- result.emplace_back(TextToken, "]");
+ result.emplace_back(BraceToken, "]");
}
return DISASM_SUCCESS;
@@ -576,8 +576,9 @@ class Arm64Architecture : public Architecture
imm = -imm;
}
const char* startToken = "[";
- const char* endToken = "]";
- result.emplace_back(BeginMemoryOperandToken, startToken);
+ const char* endToken = "";
+ result.emplace_back(BraceToken, startToken);
+ result.emplace_back(BeginMemoryOperandToken, "");
result.emplace_back(RegisterToken, reg0);
result.emplace_back(TextToken, get_register_arrspec(operand->reg[0], operand));
@@ -586,9 +587,10 @@ class Arm64Architecture : public Architecture
case MEM_REG:
break;
case MEM_PRE_IDX:
- endToken = "]!";
+ endToken = "!";
snprintf(immBuff, sizeof(immBuff), "%s%#" PRIx64, sign, (uint64_t)imm);
- result.emplace_back(TextToken, ", #");
+ result.emplace_back(TextToken, ", ");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(IntegerToken, immBuff, operand->immediate);
break;
case MEM_POST_IDX: // [<reg>], <reg|imm>
@@ -596,7 +598,10 @@ class Arm64Architecture : public Architecture
if (operand->reg[1] == REG_NONE)
{
snprintf(paramBuff, sizeof(paramBuff), "%s%#" PRIx64, sign, (uint64_t)imm);
- result.emplace_back(EndMemoryOperandToken, "], #");
+ result.emplace_back(EndMemoryOperandToken, "");
+ result.emplace_back(BraceToken, "]");
+ result.emplace_back(TextToken, ", ");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(IntegerToken, paramBuff, operand->immediate);
}
else
@@ -604,7 +609,9 @@ class Arm64Architecture : public Architecture
reg1 = get_register_name(operand->reg[1]);
if (EMPTY(reg1))
return FAILED_TO_DISASSEMBLE_REGISTER;
- result.emplace_back(EndMemoryOperandToken, "], ");
+ result.emplace_back(EndMemoryOperandToken, "");
+ result.emplace_back(BraceToken, "]");
+ result.emplace_back(TextToken, ", ");
result.emplace_back(RegisterToken, reg1);
result.emplace_back(TextToken, get_register_arrspec(operand->reg[1], operand));
}
@@ -613,7 +620,8 @@ class Arm64Architecture : public Architecture
if (operand->immediate != 0)
{
snprintf(immBuff, sizeof(immBuff), "%s%#" PRIx64, sign, (uint64_t)imm);
- result.emplace_back(TextToken, ", #");
+ result.emplace_back(TextToken, ", ");
+ result.emplace_back(OperationToken, "#");
result.emplace_back(IntegerToken, immBuff, operand->immediate);
if (operand->mul_vl)
@@ -633,7 +641,11 @@ class Arm64Architecture : public Architecture
return NOT_MEMORY_OPERAND;
}
if (endToken != NULL)
- result.emplace_back(EndMemoryOperandToken, endToken);
+ {
+ result.emplace_back(EndMemoryOperandToken, "");
+ result.emplace_back(BraceToken, "]");
+ result.emplace_back(TextToken, endToken);
+ }
return DISASM_SUCCESS;
}
@@ -657,10 +669,10 @@ class Arm64Architecture : public Architecture
if (operand->laneUsed)
{
- result.emplace_back(TextToken, "[");
+ result.emplace_back(BraceToken, "[");
snprintf(index, sizeof(index), "%d", operand->lane);
result.emplace_back(IntegerToken, index, operand->lane);
- result.emplace_back(TextToken, "]");
+ result.emplace_back(BraceToken, "]");
}
return DISASM_SUCCESS;
}
@@ -838,21 +850,21 @@ class Arm64Architecture : public Architecture
break;
case STR_IMM: /* eg: "mul #0xe" */
result.emplace_back(TextToken, instr.operands[i].name);
- result.emplace_back(TextToken, " #");
+ result.emplace_back(OperationToken, " #");
snprintf(buf, sizeof(buf), "0x%" PRIx64, instr.operands[i].immediate);
result.emplace_back(IntegerToken, buf);
tokenizeSuccess = true;
break;
case ACCUM_ARRAY: /* eg: "za[w12, #0x6]" */
result.emplace_back(TextToken, "ZA");
- result.emplace_back(TextToken, "[");
+ result.emplace_back(BraceToken, "[");
snprintf(buf, sizeof(buf), "%s", get_register_name(operand->reg[0]));
result.emplace_back(RegisterToken, buf);
result.emplace_back(OperandSeparatorToken, ", ");
- result.emplace_back(TextToken, " #");
+ result.emplace_back(OperationToken, " #");
snprintf(buf, sizeof(buf), "0x%" PRIx64, operand->immediate);
result.emplace_back(IntegerToken, buf);
- result.emplace_back(TextToken, "]");
+ result.emplace_back(BraceToken, "]");
tokenizeSuccess = true;
break;
case SME_TILE: /* eg: "z0v.b[w12, #0xb]" */
@@ -865,33 +877,33 @@ class Arm64Architecture : public Architecture
result.emplace_back(TextToken, get_arrspec_str_truncated(operand->arrSpec));
if (operand->reg[0] != REG_NONE)
{
- result.emplace_back(TextToken, "[");
+ result.emplace_back(BraceToken, "[");
snprintf(buf, sizeof(buf), "%s", get_register_name(operand->reg[0]));
result.emplace_back(RegisterToken, buf);
if (operand->arrSpec != ARRSPEC_FULL)
{
result.emplace_back(OperandSeparatorToken, ", ");
- result.emplace_back(TextToken, " #");
+ result.emplace_back(OperationToken, " #");
snprintf(buf, sizeof(buf), "0x%" PRIx64, instr.operands[i].immediate);
result.emplace_back(IntegerToken, buf);
}
- result.emplace_back(TextToken, "]");
+ result.emplace_back(BraceToken, "]");
}
tokenizeSuccess = true;
break;
case INDEXED_ELEMENT: /* eg: "p12.d[w15, #0xf]" */
result.emplace_back(RegisterToken, get_register_name(operand->reg[0]));
result.emplace_back(TextToken, get_arrspec_str_truncated(operand->arrSpec));
- result.emplace_back(TextToken, "[");
+ result.emplace_back(BraceToken, "[");
result.emplace_back(RegisterToken, get_register_name(operand->reg[1]));
if (operand->immediate)
{
result.emplace_back(OperandSeparatorToken, ", ");
- result.emplace_back(TextToken, "#");
+ result.emplace_back(OperationToken, "#");
snprintf(buf, sizeof(buf), "0x%" PRIx64, operand->immediate);
result.emplace_back(IntegerToken, buf);
}
- result.emplace_back(TextToken, "]");
+ result.emplace_back(BraceToken, "]");
tokenizeSuccess = true;
break;
default: