Table of contents
Parts of this page were generated with the assistance of AI. The content may contain inaccuracies, outdated information, or other artifacts of AI-generated text. Treat it as working notes and verify technical details against the microcode disassembly or Intel SDM and other authoritative resources where possible.

Int movs

Macro Operation x86 Opcode Notes

macro_252D NOT [mem+8] F7 /2 Bitwise complement

macro_2535 NEG [mem+8] F7 /3 Two's complement negate

macro_2509 MOV [mem+8], reg 89 Register to memory

macro_251C MOV [mem+8], imm C7 /0 Immediate to memory

macro_2512 CMOVcc synthesis or SETcc 0F 40-4F or 0F 90-9F Conditional with register

macro_2524 Conditional with imm Synthetic No direct x86 equivalent

macro_12A5 MOV [mem+8], 1 (?) C7 /0 or test/bit op Unclear, needs more context

FP Transcendental Operation Analysis (msrom-612, 0x1FFE-0x21E1)

Overview

This code block implements a floating-point transcendental function (likely FPATAN or similar) using polynomial approximation. The code demonstrates critical patterns for transferring data between TMP registers (computational domain) and ST registers (architectural FP stack).

Cross-Domain Transfer UOPs

UOP.020(source_constant, value_register, U2_flags)

UOP.220(constant, ST_register, U2_flags)

UOP.7EE(operand1, operand2, operation_code, U2_flags)

UFPOP_7X8(operand1, operand2, U2_flags)

UOP.262(operand1, operand2)

FP Field Extract UOPs

UOP.029(ST_register, ST_register)

UOP.060(FP_value, CONST_0)

UOP.061(FP_value, CONST_0)

UOP.063(FP_value, CONST_0)

UOP.064(FP_value, CONST_0)

FP Computation UOPs

UOP.0A1(CONST_0, FP_value)

UOP.223(operand1, operand2)

UOP.227(CONST_0, operand)

UOP.228(operand1, operand2)

UOP.267(operand1, operand2)

Integer Operations on FP Exponents

UOP.124(operand1, operand2)

U2 Flag Bit Analysis

Based on observed patterns in code:

Execution Flow Pattern

Special Cases Handled

Key Insight

The U2.80 bit is the "architectural visibility" flag. Operations without this bit execute in a shadow computational domain where:

Only operations with U2.80 (or composite flags like U2.C9 containing it) can:

SYSENTER/SYSEXIT

The Pentium Pro implemented SYSENTER and SYSEXIT before Intel documented them. Operating systems such as Linux 2.6 later enabled these instructions based on the later documented Pentium II behavior, and Pentium Pro systems crashed.

SYSENTER in Pentium Pro is identical in effect on both chips: CS/SS/EIP/ESP load from the SYSENTER MSRs, CPL becomes 0, and it faults #GP(0) if IA32_SYSENTER_CS is 0. The two chips only disagree on SYSEXIT.

SYSEXIT on the Pentium Pro

cleanly at CPL 0, on the kernel stack, before anything else changes

Comparison to the Pentium II

The Pentium II SYSEXIT does not read DI, BX, or ESI at all. EIP is loaded from EDX, ESP from ECX, CS from (SYSENTER_CS & 0xFFFC) + 16, and SS from (SYSENTER_CS & 0xFFFC) + 24; CPL is set to 3. So: EIP comes from EDX on the Pentium II versus ESI on the Pentium Pro; CS and SS are computed from IA32_SYSENTER_CS on the Pentium II versus read directly from DI and BX on the Pentium Pro; ESP from ECX is the same on both. The Pentium II cannot load a null CS/SS unless IA32_SYSENTER_CS itself is misconfigured, since both are derived from it; the Pentium Pro has no such protection for SS. The Pentium II's SYSEXIT also ANDs an internal "SystemFlags" word with 0x1FF; the Pentium Pro's SYSEXIT never touches it.

Because a normal kernel leaves DI/BX/ESI full of leftover values from syscall argument handling, the Pentium Pro version silently uses that leftover data as CS/SS/EIP. This matches Intel's Pentium Pro erratum #82, "SYSENTER/SYSEXIT instructions can implicitly load null segment selector to SS and CS registers."

For CPUID detection: checking "family 6, model < 3, stepping < 3" under-excludes affected chips. Comparing the combined CPUID signature and requiring it to be >= 0x633 before trusting the documented behavior excludes every Pentium Pro in one comparison.

Pentium Pro checks DI for null and faults before committing CS/ESP/CPL; no equivalent check exists for BX on the Pentium Pro

Summary: Pentium Pro reads EIP/CS/SS from ESI/DI/BX; Pentium II computes CS/SS from IA32_SYSENTER_CS and reads EIP from EDX; ESP comes from ECX on both

Pentium II's SYSEXIT ANDs "SystemFlags" with 0x1FF; Pentium Pro's SYSEXIT never touches it; Pentium II's SYSENTER also masks it, with a different mask

Notes for further analysis

This project is an independent, unofficial work based on publicly available information and reverse-engineering research, and is not affiliated with, endorsed by, sponsored by, or associated with Intel Corporation or its affiliates. It is provided "as is", without warranty of any kind. The author assumes no responsibility or liability for any use, misuse, damage, data loss, hardware failure, or other consequences arising from its use. Intel, Pentium, Core and related trademarks are the property of their respective owners and are used solely for identification and informational purposes.
  • index page
  • uop description
  • ADC
  • ADD
  • AND
  • BSF
  • BSR
  • BSWAP
  • BTEST
  • DIV
  • FANDNOT
  • FCALCTW
  • FCMOV
  • FCOM
  • FMERGE
  • FMOV
  • FPEXTRACT
  • FPORDATATYPE
  • FPSIGNEXT
  • FREADROM
  • FXORS
  • IDIV
  • IMUL
  • INTEXTRACT
  • LEA
  • LOAD
  • MOVE
  • MOVEFROMCREG
  • MOVETOCREG
  • MUL
  • OR
  • PORTIN
  • PORTOUT
  • RCL
  • RCR
  • RDSEGFLD
  • ROL
  • ROR
  • SAL
  • SAR
  • SBC
  • SHL
  • SHR
  • SIGEVENT
  • STA
  • STRD
  • SUB
  • SUBR
  • TRANSPORTUIP
  • UOP
  • U_JCC
  • U_JMP
  • U_JMP_INDIR
  • WRSEGFLD
  • WUCONCAT
  • WUEXTRBK
  • WUINSERT
  • WUMERGE
  • XOR