diff options
Diffstat (limited to 'opcodes/aarch64-dis.c')
-rw-r--r-- | opcodes/aarch64-dis.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index 6552d0e..2aab630 100644 --- a/opcodes/aarch64-dis.c +++ b/opcodes/aarch64-dis.c @@ -2746,7 +2746,16 @@ do_special_decoding (aarch64_inst *inst) { idx = select_operand_for_sf_field_coding (inst->opcode); value = extract_field (FLD_sf, inst->value, 0); - inst->operands[idx].qualifier = get_greg_qualifier_from_value (value); + if (inst->opcode->iclass == fprcvtfloat2int + || inst->opcode->iclass == fprcvtint2float) + { + if (value == 0) + inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_S; + else + inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_D; + } + else + inst->operands[idx].qualifier = get_greg_qualifier_from_value (value); if (inst->operands[idx].qualifier == AARCH64_OPND_QLF_ERR) return 0; if ((inst->opcode->flags & F_N) @@ -2831,6 +2840,23 @@ do_special_decoding (aarch64_inst *inst) } } + if (inst->opcode->flags & F_LSFE_SZ) + { + value = extract_field (FLD_ldst_size, inst->value, 0); + + if (value > 0x3) + return 0; + + for (int i = 0; + aarch64_operands[inst->operands[i].type].op_class != AARCH64_OPND_CLASS_ADDRESS; + i++) + { + inst->operands[i].qualifier = get_sreg_qualifier_from_value (value); + if (inst->operands[i].qualifier == AARCH64_OPND_QLF_ERR) + return 0; + } + } + if (inst->opcode->flags & F_T) { /* Num of consecutive '0's on the right side of imm5<3:0>. */ |