From adb37fe84f5d363a105d5b8816d539ca6da2ecae Mon Sep 17 00:00:00 2001 From: bird_egop Date: Fri, 18 Apr 2025 13:19:28 +0300 Subject: [PATCH] Standardize FPU instruction handler naming convention --- .../FloatingPoint/Control/FclexHandler.cs | 42 ++++++----- .../FloatingPoint/Control/FclexWaitHandler.cs | 71 ------------------- .../FloatingPoint/Control/FnclexHandler.cs | 63 ++++++++++++++++ .../X86/Handlers/InstructionHandlerFactory.cs | 4 +- 4 files changed, 90 insertions(+), 90 deletions(-) delete mode 100644 X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexWaitHandler.cs create mode 100644 X86Disassembler/X86/Handlers/FloatingPoint/Control/FnclexHandler.cs diff --git a/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexHandler.cs b/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexHandler.cs index c3bee0d..eb74cce 100644 --- a/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexHandler.cs +++ b/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexHandler.cs @@ -1,9 +1,7 @@ namespace X86Disassembler.X86.Handlers.FloatingPoint.Control; -using X86Disassembler.X86.Operands; - /// -/// Handler for FNCLEX instruction (0xDB 0xE2) - Clears floating-point exception flags without checking for pending unmasked exceptions +/// Handler for FCLEX instruction with WAIT prefix (0x9B 0xDB 0xE2) - Clears floating-point exception flags after checking for pending unmasked floating-point exceptions /// public class FclexHandler : InstructionHandler { @@ -23,41 +21,51 @@ public class FclexHandler : InstructionHandler /// True if this handler can decode the opcode public override bool CanHandle(byte opcode) { - // FCLEX is DB E2 - if (opcode != 0xDB) return false; + // FCLEX with WAIT prefix starts with 0x9B + if (opcode != 0x9B) return false; + // Check if we can read the next two bytes if (!Decoder.CanReadByte()) - { return false; - } - // Check if the next byte is E2 - byte nextByte = Decoder.PeakByte(); - return nextByte == 0xE2; + // Check if the next bytes are 0xDB 0xE2 (for FCLEX with WAIT) + var (nextByte, thirdByte) = Decoder.PeakTwoBytes(); + + // The sequence must be 9B DB E2 for FCLEX with WAIT + return nextByte == 0xDB && thirdByte == 0xE2; } /// - /// Decodes a FCLEX instruction + /// Decodes a FCLEX instruction with WAIT prefix /// /// The opcode of the instruction /// The instruction object to populate /// True if the instruction was successfully decoded public override bool Decode(byte opcode, Instruction instruction) { + // Skip the WAIT prefix (0x9B) - we already read it in CanHandle if (!Decoder.CanReadByte()) - { return false; - } - // Read the second byte of the opcode + // Read the second byte (0xDB) byte secondByte = Decoder.ReadByte(); + if (secondByte != 0xDB) + return false; + + // Read the third byte (0xE2) + if (!Decoder.CanReadByte()) + return false; + + byte thirdByte = Decoder.ReadByte(); + if (thirdByte != 0xE2) + return false; // Set the instruction type - instruction.Type = InstructionType.Fnclex; - + instruction.Type = InstructionType.Fclex; + // FCLEX has no operands instruction.StructuredOperands = []; - + return true; } } diff --git a/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexWaitHandler.cs b/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexWaitHandler.cs deleted file mode 100644 index 457d985..0000000 --- a/X86Disassembler/X86/Handlers/FloatingPoint/Control/FclexWaitHandler.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace X86Disassembler.X86.Handlers.FloatingPoint.Control; - -/// -/// Handler for FCLEX instruction with WAIT prefix (0x9B 0xDB 0xE2) - Clears floating-point exception flags after checking for pending unmasked floating-point exceptions -/// -public class FclexWaitHandler : InstructionHandler -{ - /// - /// Initializes a new instance of the FclexWaitHandler class - /// - /// The instruction decoder that owns this handler - public FclexWaitHandler(InstructionDecoder decoder) - : base(decoder) - { - } - - /// - /// Checks if this handler can decode the given opcode - /// - /// The opcode to check - /// True if this handler can decode the opcode - public override bool CanHandle(byte opcode) - { - // FCLEX with WAIT prefix starts with 0x9B - if (opcode != 0x9B) return false; - - // Check if we can read the next two bytes - if (!Decoder.CanReadByte()) - return false; - - // Check if the next bytes are 0xDB 0xE2 (for FCLEX with WAIT) - var (nextByte, thirdByte) = Decoder.PeakTwoBytes(); - - // The sequence must be 9B DB E2 for FCLEX with WAIT - return nextByte == 0xDB && thirdByte == 0xE2; - } - - /// - /// Decodes a FCLEX instruction with WAIT prefix - /// - /// The opcode of the instruction - /// The instruction object to populate - /// True if the instruction was successfully decoded - public override bool Decode(byte opcode, Instruction instruction) - { - // Skip the WAIT prefix (0x9B) - we already read it in CanHandle - if (!Decoder.CanReadByte()) - return false; - - // Read the second byte (0xDB) - byte secondByte = Decoder.ReadByte(); - if (secondByte != 0xDB) - return false; - - // Read the third byte (0xE2) - if (!Decoder.CanReadByte()) - return false; - - byte thirdByte = Decoder.ReadByte(); - if (thirdByte != 0xE2) - return false; - - // Set the instruction type - instruction.Type = InstructionType.Fclex; - - // FCLEX has no operands - instruction.StructuredOperands = []; - - return true; - } -} diff --git a/X86Disassembler/X86/Handlers/FloatingPoint/Control/FnclexHandler.cs b/X86Disassembler/X86/Handlers/FloatingPoint/Control/FnclexHandler.cs new file mode 100644 index 0000000..5ab12d4 --- /dev/null +++ b/X86Disassembler/X86/Handlers/FloatingPoint/Control/FnclexHandler.cs @@ -0,0 +1,63 @@ +namespace X86Disassembler.X86.Handlers.FloatingPoint.Control; + +using X86Disassembler.X86.Operands; + +/// +/// Handler for FNCLEX instruction (0xDB 0xE2) - Clears floating-point exception flags without checking for pending unmasked exceptions +/// +public class FnclexHandler : InstructionHandler +{ + /// + /// Initializes a new instance of the FnclexHandler class + /// + /// The instruction decoder that owns this handler + public FnclexHandler(InstructionDecoder decoder) + : base(decoder) + { + } + + /// + /// Checks if this handler can decode the given opcode + /// + /// The opcode to check + /// True if this handler can decode the opcode + public override bool CanHandle(byte opcode) + { + // FNCLEX is DB E2 + if (opcode != 0xDB) return false; + + if (!Decoder.CanReadByte()) + { + return false; + } + + // Check if the next byte is E2 + byte nextByte = Decoder.PeakByte(); + return nextByte == 0xE2; + } + + /// + /// Decodes a FNCLEX instruction + /// + /// The opcode of the instruction + /// The instruction object to populate + /// True if the instruction was successfully decoded + public override bool Decode(byte opcode, Instruction instruction) + { + if (!Decoder.CanReadByte()) + { + return false; + } + + // Read the second byte of the opcode + byte secondByte = Decoder.ReadByte(); + + // Set the instruction type + instruction.Type = InstructionType.Fnclex; + + // FCLEX has no operands + instruction.StructuredOperands = []; + + return true; + } +} diff --git a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs index 91879eb..479167c 100644 --- a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs +++ b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs @@ -435,8 +435,8 @@ public class InstructionHandlerFactory _handlers.Add(new FloatingPoint.Conditional.FcmovnuHandler(_decoder)); // FCMOVNU (DB D8-DF) // DB opcode handlers (control instructions) - _handlers.Add(new FloatingPoint.Control.FclexHandler(_decoder)); // FNCLEX (DB E2) - _handlers.Add(new FloatingPoint.Control.FclexWaitHandler(_decoder)); // FCLEX (9B DB E2) + _handlers.Add(new FloatingPoint.Control.FnclexHandler(_decoder)); // FNCLEX (DB E2) + _handlers.Add(new FloatingPoint.Control.FclexHandler(_decoder)); // FCLEX (9B DB E2) _handlers.Add(new FloatingPoint.Control.FninitHandler(_decoder)); // FNINIT (DB E3) _handlers.Add(new FloatingPoint.Control.FinitHandler(_decoder)); // FINIT (9B DB E3)