FADD, FADDP, FIADD

Añadir

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
D8 /0FADD m32fpValidoValidoAñadir m32fp a ST(0) y almacenar resultado en ST(0).
DC /0FADD m64fpValidoValidoAñadir m64fp a ST(0) y almacenar resultado en ST(0).
D8 C0+iFADD ST(0), ST(i)ValidoValidoAñadir ST(0) a ST(i) y almacenar el resultado en ST(0).
DC C0+iFADD ST(i), ST(0)ValidoValidoAñadir ST(i) a ST(0) y almacenar el resultado en ST(i).
DE C0+iFADDP ST(i), ST(0)ValidoValidoAñadir ST(0) a ST(i), almacenar el resultado en ST(i), y abrir el registro de la pila.
DE C1FADDPValidoValidoAñadir ST(0) a ST(1), almacenar resultado en ST(1), y abrir la pila de registro.
DA /0FIADD m32intValidoValidoAñadir m32int a ST(0) y almacenar resultado en ST(0).
DE /0FIADD m16intValidoValidoAñadir m16int a ST(0) y almacenar resultado en ST(0).

Coste medido

Cargando las mediciones de arch-data...

Descripción

Añade el destino y operandos de origen y almacena la suma en la ubicación de destino. El operando de destino es siempre un registro FPU; el operando de origen puede ser un registro o una ubicación de memoria. Operandos de origen en memoria puede estar en forma de precisión simple o coma flotante de precisión doble o en formato de palabra o doble palabra.

La versión no-operando de la instrucción agrega el contenido del registro ST(0) al registro ST(1). La versión oneoperand añade el contenido de una ubicación de memoria (ya sea una coma flotante o un valor entero) al contenido del registro ST(0). La versión dos-operando, añade el contenido del registro ST(0) al registro ST(i) o viceversa. El valor en ST(0) se puede duplicar mediante codificación:

FADD ST(0), ST(0);

Las instrucciones FADDP realizan el funcionamiento adicional de la pila de registro FPU después de almacenar el resultado. Para abrir la pila de registro, el procesador marca el registro ST(0) como vacío y aumenta el puntero de pila (TOP) por 1. (La versión no-operando de la coma flotante añadir instrucciones siempre resulta en la pila de registro que se está cayendo. En algunos ensambladores, la mnemónica para esta instrucción es FADD en lugar de FADDP.)

Las instrucciones FIADD convierten un integer operando de origen a formato coma flotante de doble precisión antes de realizar la adición.

La tabla de la siguiente página muestra los resultados obtenidos al agregar varias clases de números, asumiendo que no se produce desbordamiento ni desbordamiento.

Cuando la suma de dos operandos con signos opuestos es 0, el resultado es +0, excepto por el modo redondo hacia -, en cuyo caso el resultado es -0. Cuando el operando de origen es un entero 0, se trata como un +0.

Cuando ambos operando son infinitos del mismo signo, el resultado es del signo esperado. Si ambos operandos son infinidades de signos opuestos, se genera una excepción de cooperación inválida. Véase el cuadro 3-20.

FADD/FADDP/FIADD Resultados

- F or - I--FSRCSRC+/- F or+/-0+Nan
-0-DEST-0+/-0DEST+NaN

Operación

IF Instruction = FIADD

    THEN
          DEST := DEST + ConvertToDoubleExtendedPrecisionFP(SRC);

    ELSE (* Source operand is floating-point value *)
          DEST := DEST + SRC;

FI;

IF Instruction = FADDP

    THEN
          PopRegisterStack;

FI;

FPU Flags Affected

C1                      Set to 0 if stack underflow occurred.

                        Set if result was rounded up; cleared otherwise.

C0, C2, C3              Undefined.

Excepciones coma flotante

#IS                     Stack underflow occurred.
#IA                     Operand is an SNaN value or unsupported format.

Operandos son infinitos de signo diferente.

#D                      Source operand is a denormal value.
#U                      Result is too small for destination format.
#O                      Result is too large for destination format.
#P                      Value cannot be represented exactly in destination format.

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