diff options
| author | iximeow <me@iximeow.net> | 2019-10-21 00:26:23 -0700 | 
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2020-01-12 16:10:13 -0800 | 
| commit | 0ce86c7aac1c226e7c7805de6d69df51b7980063 (patch) | |
| tree | 185c1ff3e79f5fe9dbb3e3749acb56d430521e51 /src | |
| parent | e76c95b1c47fd10e6bc620b59b638587e0579a88 (diff) | |
wtf i love speculation
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 48 | 
1 files changed, 22 insertions, 26 deletions
| @@ -2378,35 +2378,31 @@ pub fn read_instr<T: Iterator<Item=u8>>(mut bytes_iter: T, instruction: &mut Ins          match bytes_iter.next() {              Some(b) => {                  let record = OPCODES[b as usize]; -                if let Interpretation::Instruction(_) = record.0 { +                if (b & 0xf0) == 0x40 { +                    prefixes.rex_mut().from(b); +                } else if b == 0x0f { +                    if let Some(record) = match alternate_opcode_map { +                        Some(OpcodeMap::Map66) => { +                            read_opcode_660f_map(&mut bytes_iter, &mut length) +                        }, +                        Some(OpcodeMap::MapF2) => { +                            read_opcode_f20f_map(&mut bytes_iter, &mut length) +                        }, +                        Some(OpcodeMap::MapF3) => { +                            read_opcode_f30f_map(&mut bytes_iter, &mut length) +                        }, +                        None => { +                            read_opcode_0f_map(&mut bytes_iter, &mut length) +                        } +                    } { +                        break record; +                    } else { +                        return Err(()); +                    } +                } else if let Interpretation::Instruction(_) = record.0 {                      break record;                  } else {                      match b { -                        x if (x & 0xf0 == 0x40) => { -                            // x86_32 inc/dec -                            // x86_64 rex -                            prefixes.rex_mut().from(x); -                        }, -                        0x0f => { -                            if let Some(record) = match alternate_opcode_map { -                                Some(OpcodeMap::Map66) => { -                                    read_opcode_660f_map(&mut bytes_iter, &mut length) -                                }, -                                Some(OpcodeMap::MapF2) => { -                                    read_opcode_f20f_map(&mut bytes_iter, &mut length) -                                }, -                                Some(OpcodeMap::MapF3) => { -                                    read_opcode_f30f_map(&mut bytes_iter, &mut length) -                                }, -                                None => { -                                    read_opcode_0f_map(&mut bytes_iter, &mut length) -                                } -                            } { -                                break record; -                            } else { -                                return Err(()); -                            } -                        },                          0x26 => {                              prefixes.set_es();                              alternate_opcode_map = None; | 
