Skip to content

Commit 427e164

Browse files
Nikolay BorisovIngo Molnar
authored andcommitted
x86/insn: Remove superfluous checks from instruction decoding routines
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
1 parent b401b62 commit 427e164

File tree

2 files changed

+42
-70
lines changed

2 files changed

+42
-70
lines changed

arch/x86/lib/insn.c

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
268268
if (opcode->got)
269269
return 0;
270270

271-
if (!insn->prefixes.got) {
272-
ret = insn_get_prefixes(insn);
273-
if (ret)
274-
return ret;
275-
}
271+
ret = insn_get_prefixes(insn);
272+
if (ret)
273+
return ret;
276274

277275
/* Get first opcode */
278276
op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
339337
if (modrm->got)
340338
return 0;
341339

342-
if (!insn->opcode.got) {
343-
ret = insn_get_opcode(insn);
344-
if (ret)
345-
return ret;
346-
}
340+
ret = insn_get_opcode(insn);
341+
if (ret)
342+
return ret;
347343

348344
if (inat_has_modrm(insn->attr)) {
349345
mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
386382
if (!insn->x86_64)
387383
return 0;
388384

389-
if (!modrm->got) {
390-
ret = insn_get_modrm(insn);
391-
if (ret)
392-
return 0;
393-
}
385+
ret = insn_get_modrm(insn);
386+
if (ret)
387+
return 0;
394388
/*
395389
* For rip-relative instructions, the mod field (top 2 bits)
396390
* is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
417411
if (insn->sib.got)
418412
return 0;
419413

420-
if (!insn->modrm.got) {
421-
ret = insn_get_modrm(insn);
422-
if (ret)
423-
return ret;
424-
}
414+
ret = insn_get_modrm(insn);
415+
if (ret)
416+
return ret;
425417

426418
if (insn->modrm.nbytes) {
427419
modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
460452
if (insn->displacement.got)
461453
return 0;
462454

463-
if (!insn->sib.got) {
464-
ret = insn_get_sib(insn);
465-
if (ret)
466-
return ret;
467-
}
455+
ret = insn_get_sib(insn);
456+
if (ret)
457+
return ret;
468458

469459
if (insn->modrm.nbytes) {
470460
/*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
628618
if (insn->immediate.got)
629619
return 0;
630620

631-
if (!insn->displacement.got) {
632-
ret = insn_get_displacement(insn);
633-
if (ret)
634-
return ret;
635-
}
621+
ret = insn_get_displacement(insn);
622+
if (ret)
623+
return ret;
636624

637625
if (inat_has_moffset(insn->attr)) {
638626
if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
703691
if (insn->length)
704692
return 0;
705693

706-
if (!insn->immediate.got) {
707-
ret = insn_get_immediate(insn);
708-
if (ret)
709-
return ret;
710-
}
694+
ret = insn_get_immediate(insn);
695+
if (ret)
696+
return ret;
711697

712698
insn->length = (unsigned char)((unsigned long)insn->next_byte
713699
- (unsigned long)insn->kaddr);

tools/arch/x86/lib/insn.c

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
268268
if (opcode->got)
269269
return 0;
270270

271-
if (!insn->prefixes.got) {
272-
ret = insn_get_prefixes(insn);
273-
if (ret)
274-
return ret;
275-
}
271+
ret = insn_get_prefixes(insn);
272+
if (ret)
273+
return ret;
276274

277275
/* Get first opcode */
278276
op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
339337
if (modrm->got)
340338
return 0;
341339

342-
if (!insn->opcode.got) {
343-
ret = insn_get_opcode(insn);
344-
if (ret)
345-
return ret;
346-
}
340+
ret = insn_get_opcode(insn);
341+
if (ret)
342+
return ret;
347343

348344
if (inat_has_modrm(insn->attr)) {
349345
mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
386382
if (!insn->x86_64)
387383
return 0;
388384

389-
if (!modrm->got) {
390-
ret = insn_get_modrm(insn);
391-
if (ret)
392-
return 0;
393-
}
385+
ret = insn_get_modrm(insn);
386+
if (ret)
387+
return 0;
394388
/*
395389
* For rip-relative instructions, the mod field (top 2 bits)
396390
* is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
417411
if (insn->sib.got)
418412
return 0;
419413

420-
if (!insn->modrm.got) {
421-
ret = insn_get_modrm(insn);
422-
if (ret)
423-
return ret;
424-
}
414+
ret = insn_get_modrm(insn);
415+
if (ret)
416+
return ret;
425417

426418
if (insn->modrm.nbytes) {
427419
modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
460452
if (insn->displacement.got)
461453
return 0;
462454

463-
if (!insn->sib.got) {
464-
ret = insn_get_sib(insn);
465-
if (ret)
466-
return ret;
467-
}
455+
ret = insn_get_sib(insn);
456+
if (ret)
457+
return ret;
468458

469459
if (insn->modrm.nbytes) {
470460
/*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
628618
if (insn->immediate.got)
629619
return 0;
630620

631-
if (!insn->displacement.got) {
632-
ret = insn_get_displacement(insn);
633-
if (ret)
634-
return ret;
635-
}
621+
ret = insn_get_displacement(insn);
622+
if (ret)
623+
return ret;
636624

637625
if (inat_has_moffset(insn->attr)) {
638626
if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
703691
if (insn->length)
704692
return 0;
705693

706-
if (!insn->immediate.got) {
707-
ret = insn_get_immediate(insn);
708-
if (ret)
709-
return ret;
710-
}
694+
ret = insn_get_immediate(insn);
695+
if (ret)
696+
return ret;
711697

712698
insn->length = (unsigned char)((unsigned long)insn->next_byte
713699
- (unsigned long)insn->kaddr);

0 commit comments

Comments
 (0)