1607 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_urem_i64(ptr addrspace(1) %out, i64 %x, i64 %y) {6; GCN-LABEL: s_test_urem_i64: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_urem_i64: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_urem_i64(i64 %x, i64 %y) {238; GCN-LABEL: v_test_urem_i64:239; GCN: ; %bb.0:240; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GCN-NEXT: v_cvt_f32_u32_e32 v4, v2242; GCN-NEXT: v_cvt_f32_u32_e32 v5, v3243; GCN-NEXT: v_sub_i32_e32 v6, vcc, 0, v2244; GCN-NEXT: v_subb_u32_e32 v7, vcc, 0, v3, vcc245; GCN-NEXT: v_madmk_f32 v4, v5, 0x4f800000, v4246; GCN-NEXT: v_rcp_f32_e32 v4, v4247; GCN-NEXT: v_mul_f32_e32 v4, 0x5f7ffffc, v4248; GCN-NEXT: v_mul_f32_e32 v5, 0x2f800000, v4249; GCN-NEXT: v_trunc_f32_e32 v5, v5250; GCN-NEXT: v_madmk_f32 v4, v5, 0xcf800000, v4251; GCN-NEXT: v_cvt_u32_f32_e32 v5, v5252; GCN-NEXT: v_cvt_u32_f32_e32 v4, v4253; GCN-NEXT: v_mul_lo_u32 v8, v6, v5254; GCN-NEXT: v_mul_hi_u32 v9, v6, v4255; GCN-NEXT: v_mul_lo_u32 v10, v7, v4256; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v8257; GCN-NEXT: v_mul_lo_u32 v9, v6, v4258; GCN-NEXT: v_add_i32_e32 v8, vcc, v8, v10259; GCN-NEXT: v_mul_lo_u32 v10, v4, v8260; GCN-NEXT: v_mul_hi_u32 v11, v4, v9261; GCN-NEXT: v_mul_hi_u32 v12, v4, v8262; GCN-NEXT: v_mul_hi_u32 v13, v5, v8263; GCN-NEXT: v_mul_lo_u32 v8, v5, v8264; GCN-NEXT: v_add_i32_e32 v10, vcc, v11, v10265; GCN-NEXT: v_addc_u32_e32 v11, vcc, 0, v12, vcc266; GCN-NEXT: v_mul_lo_u32 v12, v5, v9267; GCN-NEXT: v_mul_hi_u32 v9, v5, v9268; GCN-NEXT: v_add_i32_e32 v10, vcc, v10, v12269; GCN-NEXT: v_addc_u32_e32 v9, vcc, v11, v9, vcc270; GCN-NEXT: v_addc_u32_e32 v10, vcc, 0, v13, vcc271; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v8272; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc273; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v8274; GCN-NEXT: v_addc_u32_e32 v5, vcc, v5, v9, vcc275; GCN-NEXT: v_mul_lo_u32 v8, v6, v5276; GCN-NEXT: v_mul_hi_u32 v9, v6, v4277; GCN-NEXT: v_mul_lo_u32 v7, v7, v4278; GCN-NEXT: v_mul_lo_u32 v6, v6, v4279; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v8280; GCN-NEXT: v_add_i32_e32 v7, vcc, v8, v7281; GCN-NEXT: v_mul_lo_u32 v10, v4, v7282; GCN-NEXT: v_mul_hi_u32 v11, v4, v6283; GCN-NEXT: v_mul_hi_u32 v12, v4, v7284; GCN-NEXT: v_mul_hi_u32 v9, v5, v6285; GCN-NEXT: v_mul_lo_u32 v6, v5, v6286; GCN-NEXT: v_mul_hi_u32 v8, v5, v7287; GCN-NEXT: v_add_i32_e32 v10, vcc, v11, v10288; GCN-NEXT: v_addc_u32_e32 v11, vcc, 0, v12, vcc289; GCN-NEXT: v_mul_lo_u32 v7, v5, v7290; GCN-NEXT: v_add_i32_e32 v6, vcc, v10, v6291; GCN-NEXT: v_addc_u32_e32 v6, vcc, v11, v9, vcc292; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v8, vcc293; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v7294; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc295; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v6296; GCN-NEXT: v_addc_u32_e32 v5, vcc, v5, v7, vcc297; GCN-NEXT: v_mul_lo_u32 v6, v0, v5298; GCN-NEXT: v_mul_hi_u32 v7, v0, v4299; GCN-NEXT: v_mul_hi_u32 v8, v0, v5300; GCN-NEXT: v_mul_hi_u32 v9, v1, v5301; GCN-NEXT: v_mul_lo_u32 v5, v1, v5302; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v6303; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc304; GCN-NEXT: v_mul_lo_u32 v8, v1, v4305; GCN-NEXT: v_mul_hi_u32 v4, v1, v4306; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v8307; GCN-NEXT: v_addc_u32_e32 v4, vcc, v7, v4, vcc308; GCN-NEXT: v_addc_u32_e32 v6, vcc, 0, v9, vcc309; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v5310; GCN-NEXT: v_addc_u32_e32 v5, vcc, 0, v6, vcc311; GCN-NEXT: v_mul_lo_u32 v5, v2, v5312; GCN-NEXT: v_mul_hi_u32 v6, v2, v4313; GCN-NEXT: v_mul_lo_u32 v7, v3, v4314; GCN-NEXT: v_mul_lo_u32 v4, v2, v4315; GCN-NEXT: v_add_i32_e32 v5, vcc, v6, v5316; GCN-NEXT: v_add_i32_e32 v5, vcc, v5, v7317; GCN-NEXT: v_sub_i32_e32 v6, vcc, v1, v5318; GCN-NEXT: v_sub_i32_e32 v0, vcc, v0, v4319; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v6, v3, vcc320; GCN-NEXT: v_sub_i32_e64 v6, s[4:5], v0, v2321; GCN-NEXT: v_subbrev_u32_e64 v7, s[6:7], 0, v4, s[4:5]322; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v7, v3323; GCN-NEXT: v_cndmask_b32_e64 v8, 0, -1, s[6:7]324; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v6, v2325; GCN-NEXT: v_subb_u32_e32 v1, vcc, v1, v5, vcc326; GCN-NEXT: v_cndmask_b32_e64 v9, 0, -1, s[6:7]327; GCN-NEXT: v_cmp_eq_u32_e64 s[6:7], v7, v3328; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v3, s[4:5]329; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v1, v3330; GCN-NEXT: v_cndmask_b32_e64 v8, v8, v9, s[6:7]331; GCN-NEXT: v_sub_i32_e64 v9, s[4:5], v6, v2332; GCN-NEXT: v_cndmask_b32_e64 v5, 0, -1, vcc333; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v0, v2334; GCN-NEXT: v_subbrev_u32_e64 v4, s[4:5], 0, v4, s[4:5]335; GCN-NEXT: v_cndmask_b32_e64 v2, 0, -1, vcc336; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v1, v3337; GCN-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, v8338; GCN-NEXT: v_cndmask_b32_e32 v2, v5, v2, vcc339; GCN-NEXT: v_cndmask_b32_e64 v6, v6, v9, s[4:5]340; GCN-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2341; GCN-NEXT: v_cndmask_b32_e64 v2, v7, v4, s[4:5]342; GCN-NEXT: v_cndmask_b32_e32 v0, v0, v6, vcc343; GCN-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc344; GCN-NEXT: s_setpc_b64 s[30:31]345;346; GCN-IR-LABEL: v_test_urem_i64:347; GCN-IR: ; %bb.0: ; %_udiv-special-cases348; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)349; GCN-IR-NEXT: v_ffbh_u32_e32 v4, v2350; GCN-IR-NEXT: v_add_i32_e64 v4, s[6:7], 32, v4351; GCN-IR-NEXT: v_ffbh_u32_e32 v5, v3352; GCN-IR-NEXT: v_min_u32_e32 v10, v4, v5353; GCN-IR-NEXT: v_ffbh_u32_e32 v4, v0354; GCN-IR-NEXT: v_add_i32_e64 v4, s[6:7], 32, v4355; GCN-IR-NEXT: v_ffbh_u32_e32 v5, v1356; GCN-IR-NEXT: v_min_u32_e32 v11, v4, v5357; GCN-IR-NEXT: v_sub_i32_e64 v4, s[6:7], v10, v11358; GCN-IR-NEXT: v_cmp_eq_u64_e32 vcc, 0, v[2:3]359; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], 0, v[0:1]360; GCN-IR-NEXT: v_subb_u32_e64 v5, s[6:7], 0, 0, s[6:7]361; GCN-IR-NEXT: v_cmp_lt_u64_e64 s[6:7], 63, v[4:5]362; GCN-IR-NEXT: s_or_b64 s[4:5], vcc, s[4:5]363; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], s[6:7]364; GCN-IR-NEXT: v_cmp_ne_u64_e32 vcc, 63, v[4:5]365; GCN-IR-NEXT: s_xor_b64 s[6:7], s[4:5], -1366; GCN-IR-NEXT: v_cndmask_b32_e64 v7, v1, 0, s[4:5]367; GCN-IR-NEXT: v_cndmask_b32_e64 v6, v0, 0, s[4:5]368; GCN-IR-NEXT: s_and_b64 s[4:5], s[6:7], vcc369; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]370; GCN-IR-NEXT: s_cbranch_execz .LBB1_6371; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb1372; GCN-IR-NEXT: v_add_i32_e32 v8, vcc, 1, v4373; GCN-IR-NEXT: v_addc_u32_e32 v5, vcc, 0, v5, vcc374; GCN-IR-NEXT: v_sub_i32_e64 v4, s[4:5], 63, v4375; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[0:1], v4376; GCN-IR-NEXT: v_mov_b32_e32 v6, 0377; GCN-IR-NEXT: v_mov_b32_e32 v7, 0378; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -1379; GCN-IR-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]380; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[8:9]381; GCN-IR-NEXT: s_cbranch_execz .LBB1_5382; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader383; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, -1, v2384; GCN-IR-NEXT: v_addc_u32_e32 v13, vcc, -1, v3, vcc385; GCN-IR-NEXT: v_not_b32_e32 v6, v10386; GCN-IR-NEXT: v_add_i32_e32 v14, vcc, v6, v11387; GCN-IR-NEXT: v_lshr_b64 v[8:9], v[0:1], v8388; GCN-IR-NEXT: v_addc_u32_e64 v15, s[8:9], -1, 0, vcc389; GCN-IR-NEXT: v_mov_b32_e32 v10, 0390; GCN-IR-NEXT: s_mov_b64 s[8:9], 0391; GCN-IR-NEXT: v_mov_b32_e32 v11, 0392; GCN-IR-NEXT: v_mov_b32_e32 v7, 0393; GCN-IR-NEXT: .LBB1_3: ; %udiv-do-while394; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=1395; GCN-IR-NEXT: v_lshl_b64 v[8:9], v[8:9], 1396; GCN-IR-NEXT: v_lshrrev_b32_e32 v6, 31, v5397; GCN-IR-NEXT: v_or_b32_e32 v8, v8, v6398; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[4:5], 1399; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v12, v8400; GCN-IR-NEXT: v_subb_u32_e32 v6, vcc, v13, v9, vcc401; GCN-IR-NEXT: v_or_b32_e32 v4, v10, v4402; GCN-IR-NEXT: v_ashrrev_i32_e32 v10, 31, v6403; GCN-IR-NEXT: v_or_b32_e32 v5, v11, v5404; GCN-IR-NEXT: v_and_b32_e32 v6, 1, v10405; GCN-IR-NEXT: v_and_b32_e32 v11, v10, v3406; GCN-IR-NEXT: v_and_b32_e32 v10, v10, v2407; GCN-IR-NEXT: v_sub_i32_e32 v8, vcc, v8, v10408; GCN-IR-NEXT: v_subb_u32_e32 v9, vcc, v9, v11, vcc409; GCN-IR-NEXT: v_add_i32_e32 v14, vcc, 1, v14410; GCN-IR-NEXT: v_addc_u32_e32 v15, vcc, 0, v15, vcc411; GCN-IR-NEXT: v_mov_b32_e32 v11, v7412; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]413; GCN-IR-NEXT: v_mov_b32_e32 v10, v6414; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]415; GCN-IR-NEXT: s_cbranch_execnz .LBB1_3416; GCN-IR-NEXT: ; %bb.4: ; %Flow417; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]418; GCN-IR-NEXT: .LBB1_5: ; %Flow4419; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]420; GCN-IR-NEXT: v_lshl_b64 v[4:5], v[4:5], 1421; GCN-IR-NEXT: v_or_b32_e32 v7, v7, v5422; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v4423; GCN-IR-NEXT: .LBB1_6: ; %Flow5424; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]425; GCN-IR-NEXT: v_mul_lo_u32 v4, v2, v7426; GCN-IR-NEXT: v_mul_hi_u32 v5, v2, v6427; GCN-IR-NEXT: v_mul_lo_u32 v3, v3, v6428; GCN-IR-NEXT: v_mul_lo_u32 v2, v2, v6429; GCN-IR-NEXT: v_add_i32_e32 v4, vcc, v5, v4430; GCN-IR-NEXT: v_add_i32_e32 v3, vcc, v4, v3431; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v2432; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v3, vcc433; GCN-IR-NEXT: s_setpc_b64 s[30:31]434 %result = urem i64 %x, %y435 ret i64 %result436}437 438define amdgpu_kernel void @s_test_urem31_i64(ptr addrspace(1) %out, i64 %x, i64 %y) {439; GCN-LABEL: s_test_urem31_i64:440; GCN: ; %bb.0:441; GCN-NEXT: s_load_dword s0, s[4:5], 0xe442; GCN-NEXT: s_mov_b32 s7, 0xf000443; GCN-NEXT: s_mov_b32 s6, -1444; GCN-NEXT: s_waitcnt lgkmcnt(0)445; GCN-NEXT: s_lshr_b32 s8, s0, 1446; GCN-NEXT: v_cvt_f32_u32_e32 v0, s8447; GCN-NEXT: s_sub_i32 s0, 0, s8448; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0449; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0450; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0451; GCN-NEXT: v_mul_lo_u32 v1, s0, v0452; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9453; GCN-NEXT: v_mul_hi_u32 v1, v0, v1454; GCN-NEXT: s_waitcnt lgkmcnt(0)455; GCN-NEXT: s_lshr_b32 s2, s3, 1456; GCN-NEXT: s_mov_b32 s4, s0457; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v1458; GCN-NEXT: v_mul_hi_u32 v0, s2, v0459; GCN-NEXT: s_mov_b32 s5, s1460; GCN-NEXT: v_mov_b32_e32 v1, 0461; GCN-NEXT: v_readfirstlane_b32 s0, v0462; GCN-NEXT: s_mul_i32 s0, s0, s8463; GCN-NEXT: s_sub_i32 s0, s2, s0464; GCN-NEXT: s_sub_i32 s1, s0, s8465; GCN-NEXT: s_cmp_ge_u32 s0, s8466; GCN-NEXT: s_cselect_b32 s0, s1, s0467; GCN-NEXT: s_sub_i32 s1, s0, s8468; GCN-NEXT: s_cmp_ge_u32 s0, s8469; GCN-NEXT: s_cselect_b32 s0, s1, s0470; GCN-NEXT: v_mov_b32_e32 v0, s0471; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0472; GCN-NEXT: s_endpgm473;474; GCN-IR-LABEL: s_test_urem31_i64:475; GCN-IR: ; %bb.0:476; GCN-IR-NEXT: s_load_dword s0, s[4:5], 0xe477; GCN-IR-NEXT: s_mov_b32 s7, 0xf000478; GCN-IR-NEXT: s_mov_b32 s6, -1479; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)480; GCN-IR-NEXT: s_lshr_b32 s8, s0, 1481; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s8482; GCN-IR-NEXT: s_sub_i32 s0, 0, s8483; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0484; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0485; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0486; GCN-IR-NEXT: v_mul_lo_u32 v1, s0, v0487; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9488; GCN-IR-NEXT: v_mul_hi_u32 v1, v0, v1489; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)490; GCN-IR-NEXT: s_lshr_b32 s2, s3, 1491; GCN-IR-NEXT: s_mov_b32 s4, s0492; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v1493; GCN-IR-NEXT: v_mul_hi_u32 v0, s2, v0494; GCN-IR-NEXT: s_mov_b32 s5, s1495; GCN-IR-NEXT: v_mov_b32_e32 v1, 0496; GCN-IR-NEXT: v_readfirstlane_b32 s0, v0497; GCN-IR-NEXT: s_mul_i32 s0, s0, s8498; GCN-IR-NEXT: s_sub_i32 s0, s2, s0499; GCN-IR-NEXT: s_sub_i32 s1, s0, s8500; GCN-IR-NEXT: s_cmp_ge_u32 s0, s8501; GCN-IR-NEXT: s_cselect_b32 s0, s1, s0502; GCN-IR-NEXT: s_sub_i32 s1, s0, s8503; GCN-IR-NEXT: s_cmp_ge_u32 s0, s8504; GCN-IR-NEXT: s_cselect_b32 s0, s1, s0505; GCN-IR-NEXT: v_mov_b32_e32 v0, s0506; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0507; GCN-IR-NEXT: s_endpgm508 %1 = lshr i64 %x, 33509 %2 = lshr i64 %y, 33510 %result = urem i64 %1, %2511 store i64 %result, ptr addrspace(1) %out512 ret void513}514 515define amdgpu_kernel void @s_test_urem31_v2i64(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {516; GCN-LABEL: s_test_urem31_v2i64:517; GCN: ; %bb.0:518; GCN-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0xd519; GCN-NEXT: s_mov_b32 s3, 0xf000520; GCN-NEXT: s_waitcnt lgkmcnt(0)521; GCN-NEXT: s_lshr_b32 s0, s13, 1522; GCN-NEXT: v_cvt_f32_u32_e32 v0, s0523; GCN-NEXT: s_sub_i32 s1, 0, s0524; GCN-NEXT: s_lshr_b32 s6, s15, 1525; GCN-NEXT: v_cvt_f32_u32_e32 v2, s6526; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0527; GCN-NEXT: s_lshr_b32 s7, s11, 1528; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v2529; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0530; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0531; GCN-NEXT: v_mul_lo_u32 v1, s1, v0532; GCN-NEXT: s_lshr_b32 s1, s9, 1533; GCN-NEXT: v_mul_hi_u32 v1, v0, v1534; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v1535; GCN-NEXT: v_mul_hi_u32 v0, s1, v0536; GCN-NEXT: v_mul_f32_e32 v1, 0x4f7ffffe, v2537; GCN-NEXT: v_cvt_u32_f32_e32 v1, v1538; GCN-NEXT: v_readfirstlane_b32 s2, v0539; GCN-NEXT: s_mul_i32 s2, s2, s0540; GCN-NEXT: s_sub_i32 s1, s1, s2541; GCN-NEXT: s_sub_i32 s2, s1, s0542; GCN-NEXT: s_cmp_ge_u32 s1, s0543; GCN-NEXT: s_cselect_b32 s1, s2, s1544; GCN-NEXT: s_sub_i32 s2, s1, s0545; GCN-NEXT: s_cmp_ge_u32 s1, s0546; GCN-NEXT: s_cselect_b32 s8, s2, s1547; GCN-NEXT: s_sub_i32 s0, 0, s6548; GCN-NEXT: v_mul_lo_u32 v0, s0, v1549; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9550; GCN-NEXT: s_mov_b32 s2, -1551; GCN-NEXT: v_mul_hi_u32 v0, v1, v0552; GCN-NEXT: v_add_i32_e32 v0, vcc, v1, v0553; GCN-NEXT: v_mul_hi_u32 v2, s7, v0554; GCN-NEXT: v_mov_b32_e32 v1, 0555; GCN-NEXT: v_mov_b32_e32 v0, s8556; GCN-NEXT: v_mov_b32_e32 v3, v1557; GCN-NEXT: v_readfirstlane_b32 s4, v2558; GCN-NEXT: s_mul_i32 s4, s4, s6559; GCN-NEXT: s_sub_i32 s4, s7, s4560; GCN-NEXT: s_sub_i32 s5, s4, s6561; GCN-NEXT: s_cmp_ge_u32 s4, s6562; GCN-NEXT: s_cselect_b32 s4, s5, s4563; GCN-NEXT: s_sub_i32 s5, s4, s6564; GCN-NEXT: s_cmp_ge_u32 s4, s6565; GCN-NEXT: s_cselect_b32 s4, s5, s4566; GCN-NEXT: v_mov_b32_e32 v2, s4567; GCN-NEXT: s_waitcnt lgkmcnt(0)568; GCN-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0569; GCN-NEXT: s_endpgm570;571; GCN-IR-LABEL: s_test_urem31_v2i64:572; GCN-IR: ; %bb.0:573; GCN-IR-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0xd574; GCN-IR-NEXT: s_mov_b32 s3, 0xf000575; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)576; GCN-IR-NEXT: s_lshr_b32 s0, s13, 1577; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s0578; GCN-IR-NEXT: s_sub_i32 s1, 0, s0579; GCN-IR-NEXT: s_lshr_b32 s6, s15, 1580; GCN-IR-NEXT: v_cvt_f32_u32_e32 v2, s6581; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0582; GCN-IR-NEXT: s_lshr_b32 s7, s11, 1583; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v2584; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0585; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0586; GCN-IR-NEXT: v_mul_lo_u32 v1, s1, v0587; GCN-IR-NEXT: s_lshr_b32 s1, s9, 1588; GCN-IR-NEXT: v_mul_hi_u32 v1, v0, v1589; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v1590; GCN-IR-NEXT: v_mul_hi_u32 v0, s1, v0591; GCN-IR-NEXT: v_mul_f32_e32 v1, 0x4f7ffffe, v2592; GCN-IR-NEXT: v_cvt_u32_f32_e32 v1, v1593; GCN-IR-NEXT: v_readfirstlane_b32 s2, v0594; GCN-IR-NEXT: s_mul_i32 s2, s2, s0595; GCN-IR-NEXT: s_sub_i32 s1, s1, s2596; GCN-IR-NEXT: s_sub_i32 s2, s1, s0597; GCN-IR-NEXT: s_cmp_ge_u32 s1, s0598; GCN-IR-NEXT: s_cselect_b32 s1, s2, s1599; GCN-IR-NEXT: s_sub_i32 s2, s1, s0600; GCN-IR-NEXT: s_cmp_ge_u32 s1, s0601; GCN-IR-NEXT: s_cselect_b32 s8, s2, s1602; GCN-IR-NEXT: s_sub_i32 s0, 0, s6603; GCN-IR-NEXT: v_mul_lo_u32 v0, s0, v1604; GCN-IR-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9605; GCN-IR-NEXT: s_mov_b32 s2, -1606; GCN-IR-NEXT: v_mul_hi_u32 v0, v1, v0607; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v1, v0608; GCN-IR-NEXT: v_mul_hi_u32 v2, s7, v0609; GCN-IR-NEXT: v_mov_b32_e32 v1, 0610; GCN-IR-NEXT: v_mov_b32_e32 v0, s8611; GCN-IR-NEXT: v_mov_b32_e32 v3, v1612; GCN-IR-NEXT: v_readfirstlane_b32 s4, v2613; GCN-IR-NEXT: s_mul_i32 s4, s4, s6614; GCN-IR-NEXT: s_sub_i32 s4, s7, s4615; GCN-IR-NEXT: s_sub_i32 s5, s4, s6616; GCN-IR-NEXT: s_cmp_ge_u32 s4, s6617; GCN-IR-NEXT: s_cselect_b32 s4, s5, s4618; GCN-IR-NEXT: s_sub_i32 s5, s4, s6619; GCN-IR-NEXT: s_cmp_ge_u32 s4, s6620; GCN-IR-NEXT: s_cselect_b32 s4, s5, s4621; GCN-IR-NEXT: v_mov_b32_e32 v2, s4622; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)623; GCN-IR-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0624; GCN-IR-NEXT: s_endpgm625 %1 = lshr <2 x i64> %x, <i64 33, i64 33>626 %2 = lshr <2 x i64> %y, <i64 33, i64 33>627 %result = urem <2 x i64> %1, %2628 store <2 x i64> %result, ptr addrspace(1) %out629 ret void630}631 632define amdgpu_kernel void @s_test_urem24_i64(ptr addrspace(1) %out, i64 %x, i64 %y) {633; GCN-LABEL: s_test_urem24_i64:634; GCN: ; %bb.0:635; GCN-NEXT: s_load_dword s6, s[4:5], 0xe636; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9637; GCN-NEXT: s_waitcnt lgkmcnt(0)638; GCN-NEXT: s_mov_b32 s2, -1639; GCN-NEXT: s_lshr_b32 s4, s6, 8640; GCN-NEXT: v_cvt_f32_u32_e32 v0, s4641; GCN-NEXT: s_lshr_b32 s5, s3, 8642; GCN-NEXT: v_cvt_f32_u32_e32 v1, s5643; GCN-NEXT: s_mov_b32 s3, 0xf000644; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v0645; GCN-NEXT: v_mul_f32_e32 v2, v1, v2646; GCN-NEXT: v_trunc_f32_e32 v2, v2647; GCN-NEXT: v_cvt_u32_f32_e32 v3, v2648; GCN-NEXT: v_mad_f32 v1, -v2, v0, v1649; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, v0650; GCN-NEXT: v_mov_b32_e32 v1, 0651; GCN-NEXT: v_addc_u32_e32 v0, vcc, 0, v3, vcc652; GCN-NEXT: v_mul_lo_u32 v0, v0, s4653; GCN-NEXT: v_sub_i32_e32 v0, vcc, s5, v0654; GCN-NEXT: v_and_b32_e32 v0, 0xffffff, v0655; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0656; GCN-NEXT: s_endpgm657;658; GCN-IR-LABEL: s_test_urem24_i64:659; GCN-IR: ; %bb.0:660; GCN-IR-NEXT: s_load_dword s6, s[4:5], 0xe661; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9662; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)663; GCN-IR-NEXT: s_mov_b32 s2, -1664; GCN-IR-NEXT: s_lshr_b32 s4, s6, 8665; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s4666; GCN-IR-NEXT: s_lshr_b32 s5, s3, 8667; GCN-IR-NEXT: v_cvt_f32_u32_e32 v1, s5668; GCN-IR-NEXT: s_mov_b32 s3, 0xf000669; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v0670; GCN-IR-NEXT: v_mul_f32_e32 v2, v1, v2671; GCN-IR-NEXT: v_trunc_f32_e32 v2, v2672; GCN-IR-NEXT: v_cvt_u32_f32_e32 v3, v2673; GCN-IR-NEXT: v_mad_f32 v1, -v2, v0, v1674; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, v0675; GCN-IR-NEXT: v_mov_b32_e32 v1, 0676; GCN-IR-NEXT: v_addc_u32_e32 v0, vcc, 0, v3, vcc677; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, s4678; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, s5, v0679; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v0680; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0681; GCN-IR-NEXT: s_endpgm682 %1 = lshr i64 %x, 40683 %2 = lshr i64 %y, 40684 %result = urem i64 %1, %2685 store i64 %result, ptr addrspace(1) %out686 ret void687}688 689define amdgpu_kernel void @s_test_urem23_64_v2i64(ptr addrspace(1) %out, <2 x i64> %x, <2 x i64> %y) {690; GCN-LABEL: s_test_urem23_64_v2i64:691; GCN: ; %bb.0:692; GCN-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0xd693; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9694; GCN-NEXT: s_mov_b32 s3, 0xf000695; GCN-NEXT: s_mov_b32 s2, -1696; GCN-NEXT: s_waitcnt lgkmcnt(0)697; GCN-NEXT: s_lshr_b32 s6, s13, 1698; GCN-NEXT: v_cvt_f32_u32_e32 v0, s6699; GCN-NEXT: s_lshr_b32 s4, s15, 9700; GCN-NEXT: v_cvt_f32_u32_e32 v1, s4701; GCN-NEXT: s_lshr_b32 s5, s11, 9702; GCN-NEXT: v_rcp_iflag_f32_e32 v0, v0703; GCN-NEXT: v_cvt_f32_u32_e32 v2, s5704; GCN-NEXT: v_rcp_iflag_f32_e32 v3, v1705; GCN-NEXT: s_sub_i32 s8, 0, s6706; GCN-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0707; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0708; GCN-NEXT: v_mul_f32_e32 v3, v2, v3709; GCN-NEXT: v_trunc_f32_e32 v3, v3710; GCN-NEXT: v_mad_f32 v2, -v3, v1, v2711; GCN-NEXT: v_mul_lo_u32 v4, s8, v0712; GCN-NEXT: v_cvt_u32_f32_e32 v3, v3713; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v1714; GCN-NEXT: s_lshr_b32 s7, s9, 1715; GCN-NEXT: v_mul_hi_u32 v4, v0, v4716; GCN-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc717; GCN-NEXT: v_mul_lo_u32 v1, v1, s4718; GCN-NEXT: v_add_i32_e32 v0, vcc, v0, v4719; GCN-NEXT: v_mul_hi_u32 v0, s7, v0720; GCN-NEXT: v_sub_i32_e32 v1, vcc, s5, v1721; GCN-NEXT: v_and_b32_e32 v2, 0x7fffff, v1722; GCN-NEXT: v_readfirstlane_b32 s4, v0723; GCN-NEXT: s_mul_i32 s4, s4, s6724; GCN-NEXT: s_sub_i32 s4, s7, s4725; GCN-NEXT: s_sub_i32 s5, s4, s6726; GCN-NEXT: s_cmp_ge_u32 s4, s6727; GCN-NEXT: s_cselect_b32 s4, s5, s4728; GCN-NEXT: s_sub_i32 s5, s4, s6729; GCN-NEXT: s_cmp_ge_u32 s4, s6730; GCN-NEXT: s_cselect_b32 s4, s5, s4731; GCN-NEXT: v_mov_b32_e32 v1, 0732; GCN-NEXT: v_mov_b32_e32 v0, s4733; GCN-NEXT: v_mov_b32_e32 v3, v1734; GCN-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0735; GCN-NEXT: s_endpgm736;737; GCN-IR-LABEL: s_test_urem23_64_v2i64:738; GCN-IR: ; %bb.0:739; GCN-IR-NEXT: s_load_dwordx8 s[8:15], s[4:5], 0xd740; GCN-IR-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9741; GCN-IR-NEXT: s_mov_b32 s3, 0xf000742; GCN-IR-NEXT: s_mov_b32 s2, -1743; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)744; GCN-IR-NEXT: s_lshr_b32 s6, s13, 1745; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s6746; GCN-IR-NEXT: s_lshr_b32 s4, s15, 9747; GCN-IR-NEXT: v_cvt_f32_u32_e32 v1, s4748; GCN-IR-NEXT: s_lshr_b32 s5, s11, 9749; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v0, v0750; GCN-IR-NEXT: v_cvt_f32_u32_e32 v2, s5751; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v3, v1752; GCN-IR-NEXT: s_sub_i32 s8, 0, s6753; GCN-IR-NEXT: v_mul_f32_e32 v0, 0x4f7ffffe, v0754; GCN-IR-NEXT: v_cvt_u32_f32_e32 v0, v0755; GCN-IR-NEXT: v_mul_f32_e32 v3, v2, v3756; GCN-IR-NEXT: v_trunc_f32_e32 v3, v3757; GCN-IR-NEXT: v_mad_f32 v2, -v3, v1, v2758; GCN-IR-NEXT: v_mul_lo_u32 v4, s8, v0759; GCN-IR-NEXT: v_cvt_u32_f32_e32 v3, v3760; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v1761; GCN-IR-NEXT: s_lshr_b32 s7, s9, 1762; GCN-IR-NEXT: v_mul_hi_u32 v4, v0, v4763; GCN-IR-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc764; GCN-IR-NEXT: v_mul_lo_u32 v1, v1, s4765; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, v0, v4766; GCN-IR-NEXT: v_mul_hi_u32 v0, s7, v0767; GCN-IR-NEXT: v_sub_i32_e32 v1, vcc, s5, v1768; GCN-IR-NEXT: v_and_b32_e32 v2, 0x7fffff, v1769; GCN-IR-NEXT: v_readfirstlane_b32 s4, v0770; GCN-IR-NEXT: s_mul_i32 s4, s4, s6771; GCN-IR-NEXT: s_sub_i32 s4, s7, s4772; GCN-IR-NEXT: s_sub_i32 s5, s4, s6773; GCN-IR-NEXT: s_cmp_ge_u32 s4, s6774; GCN-IR-NEXT: s_cselect_b32 s4, s5, s4775; GCN-IR-NEXT: s_sub_i32 s5, s4, s6776; GCN-IR-NEXT: s_cmp_ge_u32 s4, s6777; GCN-IR-NEXT: s_cselect_b32 s4, s5, s4778; GCN-IR-NEXT: v_mov_b32_e32 v1, 0779; GCN-IR-NEXT: v_mov_b32_e32 v0, s4780; GCN-IR-NEXT: v_mov_b32_e32 v3, v1781; GCN-IR-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0782; GCN-IR-NEXT: s_endpgm783 %1 = lshr <2 x i64> %x, <i64 33, i64 41>784 %2 = lshr <2 x i64> %y, <i64 33, i64 41>785 %result = urem <2 x i64> %1, %2786 store <2 x i64> %result, ptr addrspace(1) %out787 ret void788}789 790define amdgpu_kernel void @s_test_urem_k_num_i64(ptr addrspace(1) %out, i64 %x) {791; GCN-LABEL: s_test_urem_k_num_i64:792; GCN: ; %bb.0:793; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9794; GCN-NEXT: s_waitcnt lgkmcnt(0)795; GCN-NEXT: v_cvt_f32_u32_e32 v0, s2796; GCN-NEXT: v_cvt_f32_u32_e32 v1, s3797; GCN-NEXT: s_sub_u32 s4, 0, s2798; GCN-NEXT: s_subb_u32 s5, 0, s3799; GCN-NEXT: v_madmk_f32 v0, v1, 0x4f800000, v0800; GCN-NEXT: v_rcp_f32_e32 v0, v0801; GCN-NEXT: v_mul_f32_e32 v0, 0x5f7ffffc, v0802; GCN-NEXT: v_mul_f32_e32 v1, 0x2f800000, v0803; GCN-NEXT: v_trunc_f32_e32 v1, v1804; GCN-NEXT: v_madmk_f32 v0, v1, 0xcf800000, v0805; GCN-NEXT: v_cvt_u32_f32_e32 v0, v0806; GCN-NEXT: v_cvt_u32_f32_e32 v1, v1807; GCN-NEXT: v_mul_hi_u32 v2, s4, v0808; GCN-NEXT: v_readfirstlane_b32 s6, v1809; GCN-NEXT: v_readfirstlane_b32 s7, v0810; GCN-NEXT: s_mul_i32 s8, s4, s6811; GCN-NEXT: v_readfirstlane_b32 s11, v2812; GCN-NEXT: s_mul_i32 s9, s5, s7813; GCN-NEXT: s_mul_i32 s10, s4, s7814; GCN-NEXT: s_add_i32 s8, s11, s8815; GCN-NEXT: v_mul_hi_u32 v3, v0, s10816; GCN-NEXT: s_add_i32 s8, s8, s9817; GCN-NEXT: v_mul_hi_u32 v0, v0, s8818; GCN-NEXT: v_mul_hi_u32 v4, v1, s10819; GCN-NEXT: v_readfirstlane_b32 s9, v3820; GCN-NEXT: s_mul_i32 s12, s7, s8821; GCN-NEXT: v_mul_hi_u32 v1, v1, s8822; GCN-NEXT: s_add_u32 s9, s9, s12823; GCN-NEXT: v_readfirstlane_b32 s12, v0824; GCN-NEXT: s_mul_i32 s10, s6, s10825; GCN-NEXT: s_addc_u32 s12, 0, s12826; GCN-NEXT: v_readfirstlane_b32 s11, v4827; GCN-NEXT: s_add_u32 s9, s9, s10828; GCN-NEXT: v_readfirstlane_b32 s13, v1829; GCN-NEXT: s_addc_u32 s9, s12, s11830; GCN-NEXT: s_mul_i32 s8, s6, s8831; GCN-NEXT: s_addc_u32 s10, s13, 0832; GCN-NEXT: s_add_u32 s8, s9, s8833; GCN-NEXT: s_addc_u32 s9, 0, s10834; GCN-NEXT: s_add_u32 s8, s7, s8835; GCN-NEXT: v_mov_b32_e32 v0, s8836; GCN-NEXT: v_mul_hi_u32 v0, s4, v0837; GCN-NEXT: s_addc_u32 s6, s6, s9838; GCN-NEXT: s_mul_i32 s9, s4, s6839; GCN-NEXT: s_mul_i32 s5, s5, s8840; GCN-NEXT: v_readfirstlane_b32 s10, v0841; GCN-NEXT: s_add_i32 s9, s10, s9842; GCN-NEXT: s_mul_i32 s4, s4, s8843; GCN-NEXT: s_add_i32 s5, s9, s5844; GCN-NEXT: v_mov_b32_e32 v2, s4845; GCN-NEXT: v_mov_b32_e32 v0, s5846; GCN-NEXT: v_mul_hi_u32 v3, s6, v2847; GCN-NEXT: v_mul_hi_u32 v2, s8, v2848; GCN-NEXT: v_mul_hi_u32 v1, s6, v0849; GCN-NEXT: v_mul_hi_u32 v0, s8, v0850; GCN-NEXT: s_mul_i32 s10, s8, s5851; GCN-NEXT: v_readfirstlane_b32 s12, v2852; GCN-NEXT: s_add_u32 s10, s12, s10853; GCN-NEXT: v_readfirstlane_b32 s11, v0854; GCN-NEXT: s_mul_i32 s4, s6, s4855; GCN-NEXT: s_addc_u32 s11, 0, s11856; GCN-NEXT: v_readfirstlane_b32 s9, v3857; GCN-NEXT: s_add_u32 s4, s10, s4858; GCN-NEXT: s_addc_u32 s4, s11, s9859; GCN-NEXT: v_readfirstlane_b32 s9, v1860; GCN-NEXT: s_addc_u32 s9, s9, 0861; GCN-NEXT: s_mul_i32 s5, s6, s5862; GCN-NEXT: s_add_u32 s4, s4, s5863; GCN-NEXT: s_addc_u32 s5, 0, s9864; GCN-NEXT: s_add_u32 s4, s8, s4865; GCN-NEXT: s_addc_u32 s5, s6, s5866; GCN-NEXT: v_mul_hi_u32 v1, s4, 24867; GCN-NEXT: v_mul_hi_u32 v0, s5, 24868; GCN-NEXT: s_mul_i32 s5, s5, 24869; GCN-NEXT: s_mov_b32 s7, 0xf000870; GCN-NEXT: v_readfirstlane_b32 s8, v1871; GCN-NEXT: v_readfirstlane_b32 s4, v0872; GCN-NEXT: s_add_u32 s5, s8, s5873; GCN-NEXT: s_addc_u32 s8, 0, s4874; GCN-NEXT: v_mov_b32_e32 v0, s8875; GCN-NEXT: v_mul_hi_u32 v0, s2, v0876; GCN-NEXT: s_mov_b32 s4, s0877; GCN-NEXT: s_mov_b32 s5, s1878; GCN-NEXT: s_mul_i32 s0, s3, s8879; GCN-NEXT: v_readfirstlane_b32 s1, v0880; GCN-NEXT: s_add_i32 s10, s1, s0881; GCN-NEXT: s_sub_i32 s9, 0, s10882; GCN-NEXT: s_mul_i32 s0, s2, s8883; GCN-NEXT: s_sub_u32 s11, 24, s0884; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0885; GCN-NEXT: s_subb_u32 s12, s9, s3886; GCN-NEXT: s_sub_u32 s13, s11, s2887; GCN-NEXT: s_cselect_b64 s[8:9], -1, 0888; GCN-NEXT: s_subb_u32 s14, s12, 0889; GCN-NEXT: s_cmp_ge_u32 s14, s3890; GCN-NEXT: s_cselect_b32 s15, -1, 0891; GCN-NEXT: s_cmp_ge_u32 s13, s2892; GCN-NEXT: s_cselect_b32 s16, -1, 0893; GCN-NEXT: s_cmp_eq_u32 s14, s3894; GCN-NEXT: s_cselect_b32 s15, s16, s15895; GCN-NEXT: s_or_b32 s8, s8, s9896; GCN-NEXT: s_subb_u32 s8, s12, s3897; GCN-NEXT: s_sub_u32 s9, s13, s2898; GCN-NEXT: s_subb_u32 s8, s8, 0899; GCN-NEXT: s_cmp_lg_u32 s15, 0900; GCN-NEXT: s_cselect_b32 s9, s9, s13901; GCN-NEXT: s_cselect_b32 s8, s8, s14902; GCN-NEXT: s_or_b32 s0, s0, s1903; GCN-NEXT: s_subb_u32 s0, 0, s10904; GCN-NEXT: s_cmp_ge_u32 s0, s3905; GCN-NEXT: s_cselect_b32 s1, -1, 0906; GCN-NEXT: s_cmp_ge_u32 s11, s2907; GCN-NEXT: s_cselect_b32 s2, -1, 0908; GCN-NEXT: s_cmp_eq_u32 s0, s3909; GCN-NEXT: s_cselect_b32 s1, s2, s1910; GCN-NEXT: s_cmp_lg_u32 s1, 0911; GCN-NEXT: s_cselect_b32 s0, s8, s0912; GCN-NEXT: s_cselect_b32 s1, s9, s11913; GCN-NEXT: s_mov_b32 s6, -1914; GCN-NEXT: v_mov_b32_e32 v0, s1915; GCN-NEXT: v_mov_b32_e32 v1, s0916; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0917; GCN-NEXT: s_endpgm918;919; GCN-IR-LABEL: s_test_urem_k_num_i64:920; GCN-IR: ; %bb.0: ; %_udiv-special-cases921; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9922; GCN-IR-NEXT: s_mov_b64 s[4:5], 0923; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)924; GCN-IR-NEXT: s_flbit_i32_b64 s14, s[2:3]925; GCN-IR-NEXT: s_add_u32 s8, s14, 0xffffffc5926; GCN-IR-NEXT: s_addc_u32 s9, 0, -1927; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[6:7], s[2:3], 0928; GCN-IR-NEXT: v_cmp_gt_u64_e64 s[10:11], s[8:9], 63929; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[12:13], s[8:9], 63930; GCN-IR-NEXT: s_or_b64 s[10:11], s[6:7], s[10:11]931; GCN-IR-NEXT: s_and_b64 s[6:7], s[10:11], exec932; GCN-IR-NEXT: s_cselect_b32 s6, 0, 24933; GCN-IR-NEXT: s_or_b64 s[10:11], s[10:11], s[12:13]934; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[10:11]935; GCN-IR-NEXT: s_mov_b32 s7, 0936; GCN-IR-NEXT: s_cbranch_vccz .LBB6_5937; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb1938; GCN-IR-NEXT: s_add_u32 s10, s8, 1939; GCN-IR-NEXT: s_addc_u32 s6, s9, 0940; GCN-IR-NEXT: s_cselect_b64 s[6:7], -1, 0941; GCN-IR-NEXT: s_sub_i32 s8, 63, s8942; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[6:7]943; GCN-IR-NEXT: s_lshl_b64 s[6:7], 24, s8944; GCN-IR-NEXT: s_cbranch_vccz .LBB6_4945; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader946; GCN-IR-NEXT: s_lshr_b64 s[10:11], 24, s10947; GCN-IR-NEXT: s_add_u32 s12, s2, -1948; GCN-IR-NEXT: s_addc_u32 s13, s3, -1949; GCN-IR-NEXT: s_sub_u32 s14, 58, s14950; GCN-IR-NEXT: s_subb_u32 s15, 0, 0951; GCN-IR-NEXT: s_mov_b64 s[8:9], 0952; GCN-IR-NEXT: s_mov_b32 s5, 0953; GCN-IR-NEXT: .LBB6_3: ; %udiv-do-while954; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=1955; GCN-IR-NEXT: s_lshl_b64 s[10:11], s[10:11], 1956; GCN-IR-NEXT: s_lshr_b32 s4, s7, 31957; GCN-IR-NEXT: s_lshl_b64 s[6:7], s[6:7], 1958; GCN-IR-NEXT: s_or_b64 s[10:11], s[10:11], s[4:5]959; GCN-IR-NEXT: s_or_b64 s[6:7], s[8:9], s[6:7]960; GCN-IR-NEXT: s_sub_u32 s4, s12, s10961; GCN-IR-NEXT: s_subb_u32 s4, s13, s11962; GCN-IR-NEXT: s_ashr_i32 s8, s4, 31963; GCN-IR-NEXT: s_mov_b32 s9, s8964; GCN-IR-NEXT: s_and_b32 s4, s8, 1965; GCN-IR-NEXT: s_and_b64 s[16:17], s[8:9], s[2:3]966; GCN-IR-NEXT: s_sub_u32 s10, s10, s16967; GCN-IR-NEXT: s_subb_u32 s11, s11, s17968; GCN-IR-NEXT: s_add_u32 s14, s14, 1969; GCN-IR-NEXT: s_addc_u32 s15, s15, 0970; GCN-IR-NEXT: s_cselect_b64 s[16:17], -1, 0971; GCN-IR-NEXT: s_mov_b64 s[8:9], s[4:5]972; GCN-IR-NEXT: s_and_b64 vcc, exec, s[16:17]973; GCN-IR-NEXT: s_cbranch_vccz .LBB6_3974; GCN-IR-NEXT: .LBB6_4: ; %Flow6975; GCN-IR-NEXT: s_lshl_b64 s[6:7], s[6:7], 1976; GCN-IR-NEXT: s_or_b64 s[6:7], s[4:5], s[6:7]977; GCN-IR-NEXT: .LBB6_5: ; %udiv-end978; GCN-IR-NEXT: v_mov_b32_e32 v0, s6979; GCN-IR-NEXT: v_mul_hi_u32 v0, s2, v0980; GCN-IR-NEXT: s_mov_b32 s8, s0981; GCN-IR-NEXT: s_mul_i32 s0, s2, s7982; GCN-IR-NEXT: s_mov_b32 s11, 0xf000983; GCN-IR-NEXT: v_add_i32_e32 v0, vcc, s0, v0984; GCN-IR-NEXT: s_mul_i32 s0, s3, s6985; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, s0, v0986; GCN-IR-NEXT: s_mul_i32 s0, s2, s6987; GCN-IR-NEXT: v_sub_i32_e64 v0, vcc, 24, s0988; GCN-IR-NEXT: s_mov_b32 s10, -1989; GCN-IR-NEXT: s_mov_b32 s9, s1990; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, 0, v1, vcc991; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 0992; GCN-IR-NEXT: s_endpgm993 %result = urem i64 24, %x994 store i64 %result, ptr addrspace(1) %out995 ret void996}997 998define amdgpu_kernel void @s_test_urem_k_den_i64(ptr addrspace(1) %out, i64 %x) {999; GCN-LABEL: s_test_urem_k_den_i64:1000; GCN: ; %bb.0:1001; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91002; GCN-NEXT: v_mov_b32_e32 v2, 0xaaaaaaab1003; GCN-NEXT: v_mov_b32_e32 v0, 0xaaaaaaaa1004; GCN-NEXT: s_mov_b32 s7, 0xf0001005; GCN-NEXT: s_mov_b32 s6, -11006; GCN-NEXT: s_waitcnt lgkmcnt(0)1007; GCN-NEXT: v_mul_hi_u32 v3, s2, v21008; GCN-NEXT: v_mul_hi_u32 v2, s3, v21009; GCN-NEXT: s_mul_i32 s5, s3, 0xaaaaaaab1010; GCN-NEXT: v_mul_hi_u32 v1, s2, v01011; GCN-NEXT: v_add_i32_e32 v3, vcc, s5, v31012; GCN-NEXT: s_mov_b32 s4, s01013; GCN-NEXT: s_mul_i32 s0, s2, 0xaaaaaaaa1014; GCN-NEXT: v_addc_u32_e32 v2, vcc, 0, v2, vcc1015; GCN-NEXT: v_add_i32_e32 v3, vcc, s0, v31016; GCN-NEXT: v_mul_hi_u32 v3, s3, v01017; GCN-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1018; GCN-NEXT: v_add_i32_e32 v1, vcc, v2, v11019; GCN-NEXT: s_mul_i32 s0, s3, 0xaaaaaaaa1020; GCN-NEXT: v_addc_u32_e64 v2, s[8:9], 0, 0, vcc1021; GCN-NEXT: v_add_i32_e32 v0, vcc, s0, v11022; GCN-NEXT: v_addc_u32_e32 v1, vcc, v3, v2, vcc1023; GCN-NEXT: v_lshrrev_b32_e32 v2, 4, v11024; GCN-NEXT: v_lshr_b64 v[0:1], v[0:1], 41025; GCN-NEXT: v_mul_lo_u32 v1, v2, 241026; GCN-NEXT: v_mul_hi_u32 v2, v0, 241027; GCN-NEXT: v_mul_lo_u32 v0, v0, 241028; GCN-NEXT: s_mov_b32 s5, s11029; GCN-NEXT: v_add_i32_e32 v1, vcc, v1, v21030; GCN-NEXT: v_mov_b32_e32 v2, s31031; GCN-NEXT: v_sub_i32_e32 v0, vcc, s2, v01032; GCN-NEXT: v_subb_u32_e32 v1, vcc, v2, v1, vcc1033; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 01034; GCN-NEXT: s_endpgm1035;1036; GCN-IR-LABEL: s_test_urem_k_den_i64:1037; GCN-IR: ; %bb.0: ; %_udiv-special-cases1038; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91039; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1040; GCN-IR-NEXT: s_flbit_i32_b64 s10, s[2:3]1041; GCN-IR-NEXT: s_sub_u32 s8, 59, s101042; GCN-IR-NEXT: s_subb_u32 s9, 0, 01043; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], s[2:3], 01044; GCN-IR-NEXT: v_cmp_gt_u64_e64 s[6:7], s[8:9], 631045; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[12:13], s[8:9], 631046; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], s[6:7]1047; GCN-IR-NEXT: s_and_b64 s[6:7], s[4:5], exec1048; GCN-IR-NEXT: s_cselect_b32 s7, 0, s31049; GCN-IR-NEXT: s_cselect_b32 s6, 0, s21050; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], s[12:13]1051; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[4:5]1052; GCN-IR-NEXT: s_mov_b64 s[4:5], 01053; GCN-IR-NEXT: s_cbranch_vccz .LBB7_51054; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11055; GCN-IR-NEXT: s_add_u32 s11, s8, 11056; GCN-IR-NEXT: s_addc_u32 s6, s9, 01057; GCN-IR-NEXT: s_cselect_b64 s[6:7], -1, 01058; GCN-IR-NEXT: s_sub_i32 s8, 63, s81059; GCN-IR-NEXT: s_andn2_b64 vcc, exec, s[6:7]1060; GCN-IR-NEXT: s_lshl_b64 s[6:7], s[2:3], s81061; GCN-IR-NEXT: s_cbranch_vccz .LBB7_41062; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1063; GCN-IR-NEXT: s_lshr_b64 s[8:9], s[2:3], s111064; GCN-IR-NEXT: s_add_u32 s12, s10, 0xffffffc41065; GCN-IR-NEXT: s_addc_u32 s13, 0, -11066; GCN-IR-NEXT: s_mov_b64 s[10:11], 01067; GCN-IR-NEXT: s_mov_b32 s5, 01068; GCN-IR-NEXT: .LBB7_3: ; %udiv-do-while1069; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11070; GCN-IR-NEXT: s_lshl_b64 s[8:9], s[8:9], 11071; GCN-IR-NEXT: s_lshr_b32 s4, s7, 311072; GCN-IR-NEXT: s_lshl_b64 s[6:7], s[6:7], 11073; GCN-IR-NEXT: s_or_b64 s[8:9], s[8:9], s[4:5]1074; GCN-IR-NEXT: s_or_b64 s[6:7], s[10:11], s[6:7]1075; GCN-IR-NEXT: s_sub_u32 s4, 23, s81076; GCN-IR-NEXT: s_subb_u32 s4, 0, s91077; GCN-IR-NEXT: s_ashr_i32 s10, s4, 311078; GCN-IR-NEXT: s_and_b32 s4, s10, 11079; GCN-IR-NEXT: s_and_b32 s10, s10, 241080; GCN-IR-NEXT: s_sub_u32 s8, s8, s101081; GCN-IR-NEXT: s_subb_u32 s9, s9, 01082; GCN-IR-NEXT: s_add_u32 s12, s12, 11083; GCN-IR-NEXT: s_addc_u32 s13, s13, 01084; GCN-IR-NEXT: s_cselect_b64 s[14:15], -1, 01085; GCN-IR-NEXT: s_mov_b64 s[10:11], s[4:5]1086; GCN-IR-NEXT: s_and_b64 vcc, exec, s[14:15]1087; GCN-IR-NEXT: s_cbranch_vccz .LBB7_31088; GCN-IR-NEXT: .LBB7_4: ; %Flow61089; GCN-IR-NEXT: s_lshl_b64 s[6:7], s[6:7], 11090; GCN-IR-NEXT: s_or_b64 s[6:7], s[4:5], s[6:7]1091; GCN-IR-NEXT: .LBB7_5: ; %udiv-end1092; GCN-IR-NEXT: v_mul_hi_u32 v0, s6, 241093; GCN-IR-NEXT: s_mov_b32 s8, s01094; GCN-IR-NEXT: s_mul_i32 s0, s7, 241095; GCN-IR-NEXT: v_mov_b32_e32 v2, s31096; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, s0, v01097; GCN-IR-NEXT: s_mul_i32 s0, s6, 241098; GCN-IR-NEXT: v_mov_b32_e32 v0, s01099; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, s2, v01100; GCN-IR-NEXT: s_mov_b32 s11, 0xf0001101; GCN-IR-NEXT: s_mov_b32 s10, -11102; GCN-IR-NEXT: s_mov_b32 s9, s11103; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v2, v1, vcc1104; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 01105; GCN-IR-NEXT: s_endpgm1106 %result = urem i64 %x, 241107 store i64 %result, ptr addrspace(1) %out1108 ret void1109}1110 1111; FIXME: Constant bus violation1112; define i64 @v_test_urem_k_num_i64(i64 %x) {1113; %result = urem i64 24, %x1114; ret i64 %result1115; }1116 1117define i64 @v_test_urem_pow2_k_num_i64(i64 %x) {1118; GCN-LABEL: v_test_urem_pow2_k_num_i64:1119; GCN: ; %bb.0:1120; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1121; GCN-NEXT: v_cvt_f32_u32_e32 v2, v01122; GCN-NEXT: v_cvt_f32_u32_e32 v3, v11123; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v01124; GCN-NEXT: v_subb_u32_e32 v5, vcc, 0, v1, vcc1125; GCN-NEXT: v_madmk_f32 v2, v3, 0x4f800000, v21126; GCN-NEXT: v_rcp_f32_e32 v2, v21127; GCN-NEXT: v_mul_f32_e32 v2, 0x5f7ffffc, v21128; GCN-NEXT: v_mul_f32_e32 v3, 0x2f800000, v21129; GCN-NEXT: v_trunc_f32_e32 v3, v31130; GCN-NEXT: v_madmk_f32 v2, v3, 0xcf800000, v21131; GCN-NEXT: v_cvt_u32_f32_e32 v3, v31132; GCN-NEXT: v_cvt_u32_f32_e32 v2, v21133; GCN-NEXT: v_mul_lo_u32 v6, v4, v31134; GCN-NEXT: v_mul_hi_u32 v7, v4, v21135; GCN-NEXT: v_mul_lo_u32 v8, v5, v21136; GCN-NEXT: v_mul_lo_u32 v9, v4, v21137; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61138; GCN-NEXT: v_add_i32_e32 v6, vcc, v6, v81139; GCN-NEXT: v_mul_hi_u32 v7, v2, v91140; GCN-NEXT: v_mul_lo_u32 v8, v2, v61141; GCN-NEXT: v_mul_hi_u32 v10, v2, v61142; GCN-NEXT: v_mul_hi_u32 v11, v3, v61143; GCN-NEXT: v_mul_lo_u32 v6, v3, v61144; GCN-NEXT: v_add_i32_e32 v7, vcc, v7, v81145; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v10, vcc1146; GCN-NEXT: v_mul_lo_u32 v10, v3, v91147; GCN-NEXT: v_mul_hi_u32 v9, v3, v91148; GCN-NEXT: v_add_i32_e32 v7, vcc, v7, v101149; GCN-NEXT: v_addc_u32_e32 v7, vcc, v8, v9, vcc1150; GCN-NEXT: v_addc_u32_e32 v8, vcc, 0, v11, vcc1151; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61152; GCN-NEXT: v_addc_u32_e32 v7, vcc, 0, v8, vcc1153; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v61154; GCN-NEXT: v_addc_u32_e32 v3, vcc, v3, v7, vcc1155; GCN-NEXT: v_mul_lo_u32 v6, v4, v31156; GCN-NEXT: v_mul_hi_u32 v7, v4, v21157; GCN-NEXT: v_mul_lo_u32 v5, v5, v21158; GCN-NEXT: v_mul_lo_u32 v4, v4, v21159; GCN-NEXT: v_add_i32_e32 v6, vcc, v7, v61160; GCN-NEXT: v_add_i32_e32 v5, vcc, v6, v51161; GCN-NEXT: v_mul_lo_u32 v8, v2, v51162; GCN-NEXT: v_mul_hi_u32 v9, v2, v41163; GCN-NEXT: v_mul_hi_u32 v10, v2, v51164; GCN-NEXT: v_mul_hi_u32 v7, v3, v41165; GCN-NEXT: v_mul_lo_u32 v4, v3, v41166; GCN-NEXT: v_mul_hi_u32 v6, v3, v51167; GCN-NEXT: v_add_i32_e32 v8, vcc, v9, v81168; GCN-NEXT: v_addc_u32_e32 v9, vcc, 0, v10, vcc1169; GCN-NEXT: v_mul_lo_u32 v5, v3, v51170; GCN-NEXT: v_add_i32_e32 v4, vcc, v8, v41171; GCN-NEXT: v_addc_u32_e32 v4, vcc, v9, v7, vcc1172; GCN-NEXT: v_addc_u32_e32 v6, vcc, 0, v6, vcc1173; GCN-NEXT: v_add_i32_e32 v4, vcc, v4, v51174; GCN-NEXT: v_addc_u32_e32 v5, vcc, 0, v6, vcc1175; GCN-NEXT: v_add_i32_e32 v2, vcc, v2, v41176; GCN-NEXT: v_addc_u32_e32 v2, vcc, v3, v5, vcc1177; GCN-NEXT: v_lshrrev_b32_e32 v2, 17, v21178; GCN-NEXT: v_mul_lo_u32 v3, v1, v21179; GCN-NEXT: v_mul_hi_u32 v4, v0, v21180; GCN-NEXT: v_mul_lo_u32 v2, v0, v21181; GCN-NEXT: v_add_i32_e32 v3, vcc, v4, v31182; GCN-NEXT: v_sub_i32_e32 v4, vcc, 0, v31183; GCN-NEXT: v_sub_i32_e32 v2, vcc, 0x8000, v21184; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, vcc1185; GCN-NEXT: v_sub_i32_e64 v5, s[4:5], v2, v01186; GCN-NEXT: v_subbrev_u32_e64 v6, s[6:7], 0, v4, s[4:5]1187; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v6, v11188; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, s[6:7]1189; GCN-NEXT: v_cmp_ge_u32_e64 s[6:7], v5, v01190; GCN-NEXT: v_cndmask_b32_e64 v8, 0, -1, s[6:7]1191; GCN-NEXT: v_cmp_eq_u32_e64 s[6:7], v6, v11192; GCN-NEXT: v_subb_u32_e64 v4, s[4:5], v4, v1, s[4:5]1193; GCN-NEXT: v_cndmask_b32_e64 v7, v7, v8, s[6:7]1194; GCN-NEXT: v_sub_i32_e64 v8, s[4:5], v5, v01195; GCN-NEXT: v_subb_u32_e32 v3, vcc, 0, v3, vcc1196; GCN-NEXT: v_subbrev_u32_e64 v4, s[4:5], 0, v4, s[4:5]1197; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v3, v11198; GCN-NEXT: v_cmp_ne_u32_e64 s[4:5], 0, v71199; GCN-NEXT: v_cndmask_b32_e64 v7, 0, -1, vcc1200; GCN-NEXT: v_cmp_ge_u32_e32 vcc, v2, v01201; GCN-NEXT: v_cndmask_b32_e64 v0, 0, -1, vcc1202; GCN-NEXT: v_cmp_eq_u32_e32 vcc, v3, v11203; GCN-NEXT: v_cndmask_b32_e32 v0, v7, v0, vcc1204; GCN-NEXT: v_cndmask_b32_e64 v5, v5, v8, s[4:5]1205; GCN-NEXT: v_cmp_ne_u32_e32 vcc, 0, v01206; GCN-NEXT: v_cndmask_b32_e64 v1, v6, v4, s[4:5]1207; GCN-NEXT: v_cndmask_b32_e32 v0, v2, v5, vcc1208; GCN-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc1209; GCN-NEXT: s_setpc_b64 s[30:31]1210;1211; GCN-IR-LABEL: v_test_urem_pow2_k_num_i64:1212; GCN-IR: ; %bb.0: ; %_udiv-special-cases1213; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1214; GCN-IR-NEXT: v_ffbh_u32_e32 v2, v01215; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 32, v21216; GCN-IR-NEXT: v_ffbh_u32_e32 v3, v11217; GCN-IR-NEXT: v_min_u32_e32 v8, v2, v31218; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, 0xffffffd0, v81219; GCN-IR-NEXT: v_addc_u32_e64 v3, s[6:7], 0, -1, vcc1220; GCN-IR-NEXT: v_cmp_eq_u64_e64 s[4:5], 0, v[0:1]1221; GCN-IR-NEXT: v_cmp_lt_u64_e32 vcc, 63, v[2:3]1222; GCN-IR-NEXT: v_cmp_ne_u64_e64 s[6:7], 63, v[2:3]1223; GCN-IR-NEXT: v_mov_b32_e32 v4, 0x80001224; GCN-IR-NEXT: s_or_b64 s[4:5], s[4:5], vcc1225; GCN-IR-NEXT: v_cndmask_b32_e64 v4, v4, 0, s[4:5]1226; GCN-IR-NEXT: s_xor_b64 s[4:5], s[4:5], -11227; GCN-IR-NEXT: v_mov_b32_e32 v5, 01228; GCN-IR-NEXT: s_and_b64 s[4:5], s[4:5], s[6:7]1229; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]1230; GCN-IR-NEXT: s_cbranch_execz .LBB8_61231; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11232; GCN-IR-NEXT: v_add_i32_e32 v6, vcc, 1, v21233; GCN-IR-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1234; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 63, v21235; GCN-IR-NEXT: s_mov_b64 s[8:9], 0x80001236; GCN-IR-NEXT: v_lshl_b64 v[2:3], s[8:9], v21237; GCN-IR-NEXT: v_mov_b32_e32 v4, 01238; GCN-IR-NEXT: v_mov_b32_e32 v5, 01239; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -11240; GCN-IR-NEXT: s_and_saveexec_b64 s[10:11], s[4:5]1241; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[10:11]1242; GCN-IR-NEXT: s_cbranch_execz .LBB8_51243; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1244; GCN-IR-NEXT: v_add_i32_e32 v10, vcc, -1, v01245; GCN-IR-NEXT: v_addc_u32_e32 v11, vcc, -1, v1, vcc1246; GCN-IR-NEXT: v_sub_i32_e32 v12, vcc, 47, v81247; GCN-IR-NEXT: v_lshr_b64 v[6:7], s[8:9], v61248; GCN-IR-NEXT: v_subb_u32_e64 v13, s[8:9], 0, 0, vcc1249; GCN-IR-NEXT: v_mov_b32_e32 v8, 01250; GCN-IR-NEXT: s_mov_b64 s[8:9], 01251; GCN-IR-NEXT: v_mov_b32_e32 v9, 01252; GCN-IR-NEXT: v_mov_b32_e32 v5, 01253; GCN-IR-NEXT: .LBB8_3: ; %udiv-do-while1254; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11255; GCN-IR-NEXT: v_lshl_b64 v[6:7], v[6:7], 11256; GCN-IR-NEXT: v_lshrrev_b32_e32 v4, 31, v31257; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v41258; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11259; GCN-IR-NEXT: v_sub_i32_e32 v4, vcc, v10, v61260; GCN-IR-NEXT: v_subb_u32_e32 v4, vcc, v11, v7, vcc1261; GCN-IR-NEXT: v_or_b32_e32 v2, v8, v21262; GCN-IR-NEXT: v_ashrrev_i32_e32 v8, 31, v41263; GCN-IR-NEXT: v_or_b32_e32 v3, v9, v31264; GCN-IR-NEXT: v_and_b32_e32 v4, 1, v81265; GCN-IR-NEXT: v_and_b32_e32 v9, v8, v11266; GCN-IR-NEXT: v_and_b32_e32 v8, v8, v01267; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v6, v81268; GCN-IR-NEXT: v_subb_u32_e32 v7, vcc, v7, v9, vcc1269; GCN-IR-NEXT: v_add_i32_e32 v12, vcc, 1, v121270; GCN-IR-NEXT: v_addc_u32_e32 v13, vcc, 0, v13, vcc1271; GCN-IR-NEXT: v_mov_b32_e32 v9, v51272; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]1273; GCN-IR-NEXT: v_mov_b32_e32 v8, v41274; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]1275; GCN-IR-NEXT: s_cbranch_execnz .LBB8_31276; GCN-IR-NEXT: ; %bb.4: ; %Flow1277; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]1278; GCN-IR-NEXT: .LBB8_5: ; %Flow41279; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]1280; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11281; GCN-IR-NEXT: v_or_b32_e32 v5, v5, v31282; GCN-IR-NEXT: v_or_b32_e32 v4, v4, v21283; GCN-IR-NEXT: .LBB8_6: ; %Flow51284; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]1285; GCN-IR-NEXT: v_mul_lo_u32 v2, v0, v51286; GCN-IR-NEXT: v_mul_hi_u32 v3, v0, v41287; GCN-IR-NEXT: v_mul_lo_u32 v1, v1, v41288; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, v41289; GCN-IR-NEXT: v_add_i32_e32 v2, vcc, v3, v21290; GCN-IR-NEXT: v_add_i32_e32 v1, vcc, v2, v11291; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v01292; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, 0, v1, vcc1293; GCN-IR-NEXT: s_setpc_b64 s[30:31]1294 %result = urem i64 32768, %x1295 ret i64 %result1296}1297 1298define i64 @v_test_urem_pow2_k_den_i64(i64 %x) {1299; GCN-LABEL: v_test_urem_pow2_k_den_i64:1300; GCN: ; %bb.0:1301; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1302; GCN-NEXT: v_and_b32_e32 v0, 0x7fff, v01303; GCN-NEXT: v_mov_b32_e32 v1, 01304; GCN-NEXT: s_setpc_b64 s[30:31]1305;1306; GCN-IR-LABEL: v_test_urem_pow2_k_den_i64:1307; GCN-IR: ; %bb.0: ; %_udiv-special-cases1308; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1309; GCN-IR-NEXT: v_ffbh_u32_e32 v2, v01310; GCN-IR-NEXT: v_add_i32_e64 v2, s[4:5], 32, v21311; GCN-IR-NEXT: v_ffbh_u32_e32 v3, v11312; GCN-IR-NEXT: v_min_u32_e32 v8, v2, v31313; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 48, v81314; GCN-IR-NEXT: v_subb_u32_e64 v3, s[4:5], 0, 0, s[4:5]1315; GCN-IR-NEXT: v_cmp_eq_u64_e32 vcc, 0, v[0:1]1316; GCN-IR-NEXT: v_cmp_lt_u64_e64 s[4:5], 63, v[2:3]1317; GCN-IR-NEXT: s_or_b64 s[4:5], vcc, s[4:5]1318; GCN-IR-NEXT: v_cmp_ne_u64_e32 vcc, 63, v[2:3]1319; GCN-IR-NEXT: s_xor_b64 s[6:7], s[4:5], -11320; GCN-IR-NEXT: v_cndmask_b32_e64 v5, v1, 0, s[4:5]1321; GCN-IR-NEXT: v_cndmask_b32_e64 v4, v0, 0, s[4:5]1322; GCN-IR-NEXT: s_and_b64 s[4:5], s[6:7], vcc1323; GCN-IR-NEXT: s_and_saveexec_b64 s[6:7], s[4:5]1324; GCN-IR-NEXT: s_cbranch_execz .LBB9_61325; GCN-IR-NEXT: ; %bb.1: ; %udiv-bb11326; GCN-IR-NEXT: v_add_i32_e32 v6, vcc, 1, v21327; GCN-IR-NEXT: v_addc_u32_e32 v3, vcc, 0, v3, vcc1328; GCN-IR-NEXT: v_sub_i32_e64 v2, s[4:5], 63, v21329; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[0:1], v21330; GCN-IR-NEXT: v_mov_b32_e32 v4, 01331; GCN-IR-NEXT: v_mov_b32_e32 v5, 01332; GCN-IR-NEXT: s_xor_b64 s[4:5], vcc, -11333; GCN-IR-NEXT: s_and_saveexec_b64 s[8:9], s[4:5]1334; GCN-IR-NEXT: s_xor_b64 s[4:5], exec, s[8:9]1335; GCN-IR-NEXT: s_cbranch_execz .LBB9_51336; GCN-IR-NEXT: ; %bb.2: ; %udiv-preheader1337; GCN-IR-NEXT: v_add_i32_e32 v10, vcc, 0xffffffcf, v81338; GCN-IR-NEXT: v_lshr_b64 v[6:7], v[0:1], v61339; GCN-IR-NEXT: v_addc_u32_e64 v11, s[8:9], 0, -1, vcc1340; GCN-IR-NEXT: v_mov_b32_e32 v8, 01341; GCN-IR-NEXT: s_mov_b64 s[8:9], 01342; GCN-IR-NEXT: v_mov_b32_e32 v9, 01343; GCN-IR-NEXT: v_mov_b32_e32 v5, 01344; GCN-IR-NEXT: s_movk_i32 s10, 0x7fff1345; GCN-IR-NEXT: .LBB9_3: ; %udiv-do-while1346; GCN-IR-NEXT: ; =>This Inner Loop Header: Depth=11347; GCN-IR-NEXT: v_lshl_b64 v[6:7], v[6:7], 11348; GCN-IR-NEXT: v_lshrrev_b32_e32 v4, 31, v31349; GCN-IR-NEXT: v_or_b32_e32 v6, v6, v41350; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11351; GCN-IR-NEXT: v_sub_i32_e32 v4, vcc, s10, v61352; GCN-IR-NEXT: v_subb_u32_e32 v4, vcc, 0, v7, vcc1353; GCN-IR-NEXT: v_or_b32_e32 v2, v8, v21354; GCN-IR-NEXT: v_ashrrev_i32_e32 v8, 31, v41355; GCN-IR-NEXT: v_and_b32_e32 v4, 1, v81356; GCN-IR-NEXT: v_and_b32_e32 v8, 0x8000, v81357; GCN-IR-NEXT: v_sub_i32_e32 v6, vcc, v6, v81358; GCN-IR-NEXT: v_subbrev_u32_e32 v7, vcc, 0, v7, vcc1359; GCN-IR-NEXT: v_add_i32_e32 v10, vcc, 1, v101360; GCN-IR-NEXT: v_or_b32_e32 v3, v9, v31361; GCN-IR-NEXT: v_addc_u32_e32 v11, vcc, 0, v11, vcc1362; GCN-IR-NEXT: v_mov_b32_e32 v9, v51363; GCN-IR-NEXT: s_or_b64 s[8:9], vcc, s[8:9]1364; GCN-IR-NEXT: v_mov_b32_e32 v8, v41365; GCN-IR-NEXT: s_andn2_b64 exec, exec, s[8:9]1366; GCN-IR-NEXT: s_cbranch_execnz .LBB9_31367; GCN-IR-NEXT: ; %bb.4: ; %Flow1368; GCN-IR-NEXT: s_or_b64 exec, exec, s[8:9]1369; GCN-IR-NEXT: .LBB9_5: ; %Flow41370; GCN-IR-NEXT: s_or_b64 exec, exec, s[4:5]1371; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[2:3], 11372; GCN-IR-NEXT: v_or_b32_e32 v5, v5, v31373; GCN-IR-NEXT: v_or_b32_e32 v4, v4, v21374; GCN-IR-NEXT: .LBB9_6: ; %Flow51375; GCN-IR-NEXT: s_or_b64 exec, exec, s[6:7]1376; GCN-IR-NEXT: v_lshl_b64 v[2:3], v[4:5], 151377; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v21378; GCN-IR-NEXT: v_subb_u32_e32 v1, vcc, v1, v3, vcc1379; GCN-IR-NEXT: s_setpc_b64 s[30:31]1380 %result = urem i64 %x, 327681381 ret i64 %result1382}1383 1384define amdgpu_kernel void @s_test_urem24_k_num_i64(ptr addrspace(1) %out, i64 %x) {1385; GCN-LABEL: s_test_urem24_k_num_i64:1386; GCN: ; %bb.0:1387; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91388; GCN-NEXT: s_mov_b32 s5, 0x41c000001389; GCN-NEXT: s_waitcnt lgkmcnt(0)1390; GCN-NEXT: s_mov_b32 s2, -11391; GCN-NEXT: s_lshr_b32 s4, s3, 81392; GCN-NEXT: v_cvt_f32_u32_e32 v0, s41393; GCN-NEXT: s_mov_b32 s3, 0xf0001394; GCN-NEXT: v_rcp_iflag_f32_e32 v1, v01395; GCN-NEXT: v_mul_f32_e32 v1, 0x41c00000, v11396; GCN-NEXT: v_trunc_f32_e32 v1, v11397; GCN-NEXT: v_cvt_u32_f32_e32 v2, v11398; GCN-NEXT: v_mad_f32 v1, -v1, v0, s51399; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, v01400; GCN-NEXT: v_mov_b32_e32 v1, 01401; GCN-NEXT: v_addc_u32_e32 v0, vcc, 0, v2, vcc1402; GCN-NEXT: v_mul_lo_u32 v0, v0, s41403; GCN-NEXT: v_sub_i32_e32 v0, vcc, 24, v01404; GCN-NEXT: v_and_b32_e32 v0, 0xffffff, v01405; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01406; GCN-NEXT: s_endpgm1407;1408; GCN-IR-LABEL: s_test_urem24_k_num_i64:1409; GCN-IR: ; %bb.0:1410; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91411; GCN-IR-NEXT: s_mov_b32 s5, 0x41c000001412; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1413; GCN-IR-NEXT: s_mov_b32 s2, -11414; GCN-IR-NEXT: s_lshr_b32 s4, s3, 81415; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s41416; GCN-IR-NEXT: s_mov_b32 s3, 0xf0001417; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v1, v01418; GCN-IR-NEXT: v_mul_f32_e32 v1, 0x41c00000, v11419; GCN-IR-NEXT: v_trunc_f32_e32 v1, v11420; GCN-IR-NEXT: v_cvt_u32_f32_e32 v2, v11421; GCN-IR-NEXT: v_mad_f32 v1, -v1, v0, s51422; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, v01423; GCN-IR-NEXT: v_mov_b32_e32 v1, 01424; GCN-IR-NEXT: v_addc_u32_e32 v0, vcc, 0, v2, vcc1425; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, s41426; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 24, v01427; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v01428; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01429; GCN-IR-NEXT: s_endpgm1430 %x.shr = lshr i64 %x, 401431 %result = urem i64 24, %x.shr1432 store i64 %result, ptr addrspace(1) %out1433 ret void1434}1435 1436define amdgpu_kernel void @s_test_urem24_k_den_i64(ptr addrspace(1) %out, i64 %x) {1437; GCN-LABEL: s_test_urem24_k_den_i64:1438; GCN: ; %bb.0:1439; GCN-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91440; GCN-NEXT: s_movk_i32 s4, 0x5b7f1441; GCN-NEXT: s_mov_b32 s7, 0xf0001442; GCN-NEXT: s_mov_b32 s6, -11443; GCN-NEXT: s_waitcnt lgkmcnt(0)1444; GCN-NEXT: s_lshr_b32 s2, s3, 81445; GCN-NEXT: v_cvt_f32_u32_e32 v0, s21446; GCN-NEXT: s_mov_b32 s3, 0x46b6fe001447; GCN-NEXT: s_mov_b32 s5, s11448; GCN-NEXT: v_mul_f32_e32 v1, 0x38331158, v01449; GCN-NEXT: v_trunc_f32_e32 v1, v11450; GCN-NEXT: v_cvt_u32_f32_e32 v2, v11451; GCN-NEXT: v_mad_f32 v0, -v1, s3, v01452; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v0|, s31453; GCN-NEXT: v_mov_b32_e32 v1, 01454; GCN-NEXT: v_addc_u32_e32 v0, vcc, 0, v2, vcc1455; GCN-NEXT: v_mul_lo_u32 v0, v0, s41456; GCN-NEXT: s_mov_b32 s4, s01457; GCN-NEXT: v_sub_i32_e32 v0, vcc, s2, v01458; GCN-NEXT: v_and_b32_e32 v0, 0xffffff, v01459; GCN-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 01460; GCN-NEXT: s_endpgm1461;1462; GCN-IR-LABEL: s_test_urem24_k_den_i64:1463; GCN-IR: ; %bb.0:1464; GCN-IR-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91465; GCN-IR-NEXT: s_movk_i32 s4, 0x5b7f1466; GCN-IR-NEXT: s_mov_b32 s7, 0xf0001467; GCN-IR-NEXT: s_mov_b32 s6, -11468; GCN-IR-NEXT: s_waitcnt lgkmcnt(0)1469; GCN-IR-NEXT: s_lshr_b32 s2, s3, 81470; GCN-IR-NEXT: v_cvt_f32_u32_e32 v0, s21471; GCN-IR-NEXT: s_mov_b32 s3, 0x46b6fe001472; GCN-IR-NEXT: s_mov_b32 s5, s11473; GCN-IR-NEXT: v_mul_f32_e32 v1, 0x38331158, v01474; GCN-IR-NEXT: v_trunc_f32_e32 v1, v11475; GCN-IR-NEXT: v_cvt_u32_f32_e32 v2, v11476; GCN-IR-NEXT: v_mad_f32 v0, -v1, s3, v01477; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v0|, s31478; GCN-IR-NEXT: v_mov_b32_e32 v1, 01479; GCN-IR-NEXT: v_addc_u32_e32 v0, vcc, 0, v2, vcc1480; GCN-IR-NEXT: v_mul_lo_u32 v0, v0, s41481; GCN-IR-NEXT: s_mov_b32 s4, s01482; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, s2, v01483; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v01484; GCN-IR-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 01485; GCN-IR-NEXT: s_endpgm1486 %x.shr = lshr i64 %x, 401487 %result = urem i64 %x.shr, 234231488 store i64 %result, ptr addrspace(1) %out1489 ret void1490}1491 1492define i64 @v_test_urem24_k_num_i64(i64 %x) {1493; GCN-LABEL: v_test_urem24_k_num_i64:1494; GCN: ; %bb.0:1495; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1496; GCN-NEXT: v_lshrrev_b32_e32 v0, 8, v11497; GCN-NEXT: v_cvt_f32_u32_e32 v1, v01498; GCN-NEXT: s_mov_b32 s4, 0x41c000001499; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v11500; GCN-NEXT: v_mul_f32_e32 v2, 0x41c00000, v21501; GCN-NEXT: v_trunc_f32_e32 v2, v21502; GCN-NEXT: v_cvt_u32_f32_e32 v3, v21503; GCN-NEXT: v_mad_f32 v2, -v2, v1, s41504; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v11505; GCN-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1506; GCN-NEXT: v_mul_lo_u32 v0, v1, v01507; GCN-NEXT: v_mov_b32_e32 v1, 01508; GCN-NEXT: v_sub_i32_e32 v0, vcc, 24, v01509; GCN-NEXT: v_and_b32_e32 v0, 0xffffff, v01510; GCN-NEXT: s_setpc_b64 s[30:31]1511;1512; GCN-IR-LABEL: v_test_urem24_k_num_i64:1513; GCN-IR: ; %bb.0:1514; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1515; GCN-IR-NEXT: v_lshrrev_b32_e32 v0, 8, v11516; GCN-IR-NEXT: v_cvt_f32_u32_e32 v1, v01517; GCN-IR-NEXT: s_mov_b32 s4, 0x41c000001518; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v11519; GCN-IR-NEXT: v_mul_f32_e32 v2, 0x41c00000, v21520; GCN-IR-NEXT: v_trunc_f32_e32 v2, v21521; GCN-IR-NEXT: v_cvt_u32_f32_e32 v3, v21522; GCN-IR-NEXT: v_mad_f32 v2, -v2, v1, s41523; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v11524; GCN-IR-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1525; GCN-IR-NEXT: v_mul_lo_u32 v0, v1, v01526; GCN-IR-NEXT: v_mov_b32_e32 v1, 01527; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 24, v01528; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v01529; GCN-IR-NEXT: s_setpc_b64 s[30:31]1530 %x.shr = lshr i64 %x, 401531 %result = urem i64 24, %x.shr1532 ret i64 %result1533}1534 1535define i64 @v_test_urem24_pow2_k_num_i64(i64 %x) {1536; GCN-LABEL: v_test_urem24_pow2_k_num_i64:1537; GCN: ; %bb.0:1538; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1539; GCN-NEXT: v_lshrrev_b32_e32 v0, 8, v11540; GCN-NEXT: v_cvt_f32_u32_e32 v1, v01541; GCN-NEXT: s_mov_b32 s4, 0x470000001542; GCN-NEXT: v_rcp_iflag_f32_e32 v2, v11543; GCN-NEXT: v_mul_f32_e32 v2, 0x47000000, v21544; GCN-NEXT: v_trunc_f32_e32 v2, v21545; GCN-NEXT: v_cvt_u32_f32_e32 v3, v21546; GCN-NEXT: v_mad_f32 v2, -v2, v1, s41547; GCN-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v11548; GCN-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1549; GCN-NEXT: v_mul_lo_u32 v0, v1, v01550; GCN-NEXT: v_mov_b32_e32 v1, 01551; GCN-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v01552; GCN-NEXT: v_and_b32_e32 v0, 0xffffff, v01553; GCN-NEXT: s_setpc_b64 s[30:31]1554;1555; GCN-IR-LABEL: v_test_urem24_pow2_k_num_i64:1556; GCN-IR: ; %bb.0:1557; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1558; GCN-IR-NEXT: v_lshrrev_b32_e32 v0, 8, v11559; GCN-IR-NEXT: v_cvt_f32_u32_e32 v1, v01560; GCN-IR-NEXT: s_mov_b32 s4, 0x470000001561; GCN-IR-NEXT: v_rcp_iflag_f32_e32 v2, v11562; GCN-IR-NEXT: v_mul_f32_e32 v2, 0x47000000, v21563; GCN-IR-NEXT: v_trunc_f32_e32 v2, v21564; GCN-IR-NEXT: v_cvt_u32_f32_e32 v3, v21565; GCN-IR-NEXT: v_mad_f32 v2, -v2, v1, s41566; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v2|, v11567; GCN-IR-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1568; GCN-IR-NEXT: v_mul_lo_u32 v0, v1, v01569; GCN-IR-NEXT: v_mov_b32_e32 v1, 01570; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, 0x8000, v01571; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v01572; GCN-IR-NEXT: s_setpc_b64 s[30:31]1573 %x.shr = lshr i64 %x, 401574 %result = urem i64 32768, %x.shr1575 ret i64 %result1576}1577 1578define i64 @v_test_urem24_pow2_k_den_i64(i64 %x) {1579; GCN-LABEL: v_test_urem24_pow2_k_den_i64:1580; GCN: ; %bb.0:1581; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1582; GCN-NEXT: v_bfe_u32 v0, v1, 8, 151583; GCN-NEXT: v_mov_b32_e32 v1, 01584; GCN-NEXT: s_setpc_b64 s[30:31]1585;1586; GCN-IR-LABEL: v_test_urem24_pow2_k_den_i64:1587; GCN-IR: ; %bb.0:1588; GCN-IR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1589; GCN-IR-NEXT: v_lshrrev_b32_e32 v0, 8, v11590; GCN-IR-NEXT: v_cvt_f32_u32_e32 v1, v01591; GCN-IR-NEXT: s_mov_b32 s4, 0x470000001592; GCN-IR-NEXT: v_mul_f32_e32 v2, 0x38000000, v11593; GCN-IR-NEXT: v_trunc_f32_e32 v2, v21594; GCN-IR-NEXT: v_cvt_u32_f32_e32 v3, v21595; GCN-IR-NEXT: v_mad_f32 v1, -v2, s4, v11596; GCN-IR-NEXT: v_cmp_ge_f32_e64 vcc, |v1|, s41597; GCN-IR-NEXT: v_addc_u32_e32 v1, vcc, 0, v3, vcc1598; GCN-IR-NEXT: v_lshlrev_b32_e32 v1, 15, v11599; GCN-IR-NEXT: v_sub_i32_e32 v0, vcc, v0, v11600; GCN-IR-NEXT: v_and_b32_e32 v0, 0xffffff, v01601; GCN-IR-NEXT: v_mov_b32_e32 v1, 01602; GCN-IR-NEXT: s_setpc_b64 s[30:31]1603 %x.shr = lshr i64 %x, 401604 %result = urem i64 %x.shr, 327681605 ret i64 %result1606}1607