Lucas Ramirez 6206f5444f
[AMDGPU] Occupancy w.r.t. workgroup size range is also a range (#123748)
Occupancy (i.e., the number of waves per EU) depends, in addition to
register usage, on per-workgroup LDS usage as well as on the range of
possible workgroup sizes. Mirroring the latter, occupancy should
therefore be expressed as a range since different group sizes generally
yield different achievable occupancies.

`getOccupancyWithLocalMemSize` currently returns a scalar occupancy
based on the maximum workgroup size and LDS usage. With respect to the
workgroup size range, this scalar can be the minimum, the maximum, or
neither of the two of the range of achievable occupancies. This commit
fixes the function by making it compute and return the range of
achievable occupancies w.r.t. workgroup size and LDS usage; it also
renames it to `getOccupancyWithWorkGroupSizes` since it is the range of
workgroup sizes that produces the range of achievable occupancies.

Computing the achievable occupancy range is surprisingly involved.
Minimum/maximum workgroup sizes do not necessarily yield maximum/minimum
occupancies i.e., sometimes workgroup sizes inside the range yield the
occupancy bounds. The implementation finds these sizes in constant time;
heavy documentation explains the rationale behind the sometimes
relatively obscure calculations.

As a justifying example, consider a target with 10 waves / EU, 4 EUs/CU,
64-wide waves. Also consider a function with no LDS usage and a flat
workgroup size range of [513,1024].

- A group of 513 items requires 9 waves per group. Only 4 groups made up
of 9 waves each can fit fully on a CU at any given time, for a total of
36 waves on the CU, or 9 per EU. However, filling as much as possible
the remaining 40-36=4 wave slots without decreasing the number of groups
reveals that a larger group of 640 items yields 40 waves on the CU, or
10 per EU.
- Similarly, a group of 1024 items requires 16 waves per group. Only 2
groups made up of 16 waves each can fit fully on a CU ay any given time,
for a total of 32 waves on the CU, or 8 per EU. However, removing as
many waves as possible from the groups without being able to fit another
equal-sized group on the CU reveals that a smaller group of 896 items
yields 28 waves on the CU, or 7 per EU.

Therefore the achievable occupancy range for this function is not [8,9]
as the group size bounds directly yield, but [7,10].

Naturally this change causes a lot of test churn as instruction
scheduling is driven by achievable occupancy estimates. In most unit
tests the flat workgroup size range is the default [1,1024] which,
ignoring potential LDS limitations, would previously produce a scalar
occupancy of 8 (derived from 1024) on a lot of targets, whereas we now
consider the maximum occupancy to be 10 in such cases. Most tests are
updated automatically and checked manually for sanity. I also manually
changed some non-automatically generated assertions when necessary.

Fixes #118220.
2025-01-23 16:07:57 +01:00

1957 lines
102 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=tahiti -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX6 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=tahiti -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX6 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX8 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 -denormal-fp-math=ieee -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 -denormal-fp-math=preserve-sign -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11 %s
define double @v_fdiv_f64(double %a, double %b) {
; GFX6-LABEL: v_fdiv_f64:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v5
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_f64:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX8-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX8-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX8-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_f64:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX9-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX9-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX9-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_f64:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_f64:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv double %a, %b
ret double %fdiv
}
define double @v_fdiv_f64_afn(double %a, double %b) {
; GCN-LABEL: v_fdiv_f64_afn:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GCN-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GCN-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GCN-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GCN-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_f64_afn:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX10-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_f64_afn:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX11-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv afn double %a, %b
ret double %fdiv
}
define double @v_fdiv_f64_ulp25(double %a, double %b) {
; GFX6-LABEL: v_fdiv_f64_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v5
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_f64_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX8-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX8-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX8-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_f64_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX9-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX9-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX9-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_f64_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_f64_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv double %a, %b, !fpmath !0
ret double %fdiv
}
define double @v_rcp_f64(double %x) {
; GFX6-LABEL: v_rcp_f64:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX6-NEXT: v_mov_b32_e32 v10, 0x3ff00000
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v10
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v3
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX6-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_f64:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX8-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX8-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX8-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_f64:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX9-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX9-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX9-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_f64:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_f64:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv double 1.0, %x
ret double %fdiv
}
define double @v_rcp_f64_arcp(double %x) {
; GFX6-LABEL: v_rcp_f64_arcp:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX6-NEXT: v_mov_b32_e32 v10, 0x3ff00000
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v10
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v3
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX6-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_f64_arcp:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX8-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX8-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX8-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_f64_arcp:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX9-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX9-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX9-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_f64_arcp:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_f64_arcp:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp double 1.0, %x
ret double %fdiv
}
define double @v_rcp_f64_arcp_afn(double %x) {
; GCN-LABEL: v_rcp_f64_arcp_afn:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[2:3], v[0:1]
; GCN-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GCN-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GCN-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GCN-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GCN-NEXT: v_fma_f64 v[0:1], -v[0:1], v[2:3], 1.0
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[2:3]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_f64_arcp_afn:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[2:3], v[0:1]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[0:1], v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[2:3]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_f64_arcp_afn:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[2:3], v[0:1]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GFX11-NEXT: v_fma_f64 v[4:5], -v[0:1], v[2:3], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[2:3], v[4:5], v[2:3], v[2:3]
; GFX11-NEXT: v_fma_f64 v[0:1], -v[0:1], v[2:3], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[2:3]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp afn double 1.0, %x
ret double %fdiv
}
define double @v_rcp_f64_ulp25(double %x) {
; GFX6-LABEL: v_rcp_f64_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX6-NEXT: v_mov_b32_e32 v10, 0x3ff00000
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v10
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v3
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX6-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX6-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_f64_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX8-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX8-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX8-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX8-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_f64_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[2:3], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX9-NEXT: v_div_scale_f64 v[6:7], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], -v[2:3], v[4:5], 1.0
; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[8:9], v[4:5]
; GFX9-NEXT: v_mul_f64 v[8:9], v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[2:3], -v[2:3], v[8:9], v[6:7]
; GFX9-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[8:9]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_f64_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[2:3], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX10-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_f64_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[2:3], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[8:9], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[4:5], v[4:5], v[6:7], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[6:7], v[8:9], v[4:5]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], v[8:9]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[2:3], v[2:3], v[4:5], v[6:7]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[2:3], v[0:1], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv double 1.0, %x, !fpmath !0
ret double %fdiv
}
define double @v_fdiv_f64_afn_ulp25(double %a, double %b) {
; GCN-LABEL: v_fdiv_f64_afn_ulp25:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GCN-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GCN-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GCN-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GCN-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_f64_afn_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX10-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_f64_afn_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX11-NEXT: v_fma_f64 v[6:7], -v[2:3], v[4:5], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[4:5], v[6:7], v[4:5], v[4:5]
; GFX11-NEXT: v_mul_f64 v[6:7], v[0:1], v[4:5]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[2:3], v[6:7], v[0:1]
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[6:7]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv afn double %a, %b, !fpmath !0
ret double %fdiv
}
define double @v_fdiv_f64_arcp_ulp25(double %a, double %b) {
; GFX6-LABEL: v_fdiv_f64_arcp_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[0:1], v[2:3], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v5
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_f64_arcp_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX8-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX8-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX8-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX8-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_f64_arcp_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[2:3], v[2:3], v[0:1]
; GFX9-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX9-NEXT: v_div_scale_f64 v[8:9], vcc, v[0:1], v[2:3], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[4:5], v[6:7], 1.0
; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[10:11], v[6:7]
; GFX9-NEXT: v_mul_f64 v[10:11], v[8:9], v[6:7]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[10:11], v[8:9]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_f64_arcp_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[2:3], v[2:3], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX10-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_f64_arcp_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[2:3], v[2:3], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], vcc_lo, v[0:1], v[2:3], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX11-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_mul_f64 v[8:9], v[10:11], v[6:7]
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[8:9], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[8:9]
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[2:3], v[0:1]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp double %a, %b, !fpmath !0
ret double %fdiv
}
define <2 x double> @v_fdiv_v2f64(<2 x double> %a, <2 x double> %b) {
; GFX6-LABEL: v_fdiv_v2f64:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX6-NEXT: v_rcp_f64_e32 v[10:11], v[8:9]
; GFX6-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v19
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v5, v9
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v7, v15
; GFX6-NEXT: v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
; GFX6-NEXT: v_mul_f64 v[16:17], v[18:19], v[10:11]
; GFX6-NEXT: v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
; GFX6-NEXT: v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
; GFX6-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
; GFX6-NEXT: v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
; GFX6-NEXT: v_mul_f64 v[16:17], v[12:13], v[8:9]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v3, v13
; GFX6-NEXT: v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: s_nop 1
; GFX6-NEXT: v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_v2f64:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX8-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX8-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX8-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX8-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX8-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX8-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX8-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX8-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_v2f64:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX9-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX9-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX9-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX9-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX9-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX9-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX9-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX9-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
; GFX10-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX10-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX10-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX10-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX10-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
; GFX11-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX11-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX11-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX11-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv <2 x double> %a, %b
ret <2 x double> %fdiv
}
define <2 x double> @v_fdiv_v2f64_afn(<2 x double> %a, <2 x double> %b) {
; GCN-LABEL: v_fdiv_v2f64_afn:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GCN-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GCN-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GCN-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GCN-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GCN-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64_afn:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX10-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64_afn:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX11-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX11-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv afn <2 x double> %a, %b
ret <2 x double> %fdiv
}
define <2 x double> @v_fdiv_v2f64_ulp25(<2 x double> %a, <2 x double> %b) {
; GFX6-LABEL: v_fdiv_v2f64_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX6-NEXT: v_rcp_f64_e32 v[10:11], v[8:9]
; GFX6-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v19
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v5, v9
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v7, v15
; GFX6-NEXT: v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
; GFX6-NEXT: v_mul_f64 v[16:17], v[18:19], v[10:11]
; GFX6-NEXT: v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
; GFX6-NEXT: v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
; GFX6-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
; GFX6-NEXT: v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
; GFX6-NEXT: v_mul_f64 v[16:17], v[12:13], v[8:9]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v3, v13
; GFX6-NEXT: v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: s_nop 1
; GFX6-NEXT: v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_v2f64_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX8-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX8-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX8-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX8-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX8-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX8-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX8-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX8-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_v2f64_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX9-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX9-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX9-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX9-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX9-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX9-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX9-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX9-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
; GFX10-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX10-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX10-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX10-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX10-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
; GFX11-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX11-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX11-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX11-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv <2 x double> %a, %b, !fpmath !0
ret <2 x double> %fdiv
}
define <2 x double> @v_rcp_v2f64(<2 x double> %x) {
; GFX6-LABEL: v_rcp_v2f64:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_mov_b32_e32 v18, 0x3ff00000
; GFX6-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v18
; GFX6-NEXT: v_mul_f64 v[12:13], v[8:9], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v5
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_mul_f64 v[14:15], v[16:17], v[4:5]
; GFX6-NEXT: v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v17, v18
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
; GFX6-NEXT: s_nop 0
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_v2f64:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX8-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX8-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX8-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX8-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX8-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX8-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_v2f64:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX9-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX9-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX9-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX9-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX9-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX9-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_v2f64:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
; GFX10-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX10-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_v2f64:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
; GFX11-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX11-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX11-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv <2 x double> <double 1.0, double 1.0>, %x
ret <2 x double> %fdiv
}
define <2 x double> @v_rcp_v2f64_arcp(<2 x double> %x) {
; GFX6-LABEL: v_rcp_v2f64_arcp:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_mov_b32_e32 v18, 0x3ff00000
; GFX6-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v18
; GFX6-NEXT: v_mul_f64 v[12:13], v[8:9], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v5
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_mul_f64 v[14:15], v[16:17], v[4:5]
; GFX6-NEXT: v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v17, v18
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
; GFX6-NEXT: s_nop 0
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_v2f64_arcp:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX8-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX8-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX8-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX8-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX8-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX8-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_v2f64_arcp:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX9-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX9-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX9-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX9-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX9-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX9-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_v2f64_arcp:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
; GFX10-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX10-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_v2f64_arcp:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
; GFX11-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX11-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX11-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp <2 x double> <double 1.0, double 1.0>, %x
ret <2 x double> %fdiv
}
define <2 x double> @v_rcp_v2f64_arcp_afn(<2 x double> %x) {
; GCN-LABEL: v_rcp_v2f64_arcp_afn:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[4:5], v[0:1]
; GCN-NEXT: v_rcp_f64_e32 v[6:7], v[2:3]
; GCN-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GCN-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GCN-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GCN-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GCN-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GCN-NEXT: v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
; GCN-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], 1.0
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[4:5]
; GCN-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[6:7]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_v2f64_arcp_afn:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[4:5], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[6:7], v[2:3]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GFX10-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
; GFX10-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], 1.0
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[4:5]
; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[6:7]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_v2f64_arcp_afn:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[4:5], v[0:1]
; GFX11-NEXT: v_rcp_f64_e32 v[6:7], v[2:3]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GFX11-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[0:1], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[10:11], -v[2:3], v[6:7], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[4:5], v[8:9], v[4:5], v[4:5]
; GFX11-NEXT: v_fma_f64 v[6:7], v[10:11], v[6:7], v[6:7]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[0:1], v[4:5], 1.0
; GFX11-NEXT: v_fma_f64 v[2:3], -v[2:3], v[6:7], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[4:5], v[4:5]
; GFX11-NEXT: v_fma_f64 v[2:3], v[2:3], v[6:7], v[6:7]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp afn <2 x double> <double 1.0, double 1.0>, %x
ret <2 x double> %fdiv
}
define <2 x double> @v_rcp_v2f64_ulp25(<2 x double> %x) {
; GFX6-LABEL: v_rcp_v2f64_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX6-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[2:3], v[2:3], 1.0
; GFX6-NEXT: v_rcp_f64_e32 v[6:7], v[4:5]
; GFX6-NEXT: v_mov_b32_e32 v18, 0x3ff00000
; GFX6-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[8:9], v[6:7]
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], 1.0, v[0:1], 1.0
; GFX6-NEXT: v_fma_f64 v[12:13], -v[4:5], v[6:7], 1.0
; GFX6-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[6:7], v[6:7], v[12:13], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v9, v18
; GFX6-NEXT: v_mul_f64 v[12:13], v[8:9], v[6:7]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v1, v5
; GFX6-NEXT: v_fma_f64 v[8:9], -v[4:5], v[12:13], v[8:9]
; GFX6-NEXT: v_fma_f64 v[4:5], -v[10:11], v[14:15], 1.0
; GFX6-NEXT: v_div_scale_f64 v[16:17], s[6:7], 1.0, v[2:3], 1.0
; GFX6-NEXT: v_fma_f64 v[4:5], v[14:15], v[4:5], v[14:15]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_mul_f64 v[14:15], v[16:17], v[4:5]
; GFX6-NEXT: v_div_fmas_f64 v[6:7], v[8:9], v[6:7], v[12:13]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[10:11], v[14:15], v[16:17]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v17, v18
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v3, v11
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[6:7], v[0:1], 1.0
; GFX6-NEXT: s_nop 0
; GFX6-NEXT: v_div_fmas_f64 v[4:5], v[8:9], v[4:5], v[14:15]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[4:5], v[2:3], 1.0
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_rcp_v2f64_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX8-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX8-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX8-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX8-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX8-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX8-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX8-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX8-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX8-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX8-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX8-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX8-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX8-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_rcp_v2f64_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[4:5], s[4:5], v[0:1], v[0:1], 1.0
; GFX9-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[2:3], v[2:3], 1.0
; GFX9-NEXT: v_div_scale_f64 v[16:17], s[4:5], 1.0, v[2:3], 1.0
; GFX9-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX9-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX9-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX9-NEXT: v_div_scale_f64 v[12:13], vcc, 1.0, v[0:1], 1.0
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[14:15], -v[4:5], v[8:9], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[6:7], v[10:11], 1.0
; GFX9-NEXT: v_fma_f64 v[8:9], v[8:9], v[14:15], v[8:9]
; GFX9-NEXT: v_fma_f64 v[10:11], v[10:11], v[18:19], v[10:11]
; GFX9-NEXT: v_mul_f64 v[14:15], v[12:13], v[8:9]
; GFX9-NEXT: v_mul_f64 v[18:19], v[16:17], v[10:11]
; GFX9-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[12:13]
; GFX9-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[16:17]
; GFX9-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_rcp_v2f64_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[4:5], s4, v[0:1], v[0:1], 1.0
; GFX10-NEXT: v_div_scale_f64 v[6:7], s4, v[2:3], v[2:3], 1.0
; GFX10-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX10-NEXT: v_div_scale_f64 v[12:13], s4, 1.0, v[2:3], 1.0
; GFX10-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX10-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX10-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX10-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX10-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX10-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_rcp_v2f64_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[4:5], null, v[0:1], v[0:1], 1.0
; GFX11-NEXT: v_div_scale_f64 v[6:7], null, v[2:3], v[2:3], 1.0
; GFX11-NEXT: v_div_scale_f64 v[16:17], vcc_lo, 1.0, v[0:1], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[8:9], v[8:9], v[12:13], v[8:9]
; GFX11-NEXT: v_div_scale_f64 v[12:13], s0, 1.0, v[2:3], 1.0
; GFX11-NEXT: v_fma_f64 v[10:11], v[10:11], v[14:15], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[14:15], v[16:17], v[8:9]
; GFX11-NEXT: v_mul_f64 v[18:19], v[12:13], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[4:5], -v[4:5], v[14:15], v[16:17]
; GFX11-NEXT: v_fma_f64 v[6:7], -v[6:7], v[18:19], v[12:13]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[8:9], v[14:15]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[10:11], v[18:19]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[4:5], v[0:1], 1.0
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[6:7], v[2:3], 1.0
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv <2 x double> <double 1.0, double 1.0>, %x, !fpmath !0
ret <2 x double> %fdiv
}
define <2 x double> @v_fdiv_v2f64_afn_ulp25(<2 x double> %a, <2 x double> %b) {
; GCN-LABEL: v_fdiv_v2f64_afn_ulp25:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GCN-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GCN-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GCN-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GCN-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GCN-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64_afn_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX10-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64_afn_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX11-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX11-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv afn <2 x double> %a, %b, !fpmath !0
ret <2 x double> %fdiv
}
define <2 x double> @v_fdiv_v2f64_arcp_ulp25(<2 x double> %a, <2 x double> %b) {
; GFX6-LABEL: v_fdiv_v2f64_arcp_ulp25:
; GFX6: ; %bb.0:
; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX6-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX6-NEXT: v_div_scale_f64 v[14:15], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX6-NEXT: v_rcp_f64_e32 v[10:11], v[8:9]
; GFX6-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[0:1], v[4:5], v[0:1]
; GFX6-NEXT: v_rcp_f64_e32 v[16:17], v[14:15]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v1, v19
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v5, v9
; GFX6-NEXT: v_fma_f64 v[12:13], -v[8:9], v[10:11], 1.0
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: v_fma_f64 v[10:11], v[10:11], v[12:13], v[10:11]
; GFX6-NEXT: v_fma_f64 v[12:13], -v[14:15], v[16:17], 1.0
; GFX6-NEXT: v_cmp_eq_u32_e64 s[4:5], v7, v15
; GFX6-NEXT: v_fma_f64 v[12:13], v[16:17], v[12:13], v[16:17]
; GFX6-NEXT: v_mul_f64 v[16:17], v[18:19], v[10:11]
; GFX6-NEXT: v_fma_f64 v[18:19], -v[8:9], v[16:17], v[18:19]
; GFX6-NEXT: v_fma_f64 v[8:9], -v[14:15], v[12:13], 1.0
; GFX6-NEXT: v_div_fmas_f64 v[10:11], v[18:19], v[10:11], v[16:17]
; GFX6-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[12:13]
; GFX6-NEXT: v_div_scale_f64 v[12:13], s[6:7], v[2:3], v[6:7], v[2:3]
; GFX6-NEXT: v_div_fixup_f64 v[0:1], v[10:11], v[4:5], v[0:1]
; GFX6-NEXT: v_mul_f64 v[16:17], v[12:13], v[8:9]
; GFX6-NEXT: v_cmp_eq_u32_e32 vcc, v3, v13
; GFX6-NEXT: v_fma_f64 v[18:19], -v[14:15], v[16:17], v[12:13]
; GFX6-NEXT: s_xor_b64 vcc, vcc, s[4:5]
; GFX6-NEXT: s_nop 1
; GFX6-NEXT: v_div_fmas_f64 v[8:9], v[18:19], v[8:9], v[16:17]
; GFX6-NEXT: v_div_fixup_f64 v[2:3], v[8:9], v[6:7], v[2:3]
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
; GFX8-LABEL: v_fdiv_v2f64_arcp_ulp25:
; GFX8: ; %bb.0:
; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX8-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX8-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX8-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX8-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX8-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX8-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX8-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX8-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX8-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX8-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX8-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX8-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX8-NEXT: s_mov_b64 vcc, s[4:5]
; GFX8-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX8-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX8-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX8-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX8-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX8-NEXT: s_setpc_b64 s[30:31]
;
; GFX9-LABEL: v_fdiv_v2f64_arcp_ulp25:
; GFX9: ; %bb.0:
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX9-NEXT: v_div_scale_f64 v[8:9], s[4:5], v[4:5], v[4:5], v[0:1]
; GFX9-NEXT: v_div_scale_f64 v[10:11], s[4:5], v[6:7], v[6:7], v[2:3]
; GFX9-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX9-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX9-NEXT: v_div_scale_f64 v[18:19], vcc, v[0:1], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX9-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX9-NEXT: v_fma_f64 v[16:17], -v[10:11], v[14:15], 1.0
; GFX9-NEXT: v_fma_f64 v[14:15], v[14:15], v[16:17], v[14:15]
; GFX9-NEXT: v_mul_f64 v[16:17], v[18:19], v[12:13]
; GFX9-NEXT: v_fma_f64 v[8:9], -v[8:9], v[16:17], v[18:19]
; GFX9-NEXT: v_div_scale_f64 v[18:19], s[4:5], v[2:3], v[6:7], v[2:3]
; GFX9-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[16:17]
; GFX9-NEXT: s_mov_b64 vcc, s[4:5]
; GFX9-NEXT: v_mul_f64 v[20:21], v[18:19], v[14:15]
; GFX9-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX9-NEXT: v_fma_f64 v[10:11], -v[10:11], v[20:21], v[18:19]
; GFX9-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[20:21]
; GFX9-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX9-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64_arcp_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_div_scale_f64 v[8:9], s4, v[4:5], v[4:5], v[0:1]
; GFX10-NEXT: v_div_scale_f64 v[10:11], s4, v[6:7], v[6:7], v[2:3]
; GFX10-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX10-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX10-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX10-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX10-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX10-NEXT: v_div_scale_f64 v[16:17], s4, v[2:3], v[6:7], v[2:3]
; GFX10-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX10-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX10-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX10-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX10-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX10-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX10-NEXT: s_mov_b32 vcc_lo, s4
; GFX10-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX10-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX10-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64_arcp_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_div_scale_f64 v[8:9], null, v[4:5], v[4:5], v[0:1]
; GFX11-NEXT: v_div_scale_f64 v[10:11], null, v[6:7], v[6:7], v[2:3]
; GFX11-NEXT: v_div_scale_f64 v[20:21], vcc_lo, v[0:1], v[4:5], v[0:1]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_rcp_f64_e32 v[12:13], v[8:9]
; GFX11-NEXT: v_rcp_f64_e32 v[14:15], v[10:11]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[16:17], -v[8:9], v[12:13], 1.0
; GFX11-NEXT: v_fma_f64 v[18:19], -v[10:11], v[14:15], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX11-NEXT: v_fma_f64 v[12:13], v[12:13], v[16:17], v[12:13]
; GFX11-NEXT: v_div_scale_f64 v[16:17], s0, v[2:3], v[6:7], v[2:3]
; GFX11-NEXT: v_fma_f64 v[14:15], v[14:15], v[18:19], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[18:19], v[20:21], v[12:13]
; GFX11-NEXT: v_mul_f64 v[22:23], v[16:17], v[14:15]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], -v[8:9], v[18:19], v[20:21]
; GFX11-NEXT: v_fma_f64 v[10:11], -v[10:11], v[22:23], v[16:17]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[12:13], v[18:19]
; GFX11-NEXT: s_mov_b32 vcc_lo, s0
; GFX11-NEXT: v_div_fmas_f64 v[10:11], v[10:11], v[14:15], v[22:23]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_div_fixup_f64 v[0:1], v[8:9], v[4:5], v[0:1]
; GFX11-NEXT: v_div_fixup_f64 v[2:3], v[10:11], v[6:7], v[2:3]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv arcp <2 x double> %a, %b, !fpmath !0
ret <2 x double> %fdiv
}
define <2 x double> @v_fdiv_v2f64_arcp_afn_ulp25(<2 x double> %a, <2 x double> %b) {
; GCN-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
; GCN: ; %bb.0:
; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GCN-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GCN-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GCN-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GCN-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GCN-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GCN-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GCN-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GCN-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GCN-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GCN-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GCN-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GCN-NEXT: s_setpc_b64 s[30:31]
;
; GFX10-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
; GFX10: ; %bb.0:
; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX10-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX10-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX10-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX10-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX10-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX10-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX10-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX10-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX10-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX10-NEXT: s_setpc_b64 s[30:31]
;
; GFX11-LABEL: v_fdiv_v2f64_arcp_afn_ulp25:
; GFX11: ; %bb.0:
; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX11-NEXT: v_rcp_f64_e32 v[8:9], v[4:5]
; GFX11-NEXT: v_rcp_f64_e32 v[10:11], v[6:7]
; GFX11-NEXT: s_waitcnt_depctr 0xfff
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[12:13], -v[4:5], v[8:9], 1.0
; GFX11-NEXT: v_fma_f64 v[14:15], -v[6:7], v[10:11], 1.0
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[8:9], v[12:13], v[8:9], v[8:9]
; GFX11-NEXT: v_fma_f64 v[10:11], v[14:15], v[10:11], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_mul_f64 v[12:13], v[0:1], v[8:9]
; GFX11-NEXT: v_mul_f64 v[14:15], v[2:3], v[10:11]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], -v[4:5], v[12:13], v[0:1]
; GFX11-NEXT: v_fma_f64 v[2:3], -v[6:7], v[14:15], v[2:3]
; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX11-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[12:13]
; GFX11-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[14:15]
; GFX11-NEXT: s_setpc_b64 s[30:31]
%fdiv = fdiv afn arcp <2 x double> %a, %b, !fpmath !0
ret <2 x double> %fdiv
}
!0 = !{float 2.500000e+00}