v_div_fixup_f64 GPU Native ISA AMD Vector
V DIV FIXUP F64 Vector Arithmetic
v_div_fixup_f64
Given a double-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply…
Encoding
Verified bit-level encoding data is not yet available for this instruction.
The instruction-format classification below (VOP3)
is well-documented and stable; exact per-target opcode/field bit positions have not
yet been imported from a verified source.
Operands
Operand details have not yet been curated for this instruction.
GFX Target Compatibility
| Target | Support |
|---|---|
| gfx1100 | ✅ Supported |
This operation is the final step of a high precision division macro and handles all exceptional cases of division.
Related
More in Vector Arithmetic
Reference
AMDGPU / GFX ISA
Description
Given a double-precision float quotient in the first input, a denominator in the second input and a numerator in the third input, detect and apply corner cases related to division, including divide by zero, NaN inputs and overflow, and modify the quotient accordingly. Generate any invalid, denormal and divide-by-zero exceptions that are a result of the division. Store the modified quotient into a vector register. This operation handles corner cases in a division macro such as divide by zero and NaN inputs. This operation is well defined when the quotient is approximately equal to the numerator divided by the denominator. Other inputs produce a predictable result but may not be mathematically useful.
Semantics
sign_out = (sign(S1.f64) ^ sign(S2.f64));
if isNAN(S2.f64) then
D0.f64 = cvtToQuietNAN(S2.f64)
elsif isNAN(S1.f64) then
D0.f64 = cvtToQuietNAN(S1.f64)
elsif ((S1.f64 == 0.0) && (S2.f64 == 0.0)) then
// 0/0
D0.f64 = 64'F(0xfff8000000000000LL)
elsif ((abs(S1.f64) == +INF) && (abs(S2.f64) == +INF)) then
// inf/inf
D0.f64 = 64'F(0xfff8000000000000LL)
elsif ((S1.f64 == 0.0) || (abs(S2.f64) == +INF)) then
// x/0, or inf/y
D0.f64 = sign_out ? -INF : +INF
elsif ((abs(S1.f64) == +INF) || (S2.f64 == 0.0)) then
// x/inf, 0/y
D0.f64 = sign_out ? -0.0 : 0.0
elsif exponent(S2.f64) - exponent(S1.f64) < -1075 then
D0.f64 = sign_out ? -UNDERFLOW_F64 : UNDERFLOW_F64
elsif exponent(S1.f64) == 2047 then
D0.f64 = sign_out ? -OVERFLOW_F64 : OVERFLOW_F64
else
D0.f64 = sign_out ? -abs(S0.f64) : abs(S0.f64)
endif
Example
v_div_fixup_f64 v[5:6], v[1:2], v[2:3], v[3:4]A real instruction accepted by the LLVM assembler, taken verbatim from LLVM's own AMDGPU MC test suite (gfx11). Not from an AMD document, and not authored here.
Sources
- User Guide for AMDGPU Backend ↗ - LLVM Project
-
"AMD Instinct MI300" Instruction Set Architecture: Reference Guide ↗
- Advanced Micro Devices, Inc.
Reference Guide, page 344. - LLVM MC assembler tests for AMDGPU (gfx11) ↗ - LLVM Project