brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.3 KiB · ef676dd Raw
477 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s3 4; Test that we use SimplifyDemandedBits on copysign's sign5; operand. These are somewhat simplified extractions from fast pown6; expansions.7 8define half @test_pown_reduced_fast_f16_known_odd(half %x, i32 %y.arg) #0 {9; GFX9-LABEL: test_pown_reduced_fast_f16_known_odd:10; GFX9:       ; %bb.0:11; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; GFX9-NEXT:    v_or_b32_e32 v1, 1, v113; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, v114; GFX9-NEXT:    s_movk_i32 s4, 0x7fff15; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v116; GFX9-NEXT:    v_mul_f16_e64 v1, |v0|, v117; GFX9-NEXT:    v_bfi_b32 v0, s4, v1, v018; GFX9-NEXT:    s_setpc_b64 s[30:31]19  %y = or i32 %y.arg, 120  %fabs = call half @llvm.fabs.f16(half %x)21  %pownI2F = sitofp i32 %y to half22  %ylogx = fmul half %fabs, %pownI2F23  %cast_x = bitcast half %x to i1624  %pow_sign = and i16 %cast_x, -3276825  %cast_sign = bitcast i16 %pow_sign to half26  %pow_sign1 = call half @llvm.copysign.f16(half %ylogx, half %cast_sign)27  ret half %pow_sign128}29 30define <2 x half> @test_pown_reduced_fast_v2f16_known_odd(<2 x half> %x, <2 x i32> %y.arg) #0 {31; GFX9-LABEL: test_pown_reduced_fast_v2f16_known_odd:32; GFX9:       ; %bb.0:33; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)34; GFX9-NEXT:    v_or_b32_e32 v2, 1, v235; GFX9-NEXT:    v_or_b32_e32 v1, 1, v136; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, v237; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, v138; GFX9-NEXT:    v_and_b32_e32 v3, 0x7fff7fff, v039; GFX9-NEXT:    s_mov_b32 s4, 0x7fff7fff40; GFX9-NEXT:    v_cvt_f16_f32_e32 v2, v241; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v142; GFX9-NEXT:    v_pack_b32_f16 v1, v1, v243; GFX9-NEXT:    v_pk_mul_f16 v1, v3, v144; GFX9-NEXT:    v_bfi_b32 v0, s4, v1, v045; GFX9-NEXT:    s_setpc_b64 s[30:31]46  %y = or <2 x i32> %y.arg, <i32 1, i32 1>47  %fabs = call <2 x half> @llvm.fabs.v2f16(<2 x half> %x)48  %pownI2F = sitofp <2 x i32> %y to <2 x half>49  %ylogx = fmul <2 x half> %fabs, %pownI2F50  %cast_x = bitcast <2 x half> %x to <2 x i16>51  %pow_sign = and <2 x i16> %cast_x, <i16 -32768, i16 -32768>52  %cast_sign = bitcast <2 x i16> %pow_sign to <2 x half>53  %pow_sign1 = call <2 x half> @llvm.copysign.v2f16(<2 x half> %ylogx, <2 x half> %cast_sign)54  ret <2 x half> %pow_sign155}56 57define float @test_pown_reduced_fast_f32_known_odd(float %x, i32 %y.arg) #0 {58; GFX9-LABEL: test_pown_reduced_fast_f32_known_odd:59; GFX9:       ; %bb.0:60; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)61; GFX9-NEXT:    v_or_b32_e32 v1, 1, v162; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, v163; GFX9-NEXT:    s_brev_b32 s4, -264; GFX9-NEXT:    v_mul_f32_e64 v1, |v0|, v165; GFX9-NEXT:    v_bfi_b32 v0, s4, v1, v066; GFX9-NEXT:    s_setpc_b64 s[30:31]67  %y = or i32 %y.arg, 168  %fabs = call float @llvm.fabs.f32(float %x)69  %pownI2F = sitofp i32 %y to float70  %ylogx = fmul float %fabs, %pownI2F71  %cast_x = bitcast float %x to i3272  %pow_sign = and i32 %cast_x, -214748364873  %cast_sign = bitcast i32 %pow_sign to float74  %pow_sign1 = call float @llvm.copysign.f32(float %ylogx, float %cast_sign)75  ret float %pow_sign176}77 78define <2 x float> @test_pown_reduced_fast_v2f32_known_odd(<2 x float> %x, <2 x i32> %y.arg) #0 {79; GFX9-LABEL: test_pown_reduced_fast_v2f32_known_odd:80; GFX9:       ; %bb.0:81; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)82; GFX9-NEXT:    v_or_b32_e32 v3, 1, v383; GFX9-NEXT:    v_or_b32_e32 v2, 1, v284; GFX9-NEXT:    v_cvt_f32_i32_e32 v3, v385; GFX9-NEXT:    v_cvt_f32_i32_e32 v2, v286; GFX9-NEXT:    s_brev_b32 s4, -287; GFX9-NEXT:    v_mul_f32_e64 v3, |v1|, v388; GFX9-NEXT:    v_mul_f32_e64 v2, |v0|, v289; GFX9-NEXT:    v_bfi_b32 v0, s4, v2, v090; GFX9-NEXT:    v_bfi_b32 v1, s4, v3, v191; GFX9-NEXT:    s_setpc_b64 s[30:31]92  %y = or <2 x i32> %y.arg, <i32 1, i32 1>93  %fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %x)94  %pownI2F = sitofp <2 x i32> %y to <2 x float>95  %ylogx = fmul <2 x float> %fabs, %pownI2F96  %cast_x = bitcast <2 x float> %x to <2 x i32>97  %pow_sign = and <2 x i32> %cast_x, <i32 -2147483648, i32 -2147483648>98  %cast_sign = bitcast <2 x i32> %pow_sign to <2 x float>99  %pow_sign1 = call <2 x float> @llvm.copysign.v2f32(<2 x float> %ylogx, <2 x float> %cast_sign)100  ret <2 x float> %pow_sign1101}102 103define double @test_pown_reduced_fast_f64_known_odd(double %x, i32 %y.arg) #0 {104; GFX9-LABEL: test_pown_reduced_fast_f64_known_odd:105; GFX9:       ; %bb.0:106; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)107; GFX9-NEXT:    v_or_b32_e32 v2, 1, v2108; GFX9-NEXT:    v_cvt_f64_i32_e32 v[2:3], v2109; GFX9-NEXT:    s_brev_b32 s4, -2110; GFX9-NEXT:    v_mul_f64 v[2:3], |v[0:1]|, v[2:3]111; GFX9-NEXT:    v_bfi_b32 v1, s4, v3, v1112; GFX9-NEXT:    v_mov_b32_e32 v0, v2113; GFX9-NEXT:    s_setpc_b64 s[30:31]114  %y = or i32 %y.arg, 1115  %fabs = call double @llvm.fabs.f64(double %x)116  %pownI2F = sitofp i32 %y to double117  %ylogx = fmul double %fabs, %pownI2F118  %cast_x = bitcast double %x to i64119  %pow_sign = and i64 %cast_x, -9223372036854775808120  %cast_sign = bitcast i64 %pow_sign to double121  %pow_sign1 = call double @llvm.copysign.f64(double %ylogx, double %cast_sign)122  ret double %pow_sign1123}124 125define <2 x double> @test_pown_reduced_fast_v2f64_known_odd(<2 x double> %x, <2 x i32> %y.arg) #0 {126; GFX9-LABEL: test_pown_reduced_fast_v2f64_known_odd:127; GFX9:       ; %bb.0:128; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)129; GFX9-NEXT:    v_or_b32_e32 v6, 1, v5130; GFX9-NEXT:    v_or_b32_e32 v4, 1, v4131; GFX9-NEXT:    v_cvt_f64_i32_e32 v[4:5], v4132; GFX9-NEXT:    v_cvt_f64_i32_e32 v[6:7], v6133; GFX9-NEXT:    s_brev_b32 s4, -2134; GFX9-NEXT:    v_mul_f64 v[4:5], |v[0:1]|, v[4:5]135; GFX9-NEXT:    v_mul_f64 v[6:7], |v[2:3]|, v[6:7]136; GFX9-NEXT:    v_bfi_b32 v1, s4, v5, v1137; GFX9-NEXT:    v_bfi_b32 v3, s4, v7, v3138; GFX9-NEXT:    v_mov_b32_e32 v0, v4139; GFX9-NEXT:    v_mov_b32_e32 v2, v6140; GFX9-NEXT:    s_setpc_b64 s[30:31]141  %y = or <2 x i32> %y.arg, <i32 1, i32 1>142  %fabs = call <2 x double> @llvm.fabs.v2f64(<2 x double> %x)143  %pownI2F = sitofp <2 x i32> %y to <2 x double>144  %ylogx = fmul <2 x double> %fabs, %pownI2F145  %cast_x = bitcast <2 x double> %x to <2 x i64>146  %pow_sign = and <2 x i64> %cast_x, <i64 -9223372036854775808, i64 -9223372036854775808>147  %cast_sign = bitcast <2 x i64> %pow_sign to <2 x double>148  %pow_sign1 = call <2 x double> @llvm.copysign.f64(<2 x double> %ylogx, <2 x double> %cast_sign)149  ret <2 x double> %pow_sign1150}151 152define float @copysign_f32_f32_sign_known_p0_or_n0(float %x, i32 %y.i) {153; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0:154; GFX9:       ; %bb.0:155; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)156; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1157; GFX9-NEXT:    s_brev_b32 s4, -2158; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1159; GFX9-NEXT:    s_setpc_b64 s[30:31]160  %y.even = shl i32 %y.i, 31161  %y.even.as.f32 = bitcast i32 %y.even to float162  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)163  ret float %copysign164}165 166define double @copysign_f64_f32_sign_known_p0_or_n0(double %x, i32 %y.i) {167; GFX9-LABEL: copysign_f64_f32_sign_known_p0_or_n0:168; GFX9:       ; %bb.0:169; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)170; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 31, v2171; GFX9-NEXT:    s_brev_b32 s4, -2172; GFX9-NEXT:    v_bfi_b32 v1, s4, v1, v2173; GFX9-NEXT:    s_setpc_b64 s[30:31]174  %y.even = shl i32 %y.i, 31175  %y.even.as.f32 = bitcast i32 %y.even to float176  %y.even.as.f32.fpext = fpext float %y.even.as.f32 to double177  %copysign = call double @llvm.copysign.f64(double %x, double %y.even.as.f32.fpext)178  ret double %copysign179}180 181define half @copysign_f16_f32_sign_known_p0_or_n0(half %x, i32 %y.i) {182; GFX9-LABEL: copysign_f16_f32_sign_known_p0_or_n0:183; GFX9:       ; %bb.0:184; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)185; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1186; GFX9-NEXT:    v_lshrrev_b32_e32 v1, 16, v1187; GFX9-NEXT:    s_movk_i32 s4, 0x7fff188; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1189; GFX9-NEXT:    s_setpc_b64 s[30:31]190  %y.even = shl i32 %y.i, 31191  %y.even.as.f32 = bitcast i32 %y.even to float192  %y.even.as.f32.fptrunc = fptrunc float %y.even.as.f32 to half193  %copysign = call half @llvm.copysign.f16(half %x, half %y.even.as.f32.fptrunc)194  ret half %copysign195}196 197define float @copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_fabs(float %x.arg, i32 %y.i) {198; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_fabs:199; GFX9:       ; %bb.0:200; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)201; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1202; GFX9-NEXT:    s_brev_b32 s4, -2203; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1204; GFX9-NEXT:    s_setpc_b64 s[30:31]205  %x = call float @llvm.fabs.f32(float %x.arg)206  %y.even = shl i32 %y.i, 31207  %y.even.as.f32 = bitcast i32 %y.even to float208  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)209  ret float %copysign210}211 212define float @copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_select(float %x.arg, i32 %y.i) {213; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_select:214; GFX9:       ; %bb.0:215; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)216; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, 0, v0217; GFX9-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc218; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1219; GFX9-NEXT:    s_brev_b32 s4, -2220; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1221; GFX9-NEXT:    s_setpc_b64 s[30:31]222  %x.ule.0 = fcmp ule float %x.arg, 0.0223  %x = select i1 %x.ule.0, float 0.0, float %x.arg224  %y.even = shl i32 %y.i, 31225  %y.even.as.f32 = bitcast i32 %y.even to float226  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)227  ret float %copysign228}229 230define float @copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_nnan_nsz_sqrt(float %x.arg, i32 %y.i) {231; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0__mag_known_positive_nnan_nsz_sqrt:232; GFX9:       ; %bb.0:233; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)234; GFX9-NEXT:    s_mov_b32 s4, 0xf800000235; GFX9-NEXT:    v_mul_f32_e32 v2, 0x4f800000, v0236; GFX9-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v0237; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc238; GFX9-NEXT:    v_sqrt_f32_e32 v2, v0239; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1240; GFX9-NEXT:    v_add_u32_e32 v3, -1, v2241; GFX9-NEXT:    v_fma_f32 v4, -v3, v2, v0242; GFX9-NEXT:    v_cmp_ge_f32_e64 s[4:5], 0, v4243; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2244; GFX9-NEXT:    v_cndmask_b32_e64 v3, v2, v3, s[4:5]245; GFX9-NEXT:    v_fma_f32 v2, -v4, v2, v0246; GFX9-NEXT:    v_cmp_lt_f32_e64 s[4:5], 0, v2247; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v4, s[4:5]248; GFX9-NEXT:    v_mul_f32_e32 v3, 0x37800000, v2249; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc250; GFX9-NEXT:    v_mov_b32_e32 v3, 0x260251; GFX9-NEXT:    v_cmp_class_f32_e32 vcc, v0, v3252; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc253; GFX9-NEXT:    s_brev_b32 s4, -2254; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1255; GFX9-NEXT:    s_setpc_b64 s[30:31]256  %x = call nnan nsz float @llvm.sqrt.f32(float %x.arg)257  %y.even = shl i32 %y.i, 31258  %y.even.as.f32 = bitcast i32 %y.even to float259  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)260  ret float %copysign261}262 263define float @copysign_f32_f32_sign_known_p0_or_n0__mag_almost_positive_nsz_sqrt(float %x.arg, i32 %y.i) {264; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0__mag_almost_positive_nsz_sqrt:265; GFX9:       ; %bb.0:266; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GFX9-NEXT:    s_mov_b32 s4, 0xf800000268; GFX9-NEXT:    v_mul_f32_e32 v2, 0x4f800000, v0269; GFX9-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v0270; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc271; GFX9-NEXT:    v_sqrt_f32_e32 v2, v0272; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1273; GFX9-NEXT:    v_add_u32_e32 v3, -1, v2274; GFX9-NEXT:    v_fma_f32 v4, -v3, v2, v0275; GFX9-NEXT:    v_cmp_ge_f32_e64 s[4:5], 0, v4276; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2277; GFX9-NEXT:    v_cndmask_b32_e64 v3, v2, v3, s[4:5]278; GFX9-NEXT:    v_fma_f32 v2, -v4, v2, v0279; GFX9-NEXT:    v_cmp_lt_f32_e64 s[4:5], 0, v2280; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v4, s[4:5]281; GFX9-NEXT:    v_mul_f32_e32 v3, 0x37800000, v2282; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc283; GFX9-NEXT:    v_mov_b32_e32 v3, 0x260284; GFX9-NEXT:    v_cmp_class_f32_e32 vcc, v0, v3285; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc286; GFX9-NEXT:    s_brev_b32 s4, -2287; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1288; GFX9-NEXT:    s_setpc_b64 s[30:31]289  %x = call nsz float @llvm.sqrt.f32(float %x.arg)290  %y.even = shl i32 %y.i, 31291  %y.even.as.f32 = bitcast i32 %y.even to float292  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)293  ret float %copysign294}295 296define float @copysign_f32_f32_sign_known_p0_or_n0__mag_almost_positive_nnan_sqrt(float %x.arg, i32 %y.i) {297; GFX9-LABEL: copysign_f32_f32_sign_known_p0_or_n0__mag_almost_positive_nnan_sqrt:298; GFX9:       ; %bb.0:299; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)300; GFX9-NEXT:    s_mov_b32 s4, 0xf800000301; GFX9-NEXT:    v_mul_f32_e32 v2, 0x4f800000, v0302; GFX9-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v0303; GFX9-NEXT:    v_cndmask_b32_e32 v0, v0, v2, vcc304; GFX9-NEXT:    v_sqrt_f32_e32 v2, v0305; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1306; GFX9-NEXT:    v_add_u32_e32 v3, -1, v2307; GFX9-NEXT:    v_fma_f32 v4, -v3, v2, v0308; GFX9-NEXT:    v_cmp_ge_f32_e64 s[4:5], 0, v4309; GFX9-NEXT:    v_add_u32_e32 v4, 1, v2310; GFX9-NEXT:    v_cndmask_b32_e64 v3, v2, v3, s[4:5]311; GFX9-NEXT:    v_fma_f32 v2, -v4, v2, v0312; GFX9-NEXT:    v_cmp_lt_f32_e64 s[4:5], 0, v2313; GFX9-NEXT:    v_cndmask_b32_e64 v2, v3, v4, s[4:5]314; GFX9-NEXT:    v_mul_f32_e32 v3, 0x37800000, v2315; GFX9-NEXT:    v_cndmask_b32_e32 v2, v2, v3, vcc316; GFX9-NEXT:    v_mov_b32_e32 v3, 0x260317; GFX9-NEXT:    v_cmp_class_f32_e32 vcc, v0, v3318; GFX9-NEXT:    v_cndmask_b32_e32 v0, v2, v0, vcc319; GFX9-NEXT:    s_brev_b32 s4, -2320; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1321; GFX9-NEXT:    s_setpc_b64 s[30:31]322  %x = call nnan float @llvm.sqrt.f32(float %x.arg)323  %y.even = shl i32 %y.i, 31324  %y.even.as.f32 = bitcast i32 %y.even to float325  %copysign = call float @llvm.copysign.f32(float %x, float %y.even.as.f32)326  ret float %copysign327}328 329define float @test_copysign_pow_fast_f32__integral_y(float %x, i32 %y.i) {330; GFX9-LABEL: test_copysign_pow_fast_f32__integral_y:331; GFX9:       ; %bb.0:332; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)333; GFX9-NEXT:    s_mov_b32 s4, 0x800000334; GFX9-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, s4335; GFX9-NEXT:    v_cndmask_b32_e64 v3, 0, 32, vcc336; GFX9-NEXT:    v_ldexp_f32 v3, |v0|, v3337; GFX9-NEXT:    v_log_f32_e32 v3, v3338; GFX9-NEXT:    v_cvt_f32_i32_e32 v1, v1339; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000340; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc341; GFX9-NEXT:    v_sub_f32_e32 v2, v3, v2342; GFX9-NEXT:    v_mul_f32_e32 v3, v2, v1343; GFX9-NEXT:    s_mov_b32 s4, 0xc2fc0000344; GFX9-NEXT:    v_mov_b32_e32 v4, 0x42800000345; GFX9-NEXT:    v_cmp_gt_f32_e32 vcc, s4, v3346; GFX9-NEXT:    v_cndmask_b32_e32 v3, 0, v4, vcc347; GFX9-NEXT:    v_fma_f32 v2, v2, v1, v3348; GFX9-NEXT:    v_exp_f32_e32 v2, v2349; GFX9-NEXT:    v_cvt_i32_f32_e32 v1, v1350; GFX9-NEXT:    v_not_b32_e32 v3, 63351; GFX9-NEXT:    v_cndmask_b32_e32 v3, 0, v3, vcc352; GFX9-NEXT:    v_ldexp_f32 v2, v2, v3353; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 31, v1354; GFX9-NEXT:    v_and_or_b32 v0, v1, v0, v2355; GFX9-NEXT:    s_setpc_b64 s[30:31]356  %y = sitofp i32 %y.i to float357  %y.fptosi = fptosi float %y to i32358  %fabs = call fast float @llvm.fabs.f32(float %x)359  %log2 = call fast float @llvm.log2.f32(float %fabs)360  %pownI2F = sitofp i32 %y.i to float361  %ylogx = fmul fast float %log2, %pownI2F362  %exp2 = call fast float @llvm.exp2.f32(float %ylogx)363  %yeven = shl i32 %y.fptosi, 31364  %x.i32 = bitcast float %x to i32365  %pow_sign = and i32 %yeven, %x.i32366  %pow_sign.f32 = bitcast i32 %pow_sign to float367  %pow_sign1 = call fast float @llvm.copysign.f32(float %exp2, float %pow_sign.f32)368  ret float %pow_sign1369}370 371define double @test_pow_fast_f64integral_y(double %x, i32 %y.i) #0 {372; GFX9-LABEL: test_pow_fast_f64integral_y:373; GFX9:       ; %bb.0:374; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)375; GFX9-NEXT:    s_mov_b32 s16, s33376; GFX9-NEXT:    s_mov_b32 s33, s32377; GFX9-NEXT:    s_or_saveexec_b64 s[18:19], -1378; GFX9-NEXT:    buffer_store_dword v43, off, s[0:3], s33 offset:12 ; 4-byte Folded Spill379; GFX9-NEXT:    s_mov_b64 exec, s[18:19]380; GFX9-NEXT:    v_writelane_b32 v43, s16, 14381; GFX9-NEXT:    v_writelane_b32 v43, s30, 0382; GFX9-NEXT:    v_writelane_b32 v43, s31, 1383; GFX9-NEXT:    v_writelane_b32 v43, s34, 2384; GFX9-NEXT:    v_writelane_b32 v43, s35, 3385; GFX9-NEXT:    v_writelane_b32 v43, s36, 4386; GFX9-NEXT:    v_writelane_b32 v43, s37, 5387; GFX9-NEXT:    v_writelane_b32 v43, s38, 6388; GFX9-NEXT:    v_writelane_b32 v43, s39, 7389; GFX9-NEXT:    v_writelane_b32 v43, s48, 8390; GFX9-NEXT:    v_writelane_b32 v43, s49, 9391; GFX9-NEXT:    v_writelane_b32 v43, s50, 10392; GFX9-NEXT:    s_addk_i32 s32, 0x800393; GFX9-NEXT:    buffer_store_dword v40, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill394; GFX9-NEXT:    buffer_store_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill395; GFX9-NEXT:    buffer_store_dword v42, off, s[0:3], s33 ; 4-byte Folded Spill396; GFX9-NEXT:    v_writelane_b32 v43, s51, 11397; GFX9-NEXT:    v_mov_b32_e32 v42, v1398; GFX9-NEXT:    v_writelane_b32 v43, s52, 12399; GFX9-NEXT:    v_and_b32_e32 v1, 0x7fffffff, v42400; GFX9-NEXT:    s_getpc_b64 s[16:17]401; GFX9-NEXT:    s_add_u32 s16, s16, _Z4log2d@rel32@lo+4402; GFX9-NEXT:    s_addc_u32 s17, s17, _Z4log2d@rel32@hi+12403; GFX9-NEXT:    v_writelane_b32 v43, s53, 13404; GFX9-NEXT:    v_mov_b32_e32 v40, v31405; GFX9-NEXT:    v_mov_b32_e32 v41, v2406; GFX9-NEXT:    s_mov_b32 s50, s15407; GFX9-NEXT:    s_mov_b32 s51, s14408; GFX9-NEXT:    s_mov_b32 s52, s13409; GFX9-NEXT:    s_mov_b32 s53, s12410; GFX9-NEXT:    s_mov_b64 s[34:35], s[10:11]411; GFX9-NEXT:    s_mov_b64 s[36:37], s[8:9]412; GFX9-NEXT:    s_mov_b64 s[38:39], s[6:7]413; GFX9-NEXT:    s_mov_b64 s[48:49], s[4:5]414; GFX9-NEXT:    s_swappc_b64 s[30:31], s[16:17]415; GFX9-NEXT:    v_cvt_f64_i32_e32 v[2:3], v41416; GFX9-NEXT:    s_getpc_b64 s[16:17]417; GFX9-NEXT:    s_add_u32 s16, s16, _Z4exp2d@rel32@lo+4418; GFX9-NEXT:    s_addc_u32 s17, s17, _Z4exp2d@rel32@hi+12419; GFX9-NEXT:    s_mov_b64 s[4:5], s[48:49]420; GFX9-NEXT:    s_mov_b64 s[6:7], s[38:39]421; GFX9-NEXT:    v_mul_f64 v[0:1], v[0:1], v[2:3]422; GFX9-NEXT:    s_mov_b64 s[8:9], s[36:37]423; GFX9-NEXT:    s_mov_b64 s[10:11], s[34:35]424; GFX9-NEXT:    s_mov_b32 s12, s53425; GFX9-NEXT:    s_mov_b32 s13, s52426; GFX9-NEXT:    s_mov_b32 s14, s51427; GFX9-NEXT:    s_mov_b32 s15, s50428; GFX9-NEXT:    v_mov_b32_e32 v31, v40429; GFX9-NEXT:    s_swappc_b64 s[30:31], s[16:17]430; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 31, v41431; GFX9-NEXT:    v_and_b32_e32 v2, v2, v42432; GFX9-NEXT:    buffer_load_dword v42, off, s[0:3], s33 ; 4-byte Folded Reload433; GFX9-NEXT:    buffer_load_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload434; GFX9-NEXT:    buffer_load_dword v40, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload435; GFX9-NEXT:    v_or_b32_e32 v1, v1, v2436; GFX9-NEXT:    v_readlane_b32 s53, v43, 13437; GFX9-NEXT:    v_readlane_b32 s52, v43, 12438; GFX9-NEXT:    v_readlane_b32 s51, v43, 11439; GFX9-NEXT:    v_readlane_b32 s50, v43, 10440; GFX9-NEXT:    v_readlane_b32 s49, v43, 9441; GFX9-NEXT:    v_readlane_b32 s48, v43, 8442; GFX9-NEXT:    v_readlane_b32 s39, v43, 7443; GFX9-NEXT:    v_readlane_b32 s38, v43, 6444; GFX9-NEXT:    v_readlane_b32 s37, v43, 5445; GFX9-NEXT:    v_readlane_b32 s36, v43, 4446; GFX9-NEXT:    v_readlane_b32 s35, v43, 3447; GFX9-NEXT:    v_readlane_b32 s34, v43, 2448; GFX9-NEXT:    v_readlane_b32 s31, v43, 1449; GFX9-NEXT:    v_readlane_b32 s30, v43, 0450; GFX9-NEXT:    s_mov_b32 s32, s33451; GFX9-NEXT:    v_readlane_b32 s4, v43, 14452; GFX9-NEXT:    s_or_saveexec_b64 s[6:7], -1453; GFX9-NEXT:    buffer_load_dword v43, off, s[0:3], s33 offset:12 ; 4-byte Folded Reload454; GFX9-NEXT:    s_mov_b64 exec, s[6:7]455; GFX9-NEXT:    s_mov_b32 s33, s4456; GFX9-NEXT:    s_waitcnt vmcnt(0)457; GFX9-NEXT:    s_setpc_b64 s[30:31]458  %fabs = call fast double @llvm.fabs.f64(double %x)459  %log2 = call fast double @_Z4log2d(double %fabs)460  %pownI2F = sitofp i32 %y.i to double461  %ylogx = fmul fast double %log2, %pownI2F462  %exp2 = call fast nofpclass(nan ninf nzero nsub nnorm) double @_Z4exp2d(double %ylogx)463  %ytou = zext i32 %y.i to i64464  %yeven = shl i64 %ytou, 63465  %x.i64 = bitcast double %x to i64466  %pow_sign = and i64 %yeven, %x.i64467  %pow_sign.f64 = bitcast i64 %pow_sign to double468  %pow_sign1 = call fast double @llvm.copysign.f64(double %exp2, double %pow_sign.f64)469  ret double %pow_sign1470}471 472declare hidden double @_Z4exp2d(double) #1473declare hidden double @_Z4log2d(double) #1474 475attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }476attributes #1 = { norecurse nounwind memory(read) }477