Convert "denormal-fp-math" and "denormal-fp-math-f32" into a first class denormal_fpenv attribute. Previously the query for the effective denormal mode involved two string attribute queries with parsing. I'm introducing more uses of this, so it makes sense to convert this to a more efficient encoding. The old representation was also awkward since it was split across two separate attributes. The new encoding just stores the default and float modes as bitfields, largely avoiding the need to consider if the other mode is set. The syntax in the common cases looks like this: `denormal_fpenv(preservesign,preservesign)` `denormal_fpenv(float: preservesign,preservesign)` `denormal_fpenv(dynamic,dynamic float: preservesign,preservesign)` I wasn't sure about reusing the float type name instead of adding a new keyword. It's parsed as a type but only accepts float. I'm also debating switching the name to subnormal to match the current preferred IEEE terminology (also used by nofpclass and other contexts). This has a behavior change when using the command flag debug options to set the denormal mode. The behavior of the flag ignored functions with an explicit attribute set, per the default and f32 version. Now that these are one attribute, the flag logic can't distinguish which of the two components were explicitly set on the function. Only one test appeared to rely on this behavior, so I just avoided using the flags in it. This also does not perform all the code cleanups this enables. In particular the attributor handling could be cleaned up. I also guessed at how to support this in MLIR. I followed MemoryEffects as a reference; it appears bitfields are expanded into arguments to attributes, so the representation there is a bit uglier with the 2 2-element fields flattened into 4 arguments.
1324 lines
52 KiB
LLVM
1324 lines
52 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=CHECK,SDAG %s
|
|
; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=CHECK,GISEL %s
|
|
|
|
; TODO: Switch test to use -new-reg-bank-select after adding G_FCANONICALIZE support.
|
|
|
|
; Test that fneg is folded into source modifiers when it wasn't
|
|
; possible to fold fsub to fneg without context.
|
|
|
|
define float @no_fold_f32_fsub_into_fneg_modifier_ieee_pos1(float %v0, float %v1) #0 {
|
|
; CHECK-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_pos1:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; CHECK-NEXT: v_sub_f32_e32 v0, 1.0, v0
|
|
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float 1.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @no_fold_f32_fsub_into_fneg_modifier_daz_pos1(float %v0, float %v1) #1 {
|
|
; CHECK-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_pos1:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; CHECK-NEXT: v_sub_f32_e32 v0, 1.0, v0
|
|
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float 1.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @no_fold_f32_fsub_into_fneg_modifier_ieee_commuted(float %v0, float %v1) #0 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_commuted:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_add_f32_e32 v0, 0, v0
|
|
; SDAG-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_ieee_commuted:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_subrev_f32_e32 v0, 0x80000000, v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float %v0, -0.0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_ieee_pos0(float %v0, float %v1) #0 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_pos0:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_pos0:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_sub_f32_e32 v0, 0, v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float 0.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_daz_pos0(float %v0, float %v1) #1 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz_pos0:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz_pos0:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_sub_f32_e32 v0, 0, v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float 0.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @no_fold_f32_fsub_into_fneg_modifier_daz_commuted(float %v0, float %v1) #1 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_commuted:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_add_f32_e32 v0, 0, v0
|
|
; SDAG-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_daz_commuted:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_subrev_f32_e32 v0, 0x80000000, v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float %v0, -0.0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_ieee(float %v0, float %v1) #0 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_daz(float %v0, float %v1) #1 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_ieee_nsz(float %v0, float %v1) #0 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_ieee_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz float -0.0, %v0
|
|
%mul = fmul nsz float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_daz_nsz(float %v0, float %v1) #1 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_daz_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_daz_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz float -0.0, %v0
|
|
%mul = fmul nsz float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_dynamic(float %v0, float %v1) #2 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = fmul float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_fsub_into_fneg_modifier_dynamic_nsz(float %v0, float %v1) #2 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz float -0.0, %v0
|
|
%mul = fmul nsz float %sub, %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_ieee(<2 x float> %v0, <2 x float> %v1) #0 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_daz(<2 x float> %v0, <2 x float> %v1) #1 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_ieee_nsz(<2 x float> %v0, <2 x float> %v1) #0 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_ieee_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul nsz <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_daz_nsz(<2 x float> %v0, <2 x float> %v1) #1 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_daz_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul nsz <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_dynamic(<2 x float> %v0, <2 x float> %v1) #2 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
define <2 x float> @fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz(<2 x float> %v0, <2 x float> %v1) #2 {
|
|
; SDAG-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f32_e64 v0, -v0, v2
|
|
; SDAG-NEXT: v_mul_f32_e64 v1, -v1, v3
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f32_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_mul_f32_e32 v0, v0, v2
|
|
; GISEL-NEXT: v_mul_f32_e32 v1, v1, v3
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x float> <float -0.0, float -0.0>, %v0
|
|
%mul = fmul nsz <2 x float> %sub, %v1
|
|
ret <2 x float> %mul
|
|
}
|
|
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_ieee(half %v0, half %v1) #0 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = fmul half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_daz(half %v0, half %v1) #1 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = fmul half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_ieee_nsz(half %v0, half %v1) #0 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_ieee_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_ieee_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz half -0.0, %v0
|
|
%mul = fmul nsz half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_daz_nsz(half %v0, half %v1) #1 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_daz_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_daz_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz half -0.0, %v0
|
|
%mul = fmul nsz half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_dynamic(half %v0, half %v1) #2 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = fmul half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @fold_f16_fsub_into_fneg_modifier_dynamic_nsz(half %v0, half %v1) #2 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f16_e64 v0, -v0, v1
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mul_f16_e32 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz half -0.0, %v0
|
|
%mul = fmul nsz half %sub, %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_ieee(<2 x half> %v0, <2 x half> %v1) #0 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_daz(<2 x half> %v0, <2 x half> %v1) #1 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_ieee_nsz(<2 x half> %v0, <2 x half> %v1) #0 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_ieee_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul nsz <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_daz_nsz(<2 x half> %v0, <2 x half> %v1) #1 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_daz_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul nsz <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_dynamic(<2 x half> %v0, <2 x half> %v1) #2 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz(<2 x half> %v0, <2 x half> %v1) #2 {
|
|
; SDAG-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_pk_mul_f16 v0, v0, v1 neg_lo:[1,0] neg_hi:[1,0]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_pk_max_f16 v0, v0, v0 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_pk_mul_f16 v0, v0, v1
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = fmul nsz <2 x half> %sub, %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_ieee(double %v0, double %v1) #0 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = fmul double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_daz(double %v0, double %v1) #1 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = fmul double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_ieee_nsz(double %v0, double %v1) #0 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_ieee_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_ieee_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz double -0.0, %v0
|
|
%mul = fmul nsz double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_daz_nsz(double %v0, double %v1) #1 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_daz_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_daz_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz double -0.0, %v0
|
|
%mul = fmul nsz double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_dynamic(double %v0, double %v1) #2 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = fmul double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @fold_f64_fsub_into_fneg_modifier_dynamic_nsz(double %v0, double %v1) #2 {
|
|
; SDAG-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_fsub_into_fneg_modifier_dynamic_nsz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], v[0:1], v[0:1]
|
|
; GISEL-NEXT: v_mul_f64 v[0:1], -v[0:1], v[2:3]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub nsz double -0.0, %v0
|
|
%mul = fmul nsz double %sub, %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define float @fold_f32_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, float %v0, float %v1) #0 {
|
|
; SDAG-LABEL: fold_f32_select_user_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, v2, -v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_select_user_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = select i1 %cond, float %sub, float %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @no_fold_f32_select_user_fsub_into_fneg_modifier_daz(i1 %cond, float %v0, float %v1) #1 {
|
|
; SDAG-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_sub_f32_e32 v1, 0x80000000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = select i1 %cond, float %sub, float %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define float @no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, float %v0, float %v1) #2 {
|
|
; SDAG-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_sub_f32_e32 v1, 0x80000000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f32_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%mul = select i1 %cond, float %sub, float %v1
|
|
ret float %mul
|
|
}
|
|
|
|
define half @fold_f16_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, half %v0, half %v1) #0 {
|
|
; SDAG-LABEL: fold_f16_select_user_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v1, 0x8000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_select_user_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = select i1 %cond, half %sub, half %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @no_fold_f16_select_user_fsub_into_fneg_modifier_daz(i1 %cond, half %v0, half %v1) #1 {
|
|
; SDAG-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_sub_f16_e32 v1, 0x8000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = select i1 %cond, half %sub, half %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define half @no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, half %v0, half %v1) #2 {
|
|
; SDAG-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_sub_f16_e32 v1, 0x8000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f16_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_max_f16_e64 v1, -v1, -v1
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%mul = select i1 %cond, half %sub, half %v1
|
|
ret half %mul
|
|
}
|
|
|
|
define double @fold_f64_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, double %v0, double %v1) #0 {
|
|
; SDAG-LABEL: fold_f64_select_user_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f64_select_user_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = select i1 %cond, double %sub, double %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @no_fold_f64_select_user_fsub_into_fneg_modifier_daz(i1 %cond, double %v0, double %v1) #1 {
|
|
; SDAG-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = select i1 %cond, double %sub, double %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define double @no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, double %v0, double %v1) #2 {
|
|
; SDAG-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v2, 0x80000000, v2
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f64_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[1:2], -v[1:2], -v[1:2]
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v3, v1, vcc
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%mul = select i1 %cond, double %sub, double %v1
|
|
ret double %mul
|
|
}
|
|
|
|
define <2 x half> @fold_v2f16_select_user_fsub_into_fneg_modifier_ieee(i1 %cond, <2 x half> %v0, <2 x half> %v1) #0 {
|
|
; SDAG-LABEL: fold_v2f16_select_user_fsub_into_fneg_modifier_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_v2f16_select_user_fsub_into_fneg_modifier_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz(i1 %cond, <2 x half> %v0, <2 x half> %v1) #1 {
|
|
; SDAG-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define <2 x half> @no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic(i1 %cond, <2 x half> %v0, <2 x half> %v1) #2 {
|
|
; SDAG-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; SDAG-NEXT: v_xor_b32_e32 v1, 0x80008000, v1
|
|
; SDAG-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0
|
|
; SDAG-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_v2f16_select_user_fsub_into_fneg_modifier_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_and_b32_e32 v0, 1, v0
|
|
; GISEL-NEXT: v_pk_max_f16 v1, v1, v1 neg_lo:[1,1] neg_hi:[1,1]
|
|
; GISEL-NEXT: v_cmp_ne_u32_e32 vcc, 0, v0
|
|
; GISEL-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub <2 x half> <half -0.0, half -0.0>, %v0
|
|
%mul = select i1 %cond, <2 x half> %sub, <2 x half> %v1
|
|
ret <2 x half> %mul
|
|
}
|
|
|
|
define float @fold_f32_strict_fsub_into_fneg_modifier_ieee(float %v0, float %v1) #3 {
|
|
; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_ieee:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
%mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_strict_fsub_into_fneg_modifier_daz(float %v0, float %v1) #4 {
|
|
; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_daz:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
%mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
ret float %mul
|
|
}
|
|
|
|
define float @fold_f32_strict_fsub_into_fneg_modifier_dynamic(float %v0, float %v1) #5 {
|
|
; CHECK-LABEL: fold_f32_strict_fsub_into_fneg_modifier_dynamic:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; CHECK-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
|
|
; CHECK-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = call float @llvm.experimental.constrained.fsub.f32(float -0.0, float %v0, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
%mul = call float @llvm.experimental.constrained.fmul.f32(float %sub, float %v1, metadata !"round.dynamic", metadata !"fpexcept.strict")
|
|
ret float %mul
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee(float %v0) #0 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, 1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz(float %v0) #1 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic(float %v0) #2 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_issnan_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e64 s[4:5], v0, 1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 1)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee(float %v0) #0 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz(float %v0) #1 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic(float %v0) #2 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_isdenormal_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f32(float %sub, i32 144)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_ieee(float %v0, i32 %testmask) #0 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_ieee:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_cmp_class_f32_e64 s[4:5], -v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_ieee:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_daz(float %v0, i32 %testmask) #1 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic(float %v0, i32 %testmask) #2 {
|
|
; SDAG-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f32_fsub_into_fneg_modifier_class_var_dynamic:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f32_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%class = call i1 @llvm.amdgcn.class.f32(float %sub, i32 %testmask)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f64_fsub_into_fneg_modifier_class_var_daz(double %v0, i32 %testmask) #1 {
|
|
; SDAG-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_var_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_cmp_class_f64_e64 s[4:5], -v[0:1], v2
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_var_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
|
|
; GISEL-NEXT: v_cmp_class_f64_e32 vcc, v[0:1], v2
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%class = call i1 @llvm.amdgcn.class.f64(double %sub, i32 %testmask)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f16_fsub_into_fneg_modifier_class_var_daz(half %v0, i32 %testmask) #1 {
|
|
; SDAG-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_var_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f16_e32 v0, 0x8000, v0
|
|
; SDAG-NEXT: v_cmp_class_f16_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_var_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_cmp_class_f16_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%class = call i1 @llvm.amdgcn.class.f16(half %sub, i32 %testmask)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f64_fsub_into_fneg_modifier_class_daz(double %v0) #1 {
|
|
; SDAG-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_mov_b32_e32 v2, 0x90
|
|
; SDAG-NEXT: v_cmp_class_f64_e64 s[4:5], -v[0:1], v2
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[4:5]
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f64_fsub_into_fneg_modifier_class_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f64 v[0:1], -v[0:1], -v[0:1]
|
|
; GISEL-NEXT: v_mov_b32_e32 v2, 0x90
|
|
; GISEL-NEXT: v_cmp_class_f64_e32 vcc, v[0:1], v2
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub double -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f64(double %sub, i32 144)
|
|
ret i1 %class
|
|
}
|
|
|
|
define i1 @no_fold_f16_fsub_into_fneg_modifier_class_daz(half %v0) #1 {
|
|
; SDAG-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f16_e32 v0, 0x8000, v0
|
|
; SDAG-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; SDAG-NEXT: v_cmp_class_f16_e32 vcc, v0, v1
|
|
; SDAG-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: no_fold_f16_fsub_into_fneg_modifier_class_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f16_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: v_mov_b32_e32 v1, 0x90
|
|
; GISEL-NEXT: v_cmp_class_f16_e32 vcc, v0, v1
|
|
; GISEL-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub half -0.0, %v0
|
|
%class = call i1 @llvm.is.fpclass.f16(half %sub, i32 144)
|
|
ret i1 %class
|
|
}
|
|
|
|
define amdgpu_gfx float @fold_f32_fsub_into_fneg_modifier_interp_daz(float %v0, i32 inreg %v1) #1 {
|
|
; SDAG-LABEL: fold_f32_fsub_into_fneg_modifier_interp_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: v_sub_f32_e32 v0, 0x80000000, v0
|
|
; SDAG-NEXT: s_mov_b32 m0, s4
|
|
; SDAG-NEXT: s_nop 0
|
|
; SDAG-NEXT: v_interp_p1_f32_e32 v0, v0, attr0.x
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f32_fsub_into_fneg_modifier_interp_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: s_mov_b32 m0, s4
|
|
; GISEL-NEXT: s_nop 0
|
|
; GISEL-NEXT: v_interp_p1_f32_e32 v0, v0, attr0.x
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%p0_0 = call float @llvm.amdgcn.interp.p1(float %sub, i32 0, i32 0, i32 %v1)
|
|
ret float %p0_0
|
|
}
|
|
|
|
define amdgpu_gfx float @fold_f16_fsub_into_fneg_modifier_interp_daz(float %v0, i32 inreg %m0) #1 {
|
|
; SDAG-LABEL: fold_f16_fsub_into_fneg_modifier_interp_daz:
|
|
; SDAG: ; %bb.0:
|
|
; SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; SDAG-NEXT: s_mov_b32 m0, s4
|
|
; SDAG-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 2, 2), 3
|
|
; SDAG-NEXT: v_interp_p1ll_f16 v0, -v0, attr2.y
|
|
; SDAG-NEXT: s_setpc_b64 s[30:31]
|
|
;
|
|
; GISEL-LABEL: fold_f16_fsub_into_fneg_modifier_interp_daz:
|
|
; GISEL: ; %bb.0:
|
|
; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
|
|
; GISEL-NEXT: v_max_f32_e64 v0, -v0, -v0
|
|
; GISEL-NEXT: s_mov_b32 m0, s4
|
|
; GISEL-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_MODE, 2, 2), 3
|
|
; GISEL-NEXT: v_interp_p1ll_f16 v0, v0, attr2.y
|
|
; GISEL-NEXT: s_setpc_b64 s[30:31]
|
|
%sub = fsub float -0.0, %v0
|
|
%p1_0 = call float @llvm.amdgcn.interp.p1.f16(float %sub, i32 1, i32 2, i1 0, i32 %m0)
|
|
ret float %p1_0
|
|
}
|
|
|
|
declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)
|
|
declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)
|
|
declare i1 @llvm.is.fpclass.f32(float, i32 immarg)
|
|
declare i1 @llvm.amdgcn.class.f32(float, i32)
|
|
declare i1 @llvm.is.fpclass.f64(double, i32 immarg)
|
|
declare i1 @llvm.amdgcn.class.f64(double, i32)
|
|
declare i1 @llvm.is.fpclass.f16(half, i32 immarg)
|
|
declare i1 @llvm.amdgcn.class.f16(half, i32)
|
|
declare float @llvm.amdgcn.interp.p1(float, i32, i32, i32)
|
|
declare float @llvm.amdgcn.interp.p1.f16(float, i32, i32, i1, i32)
|
|
|
|
attributes #0 = { denormal_fpenv(ieee|ieee) }
|
|
attributes #1 = { denormal_fpenv(preservesign) }
|
|
attributes #2 = { denormal_fpenv(dynamic) }
|
|
attributes #3 = { denormal_fpenv(ieee|ieee) strictfp }
|
|
attributes #4 = { denormal_fpenv(preservesign) strictfp }
|
|
attributes #5 = { denormal_fpenv(dynamic) strictfp }
|