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)