450 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s4 5; TODO: GlobalISel should avoid generating v_ldexp_f32.6define amdgpu_cs float @v_s_exp_f32(float inreg %src) {7; GFX12-SDAG-LABEL: v_s_exp_f32:8; GFX12-SDAG: ; %bb.0:9; GFX12-SDAG-NEXT: s_cmp_lt_f32 s0, 0xc2fc000010; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x42800000, 011; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)12; GFX12-SDAG-NEXT: s_add_f32 s0, s0, s113; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x1f800000, 1.014; GFX12-SDAG-NEXT: v_s_exp_f32 s0, s015; GFX12-SDAG-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)16; GFX12-SDAG-NEXT: s_mul_f32 s0, s0, s117; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)18; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s019; GFX12-SDAG-NEXT: ; return to shader part epilog20;21; GFX12-GISEL-LABEL: v_s_exp_f32:22; GFX12-GISEL: ; %bb.0:23; GFX12-GISEL-NEXT: s_cmp_lt_f32 s0, 0xc2fc000024; GFX12-GISEL-NEXT: s_cselect_b32 s1, 0x42800000, 025; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)26; GFX12-GISEL-NEXT: s_add_f32 s0, s0, s127; GFX12-GISEL-NEXT: s_cselect_b32 s1, 0xffffffc0, 028; GFX12-GISEL-NEXT: v_s_exp_f32 s0, s029; GFX12-GISEL-NEXT: s_wait_alu depctr_va_sdst(0)30; GFX12-GISEL-NEXT: s_delay_alu instid0(TRANS32_DEP_1)31; GFX12-GISEL-NEXT: v_ldexp_f32 v0, s0, s132; GFX12-GISEL-NEXT: ; return to shader part epilog33 %result = call float @llvm.exp2.f32(float %src)34 ret float %result35}36 37define amdgpu_cs half @v_s_exp_f16(half inreg %src) {38; GFX12-LABEL: v_s_exp_f16:39; GFX12: ; %bb.0:40; GFX12-NEXT: v_s_exp_f16 s0, s041; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)42; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)43; GFX12-NEXT: v_mov_b32_e32 v0, s044; GFX12-NEXT: ; return to shader part epilog45 %result = call half @llvm.exp2.f16(half %src)46 ret half %result47}48 49define amdgpu_cs float @v_s_amdgcn_exp_f32(float inreg %src) {50; GFX12-LABEL: v_s_amdgcn_exp_f32:51; GFX12: ; %bb.0:52; GFX12-NEXT: v_s_exp_f32 s0, s053; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)54; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)55; GFX12-NEXT: v_mov_b32_e32 v0, s056; GFX12-NEXT: ; return to shader part epilog57 %result = call float @llvm.amdgcn.exp2.f32(float %src)58 ret float %result59}60 61define amdgpu_cs half @v_s_amdgcn_exp_f16(half inreg %src) {62; GFX12-LABEL: v_s_amdgcn_exp_f16:63; GFX12: ; %bb.0:64; GFX12-NEXT: v_s_exp_f16 s0, s065; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)66; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)67; GFX12-NEXT: v_mov_b32_e32 v0, s068; GFX12-NEXT: ; return to shader part epilog69 %result = call half @llvm.amdgcn.exp2.f16(half %src)70 ret half %result71}72 73define amdgpu_cs float @v_s_log_f32(float inreg %src) {74; GFX12-SDAG-LABEL: v_s_log_f32:75; GFX12-SDAG: ; %bb.0:76; GFX12-SDAG-NEXT: s_cmp_lt_f32 s0, 0x80000077; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x4f800000, 1.078; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)79; GFX12-SDAG-NEXT: s_mul_f32 s0, s0, s180; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x42000000, 081; GFX12-SDAG-NEXT: v_s_log_f32 s0, s082; GFX12-SDAG-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)83; GFX12-SDAG-NEXT: s_sub_f32 s0, s0, s184; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)85; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s086; GFX12-SDAG-NEXT: ; return to shader part epilog87;88; GFX12-GISEL-LABEL: v_s_log_f32:89; GFX12-GISEL: ; %bb.0:90; GFX12-GISEL-NEXT: s_cmp_lt_f32 s0, 0x80000091; GFX12-GISEL-NEXT: s_cselect_b32 s1, 1, 092; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)93; GFX12-GISEL-NEXT: s_lshl_b32 s2, s1, 594; GFX12-GISEL-NEXT: s_cmp_lg_u32 s1, 095; GFX12-GISEL-NEXT: v_ldexp_f32 v0, s0, s296; GFX12-GISEL-NEXT: s_cselect_b32 s0, 0x42000000, 097; GFX12-GISEL-NEXT: v_log_f32_e32 v0, v098; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)99; GFX12-GISEL-NEXT: s_delay_alu instid0(TRANS32_DEP_1)100; GFX12-GISEL-NEXT: v_subrev_f32_e32 v0, s0, v0101; GFX12-GISEL-NEXT: ; return to shader part epilog102 %result = call float @llvm.log2.f32(float %src)103 ret float %result104}105 106define amdgpu_cs half @v_s_log_f16(half inreg %src) {107; GFX12-LABEL: v_s_log_f16:108; GFX12: ; %bb.0:109; GFX12-NEXT: v_s_log_f16 s0, s0110; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)111; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)112; GFX12-NEXT: v_mov_b32_e32 v0, s0113; GFX12-NEXT: ; return to shader part epilog114 %result = call half @llvm.log2.f16(half %src)115 ret half %result116}117 118define amdgpu_cs float @v_s_amdgcn_log_f32(float inreg %src) {119; GFX12-LABEL: v_s_amdgcn_log_f32:120; GFX12: ; %bb.0:121; GFX12-NEXT: v_s_log_f32 s0, s0122; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)123; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)124; GFX12-NEXT: v_mov_b32_e32 v0, s0125; GFX12-NEXT: ; return to shader part epilog126 %result = call float @llvm.amdgcn.log.f32(float %src)127 ret float %result128}129 130define amdgpu_cs half @v_s_amdgcn_log_f16(half inreg %src) {131; GFX12-LABEL: v_s_amdgcn_log_f16:132; GFX12: ; %bb.0:133; GFX12-NEXT: v_s_log_f16 s0, s0134; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)135; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)136; GFX12-NEXT: v_mov_b32_e32 v0, s0137; GFX12-NEXT: ; return to shader part epilog138 %result = call half @llvm.amdgcn.log.f16(half %src)139 ret half %result140}141 142define amdgpu_cs float @v_s_rcp_f32(float inreg %src) {143; GFX12-LABEL: v_s_rcp_f32:144; GFX12: ; %bb.0:145; GFX12-NEXT: v_s_rcp_f32 s0, s0146; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)147; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)148; GFX12-NEXT: v_mov_b32_e32 v0, s0149; GFX12-NEXT: ; return to shader part epilog150 %result = call fast float @llvm.amdgcn.rcp.f32(float %src)151 ret float %result152}153 154define amdgpu_cs half @v_s_rcp_f16(half inreg %src) {155; GFX12-LABEL: v_s_rcp_f16:156; GFX12: ; %bb.0:157; GFX12-NEXT: v_s_rcp_f16 s0, s0158; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)159; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)160; GFX12-NEXT: v_mov_b32_e32 v0, s0161; GFX12-NEXT: ; return to shader part epilog162 %result = call fast half @llvm.amdgcn.rcp.f16(half %src)163 ret half %result164}165 166; TODO: GlobalISel should generate v_s_rsq.167define amdgpu_cs float @v_s_rsq_f32(float inreg %src) {168; GFX12-SDAG-LABEL: v_s_rsq_f32:169; GFX12-SDAG: ; %bb.0:170; GFX12-SDAG-NEXT: v_s_rsq_f32 s0, s0171; GFX12-SDAG-NEXT: s_wait_alu depctr_va_sdst(0)172; GFX12-SDAG-NEXT: s_delay_alu instid0(TRANS32_DEP_1)173; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0174; GFX12-SDAG-NEXT: ; return to shader part epilog175;176; GFX12-GISEL-LABEL: v_s_rsq_f32:177; GFX12-GISEL: ; %bb.0:178; GFX12-GISEL-NEXT: v_s_sqrt_f32 s0, s0179; GFX12-GISEL-NEXT: s_wait_alu depctr_va_sdst(0)180; GFX12-GISEL-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(SKIP_1) | instid1(TRANS32_DEP_1)181; GFX12-GISEL-NEXT: v_s_rcp_f32 s0, s0182; GFX12-GISEL-NEXT: s_wait_alu depctr_va_sdst(0)183; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0184; GFX12-GISEL-NEXT: ; return to shader part epilog185 %sqrt = call fast float @llvm.sqrt.f32(float %src)186 %fdiv = fdiv fast float 1.0, %sqrt187 ret float %fdiv188}189 190define amdgpu_cs half @v_s_rsq_f16(half inreg %src) {191; GFX12-LABEL: v_s_rsq_f16:192; GFX12: ; %bb.0:193; GFX12-NEXT: v_s_rsq_f16 s0, s0194; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)195; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)196; GFX12-NEXT: v_mov_b32_e32 v0, s0197; GFX12-NEXT: ; return to shader part epilog198 %sqrt = call fast half @llvm.sqrt.f16(half %src)199 %result = fdiv fast half 1.0, %sqrt200 ret half %result201}202 203; TODO: Should avoid generating v_cmp_class_f32.204define amdgpu_cs float @v_s_sqrt_f32(float inreg %src) {205; GFX12-SDAG-LABEL: v_s_sqrt_f32:206; GFX12-SDAG: ; %bb.0:207; GFX12-SDAG-NEXT: s_mul_f32 s1, s0, 0x4f800000208; GFX12-SDAG-NEXT: s_cmp_lt_f32 s0, 0xf800000209; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_2) | instskip(NEXT) | instid1(SALU_CYCLE_1)210; GFX12-SDAG-NEXT: s_cselect_b32 s1, s1, s0211; GFX12-SDAG-NEXT: v_s_sqrt_f32 s2, s1212; GFX12-SDAG-NEXT: s_mov_b32 s4, s1213; GFX12-SDAG-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)214; GFX12-SDAG-NEXT: s_add_co_i32 s3, s2, -1215; GFX12-SDAG-NEXT: s_xor_b32 s5, s3, 0x80000000216; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)217; GFX12-SDAG-NEXT: s_fmac_f32 s4, s5, s2218; GFX12-SDAG-NEXT: s_mov_b32 s5, s1219; GFX12-SDAG-NEXT: s_cmp_le_f32 s4, 0220; GFX12-SDAG-NEXT: s_cselect_b32 s3, s3, s2221; GFX12-SDAG-NEXT: s_add_co_i32 s4, s2, 1222; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)223; GFX12-SDAG-NEXT: s_xor_b32 s6, s4, 0x80000000224; GFX12-SDAG-NEXT: s_fmac_f32 s5, s6, s2225; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_3)226; GFX12-SDAG-NEXT: s_cmp_gt_f32 s5, 0227; GFX12-SDAG-NEXT: s_cselect_b32 s2, s4, s3228; GFX12-SDAG-NEXT: s_cmp_lt_f32 s0, 0xf800000229; GFX12-SDAG-NEXT: s_mul_f32 s0, s2, 0x37800000230; GFX12-SDAG-NEXT: v_cmp_class_f32_e64 s3, s1, 0x260231; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)232; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1)233; GFX12-SDAG-NEXT: s_cselect_b32 s0, s0, s2234; GFX12-SDAG-NEXT: s_and_b32 s2, s3, exec_lo235; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)236; GFX12-SDAG-NEXT: s_cselect_b32 s0, s1, s0237; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)238; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0239; GFX12-SDAG-NEXT: ; return to shader part epilog240;241; GFX12-GISEL-LABEL: v_s_sqrt_f32:242; GFX12-GISEL: ; %bb.0:243; GFX12-GISEL-NEXT: s_cmp_lt_f32 s0, 0xf800000244; GFX12-GISEL-NEXT: s_mul_f32 s2, s0, 0x4f800000245; GFX12-GISEL-NEXT: s_cselect_b32 s1, 1, 0246; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_2) | instskip(NEXT) | instid1(SALU_CYCLE_1)247; GFX12-GISEL-NEXT: s_cselect_b32 s0, s2, s0248; GFX12-GISEL-NEXT: v_s_sqrt_f32 s2, s0249; GFX12-GISEL-NEXT: s_mov_b32 s4, s0250; GFX12-GISEL-NEXT: s_mov_b32 s6, s0251; GFX12-GISEL-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)252; GFX12-GISEL-NEXT: s_add_co_i32 s3, s2, -1253; GFX12-GISEL-NEXT: s_xor_b32 s5, s3, 0x80000000254; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)255; GFX12-GISEL-NEXT: s_fmac_f32 s4, s5, s2256; GFX12-GISEL-NEXT: s_add_co_i32 s5, s2, 1257; GFX12-GISEL-NEXT: s_xor_b32 s7, s5, 0x80000000258; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_2) | instid1(SALU_CYCLE_2)259; GFX12-GISEL-NEXT: s_cmp_le_f32 s4, 0260; GFX12-GISEL-NEXT: s_fmac_f32 s6, s7, s2261; GFX12-GISEL-NEXT: s_cselect_b32 s2, s3, s2262; GFX12-GISEL-NEXT: s_cmp_gt_f32 s6, 0263; GFX12-GISEL-NEXT: s_cselect_b32 s2, s5, s2264; GFX12-GISEL-NEXT: s_cmp_lg_u32 s1, 0265; GFX12-GISEL-NEXT: s_mul_f32 s3, s2, 0x37800000266; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_3) | instskip(SKIP_4) | instid1(VALU_DEP_1)267; GFX12-GISEL-NEXT: s_cselect_b32 s1, s3, s2268; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)269; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s1270; GFX12-GISEL-NEXT: v_cmp_class_f32_e64 s1, s0, 0x260271; GFX12-GISEL-NEXT: s_wait_alu depctr_va_sdst(0)272; GFX12-GISEL-NEXT: v_cndmask_b32_e64 v0, v0, s0, s1273; GFX12-GISEL-NEXT: ; return to shader part epilog274 %result = call float @llvm.sqrt.f32(float %src)275 ret float %result276}277 278define amdgpu_cs half @v_s_sqrt_f16(half inreg %src) {279; GFX12-LABEL: v_s_sqrt_f16:280; GFX12: ; %bb.0:281; GFX12-NEXT: v_s_sqrt_f16 s0, s0282; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)283; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)284; GFX12-NEXT: v_mov_b32_e32 v0, s0285; GFX12-NEXT: ; return to shader part epilog286 %result = call half @llvm.sqrt.f16(half %src)287 ret half %result288}289 290define amdgpu_cs float @v_amdgcn_sqrt_f32(float inreg %src) {291; GFX12-LABEL: v_amdgcn_sqrt_f32:292; GFX12: ; %bb.0:293; GFX12-NEXT: v_s_sqrt_f32 s0, s0294; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)295; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)296; GFX12-NEXT: v_mov_b32_e32 v0, s0297; GFX12-NEXT: ; return to shader part epilog298 %result = call float @llvm.amdgcn.sqrt.f32(float %src)299 ret float %result300}301 302define amdgpu_cs half @v_amdgcn_sqrt_f16(half inreg %src) {303; GFX12-LABEL: v_amdgcn_sqrt_f16:304; GFX12: ; %bb.0:305; GFX12-NEXT: v_s_sqrt_f16 s0, s0306; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)307; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)308; GFX12-NEXT: v_mov_b32_e32 v0, s0309; GFX12-NEXT: ; return to shader part epilog310 %result = call half @llvm.amdgcn.sqrt.f16(half %src)311 ret half %result312}313 314define amdgpu_cs float @srcmods_abs_f32(float inreg %src) {315; GFX12-SDAG-LABEL: srcmods_abs_f32:316; GFX12-SDAG: ; %bb.0:317; GFX12-SDAG-NEXT: s_bitset0_b32 s0, 31318; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)319; GFX12-SDAG-NEXT: s_cmp_lt_f32 s0, 0x800000320; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x4f800000, 1.0321; GFX12-SDAG-NEXT: s_mul_f32 s0, s0, s1322; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x42000000, 0323; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_2) | instskip(NEXT) | instid1(TRANS32_DEP_1)324; GFX12-SDAG-NEXT: v_s_log_f32 s0, s0325; GFX12-SDAG-NEXT: s_sub_f32 s0, s0, s1326; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)327; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_2)328; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0329; GFX12-SDAG-NEXT: ; return to shader part epilog330;331; GFX12-GISEL-LABEL: srcmods_abs_f32:332; GFX12-GISEL: ; %bb.0:333; GFX12-GISEL-NEXT: s_and_b32 s1, s0, 0x7fffffff334; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)335; GFX12-GISEL-NEXT: s_cmp_lt_f32 s1, 0x800000336; GFX12-GISEL-NEXT: s_cselect_b32 s1, 1, 0337; GFX12-GISEL-NEXT: s_lshl_b32 s2, s1, 5338; GFX12-GISEL-NEXT: s_cmp_lg_u32 s1, 0339; GFX12-GISEL-NEXT: v_ldexp_f32 v0, |s0|, s2340; GFX12-GISEL-NEXT: s_cselect_b32 s0, 0x42000000, 0341; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(TRANS32_DEP_1)342; GFX12-GISEL-NEXT: v_log_f32_e32 v0, v0343; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)344; GFX12-GISEL-NEXT: v_subrev_f32_e32 v0, s0, v0345; GFX12-GISEL-NEXT: ; return to shader part epilog346 %abs = call float @llvm.fabs.f32(float %src)347 %result = call float @llvm.log2.f32(float %abs)348 ret float %result349}350 351define amdgpu_cs float @srcmods_neg_f32(float inreg %src) {352; GFX12-SDAG-LABEL: srcmods_neg_f32:353; GFX12-SDAG: ; %bb.0:354; GFX12-SDAG-NEXT: s_xor_b32 s1, s0, 0x80000000355; GFX12-SDAG-NEXT: s_cmp_gt_f32 s0, 0x80800000356; GFX12-SDAG-NEXT: s_cselect_b32 s0, 0x4f800000, 1.0357; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)358; GFX12-SDAG-NEXT: s_mul_f32 s0, s1, s0359; GFX12-SDAG-NEXT: s_cselect_b32 s1, 0x42000000, 0360; GFX12-SDAG-NEXT: v_s_log_f32 s0, s0361; GFX12-SDAG-NEXT: s_delay_alu instid0(TRANS32_DEP_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_2)362; GFX12-SDAG-NEXT: s_sub_f32 s0, s0, s1363; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)364; GFX12-SDAG-NEXT: v_mov_b32_e32 v0, s0365; GFX12-SDAG-NEXT: ; return to shader part epilog366;367; GFX12-GISEL-LABEL: srcmods_neg_f32:368; GFX12-GISEL: ; %bb.0:369; GFX12-GISEL-NEXT: s_xor_b32 s1, s0, 0x80000000370; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)371; GFX12-GISEL-NEXT: s_cmp_lt_f32 s1, 0x800000372; GFX12-GISEL-NEXT: s_cselect_b32 s1, 1, 0373; GFX12-GISEL-NEXT: s_lshl_b32 s2, s1, 5374; GFX12-GISEL-NEXT: s_cmp_lg_u32 s1, 0375; GFX12-GISEL-NEXT: v_ldexp_f32 v0, -s0, s2376; GFX12-GISEL-NEXT: s_cselect_b32 s0, 0x42000000, 0377; GFX12-GISEL-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(TRANS32_DEP_1)378; GFX12-GISEL-NEXT: v_log_f32_e32 v0, v0379; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)380; GFX12-GISEL-NEXT: v_subrev_f32_e32 v0, s0, v0381; GFX12-GISEL-NEXT: ; return to shader part epilog382 %neg = fneg float %src383 %result = call float @llvm.log2.f32(float %neg)384 ret float %result385}386 387define amdgpu_cs half @srcmods_abs_f16(half inreg %src) {388; GFX12-LABEL: srcmods_abs_f16:389; GFX12: ; %bb.0:390; GFX12-NEXT: v_s_log_f16 s0, |s0|391; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)392; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)393; GFX12-NEXT: v_mov_b32_e32 v0, s0394; GFX12-NEXT: ; return to shader part epilog395 %abs = call half @llvm.fabs.f16(half %src)396 %result = call half @llvm.log2.f16(half %abs)397 ret half %result398}399 400define amdgpu_cs half @srcmods_neg_f16(half inreg %src) {401; GFX12-LABEL: srcmods_neg_f16:402; GFX12: ; %bb.0:403; GFX12-NEXT: v_s_log_f16 s0, -s0404; GFX12-NEXT: s_wait_alu depctr_va_sdst(0)405; GFX12-NEXT: s_delay_alu instid0(TRANS32_DEP_1)406; GFX12-NEXT: v_mov_b32_e32 v0, s0407; GFX12-NEXT: ; return to shader part epilog408 %neg = fneg half %src409 %result = call half @llvm.log2.f16(half %neg)410 ret half %result411}412 413; TODO: SelectionDAG should avoid generating v_rcp_iflag_f32.414define amdgpu_cs float @fdiv_f32_i32(float inreg %a, i32 inreg %b) {415; GFX12-SDAG-LABEL: fdiv_f32_i32:416; GFX12-SDAG: ; %bb.0:417; GFX12-SDAG-NEXT: s_cvt_f32_u32 s1, s1418; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_3) | instskip(NEXT) | instid1(TRANS32_DEP_1)419; GFX12-SDAG-NEXT: v_rcp_iflag_f32_e32 v0, s1420; GFX12-SDAG-NEXT: v_mul_f32_e32 v0, s0, v0421; GFX12-SDAG-NEXT: ; return to shader part epilog422;423; GFX12-GISEL-LABEL: fdiv_f32_i32:424; GFX12-GISEL: ; %bb.0:425; GFX12-GISEL-NEXT: s_cvt_f32_u32 s1, s1426; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_3) | instskip(NEXT) | instid1(TRANS32_DEP_1)427; GFX12-GISEL-NEXT: v_s_rcp_f32 s1, s1428; GFX12-GISEL-NEXT: s_mul_f32 s0, s0, s1429; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)430; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_2)431; GFX12-GISEL-NEXT: v_mov_b32_e32 v0, s0432; GFX12-GISEL-NEXT: ; return to shader part epilog433 %uint = uitofp i32 %b to float434 %result = fdiv afn float %a, %uint435 ret float %result436}437 438define amdgpu_cs half @fdiv_f16_i16(half inreg %a, i16 inreg %b) {439; GFX12-LABEL: fdiv_f16_i16:440; GFX12: ; %bb.0:441; GFX12-NEXT: v_cvt_f16_u16_e32 v0, s1442; GFX12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(TRANS32_DEP_1)443; GFX12-NEXT: v_rcp_f16_e32 v0, v0444; GFX12-NEXT: v_mul_f16_e32 v0, s0, v0445; GFX12-NEXT: ; return to shader part epilog446 %uint = uitofp i16 %b to half447 %result = fdiv afn half %a, %uint448 ret half %result449}450