509 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX78,GFX7 %s3; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GFX78,GFX8 %s4; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s5; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s6 7define i16 @v_powi_f16(i16 %l, i32 %r) {8; GFX7-LABEL: v_powi_f16:9; GFX7: ; %bb.0:10; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11; GFX7-NEXT: v_cvt_f32_f16_e32 v0, v012; GFX7-NEXT: v_cvt_f32_i32_e32 v1, v113; GFX7-NEXT: v_mov_b32_e32 v2, 0xc2fc000014; GFX7-NEXT: v_mov_b32_e32 v3, 0x4280000015; GFX7-NEXT: v_log_f32_e32 v0, v016; GFX7-NEXT: v_mul_legacy_f32_e32 v0, v0, v117; GFX7-NEXT: v_cmp_lt_f32_e32 vcc, v0, v218; GFX7-NEXT: v_cndmask_b32_e32 v1, 0, v3, vcc19; GFX7-NEXT: v_add_f32_e32 v0, v0, v120; GFX7-NEXT: v_exp_f32_e32 v0, v021; GFX7-NEXT: v_not_b32_e32 v1, 6322; GFX7-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc23; GFX7-NEXT: v_ldexp_f32_e32 v0, v0, v124; GFX7-NEXT: v_cvt_f16_f32_e32 v0, v025; GFX7-NEXT: s_setpc_b64 s[30:31]26;27; GFX8-LABEL: v_powi_f16:28; GFX8: ; %bb.0:29; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)30; GFX8-NEXT: v_cvt_f32_i32_e32 v1, v131; GFX8-NEXT: v_log_f16_e32 v0, v032; GFX8-NEXT: v_cvt_f16_f32_e32 v1, v133; GFX8-NEXT: v_cvt_f32_f16_e32 v0, v034; GFX8-NEXT: v_cvt_f32_f16_e32 v1, v135; GFX8-NEXT: v_mul_legacy_f32_e32 v0, v0, v136; GFX8-NEXT: v_cvt_f16_f32_e32 v0, v037; GFX8-NEXT: v_exp_f16_e32 v0, v038; GFX8-NEXT: s_setpc_b64 s[30:31]39;40; GFX11-TRUE16-LABEL: v_powi_f16:41; GFX11-TRUE16: ; %bb.0:42; GFX11-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)43; GFX11-TRUE16-NEXT: v_log_f16_e32 v0.l, v0.l44; GFX11-TRUE16-NEXT: v_cvt_f32_i32_e32 v1, v145; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)46; GFX11-TRUE16-NEXT: v_cvt_f16_f32_e32 v0.h, v147; GFX11-TRUE16-NEXT: s_waitcnt_depctr depctr_va_vdst(0)48; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v1, v0.l49; GFX11-TRUE16-NEXT: v_cvt_f32_f16_e32 v0, v0.h50; GFX11-TRUE16-NEXT: v_mul_dx9_zero_f32_e32 v0, v1, v051; GFX11-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)52; GFX11-TRUE16-NEXT: v_cvt_f16_f32_e32 v0.l, v053; GFX11-TRUE16-NEXT: v_exp_f16_e32 v0.l, v0.l54; GFX11-TRUE16-NEXT: s_setpc_b64 s[30:31]55;56; GFX11-FAKE16-LABEL: v_powi_f16:57; GFX11-FAKE16: ; %bb.0:58; GFX11-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)59; GFX11-FAKE16-NEXT: v_log_f16_e32 v0, v060; GFX11-FAKE16-NEXT: v_cvt_f32_i32_e32 v1, v161; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)62; GFX11-FAKE16-NEXT: v_cvt_f16_f32_e32 v1, v163; GFX11-FAKE16-NEXT: s_waitcnt_depctr depctr_va_vdst(0)64; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v0, v065; GFX11-FAKE16-NEXT: v_cvt_f32_f16_e32 v1, v166; GFX11-FAKE16-NEXT: v_mul_dx9_zero_f32_e32 v0, v0, v167; GFX11-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)68; GFX11-FAKE16-NEXT: v_cvt_f16_f32_e32 v0, v069; GFX11-FAKE16-NEXT: v_exp_f16_e32 v0, v070; GFX11-FAKE16-NEXT: s_setpc_b64 s[30:31]71 %l.cast = bitcast i16 %l to half72 %res = call half @llvm.powi.f16.i32(half %l.cast, i32 %r)73 %res.cast = bitcast half %res to i1674 ret i16 %res.cast75}76 77define float @v_powi_f32(float %l, i32 %r) {78; GFX7-LABEL: v_powi_f32:79; GFX7: ; %bb.0:80; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)81; GFX7-NEXT: v_mov_b32_e32 v2, 0x80000082; GFX7-NEXT: v_cmp_lt_f32_e32 vcc, v0, v283; GFX7-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc84; GFX7-NEXT: v_lshlrev_b32_e32 v2, 5, v285; GFX7-NEXT: v_ldexp_f32_e32 v0, v0, v286; GFX7-NEXT: v_log_f32_e32 v0, v087; GFX7-NEXT: v_cvt_f32_i32_e32 v1, v188; GFX7-NEXT: v_mov_b32_e32 v2, 0x4200000089; GFX7-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc90; GFX7-NEXT: v_sub_f32_e32 v0, v0, v291; GFX7-NEXT: v_mul_legacy_f32_e32 v0, v0, v192; GFX7-NEXT: v_mov_b32_e32 v1, 0xc2fc000093; GFX7-NEXT: v_mov_b32_e32 v2, 0x4280000094; GFX7-NEXT: v_cmp_lt_f32_e32 vcc, v0, v195; GFX7-NEXT: v_cndmask_b32_e32 v1, 0, v2, vcc96; GFX7-NEXT: v_add_f32_e32 v0, v0, v197; GFX7-NEXT: v_exp_f32_e32 v0, v098; GFX7-NEXT: v_not_b32_e32 v1, 6399; GFX7-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc100; GFX7-NEXT: v_ldexp_f32_e32 v0, v0, v1101; GFX7-NEXT: s_setpc_b64 s[30:31]102;103; GFX8-LABEL: v_powi_f32:104; GFX8: ; %bb.0:105; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)106; GFX8-NEXT: v_mov_b32_e32 v2, 0x800000107; GFX8-NEXT: v_cmp_lt_f32_e32 vcc, v0, v2108; GFX8-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc109; GFX8-NEXT: v_lshlrev_b32_e32 v2, 5, v2110; GFX8-NEXT: v_ldexp_f32 v0, v0, v2111; GFX8-NEXT: v_log_f32_e32 v0, v0112; GFX8-NEXT: v_cvt_f32_i32_e32 v1, v1113; GFX8-NEXT: v_mov_b32_e32 v2, 0x42000000114; GFX8-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc115; GFX8-NEXT: v_sub_f32_e32 v0, v0, v2116; GFX8-NEXT: v_mul_legacy_f32_e32 v0, v0, v1117; GFX8-NEXT: v_mov_b32_e32 v1, 0xc2fc0000118; GFX8-NEXT: v_mov_b32_e32 v2, 0x42800000119; GFX8-NEXT: v_cmp_lt_f32_e32 vcc, v0, v1120; GFX8-NEXT: v_cndmask_b32_e32 v1, 0, v2, vcc121; GFX8-NEXT: v_add_f32_e32 v0, v0, v1122; GFX8-NEXT: v_exp_f32_e32 v0, v0123; GFX8-NEXT: v_not_b32_e32 v1, 63124; GFX8-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc125; GFX8-NEXT: v_ldexp_f32 v0, v0, v1126; GFX8-NEXT: s_setpc_b64 s[30:31]127;128; GFX11-LABEL: v_powi_f32:129; GFX11: ; %bb.0:130; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)131; GFX11-NEXT: v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0132; GFX11-NEXT: v_cvt_f32_i32_e32 v1, v1133; GFX11-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo134; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)135; GFX11-NEXT: v_lshlrev_b32_e32 v2, 5, v2136; GFX11-NEXT: v_ldexp_f32 v0, v0, v2137; GFX11-NEXT: v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo138; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)139; GFX11-NEXT: v_log_f32_e32 v0, v0140; GFX11-NEXT: s_waitcnt_depctr depctr_va_vdst(0)141; GFX11-NEXT: v_sub_f32_e32 v0, v0, v2142; GFX11-NEXT: v_mul_dx9_zero_f32_e32 v0, v0, v1143; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)144; GFX11-NEXT: v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0145; GFX11-NEXT: v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo146; GFX11-NEXT: v_add_f32_e32 v0, v0, v1147; GFX11-NEXT: v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo148; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)149; GFX11-NEXT: v_exp_f32_e32 v0, v0150; GFX11-NEXT: s_waitcnt_depctr depctr_va_vdst(0)151; GFX11-NEXT: v_ldexp_f32 v0, v0, v1152; GFX11-NEXT: s_setpc_b64 s[30:31]153 %res = call float @llvm.powi.f32.i32(float %l, i32 %r)154 ret float %res155}156 157define float @v_powi_0_f32(float %l) {158; GFX78-LABEL: v_powi_0_f32:159; GFX78: ; %bb.0:160; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)161; GFX78-NEXT: v_mov_b32_e32 v0, 1.0162; GFX78-NEXT: s_setpc_b64 s[30:31]163;164; GFX11-LABEL: v_powi_0_f32:165; GFX11: ; %bb.0:166; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)167; GFX11-NEXT: v_mov_b32_e32 v0, 1.0168; GFX11-NEXT: s_setpc_b64 s[30:31]169 %res = call float @llvm.powi.f32.i32(float %l, i32 0)170 ret float %res171}172 173define float @v_powi_1_f32(float %l) {174; GFX78-LABEL: v_powi_1_f32:175; GFX78: ; %bb.0:176; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)177; GFX78-NEXT: s_setpc_b64 s[30:31]178;179; GFX11-LABEL: v_powi_1_f32:180; GFX11: ; %bb.0:181; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)182; GFX11-NEXT: s_setpc_b64 s[30:31]183 %res = call float @llvm.powi.f32.i32(float %l, i32 1)184 ret float %res185}186 187define float @v_powi_neg1_f32(float %l) {188; GFX7-LABEL: v_powi_neg1_f32:189; GFX7: ; %bb.0:190; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)191; GFX7-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0192; GFX7-NEXT: v_rcp_f32_e32 v2, v1193; GFX7-NEXT: v_div_scale_f32 v3, vcc, 1.0, v0, 1.0194; GFX7-NEXT: v_fma_f32 v4, -v1, v2, 1.0195; GFX7-NEXT: v_fma_f32 v2, v4, v2, v2196; GFX7-NEXT: v_mul_f32_e32 v4, v3, v2197; GFX7-NEXT: v_fma_f32 v5, -v1, v4, v3198; GFX7-NEXT: v_fma_f32 v4, v5, v2, v4199; GFX7-NEXT: v_fma_f32 v1, -v1, v4, v3200; GFX7-NEXT: v_div_fmas_f32 v1, v1, v2, v4201; GFX7-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0202; GFX7-NEXT: s_setpc_b64 s[30:31]203;204; GFX8-LABEL: v_powi_neg1_f32:205; GFX8: ; %bb.0:206; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)207; GFX8-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0208; GFX8-NEXT: v_div_scale_f32 v2, vcc, 1.0, v0, 1.0209; GFX8-NEXT: v_rcp_f32_e32 v3, v1210; GFX8-NEXT: v_fma_f32 v4, -v1, v3, 1.0211; GFX8-NEXT: v_fma_f32 v3, v4, v3, v3212; GFX8-NEXT: v_mul_f32_e32 v4, v2, v3213; GFX8-NEXT: v_fma_f32 v5, -v1, v4, v2214; GFX8-NEXT: v_fma_f32 v4, v5, v3, v4215; GFX8-NEXT: v_fma_f32 v1, -v1, v4, v2216; GFX8-NEXT: v_div_fmas_f32 v1, v1, v3, v4217; GFX8-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0218; GFX8-NEXT: s_setpc_b64 s[30:31]219;220; GFX11-LABEL: v_powi_neg1_f32:221; GFX11: ; %bb.0:222; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)223; GFX11-NEXT: v_div_scale_f32 v1, null, v0, v0, 1.0224; GFX11-NEXT: v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0225; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)226; GFX11-NEXT: v_rcp_f32_e32 v2, v1227; GFX11-NEXT: s_waitcnt_depctr depctr_va_vdst(0)228; GFX11-NEXT: v_fma_f32 v3, -v1, v2, 1.0229; GFX11-NEXT: v_fmac_f32_e32 v2, v3, v2230; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)231; GFX11-NEXT: v_mul_f32_e32 v3, v4, v2232; GFX11-NEXT: v_fma_f32 v5, -v1, v3, v4233; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)234; GFX11-NEXT: v_fmac_f32_e32 v3, v5, v2235; GFX11-NEXT: v_fma_f32 v1, -v1, v3, v4236; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)237; GFX11-NEXT: v_div_fmas_f32 v1, v1, v2, v3238; GFX11-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0239; GFX11-NEXT: s_setpc_b64 s[30:31]240 %res = call float @llvm.powi.f32.i32(float %l, i32 -1)241 ret float %res242}243 244define float @v_powi_2_f32(float %l) {245; GFX78-LABEL: v_powi_2_f32:246; GFX78: ; %bb.0:247; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)248; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0249; GFX78-NEXT: s_setpc_b64 s[30:31]250;251; GFX11-LABEL: v_powi_2_f32:252; GFX11: ; %bb.0:253; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)254; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0255; GFX11-NEXT: s_setpc_b64 s[30:31]256 %res = call float @llvm.powi.f32.i32(float %l, i32 2)257 ret float %res258}259 260define float @v_powi_neg2_f32(float %l) {261; GFX7-LABEL: v_powi_neg2_f32:262; GFX7: ; %bb.0:263; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)264; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0265; GFX7-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0266; GFX7-NEXT: v_rcp_f32_e32 v2, v1267; GFX7-NEXT: v_div_scale_f32 v3, vcc, 1.0, v0, 1.0268; GFX7-NEXT: v_fma_f32 v4, -v1, v2, 1.0269; GFX7-NEXT: v_fma_f32 v2, v4, v2, v2270; GFX7-NEXT: v_mul_f32_e32 v4, v3, v2271; GFX7-NEXT: v_fma_f32 v5, -v1, v4, v3272; GFX7-NEXT: v_fma_f32 v4, v5, v2, v4273; GFX7-NEXT: v_fma_f32 v1, -v1, v4, v3274; GFX7-NEXT: v_div_fmas_f32 v1, v1, v2, v4275; GFX7-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0276; GFX7-NEXT: s_setpc_b64 s[30:31]277;278; GFX8-LABEL: v_powi_neg2_f32:279; GFX8: ; %bb.0:280; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0282; GFX8-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0283; GFX8-NEXT: v_div_scale_f32 v2, vcc, 1.0, v0, 1.0284; GFX8-NEXT: v_rcp_f32_e32 v3, v1285; GFX8-NEXT: v_fma_f32 v4, -v1, v3, 1.0286; GFX8-NEXT: v_fma_f32 v3, v4, v3, v3287; GFX8-NEXT: v_mul_f32_e32 v4, v2, v3288; GFX8-NEXT: v_fma_f32 v5, -v1, v4, v2289; GFX8-NEXT: v_fma_f32 v4, v5, v3, v4290; GFX8-NEXT: v_fma_f32 v1, -v1, v4, v2291; GFX8-NEXT: v_div_fmas_f32 v1, v1, v3, v4292; GFX8-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0293; GFX8-NEXT: s_setpc_b64 s[30:31]294;295; GFX11-LABEL: v_powi_neg2_f32:296; GFX11: ; %bb.0:297; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)298; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0299; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)300; GFX11-NEXT: v_div_scale_f32 v1, null, v0, v0, 1.0301; GFX11-NEXT: v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0302; GFX11-NEXT: v_rcp_f32_e32 v2, v1303; GFX11-NEXT: s_waitcnt_depctr depctr_va_vdst(0)304; GFX11-NEXT: v_fma_f32 v3, -v1, v2, 1.0305; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)306; GFX11-NEXT: v_fmac_f32_e32 v2, v3, v2307; GFX11-NEXT: v_mul_f32_e32 v3, v4, v2308; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)309; GFX11-NEXT: v_fma_f32 v5, -v1, v3, v4310; GFX11-NEXT: v_fmac_f32_e32 v3, v5, v2311; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)312; GFX11-NEXT: v_fma_f32 v1, -v1, v3, v4313; GFX11-NEXT: v_div_fmas_f32 v1, v1, v2, v3314; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)315; GFX11-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0316; GFX11-NEXT: s_setpc_b64 s[30:31]317 %res = call float @llvm.powi.f32.i32(float %l, i32 -2)318 ret float %res319}320 321define float @v_powi_4_f32(float %l) {322; GFX78-LABEL: v_powi_4_f32:323; GFX78: ; %bb.0:324; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)325; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0326; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0327; GFX78-NEXT: s_setpc_b64 s[30:31]328;329; GFX11-LABEL: v_powi_4_f32:330; GFX11: ; %bb.0:331; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)332; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0333; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)334; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0335; GFX11-NEXT: s_setpc_b64 s[30:31]336 %res = call float @llvm.powi.f32.i32(float %l, i32 4)337 ret float %res338}339 340define float @v_powi_8_f32(float %l) {341; GFX78-LABEL: v_powi_8_f32:342; GFX78: ; %bb.0:343; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)344; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0345; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0346; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0347; GFX78-NEXT: s_setpc_b64 s[30:31]348;349; GFX11-LABEL: v_powi_8_f32:350; GFX11: ; %bb.0:351; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)352; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0353; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)354; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0355; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0356; GFX11-NEXT: s_setpc_b64 s[30:31]357 %res = call float @llvm.powi.f32.i32(float %l, i32 8)358 ret float %res359}360 361define float @v_powi_16_f32(float %l) {362; GFX78-LABEL: v_powi_16_f32:363; GFX78: ; %bb.0:364; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)365; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0366; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0367; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0368; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0369; GFX78-NEXT: s_setpc_b64 s[30:31]370;371; GFX11-LABEL: v_powi_16_f32:372; GFX11: ; %bb.0:373; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)374; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0375; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)376; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0377; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0378; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)379; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0380; GFX11-NEXT: s_setpc_b64 s[30:31]381 %res = call float @llvm.powi.f32.i32(float %l, i32 16)382 ret float %res383}384 385define float @v_powi_128_f32(float %l) {386; GFX78-LABEL: v_powi_128_f32:387; GFX78: ; %bb.0:388; GFX78-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)389; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0390; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0391; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0392; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0393; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0394; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0395; GFX78-NEXT: v_mul_f32_e32 v0, v0, v0396; GFX78-NEXT: s_setpc_b64 s[30:31]397;398; GFX11-LABEL: v_powi_128_f32:399; GFX11: ; %bb.0:400; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)401; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0402; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)403; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0404; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0405; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)406; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0407; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0408; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)409; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0410; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0411; GFX11-NEXT: s_setpc_b64 s[30:31]412 %res = call float @llvm.powi.f32.i32(float %l, i32 128)413 ret float %res414}415 416define float @v_powi_neg128_f32(float %l) {417; GFX7-LABEL: v_powi_neg128_f32:418; GFX7: ; %bb.0:419; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)420; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0421; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0422; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0423; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0424; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0425; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0426; GFX7-NEXT: v_mul_f32_e32 v0, v0, v0427; GFX7-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0428; GFX7-NEXT: v_rcp_f32_e32 v2, v1429; GFX7-NEXT: v_div_scale_f32 v3, vcc, 1.0, v0, 1.0430; GFX7-NEXT: v_fma_f32 v4, -v1, v2, 1.0431; GFX7-NEXT: v_fma_f32 v2, v4, v2, v2432; GFX7-NEXT: v_mul_f32_e32 v4, v3, v2433; GFX7-NEXT: v_fma_f32 v5, -v1, v4, v3434; GFX7-NEXT: v_fma_f32 v4, v5, v2, v4435; GFX7-NEXT: v_fma_f32 v1, -v1, v4, v3436; GFX7-NEXT: v_div_fmas_f32 v1, v1, v2, v4437; GFX7-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0438; GFX7-NEXT: s_setpc_b64 s[30:31]439;440; GFX8-LABEL: v_powi_neg128_f32:441; GFX8: ; %bb.0:442; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)443; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0444; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0445; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0446; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0447; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0448; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0449; GFX8-NEXT: v_mul_f32_e32 v0, v0, v0450; GFX8-NEXT: v_div_scale_f32 v1, s[4:5], v0, v0, 1.0451; GFX8-NEXT: v_div_scale_f32 v2, vcc, 1.0, v0, 1.0452; GFX8-NEXT: v_rcp_f32_e32 v3, v1453; GFX8-NEXT: v_fma_f32 v4, -v1, v3, 1.0454; GFX8-NEXT: v_fma_f32 v3, v4, v3, v3455; GFX8-NEXT: v_mul_f32_e32 v4, v2, v3456; GFX8-NEXT: v_fma_f32 v5, -v1, v4, v2457; GFX8-NEXT: v_fma_f32 v4, v5, v3, v4458; GFX8-NEXT: v_fma_f32 v1, -v1, v4, v2459; GFX8-NEXT: v_div_fmas_f32 v1, v1, v3, v4460; GFX8-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0461; GFX8-NEXT: s_setpc_b64 s[30:31]462;463; GFX11-LABEL: v_powi_neg128_f32:464; GFX11: ; %bb.0:465; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)466; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0467; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)468; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0469; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0470; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)471; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0472; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0473; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)474; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0475; GFX11-NEXT: v_mul_f32_e32 v0, v0, v0476; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)477; GFX11-NEXT: v_div_scale_f32 v1, null, v0, v0, 1.0478; GFX11-NEXT: v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0479; GFX11-NEXT: v_rcp_f32_e32 v2, v1480; GFX11-NEXT: s_waitcnt_depctr depctr_va_vdst(0)481; GFX11-NEXT: v_fma_f32 v3, -v1, v2, 1.0482; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)483; GFX11-NEXT: v_fmac_f32_e32 v2, v3, v2484; GFX11-NEXT: v_mul_f32_e32 v3, v4, v2485; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)486; GFX11-NEXT: v_fma_f32 v5, -v1, v3, v4487; GFX11-NEXT: v_fmac_f32_e32 v3, v5, v2488; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)489; GFX11-NEXT: v_fma_f32 v1, -v1, v3, v4490; GFX11-NEXT: v_div_fmas_f32 v1, v1, v2, v3491; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)492; GFX11-NEXT: v_div_fixup_f32 v0, v1, v0, 1.0493; GFX11-NEXT: s_setpc_b64 s[30:31]494 %res = call float @llvm.powi.f32.i32(float %l, i32 -128)495 ret float %res496}497 498; FIXME: f64 broken499; define double @v_powi_f64(double %l, i32 %r) {500; %res = call double @llvm.powi.f64.i32(double %l, i32 %r)501; ret double %res502; }503 504declare half @llvm.powi.f16.i32(half, i32) #0505declare float @llvm.powi.f32.i32(float, i32) #0506declare double @llvm.powi.f64.i32(double, i32) #0507 508attributes #0 = { nounwind readnone speculatable willreturn }509