fprem
Partial Remainder
Computes remainder of ST(0) / ST(1).
Pseudocode Operation
quotient ← ST(0) ÷ ST(1);
remainder ← ST(0) - (rounded_quotient × ST(1));
ST(0) ← remainder;
C0, C1, C2, C3 ← encode_quotient_and_status(quotient, remainder);
Encoding
Operands
Related
More in x87 FPU
Reference
Instruction Forms
| Opcode | Instruction | Op/En | 64/32-bit Mode | CPUID | Description |
|---|---|---|---|---|---|
| D9 F8 | FPREM | Valid Valid | Replace ST(0) with the remainder obtained from dividing ST(0) by ST(1). |
Description
Computes the remainder obtained from dividing the value in the ST(0) register (the dividend) by the value in the ST(1) register (the divisor or modulus), and stores the result in ST(0). The remainder represents the following value: Remainder := ST(0) - (Q ∗ ST(1)) Here, Q is an integer value that is obtained by truncating the floating-point number quotient of [ST(0) / ST(1)] toward zero. The sign of the remainder is the same as the sign of the dividend. The magnitude of the remainder is less than that of the modulus, unless a partial remainder was computed (as described below). This instruction produces an exact result; the inexact-result exception does not occur and the rounding control has no effect. The following table shows the results obtained when computing the remainder of various classes of numbers, assuming that underflow does not occur. Table 3-33. FPREM Results ST(1)
-∞ -F -0 +0 +F +∞ NaN -∞ * * * * * * NaN ST(0) -F ST(0) -F or -0 * * -F or -0 ST(0) NaN -0 -0 -0 * * -0 -0 NaN +0 +0 +0 * * +0 +0 NaN +F ST(0) +F or +0 * * +F or +0 ST(0) NaN +∞ * * * * * * NaN NaN NaN NaN NaN NaN NaN NaN NaN
Operation
D := exponent(ST(0)) - exponent(ST(1)); IF D < 64 THEN Q := Integer(TruncateTowardZero(ST(0) / ST(1))); ST(0) := ST(0) - (ST(1) ∗ Q); C2 := 0; C0, C3, C1 := LeastSignificantBits(Q); (* Q2, Q1, Q0 *) ELSE C2 := 1; N := An implementation-dependent number between 32 and 63; QQ := Integer(TruncateTowardZero((ST(0) / ST(1)) / 2(D - N))); ST(0) := ST(0) - (ST(1) ∗ QQ ∗ 2(D - N)); FI;