FADD, FADDP, FIADD
Añadir
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
D8 /0 | FADD m32fp | Valido | Valido | Añadir m32fp a ST(0) y almacenar resultado en ST(0). | |
DC /0 | FADD m64fp | Valido | Valido | Añadir m64fp a ST(0) y almacenar resultado en ST(0). | |
D8 C0+i | FADD ST(0), ST(i) | Valido | Valido | Añadir ST(0) a ST(i) y almacenar el resultado en ST(0). | |
DC C0+i | FADD ST(i), ST(0) | Valido | Valido | Añadir ST(i) a ST(0) y almacenar el resultado en ST(i). | |
DE C0+i | FADDP ST(i), ST(0) | Valido | Valido | Añadir ST(0) a ST(i), almacenar el resultado en ST(i), y abrir el registro de la pila. | |
DE C1 | FADDP | Valido | Valido | Añadir ST(0) a ST(1), almacenar resultado en ST(1), y abrir la pila de registro. | |
DA /0 | FIADD m32int | Valido | Valido | Añadir m32int a ST(0) y almacenar resultado en ST(0). | |
DE /0 | FIADD m16int | Valido | Valido | Añ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 | - | -F | SRC | SRC | +/- F or | +/- | 0 | + | Nan |
|---|---|---|---|---|---|---|---|---|---|
| -0 | - | DEST | -0 | +/-0 | DEST | + | Na | N |
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. |
#NM | CR0.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. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#NM | CR0.EM[bit 2] o CR0.TS[bit 3] = 1. |
#UD | Si 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. |
#NM | CR0.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. |
#UD | Si 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. |
#NM | CR0.EM[bit 2] o CR0.TS[bit 3] = 1. |
#MF | Si 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. |
#UD | Si se utiliza el prefijo LOCK. |