FCOM, FCOMP, FCOMPP

Compare valores en coma flotante

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
D8 /2FCOM m32fpValidoValidoCompare ST(0) con m32fp.
DC /2FCOM m64fpValidoValidoCompare ST(0) con m64fp.
D8 D0+iFCOM ST(i)ValidoValidoCompare ST(0) con ST(i).
D8 D1FCOMValidoValidoCompare ST(0) con ST(1).
D8 /3FCOMP m32fpValidoValidoCompare ST(0) con m32fp y la pila de registro pop.
DC /3FCOMP m64fpValidoValidoCompare ST(0) con m64fp y la pila de registro pop.
D8 D8+iFCOMP ST(i)ValidoValidoCompare ST(0) con ST(i) y la pila de registro pop.
D8 D9FCOMPValidoValidoCompare ST(0) con ST(1) y la pila de registro pop.
DE D9FCOMPPValidoValidoCompare ST(0) con ST(1) y la pila de registro pop dos veces.

Coste medido

Cargando las mediciones de arch-data...

Descripción

Compara el contenido del registro ST(0) y el valor fuente y establece las banderas de código de condiciones C0, C2, y C3 en la palabra estado FPU según los resultados (ver la tabla abajo). El operando de origen puede ser un registro de datos o una ubicación de memoria. Si no se da operando de origen, el valor en ST(0) se compara con el valor en ST(1). El signo de cero es ignorado, por lo que 0.0 es igual a +0.0.

FCOM/FCOMP/FCOMPP Resultados

EstadoC3C2C0
ST(0) > SRC000
ST(0) < SRC001
ST(0) = SRC100
Sin autorización*111

Operación

CASE (relation of operands) OF

    ST > SRC:  C3, C2, C0 := 000;

    ST < SRC:  C3, C2, C0 := 001;

    ST = SRC:  C3, C2, C0 := 100;

ESAC;

IF ST(0) or SRC = NaN or unsupported format

    THEN

          #IA

        IF FPUControlWord.IM = 1

                THEN

                      C3, C2, C0 := 111;

          FI;

FI;

IF Instruction = FCOMP

    THEN

          PopRegisterStack;

FI;

IF Instruction = FCOMPP

    THEN
          PopRegisterStack;
          PopRegisterStack;

FI;

FPU Flags Affected

C1                  Set to 0.

C0, C2, C3          See table on previous page.

Excepciones coma flotante

#IS                 Stack underflow occurred.
#IA                 One or both operands are NaN values or have unsupported formats.

El registro está marcado vacío.

#D                  One or both operands are denormal values.

Excepciones

Modo protegido
#GP(0)Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS contiene un NULL selector de segmento.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#NMCR0.EM[bit 2] o CR0.TS[bit 3] = 1. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#NMCR0.EM[bit 2] o CR0.TS[bit 3] = 1.
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#GP(0)Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#NMCR0.EM[bit 2] o CR0.TS[bit 3] = 1. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada.
#UDSi se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica.
#GP(0)Si la dirección de memoria está en forma no canónica.
#NMCR0.EM[bit 2] o CR0.TS[bit 3] = 1.
#MFSi hay una excepción x87 FPU pendiente. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.

Fuentes