aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2023-01-29 17:45:10 -0800
committeriximeow <me@iximeow.net>2023-07-04 19:01:38 -0700
commitf17450483ef9dc18d2b97e6287063a572c7e898c (patch)
treed352cba2a185b26300fc8b0efde2751b6aaa0013
parentb4150c4f2922eaad9031ecc5078c8f9a4b076ef6 (diff)
move some unlikely checks behind a branch that implies their possibility
slightly fewer (perfectly predicted anyway) branches this way
-rw-r--r--src/long_mode/mod.rs76
1 files changed, 38 insertions, 38 deletions
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs
index 4862bcb..59d552c 100644
--- a/src/long_mode/mod.rs
+++ b/src/long_mode/mod.rs
@@ -7218,20 +7218,20 @@ fn read_operands<
};
},
3 => {
- if modrm == 0xf8 {
- instruction.opcode = Opcode::XABORT;
- instruction.imm = read_imm_signed(words, 1)? as u64;
- sink.record(
- words.offset() as u32 * 8 - 8,
- words.offset() as u32 * 8 - 1,
- InnerDescription::Number("imm", instruction.imm as i64)
- .with_id(words.offset() as u32 * 8 - 8)
- );
- instruction.operands[0] = OperandSpec::ImmI8;
- instruction.operand_count = 1;
- return Ok(());
- }
if (modrm & 0b00111000) != 0 {
+ if modrm == 0xf8 {
+ instruction.opcode = Opcode::XABORT;
+ instruction.imm = read_imm_signed(words, 1)? as u64;
+ sink.record(
+ words.offset() as u32 * 8 - 8,
+ words.offset() as u32 * 8 - 1,
+ InnerDescription::Number("imm", instruction.imm as i64)
+ .with_id(words.offset() as u32 * 8 - 8)
+ );
+ instruction.operands[0] = OperandSpec::ImmI8;
+ instruction.operand_count = 1;
+ return Ok(());
+ }
sink.record(
modrm_start + 3,
modrm_start + 5,
@@ -7254,32 +7254,32 @@ fn read_operands<
}
4 => {
- if modrm == 0xf8 {
- instruction.opcode = Opcode::XBEGIN;
- instruction.imm = if opwidth == 2 {
- let imm = read_imm_signed(words, 2)? as i16 as i64 as u64;
- sink.record(
- words.offset() as u32 * 8 - 16,
- words.offset() as u32 * 8 - 1,
- InnerDescription::Number("imm", instruction.imm as i64)
- .with_id(words.offset() as u32 * 8 - 16)
- );
- imm
- } else {
- let imm = read_imm_signed(words, 4)? as i32 as i64 as u64;
- sink.record(
- words.offset() as u32 * 8 - 32,
- words.offset() as u32 * 8 - 1,
- InnerDescription::Number("imm", instruction.imm as i64)
- .with_id(words.offset() as u32 * 8 - 32)
- );
- imm
- };
- instruction.operands[0] = OperandSpec::ImmI32;
- instruction.operand_count = 1;
- return Ok(());
- }
if (modrm & 0b00111000) != 0 {
+ if modrm == 0xf8 {
+ instruction.opcode = Opcode::XBEGIN;
+ instruction.imm = if opwidth == 2 {
+ let imm = read_imm_signed(words, 2)? as i16 as i64 as u64;
+ sink.record(
+ words.offset() as u32 * 8 - 16,
+ words.offset() as u32 * 8 - 1,
+ InnerDescription::Number("imm", instruction.imm as i64)
+ .with_id(words.offset() as u32 * 8 - 16)
+ );
+ imm
+ } else {
+ let imm = read_imm_signed(words, 4)? as i32 as i64 as u64;
+ sink.record(
+ words.offset() as u32 * 8 - 32,
+ words.offset() as u32 * 8 - 1,
+ InnerDescription::Number("imm", instruction.imm as i64)
+ .with_id(words.offset() as u32 * 8 - 32)
+ );
+ imm
+ };
+ instruction.operands[0] = OperandSpec::ImmI32;
+ instruction.operand_count = 1;
+ return Ok(());
+ }
sink.record(
modrm_start + 3,
modrm_start + 5,