1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefix=GCN %s 3 4define double @v_constained_fsub_f64_fpexcept_strict(double %x, double %y) #0 { 5; GCN-LABEL: v_constained_fsub_f64_fpexcept_strict: 6; GCN: ; %bb.0: 7; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 8; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] 9; GCN-NEXT: s_setpc_b64 s[30:31] 10 %val = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 11 ret double %val 12} 13 14define double @v_constained_fsub_f64_fpexcept_ignore(double %x, double %y) #0 { 15; GCN-LABEL: v_constained_fsub_f64_fpexcept_ignore: 16; GCN: ; %bb.0: 17; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 18; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] 19; GCN-NEXT: s_setpc_b64 s[30:31] 20 %val = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 21 ret double %val 22} 23 24define double @v_constained_fsub_f64_fpexcept_maytrap(double %x, double %y) #0 { 25; GCN-LABEL: v_constained_fsub_f64_fpexcept_maytrap: 26; GCN: ; %bb.0: 27; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 28; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] 29; GCN-NEXT: s_setpc_b64 s[30:31] 30 %val = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap") 31 ret double %val 32} 33 34define <2 x double> @v_constained_fsub_v2f64_fpexcept_strict(<2 x double> %x, <2 x double> %y) #0 { 35; GCN-LABEL: v_constained_fsub_v2f64_fpexcept_strict: 36; GCN: ; %bb.0: 37; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 38; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] 39; GCN-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] 40; GCN-NEXT: s_setpc_b64 s[30:31] 41 %val = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 42 ret <2 x double> %val 43} 44 45define <2 x double> @v_constained_fsub_v2f64_fpexcept_ignore(<2 x double> %x, <2 x double> %y) #0 { 46; GCN-LABEL: v_constained_fsub_v2f64_fpexcept_ignore: 47; GCN: ; %bb.0: 48; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 49; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] 50; GCN-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] 51; GCN-NEXT: s_setpc_b64 s[30:31] 52 %val = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore") 53 ret <2 x double> %val 54} 55 56define <2 x double> @v_constained_fsub_v2f64_fpexcept_maytrap(<2 x double> %x, <2 x double> %y) #0 { 57; GCN-LABEL: v_constained_fsub_v2f64_fpexcept_maytrap: 58; GCN: ; %bb.0: 59; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 60; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] 61; GCN-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] 62; GCN-NEXT: s_setpc_b64 s[30:31] 63 %val = call <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double> %x, <2 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap") 64 ret <2 x double> %val 65} 66 67define <3 x double> @v_constained_fsub_v3f64_fpexcept_strict(<3 x double> %x, <3 x double> %y) #0 { 68; GCN-LABEL: v_constained_fsub_v3f64_fpexcept_strict: 69; GCN: ; %bb.0: 70; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 71; GCN-NEXT: v_add_f64 v[0:1], v[0:1], -v[6:7] 72; GCN-NEXT: v_add_f64 v[2:3], v[2:3], -v[8:9] 73; GCN-NEXT: v_add_f64 v[4:5], v[4:5], -v[10:11] 74; GCN-NEXT: s_setpc_b64 s[30:31] 75 %val = call <3 x double> @llvm.experimental.constrained.fsub.v3f64(<3 x double> %x, <3 x double> %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 76 ret <3 x double> %val 77} 78 79define amdgpu_ps <2 x float> @s_constained_fsub_f64_fpexcept_strict(double inreg %x, double inreg %y) #0 { 80; GCN-LABEL: s_constained_fsub_f64_fpexcept_strict: 81; GCN: ; %bb.0: 82; GCN-NEXT: v_mov_b32_e32 v0, s4 83; GCN-NEXT: v_mov_b32_e32 v1, s5 84; GCN-NEXT: v_add_f64 v[0:1], s[2:3], -v[0:1] 85; GCN-NEXT: ; return to shader part epilog 86 %val = call double @llvm.experimental.constrained.fsub.f64(double %x, double %y, metadata !"round.tonearest", metadata !"fpexcept.strict") 87 %cast = bitcast double %val to <2 x float> 88 ret <2 x float> %cast 89} 90 91declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) #1 92declare <2 x double> @llvm.experimental.constrained.fsub.v2f64(<2 x double>, <2 x double>, metadata, metadata) #1 93declare <3 x double> @llvm.experimental.constrained.fsub.v3f64(<3 x double>, <3 x double>, metadata, metadata) #1 94 95attributes #0 = { strictfp } 96attributes #1 = { inaccessiblememonly nounwind willreturn } 97