diff options
Diffstat (limited to 'opcodes/aarch64-dis.c')
-rw-r--r-- | opcodes/aarch64-dis.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index 6552d0e..75ff871 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>. */ @@ -3577,6 +3603,14 @@ aarch64_decode_variant_using_iclass (aarch64_inst *inst) variant = extract_field (FLD_SVE_sz2, inst->value, 0); break; + case sve_size_sd3: + variant = extract_field (FLD_SVE_sz3, inst->value, 0); + break; + + case sve_size_sd4: + variant = extract_field (FLD_SVE_sz4, inst->value, 0); + break; + case sve_size_hsd2: i = extract_field (FLD_SVE_size, inst->value, 0); if (i < 1) @@ -3584,6 +3618,13 @@ aarch64_decode_variant_using_iclass (aarch64_inst *inst) variant = i - 1; break; + case sve_size_hsd3: + i = extract_field (FLD_len, inst->value, 0); + if (i < 1) + return false; + variant = i - 1; + break; + case sve_size_13: /* Ignore low bit of this field since that is set in the opcode for instructions of this iclass. */ |