<h5>Syntax:</h5>
<pre>
- <result> = fadd <ty> <op1>, <op2> <i>; yields {ty}:result</i>
+ <result> = fadd [fast-math flags]* <ty> <op1>, <op2> <i>; yields {ty}:result</i>
</pre>
<h5>Overview:</h5>
floating point values. Both arguments must have identical types.</p>
<h5>Semantics:</h5>
-<p>The value produced is the floating point sum of the two operands.</p>
+<p>The value produced is the floating point sum of the two operands. This
+ instruction can also take any number of fast-math flags, which are
+ optimization hints to enable otherwise unsafe floating point
+ optimizations:</p>
+<ol>
+
+ <li><tt>nnan</tt>: No NaNs - Allow optimizations to assume the arguments and
+ result are not NaN. Such optimizations are required to retain defined behavior
+ over NaNs, but the value of the result is undefined.</li>
+
+ <li><tt>ninf</tt>: No Inf - Allow optimizations to assume the arguments and
+ result are not +/-Inf. Such optimizations are required to retain defined
+ behavior over +/-Inf, but the value of the result is undefined.</li>
+
+ <li><tt>nsz</tt>: No Signed Zeros: Allow optimizations to treat the
+ sign of a zero argument or result as insignificant. </li>
+
+ <li><tt>fast</tt>: Allow algebraically equivalent transformations that may
+ dramatically change results in floating point (e.g. reassociate). This flag
+ implies all the others.</li>
+
+</ol>
<h5>Example:</h5>
<pre>
<h5>Syntax:</h5>
<pre>
- <result> = fsub <ty> <op1>, <op2> <i>; yields {ty}:result</i>
+ <result> = fsub [fast-math flags]* <ty> <op1>, <op2> <i>; yields {ty}:result</i>
</pre>
<h5>Overview:</h5>
floating point values. Both arguments must have identical types.</p>
<h5>Semantics:</h5>
-<p>The value produced is the floating point difference of the two operands.</p>
+<p>The value produced is the floating point difference of the two operands. This
+ instruction can also take any number of fast-math flags, which are
+ optimization hints to enable otherwise unsafe floating point
+ optimizations:</p>
+<ol>
+
+ <li><tt>nnan</tt>: No NaNs - Allow optimizations to assume the arguments and
+ result are not NaN. Such optimizations are required to retain defined behavior
+ over NaNs, but the value of the result is undefined.</li>
+
+ <li><tt>ninf</tt>: No Inf - Allow optimizations to assume the arguments and
+ result are not +/-Inf. Such optimizations are required to retain defined
+ behavior over +/-Inf, but the value of the result is undefined.</li>
+
+ <li><tt>nsz</tt>: No Signed Zeros: Allow optimizations to treat the
+ sign of a zero argument or result as insignificant. </li>
+
+ <li><tt>fast</tt>: Allow algebraically equivalent transformations that may
+ dramatically change results in floating point (e.g. reassociate). This flag
+ implies all the others.</li>
+
+</ol>
<h5>Example:</h5>
<pre>
<h5>Syntax:</h5>
<pre>
- <result> = fmul <ty> <op1>, <op2> <i>; yields {ty}:result</i>
+ <result> = fmul [fast-math flags]* <ty> <op1>, <op2> <i>; yields {ty}:result</i>
</pre>
<h5>Overview:</h5>
floating point values. Both arguments must have identical types.</p>
<h5>Semantics:</h5>
-<p>The value produced is the floating point product of the two operands.</p>
+<p>The value produced is the floating point product of the two operands. This
+ instruction can also take any number of fast-math flags, which are
+ optimization hints to enable otherwise unsafe floating point
+ optimizations:</p>
+<ol>
+
+ <li><tt>nnan</tt>: No NaNs - Allow optimizations to assume the arguments and
+ result are not NaN. Such optimizations are required to retain defined behavior
+ over NaNs, but the value of the result is undefined.</li>
+
+ <li><tt>ninf</tt>: No Inf - Allow optimizations to assume the arguments and
+ result are not +/-Inf. Such optimizations are required to retain defined
+ behavior over +/-Inf, but the value of the result is undefined.</li>
+
+ <li><tt>nsz</tt>: No Signed Zeros: Allow optimizations to treat the
+ sign of a zero argument or result as insignificant. </li>
+
+ <li><tt>fast</tt>: Allow algebraically equivalent transformations that may
+ dramatically change results in floating point (e.g. reassociate). This flag
+ implies all the others.</li>
+
+</ol>
<h5>Example:</h5>
<pre>
<h5>Syntax:</h5>
<pre>
- <result> = fdiv <ty> <op1>, <op2> <i>; yields {ty}:result</i>
+ <result> = fdiv [fast-math flags]* <ty> <op1>, <op2> <i>; yields {ty}:result</i>
</pre>
<h5>Overview:</h5>
floating point values. Both arguments must have identical types.</p>
<h5>Semantics:</h5>
-<p>The value produced is the floating point quotient of the two operands.</p>
+<p>The value produced is the floating point quotient of the two operands. This
+ instruction can also take any number of fast-math flags, which are
+ optimization hints to enable otherwise unsafe floating point
+ optimizations:</p>
+<ol>
+
+ <li><tt>nnan</tt>: No NaNs - Allow optimizations to assume the arguments and
+ result are not NaN. Such optimizations are required to retain defined behavior
+ over NaNs, but the value of the result is undefined.</li>
+
+ <li><tt>ninf</tt>: No Inf - Allow optimizations to assume the arguments and
+ result are not +/-Inf. Such optimizations are required to retain defined
+ behavior over +/-Inf, but the value of the result is undefined.</li>
+
+ <li><tt>nsz</tt>: No Signed Zeros: Allow optimizations to treat the
+ sign of a zero argument or result as insignificant. </li>
+
+ <li><tt>arcp</tt>: Allow Reciprocal: Allow optimizations to use the reciprocal
+ of an argument rather than perform division. </li>
+
+ <li><tt>fast</tt>: Allow algebraically equivalent transformations that may
+ dramatically change results in floating point (e.g. reassociate). This flag
+ implies all the others.</li>
+
+</ol>
+</p>
<h5>Example:</h5>
<pre>
<h5>Syntax:</h5>
<pre>
- <result> = frem <ty> <op1>, <op2> <i>; yields {ty}:result</i>
+ <result> = frem [fast-math flags]* <ty> <op1>, <op2> <i>; yields {ty}:result</i>
</pre>
<h5>Overview:</h5>
floating point values. Both arguments must have identical types.</p>
<h5>Semantics:</h5>
-<p>This instruction returns the <i>remainder</i> of a division. The remainder
- has the same sign as the dividend.</p>
+ <p>This instruction returns the <i>remainder</i> of a division. The remainder
+ has the same sign as the dividend. This instruction can also take any number
+ of fast-math flags, which are optimization hints to enable otherwise unsafe
+ floating point optimizations:</p>
+
+<ol>
+
+ <li><tt>nnan</tt>: No NaNs - Allow optimizations to assume the arguments and
+ result are not NaN. Such optimizations are required to retain defined behavior
+ over NaNs, but the value of the result is undefined.</li>
+
+ <li><tt>ninf</tt>: No Inf - Allow optimizations to assume the arguments and
+ result are not +/-Inf. Such optimizations are required to retain defined
+ behavior over +/-Inf, but the value of the result is undefined.</li>
+
+ <li><tt>nsz</tt>: No Signed Zeros: Allow optimizations to treat the
+ sign of a zero argument or result as insignificant. </li>
+
+ <li><tt>arcp</tt>: Allow Reciprocal: Allow optimizations to use the reciprocal
+ of an argument rather than perform division. </li>
+
+ <li><tt>fast</tt>: Allow algebraically equivalent transformations that may
+ dramatically change results in floating point (e.g. reassociate). This flag
+ implies all the others.</li>
+
+</ol>
<h5>Example:</h5>
<pre>