diff options
Diffstat (limited to 'opcodes/aarch64-dis.c')
-rw-r--r-- | opcodes/aarch64-dis.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index 179addc..3ca22bb 100644 --- a/opcodes/aarch64-dis.c +++ b/opcodes/aarch64-dis.c @@ -149,7 +149,6 @@ aarch64_insn extract_fields (aarch64_insn code, aarch64_insn mask, ...) { uint32_t num; - const aarch64_field *field; enum aarch64_field_kind kind; va_list va; @@ -160,8 +159,7 @@ extract_fields (aarch64_insn code, aarch64_insn mask, ...) while (num--) { kind = va_arg (va, enum aarch64_field_kind); - field = &fields[kind]; - value <<= field->width; + value <<= aarch64_fields[kind].width; value |= extract_field (kind, code, mask); } va_end (va); @@ -184,7 +182,7 @@ extract_all_fields_after (const aarch64_operand *self, unsigned int start, i < ARRAY_SIZE (self->fields) && self->fields[i] != FLD_NIL; ++i) { kind = self->fields[i]; - value <<= fields[kind].width; + value <<= aarch64_fields[kind].width; value |= extract_field (kind, code, 0); } return value; @@ -503,21 +501,21 @@ aarch64_ext_ldst_reglist (const aarch64_operand *self ATTRIBUTE_UNUSED, static const struct { - unsigned is_reserved; - unsigned num_regs; - unsigned num_elements; + unsigned num_regs:8; + unsigned num_elements:8; + bool is_reserved:1; } data [] = - { {0, 4, 4}, - {1, 4, 4}, - {0, 4, 1}, - {0, 4, 2}, - {0, 3, 3}, - {1, 3, 3}, - {0, 3, 1}, - {0, 1, 1}, - {0, 2, 2}, - {1, 2, 2}, - {0, 2, 1}, + { {4, 4, false}, + {4, 4, true}, + {4, 1, false}, + {4, 2, false}, + {3, 3, false}, + {3, 3, true}, + {3, 1, false}, + {1, 1, false}, + {2, 2, false}, + {2, 2, true}, + {2, 1, false}, }; /* Rt */ @@ -1240,7 +1238,8 @@ aarch64_ext_addr_simm (const aarch64_operand *self, aarch64_opnd_info *info, info->addr.base_regno = extract_field (FLD_Rn, code, 0); /* simm (imm9 or imm7) */ imm = extract_field (self->fields[0], code, 0); - info->addr.offset.imm = sign_extend (imm, fields[self->fields[0]].width - 1); + info->addr.offset.imm + = sign_extend (imm, aarch64_fields[self->fields[0]].width - 1); if (self->fields[0] == FLD_imm7 || info->qualifier == AARCH64_OPND_QLF_imm_tag) /* scaled immediate in ld/st pair instructions. */ |