2255 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn -mcpu=gfx600 -amdgpu-bypass-slow-div=0 < %s | FileCheck -check-prefix=GCN %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx600 -amdgpu-bypass-slow-div=0 -amdgpu-codegenprepare-expand-div64 < %s | FileCheck -check-prefix=GCN-IR %s4 5define amdgpu_kernel void @s_test_srem(ptr addrspace(1) %out, i64 %x, i64 %y) {6; GCN-LABEL: s_test_srem:7; GCN: ; %bb.0:8; GCN-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0xd9; GCN-NEXT: s_load_dwordx4 s[4:7], s[4:5], 0x910; GCN-NEXT: s_mov_b32 s3, 0xf00011; GCN-NEXT: s_waitcnt lgkmcnt(0)12; GCN-NEXT: v_cvt_f32_u32_e32 v0, s813; GCN-NEXT: v_cvt_f32_u32_e32 v1, s914; GCN-NEXT: s_sub_u32 s0, 0, s815; GCN-NEXT: s_subb_u32 s1, 0, s916; GCN-NEXT: v_madmk_f32 v0, v1, 0x4f800000, v017; GCN-NEXT: v_rcp_f32_e32 v0, v018; GCN-NEXT: v_mul_f32_e32 v0, 0x5f7ffffc, v019; GCN-NEXT: v_mul_f32_e32 v1, 0x2f800000, v020; GCN-NEXT: v_trunc_f32_e32 v1, v121; GCN-NEXT: v_madmk_f32 v0, v1, 0xcf800000, v022; GCN-NEXT: v_cvt_u32_f32_e32 v0, v023; GCN-NEXT: v_cvt_u32_f32_e32 v1, v124; GCN-NEXT: v_mul_hi_u32 v2, s0, v025; GCN-NEXT: v_readfirstlane_b32 s10, v126; GCN-NEXT: v_readfirstlane_b32 s2, v027; GCN-NEXT: s_mul_i32 s11, s0, s1028; GCN-NEXT: v_readfirstlane_b32 s14, v229; GCN-NEXT: s_mul_i32 s12, s1, s230; GCN-NEXT: s_mul_i32 s13, s0, s231; GCN-NEXT: s_add_i32 s11, s14, s1132; GCN-NEXT: v_mul_hi_u32 v3, v0, s1333; GCN-NEXT: s_add_i32 s11, s11, s1234; GCN-NEXT: v_mul_hi_u32 v0, v0, s1135; GCN-NEXT: v_mul_hi_u32 v4, v1, s1336; GCN-NEXT: v_readfirstlane_b32 s12, v337; GCN-NEXT: s_mul_i32 s15, s2, s1138; GCN-NEXT: v_mul_hi_u32 v1, v1, s1139; GCN-NEXT: s_add_u32 s12, s12, s1540; GCN-NEXT: v_readfirstlane_b32 s15, v041; GCN-NEXT: s_mul_i32 s13, s10, s1342; GCN-NEXT: s_addc_u32 s15, 0, s1543; GCN-NEXT: v_readfirstlane_b32 s14, v444; GCN-NEXT: s_add_u32 s12, s12, s1345; GCN-NEXT: s_addc_u32 s12, s15, s1446; GCN-NEXT: v_readfirstlane_b32 s13, v147; GCN-NEXT: s_addc_u32 s13, s13, 048; GCN-NEXT: s_mul_i32 s11, s10, s1149; GCN-NEXT: s_add_u32 s11, s12, s1150; GCN-NEXT: s_addc_u32 s12, 0, s1351; GCN-NEXT: s_add_u32 s11, s2, s1152; GCN-NEXT: v_mov_b32_e32 v0, s1153; GCN-NEXT: v_mul_hi_u32 v0, s0, v054; GCN-NEXT: s_addc_u32 s10, s10, s1255; GCN-NEXT: s_mul_i32 s12, s0, s1056; GCN-NEXT: s_mul_i32 s1, s1, s1157; GCN-NEXT: v_readfirstlane_b32 s13, v058; GCN-NEXT: s_add_i32 s12, s13, s1259; GCN-NEXT: s_mul_i32 s0, s0, s1160; GCN-NEXT: s_add_i32 s1, s12, s161; GCN-NEXT: v_mov_b32_e32 v2, s062; GCN-NEXT: v_mov_b32_e32 v0, s163; GCN-NEXT: v_mul_hi_u32 v3, s10, v264; GCN-NEXT: v_mul_hi_u32 v2, s11, v265; GCN-NEXT: v_mul_hi_u32 v1, s10, v066; GCN-NEXT: v_mul_hi_u32 v0, s11, v067; GCN-NEXT: s_mul_i32 s13, s11, s168; GCN-NEXT: v_readfirstlane_b32 s15, v269; GCN-NEXT: s_add_u32 s13, s15, s1370; GCN-NEXT: v_readfirstlane_b32 s14, v071; GCN-NEXT: s_mul_i32 s0, s10, s072; GCN-NEXT: s_addc_u32 s14, 0, s1473; GCN-NEXT: v_readfirstlane_b32 s12, v374; GCN-NEXT: s_add_u32 s0, s13, s075; GCN-NEXT: s_addc_u32 s0, s14, s1276; GCN-NEXT: v_readfirstlane_b32 s12, v177; GCN-NEXT: s_addc_u32 s12, s12, 078; GCN-NEXT: s_mul_i32 s1, s10, s179; GCN-NEXT: s_add_u32 s0, s0, s180; GCN-NEXT: s_addc_u32 s1, 0, s1281; GCN-NEXT: s_add_u32 s11, s11, s082; GCN-NEXT: s_addc_u32 s1, s10, s183; GCN-NEXT: v_mov_b32_e32 v0, s184; GCN-NEXT: v_mul_hi_u32 v1, s6, v085; GCN-NEXT: v_mov_b32_e32 v2, s1186; GCN-NEXT: v_mul_hi_u32 v3, s6, v287; GCN-NEXT: s_mov_b32 s0, s488; GCN-NEXT: v_readfirstlane_b32 s10, v189; GCN-NEXT: v_mul_hi_u32 v1, s7, v290; GCN-NEXT: s_mul_i32 s4, s6, s191; GCN-NEXT: v_readfirstlane_b32 s12, v392; GCN-NEXT: v_mul_hi_u32 v0, s7, v093; GCN-NEXT: s_add_u32 s4, s12, s494; GCN-NEXT: s_addc_u32 s10, 0, s1095; GCN-NEXT: s_mul_i32 s11, s7, s1196; GCN-NEXT: v_readfirstlane_b32 s12, v197; GCN-NEXT: s_add_u32 s4, s4, s1198; GCN-NEXT: s_addc_u32 s4, s10, s1299; GCN-NEXT: v_readfirstlane_b32 s10, v0100; GCN-NEXT: s_addc_u32 s10, s10, 0101; GCN-NEXT: s_mul_i32 s1, s7, s1102; GCN-NEXT: s_add_u32 s4, s4, s1103; GCN-NEXT: v_mov_b32_e32 v0, s4104; GCN-NEXT: v_mul_hi_u32 v0, s8, v0105; GCN-NEXT: s_mov_b32 s1, s5106; GCN-NEXT: s_addc_u32 s5, 0, s10107; GCN-NEXT: s_mul_i32 s5, s8, s5108; GCN-NEXT: v_readfirstlane_b32 s10, v0109; GCN-NEXT: s_add_i32 s5, s10, s5110; GCN-NEXT: s_mul_i32 s10, s9, s4111; GCN-NEXT: s_add_i32 s12, s5, s10112; GCN-NEXT: s_sub_i32 s10, s7, s12113; GCN-NEXT: s_mul_i32 s4, s8, s4114; GCN-NEXT: s_sub_u32 s6, s6, s4115; GCN-NEXT: s_cselect_b64 s[4:5], -1, 0116; GCN-NEXT: s_subb_u32 s13, s10, s9117; GCN-NEXT: s_sub_u32 s14, s6, s8118; GCN-NEXT: s_cselect_b64 s[10:11], -1, 0119; GCN-NEXT: s_subb_u32 s15, s13, 0120; GCN-NEXT: s_cmp_ge_u32 s15, s9121; GCN-NEXT: s_cselect_b32 s16, -1, 0122; GCN-NEXT: s_cmp_ge_u32 s14, s8123; GCN-NEXT: s_cselect_b32 s17, -1, 0124; GCN-NEXT: s_cmp_eq_u32 s15, s9125; GCN-NEXT: s_cselect_b32 s16, s17, s16126; GCN-NEXT: s_or_b32 s10, s10, s11127; GCN-NEXT: s_subb_u32 s10, s13, s9128; GCN-NEXT: s_sub_u32 s11, s14, s8129; GCN-NEXT: s_subb_u32 s10, s10, 0130; GCN-NEXT: s_cmp_lg_u32 s16, 0131; GCN-NEXT: s_cselect_b32 s11, s11, s14132; GCN-NEXT: s_cselect_b32 s10, s10, s15133; GCN-NEXT: s_or_b32 s4, s4, s5134; GCN-NEXT: s_subb_u32 s4, s7, s12135; GCN-NEXT: s_cmp_ge_u32 s4, s9136; GCN-NEXT: s_cselect_b32 s5, -1, 0137; GCN-NEXT: s_cmp_ge_u32 s6, s8138; GCN-NEXT: s_cselect_b32 s7, -1, 0139; GCN-NEXT: s_cmp_eq_u32 s4, s9140; GCN-NEXT: s_cselect_b32 s5, s7, s5141; GCN-NEXT: s_cmp_lg_u32 s5, 0142; GCN-NEXT: s_cselect_b32 s4, s10, s4143; GCN-NEXT: s_cselect_b32 s5, s11, s6144; GCN-NEXT: s_mov_b32 s2, -1145; GCN-NEXT: v_mov_b32_e32 v0, s5146; GCN-NEXT: v_mov_b32_e32 v1, s4147; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0148; GCN-NEXT: s_endpgm149;150; GCN-IR-LABEL: s_test_srem:151; GCN-IR: ; %bb.0: ; %_udiv-special-cases152; GCN-IR-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0xd153; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9154; GCN-IR-NEXT: s_mov_b64 s[4:5], 0155; GCN-IR-NEXT: s_mov_b32 s11, 0156; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)157; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[8:9], s[6:7], 0158; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[12:13], s[2:3], 0159; GCN-IR-NEXT: s_flbit_i32_b64 s10, s[6:7]160; GCN-IR-NEXT: s_flbit_i32_b64 s16, s[2:3]161; GCN-IR-NEXT: s_or_b64 s[8:9], s[8:9], s[12:13]162; GCN-IR-NEXT: s_sub_u32 s12, s10, s16163; GCN-IR-NEXT: s_subb_u32 s13, 0, 0164; GCN-IR-NEXT: v_cmp_gt_u64_e64 s[14:15], s[12:13], 63165; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[18:19], s[12:13], 63166; GCN-IR-NEXT: s_or_b64 s[14:15], s[8:9], s[14:15]167; GCN-IR-NEXT: s_and_b64 s[8:9], s[14:15], exec168; GCN-IR-NEXT: s_cselect_b32 s9, 0, s3169; GCN-IR-NEXT: s_cselect_b32 s8, 0, s2170; GCN-IR-NEXT: s_or_b64 s[14:15], s[14:15], s[18:19]171; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[14:15]172; GCN-IR-NEXT: s_cbranch_vccz .LBB0_5173; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb1174; GCN-IR-NEXT: s_add_u32 s14, s12, 1175; GCN-IR-NEXT: s_addc_u32 s8, s13, 0176; GCN-IR-NEXT: s_cselect_b64 s[8:9], -1, 0177; GCN-IR-NEXT: s_sub_i32 s12, 63, s12178; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[8:9]179; GCN-IR-NEXT: s_lshl_b64 s[8:9], s[2:3], s12180; GCN-IR-NEXT: s_cbranch_vccz .LBB0_4181; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader182; GCN-IR-NEXT: s_lshr_b64 s[12:13], s[2:3], s14183; GCN-IR-NEXT: s_add_u32 s14, s6, -1184; GCN-IR-NEXT: s_addc_u32 s15, s7, -1185; GCN-IR-NEXT: s_not_b64 s[4:5], s[10:11]186; GCN-IR-NEXT: s_add_u32 s16, s4, s16187; GCN-IR-NEXT: s_addc_u32 s17, s5, 0188; GCN-IR-NEXT: s_mov_b64 s[10:11], 0189; GCN-IR-NEXT: s_mov_b32 s5, 0190; GCN-IR-NEXT: .LBB0_3: ; %udiv-do-while191; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=1192; GCN-IR-NEXT: s_lshl_b64 s[12:13], s[12:13], 1193; GCN-IR-NEXT: s_lshr_b32 s4, s9, 31194; GCN-IR-NEXT: s_lshl_b64 s[8:9], s[8:9], 1195; GCN-IR-NEXT: s_or_b64 s[12:13], s[12:13], s[4:5]196; GCN-IR-NEXT: s_or_b64 s[8:9], s[10:11], s[8:9]197; GCN-IR-NEXT: s_sub_u32 s4, s14, s12198; GCN-IR-NEXT: s_subb_u32 s4, s15, s13199; GCN-IR-NEXT: s_ashr_i32 s10, s4, 31200; GCN-IR-NEXT: s_mov_b32 s11, s10201; GCN-IR-NEXT: s_and_b32 s4, s10, 1202; GCN-IR-NEXT: s_and_b64 s[18:19], s[10:11], s[6:7]203; GCN-IR-NEXT: s_sub_u32 s12, s12, s18204; GCN-IR-NEXT: s_subb_u32 s13, s13, s19205; GCN-IR-NEXT: s_add_u32 s16, s16, 1206; GCN-IR-NEXT: s_addc_u32 s17, s17, 0207; GCN-IR-NEXT: s_cselect_b64 s[18:19], -1, 0208; GCN-IR-NEXT: s_mov_b64 s[10:11], s[4:5]209; GCN-IR-NEXT: s_and_b64 vcc, exec, s[18:19]210; GCN-IR-NEXT: s_cbranch_vccz .LBB0_3211; GCN-IR-NEXT: .LBB0_4: ; %Flow7212; GCN-IR-NEXT: s_lshl_b64 s[8:9], s[8:9], 1213; GCN-IR-NEXT: s_or_b64 s[8:9], s[4:5], s[8:9]214; GCN-IR-NEXT: .LBB0_5: ; %udiv-end215; GCN-IR-NEXT: v_mov_b32_e32 v0, s8216; GCN-IR-NEXT: v_mul_hi_u32 v0, s6, v0217; GCN-IR-NEXT: s_mov_b32 s12, s0218; GCN-IR-NEXT: s_mul_i32 s0, s6, s9219; GCN-IR-NEXT: v_mov_b32_e32 v2, s3220; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, s0, v0221; GCN-IR-NEXT: s_mul_i32 s0, s7, s8222; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, s0, v0223; GCN-IR-NEXT: s_mul_i32 s0, s6, s8224; GCN-IR-NEXT: v_mov_b32_e32 v0, s0225; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, s2, v0226; GCN-IR-NEXT: s_mov_b32 s15, 0xf000227; GCN-IR-NEXT: s_mov_b32 s14, -1228; GCN-IR-NEXT: s_mov_b32 s13, s1229; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v2, v1, vcc230; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[12:15], 0231; GCN-IR-NEXT: s_endpgm232 %result = urem i64 %x, %y233 store i64 %result, ptr addrspace(1) %out234 ret void235}236 237define i64 @v_test_srem(i64 %x, i64 %y) {238; GCN-LABEL: v_test_srem:239; GCN: ; %bb.0:240; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GCN-NEXT: v_ashrrev_i32_e32 v4, 31, v3242; GCN-NEXT: v_add_i32_e32 v5, vcc, v2, v4243; GCN-NEXT: v_addc_u32_e32 v2, vcc, v3, v4, vcc244; GCN-NEXT: v_xor_b32_e32 v2, v2, v4245; GCN-NEXT: v_xor_b32_e32 v3, v5, v4246; GCN-NEXT: v_cvt_f32_u32_e32 v4, v3247; GCN-NEXT: v_cvt_f32_u32_e32 v5, v2248; GCN-NEXT: v_sub_i32_e32 v6, vcc, 0, v3249; GCN-NEXT: v_subb_u32_e32 v7, vcc, 0, v2, vcc250; GCN-NEXT: v_madmk_f32 v4, v5, 0x4f800000, v4251; GCN-NEXT: v_rcp_f32_e32 v4, v4252; GCN-NEXT: v_mul_f32_e32 v4, 0x5f7ffffc, v4253; GCN-NEXT: v_mul_f32_e32 v5, 0x2f800000, v4254; GCN-NEXT: v_trunc_f32_e32 v5, v5255; GCN-NEXT: v_madmk_f32 v4, v5, 0xcf800000, v4256; GCN-NEXT: v_cvt_u32_f32_e32 v4, v4257; GCN-NEXT: v_cvt_u32_f32_e32 v5, v5258; GCN-NEXT: v_mul_hi_u32 v8, v6, v4259; GCN-NEXT: v_mul_lo_u32 v9, v6, v5260; GCN-NEXT: v_mul_lo_u32 v10, v7, v4261; GCN-NEXT: v_add_i32_e32 v8, vcc, v8, v9262; GCN-NEXT: v_mul_lo_u32 v9, v6, v4263; GCN-NEXT: v_add_i32_e32 v8, vcc, v8, v10264; GCN-NEXT: v_mul_lo_u32 v10, v4, v8265; GCN-NEXT: v_mul_hi_u32 v11, v4, v9266; GCN-NEXT: v_mul_hi_u32 v12, v4, v8267; GCN-NEXT: v_mul_hi_u32 v13, v5, v8268; GCN-NEXT: v_mul_lo_u32 v8, v5, v8269; GCN-NEXT: v_add_i32_e32 v10, vcc, v11, v10270; GCN-NEXT: v_addc_u32_e32 v11, vcc, 0, v12, vcc271; GCN-NEXT: v_mul_lo_u32 v12, v5, v9272; GCN-NEXT: v_mul_hi_u32 v9, v5, v9273; GCN-NEXT: v_add_i32_e32 v10, vcc, v10, v12274; GCN-NEXT: v_addc_u32_e32 v9, vcc, v11, v9, vcc275; GCN-NEXT: v_addc_u32_e32 v10, vcc, 0, v13, vcc276; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v8277; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc278; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v8279; GCN-NEXT: v_addc_u32_e32 v5, vcc, v5, v9, vcc280; GCN-NEXT: v_mul_lo_u32 v8, v6, v5281; GCN-NEXT: v_mul_hi_u32 v9, v6, v4282; GCN-NEXT: v_mul_lo_u32 v7, v7, v4283; GCN-NEXT: v_mul_lo_u32 v6, v6, v4284; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v8285; GCN-NEXT: v_add_i32_e32 v7, vcc, v8, v7286; GCN-NEXT: v_mul_lo_u32 v10, v4, v7287; GCN-NEXT: v_mul_hi_u32 v11, v4, v6288; GCN-NEXT: v_mul_hi_u32 v12, v4, v7289; GCN-NEXT: v_mul_hi_u32 v9, v5, v6290; GCN-NEXT: v_mul_lo_u32 v6, v5, v6291; GCN-NEXT: v_mul_hi_u32 v8, v5, v7292; GCN-NEXT: v_add_i32_e32 v10, vcc, v11, v10293; GCN-NEXT: v_addc_u32_e32 v11, vcc, 0, v12, vcc294; GCN-NEXT: v_mul_lo_u32 v7, v5, v7295; GCN-NEXT: v_add_i32_e32 v6, vcc, v10, v6296; GCN-NEXT: v_addc_u32_e32 v6, vcc, v11, v9, vcc297; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v8, vcc298; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v7299; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc300; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v6301; GCN-NEXT: v_addc_u32_e32 v5, vcc, v5, v7, vcc302; GCN-NEXT: v_ashrrev_i32_e32 v6, 31, v1303; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v6304; GCN-NEXT: v_xor_b32_e32 v0, v0, v6305; GCN-NEXT: v_mul_lo_u32 v7, v0, v5306; GCN-NEXT: v_mul_hi_u32 v8, v0, v4307; GCN-NEXT: v_mul_hi_u32 v9, v0, v5308; GCN-NEXT: v_addc_u32_e32 v1, vcc, v1, v6, vcc309; GCN-NEXT: v_xor_b32_e32 v1, v1, v6310; GCN-NEXT: v_add_i32_e32 v7, vcc, v8, v7311; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v9, vcc312; GCN-NEXT: v_mul_lo_u32 v9, v1, v4313; GCN-NEXT: v_mul_hi_u32 v4, v1, v4314; GCN-NEXT: v_mul_hi_u32 v10, v1, v5315; GCN-NEXT: v_mul_lo_u32 v5, v1, v5316; GCN-NEXT: v_add_i32_e32 v7, vcc, v7, v9317; GCN-NEXT: v_addc_u32_e32 v4, vcc, v8, v4, vcc318; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v10, vcc319; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v5320; GCN-NEXT: v_addc_u32_e32 v5, vcc, 0, v7, vcc321; GCN-NEXT: v_mul_lo_u32 v5, v3, v5322; GCN-NEXT: v_mul_hi_u32 v7, v3, v4323; GCN-NEXT: v_mul_lo_u32 v8, v2, v4324; GCN-NEXT: v_mul_lo_u32 v4, v3, v4325; GCN-NEXT: v_add_i32_e32 v5, vcc, v7, v5326; GCN-NEXT: v_add_i32_e32 v5, vcc, v5, v8327; GCN-NEXT: v_sub_i32_e32 v7, vcc, v1, v5328; GCN-NEXT: v_sub_i32_e32 v0, vcc, v0, v4329; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v7, v2, vcc330; GCN-NEXT: v_sub_i32_e64 v7, s[4:5], v0, v3331; GCN-NEXT: v_subbrev_u32_e64 v8, s[6:7], 0, v4, s[4:5]332; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v8, v2333; GCN-NEXT: v_cndmask_b32_e64 v9, 0, -1, s[6:7]334; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v7, v3335; GCN-NEXT: v_subb_u32_e32 v1, vcc, v1, v5, vcc336; GCN-NEXT: v_cndmask_b32_e64 v10, 0, -1, s[6:7]337; GCN-NEXT: v_cmp_eq_u32_e64 s[6:7], v8, v2338; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v2, s[4:5]339; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v1, v2340; GCN-NEXT: v_cndmask_b32_e64 v9, v9, v10, s[6:7]341; GCN-NEXT: v_sub_i32_e64 v10, s[4:5], v7, v3342; GCN-NEXT: v_cndmask_b32_e64 v5, 0, -1, vcc343; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v0, v3344; GCN-NEXT: v_subbrev_u32_e64 v4, s[4:5], 0, v4, s[4:5]345; GCN-NEXT: v_cndmask_b32_e64 v3, 0, -1, vcc346; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v1, v2347; GCN-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, v9348; GCN-NEXT: v_cndmask_b32_e32 v2, v5, v3, vcc349; GCN-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2350; GCN-NEXT: v_cndmask_b32_e64 v2, v7, v10, s[4:5]351; GCN-NEXT: v_cndmask_b32_e64 v4, v8, v4, s[4:5]352; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc353; GCN-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc354; GCN-NEXT: v_xor_b32_e32 v0, v0, v6355; GCN-NEXT: v_xor_b32_e32 v1, v1, v6356; GCN-NEXT: v_sub_i32_e32 v0, vcc, v0, v6357; GCN-NEXT: v_subb_u32_e32 v1, vcc, v1, v6, vcc358; GCN-NEXT: s_setpc_b64 s[30:31]359;360; GCN-IR-LABEL: v_test_srem:361; GCN-IR: ; %bb.0: ; %_udiv-special-cases362; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)363; GCN-IR-NEXT: v_ashrrev_i32_e32 v12, 31, v1364; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v12365; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v12366; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v12367; GCN-IR-NEXT: v_ashrrev_i32_e32 v4, 31, v3368; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v12, vcc369; GCN-IR-NEXT: v_xor_b32_e32 v2, v2, v4370; GCN-IR-NEXT: v_xor_b32_e32 v3, v3, v4371; GCN-IR-NEXT: v_sub_i32_e32 v2, vcc, v2, v4372; GCN-IR-NEXT: v_subb_u32_e32 v3, vcc, v3, v4, vcc373; GCN-IR-NEXT: v_ffbh_u32_e32 v4, v2374; GCN-IR-NEXT: v_add_i32_e64 v4, s[6:7], 32, v4375; GCN-IR-NEXT: v_ffbh_u32_e32 v5, v3376; GCN-IR-NEXT: v_min_u32_e32 v10, v4, v5377; GCN-IR-NEXT: v_ffbh_u32_e32 v4, v0378; GCN-IR-NEXT: v_add_i32_e64 v4, s[6:7], 32, v4379; GCN-IR-NEXT: v_ffbh_u32_e32 v5, v1380; GCN-IR-NEXT: v_min_u32_e32 v11, v4, v5381; GCN-IR-NEXT: v_sub_i32_e64 v4, s[6:7], v10, v11382; GCN-IR-NEXT: v_cmp_eq_u64_e32 vcc, 0, v[2:3]383; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], 0, v[0:1]384; GCN-IR-NEXT: v_subb_u32_e64 v5, s[6:7], 0, 0, s[6:7]385; GCN-IR-NEXT: v_cmp_lt_u64_e64 s[6:7], 63, v[4:5]386; GCN-IR-NEXT: s_or_b64 s[4:5], vcc, s[4:5]387; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], s[6:7]388; GCN-IR-NEXT: v_cmp_ne_u64_e32 vcc, 63, v[4:5]389; GCN-IR-NEXT: s_xor_b64 s[6:7], s[4:5], -1390; GCN-IR-NEXT: v_mov_b32_e32 v13, v12391; GCN-IR-NEXT: v_cndmask_b32_e64 v7, v1, 0, s[4:5]392; GCN-IR-NEXT: v_cndmask_b32_e64 v6, v0, 0, s[4:5]393; GCN-IR-NEXT: s_and_b64 s[4:5], s[6:7], vcc394; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]395; GCN-IR-NEXT: s_cbranch_execz .LBB1_6396; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb1397; GCN-IR-NEXT: v_add_i32_e32 v8, vcc, 1, v4398; GCN-IR-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc399; GCN-IR-NEXT: v_sub_i32_e64 v4, s[4:5], 63, v4400; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[0:1], v4401; GCN-IR-NEXT: v_mov_b32_e32 v6, 0402; GCN-IR-NEXT: v_mov_b32_e32 v7, 0403; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -1404; GCN-IR-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]405; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[8:9]406; GCN-IR-NEXT: s_cbranch_execz .LBB1_5407; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader408; GCN-IR-NEXT: v_add_i32_e32 v14, vcc, -1, v2409; GCN-IR-NEXT: v_addc_u32_e32 v15, vcc, -1, v3, vcc410; GCN-IR-NEXT: v_not_b32_e32 v6, v10411; GCN-IR-NEXT: v_add_i32_e32 v16, vcc, v6, v11412; GCN-IR-NEXT: v_lshr_b64 v[8:9], v[0:1], v8413; GCN-IR-NEXT: v_addc_u32_e64 v17, s[8:9], -1, 0, vcc414; GCN-IR-NEXT: v_mov_b32_e32 v10, 0415; GCN-IR-NEXT: s_mov_b64 s[8:9], 0416; GCN-IR-NEXT: v_mov_b32_e32 v11, 0417; GCN-IR-NEXT: v_mov_b32_e32 v7, 0418; GCN-IR-NEXT: .LBB1_3: ; %udiv-do-while419; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=1420; GCN-IR-NEXT: v_lshl_b64 v[8:9], v[8:9], 1421; GCN-IR-NEXT: v_lshrrev_b32_e32 v6, 31, v5422; GCN-IR-NEXT: v_or_b32_e32 v8, v8, v6423; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[4:5], 1424; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v14, v8425; GCN-IR-NEXT: v_subb_u32_e32 v6, vcc, v15, v9, vcc426; GCN-IR-NEXT: v_or_b32_e32 v4, v10, v4427; GCN-IR-NEXT: v_ashrrev_i32_e32 v10, 31, v6428; GCN-IR-NEXT: v_or_b32_e32 v5, v11, v5429; GCN-IR-NEXT: v_and_b32_e32 v6, 1, v10430; GCN-IR-NEXT: v_and_b32_e32 v11, v10, v3431; GCN-IR-NEXT: v_and_b32_e32 v10, v10, v2432; GCN-IR-NEXT: v_sub_i32_e32 v8, vcc, v8, v10433; GCN-IR-NEXT: v_subb_u32_e32 v9, vcc, v9, v11, vcc434; GCN-IR-NEXT: v_add_i32_e32 v16, vcc, 1, v16435; GCN-IR-NEXT: v_addc_u32_e32 v17, vcc, 0, v17, vcc436; GCN-IR-NEXT: v_mov_b32_e32 v11, v7437; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]438; GCN-IR-NEXT: v_mov_b32_e32 v10, v6439; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]440; GCN-IR-NEXT: s_cbranch_execnz .LBB1_3441; GCN-IR-NEXT: ; %bb.4: ; %Flow442; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]443; GCN-IR-NEXT: .LBB1_5: ; %Flow4444; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]445; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[4:5], 1446; GCN-IR-NEXT: v_or_b32_e32 v7, v7, v5447; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v4448; GCN-IR-NEXT: .LBB1_6: ; %Flow5449; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]450; GCN-IR-NEXT: v_mul_lo_u32 v4, v2, v7451; GCN-IR-NEXT: v_mul_hi_u32 v5, v2, v6452; GCN-IR-NEXT: v_mul_lo_u32 v3, v3, v6453; GCN-IR-NEXT: v_mul_lo_u32 v2, v2, v6454; GCN-IR-NEXT: v_add_i32_e32 v4, vcc, v5, v4455; GCN-IR-NEXT: v_add_i32_e32 v3, vcc, v4, v3456; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v2457; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v3, vcc458; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v12459; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v13460; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v12461; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v13, vcc462; GCN-IR-NEXT: s_setpc_b64 s[30:31]463 %result = srem i64 %x, %y464 ret i64 %result465}466 467define amdgpu_kernel void @s_test_srem23_64(ptr addrspace(1) %out, i64 %x, i64 %y) {468; GCN-LABEL: s_test_srem23_64:469; GCN: ; %bb.0:470; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9471; GCN-NEXT: s_waitcnt lgkmcnt(0)472; GCN-NEXT: s_load_dword s2, s[4:5], 0xe473; GCN-NEXT: s_mov_b32 s7, 0xf000474; GCN-NEXT: s_mov_b32 s6, -1475; GCN-NEXT: s_ashr_i32 s3, s3, 9476; GCN-NEXT: s_waitcnt lgkmcnt(0)477; GCN-NEXT: s_ashr_i32 s2, s2, 9478; GCN-NEXT: v_cvt_f32_i32_e32 v0, s2479; GCN-NEXT: v_cvt_f32_i32_e32 v1, s3480; GCN-NEXT: s_mov_b32 s4, s0481; GCN-NEXT: s_xor_b32 s0, s3, s2482; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v0483; GCN-NEXT: s_ashr_i32 s0, s0, 30484; GCN-NEXT: s_mov_b32 s5, s1485; GCN-NEXT: s_or_b32 s8, s0, 1486; GCN-NEXT: v_mul_f32_e32 v2, v1, v2487; GCN-NEXT: v_trunc_f32_e32 v2, v2488; GCN-NEXT: v_mad_f32 v1, -v2, v0, v1489; GCN-NEXT: v_cvt_i32_f32_e32 v2, v2490; GCN-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|491; GCN-NEXT: s_and_b64 s[0:1], s[0:1], exec492; GCN-NEXT: s_cselect_b32 s0, s8, 0493; GCN-NEXT: v_readfirstlane_b32 s1, v2494; GCN-NEXT: s_add_i32 s0, s1, s0495; GCN-NEXT: s_mul_i32 s0, s0, s2496; GCN-NEXT: s_sub_i32 s0, s3, s0497; GCN-NEXT: s_bfe_i32 s0, s0, 0x170000498; GCN-NEXT: s_ashr_i32 s1, s0, 31499; GCN-NEXT: v_mov_b32_e32 v0, s0500; GCN-NEXT: v_mov_b32_e32 v1, s1501; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0502; GCN-NEXT: s_endpgm503;504; GCN-IR-LABEL: s_test_srem23_64:505; GCN-IR: ; %bb.0:506; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9507; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)508; GCN-IR-NEXT: s_load_dword s2, s[4:5], 0xe509; GCN-IR-NEXT: s_mov_b32 s7, 0xf000510; GCN-IR-NEXT: s_mov_b32 s6, -1511; GCN-IR-NEXT: s_ashr_i32 s3, s3, 9512; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)513; GCN-IR-NEXT: s_ashr_i32 s2, s2, 9514; GCN-IR-NEXT: v_cvt_f32_i32_e32 v0, s2515; GCN-IR-NEXT: v_cvt_f32_i32_e32 v1, s3516; GCN-IR-NEXT: s_mov_b32 s4, s0517; GCN-IR-NEXT: s_xor_b32 s0, s3, s2518; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v0519; GCN-IR-NEXT: s_ashr_i32 s0, s0, 30520; GCN-IR-NEXT: s_mov_b32 s5, s1521; GCN-IR-NEXT: s_or_b32 s8, s0, 1522; GCN-IR-NEXT: v_mul_f32_e32 v2, v1, v2523; GCN-IR-NEXT: v_trunc_f32_e32 v2, v2524; GCN-IR-NEXT: v_mad_f32 v1, -v2, v0, v1525; GCN-IR-NEXT: v_cvt_i32_f32_e32 v2, v2526; GCN-IR-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|527; GCN-IR-NEXT: s_and_b64 s[0:1], s[0:1], exec528; GCN-IR-NEXT: s_cselect_b32 s0, s8, 0529; GCN-IR-NEXT: v_readfirstlane_b32 s1, v2530; GCN-IR-NEXT: s_add_i32 s0, s1, s0531; GCN-IR-NEXT: s_mul_i32 s0, s0, s2532; GCN-IR-NEXT: s_sub_i32 s0, s3, s0533; GCN-IR-NEXT: s_bfe_i32 s0, s0, 0x170000534; GCN-IR-NEXT: s_ashr_i32 s1, s0, 31535; GCN-IR-NEXT: v_mov_b32_e32 v0, s0536; GCN-IR-NEXT: v_mov_b32_e32 v1, s1537; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0538; GCN-IR-NEXT: s_endpgm539 %1 = ashr i64 %x, 41540 %2 = ashr i64 %y, 41541 %result = srem i64 %1, %2542 store i64 %result, ptr addrspace(1) %out543 ret void544}545 546define amdgpu_kernel void @s_test_srem24_64(ptr addrspace(1) %out, i64 %x, i64 %y) {547; GCN-LABEL: s_test_srem24_64:548; GCN: ; %bb.0:549; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9550; GCN-NEXT: s_waitcnt lgkmcnt(0)551; GCN-NEXT: s_load_dword s2, s[4:5], 0xe552; GCN-NEXT: s_mov_b32 s7, 0xf000553; GCN-NEXT: s_mov_b32 s6, -1554; GCN-NEXT: s_ashr_i32 s3, s3, 8555; GCN-NEXT: s_waitcnt lgkmcnt(0)556; GCN-NEXT: s_ashr_i32 s2, s2, 8557; GCN-NEXT: v_cvt_f32_i32_e32 v0, s2558; GCN-NEXT: v_cvt_f32_i32_e32 v1, s3559; GCN-NEXT: s_mov_b32 s4, s0560; GCN-NEXT: s_xor_b32 s0, s3, s2561; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v0562; GCN-NEXT: s_ashr_i32 s0, s0, 30563; GCN-NEXT: s_mov_b32 s5, s1564; GCN-NEXT: s_or_b32 s8, s0, 1565; GCN-NEXT: v_mul_f32_e32 v2, v1, v2566; GCN-NEXT: v_trunc_f32_e32 v2, v2567; GCN-NEXT: v_mad_f32 v1, -v2, v0, v1568; GCN-NEXT: v_cvt_i32_f32_e32 v2, v2569; GCN-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|570; GCN-NEXT: s_and_b64 s[0:1], s[0:1], exec571; GCN-NEXT: s_cselect_b32 s0, s8, 0572; GCN-NEXT: v_readfirstlane_b32 s1, v2573; GCN-NEXT: s_add_i32 s0, s1, s0574; GCN-NEXT: s_mul_i32 s0, s0, s2575; GCN-NEXT: s_sub_i32 s0, s3, s0576; GCN-NEXT: s_bfe_i32 s0, s0, 0x180000577; GCN-NEXT: s_ashr_i32 s1, s0, 31578; GCN-NEXT: v_mov_b32_e32 v0, s0579; GCN-NEXT: v_mov_b32_e32 v1, s1580; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0581; GCN-NEXT: s_endpgm582;583; GCN-IR-LABEL: s_test_srem24_64:584; GCN-IR: ; %bb.0:585; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9586; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)587; GCN-IR-NEXT: s_load_dword s2, s[4:5], 0xe588; GCN-IR-NEXT: s_mov_b32 s7, 0xf000589; GCN-IR-NEXT: s_mov_b32 s6, -1590; GCN-IR-NEXT: s_ashr_i32 s3, s3, 8591; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)592; GCN-IR-NEXT: s_ashr_i32 s2, s2, 8593; GCN-IR-NEXT: v_cvt_f32_i32_e32 v0, s2594; GCN-IR-NEXT: v_cvt_f32_i32_e32 v1, s3595; GCN-IR-NEXT: s_mov_b32 s4, s0596; GCN-IR-NEXT: s_xor_b32 s0, s3, s2597; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v0598; GCN-IR-NEXT: s_ashr_i32 s0, s0, 30599; GCN-IR-NEXT: s_mov_b32 s5, s1600; GCN-IR-NEXT: s_or_b32 s8, s0, 1601; GCN-IR-NEXT: v_mul_f32_e32 v2, v1, v2602; GCN-IR-NEXT: v_trunc_f32_e32 v2, v2603; GCN-IR-NEXT: v_mad_f32 v1, -v2, v0, v1604; GCN-IR-NEXT: v_cvt_i32_f32_e32 v2, v2605; GCN-IR-NEXT: v_cmp_ge_f32_e64 s[0:1], |v1|, |v0|606; GCN-IR-NEXT: s_and_b64 s[0:1], s[0:1], exec607; GCN-IR-NEXT: s_cselect_b32 s0, s8, 0608; GCN-IR-NEXT: v_readfirstlane_b32 s1, v2609; GCN-IR-NEXT: s_add_i32 s0, s1, s0610; GCN-IR-NEXT: s_mul_i32 s0, s0, s2611; GCN-IR-NEXT: s_sub_i32 s0, s3, s0612; GCN-IR-NEXT: s_bfe_i32 s0, s0, 0x180000613; GCN-IR-NEXT: s_ashr_i32 s1, s0, 31614; GCN-IR-NEXT: v_mov_b32_e32 v0, s0615; GCN-IR-NEXT: v_mov_b32_e32 v1, s1616; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0617; GCN-IR-NEXT: s_endpgm618 %1 = ashr i64 %x, 40619 %2 = ashr i64 %y, 40620 %result = srem i64 %1, %2621 store i64 %result, ptr addrspace(1) %out622 ret void623}624 625define i64 @v_test_srem24_64(i64 %x, i64 %y) {626; GCN-LABEL: v_test_srem24_64:627; GCN: ; %bb.0:628; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)629; GCN-NEXT: v_ashrrev_i32_e32 v0, 8, v3630; GCN-NEXT: v_cvt_f32_i32_e32 v2, v0631; GCN-NEXT: v_ashrrev_i32_e32 v1, 8, v1632; GCN-NEXT: v_cvt_f32_i32_e32 v3, v1633; GCN-NEXT: v_xor_b32_e32 v5, v1, v0634; GCN-NEXT: v_rcp_iflag_f32_e32 v4, v2635; GCN-NEXT: v_ashrrev_i32_e32 v5, 30, v5636; GCN-NEXT: v_or_b32_e32 v5, 1, v5637; GCN-NEXT: v_mul_f32_e32 v4, v3, v4638; GCN-NEXT: v_trunc_f32_e32 v4, v4639; GCN-NEXT: v_mad_f32 v3, -v4, v2, v3640; GCN-NEXT: v_cvt_i32_f32_e32 v4, v4641; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v3|, |v2|642; GCN-NEXT: v_cndmask_b32_e32 v2, 0, v5, vcc643; GCN-NEXT: v_add_i32_e32 v2, vcc, v4, v2644; GCN-NEXT: v_mul_lo_u32 v0, v2, v0645; GCN-NEXT: v_sub_i32_e32 v0, vcc, v1, v0646; GCN-NEXT: v_bfe_i32 v0, v0, 0, 24647; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v0648; GCN-NEXT: s_setpc_b64 s[30:31]649;650; GCN-IR-LABEL: v_test_srem24_64:651; GCN-IR: ; %bb.0:652; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)653; GCN-IR-NEXT: v_ashrrev_i32_e32 v0, 8, v3654; GCN-IR-NEXT: v_cvt_f32_i32_e32 v2, v0655; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 8, v1656; GCN-IR-NEXT: v_cvt_f32_i32_e32 v3, v1657; GCN-IR-NEXT: v_xor_b32_e32 v5, v1, v0658; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v4, v2659; GCN-IR-NEXT: v_ashrrev_i32_e32 v5, 30, v5660; GCN-IR-NEXT: v_or_b32_e32 v5, 1, v5661; GCN-IR-NEXT: v_mul_f32_e32 v4, v3, v4662; GCN-IR-NEXT: v_trunc_f32_e32 v4, v4663; GCN-IR-NEXT: v_mad_f32 v3, -v4, v2, v3664; GCN-IR-NEXT: v_cvt_i32_f32_e32 v4, v4665; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v3|, |v2|666; GCN-IR-NEXT: v_cndmask_b32_e32 v2, 0, v5, vcc667; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, v4, v2668; GCN-IR-NEXT: v_mul_lo_u32 v0, v2, v0669; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v1, v0670; GCN-IR-NEXT: v_bfe_i32 v0, v0, 0, 24671; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v0672; GCN-IR-NEXT: s_setpc_b64 s[30:31]673 %1 = ashr i64 %x, 40674 %2 = ashr i64 %y, 40675 %result = srem i64 %1, %2676 ret i64 %result677}678 679define amdgpu_kernel void @s_test_srem25_64(ptr addrspace(1) %out, i64 %x, i64 %y) {680; GCN-LABEL: s_test_srem25_64:681; GCN: ; %bb.0:682; GCN-NEXT: s_load_dword s0, s[4:5], 0xe683; GCN-NEXT: s_mov_b32 s7, 0xf000684; GCN-NEXT: s_mov_b32 s6, -1685; GCN-NEXT: s_waitcnt lgkmcnt(0)686; GCN-NEXT: s_ashr_i32 s0, s0, 7687; GCN-NEXT: s_abs_i32 s8, s0688; GCN-NEXT: v_cvt_f32_u32_e32 v0, s8689; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9690; GCN-NEXT: s_waitcnt lgkmcnt(0)691; GCN-NEXT: s_sub_i32 s2, 0, s8692; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0693; GCN-NEXT: s_mov_b32 s5, s1694; GCN-NEXT: s_mov_b32 s4, s0695; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0696; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0697; GCN-NEXT: s_ashr_i32 s0, s3, 31698; GCN-NEXT: v_mul_lo_u32 v1, s2, v0699; GCN-NEXT: s_ashr_i32 s2, s3, 7700; GCN-NEXT: s_abs_i32 s2, s2701; GCN-NEXT: v_mul_hi_u32 v1, v0, v1702; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v1703; GCN-NEXT: v_mul_hi_u32 v0, s2, v0704; GCN-NEXT: v_readfirstlane_b32 s1, v0705; GCN-NEXT: s_mul_i32 s1, s1, s8706; GCN-NEXT: s_sub_i32 s1, s2, s1707; GCN-NEXT: s_sub_i32 s2, s1, s8708; GCN-NEXT: s_cmp_ge_u32 s1, s8709; GCN-NEXT: s_cselect_b32 s1, s2, s1710; GCN-NEXT: s_sub_i32 s2, s1, s8711; GCN-NEXT: s_cmp_ge_u32 s1, s8712; GCN-NEXT: s_cselect_b32 s1, s2, s1713; GCN-NEXT: s_xor_b32 s1, s1, s0714; GCN-NEXT: s_sub_i32 s0, s1, s0715; GCN-NEXT: s_ashr_i32 s1, s0, 31716; GCN-NEXT: v_mov_b32_e32 v0, s0717; GCN-NEXT: v_mov_b32_e32 v1, s1718; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0719; GCN-NEXT: s_endpgm720;721; GCN-IR-LABEL: s_test_srem25_64:722; GCN-IR: ; %bb.0:723; GCN-IR-NEXT: s_load_dword s0, s[4:5], 0xe724; GCN-IR-NEXT: s_mov_b32 s7, 0xf000725; GCN-IR-NEXT: s_mov_b32 s6, -1726; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)727; GCN-IR-NEXT: s_ashr_i32 s0, s0, 7728; GCN-IR-NEXT: s_abs_i32 s8, s0729; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s8730; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9731; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)732; GCN-IR-NEXT: s_sub_i32 s2, 0, s8733; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0734; GCN-IR-NEXT: s_mov_b32 s5, s1735; GCN-IR-NEXT: s_mov_b32 s4, s0736; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0737; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0738; GCN-IR-NEXT: s_ashr_i32 s0, s3, 31739; GCN-IR-NEXT: v_mul_lo_u32 v1, s2, v0740; GCN-IR-NEXT: s_ashr_i32 s2, s3, 7741; GCN-IR-NEXT: s_abs_i32 s2, s2742; GCN-IR-NEXT: v_mul_hi_u32 v1, v0, v1743; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v1744; GCN-IR-NEXT: v_mul_hi_u32 v0, s2, v0745; GCN-IR-NEXT: v_readfirstlane_b32 s1, v0746; GCN-IR-NEXT: s_mul_i32 s1, s1, s8747; GCN-IR-NEXT: s_sub_i32 s1, s2, s1748; GCN-IR-NEXT: s_sub_i32 s2, s1, s8749; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8750; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1751; GCN-IR-NEXT: s_sub_i32 s2, s1, s8752; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8753; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1754; GCN-IR-NEXT: s_xor_b32 s1, s1, s0755; GCN-IR-NEXT: s_sub_i32 s0, s1, s0756; GCN-IR-NEXT: s_ashr_i32 s1, s0, 31757; GCN-IR-NEXT: v_mov_b32_e32 v0, s0758; GCN-IR-NEXT: v_mov_b32_e32 v1, s1759; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0760; GCN-IR-NEXT: s_endpgm761 %1 = ashr i64 %x, 39762 %2 = ashr i64 %y, 39763 %result = srem i64 %1, %2764 store i64 %result, ptr addrspace(1) %out765 ret void766}767 768define amdgpu_kernel void @s_test_srem31_64(ptr addrspace(1) %out, i64 %x, i64 %y) {769; GCN-LABEL: s_test_srem31_64:770; GCN: ; %bb.0:771; GCN-NEXT: s_load_dword s0, s[4:5], 0xe772; GCN-NEXT: s_mov_b32 s7, 0xf000773; GCN-NEXT: s_mov_b32 s6, -1774; GCN-NEXT: s_waitcnt lgkmcnt(0)775; GCN-NEXT: s_ashr_i32 s0, s0, 1776; GCN-NEXT: s_abs_i32 s8, s0777; GCN-NEXT: v_cvt_f32_u32_e32 v0, s8778; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9779; GCN-NEXT: s_waitcnt lgkmcnt(0)780; GCN-NEXT: s_sub_i32 s2, 0, s8781; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0782; GCN-NEXT: s_mov_b32 s5, s1783; GCN-NEXT: s_mov_b32 s4, s0784; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0785; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0786; GCN-NEXT: s_ashr_i32 s0, s3, 31787; GCN-NEXT: v_mul_lo_u32 v1, s2, v0788; GCN-NEXT: s_ashr_i32 s2, s3, 1789; GCN-NEXT: s_abs_i32 s2, s2790; GCN-NEXT: v_mul_hi_u32 v1, v0, v1791; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v1792; GCN-NEXT: v_mul_hi_u32 v0, s2, v0793; GCN-NEXT: v_readfirstlane_b32 s1, v0794; GCN-NEXT: s_mul_i32 s1, s1, s8795; GCN-NEXT: s_sub_i32 s1, s2, s1796; GCN-NEXT: s_sub_i32 s2, s1, s8797; GCN-NEXT: s_cmp_ge_u32 s1, s8798; GCN-NEXT: s_cselect_b32 s1, s2, s1799; GCN-NEXT: s_sub_i32 s2, s1, s8800; GCN-NEXT: s_cmp_ge_u32 s1, s8801; GCN-NEXT: s_cselect_b32 s1, s2, s1802; GCN-NEXT: s_xor_b32 s1, s1, s0803; GCN-NEXT: s_sub_i32 s0, s1, s0804; GCN-NEXT: s_ashr_i32 s1, s0, 31805; GCN-NEXT: v_mov_b32_e32 v0, s0806; GCN-NEXT: v_mov_b32_e32 v1, s1807; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0808; GCN-NEXT: s_endpgm809;810; GCN-IR-LABEL: s_test_srem31_64:811; GCN-IR: ; %bb.0:812; GCN-IR-NEXT: s_load_dword s0, s[4:5], 0xe813; GCN-IR-NEXT: s_mov_b32 s7, 0xf000814; GCN-IR-NEXT: s_mov_b32 s6, -1815; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)816; GCN-IR-NEXT: s_ashr_i32 s0, s0, 1817; GCN-IR-NEXT: s_abs_i32 s8, s0818; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s8819; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9820; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)821; GCN-IR-NEXT: s_sub_i32 s2, 0, s8822; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0823; GCN-IR-NEXT: s_mov_b32 s5, s1824; GCN-IR-NEXT: s_mov_b32 s4, s0825; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0826; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0827; GCN-IR-NEXT: s_ashr_i32 s0, s3, 31828; GCN-IR-NEXT: v_mul_lo_u32 v1, s2, v0829; GCN-IR-NEXT: s_ashr_i32 s2, s3, 1830; GCN-IR-NEXT: s_abs_i32 s2, s2831; GCN-IR-NEXT: v_mul_hi_u32 v1, v0, v1832; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v1833; GCN-IR-NEXT: v_mul_hi_u32 v0, s2, v0834; GCN-IR-NEXT: v_readfirstlane_b32 s1, v0835; GCN-IR-NEXT: s_mul_i32 s1, s1, s8836; GCN-IR-NEXT: s_sub_i32 s1, s2, s1837; GCN-IR-NEXT: s_sub_i32 s2, s1, s8838; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8839; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1840; GCN-IR-NEXT: s_sub_i32 s2, s1, s8841; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8842; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1843; GCN-IR-NEXT: s_xor_b32 s1, s1, s0844; GCN-IR-NEXT: s_sub_i32 s0, s1, s0845; GCN-IR-NEXT: s_ashr_i32 s1, s0, 31846; GCN-IR-NEXT: v_mov_b32_e32 v0, s0847; GCN-IR-NEXT: v_mov_b32_e32 v1, s1848; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0849; GCN-IR-NEXT: s_endpgm850 %1 = ashr i64 %x, 33851 %2 = ashr i64 %y, 33852 %result = srem i64 %1, %2853 store i64 %result, ptr addrspace(1) %out854 ret void855}856 857; 32 known sign bits858define amdgpu_kernel void @s_test_srem32_64(ptr addrspace(1) %out, i64 %x, i64 %y) {859; GCN-LABEL: s_test_srem32_64:860; GCN: ; %bb.0:861; GCN-NEXT: s_load_dword s0, s[4:5], 0xe862; GCN-NEXT: s_mov_b32 s7, 0xf000863; GCN-NEXT: s_mov_b32 s6, -1864; GCN-NEXT: s_waitcnt lgkmcnt(0)865; GCN-NEXT: s_abs_i32 s8, s0866; GCN-NEXT: v_cvt_f32_u32_e32 v0, s8867; GCN-NEXT: s_sub_i32 s0, 0, s8868; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0869; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0870; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0871; GCN-NEXT: v_mul_lo_u32 v1, s0, v0872; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9873; GCN-NEXT: v_mul_hi_u32 v1, v0, v1874; GCN-NEXT: s_waitcnt lgkmcnt(0)875; GCN-NEXT: s_abs_i32 s2, s3876; GCN-NEXT: s_mov_b32 s5, s1877; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v1878; GCN-NEXT: v_mul_hi_u32 v0, s2, v0879; GCN-NEXT: s_mov_b32 s4, s0880; GCN-NEXT: s_ashr_i32 s0, s3, 31881; GCN-NEXT: v_readfirstlane_b32 s1, v0882; GCN-NEXT: s_mul_i32 s1, s1, s8883; GCN-NEXT: s_sub_i32 s1, s2, s1884; GCN-NEXT: s_sub_i32 s2, s1, s8885; GCN-NEXT: s_cmp_ge_u32 s1, s8886; GCN-NEXT: s_cselect_b32 s1, s2, s1887; GCN-NEXT: s_sub_i32 s2, s1, s8888; GCN-NEXT: s_cmp_ge_u32 s1, s8889; GCN-NEXT: s_cselect_b32 s1, s2, s1890; GCN-NEXT: s_xor_b32 s1, s1, s0891; GCN-NEXT: s_sub_i32 s0, s1, s0892; GCN-NEXT: s_ashr_i32 s1, s0, 31893; GCN-NEXT: v_mov_b32_e32 v0, s0894; GCN-NEXT: v_mov_b32_e32 v1, s1895; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0896; GCN-NEXT: s_endpgm897;898; GCN-IR-LABEL: s_test_srem32_64:899; GCN-IR: ; %bb.0:900; GCN-IR-NEXT: s_load_dword s0, s[4:5], 0xe901; GCN-IR-NEXT: s_mov_b32 s7, 0xf000902; GCN-IR-NEXT: s_mov_b32 s6, -1903; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)904; GCN-IR-NEXT: s_abs_i32 s8, s0905; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s8906; GCN-IR-NEXT: s_sub_i32 s0, 0, s8907; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0908; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0909; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0910; GCN-IR-NEXT: v_mul_lo_u32 v1, s0, v0911; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9912; GCN-IR-NEXT: v_mul_hi_u32 v1, v0, v1913; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)914; GCN-IR-NEXT: s_abs_i32 s2, s3915; GCN-IR-NEXT: s_mov_b32 s5, s1916; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v1917; GCN-IR-NEXT: v_mul_hi_u32 v0, s2, v0918; GCN-IR-NEXT: s_mov_b32 s4, s0919; GCN-IR-NEXT: s_ashr_i32 s0, s3, 31920; GCN-IR-NEXT: v_readfirstlane_b32 s1, v0921; GCN-IR-NEXT: s_mul_i32 s1, s1, s8922; GCN-IR-NEXT: s_sub_i32 s1, s2, s1923; GCN-IR-NEXT: s_sub_i32 s2, s1, s8924; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8925; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1926; GCN-IR-NEXT: s_sub_i32 s2, s1, s8927; GCN-IR-NEXT: s_cmp_ge_u32 s1, s8928; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1929; GCN-IR-NEXT: s_xor_b32 s1, s1, s0930; GCN-IR-NEXT: s_sub_i32 s0, s1, s0931; GCN-IR-NEXT: s_ashr_i32 s1, s0, 31932; GCN-IR-NEXT: v_mov_b32_e32 v0, s0933; GCN-IR-NEXT: v_mov_b32_e32 v1, s1934; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0935; GCN-IR-NEXT: s_endpgm936 %1 = ashr i64 %x, 32937 %2 = ashr i64 %y, 32938 %result = srem i64 %1, %2939 store i64 %result, ptr addrspace(1) %out940 ret void941}942 943; 33 known sign bits944define amdgpu_kernel void @s_test_srem33_64(ptr addrspace(1) %out, i64 %x, i64 %y) {945; GCN-LABEL: s_test_srem33_64:946; GCN: ; %bb.0:947; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9948; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0xd949; GCN-NEXT: s_waitcnt lgkmcnt(0)950; GCN-NEXT: s_ashr_i64 s[6:7], s[2:3], 31951; GCN-NEXT: s_ashr_i64 s[2:3], s[4:5], 31952; GCN-NEXT: s_ashr_i32 s4, s3, 31953; GCN-NEXT: s_add_u32 s2, s2, s4954; GCN-NEXT: s_mov_b32 s5, s4955; GCN-NEXT: s_addc_u32 s3, s3, s4956; GCN-NEXT: s_xor_b64 s[4:5], s[2:3], s[4:5]957; GCN-NEXT: v_cvt_f32_u32_e32 v0, s4958; GCN-NEXT: v_cvt_f32_u32_e32 v1, s5959; GCN-NEXT: s_sub_u32 s8, 0, s4960; GCN-NEXT: s_subb_u32 s9, 0, s5961; GCN-NEXT: s_mov_b32 s3, 0xf000962; GCN-NEXT: v_madmk_f32 v0, v1, 0x4f800000, v0963; GCN-NEXT: v_rcp_f32_e32 v0, v0964; GCN-NEXT: v_mul_f32_e32 v0, 0x5f7ffffc, v0965; GCN-NEXT: v_mul_f32_e32 v1, 0x2f800000, v0966; GCN-NEXT: v_trunc_f32_e32 v1, v1967; GCN-NEXT: v_madmk_f32 v0, v1, 0xcf800000, v0968; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0969; GCN-NEXT: v_cvt_u32_f32_e32 v1, v1970; GCN-NEXT: v_mul_hi_u32 v2, s8, v0971; GCN-NEXT: v_readfirstlane_b32 s10, v1972; GCN-NEXT: v_readfirstlane_b32 s2, v0973; GCN-NEXT: s_mul_i32 s11, s8, s10974; GCN-NEXT: v_readfirstlane_b32 s14, v2975; GCN-NEXT: s_mul_i32 s12, s9, s2976; GCN-NEXT: s_mul_i32 s13, s8, s2977; GCN-NEXT: s_add_i32 s11, s14, s11978; GCN-NEXT: v_mul_hi_u32 v3, v0, s13979; GCN-NEXT: s_add_i32 s11, s11, s12980; GCN-NEXT: v_mul_hi_u32 v0, v0, s11981; GCN-NEXT: v_mul_hi_u32 v4, v1, s13982; GCN-NEXT: v_readfirstlane_b32 s12, v3983; GCN-NEXT: s_mul_i32 s14, s2, s11984; GCN-NEXT: v_mul_hi_u32 v1, v1, s11985; GCN-NEXT: s_add_u32 s12, s12, s14986; GCN-NEXT: v_readfirstlane_b32 s14, v0987; GCN-NEXT: s_addc_u32 s14, 0, s14988; GCN-NEXT: s_mul_i32 s13, s10, s13989; GCN-NEXT: v_readfirstlane_b32 s15, v4990; GCN-NEXT: s_add_u32 s12, s12, s13991; GCN-NEXT: s_addc_u32 s12, s14, s15992; GCN-NEXT: v_readfirstlane_b32 s13, v1993; GCN-NEXT: s_addc_u32 s13, s13, 0994; GCN-NEXT: s_mul_i32 s11, s10, s11995; GCN-NEXT: s_add_u32 s11, s12, s11996; GCN-NEXT: s_addc_u32 s12, 0, s13997; GCN-NEXT: s_add_u32 s11, s2, s11998; GCN-NEXT: v_mov_b32_e32 v0, s11999; GCN-NEXT: v_mul_hi_u32 v0, s8, v01000; GCN-NEXT: s_addc_u32 s10, s10, s121001; GCN-NEXT: s_mul_i32 s12, s8, s101002; GCN-NEXT: s_mul_i32 s9, s9, s111003; GCN-NEXT: v_readfirstlane_b32 s13, v01004; GCN-NEXT: s_add_i32 s12, s13, s121005; GCN-NEXT: s_mul_i32 s8, s8, s111006; GCN-NEXT: s_add_i32 s9, s12, s91007; GCN-NEXT: v_mov_b32_e32 v2, s81008; GCN-NEXT: v_mov_b32_e32 v0, s91009; GCN-NEXT: v_mul_hi_u32 v3, s10, v21010; GCN-NEXT: v_mul_hi_u32 v2, s11, v21011; GCN-NEXT: v_mul_hi_u32 v1, s10, v01012; GCN-NEXT: v_mul_hi_u32 v0, s11, v01013; GCN-NEXT: s_mul_i32 s13, s11, s91014; GCN-NEXT: v_readfirstlane_b32 s15, v21015; GCN-NEXT: s_add_u32 s13, s15, s131016; GCN-NEXT: v_readfirstlane_b32 s14, v01017; GCN-NEXT: s_mul_i32 s8, s10, s81018; GCN-NEXT: s_addc_u32 s14, 0, s141019; GCN-NEXT: v_readfirstlane_b32 s12, v31020; GCN-NEXT: s_add_u32 s8, s13, s81021; GCN-NEXT: s_addc_u32 s8, s14, s121022; GCN-NEXT: v_readfirstlane_b32 s12, v11023; GCN-NEXT: s_addc_u32 s12, s12, 01024; GCN-NEXT: s_mul_i32 s9, s10, s91025; GCN-NEXT: s_add_u32 s8, s8, s91026; GCN-NEXT: s_addc_u32 s9, 0, s121027; GCN-NEXT: s_add_u32 s11, s11, s81028; GCN-NEXT: s_addc_u32 s10, s10, s91029; GCN-NEXT: s_ashr_i32 s8, s7, 311030; GCN-NEXT: s_add_u32 s6, s6, s81031; GCN-NEXT: s_mov_b32 s9, s81032; GCN-NEXT: s_addc_u32 s7, s7, s81033; GCN-NEXT: s_xor_b64 s[6:7], s[6:7], s[8:9]1034; GCN-NEXT: v_mov_b32_e32 v0, s101035; GCN-NEXT: v_mul_hi_u32 v1, s6, v01036; GCN-NEXT: v_mov_b32_e32 v2, s111037; GCN-NEXT: v_mul_hi_u32 v3, s6, v21038; GCN-NEXT: s_mul_i32 s12, s6, s101039; GCN-NEXT: v_readfirstlane_b32 s13, v11040; GCN-NEXT: v_mul_hi_u32 v1, s7, v21041; GCN-NEXT: v_readfirstlane_b32 s14, v31042; GCN-NEXT: v_mul_hi_u32 v0, s7, v01043; GCN-NEXT: s_add_u32 s12, s14, s121044; GCN-NEXT: s_addc_u32 s13, 0, s131045; GCN-NEXT: s_mul_i32 s11, s7, s111046; GCN-NEXT: v_readfirstlane_b32 s14, v11047; GCN-NEXT: s_add_u32 s11, s12, s111048; GCN-NEXT: s_addc_u32 s11, s13, s141049; GCN-NEXT: v_readfirstlane_b32 s12, v01050; GCN-NEXT: s_addc_u32 s12, s12, 01051; GCN-NEXT: s_mul_i32 s10, s7, s101052; GCN-NEXT: s_add_u32 s10, s11, s101053; GCN-NEXT: v_mov_b32_e32 v0, s101054; GCN-NEXT: v_mul_hi_u32 v0, s4, v01055; GCN-NEXT: s_addc_u32 s11, 0, s121056; GCN-NEXT: s_mul_i32 s11, s4, s111057; GCN-NEXT: s_mov_b32 s2, -11058; GCN-NEXT: v_readfirstlane_b32 s12, v01059; GCN-NEXT: s_add_i32 s11, s12, s111060; GCN-NEXT: s_mul_i32 s12, s5, s101061; GCN-NEXT: s_add_i32 s14, s11, s121062; GCN-NEXT: s_sub_i32 s12, s7, s141063; GCN-NEXT: s_mul_i32 s10, s4, s101064; GCN-NEXT: s_sub_u32 s6, s6, s101065; GCN-NEXT: s_cselect_b64 s[10:11], -1, 01066; GCN-NEXT: s_subb_u32 s15, s12, s51067; GCN-NEXT: s_sub_u32 s16, s6, s41068; GCN-NEXT: s_cselect_b64 s[12:13], -1, 01069; GCN-NEXT: s_subb_u32 s17, s15, 01070; GCN-NEXT: s_cmp_ge_u32 s17, s51071; GCN-NEXT: s_cselect_b32 s18, -1, 01072; GCN-NEXT: s_cmp_ge_u32 s16, s41073; GCN-NEXT: s_cselect_b32 s19, -1, 01074; GCN-NEXT: s_cmp_eq_u32 s17, s51075; GCN-NEXT: s_cselect_b32 s18, s19, s181076; GCN-NEXT: s_or_b32 s12, s12, s131077; GCN-NEXT: s_subb_u32 s12, s15, s51078; GCN-NEXT: s_sub_u32 s13, s16, s41079; GCN-NEXT: s_subb_u32 s12, s12, 01080; GCN-NEXT: s_cmp_lg_u32 s18, 01081; GCN-NEXT: s_cselect_b32 s13, s13, s161082; GCN-NEXT: s_cselect_b32 s12, s12, s171083; GCN-NEXT: s_or_b32 s10, s10, s111084; GCN-NEXT: s_subb_u32 s7, s7, s141085; GCN-NEXT: s_cmp_ge_u32 s7, s51086; GCN-NEXT: s_cselect_b32 s10, -1, 01087; GCN-NEXT: s_cmp_ge_u32 s6, s41088; GCN-NEXT: s_cselect_b32 s4, -1, 01089; GCN-NEXT: s_cmp_eq_u32 s7, s51090; GCN-NEXT: s_cselect_b32 s4, s4, s101091; GCN-NEXT: s_cmp_lg_u32 s4, 01092; GCN-NEXT: s_cselect_b32 s5, s12, s71093; GCN-NEXT: s_cselect_b32 s4, s13, s61094; GCN-NEXT: s_xor_b64 s[4:5], s[4:5], s[8:9]1095; GCN-NEXT: s_sub_u32 s4, s4, s81096; GCN-NEXT: s_subb_u32 s5, s5, s81097; GCN-NEXT: v_mov_b32_e32 v0, s41098; GCN-NEXT: v_mov_b32_e32 v1, s51099; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01100; GCN-NEXT: s_endpgm1101;1102; GCN-IR-LABEL: s_test_srem33_64:1103; GCN-IR: ; %bb.0: ; %_udiv-special-cases1104; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91105; GCN-IR-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0xd1106; GCN-IR-NEXT: s_mov_b32 s13, 01107; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1108; GCN-IR-NEXT: s_ashr_i64 s[2:3], s[2:3], 311109; GCN-IR-NEXT: s_ashr_i64 s[8:9], s[4:5], 311110; GCN-IR-NEXT: s_ashr_i32 s4, s3, 311111; GCN-IR-NEXT: s_mov_b32 s5, s41112; GCN-IR-NEXT: s_xor_b64 s[2:3], s[2:3], s[4:5]1113; GCN-IR-NEXT: s_sub_u32 s6, s2, s41114; GCN-IR-NEXT: s_subb_u32 s7, s3, s41115; GCN-IR-NEXT: s_ashr_i32 s2, s9, 311116; GCN-IR-NEXT: s_mov_b32 s3, s21117; GCN-IR-NEXT: s_xor_b64 s[8:9], s[8:9], s[2:3]1118; GCN-IR-NEXT: s_sub_u32 s8, s8, s21119; GCN-IR-NEXT: s_subb_u32 s9, s9, s21120; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[10:11], s[6:7], 01121; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[2:3], s[8:9], 01122; GCN-IR-NEXT: s_flbit_i32_b64 s12, s[8:9]1123; GCN-IR-NEXT: s_or_b64 s[10:11], s[2:3], s[10:11]1124; GCN-IR-NEXT: s_flbit_i32_b64 s18, s[6:7]1125; GCN-IR-NEXT: s_sub_u32 s14, s12, s181126; GCN-IR-NEXT: s_subb_u32 s15, 0, 01127; GCN-IR-NEXT: v_cmp_gt_u64_e64 s[16:17], s[14:15], 631128; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[20:21], s[14:15], 631129; GCN-IR-NEXT: s_or_b64 s[16:17], s[10:11], s[16:17]1130; GCN-IR-NEXT: s_and_b64 s[10:11], s[16:17], exec1131; GCN-IR-NEXT: s_cselect_b32 s11, 0, s71132; GCN-IR-NEXT: s_cselect_b32 s10, 0, s61133; GCN-IR-NEXT: s_or_b64 s[16:17], s[16:17], s[20:21]1134; GCN-IR-NEXT: s_mov_b64 s[2:3], 01135; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[16:17]1136; GCN-IR-NEXT: s_cbranch_vccz .LBB8_51137; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11138; GCN-IR-NEXT: s_add_u32 s16, s14, 11139; GCN-IR-NEXT: s_addc_u32 s10, s15, 01140; GCN-IR-NEXT: s_cselect_b64 s[10:11], -1, 01141; GCN-IR-NEXT: s_sub_i32 s14, 63, s141142; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[10:11]1143; GCN-IR-NEXT: s_lshl_b64 s[10:11], s[6:7], s141144; GCN-IR-NEXT: s_cbranch_vccz .LBB8_41145; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1146; GCN-IR-NEXT: s_lshr_b64 s[14:15], s[6:7], s161147; GCN-IR-NEXT: s_add_u32 s16, s8, -11148; GCN-IR-NEXT: s_addc_u32 s17, s9, -11149; GCN-IR-NEXT: s_not_b64 s[2:3], s[12:13]1150; GCN-IR-NEXT: s_add_u32 s18, s2, s181151; GCN-IR-NEXT: s_addc_u32 s19, s3, 01152; GCN-IR-NEXT: s_mov_b64 s[12:13], 01153; GCN-IR-NEXT: s_mov_b32 s3, 01154; GCN-IR-NEXT: .LBB8_3: ; %udiv-do-while1155; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11156; GCN-IR-NEXT: s_lshl_b64 s[14:15], s[14:15], 11157; GCN-IR-NEXT: s_lshr_b32 s2, s11, 311158; GCN-IR-NEXT: s_lshl_b64 s[10:11], s[10:11], 11159; GCN-IR-NEXT: s_or_b64 s[14:15], s[14:15], s[2:3]1160; GCN-IR-NEXT: s_or_b64 s[10:11], s[12:13], s[10:11]1161; GCN-IR-NEXT: s_sub_u32 s2, s16, s141162; GCN-IR-NEXT: s_subb_u32 s2, s17, s151163; GCN-IR-NEXT: s_ashr_i32 s12, s2, 311164; GCN-IR-NEXT: s_mov_b32 s13, s121165; GCN-IR-NEXT: s_and_b32 s2, s12, 11166; GCN-IR-NEXT: s_and_b64 s[20:21], s[12:13], s[8:9]1167; GCN-IR-NEXT: s_sub_u32 s14, s14, s201168; GCN-IR-NEXT: s_subb_u32 s15, s15, s211169; GCN-IR-NEXT: s_add_u32 s18, s18, 11170; GCN-IR-NEXT: s_addc_u32 s19, s19, 01171; GCN-IR-NEXT: s_cselect_b64 s[20:21], -1, 01172; GCN-IR-NEXT: s_mov_b64 s[12:13], s[2:3]1173; GCN-IR-NEXT: s_and_b64 vcc, exec, s[20:21]1174; GCN-IR-NEXT: s_cbranch_vccz .LBB8_31175; GCN-IR-NEXT: .LBB8_4: ; %Flow71176; GCN-IR-NEXT: s_lshl_b64 s[10:11], s[10:11], 11177; GCN-IR-NEXT: s_or_b64 s[10:11], s[2:3], s[10:11]1178; GCN-IR-NEXT: .LBB8_5: ; %udiv-end1179; GCN-IR-NEXT: v_mov_b32_e32 v0, s101180; GCN-IR-NEXT: v_mul_hi_u32 v0, s8, v01181; GCN-IR-NEXT: s_mul_i32 s11, s8, s111182; GCN-IR-NEXT: s_mul_i32 s9, s9, s101183; GCN-IR-NEXT: s_mul_i32 s8, s8, s101184; GCN-IR-NEXT: v_readfirstlane_b32 s12, v01185; GCN-IR-NEXT: s_add_i32 s11, s12, s111186; GCN-IR-NEXT: s_add_i32 s11, s11, s91187; GCN-IR-NEXT: s_sub_u32 s6, s6, s81188; GCN-IR-NEXT: s_subb_u32 s7, s7, s111189; GCN-IR-NEXT: s_xor_b64 s[6:7], s[6:7], s[4:5]1190; GCN-IR-NEXT: s_sub_u32 s4, s6, s41191; GCN-IR-NEXT: s_subb_u32 s5, s7, s51192; GCN-IR-NEXT: v_mov_b32_e32 v0, s41193; GCN-IR-NEXT: s_mov_b32 s3, 0xf0001194; GCN-IR-NEXT: s_mov_b32 s2, -11195; GCN-IR-NEXT: v_mov_b32_e32 v1, s51196; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01197; GCN-IR-NEXT: s_endpgm1198 %1 = ashr i64 %x, 311199 %2 = ashr i64 %y, 311200 %result = srem i64 %1, %21201 store i64 %result, ptr addrspace(1) %out1202 ret void1203}1204 1205define amdgpu_kernel void @s_test_srem24_48(ptr addrspace(1) %out, i48 %x, i48 %y) {1206; GCN-LABEL: s_test_srem24_48:1207; GCN: ; %bb.0:1208; GCN-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0xd1209; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91210; GCN-NEXT: s_mov_b32 s7, 0xf0001211; GCN-NEXT: s_mov_b32 s6, -11212; GCN-NEXT: s_waitcnt lgkmcnt(0)1213; GCN-NEXT: s_sext_i32_i16 s9, s91214; GCN-NEXT: s_lshr_b64 s[4:5], s[8:9], 241215; GCN-NEXT: v_cvt_f32_i32_e32 v0, s41216; GCN-NEXT: s_sext_i32_i16 s3, s31217; GCN-NEXT: s_lshr_b64 s[2:3], s[2:3], 241218; GCN-NEXT: v_cvt_f32_i32_e32 v1, s21219; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v01220; GCN-NEXT: s_xor_b32 s3, s2, s41221; GCN-NEXT: s_ashr_i32 s3, s3, 301222; GCN-NEXT: s_or_b32 s3, s3, 11223; GCN-NEXT: v_mul_f32_e32 v2, v1, v21224; GCN-NEXT: v_trunc_f32_e32 v2, v21225; GCN-NEXT: v_mad_f32 v1, -v2, v0, v11226; GCN-NEXT: v_cvt_i32_f32_e32 v2, v21227; GCN-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|1228; GCN-NEXT: s_and_b64 s[8:9], s[8:9], exec1229; GCN-NEXT: s_cselect_b32 s3, s3, 01230; GCN-NEXT: v_add_i32_e32 v0, vcc, s3, v21231; GCN-NEXT: v_mul_lo_u32 v0, v0, s41232; GCN-NEXT: s_mov_b32 s4, s01233; GCN-NEXT: s_mov_b32 s5, s11234; GCN-NEXT: v_sub_i32_e32 v0, vcc, s2, v01235; GCN-NEXT: v_bfe_i32 v0, v0, 0, 241236; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v01237; GCN-NEXT: buffer_store_dword v0, off, s[4:7], 01238; GCN-NEXT: buffer_store_short v1, off, s[4:7], 0 offset:41239; GCN-NEXT: s_endpgm1240;1241; GCN-IR-LABEL: s_test_srem24_48:1242; GCN-IR: ; %bb.0:1243; GCN-IR-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0xd1244; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91245; GCN-IR-NEXT: s_mov_b32 s7, 0xf0001246; GCN-IR-NEXT: s_mov_b32 s6, -11247; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1248; GCN-IR-NEXT: s_sext_i32_i16 s9, s91249; GCN-IR-NEXT: s_lshr_b64 s[4:5], s[8:9], 241250; GCN-IR-NEXT: v_cvt_f32_i32_e32 v0, s41251; GCN-IR-NEXT: s_sext_i32_i16 s3, s31252; GCN-IR-NEXT: s_lshr_b64 s[2:3], s[2:3], 241253; GCN-IR-NEXT: v_cvt_f32_i32_e32 v1, s21254; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v01255; GCN-IR-NEXT: s_xor_b32 s3, s2, s41256; GCN-IR-NEXT: s_ashr_i32 s3, s3, 301257; GCN-IR-NEXT: s_or_b32 s3, s3, 11258; GCN-IR-NEXT: v_mul_f32_e32 v2, v1, v21259; GCN-IR-NEXT: v_trunc_f32_e32 v2, v21260; GCN-IR-NEXT: v_mad_f32 v1, -v2, v0, v11261; GCN-IR-NEXT: v_cvt_i32_f32_e32 v2, v21262; GCN-IR-NEXT: v_cmp_ge_f32_e64 s[8:9], |v1|, |v0|1263; GCN-IR-NEXT: s_and_b64 s[8:9], s[8:9], exec1264; GCN-IR-NEXT: s_cselect_b32 s3, s3, 01265; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, s3, v21266; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, s41267; GCN-IR-NEXT: s_mov_b32 s4, s01268; GCN-IR-NEXT: s_mov_b32 s5, s11269; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, s2, v01270; GCN-IR-NEXT: v_bfe_i32 v0, v0, 0, 241271; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v01272; GCN-IR-NEXT: buffer_store_dword v0, off, s[4:7], 01273; GCN-IR-NEXT: buffer_store_short v1, off, s[4:7], 0 offset:41274; GCN-IR-NEXT: s_endpgm1275 %1 = ashr i48 %x, 241276 %2 = ashr i48 %y, 241277 %result = srem i48 %1, %21278 store i48 %result, ptr addrspace(1) %out1279 ret void1280}1281 1282define amdgpu_kernel void @s_test_srem_k_num_i64(ptr addrspace(1) %out, i64 %x) {1283; GCN-LABEL: s_test_srem_k_num_i64:1284; GCN: ; %bb.0:1285; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91286; GCN-NEXT: s_waitcnt lgkmcnt(0)1287; GCN-NEXT: s_ashr_i32 s4, s3, 311288; GCN-NEXT: s_add_u32 s2, s2, s41289; GCN-NEXT: s_mov_b32 s5, s41290; GCN-NEXT: s_addc_u32 s3, s3, s41291; GCN-NEXT: s_xor_b64 s[4:5], s[2:3], s[4:5]1292; GCN-NEXT: v_cvt_f32_u32_e32 v0, s41293; GCN-NEXT: v_cvt_f32_u32_e32 v1, s51294; GCN-NEXT: s_sub_u32 s2, 0, s41295; GCN-NEXT: s_subb_u32 s6, 0, s51296; GCN-NEXT: v_madmk_f32 v0, v1, 0x4f800000, v01297; GCN-NEXT: v_rcp_f32_e32 v0, v01298; GCN-NEXT: v_mul_f32_e32 v0, 0x5f7ffffc, v01299; GCN-NEXT: v_mul_f32_e32 v1, 0x2f800000, v01300; GCN-NEXT: v_trunc_f32_e32 v1, v11301; GCN-NEXT: v_madmk_f32 v0, v1, 0xcf800000, v01302; GCN-NEXT: v_cvt_u32_f32_e32 v0, v01303; GCN-NEXT: v_cvt_u32_f32_e32 v1, v11304; GCN-NEXT: v_mul_hi_u32 v2, s2, v01305; GCN-NEXT: v_readfirstlane_b32 s7, v11306; GCN-NEXT: v_readfirstlane_b32 s3, v01307; GCN-NEXT: s_mul_i32 s8, s2, s71308; GCN-NEXT: v_readfirstlane_b32 s11, v21309; GCN-NEXT: s_mul_i32 s9, s6, s31310; GCN-NEXT: s_mul_i32 s10, s2, s31311; GCN-NEXT: s_add_i32 s8, s11, s81312; GCN-NEXT: v_mul_hi_u32 v3, v0, s101313; GCN-NEXT: s_add_i32 s8, s8, s91314; GCN-NEXT: v_mul_hi_u32 v0, v0, s81315; GCN-NEXT: v_mul_hi_u32 v4, v1, s101316; GCN-NEXT: v_readfirstlane_b32 s9, v31317; GCN-NEXT: v_mul_hi_u32 v1, v1, s81318; GCN-NEXT: s_mul_i32 s12, s3, s81319; GCN-NEXT: s_add_u32 s9, s9, s121320; GCN-NEXT: v_readfirstlane_b32 s12, v01321; GCN-NEXT: s_mul_i32 s10, s7, s101322; GCN-NEXT: s_addc_u32 s12, 0, s121323; GCN-NEXT: v_readfirstlane_b32 s11, v41324; GCN-NEXT: s_add_u32 s9, s9, s101325; GCN-NEXT: v_readfirstlane_b32 s13, v11326; GCN-NEXT: s_addc_u32 s9, s12, s111327; GCN-NEXT: s_addc_u32 s10, s13, 01328; GCN-NEXT: s_mul_i32 s8, s7, s81329; GCN-NEXT: s_add_u32 s8, s9, s81330; GCN-NEXT: s_addc_u32 s9, 0, s101331; GCN-NEXT: s_add_u32 s8, s3, s81332; GCN-NEXT: v_mov_b32_e32 v0, s81333; GCN-NEXT: v_mul_hi_u32 v0, s2, v01334; GCN-NEXT: s_addc_u32 s7, s7, s91335; GCN-NEXT: s_mul_i32 s9, s2, s71336; GCN-NEXT: s_mul_i32 s6, s6, s81337; GCN-NEXT: v_readfirstlane_b32 s10, v01338; GCN-NEXT: s_add_i32 s9, s10, s91339; GCN-NEXT: s_mul_i32 s2, s2, s81340; GCN-NEXT: s_add_i32 s6, s9, s61341; GCN-NEXT: v_mov_b32_e32 v2, s21342; GCN-NEXT: v_mov_b32_e32 v0, s61343; GCN-NEXT: v_mul_hi_u32 v3, s7, v21344; GCN-NEXT: v_mul_hi_u32 v2, s8, v21345; GCN-NEXT: v_mul_hi_u32 v1, s7, v01346; GCN-NEXT: v_mul_hi_u32 v0, s8, v01347; GCN-NEXT: s_mul_i32 s10, s8, s61348; GCN-NEXT: v_readfirstlane_b32 s12, v21349; GCN-NEXT: s_add_u32 s10, s12, s101350; GCN-NEXT: v_readfirstlane_b32 s11, v01351; GCN-NEXT: s_mul_i32 s2, s7, s21352; GCN-NEXT: s_addc_u32 s11, 0, s111353; GCN-NEXT: v_readfirstlane_b32 s9, v31354; GCN-NEXT: s_add_u32 s2, s10, s21355; GCN-NEXT: s_addc_u32 s2, s11, s91356; GCN-NEXT: v_readfirstlane_b32 s9, v11357; GCN-NEXT: s_addc_u32 s9, s9, 01358; GCN-NEXT: s_mul_i32 s6, s7, s61359; GCN-NEXT: s_add_u32 s2, s2, s61360; GCN-NEXT: s_addc_u32 s6, 0, s91361; GCN-NEXT: s_add_u32 s2, s8, s21362; GCN-NEXT: s_addc_u32 s6, s7, s61363; GCN-NEXT: v_mul_hi_u32 v1, s2, 241364; GCN-NEXT: v_mul_hi_u32 v0, s6, 241365; GCN-NEXT: s_mul_i32 s6, s6, 241366; GCN-NEXT: s_mov_b32 s3, 0xf0001367; GCN-NEXT: v_readfirstlane_b32 s8, v11368; GCN-NEXT: v_readfirstlane_b32 s7, v01369; GCN-NEXT: s_add_u32 s6, s8, s61370; GCN-NEXT: s_addc_u32 s6, 0, s71371; GCN-NEXT: v_mov_b32_e32 v0, s61372; GCN-NEXT: v_mul_hi_u32 v0, s4, v01373; GCN-NEXT: s_mul_i32 s7, s5, s61374; GCN-NEXT: s_mul_i32 s6, s4, s61375; GCN-NEXT: s_mov_b32 s2, -11376; GCN-NEXT: v_readfirstlane_b32 s8, v01377; GCN-NEXT: s_add_i32 s10, s8, s71378; GCN-NEXT: s_sub_i32 s8, 0, s101379; GCN-NEXT: s_sub_u32 s11, 24, s61380; GCN-NEXT: s_cselect_b64 s[6:7], -1, 01381; GCN-NEXT: s_subb_u32 s12, s8, s51382; GCN-NEXT: s_sub_u32 s13, s11, s41383; GCN-NEXT: s_cselect_b64 s[8:9], -1, 01384; GCN-NEXT: s_subb_u32 s14, s12, 01385; GCN-NEXT: s_cmp_ge_u32 s14, s51386; GCN-NEXT: s_cselect_b32 s15, -1, 01387; GCN-NEXT: s_cmp_ge_u32 s13, s41388; GCN-NEXT: s_cselect_b32 s16, -1, 01389; GCN-NEXT: s_cmp_eq_u32 s14, s51390; GCN-NEXT: s_cselect_b32 s15, s16, s151391; GCN-NEXT: s_or_b32 s8, s8, s91392; GCN-NEXT: s_subb_u32 s8, s12, s51393; GCN-NEXT: s_sub_u32 s9, s13, s41394; GCN-NEXT: s_subb_u32 s8, s8, 01395; GCN-NEXT: s_cmp_lg_u32 s15, 01396; GCN-NEXT: s_cselect_b32 s9, s9, s131397; GCN-NEXT: s_cselect_b32 s8, s8, s141398; GCN-NEXT: s_or_b32 s6, s6, s71399; GCN-NEXT: s_subb_u32 s6, 0, s101400; GCN-NEXT: s_cmp_ge_u32 s6, s51401; GCN-NEXT: s_cselect_b32 s7, -1, 01402; GCN-NEXT: s_cmp_ge_u32 s11, s41403; GCN-NEXT: s_cselect_b32 s4, -1, 01404; GCN-NEXT: s_cmp_eq_u32 s6, s51405; GCN-NEXT: s_cselect_b32 s4, s4, s71406; GCN-NEXT: s_cmp_lg_u32 s4, 01407; GCN-NEXT: s_cselect_b32 s4, s8, s61408; GCN-NEXT: s_cselect_b32 s5, s9, s111409; GCN-NEXT: v_mov_b32_e32 v0, s51410; GCN-NEXT: v_mov_b32_e32 v1, s41411; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01412; GCN-NEXT: s_endpgm1413;1414; GCN-IR-LABEL: s_test_srem_k_num_i64:1415; GCN-IR: ; %bb.0: ; %_udiv-special-cases1416; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91417; GCN-IR-NEXT: s_mov_b64 s[6:7], 01418; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1419; GCN-IR-NEXT: s_ashr_i32 s8, s3, 311420; GCN-IR-NEXT: s_mov_b32 s9, s81421; GCN-IR-NEXT: s_xor_b64 s[2:3], s[2:3], s[8:9]1422; GCN-IR-NEXT: s_sub_u32 s4, s2, s81423; GCN-IR-NEXT: s_subb_u32 s5, s3, s81424; GCN-IR-NEXT: s_flbit_i32_b64 s14, s[4:5]1425; GCN-IR-NEXT: s_add_u32 s2, s14, 0xffffffc51426; GCN-IR-NEXT: s_addc_u32 s3, 0, -11427; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[8:9], s[4:5], 01428; GCN-IR-NEXT: v_cmp_gt_u64_e64 s[10:11], s[2:3], 631429; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[12:13], s[2:3], 631430; GCN-IR-NEXT: s_or_b64 s[10:11], s[8:9], s[10:11]1431; GCN-IR-NEXT: s_and_b64 s[8:9], s[10:11], exec1432; GCN-IR-NEXT: s_cselect_b32 s8, 0, 241433; GCN-IR-NEXT: s_or_b64 s[10:11], s[10:11], s[12:13]1434; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[10:11]1435; GCN-IR-NEXT: s_mov_b32 s9, 01436; GCN-IR-NEXT: s_cbranch_vccz .LBB10_51437; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11438; GCN-IR-NEXT: s_add_u32 s8, s2, 11439; GCN-IR-NEXT: s_addc_u32 s3, s3, 01440; GCN-IR-NEXT: s_cselect_b64 s[10:11], -1, 01441; GCN-IR-NEXT: s_sub_i32 s2, 63, s21442; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[10:11]1443; GCN-IR-NEXT: s_lshl_b64 s[2:3], 24, s21444; GCN-IR-NEXT: s_cbranch_vccz .LBB10_41445; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1446; GCN-IR-NEXT: s_lshr_b64 s[10:11], 24, s81447; GCN-IR-NEXT: s_add_u32 s12, s4, -11448; GCN-IR-NEXT: s_addc_u32 s13, s5, -11449; GCN-IR-NEXT: s_sub_u32 s14, 58, s141450; GCN-IR-NEXT: s_subb_u32 s15, 0, 01451; GCN-IR-NEXT: s_mov_b64 s[8:9], 01452; GCN-IR-NEXT: s_mov_b32 s7, 01453; GCN-IR-NEXT: .LBB10_3: ; %udiv-do-while1454; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11455; GCN-IR-NEXT: s_lshl_b64 s[10:11], s[10:11], 11456; GCN-IR-NEXT: s_lshr_b32 s6, s3, 311457; GCN-IR-NEXT: s_lshl_b64 s[2:3], s[2:3], 11458; GCN-IR-NEXT: s_or_b64 s[10:11], s[10:11], s[6:7]1459; GCN-IR-NEXT: s_or_b64 s[2:3], s[8:9], s[2:3]1460; GCN-IR-NEXT: s_sub_u32 s6, s12, s101461; GCN-IR-NEXT: s_subb_u32 s6, s13, s111462; GCN-IR-NEXT: s_ashr_i32 s8, s6, 311463; GCN-IR-NEXT: s_mov_b32 s9, s81464; GCN-IR-NEXT: s_and_b32 s6, s8, 11465; GCN-IR-NEXT: s_and_b64 s[16:17], s[8:9], s[4:5]1466; GCN-IR-NEXT: s_sub_u32 s10, s10, s161467; GCN-IR-NEXT: s_subb_u32 s11, s11, s171468; GCN-IR-NEXT: s_add_u32 s14, s14, 11469; GCN-IR-NEXT: s_addc_u32 s15, s15, 01470; GCN-IR-NEXT: s_cselect_b64 s[16:17], -1, 01471; GCN-IR-NEXT: s_mov_b64 s[8:9], s[6:7]1472; GCN-IR-NEXT: s_and_b64 vcc, exec, s[16:17]1473; GCN-IR-NEXT: s_cbranch_vccz .LBB10_31474; GCN-IR-NEXT: .LBB10_4: ; %Flow61475; GCN-IR-NEXT: s_lshl_b64 s[2:3], s[2:3], 11476; GCN-IR-NEXT: s_or_b64 s[8:9], s[6:7], s[2:3]1477; GCN-IR-NEXT: .LBB10_5: ; %udiv-end1478; GCN-IR-NEXT: v_mov_b32_e32 v0, s81479; GCN-IR-NEXT: v_mul_hi_u32 v0, s4, v01480; GCN-IR-NEXT: s_mul_i32 s6, s4, s91481; GCN-IR-NEXT: s_mul_i32 s5, s5, s81482; GCN-IR-NEXT: s_mul_i32 s4, s4, s81483; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, s6, v01484; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, s5, v01485; GCN-IR-NEXT: v_sub_i32_e64 v0, vcc, 24, s41486; GCN-IR-NEXT: s_mov_b32 s3, 0xf0001487; GCN-IR-NEXT: s_mov_b32 s2, -11488; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, 0, v1, vcc1489; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01490; GCN-IR-NEXT: s_endpgm1491 %result = srem i64 24, %x1492 store i64 %result, ptr addrspace(1) %out1493 ret void1494}1495 1496define i64 @v_test_srem_k_num_i64(i64 %x) {1497; GCN-LABEL: v_test_srem_k_num_i64:1498; GCN: ; %bb.0:1499; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1500; GCN-NEXT: v_ashrrev_i32_e32 v2, 31, v11501; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v21502; GCN-NEXT: v_addc_u32_e32 v1, vcc, v1, v2, vcc1503; GCN-NEXT: v_xor_b32_e32 v1, v1, v21504; GCN-NEXT: v_xor_b32_e32 v0, v0, v21505; GCN-NEXT: v_cvt_f32_u32_e32 v2, v01506; GCN-NEXT: v_cvt_f32_u32_e32 v3, v11507; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v01508; GCN-NEXT: v_subb_u32_e32 v5, vcc, 0, v1, vcc1509; GCN-NEXT: v_madmk_f32 v2, v3, 0x4f800000, v21510; GCN-NEXT: v_rcp_f32_e32 v2, v21511; GCN-NEXT: v_mul_f32_e32 v2, 0x5f7ffffc, v21512; GCN-NEXT: v_mul_f32_e32 v3, 0x2f800000, v21513; GCN-NEXT: v_trunc_f32_e32 v3, v31514; GCN-NEXT: v_madmk_f32 v2, v3, 0xcf800000, v21515; GCN-NEXT: v_cvt_u32_f32_e32 v2, v21516; GCN-NEXT: v_cvt_u32_f32_e32 v3, v31517; GCN-NEXT: v_mul_hi_u32 v6, v4, v21518; GCN-NEXT: v_mul_lo_u32 v7, v4, v31519; GCN-NEXT: v_mul_lo_u32 v8, v5, v21520; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v71521; GCN-NEXT: v_mul_lo_u32 v7, v4, v21522; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v81523; GCN-NEXT: v_mul_lo_u32 v8, v2, v61524; GCN-NEXT: v_mul_hi_u32 v9, v2, v71525; GCN-NEXT: v_mul_hi_u32 v10, v2, v61526; GCN-NEXT: v_mul_hi_u32 v11, v3, v61527; GCN-NEXT: v_mul_lo_u32 v6, v3, v61528; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v81529; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc1530; GCN-NEXT: v_mul_lo_u32 v10, v3, v71531; GCN-NEXT: v_mul_hi_u32 v7, v3, v71532; GCN-NEXT: v_add_i32_e32 v8, vcc, v8, v101533; GCN-NEXT: v_addc_u32_e32 v7, vcc, v9, v7, vcc1534; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v11, vcc1535; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61536; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc1537; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v61538; GCN-NEXT: v_addc_u32_e32 v3, vcc, v3, v7, vcc1539; GCN-NEXT: v_mul_lo_u32 v6, v4, v31540; GCN-NEXT: v_mul_hi_u32 v7, v4, v21541; GCN-NEXT: v_mul_lo_u32 v5, v5, v21542; GCN-NEXT: v_mul_lo_u32 v4, v4, v21543; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61544; GCN-NEXT: v_add_i32_e32 v5, vcc, v6, v51545; GCN-NEXT: v_mul_lo_u32 v8, v2, v51546; GCN-NEXT: v_mul_hi_u32 v9, v2, v41547; GCN-NEXT: v_mul_hi_u32 v10, v2, v51548; GCN-NEXT: v_mul_hi_u32 v7, v3, v41549; GCN-NEXT: v_mul_lo_u32 v4, v3, v41550; GCN-NEXT: v_mul_hi_u32 v6, v3, v51551; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v81552; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc1553; GCN-NEXT: v_mul_lo_u32 v5, v3, v51554; GCN-NEXT: v_add_i32_e32 v4, vcc, v8, v41555; GCN-NEXT: v_addc_u32_e32 v4, vcc, v9, v7, vcc1556; GCN-NEXT: v_addc_u32_e32 v6, vcc, 0, v6, vcc1557; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v51558; GCN-NEXT: v_addc_u32_e32 v5, vcc, 0, v6, vcc1559; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v41560; GCN-NEXT: v_addc_u32_e32 v3, vcc, v3, v5, vcc1561; GCN-NEXT: v_mul_lo_u32 v4, v3, 241562; GCN-NEXT: v_mul_hi_u32 v2, v2, 241563; GCN-NEXT: v_mul_hi_u32 v3, v3, 241564; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v41565; GCN-NEXT: v_addc_u32_e32 v2, vcc, 0, v3, vcc1566; GCN-NEXT: v_mul_lo_u32 v3, v1, v21567; GCN-NEXT: v_mul_hi_u32 v4, v0, v21568; GCN-NEXT: v_mul_lo_u32 v2, v0, v21569; GCN-NEXT: v_add_i32_e32 v3, vcc, v4, v31570; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v31571; GCN-NEXT: v_sub_i32_e32 v2, vcc, 24, v21572; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, vcc1573; GCN-NEXT: v_sub_i32_e64 v5, s[4:5], v2, v01574; GCN-NEXT: v_subbrev_u32_e64 v6, s[6:7], 0, v4, s[4:5]1575; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v6, v11576; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, s[6:7]1577; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v5, v01578; GCN-NEXT: v_cndmask_b32_e64 v8, 0, -1, s[6:7]1579; GCN-NEXT: v_cmp_eq_u32_e64 s[6:7], v6, v11580; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, s[4:5]1581; GCN-NEXT: v_cndmask_b32_e64 v7, v7, v8, s[6:7]1582; GCN-NEXT: v_sub_i32_e64 v8, s[4:5], v5, v01583; GCN-NEXT: v_subb_u32_e32 v3, vcc, 0, v3, vcc1584; GCN-NEXT: v_subbrev_u32_e64 v4, s[4:5], 0, v4, s[4:5]1585; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v3, v11586; GCN-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, v71587; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, vcc1588; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v2, v01589; GCN-NEXT: v_cndmask_b32_e64 v0, 0, -1, vcc1590; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v3, v11591; GCN-NEXT: v_cndmask_b32_e32 v0, v7, v0, vcc1592; GCN-NEXT: v_cndmask_b32_e64 v5, v5, v8, s[4:5]1593; GCN-NEXT: v_cmp_ne_u32_e32 vcc, 0, v01594; GCN-NEXT: v_cndmask_b32_e64 v1, v6, v4, s[4:5]1595; GCN-NEXT: v_cndmask_b32_e32 v0, v2, v5, vcc1596; GCN-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc1597; GCN-NEXT: s_setpc_b64 s[30:31]1598;1599; GCN-IR-LABEL: v_test_srem_k_num_i64:1600; GCN-IR: ; %bb.0: ; %_udiv-special-cases1601; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1602; GCN-IR-NEXT: v_ashrrev_i32_e32 v2, 31, v11603; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v21604; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v21605; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v21606; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v2, vcc1607; GCN-IR-NEXT: v_ffbh_u32_e32 v2, v01608; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 32, v21609; GCN-IR-NEXT: v_ffbh_u32_e32 v3, v11610; GCN-IR-NEXT: v_min_u32_e32 v8, v2, v31611; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 0xffffffc5, v81612; GCN-IR-NEXT: v_addc_u32_e64 v3, s[6:7], 0, -1, vcc1613; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], 0, v[0:1]1614; GCN-IR-NEXT: v_cmp_lt_u64_e32 vcc, 63, v[2:3]1615; GCN-IR-NEXT: v_cmp_ne_u64_e64 s[6:7], 63, v[2:3]1616; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], vcc1617; GCN-IR-NEXT: v_cndmask_b32_e64 v4, 24, 0, s[4:5]1618; GCN-IR-NEXT: s_xor_b64 s[4:5], s[4:5], -11619; GCN-IR-NEXT: v_mov_b32_e32 v5, 01620; GCN-IR-NEXT: s_and_b64 s[4:5], s[4:5], s[6:7]1621; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]1622; GCN-IR-NEXT: s_cbranch_execz .LBB11_61623; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11624; GCN-IR-NEXT: v_add_i32_e32 v6, vcc, 1, v21625; GCN-IR-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1626; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 63, v21627; GCN-IR-NEXT: v_lshl_b64 v[2:3], 24, v21628; GCN-IR-NEXT: v_mov_b32_e32 v4, 01629; GCN-IR-NEXT: v_mov_b32_e32 v5, 01630; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -11631; GCN-IR-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]1632; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[8:9]1633; GCN-IR-NEXT: s_cbranch_execz .LBB11_51634; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1635; GCN-IR-NEXT: v_add_i32_e32 v10, vcc, -1, v01636; GCN-IR-NEXT: v_addc_u32_e32 v11, vcc, -1, v1, vcc1637; GCN-IR-NEXT: v_sub_i32_e32 v12, vcc, 58, v81638; GCN-IR-NEXT: v_lshr_b64 v[6:7], 24, v61639; GCN-IR-NEXT: v_subb_u32_e64 v13, s[8:9], 0, 0, vcc1640; GCN-IR-NEXT: v_mov_b32_e32 v8, 01641; GCN-IR-NEXT: s_mov_b64 s[8:9], 01642; GCN-IR-NEXT: v_mov_b32_e32 v9, 01643; GCN-IR-NEXT: v_mov_b32_e32 v5, 01644; GCN-IR-NEXT: .LBB11_3: ; %udiv-do-while1645; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11646; GCN-IR-NEXT: v_lshl_b64 v[6:7], v[6:7], 11647; GCN-IR-NEXT: v_lshrrev_b32_e32 v4, 31, v31648; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v41649; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11650; GCN-IR-NEXT: v_sub_i32_e32 v4, vcc, v10, v61651; GCN-IR-NEXT: v_subb_u32_e32 v4, vcc, v11, v7, vcc1652; GCN-IR-NEXT: v_or_b32_e32 v2, v8, v21653; GCN-IR-NEXT: v_ashrrev_i32_e32 v8, 31, v41654; GCN-IR-NEXT: v_or_b32_e32 v3, v9, v31655; GCN-IR-NEXT: v_and_b32_e32 v4, 1, v81656; GCN-IR-NEXT: v_and_b32_e32 v9, v8, v11657; GCN-IR-NEXT: v_and_b32_e32 v8, v8, v01658; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v6, v81659; GCN-IR-NEXT: v_subb_u32_e32 v7, vcc, v7, v9, vcc1660; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, 1, v121661; GCN-IR-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc1662; GCN-IR-NEXT: v_mov_b32_e32 v9, v51663; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]1664; GCN-IR-NEXT: v_mov_b32_e32 v8, v41665; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]1666; GCN-IR-NEXT: s_cbranch_execnz .LBB11_31667; GCN-IR-NEXT: ; %bb.4: ; %Flow1668; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]1669; GCN-IR-NEXT: .LBB11_5: ; %Flow41670; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]1671; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11672; GCN-IR-NEXT: v_or_b32_e32 v5, v5, v31673; GCN-IR-NEXT: v_or_b32_e32 v4, v4, v21674; GCN-IR-NEXT: .LBB11_6: ; %Flow51675; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]1676; GCN-IR-NEXT: v_mul_lo_u32 v2, v0, v51677; GCN-IR-NEXT: v_mul_hi_u32 v3, v0, v41678; GCN-IR-NEXT: v_mul_lo_u32 v1, v1, v41679; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, v41680; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, v3, v21681; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v2, v11682; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 24, v01683; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, 0, v1, vcc1684; GCN-IR-NEXT: s_setpc_b64 s[30:31]1685 %result = srem i64 24, %x1686 ret i64 %result1687}1688 1689define i64 @v_test_srem_pow2_k_num_i64(i64 %x) {1690; GCN-LABEL: v_test_srem_pow2_k_num_i64:1691; GCN: ; %bb.0:1692; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1693; GCN-NEXT: v_ashrrev_i32_e32 v2, 31, v11694; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v21695; GCN-NEXT: v_addc_u32_e32 v1, vcc, v1, v2, vcc1696; GCN-NEXT: v_xor_b32_e32 v1, v1, v21697; GCN-NEXT: v_xor_b32_e32 v0, v0, v21698; GCN-NEXT: v_cvt_f32_u32_e32 v2, v01699; GCN-NEXT: v_cvt_f32_u32_e32 v3, v11700; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v01701; GCN-NEXT: v_subb_u32_e32 v5, vcc, 0, v1, vcc1702; GCN-NEXT: v_madmk_f32 v2, v3, 0x4f800000, v21703; GCN-NEXT: v_rcp_f32_e32 v2, v21704; GCN-NEXT: v_mul_f32_e32 v2, 0x5f7ffffc, v21705; GCN-NEXT: v_mul_f32_e32 v3, 0x2f800000, v21706; GCN-NEXT: v_trunc_f32_e32 v3, v31707; GCN-NEXT: v_madmk_f32 v2, v3, 0xcf800000, v21708; GCN-NEXT: v_cvt_u32_f32_e32 v2, v21709; GCN-NEXT: v_cvt_u32_f32_e32 v3, v31710; GCN-NEXT: v_mul_hi_u32 v6, v4, v21711; GCN-NEXT: v_mul_lo_u32 v7, v4, v31712; GCN-NEXT: v_mul_lo_u32 v8, v5, v21713; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v71714; GCN-NEXT: v_mul_lo_u32 v7, v4, v21715; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v81716; GCN-NEXT: v_mul_lo_u32 v8, v2, v61717; GCN-NEXT: v_mul_hi_u32 v9, v2, v71718; GCN-NEXT: v_mul_hi_u32 v10, v2, v61719; GCN-NEXT: v_mul_hi_u32 v11, v3, v61720; GCN-NEXT: v_mul_lo_u32 v6, v3, v61721; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v81722; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc1723; GCN-NEXT: v_mul_lo_u32 v10, v3, v71724; GCN-NEXT: v_mul_hi_u32 v7, v3, v71725; GCN-NEXT: v_add_i32_e32 v8, vcc, v8, v101726; GCN-NEXT: v_addc_u32_e32 v7, vcc, v9, v7, vcc1727; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v11, vcc1728; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61729; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc1730; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v61731; GCN-NEXT: v_addc_u32_e32 v3, vcc, v3, v7, vcc1732; GCN-NEXT: v_mul_lo_u32 v6, v4, v31733; GCN-NEXT: v_mul_hi_u32 v7, v4, v21734; GCN-NEXT: v_mul_lo_u32 v5, v5, v21735; GCN-NEXT: v_mul_lo_u32 v4, v4, v21736; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61737; GCN-NEXT: v_add_i32_e32 v5, vcc, v6, v51738; GCN-NEXT: v_mul_lo_u32 v8, v2, v51739; GCN-NEXT: v_mul_hi_u32 v9, v2, v41740; GCN-NEXT: v_mul_hi_u32 v10, v2, v51741; GCN-NEXT: v_mul_hi_u32 v7, v3, v41742; GCN-NEXT: v_mul_lo_u32 v4, v3, v41743; GCN-NEXT: v_mul_hi_u32 v6, v3, v51744; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v81745; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc1746; GCN-NEXT: v_mul_lo_u32 v5, v3, v51747; GCN-NEXT: v_add_i32_e32 v4, vcc, v8, v41748; GCN-NEXT: v_addc_u32_e32 v4, vcc, v9, v7, vcc1749; GCN-NEXT: v_addc_u32_e32 v6, vcc, 0, v6, vcc1750; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v51751; GCN-NEXT: v_addc_u32_e32 v5, vcc, 0, v6, vcc1752; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v41753; GCN-NEXT: v_addc_u32_e32 v2, vcc, v3, v5, vcc1754; GCN-NEXT: v_lshrrev_b32_e32 v2, 17, v21755; GCN-NEXT: v_mul_lo_u32 v3, v1, v21756; GCN-NEXT: v_mul_hi_u32 v4, v0, v21757; GCN-NEXT: v_mul_lo_u32 v2, v0, v21758; GCN-NEXT: v_add_i32_e32 v3, vcc, v4, v31759; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v31760; GCN-NEXT: v_sub_i32_e32 v2, vcc, 0x8000, v21761; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, vcc1762; GCN-NEXT: v_sub_i32_e64 v5, s[4:5], v2, v01763; GCN-NEXT: v_subbrev_u32_e64 v6, s[6:7], 0, v4, s[4:5]1764; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v6, v11765; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, s[6:7]1766; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v5, v01767; GCN-NEXT: v_cndmask_b32_e64 v8, 0, -1, s[6:7]1768; GCN-NEXT: v_cmp_eq_u32_e64 s[6:7], v6, v11769; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, s[4:5]1770; GCN-NEXT: v_cndmask_b32_e64 v7, v7, v8, s[6:7]1771; GCN-NEXT: v_sub_i32_e64 v8, s[4:5], v5, v01772; GCN-NEXT: v_subb_u32_e32 v3, vcc, 0, v3, vcc1773; GCN-NEXT: v_subbrev_u32_e64 v4, s[4:5], 0, v4, s[4:5]1774; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v3, v11775; GCN-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, v71776; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, vcc1777; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v2, v01778; GCN-NEXT: v_cndmask_b32_e64 v0, 0, -1, vcc1779; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v3, v11780; GCN-NEXT: v_cndmask_b32_e32 v0, v7, v0, vcc1781; GCN-NEXT: v_cndmask_b32_e64 v5, v5, v8, s[4:5]1782; GCN-NEXT: v_cmp_ne_u32_e32 vcc, 0, v01783; GCN-NEXT: v_cndmask_b32_e64 v1, v6, v4, s[4:5]1784; GCN-NEXT: v_cndmask_b32_e32 v0, v2, v5, vcc1785; GCN-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc1786; GCN-NEXT: s_setpc_b64 s[30:31]1787;1788; GCN-IR-LABEL: v_test_srem_pow2_k_num_i64:1789; GCN-IR: ; %bb.0: ; %_udiv-special-cases1790; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1791; GCN-IR-NEXT: v_ashrrev_i32_e32 v2, 31, v11792; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v21793; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v21794; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v21795; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v2, vcc1796; GCN-IR-NEXT: v_ffbh_u32_e32 v2, v01797; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 32, v21798; GCN-IR-NEXT: v_ffbh_u32_e32 v3, v11799; GCN-IR-NEXT: v_min_u32_e32 v8, v2, v31800; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 0xffffffd0, v81801; GCN-IR-NEXT: v_addc_u32_e64 v3, s[6:7], 0, -1, vcc1802; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], 0, v[0:1]1803; GCN-IR-NEXT: v_cmp_lt_u64_e32 vcc, 63, v[2:3]1804; GCN-IR-NEXT: v_cmp_ne_u64_e64 s[6:7], 63, v[2:3]1805; GCN-IR-NEXT: v_mov_b32_e32 v4, 0x80001806; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], vcc1807; GCN-IR-NEXT: v_cndmask_b32_e64 v4, v4, 0, s[4:5]1808; GCN-IR-NEXT: s_xor_b64 s[4:5], s[4:5], -11809; GCN-IR-NEXT: v_mov_b32_e32 v5, 01810; GCN-IR-NEXT: s_and_b64 s[4:5], s[4:5], s[6:7]1811; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]1812; GCN-IR-NEXT: s_cbranch_execz .LBB12_61813; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11814; GCN-IR-NEXT: v_add_i32_e32 v6, vcc, 1, v21815; GCN-IR-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1816; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 63, v21817; GCN-IR-NEXT: s_mov_b64 s[8:9], 0x80001818; GCN-IR-NEXT: v_lshl_b64 v[2:3], s[8:9], v21819; GCN-IR-NEXT: v_mov_b32_e32 v4, 01820; GCN-IR-NEXT: v_mov_b32_e32 v5, 01821; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -11822; GCN-IR-NEXT: s_and_saveexec_b64 s[10:11], s[4:5]1823; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[10:11]1824; GCN-IR-NEXT: s_cbranch_execz .LBB12_51825; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1826; GCN-IR-NEXT: v_add_i32_e32 v10, vcc, -1, v01827; GCN-IR-NEXT: v_addc_u32_e32 v11, vcc, -1, v1, vcc1828; GCN-IR-NEXT: v_sub_i32_e32 v12, vcc, 47, v81829; GCN-IR-NEXT: v_lshr_b64 v[6:7], s[8:9], v61830; GCN-IR-NEXT: v_subb_u32_e64 v13, s[8:9], 0, 0, vcc1831; GCN-IR-NEXT: v_mov_b32_e32 v8, 01832; GCN-IR-NEXT: s_mov_b64 s[8:9], 01833; GCN-IR-NEXT: v_mov_b32_e32 v9, 01834; GCN-IR-NEXT: v_mov_b32_e32 v5, 01835; GCN-IR-NEXT: .LBB12_3: ; %udiv-do-while1836; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11837; GCN-IR-NEXT: v_lshl_b64 v[6:7], v[6:7], 11838; GCN-IR-NEXT: v_lshrrev_b32_e32 v4, 31, v31839; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v41840; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11841; GCN-IR-NEXT: v_sub_i32_e32 v4, vcc, v10, v61842; GCN-IR-NEXT: v_subb_u32_e32 v4, vcc, v11, v7, vcc1843; GCN-IR-NEXT: v_or_b32_e32 v2, v8, v21844; GCN-IR-NEXT: v_ashrrev_i32_e32 v8, 31, v41845; GCN-IR-NEXT: v_or_b32_e32 v3, v9, v31846; GCN-IR-NEXT: v_and_b32_e32 v4, 1, v81847; GCN-IR-NEXT: v_and_b32_e32 v9, v8, v11848; GCN-IR-NEXT: v_and_b32_e32 v8, v8, v01849; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v6, v81850; GCN-IR-NEXT: v_subb_u32_e32 v7, vcc, v7, v9, vcc1851; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, 1, v121852; GCN-IR-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc1853; GCN-IR-NEXT: v_mov_b32_e32 v9, v51854; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]1855; GCN-IR-NEXT: v_mov_b32_e32 v8, v41856; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]1857; GCN-IR-NEXT: s_cbranch_execnz .LBB12_31858; GCN-IR-NEXT: ; %bb.4: ; %Flow1859; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]1860; GCN-IR-NEXT: .LBB12_5: ; %Flow41861; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]1862; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11863; GCN-IR-NEXT: v_or_b32_e32 v5, v5, v31864; GCN-IR-NEXT: v_or_b32_e32 v4, v4, v21865; GCN-IR-NEXT: .LBB12_6: ; %Flow51866; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]1867; GCN-IR-NEXT: v_mul_lo_u32 v2, v0, v51868; GCN-IR-NEXT: v_mul_hi_u32 v3, v0, v41869; GCN-IR-NEXT: v_mul_lo_u32 v1, v1, v41870; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, v41871; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, v3, v21872; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v2, v11873; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v01874; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, 0, v1, vcc1875; GCN-IR-NEXT: s_setpc_b64 s[30:31]1876 %result = srem i64 32768, %x1877 ret i64 %result1878}1879 1880define i64 @v_test_srem_pow2_k_den_i64(i64 %x) {1881; GCN-LABEL: v_test_srem_pow2_k_den_i64:1882; GCN: ; %bb.0:1883; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1884; GCN-NEXT: v_ashrrev_i32_e32 v2, 31, v11885; GCN-NEXT: v_lshrrev_b32_e32 v2, 17, v21886; GCN-NEXT: v_add_i32_e32 v2, vcc, v0, v21887; GCN-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc1888; GCN-NEXT: v_and_b32_e32 v2, 0xffff8000, v21889; GCN-NEXT: v_sub_i32_e32 v0, vcc, v0, v21890; GCN-NEXT: v_subb_u32_e32 v1, vcc, v1, v3, vcc1891; GCN-NEXT: s_setpc_b64 s[30:31]1892;1893; GCN-IR-LABEL: v_test_srem_pow2_k_den_i64:1894; GCN-IR: ; %bb.0: ; %_udiv-special-cases1895; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1896; GCN-IR-NEXT: v_ashrrev_i32_e32 v10, 31, v11897; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v101898; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v101899; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v101900; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v10, vcc1901; GCN-IR-NEXT: v_ffbh_u32_e32 v2, v01902; GCN-IR-NEXT: v_add_i32_e64 v2, s[4:5], 32, v21903; GCN-IR-NEXT: v_ffbh_u32_e32 v3, v11904; GCN-IR-NEXT: v_min_u32_e32 v8, v2, v31905; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 48, v81906; GCN-IR-NEXT: v_subb_u32_e64 v3, s[4:5], 0, 0, s[4:5]1907; GCN-IR-NEXT: v_cmp_eq_u64_e32 vcc, 0, v[0:1]1908; GCN-IR-NEXT: v_cmp_lt_u64_e64 s[4:5], 63, v[2:3]1909; GCN-IR-NEXT: v_mov_b32_e32 v11, v101910; GCN-IR-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1911; GCN-IR-NEXT: v_cmp_ne_u64_e32 vcc, 63, v[2:3]1912; GCN-IR-NEXT: s_xor_b64 s[6:7], s[4:5], -11913; GCN-IR-NEXT: v_cndmask_b32_e64 v5, v1, 0, s[4:5]1914; GCN-IR-NEXT: v_cndmask_b32_e64 v4, v0, 0, s[4:5]1915; GCN-IR-NEXT: s_and_b64 s[4:5], s[6:7], vcc1916; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]1917; GCN-IR-NEXT: s_cbranch_execz .LBB13_61918; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11919; GCN-IR-NEXT: v_add_i32_e32 v6, vcc, 1, v21920; GCN-IR-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1921; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 63, v21922; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[0:1], v21923; GCN-IR-NEXT: v_mov_b32_e32 v4, 01924; GCN-IR-NEXT: v_mov_b32_e32 v5, 01925; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -11926; GCN-IR-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]1927; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[8:9]1928; GCN-IR-NEXT: s_cbranch_execz .LBB13_51929; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1930; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, 0xffffffcf, v81931; GCN-IR-NEXT: v_lshr_b64 v[6:7], v[0:1], v61932; GCN-IR-NEXT: v_addc_u32_e64 v13, s[8:9], 0, -1, vcc1933; GCN-IR-NEXT: v_mov_b32_e32 v8, 01934; GCN-IR-NEXT: s_mov_b64 s[8:9], 01935; GCN-IR-NEXT: v_mov_b32_e32 v9, 01936; GCN-IR-NEXT: v_mov_b32_e32 v5, 01937; GCN-IR-NEXT: s_movk_i32 s10, 0x7fff1938; GCN-IR-NEXT: .LBB13_3: ; %udiv-do-while1939; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11940; GCN-IR-NEXT: v_lshl_b64 v[6:7], v[6:7], 11941; GCN-IR-NEXT: v_lshrrev_b32_e32 v4, 31, v31942; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v41943; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11944; GCN-IR-NEXT: v_sub_i32_e32 v4, vcc, s10, v61945; GCN-IR-NEXT: v_subb_u32_e32 v4, vcc, 0, v7, vcc1946; GCN-IR-NEXT: v_or_b32_e32 v2, v8, v21947; GCN-IR-NEXT: v_ashrrev_i32_e32 v8, 31, v41948; GCN-IR-NEXT: v_and_b32_e32 v4, 1, v81949; GCN-IR-NEXT: v_and_b32_e32 v8, 0x8000, v81950; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v6, v81951; GCN-IR-NEXT: v_subbrev_u32_e32 v7, vcc, 0, v7, vcc1952; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, 1, v121953; GCN-IR-NEXT: v_or_b32_e32 v3, v9, v31954; GCN-IR-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc1955; GCN-IR-NEXT: v_mov_b32_e32 v9, v51956; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]1957; GCN-IR-NEXT: v_mov_b32_e32 v8, v41958; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]1959; GCN-IR-NEXT: s_cbranch_execnz .LBB13_31960; GCN-IR-NEXT: ; %bb.4: ; %Flow1961; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]1962; GCN-IR-NEXT: .LBB13_5: ; %Flow41963; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]1964; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11965; GCN-IR-NEXT: v_or_b32_e32 v5, v5, v31966; GCN-IR-NEXT: v_or_b32_e32 v4, v4, v21967; GCN-IR-NEXT: .LBB13_6: ; %Flow51968; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]1969; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[4:5], 151970; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v21971; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v3, vcc1972; GCN-IR-NEXT: v_xor_b32_e32 v0, v0, v101973; GCN-IR-NEXT: v_xor_b32_e32 v1, v1, v111974; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v101975; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v11, vcc1976; GCN-IR-NEXT: s_setpc_b64 s[30:31]1977 %result = srem i64 %x, 327681978 ret i64 %result1979}1980 1981define amdgpu_kernel void @s_test_srem24_k_num_i64(ptr addrspace(1) %out, i64 %x) {1982; GCN-LABEL: s_test_srem24_k_num_i64:1983; GCN: ; %bb.0:1984; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91985; GCN-NEXT: s_mov_b32 s8, 0x41c000001986; GCN-NEXT: s_mov_b32 s7, 0xf0001987; GCN-NEXT: s_mov_b32 s6, -11988; GCN-NEXT: s_waitcnt lgkmcnt(0)1989; GCN-NEXT: s_ashr_i32 s2, s3, 81990; GCN-NEXT: v_cvt_f32_i32_e32 v0, s21991; GCN-NEXT: s_mov_b32 s4, s01992; GCN-NEXT: s_ashr_i32 s0, s3, 311993; GCN-NEXT: s_mov_b32 s5, s11994; GCN-NEXT: v_rcp_iflag_f32_e32 v1, v01995; GCN-NEXT: s_or_b32 s3, s0, 11996; GCN-NEXT: v_mul_f32_e32 v1, 0x41c00000, v11997; GCN-NEXT: v_trunc_f32_e32 v1, v11998; GCN-NEXT: v_mad_f32 v2, -v1, v0, s81999; GCN-NEXT: v_cvt_i32_f32_e32 v1, v12000; GCN-NEXT: v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|2001; GCN-NEXT: s_and_b64 s[0:1], s[0:1], exec2002; GCN-NEXT: s_cselect_b32 s0, s3, 02003; GCN-NEXT: v_readfirstlane_b32 s1, v12004; GCN-NEXT: s_add_i32 s0, s1, s02005; GCN-NEXT: s_mul_i32 s0, s0, s22006; GCN-NEXT: s_sub_i32 s0, 24, s02007; GCN-NEXT: s_bfe_i32 s0, s0, 0x1800002008; GCN-NEXT: s_ashr_i32 s1, s0, 312009; GCN-NEXT: v_mov_b32_e32 v0, s02010; GCN-NEXT: v_mov_b32_e32 v1, s12011; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 02012; GCN-NEXT: s_endpgm2013;2014; GCN-IR-LABEL: s_test_srem24_k_num_i64:2015; GCN-IR: ; %bb.0:2016; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92017; GCN-IR-NEXT: s_mov_b32 s8, 0x41c000002018; GCN-IR-NEXT: s_mov_b32 s7, 0xf0002019; GCN-IR-NEXT: s_mov_b32 s6, -12020; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)2021; GCN-IR-NEXT: s_ashr_i32 s2, s3, 82022; GCN-IR-NEXT: v_cvt_f32_i32_e32 v0, s22023; GCN-IR-NEXT: s_mov_b32 s4, s02024; GCN-IR-NEXT: s_ashr_i32 s0, s3, 312025; GCN-IR-NEXT: s_mov_b32 s5, s12026; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v1, v02027; GCN-IR-NEXT: s_or_b32 s3, s0, 12028; GCN-IR-NEXT: v_mul_f32_e32 v1, 0x41c00000, v12029; GCN-IR-NEXT: v_trunc_f32_e32 v1, v12030; GCN-IR-NEXT: v_mad_f32 v2, -v1, v0, s82031; GCN-IR-NEXT: v_cvt_i32_f32_e32 v1, v12032; GCN-IR-NEXT: v_cmp_ge_f32_e64 s[0:1], |v2|, |v0|2033; GCN-IR-NEXT: s_and_b64 s[0:1], s[0:1], exec2034; GCN-IR-NEXT: s_cselect_b32 s0, s3, 02035; GCN-IR-NEXT: v_readfirstlane_b32 s1, v12036; GCN-IR-NEXT: s_add_i32 s0, s1, s02037; GCN-IR-NEXT: s_mul_i32 s0, s0, s22038; GCN-IR-NEXT: s_sub_i32 s0, 24, s02039; GCN-IR-NEXT: s_bfe_i32 s0, s0, 0x1800002040; GCN-IR-NEXT: s_ashr_i32 s1, s0, 312041; GCN-IR-NEXT: v_mov_b32_e32 v0, s02042; GCN-IR-NEXT: v_mov_b32_e32 v1, s12043; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 02044; GCN-IR-NEXT: s_endpgm2045 %x.shr = ashr i64 %x, 402046 %result = srem i64 24, %x.shr2047 store i64 %result, ptr addrspace(1) %out2048 ret void2049}2050 2051define amdgpu_kernel void @s_test_srem24_k_den_i64(ptr addrspace(1) %out, i64 %x) {2052; GCN-LABEL: s_test_srem24_k_den_i64:2053; GCN: ; %bb.0:2054; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92055; GCN-NEXT: s_waitcnt lgkmcnt(0)2056; GCN-NEXT: s_mov_b32 s2, 0x46b6fe002057; GCN-NEXT: s_mov_b32 s7, 0xf0002058; GCN-NEXT: s_mov_b32 s6, -12059; GCN-NEXT: s_ashr_i32 s8, s3, 82060; GCN-NEXT: v_cvt_f32_i32_e32 v0, s82061; GCN-NEXT: s_mov_b32 s4, s02062; GCN-NEXT: s_ashr_i32 s0, s3, 312063; GCN-NEXT: s_mov_b32 s5, s12064; GCN-NEXT: v_mul_f32_e32 v1, 0x38331158, v02065; GCN-NEXT: v_trunc_f32_e32 v1, v12066; GCN-NEXT: v_mad_f32 v0, -v1, s2, v02067; GCN-NEXT: v_cvt_i32_f32_e32 v1, v12068; GCN-NEXT: s_or_b32 s3, s0, 12069; GCN-NEXT: v_cmp_ge_f32_e64 s[0:1], |v0|, s22070; GCN-NEXT: s_and_b64 s[0:1], s[0:1], exec2071; GCN-NEXT: s_cselect_b32 s0, s3, 02072; GCN-NEXT: v_readfirstlane_b32 s1, v12073; GCN-NEXT: s_add_i32 s0, s1, s02074; GCN-NEXT: s_mulk_i32 s0, 0x5b7f2075; GCN-NEXT: s_sub_i32 s0, s8, s02076; GCN-NEXT: s_bfe_i32 s0, s0, 0x1800002077; GCN-NEXT: s_ashr_i32 s1, s0, 312078; GCN-NEXT: v_mov_b32_e32 v0, s02079; GCN-NEXT: v_mov_b32_e32 v1, s12080; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 02081; GCN-NEXT: s_endpgm2082;2083; GCN-IR-LABEL: s_test_srem24_k_den_i64:2084; GCN-IR: ; %bb.0:2085; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x92086; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)2087; GCN-IR-NEXT: s_mov_b32 s2, 0x46b6fe002088; GCN-IR-NEXT: s_mov_b32 s7, 0xf0002089; GCN-IR-NEXT: s_mov_b32 s6, -12090; GCN-IR-NEXT: s_ashr_i32 s8, s3, 82091; GCN-IR-NEXT: v_cvt_f32_i32_e32 v0, s82092; GCN-IR-NEXT: s_mov_b32 s4, s02093; GCN-IR-NEXT: s_ashr_i32 s0, s3, 312094; GCN-IR-NEXT: s_mov_b32 s5, s12095; GCN-IR-NEXT: v_mul_f32_e32 v1, 0x38331158, v02096; GCN-IR-NEXT: v_trunc_f32_e32 v1, v12097; GCN-IR-NEXT: v_mad_f32 v0, -v1, s2, v02098; GCN-IR-NEXT: v_cvt_i32_f32_e32 v1, v12099; GCN-IR-NEXT: s_or_b32 s3, s0, 12100; GCN-IR-NEXT: v_cmp_ge_f32_e64 s[0:1], |v0|, s22101; GCN-IR-NEXT: s_and_b64 s[0:1], s[0:1], exec2102; GCN-IR-NEXT: s_cselect_b32 s0, s3, 02103; GCN-IR-NEXT: v_readfirstlane_b32 s1, v12104; GCN-IR-NEXT: s_add_i32 s0, s1, s02105; GCN-IR-NEXT: s_mulk_i32 s0, 0x5b7f2106; GCN-IR-NEXT: s_sub_i32 s0, s8, s02107; GCN-IR-NEXT: s_bfe_i32 s0, s0, 0x1800002108; GCN-IR-NEXT: s_ashr_i32 s1, s0, 312109; GCN-IR-NEXT: v_mov_b32_e32 v0, s02110; GCN-IR-NEXT: v_mov_b32_e32 v1, s12111; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 02112; GCN-IR-NEXT: s_endpgm2113 %x.shr = ashr i64 %x, 402114 %result = srem i64 %x.shr, 234232115 store i64 %result, ptr addrspace(1) %out2116 ret void2117}2118 2119define i64 @v_test_srem24_k_num_i64(i64 %x) {2120; GCN-LABEL: v_test_srem24_k_num_i64:2121; GCN: ; %bb.0:2122; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2123; GCN-NEXT: v_ashrrev_i32_e32 v0, 8, v12124; GCN-NEXT: v_cvt_f32_i32_e32 v2, v02125; GCN-NEXT: s_mov_b32 s4, 0x41c000002126; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v12127; GCN-NEXT: v_or_b32_e32 v1, 1, v12128; GCN-NEXT: v_rcp_iflag_f32_e32 v3, v22129; GCN-NEXT: v_mul_f32_e32 v3, 0x41c00000, v32130; GCN-NEXT: v_trunc_f32_e32 v3, v32131; GCN-NEXT: v_mad_f32 v4, -v3, v2, s42132; GCN-NEXT: v_cvt_i32_f32_e32 v3, v32133; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v4|, |v2|2134; GCN-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc2135; GCN-NEXT: v_add_i32_e32 v1, vcc, v3, v12136; GCN-NEXT: v_mul_lo_u32 v0, v1, v02137; GCN-NEXT: v_sub_i32_e32 v0, vcc, 24, v02138; GCN-NEXT: v_bfe_i32 v0, v0, 0, 242139; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v02140; GCN-NEXT: s_setpc_b64 s[30:31]2141;2142; GCN-IR-LABEL: v_test_srem24_k_num_i64:2143; GCN-IR: ; %bb.0:2144; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2145; GCN-IR-NEXT: v_ashrrev_i32_e32 v0, 8, v12146; GCN-IR-NEXT: v_cvt_f32_i32_e32 v2, v02147; GCN-IR-NEXT: s_mov_b32 s4, 0x41c000002148; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v12149; GCN-IR-NEXT: v_or_b32_e32 v1, 1, v12150; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v3, v22151; GCN-IR-NEXT: v_mul_f32_e32 v3, 0x41c00000, v32152; GCN-IR-NEXT: v_trunc_f32_e32 v3, v32153; GCN-IR-NEXT: v_mad_f32 v4, -v3, v2, s42154; GCN-IR-NEXT: v_cvt_i32_f32_e32 v3, v32155; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v4|, |v2|2156; GCN-IR-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc2157; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v3, v12158; GCN-IR-NEXT: v_mul_lo_u32 v0, v1, v02159; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 24, v02160; GCN-IR-NEXT: v_bfe_i32 v0, v0, 0, 242161; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v02162; GCN-IR-NEXT: s_setpc_b64 s[30:31]2163 %x.shr = ashr i64 %x, 402164 %result = srem i64 24, %x.shr2165 ret i64 %result2166}2167 2168define i64 @v_test_srem24_pow2_k_num_i64(i64 %x) {2169; GCN-LABEL: v_test_srem24_pow2_k_num_i64:2170; GCN: ; %bb.0:2171; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2172; GCN-NEXT: v_ashrrev_i32_e32 v0, 8, v12173; GCN-NEXT: v_cvt_f32_i32_e32 v2, v02174; GCN-NEXT: s_mov_b32 s4, 0x470000002175; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v12176; GCN-NEXT: v_or_b32_e32 v1, 1, v12177; GCN-NEXT: v_rcp_iflag_f32_e32 v3, v22178; GCN-NEXT: v_mul_f32_e32 v3, 0x47000000, v32179; GCN-NEXT: v_trunc_f32_e32 v3, v32180; GCN-NEXT: v_mad_f32 v4, -v3, v2, s42181; GCN-NEXT: v_cvt_i32_f32_e32 v3, v32182; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v4|, |v2|2183; GCN-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc2184; GCN-NEXT: v_add_i32_e32 v1, vcc, v3, v12185; GCN-NEXT: v_mul_lo_u32 v0, v1, v02186; GCN-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v02187; GCN-NEXT: v_bfe_i32 v0, v0, 0, 242188; GCN-NEXT: v_ashrrev_i32_e32 v1, 31, v02189; GCN-NEXT: s_setpc_b64 s[30:31]2190;2191; GCN-IR-LABEL: v_test_srem24_pow2_k_num_i64:2192; GCN-IR: ; %bb.0:2193; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2194; GCN-IR-NEXT: v_ashrrev_i32_e32 v0, 8, v12195; GCN-IR-NEXT: v_cvt_f32_i32_e32 v2, v02196; GCN-IR-NEXT: s_mov_b32 s4, 0x470000002197; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v12198; GCN-IR-NEXT: v_or_b32_e32 v1, 1, v12199; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v3, v22200; GCN-IR-NEXT: v_mul_f32_e32 v3, 0x47000000, v32201; GCN-IR-NEXT: v_trunc_f32_e32 v3, v32202; GCN-IR-NEXT: v_mad_f32 v4, -v3, v2, s42203; GCN-IR-NEXT: v_cvt_i32_f32_e32 v3, v32204; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v4|, |v2|2205; GCN-IR-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc2206; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v3, v12207; GCN-IR-NEXT: v_mul_lo_u32 v0, v1, v02208; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v02209; GCN-IR-NEXT: v_bfe_i32 v0, v0, 0, 242210; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v02211; GCN-IR-NEXT: s_setpc_b64 s[30:31]2212 %x.shr = ashr i64 %x, 402213 %result = srem i64 32768, %x.shr2214 ret i64 %result2215}2216 2217define i64 @v_test_srem24_pow2_k_den_i64(i64 %x) {2218; GCN-LABEL: v_test_srem24_pow2_k_den_i64:2219; GCN: ; %bb.0:2220; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2221; GCN-NEXT: v_ashrrev_i32_e32 v2, 31, v12222; GCN-NEXT: v_ashrrev_i32_e32 v0, 8, v12223; GCN-NEXT: v_lshrrev_b32_e32 v1, 17, v22224; GCN-NEXT: v_add_i32_e32 v1, vcc, v0, v12225; GCN-NEXT: v_addc_u32_e32 v3, vcc, 0, v2, vcc2226; GCN-NEXT: v_and_b32_e32 v1, 0xffff8000, v12227; GCN-NEXT: v_sub_i32_e32 v0, vcc, v0, v12228; GCN-NEXT: v_subb_u32_e32 v1, vcc, v2, v3, vcc2229; GCN-NEXT: s_setpc_b64 s[30:31]2230;2231; GCN-IR-LABEL: v_test_srem24_pow2_k_den_i64:2232; GCN-IR: ; %bb.0:2233; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)2234; GCN-IR-NEXT: v_ashrrev_i32_e32 v0, 8, v12235; GCN-IR-NEXT: v_cvt_f32_i32_e32 v2, v02236; GCN-IR-NEXT: s_mov_b32 s4, 0x470000002237; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v12238; GCN-IR-NEXT: v_or_b32_e32 v1, 1, v12239; GCN-IR-NEXT: v_mul_f32_e32 v3, 0x38000000, v22240; GCN-IR-NEXT: v_trunc_f32_e32 v3, v32241; GCN-IR-NEXT: v_mad_f32 v2, -v3, s4, v22242; GCN-IR-NEXT: v_cvt_i32_f32_e32 v3, v32243; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, s42244; GCN-IR-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc2245; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v3, v12246; GCN-IR-NEXT: v_lshlrev_b32_e32 v1, 15, v12247; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v12248; GCN-IR-NEXT: v_bfe_i32 v0, v0, 0, 242249; GCN-IR-NEXT: v_ashrrev_i32_e32 v1, 31, v02250; GCN-IR-NEXT: s_setpc_b64 s[30:31]2251 %x.shr = ashr i64 %x, 402252 %result = srem i64 %x.shr, 327682253 ret i64 %result2254}2255