Instruction
FFREE
Marks ST(i) as empty in the x87 tag word, without changing the stack top.
- Extensions
- Forms
- 1 (1 Legacy)
- Data
- Intel XED v2026.08.23
FFREE ST(i) tags one x87 register as empty, and does nothing else. The
register keeps its bits and TOP stays where it was, so FFREE is not a
pop: after ffree st(0) the top of the stack is an empty register, and
the next instruction that reads ST(0) finds a stack underflow. It is two
bytes, DD C0+i.
Emptying without reading
FFREE never looks at the value, and an empty register is no error for it: on Zen 5, FFREE of an empty ST(1) or ST(3) raised nothing and changed no tag. That makes it the safe way to clear a register whose state is unknown, where the usual ways read it first:
fstp st(0)pops ST(0) by storing it onto itself, the idiom GCC 14 and Clang 23 at -O2 emit to drop along doubleresult nobody uses. On an empty ST(0) it is a stack underflow.- FNINIT empties all eight, but resets the control word as well.
ffree st(7) makes room for one more push on a stack that may be full:
with eight values loaded, Zen 5 tagged ST(7)’s register empty and left
the other seven, so a following FLD cannot overflow. FFREE
followed by FINCSTP frees ST(0) and moves TOP like a
pop. FFREEP, DF C0+i, does both in one instruction, but
neither manual lists it.
Status and waiting
Both manuals leave C0 to C3 undefined. In all six of Zen 5’s cases FFREE cleared C1 and kept C0, C2 and C3. FFREE raises no floating-point exception, but it is a waiting instruction: Intel’s manual lists #MF for a pending unmasked exception, which it delivers before freeing anything.
AMD’s Zen 5 guide lists FFREE as one macro-op, six per cycle, with no FP pipe named for it.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
FFREE st(i)
FFREE_X87 | DD C0+i | FPU |
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
free(src) # its tag only: it keeps its value,
# and TOP stays
c0 = c1 = c2 = c3 = UNDEFINED # Zen 5 clears C1
Run on AMD Zen 5 (EPYC 9645): 6 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
FFREE st(i) | ||
st(i) | explicit | read |
x87 tag word | implicit | write |
Flags
| C0 | C1 | C2 | C3 |
|---|---|---|---|
| All forms | |||
| U | U | U | U |
Attributes
What else XED records about the forms. How to read.
- All forms
- may abort a TSX transaction
CPUID and processors
Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.
| ISA set | CPUID | Processors |
|---|---|---|
X87 | FPU | Every x86-64 processor in XED’s model and Zen 3 to Zen 6 |
More x87 instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s
-marchfeature sets and AMD’s Processor Programming References, which the page of each processor cites. - Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2A, page 3-339 (FFREE)
- Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
- AMD64 Architecture Programmer's Manual, Volume 5: 64-Bit Media and x87 Floating-Point Instructions (26569, rev. 3.16, November 2021), Wayback Machine copy of AMD's PDF
- Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP
The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The text is our own.