X86: Decode the mysterious and elusive ffreep x87 instruction.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Mar 2011 08:41:38 +0000 (00:41 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Mar 2011 08:41:38 +0000 (00:41 -0800)
The internet says this instruction was created by accident when an Intel CPU
failed to decode x87 instructions properly. It's been documented on a few rare
occasions and has generally worked to ensure backwards compatability. One
source claims that the gcc toolchain is basically the only thing that emits
it, and that emulators/binary translators like qemu and bochs implement it.

We won't actually implement it here since we're hardly implementing any other
x87 instructions either. If we were to implement it, it would behave the same
as ffree but then also pop the register stack.

http://www.pagetable.com/?p=16

src/arch/x86/isa/decoder/x87.isa

index e44a18f654403c890bbdde873dac10d25ad8687e..ace96fbf6e9802e2c4a47696eaf39fe016fe1ce6 100644 (file)
@@ -291,7 +291,9 @@ format WarnUnimpl {
         //0x7: esc7();
         0x7: decode MODRM_REG {
             0x0: decode MODRM_MOD {
-                0x3: Inst::UD2();
+                // The ffreep instruction isn't entirely real. It should work
+                // the same as ffree but then also pop the register stack.
+                0x3: ffreep();
                 default: fild();
             }
             0x1: decode MODRM_MOD {