diff options
Diffstat (limited to 'opcodes/aarch64-asm.c')
-rw-r--r-- | opcodes/aarch64-asm.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/opcodes/aarch64-asm.c b/opcodes/aarch64-asm.c index f20bdf6..75216fd 100644 --- a/opcodes/aarch64-asm.c +++ b/opcodes/aarch64-asm.c @@ -40,7 +40,6 @@ static inline void insert_fields (aarch64_insn *code, aarch64_insn value, aarch64_insn mask, ...) { uint32_t num; - const aarch64_field *field; enum aarch64_field_kind kind; va_list va; @@ -50,9 +49,8 @@ insert_fields (aarch64_insn *code, aarch64_insn value, aarch64_insn mask, ...) while (num--) { kind = va_arg (va, enum aarch64_field_kind); - field = &fields[kind]; insert_field (kind, code, value, mask); - value >>= field->width; + value >>= aarch64_fields[kind].width; } va_end (va); } @@ -72,7 +70,7 @@ insert_all_fields_after (const aarch64_operand *self, unsigned int start, { kind = self->fields[i]; insert_field (kind, code, value, 0); - value >>= fields[kind].width; + value >>= aarch64_fields[kind].width; } } @@ -2033,7 +2031,8 @@ do_special_encoding (struct aarch64_inst *inst) { idx = select_operand_for_sf_field_coding (inst->opcode); value = (inst->operands[idx].qualifier == AARCH64_OPND_QLF_X - || inst->operands[idx].qualifier == AARCH64_OPND_QLF_SP) + || inst->operands[idx].qualifier == AARCH64_OPND_QLF_SP + || inst->operands[idx].qualifier == AARCH64_OPND_QLF_S_D) ? 1 : 0; insert_field (FLD_sf, &inst->value, value, 0); if (inst->opcode->flags & F_N) @@ -2063,6 +2062,13 @@ do_special_encoding (struct aarch64_inst *inst) insert_field (FLD_rcpc3_size, &inst->value, value, 0); } + if (inst->opcode->flags & F_LSFE_SZ) + { + value = aarch64_get_qualifier_standard_value (inst->operands[0].qualifier); + insert_field (FLD_ldst_size, &inst->value, value, 0); + return; + } + if (inst->opcode->flags & F_SIZEQ) encode_sizeq (inst); if (inst->opcode->flags & F_FPTYPE) @@ -2271,11 +2277,24 @@ aarch64_encode_variant_using_iclass (struct aarch64_inst *inst) insert_field (FLD_SVE_sz2, &inst->value, aarch64_get_variant (inst), 0); break; + case sve_size_sd3: + insert_field (FLD_SVE_sz3, &inst->value, aarch64_get_variant (inst), 0); + break; + + case sve_size_sd4: + insert_field (FLD_SVE_sz4, &inst->value, aarch64_get_variant (inst), 0); + break; + case sve_size_hsd2: insert_field (FLD_SVE_size, &inst->value, aarch64_get_variant (inst) + 1, 0); break; + case sve_size_hsd3: + insert_field (FLD_len, &inst->value, + aarch64_get_variant (inst) + 1, 0); + break; + case sve_size_tsz_bhs: insert_fields (&inst->value, (1 << aarch64_get_variant (inst)), |