| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50 -mattr=+real-true16 %s -o - | FileCheck -check-prefixes=GFX1250,GFX1250-SDAG-REAL16 %s |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu12.50 -mattr=-real-true16 %s -o - | FileCheck -check-prefixes=GFX1250,GFX1250-SDAG-FAKE16 %s |
| ; xUN: llc -global-isel=1 -mtriple=amdgpu12.50 -mattr=+real-true16 %s -o - | FileCheck -check-prefixes=GFX1250,GFX1250-GISEL-REAL16 %s |
| ; xUN: llc -global-isel=1 -mtriple=amdgpu12.50 -mattr=-real-true16 %s -o - | FileCheck -check-prefixes=GFX1250,GFX1250-GISEL-FAKE16 %s |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu13.10 -mattr=+real-true16 %s -o - | FileCheck -check-prefixes=GFX13,GFX13-SDAG-REAL16 %s |
| ; RUN: llc -global-isel=0 -mtriple=amdgpu13.10 -mattr=-real-true16 %s -o - | FileCheck -check-prefixes=GFX13,GFX13-SDAG-FAKE16 %s |
| ; xUN: llc -global-isel=1 -mtriple=amdgpu13.10 -mattr=+real-true16 %s -o - | FileCheck -check-prefixes=GFX13,GFX13-GISEL-REAL16 %s |
| ; xUN: llc -global-isel=1 -mtriple=amdgpu13.10 -mattr=-real-true16 %s -o - | FileCheck -check-prefixes=GFX13,GFX13-GISEL-FAKE16 %s |
| |
| ; RUN: not llc -global-isel=0 -mtriple=amdgpu9.50 -filetype=null < %s 2>&1 | FileCheck -check-prefix=ERR %s |
| ; RUN: not llc -global-isel=1 -mtriple=amdgpu9.50 -filetype=null < %s 2>&1 | FileCheck -check-prefix=ERR %s |
| |
| ; ERR: error: <unknown>:0:0: in function @tanh_f32 float (float): llvm.amdgcn.tanh requires target feature 'tanh-insts' |
| |
| define float @tanh_f32(float %src) { |
| ; GFX1250-LABEL: tanh_f32: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_tanh_f32_e32 v0, v0 |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-LABEL: tanh_f32: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-NEXT: v_tanh_f32_e32 v0, v0 |
| ; GFX13-NEXT: s_set_pc_i64 s[30:31] |
| %tanh = call float @llvm.amdgcn.tanh.f32(float %src) |
| ret float %tanh |
| } |
| |
| define float @tanh_f32_neg(float %src) { |
| ; GFX1250-LABEL: tanh_f32_neg: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_tanh_f32_e64 v0, -v0 |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-LABEL: tanh_f32_neg: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-NEXT: v_tanh_f32_e64 v0, -v0 |
| ; GFX13-NEXT: s_set_pc_i64 s[30:31] |
| %fneg = fneg float %src |
| %tanh = call float @llvm.amdgcn.tanh.f32(float %fneg) |
| ret float %tanh |
| } |
| |
| define float @tanh_f32_abs(float %src) { |
| ; GFX1250-LABEL: tanh_f32_abs: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_tanh_f32_e64 v0, |v0| |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-LABEL: tanh_f32_abs: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-NEXT: v_tanh_f32_e64 v0, |v0| |
| ; GFX13-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call float @llvm.fabs.f32(float %src) |
| %tanh = call float @llvm.amdgcn.tanh.f32(float %fabs) |
| ret float %tanh |
| } |
| |
| define float @tanh_f32_neg_abs(float %src) { |
| ; GFX1250-LABEL: tanh_f32_neg_abs: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_tanh_f32_e64 v0, -|v0| |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-LABEL: tanh_f32_neg_abs: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-NEXT: v_tanh_f32_e64 v0, -|v0| |
| ; GFX13-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call float @llvm.fabs.f32(float %src) |
| %fneg = fneg float %fabs |
| %tanh = call float @llvm.amdgcn.tanh.f32(float %fneg) |
| ret float %tanh |
| } |
| |
| define amdgpu_ps float @tanh_f32_scalar(float inreg %src) { |
| ; GFX1250-LABEL: tanh_f32_scalar: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: v_tanh_f32_e32 v0, s0 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_f32_scalar: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: v_tanh_f32_e32 v0, s0 |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call float @llvm.amdgcn.tanh.f32(float %src) |
| ret float %tanh |
| } |
| |
| ; TODO: Really these should be constant folded |
| define amdgpu_ps float @tanh_f32_constant_4.0() { |
| ; GFX1250-LABEL: tanh_f32_constant_4.0: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: v_tanh_f32_e32 v0, 4.0 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_f32_constant_4.0: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: v_tanh_f32_e32 v0, 4.0 |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call float @llvm.amdgcn.tanh.f32(float 4.0) |
| ret float %tanh |
| } |
| |
| define amdgpu_ps float @tanh_f32_constant_100.0() { |
| ; GFX1250-LABEL: tanh_f32_constant_100.0: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: v_tanh_f32_e32 v0, 0x42c80000 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_f32_constant_100.0: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: v_tanh_f32_e32 v0, 0x42c80000 |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call float @llvm.amdgcn.tanh.f32(float 100.0) |
| ret float %tanh |
| } |
| |
| define amdgpu_ps float @tanh_undef_f32() { |
| ; GFX1250-LABEL: tanh_undef_f32: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_undef_f32: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call float @llvm.amdgcn.tanh.f32(float undef) |
| ret float %tanh |
| } |
| |
| define half @tanh_f16(half %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, v0.l |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, v0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, v0.l |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, v0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %tanh = call half @llvm.amdgcn.tanh.f16(half %src) |
| ret half %tanh |
| } |
| |
| define half @tanh_f16_neg(half %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_neg: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, -v0.l |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_neg: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, -v0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_neg: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, -v0.l |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_neg: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, -v0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fneg = fneg half %src |
| %tanh = call half @llvm.amdgcn.tanh.f16(half %fneg) |
| ret half %tanh |
| } |
| |
| define half @tanh_f16_abs(half %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_abs: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, |v0.l| |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_abs: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, |v0| |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_abs: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, |v0.l| |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_abs: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, |v0| |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call half @llvm.fabs.f16(half %src) |
| %tanh = call half @llvm.amdgcn.tanh.f16(half %fabs) |
| ret half %tanh |
| } |
| |
| define half @tanh_f16_neg_abs(half %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_neg_abs: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, -|v0.l| |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_neg_abs: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, -|v0| |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_neg_abs: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e64 v0.l, -|v0.l| |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_neg_abs: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e64 v0, -|v0| |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call half @llvm.fabs.f16(half %src) |
| %fneg = fneg half %fabs |
| %tanh = call half @llvm.amdgcn.tanh.f16(half %fneg) |
| ret half %tanh |
| } |
| |
| define amdgpu_ps half @tanh_f16_scalar(half inreg %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_scalar: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, s0 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_scalar: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, s0 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_scalar: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, s0 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_scalar: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, s0 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call half @llvm.amdgcn.tanh.f16(half %src) |
| ret half %tanh |
| } |
| |
| define amdgpu_ps half @tanh_f16_constant_4.0() { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_constant_4.0: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, 4.0 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_constant_4.0: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, 4.0 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_constant_4.0: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, 4.0 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_constant_4.0: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, 4.0 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call half @llvm.amdgcn.tanh.f16(half 4.0) |
| ret half %tanh |
| } |
| |
| define amdgpu_ps half @tanh_f16_constant_100.0() { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_f16_constant_100.0: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, 0x5640 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_f16_constant_100.0: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, 0x5640 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_f16_constant_100.0: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_f16_e32 v0.l, 0x5640 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_f16_constant_100.0: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_f16_e32 v0, 0x5640 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call half @llvm.amdgcn.tanh.f16(half 100.0) |
| ret half %tanh |
| } |
| |
| define amdgpu_ps half @tanh_undef_f16() { |
| ; GFX1250-LABEL: tanh_undef_f16: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_undef_f16: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call half @llvm.amdgcn.tanh.f16(half undef) |
| ret half %tanh |
| } |
| |
| define bfloat @tanh_bf16(bfloat %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, v0.l |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, v0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, v0.l |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, v0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat %src) |
| ret bfloat %tanh |
| } |
| |
| define bfloat @tanh_bf16_neg(bfloat %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_neg: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, -v0.l |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_neg: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, -v0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_neg: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, -v0.l |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_neg: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, -v0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fneg = fneg bfloat %src |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat %fneg) |
| ret bfloat %tanh |
| } |
| |
| define bfloat @tanh_bf16_abs(bfloat %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_abs: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, |v0.l| |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_abs: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, |v0| |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_abs: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, |v0.l| |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_abs: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, |v0| |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call bfloat @llvm.fabs.bf16(bfloat %src) |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat %fabs) |
| ret bfloat %tanh |
| } |
| |
| define bfloat @tanh_bf16_neg_abs(bfloat %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_neg_abs: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, -|v0.l| |
| ; GFX1250-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_neg_abs: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, -|v0| |
| ; GFX1250-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_neg_abs: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e64 v0.l, -|v0.l| |
| ; GFX13-SDAG-REAL16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_neg_abs: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_expcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_samplecnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e64 v0, -|v0| |
| ; GFX13-SDAG-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| %fabs = call bfloat @llvm.fabs.bf16(bfloat %src) |
| %fneg = fneg bfloat %fabs |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat %fneg) |
| ret bfloat %tanh |
| } |
| |
| define amdgpu_ps bfloat @tanh_bf16_scalar(bfloat inreg %src) { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_scalar: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, s0 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_scalar: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, s0 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_scalar: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, s0 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_scalar: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, s0 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat %src) |
| ret bfloat %tanh |
| } |
| |
| define amdgpu_ps bfloat @tanh_bf16_constant_4.0() { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_constant_4.0: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, 4.0 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_constant_4.0: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, 4.0 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_constant_4.0: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, 4.0 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_constant_4.0: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, 4.0 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat 4.0) |
| ret bfloat %tanh |
| } |
| |
| define amdgpu_ps bfloat @tanh_bf16_constant_100.0() { |
| ; GFX1250-SDAG-REAL16-LABEL: tanh_bf16_constant_100.0: |
| ; GFX1250-SDAG-REAL16: ; %bb.0: |
| ; GFX1250-SDAG-REAL16-NEXT: global_wb |
| ; GFX1250-SDAG-REAL16-NEXT: v_nop |
| ; GFX1250-SDAG-REAL16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, 0x42c8 |
| ; GFX1250-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX1250-SDAG-FAKE16-LABEL: tanh_bf16_constant_100.0: |
| ; GFX1250-SDAG-FAKE16: ; %bb.0: |
| ; GFX1250-SDAG-FAKE16-NEXT: global_wb |
| ; GFX1250-SDAG-FAKE16-NEXT: v_nop |
| ; GFX1250-SDAG-FAKE16-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, 0x42c8 |
| ; GFX1250-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-REAL16-LABEL: tanh_bf16_constant_100.0: |
| ; GFX13-SDAG-REAL16: ; %bb.0: |
| ; GFX13-SDAG-REAL16-NEXT: v_tanh_bf16_e32 v0.l, 0x42c8 |
| ; GFX13-SDAG-REAL16-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-SDAG-FAKE16-LABEL: tanh_bf16_constant_100.0: |
| ; GFX13-SDAG-FAKE16: ; %bb.0: |
| ; GFX13-SDAG-FAKE16-NEXT: v_tanh_bf16_e32 v0, 0x42c8 |
| ; GFX13-SDAG-FAKE16-NEXT: ; return to shader part epilog |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat 100.0) |
| ret bfloat %tanh |
| } |
| |
| define amdgpu_ps bfloat @tanh_undef_bf16() { |
| ; GFX1250-LABEL: tanh_undef_bf16: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: global_wb |
| ; GFX1250-NEXT: v_nop |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 |
| ; GFX1250-NEXT: ; return to shader part epilog |
| ; |
| ; GFX13-LABEL: tanh_undef_bf16: |
| ; GFX13: ; %bb.0: |
| ; GFX13-NEXT: ; return to shader part epilog |
| %tanh = call bfloat @llvm.amdgcn.tanh.bf16(bfloat undef) |
| ret bfloat %tanh |
| } |