X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Faarch64-gen.c;h=f4a0f13027646958cd71e9c37329a81ec8b98d14;hb=5d2e1193286fe6278ee70c2137b3726994f2e28b;hp=68b6e14afd212037b4dc04df6cea5a1c492e1918;hpb=3d731f6949e2b0099cfbe0cf608d60a52a66d354;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/aarch64-gen.c b/opcodes/aarch64-gen.c index 68b6e14afd..f4a0f13027 100644 --- a/opcodes/aarch64-gen.c +++ b/opcodes/aarch64-gen.c @@ -1,6 +1,6 @@ /* aarch64-gen.c -- Generate tables and routines for opcode lookup and instruction encoding and decoding. - Copyright (C) 2012-2016 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of the GNU opcodes library. @@ -143,9 +143,9 @@ read_table (const struct aarch64_opcode* table) /* F_PSEUDO needs to be used together with F_ALIAS to indicate an alias opcode is a programmer friendly pseudo instruction available only in the assembly code (thus will not show up in the disassembly). */ - assert (pseudo_opcode_p (ent) == FALSE || alias_opcode_p (ent) == TRUE); + assert (!pseudo_opcode_p (ent) || alias_opcode_p (ent)); /* Skip alias (inc. pseudo) opcode. */ - if (alias_opcode_p (ent) == TRUE) + if (alias_opcode_p (ent)) { index++; continue; @@ -393,6 +393,9 @@ print_decision_tree_1 (unsigned int indent, struct bittree* bittree) { /* PATTERN is only used to generate comment in the code. */ static char pattern[33] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + /* Low bits in PATTERN will be printed first which then look as the high + bits in comment. We need to reverse the index to get correct print. */ + unsigned int msb = sizeof (pattern) - 2; assert (bittree != NULL); /* Leaf node located. */ @@ -412,15 +415,15 @@ print_decision_tree_1 (unsigned int indent, struct bittree* bittree) /* Walk down the decoder tree. */ indented_print (indent, "if (((word >> %d) & 0x1) == 0)\n", bittree->bitno); indented_print (indent, " {\n"); - pattern[bittree->bitno] = '0'; + pattern[msb - bittree->bitno] = '0'; print_decision_tree_1 (indent + 4, bittree->bits[0]); indented_print (indent, " }\n"); indented_print (indent, "else\n"); indented_print (indent, " {\n"); - pattern[bittree->bitno] = '1'; + pattern[msb - bittree->bitno] = '1'; print_decision_tree_1 (indent + 4, bittree->bits[1]); indented_print (indent, " }\n"); - pattern[bittree->bitno] = 'x'; + pattern[msb - bittree->bitno] = 'x'; } /* Generate aarch64_opcode_lookup in C code to the standard output. */ @@ -704,7 +707,7 @@ find_alias_opcode (const aarch64_opcode *opcode) /* The mask of an alias opcode must be equal to or a super-set (i.e. more constrained) of that of the aliased opcode; so is the base opcode value. */ - if (alias_opcode_p (ent) == TRUE + if (alias_opcode_p (ent) && (ent->mask & opcode->mask) == opcode->mask && (opcode->mask & ent->opcode) == (opcode->mask & opcode->opcode)) { @@ -981,10 +984,11 @@ print_operand_inserter (void) printf ("Enter print_operand_inserter\n"); printf ("\n"); - printf ("const char*\n"); + printf ("bfd_boolean\n"); printf ("aarch64_insert_operand (const aarch64_operand *self,\n\ const aarch64_opnd_info *info,\n\ - aarch64_insn *code, const aarch64_inst *inst)\n"); + aarch64_insn *code, const aarch64_inst *inst,\n\ + aarch64_operand_error *errors)\n"); printf ("{\n"); printf (" /* Use the index as the key. */\n"); printf (" int key = self - aarch64_operands;\n"); @@ -1014,7 +1018,7 @@ print_operand_inserter (void) opnd2->processed = 1; } } - printf (" return aarch64_%s (self, info, code, inst);\n", + printf (" return aarch64_%s (self, info, code, inst, errors);\n", opnd->inserter); } } @@ -1037,10 +1041,11 @@ print_operand_extractor (void) printf ("Enter print_operand_extractor\n"); printf ("\n"); - printf ("int\n"); + printf ("bfd_boolean\n"); printf ("aarch64_extract_operand (const aarch64_operand *self,\n\ aarch64_opnd_info *info,\n\ - aarch64_insn code, const aarch64_inst *inst)\n"); + aarch64_insn code, const aarch64_inst *inst,\n\ + aarch64_operand_error *errors)\n"); printf ("{\n"); printf (" /* Use the index as the key. */\n"); printf (" int key = self - aarch64_operands;\n"); @@ -1070,7 +1075,7 @@ print_operand_extractor (void) opnd2->processed = 1; } } - printf (" return aarch64_%s (self, info, code, inst);\n", + printf (" return aarch64_%s (self, info, code, inst, errors);\n", opnd->extractor); } } @@ -1241,7 +1246,7 @@ main (int argc, char **argv) print_divide_result (decoder_tree); printf ("/* This file is automatically generated by aarch64-gen. Do not edit! */\n"); - printf ("/* Copyright (C) 2012-2016 Free Software Foundation, Inc.\n\ + printf ("/* Copyright (C) 2012-2020 Free Software Foundation, Inc.\n\ Contributed by ARM Ltd.\n\ \n\ This file is part of the GNU opcodes library.\n\