x86/insn: Remove superfluous checks from instruction decoding routines
authorNikolay Borisov <nik.borisov@suse.com>
Thu, 22 Feb 2024 11:16:35 +0000 (13:16 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 22 Feb 2024 11:23:04 +0000 (12:23 +0100)
It's pointless checking if a particular part of an instruction is
decoded before calling the routine responsible for decoding it as this
check is duplicated in the routines itself. Streamline the code by
removing the superfluous checks. No functional difference.

Signed-off-by: Nikolay Borisov <nik.borisov@suse.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240222111636.2214523-2-nik.borisov@suse.com
arch/x86/lib/insn.c
tools/arch/x86/lib/insn.c

index 55e371cc69fd5d00670a08983335e3bddfff9571..3946bdc75087bfa3a6a345a07425f902b7168e78 100644 (file)
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
        if (opcode->got)
                return 0;
 
-       if (!insn->prefixes.got) {
-               ret = insn_get_prefixes(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_prefixes(insn);
+       if (ret)
+               return ret;
 
        /* Get first opcode */
        op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
        if (modrm->got)
                return 0;
 
-       if (!insn->opcode.got) {
-               ret = insn_get_opcode(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_opcode(insn);
+       if (ret)
+               return ret;
 
        if (inat_has_modrm(insn->attr)) {
                mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
        if (!insn->x86_64)
                return 0;
 
-       if (!modrm->got) {
-               ret = insn_get_modrm(insn);
-               if (ret)
-                       return 0;
-       }
+       ret = insn_get_modrm(insn);
+       if (ret)
+               return 0;
        /*
         * For rip-relative instructions, the mod field (top 2 bits)
         * is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
        if (insn->sib.got)
                return 0;
 
-       if (!insn->modrm.got) {
-               ret = insn_get_modrm(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_modrm(insn);
+       if (ret)
+               return ret;
 
        if (insn->modrm.nbytes) {
                modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
        if (insn->displacement.got)
                return 0;
 
-       if (!insn->sib.got) {
-               ret = insn_get_sib(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_sib(insn);
+       if (ret)
+               return ret;
 
        if (insn->modrm.nbytes) {
                /*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
        if (insn->immediate.got)
                return 0;
 
-       if (!insn->displacement.got) {
-               ret = insn_get_displacement(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_displacement(insn);
+       if (ret)
+               return ret;
 
        if (inat_has_moffset(insn->attr)) {
                if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
        if (insn->length)
                return 0;
 
-       if (!insn->immediate.got) {
-               ret = insn_get_immediate(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_immediate(insn);
+       if (ret)
+               return ret;
 
        insn->length = (unsigned char)((unsigned long)insn->next_byte
                                     - (unsigned long)insn->kaddr);
index 8fd63a067308a83ea9fe44085db306c555a1288d..5d81924478d9b4322cc2113c35e5181ac2c1aaa1 100644 (file)
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
        if (opcode->got)
                return 0;
 
-       if (!insn->prefixes.got) {
-               ret = insn_get_prefixes(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_prefixes(insn);
+       if (ret)
+               return ret;
 
        /* Get first opcode */
        op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
        if (modrm->got)
                return 0;
 
-       if (!insn->opcode.got) {
-               ret = insn_get_opcode(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_opcode(insn);
+       if (ret)
+               return ret;
 
        if (inat_has_modrm(insn->attr)) {
                mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
        if (!insn->x86_64)
                return 0;
 
-       if (!modrm->got) {
-               ret = insn_get_modrm(insn);
-               if (ret)
-                       return 0;
-       }
+       ret = insn_get_modrm(insn);
+       if (ret)
+               return 0;
        /*
         * For rip-relative instructions, the mod field (top 2 bits)
         * is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
        if (insn->sib.got)
                return 0;
 
-       if (!insn->modrm.got) {
-               ret = insn_get_modrm(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_modrm(insn);
+       if (ret)
+               return ret;
 
        if (insn->modrm.nbytes) {
                modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
        if (insn->displacement.got)
                return 0;
 
-       if (!insn->sib.got) {
-               ret = insn_get_sib(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_sib(insn);
+       if (ret)
+               return ret;
 
        if (insn->modrm.nbytes) {
                /*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
        if (insn->immediate.got)
                return 0;
 
-       if (!insn->displacement.got) {
-               ret = insn_get_displacement(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_displacement(insn);
+       if (ret)
+               return ret;
 
        if (inat_has_moffset(insn->attr)) {
                if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
        if (insn->length)
                return 0;
 
-       if (!insn->immediate.got) {
-               ret = insn_get_immediate(insn);
-               if (ret)
-                       return ret;
-       }
+       ret = insn_get_immediate(insn);
+       if (ret)
+               return ret;
 
        insn->length = (unsigned char)((unsigned long)insn->next_byte
                                     - (unsigned long)insn->kaddr);