1697 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn -mcpu=hawaii < %s | FileCheck --check-prefix=GFX7 %s3; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji < %s | FileCheck --check-prefix=GFX8 %s4; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck --check-prefix=GFX10 %s5; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck --check-prefix=GFX11 %s6 7 8define amdgpu_kernel void @test_div_scale_f32_1(ptr addrspace(1) %out, ptr addrspace(1) %in) {9; GFX7-LABEL: test_div_scale_f32_1:10; GFX7: ; %bb.0:11; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x912; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v013; GFX7-NEXT: v_mov_b32_e32 v1, 014; GFX7-NEXT: s_mov_b32 s6, 015; GFX7-NEXT: s_mov_b32 s7, 0xf00016; GFX7-NEXT: s_waitcnt lgkmcnt(0)17; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]18; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc19; GFX7-NEXT: s_waitcnt vmcnt(0)20; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:4 glc21; GFX7-NEXT: s_waitcnt vmcnt(0)22; GFX7-NEXT: s_mov_b32 s6, -123; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, v224; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]25; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 026; GFX7-NEXT: s_endpgm27;28; GFX8-LABEL: test_div_scale_f32_1:29; GFX8: ; %bb.0:30; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2431; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v032; GFX8-NEXT: s_waitcnt lgkmcnt(0)33; GFX8-NEXT: v_mov_b32_e32 v0, s234; GFX8-NEXT: v_mov_b32_e32 v1, s335; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v236; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc37; GFX8-NEXT: v_add_u32_e32 v2, vcc, 4, v038; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc39; GFX8-NEXT: flat_load_dword v0, v[0:1] glc40; GFX8-NEXT: s_waitcnt vmcnt(0)41; GFX8-NEXT: flat_load_dword v1, v[2:3] glc42; GFX8-NEXT: s_waitcnt vmcnt(0)43; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v1, v1, v044; GFX8-NEXT: v_mov_b32_e32 v0, s045; GFX8-NEXT: v_mov_b32_e32 v1, s146; GFX8-NEXT: flat_store_dword v[0:1], v247; GFX8-NEXT: s_endpgm48;49; GFX10-LABEL: test_div_scale_f32_1:50; GFX10: ; %bb.0:51; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x2452; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v053; GFX10-NEXT: s_waitcnt lgkmcnt(0)54; GFX10-NEXT: global_load_dword v1, v0, s[2:3] glc dlc55; GFX10-NEXT: s_waitcnt vmcnt(0)56; GFX10-NEXT: global_load_dword v2, v0, s[2:3] offset:4 glc dlc57; GFX10-NEXT: s_waitcnt vmcnt(0)58; GFX10-NEXT: v_div_scale_f32 v0, s2, v2, v2, v159; GFX10-NEXT: v_mov_b32_e32 v1, 060; GFX10-NEXT: global_store_dword v1, v0, s[0:1]61; GFX10-NEXT: s_endpgm62;63; GFX11-LABEL: test_div_scale_f32_1:64; GFX11: ; %bb.0:65; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x2466; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v067; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)68; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v069; GFX11-NEXT: s_waitcnt lgkmcnt(0)70; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] glc dlc71; GFX11-NEXT: s_waitcnt vmcnt(0)72; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:4 glc dlc73; GFX11-NEXT: s_waitcnt vmcnt(0)74; GFX11-NEXT: v_div_scale_f32 v0, null, v0, v0, v175; GFX11-NEXT: v_mov_b32_e32 v1, 076; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]77; GFX11-NEXT: s_endpgm78 %tid = call i32 @llvm.amdgcn.workitem.id.x()79 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid80 %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 181 82 %a = load volatile float, ptr addrspace(1) %gep.0, align 483 %b = load volatile float, ptr addrspace(1) %gep.1, align 484 85 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false)86 %result0 = extractvalue { float, i1 } %result, 087 store float %result0, ptr addrspace(1) %out, align 488 ret void89}90 91define amdgpu_kernel void @test_div_scale_f32_2(ptr addrspace(1) %out, ptr addrspace(1) %in) {92; GFX7-LABEL: test_div_scale_f32_2:93; GFX7: ; %bb.0:94; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x995; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v096; GFX7-NEXT: v_mov_b32_e32 v1, 097; GFX7-NEXT: s_mov_b32 s6, 098; GFX7-NEXT: s_mov_b32 s7, 0xf00099; GFX7-NEXT: s_waitcnt lgkmcnt(0)100; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]101; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc102; GFX7-NEXT: s_waitcnt vmcnt(0)103; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:4 glc104; GFX7-NEXT: s_waitcnt vmcnt(0)105; GFX7-NEXT: s_mov_b32 s6, -1106; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v2, v0, v2107; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]108; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0109; GFX7-NEXT: s_endpgm110;111; GFX8-LABEL: test_div_scale_f32_2:112; GFX8: ; %bb.0:113; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24114; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0115; GFX8-NEXT: s_waitcnt lgkmcnt(0)116; GFX8-NEXT: v_mov_b32_e32 v0, s2117; GFX8-NEXT: v_mov_b32_e32 v1, s3118; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2119; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc120; GFX8-NEXT: v_add_u32_e32 v2, vcc, 4, v0121; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc122; GFX8-NEXT: flat_load_dword v0, v[0:1] glc123; GFX8-NEXT: s_waitcnt vmcnt(0)124; GFX8-NEXT: flat_load_dword v1, v[2:3] glc125; GFX8-NEXT: s_waitcnt vmcnt(0)126; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v0, v1, v0127; GFX8-NEXT: v_mov_b32_e32 v0, s0128; GFX8-NEXT: v_mov_b32_e32 v1, s1129; GFX8-NEXT: flat_store_dword v[0:1], v2130; GFX8-NEXT: s_endpgm131;132; GFX10-LABEL: test_div_scale_f32_2:133; GFX10: ; %bb.0:134; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24135; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0136; GFX10-NEXT: s_waitcnt lgkmcnt(0)137; GFX10-NEXT: global_load_dword v1, v0, s[2:3] glc dlc138; GFX10-NEXT: s_waitcnt vmcnt(0)139; GFX10-NEXT: global_load_dword v2, v0, s[2:3] offset:4 glc dlc140; GFX10-NEXT: s_waitcnt vmcnt(0)141; GFX10-NEXT: v_div_scale_f32 v0, s2, v1, v2, v1142; GFX10-NEXT: v_mov_b32_e32 v1, 0143; GFX10-NEXT: global_store_dword v1, v0, s[0:1]144; GFX10-NEXT: s_endpgm145;146; GFX11-LABEL: test_div_scale_f32_2:147; GFX11: ; %bb.0:148; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24149; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0150; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)151; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0152; GFX11-NEXT: s_waitcnt lgkmcnt(0)153; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] glc dlc154; GFX11-NEXT: s_waitcnt vmcnt(0)155; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:4 glc dlc156; GFX11-NEXT: s_waitcnt vmcnt(0)157; GFX11-NEXT: v_div_scale_f32 v0, null, v1, v0, v1158; GFX11-NEXT: v_mov_b32_e32 v1, 0159; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]160; GFX11-NEXT: s_endpgm161 %tid = call i32 @llvm.amdgcn.workitem.id.x()162 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid163 %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1164 165 %a = load volatile float, ptr addrspace(1) %gep.0, align 4166 %b = load volatile float, ptr addrspace(1) %gep.1, align 4167 168 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true)169 %result0 = extractvalue { float, i1 } %result, 0170 store float %result0, ptr addrspace(1) %out, align 4171 ret void172}173 174define amdgpu_kernel void @test_div_scale_f64_1(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %in) {175; GFX7-LABEL: test_div_scale_f64_1:176; GFX7: ; %bb.0:177; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0xd178; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0179; GFX7-NEXT: v_mov_b32_e32 v1, 0180; GFX7-NEXT: s_mov_b32 s2, 0181; GFX7-NEXT: s_mov_b32 s3, 0xf000182; GFX7-NEXT: s_waitcnt lgkmcnt(0)183; GFX7-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 glc184; GFX7-NEXT: s_waitcnt vmcnt(0)185; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64 offset:8 glc186; GFX7-NEXT: s_waitcnt vmcnt(0)187; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9188; GFX7-NEXT: s_mov_b32 s2, -1189; GFX7-NEXT: v_div_scale_f64 v[0:1], s[4:5], v[0:1], v[0:1], v[2:3]190; GFX7-NEXT: s_waitcnt lgkmcnt(0)191; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0192; GFX7-NEXT: s_endpgm193;194; GFX8-LABEL: test_div_scale_f64_1:195; GFX8: ; %bb.0:196; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34197; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0198; GFX8-NEXT: s_waitcnt lgkmcnt(0)199; GFX8-NEXT: v_mov_b32_e32 v0, s0200; GFX8-NEXT: v_mov_b32_e32 v1, s1201; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2202; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc203; GFX8-NEXT: v_add_u32_e32 v2, vcc, 8, v0204; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc205; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] glc206; GFX8-NEXT: s_waitcnt vmcnt(0)207; GFX8-NEXT: flat_load_dwordx2 v[2:3], v[2:3] glc208; GFX8-NEXT: s_waitcnt vmcnt(0)209; GFX8-NEXT: v_div_scale_f64 v[0:1], s[0:1], v[2:3], v[2:3], v[0:1]210; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24211; GFX8-NEXT: s_waitcnt lgkmcnt(0)212; GFX8-NEXT: v_mov_b32_e32 v3, s1213; GFX8-NEXT: v_mov_b32_e32 v2, s0214; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]215; GFX8-NEXT: s_endpgm216;217; GFX10-LABEL: test_div_scale_f64_1:218; GFX10: ; %bb.0:219; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34220; GFX10-NEXT: v_lshlrev_b32_e32 v4, 3, v0221; GFX10-NEXT: s_waitcnt lgkmcnt(0)222; GFX10-NEXT: global_load_dwordx2 v[0:1], v4, s[0:1] glc dlc223; GFX10-NEXT: s_waitcnt vmcnt(0)224; GFX10-NEXT: global_load_dwordx2 v[2:3], v4, s[0:1] offset:8 glc dlc225; GFX10-NEXT: s_waitcnt vmcnt(0)226; GFX10-NEXT: v_div_scale_f64 v[0:1], s0, v[2:3], v[2:3], v[0:1]227; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24228; GFX10-NEXT: v_mov_b32_e32 v2, 0229; GFX10-NEXT: s_waitcnt lgkmcnt(0)230; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]231; GFX10-NEXT: s_endpgm232;233; GFX11-LABEL: test_div_scale_f64_1:234; GFX11: ; %bb.0:235; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x34236; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0237; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)238; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0239; GFX11-NEXT: s_waitcnt lgkmcnt(0)240; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1] glc dlc241; GFX11-NEXT: s_waitcnt vmcnt(0)242; GFX11-NEXT: global_load_b64 v[2:3], v2, s[0:1] offset:8 glc dlc243; GFX11-NEXT: s_waitcnt vmcnt(0)244; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24245; GFX11-NEXT: v_div_scale_f64 v[0:1], null, v[2:3], v[2:3], v[0:1]246; GFX11-NEXT: v_mov_b32_e32 v2, 0247; GFX11-NEXT: s_waitcnt lgkmcnt(0)248; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]249; GFX11-NEXT: s_endpgm250 %tid = call i32 @llvm.amdgcn.workitem.id.x()251 %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid252 %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1253 254 %a = load volatile double, ptr addrspace(1) %gep.0, align 8255 %b = load volatile double, ptr addrspace(1) %gep.1, align 8256 257 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false)258 %result0 = extractvalue { double, i1 } %result, 0259 store double %result0, ptr addrspace(1) %out, align 8260 ret void261}262 263define amdgpu_kernel void @test_div_scale_f64_2(ptr addrspace(1) %out, ptr addrspace(1) %aptr, ptr addrspace(1) %in) {264; GFX7-LABEL: test_div_scale_f64_2:265; GFX7: ; %bb.0:266; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0xd267; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0268; GFX7-NEXT: v_mov_b32_e32 v1, 0269; GFX7-NEXT: s_mov_b32 s2, 0270; GFX7-NEXT: s_mov_b32 s3, 0xf000271; GFX7-NEXT: s_waitcnt lgkmcnt(0)272; GFX7-NEXT: buffer_load_dwordx2 v[2:3], v[0:1], s[0:3], 0 addr64 glc273; GFX7-NEXT: s_waitcnt vmcnt(0)274; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[0:3], 0 addr64 offset:8 glc275; GFX7-NEXT: s_waitcnt vmcnt(0)276; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9277; GFX7-NEXT: s_mov_b32 s2, -1278; GFX7-NEXT: v_div_scale_f64 v[0:1], s[4:5], v[2:3], v[0:1], v[2:3]279; GFX7-NEXT: s_waitcnt lgkmcnt(0)280; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0281; GFX7-NEXT: s_endpgm282;283; GFX8-LABEL: test_div_scale_f64_2:284; GFX8: ; %bb.0:285; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34286; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0287; GFX8-NEXT: s_waitcnt lgkmcnt(0)288; GFX8-NEXT: v_mov_b32_e32 v0, s0289; GFX8-NEXT: v_mov_b32_e32 v1, s1290; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2291; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc292; GFX8-NEXT: v_add_u32_e32 v2, vcc, 8, v0293; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc294; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1] glc295; GFX8-NEXT: s_waitcnt vmcnt(0)296; GFX8-NEXT: flat_load_dwordx2 v[2:3], v[2:3] glc297; GFX8-NEXT: s_waitcnt vmcnt(0)298; GFX8-NEXT: v_div_scale_f64 v[0:1], s[0:1], v[0:1], v[2:3], v[0:1]299; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24300; GFX8-NEXT: s_waitcnt lgkmcnt(0)301; GFX8-NEXT: v_mov_b32_e32 v3, s1302; GFX8-NEXT: v_mov_b32_e32 v2, s0303; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]304; GFX8-NEXT: s_endpgm305;306; GFX10-LABEL: test_div_scale_f64_2:307; GFX10: ; %bb.0:308; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x34309; GFX10-NEXT: v_lshlrev_b32_e32 v4, 3, v0310; GFX10-NEXT: s_waitcnt lgkmcnt(0)311; GFX10-NEXT: global_load_dwordx2 v[0:1], v4, s[0:1] glc dlc312; GFX10-NEXT: s_waitcnt vmcnt(0)313; GFX10-NEXT: global_load_dwordx2 v[2:3], v4, s[0:1] offset:8 glc dlc314; GFX10-NEXT: s_waitcnt vmcnt(0)315; GFX10-NEXT: v_div_scale_f64 v[0:1], s0, v[0:1], v[2:3], v[0:1]316; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24317; GFX10-NEXT: v_mov_b32_e32 v2, 0318; GFX10-NEXT: s_waitcnt lgkmcnt(0)319; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]320; GFX10-NEXT: s_endpgm321;322; GFX11-LABEL: test_div_scale_f64_2:323; GFX11: ; %bb.0:324; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x34325; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0326; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)327; GFX11-NEXT: v_lshlrev_b32_e32 v2, 3, v0328; GFX11-NEXT: s_waitcnt lgkmcnt(0)329; GFX11-NEXT: global_load_b64 v[0:1], v2, s[0:1] glc dlc330; GFX11-NEXT: s_waitcnt vmcnt(0)331; GFX11-NEXT: global_load_b64 v[2:3], v2, s[0:1] offset:8 glc dlc332; GFX11-NEXT: s_waitcnt vmcnt(0)333; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24334; GFX11-NEXT: v_div_scale_f64 v[0:1], null, v[0:1], v[2:3], v[0:1]335; GFX11-NEXT: v_mov_b32_e32 v2, 0336; GFX11-NEXT: s_waitcnt lgkmcnt(0)337; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]338; GFX11-NEXT: s_endpgm339 %tid = call i32 @llvm.amdgcn.workitem.id.x()340 %gep.0 = getelementptr double, ptr addrspace(1) %in, i32 %tid341 %gep.1 = getelementptr double, ptr addrspace(1) %gep.0, i32 1342 343 %a = load volatile double, ptr addrspace(1) %gep.0, align 8344 %b = load volatile double, ptr addrspace(1) %gep.1, align 8345 346 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true)347 %result0 = extractvalue { double, i1 } %result, 0348 store double %result0, ptr addrspace(1) %out, align 8349 ret void350}351 352define amdgpu_kernel void @test_div_scale_f32_scalar_num_1(ptr addrspace(1) %out, ptr addrspace(1) %in, [8 x i32], float %a) {353; GFX7-LABEL: test_div_scale_f32_scalar_num_1:354; GFX7: ; %bb.0:355; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9356; GFX7-NEXT: s_load_dword s8, s[4:5], 0x15357; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0358; GFX7-NEXT: v_mov_b32_e32 v1, 0359; GFX7-NEXT: s_mov_b32 s6, 0360; GFX7-NEXT: s_mov_b32 s7, 0xf000361; GFX7-NEXT: s_waitcnt lgkmcnt(0)362; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]363; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64364; GFX7-NEXT: s_mov_b32 s6, -1365; GFX7-NEXT: s_waitcnt vmcnt(0)366; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, s8367; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]368; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0369; GFX7-NEXT: s_endpgm370;371; GFX8-LABEL: test_div_scale_f32_scalar_num_1:372; GFX8: ; %bb.0:373; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24374; GFX8-NEXT: s_load_dword s4, s[4:5], 0x54375; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0376; GFX8-NEXT: s_waitcnt lgkmcnt(0)377; GFX8-NEXT: v_mov_b32_e32 v0, s2378; GFX8-NEXT: v_mov_b32_e32 v1, s3379; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2380; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc381; GFX8-NEXT: flat_load_dword v0, v[0:1]382; GFX8-NEXT: s_waitcnt vmcnt(0)383; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v0, v0, s4384; GFX8-NEXT: v_mov_b32_e32 v0, s0385; GFX8-NEXT: v_mov_b32_e32 v1, s1386; GFX8-NEXT: flat_store_dword v[0:1], v2387; GFX8-NEXT: s_endpgm388;389; GFX10-LABEL: test_div_scale_f32_scalar_num_1:390; GFX10: ; %bb.0:391; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24392; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0393; GFX10-NEXT: s_load_dword s4, s[4:5], 0x54394; GFX10-NEXT: v_mov_b32_e32 v1, 0395; GFX10-NEXT: s_waitcnt lgkmcnt(0)396; GFX10-NEXT: global_load_dword v0, v0, s[2:3]397; GFX10-NEXT: s_waitcnt vmcnt(0)398; GFX10-NEXT: v_div_scale_f32 v0, s2, v0, v0, s4399; GFX10-NEXT: global_store_dword v1, v0, s[0:1]400; GFX10-NEXT: s_endpgm401;402; GFX11-LABEL: test_div_scale_f32_scalar_num_1:403; GFX11: ; %bb.0:404; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24405; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0406; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x54407; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)408; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0409; GFX11-NEXT: s_waitcnt lgkmcnt(0)410; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]411; GFX11-NEXT: s_waitcnt vmcnt(0)412; GFX11-NEXT: v_div_scale_f32 v0, null, v0, v0, s4413; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]414; GFX11-NEXT: s_endpgm415 %tid = call i32 @llvm.amdgcn.workitem.id.x()416 %gep = getelementptr float, ptr addrspace(1) %in, i32 %tid417 418 %b = load float, ptr addrspace(1) %gep, align 4419 420 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false)421 %result0 = extractvalue { float, i1 } %result, 0422 store float %result0, ptr addrspace(1) %out, align 4423 ret void424}425 426define amdgpu_kernel void @test_div_scale_f32_scalar_num_2(ptr addrspace(1) %out, ptr addrspace(1) %in, float %a) {427; GFX7-LABEL: test_div_scale_f32_scalar_num_2:428; GFX7: ; %bb.0:429; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9430; GFX7-NEXT: s_load_dword s8, s[4:5], 0xd431; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0432; GFX7-NEXT: v_mov_b32_e32 v1, 0433; GFX7-NEXT: s_mov_b32 s6, 0434; GFX7-NEXT: s_mov_b32 s7, 0xf000435; GFX7-NEXT: s_waitcnt lgkmcnt(0)436; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]437; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64438; GFX7-NEXT: s_mov_b32 s6, -1439; GFX7-NEXT: s_waitcnt vmcnt(0)440; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], s8, v0, s8441; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]442; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0443; GFX7-NEXT: s_endpgm444;445; GFX8-LABEL: test_div_scale_f32_scalar_num_2:446; GFX8: ; %bb.0:447; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24448; GFX8-NEXT: s_load_dword s4, s[4:5], 0x34449; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0450; GFX8-NEXT: s_waitcnt lgkmcnt(0)451; GFX8-NEXT: v_mov_b32_e32 v0, s2452; GFX8-NEXT: v_mov_b32_e32 v1, s3453; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2454; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc455; GFX8-NEXT: flat_load_dword v0, v[0:1]456; GFX8-NEXT: s_waitcnt vmcnt(0)457; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], s4, v0, s4458; GFX8-NEXT: v_mov_b32_e32 v0, s0459; GFX8-NEXT: v_mov_b32_e32 v1, s1460; GFX8-NEXT: flat_store_dword v[0:1], v2461; GFX8-NEXT: s_endpgm462;463; GFX10-LABEL: test_div_scale_f32_scalar_num_2:464; GFX10: ; %bb.0:465; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24466; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0467; GFX10-NEXT: s_load_dword s4, s[4:5], 0x34468; GFX10-NEXT: v_mov_b32_e32 v1, 0469; GFX10-NEXT: s_waitcnt lgkmcnt(0)470; GFX10-NEXT: global_load_dword v0, v0, s[2:3]471; GFX10-NEXT: s_waitcnt vmcnt(0)472; GFX10-NEXT: v_div_scale_f32 v0, s2, s4, v0, s4473; GFX10-NEXT: global_store_dword v1, v0, s[0:1]474; GFX10-NEXT: s_endpgm475;476; GFX11-LABEL: test_div_scale_f32_scalar_num_2:477; GFX11: ; %bb.0:478; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24479; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0480; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34481; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)482; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0483; GFX11-NEXT: s_waitcnt lgkmcnt(0)484; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]485; GFX11-NEXT: s_waitcnt vmcnt(0)486; GFX11-NEXT: v_div_scale_f32 v0, null, s4, v0, s4487; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]488; GFX11-NEXT: s_endpgm489 %tid = call i32 @llvm.amdgcn.workitem.id.x()490 %gep = getelementptr float, ptr addrspace(1) %in, i32 %tid491 492 %b = load float, ptr addrspace(1) %gep, align 4493 494 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true)495 %result0 = extractvalue { float, i1 } %result, 0496 store float %result0, ptr addrspace(1) %out, align 4497 ret void498}499 500define amdgpu_kernel void @test_div_scale_f32_scalar_den_1(ptr addrspace(1) %out, ptr addrspace(1) %in, float %b) {501; GFX7-LABEL: test_div_scale_f32_scalar_den_1:502; GFX7: ; %bb.0:503; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9504; GFX7-NEXT: s_load_dword s8, s[4:5], 0xd505; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0506; GFX7-NEXT: v_mov_b32_e32 v1, 0507; GFX7-NEXT: s_mov_b32 s6, 0508; GFX7-NEXT: s_mov_b32 s7, 0xf000509; GFX7-NEXT: s_waitcnt lgkmcnt(0)510; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]511; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64512; GFX7-NEXT: s_mov_b32 s6, -1513; GFX7-NEXT: s_waitcnt vmcnt(0)514; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], s8, s8, v0515; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]516; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0517; GFX7-NEXT: s_endpgm518;519; GFX8-LABEL: test_div_scale_f32_scalar_den_1:520; GFX8: ; %bb.0:521; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24522; GFX8-NEXT: s_load_dword s4, s[4:5], 0x34523; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0524; GFX8-NEXT: s_waitcnt lgkmcnt(0)525; GFX8-NEXT: v_mov_b32_e32 v0, s2526; GFX8-NEXT: v_mov_b32_e32 v1, s3527; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2528; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc529; GFX8-NEXT: flat_load_dword v0, v[0:1]530; GFX8-NEXT: s_waitcnt vmcnt(0)531; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], s4, s4, v0532; GFX8-NEXT: v_mov_b32_e32 v0, s0533; GFX8-NEXT: v_mov_b32_e32 v1, s1534; GFX8-NEXT: flat_store_dword v[0:1], v2535; GFX8-NEXT: s_endpgm536;537; GFX10-LABEL: test_div_scale_f32_scalar_den_1:538; GFX10: ; %bb.0:539; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24540; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0541; GFX10-NEXT: s_load_dword s4, s[4:5], 0x34542; GFX10-NEXT: v_mov_b32_e32 v1, 0543; GFX10-NEXT: s_waitcnt lgkmcnt(0)544; GFX10-NEXT: global_load_dword v0, v0, s[2:3]545; GFX10-NEXT: s_waitcnt vmcnt(0)546; GFX10-NEXT: v_div_scale_f32 v0, s2, s4, s4, v0547; GFX10-NEXT: global_store_dword v1, v0, s[0:1]548; GFX10-NEXT: s_endpgm549;550; GFX11-LABEL: test_div_scale_f32_scalar_den_1:551; GFX11: ; %bb.0:552; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24553; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0554; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34555; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)556; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0557; GFX11-NEXT: s_waitcnt lgkmcnt(0)558; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]559; GFX11-NEXT: s_waitcnt vmcnt(0)560; GFX11-NEXT: v_div_scale_f32 v0, null, s4, s4, v0561; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]562; GFX11-NEXT: s_endpgm563 %tid = call i32 @llvm.amdgcn.workitem.id.x()564 %gep = getelementptr float, ptr addrspace(1) %in, i32 %tid565 566 %a = load float, ptr addrspace(1) %gep, align 4567 568 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false)569 %result0 = extractvalue { float, i1 } %result, 0570 store float %result0, ptr addrspace(1) %out, align 4571 ret void572}573 574define amdgpu_kernel void @test_div_scale_f32_scalar_den_2(ptr addrspace(1) %out, ptr addrspace(1) %in, float %b) {575; GFX7-LABEL: test_div_scale_f32_scalar_den_2:576; GFX7: ; %bb.0:577; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9578; GFX7-NEXT: s_load_dword s8, s[4:5], 0xd579; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v0580; GFX7-NEXT: v_mov_b32_e32 v1, 0581; GFX7-NEXT: s_mov_b32 s6, 0582; GFX7-NEXT: s_mov_b32 s7, 0xf000583; GFX7-NEXT: s_waitcnt lgkmcnt(0)584; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]585; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64586; GFX7-NEXT: s_mov_b32 s6, -1587; GFX7-NEXT: s_waitcnt vmcnt(0)588; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, s8, v0589; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]590; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0591; GFX7-NEXT: s_endpgm592;593; GFX8-LABEL: test_div_scale_f32_scalar_den_2:594; GFX8: ; %bb.0:595; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24596; GFX8-NEXT: s_load_dword s4, s[4:5], 0x34597; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v0598; GFX8-NEXT: s_waitcnt lgkmcnt(0)599; GFX8-NEXT: v_mov_b32_e32 v0, s2600; GFX8-NEXT: v_mov_b32_e32 v1, s3601; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2602; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc603; GFX8-NEXT: flat_load_dword v0, v[0:1]604; GFX8-NEXT: s_waitcnt vmcnt(0)605; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v0, s4, v0606; GFX8-NEXT: v_mov_b32_e32 v0, s0607; GFX8-NEXT: v_mov_b32_e32 v1, s1608; GFX8-NEXT: flat_store_dword v[0:1], v2609; GFX8-NEXT: s_endpgm610;611; GFX10-LABEL: test_div_scale_f32_scalar_den_2:612; GFX10: ; %bb.0:613; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24614; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v0615; GFX10-NEXT: s_load_dword s4, s[4:5], 0x34616; GFX10-NEXT: v_mov_b32_e32 v1, 0617; GFX10-NEXT: s_waitcnt lgkmcnt(0)618; GFX10-NEXT: global_load_dword v0, v0, s[2:3]619; GFX10-NEXT: s_waitcnt vmcnt(0)620; GFX10-NEXT: v_div_scale_f32 v0, s2, v0, s4, v0621; GFX10-NEXT: global_store_dword v1, v0, s[0:1]622; GFX10-NEXT: s_endpgm623;624; GFX11-LABEL: test_div_scale_f32_scalar_den_2:625; GFX11: ; %bb.0:626; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24627; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v0628; GFX11-NEXT: s_load_b32 s4, s[4:5], 0x34629; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)630; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v0631; GFX11-NEXT: s_waitcnt lgkmcnt(0)632; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]633; GFX11-NEXT: s_waitcnt vmcnt(0)634; GFX11-NEXT: v_div_scale_f32 v0, null, v0, s4, v0635; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]636; GFX11-NEXT: s_endpgm637 %tid = call i32 @llvm.amdgcn.workitem.id.x()638 %gep = getelementptr float, ptr addrspace(1) %in, i32 %tid639 640 %a = load float, ptr addrspace(1) %gep, align 4641 642 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true)643 %result0 = extractvalue { float, i1 } %result, 0644 store float %result0, ptr addrspace(1) %out, align 4645 ret void646}647 648define amdgpu_kernel void @test_div_scale_f64_scalar_num_1(ptr addrspace(1) %out, ptr addrspace(1) %in, [8 x i32], double %a) {649; GFX7-LABEL: test_div_scale_f64_scalar_num_1:650; GFX7: ; %bb.0:651; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9652; GFX7-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x15653; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0654; GFX7-NEXT: v_mov_b32_e32 v1, 0655; GFX7-NEXT: s_mov_b32 s6, 0656; GFX7-NEXT: s_mov_b32 s7, 0xf000657; GFX7-NEXT: s_waitcnt lgkmcnt(0)658; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]659; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64660; GFX7-NEXT: s_mov_b32 s6, -1661; GFX7-NEXT: s_waitcnt vmcnt(0)662; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], v[0:1], v[0:1], s[8:9]663; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]664; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0665; GFX7-NEXT: s_endpgm666;667; GFX8-LABEL: test_div_scale_f64_scalar_num_1:668; GFX8: ; %bb.0:669; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24670; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x54671; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0672; GFX8-NEXT: s_waitcnt lgkmcnt(0)673; GFX8-NEXT: v_mov_b32_e32 v0, s2674; GFX8-NEXT: v_mov_b32_e32 v1, s3675; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2676; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc677; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]678; GFX8-NEXT: v_mov_b32_e32 v3, s1679; GFX8-NEXT: v_mov_b32_e32 v2, s0680; GFX8-NEXT: s_waitcnt vmcnt(0)681; GFX8-NEXT: v_div_scale_f64 v[0:1], s[2:3], v[0:1], v[0:1], s[4:5]682; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]683; GFX8-NEXT: s_endpgm684;685; GFX10-LABEL: test_div_scale_f64_scalar_num_1:686; GFX10: ; %bb.0:687; GFX10-NEXT: s_clause 0x1688; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24689; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x54690; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0691; GFX10-NEXT: v_mov_b32_e32 v2, 0692; GFX10-NEXT: s_waitcnt lgkmcnt(0)693; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]694; GFX10-NEXT: s_waitcnt vmcnt(0)695; GFX10-NEXT: v_div_scale_f64 v[0:1], s2, v[0:1], v[0:1], s[6:7]696; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]697; GFX10-NEXT: s_endpgm698;699; GFX11-LABEL: test_div_scale_f64_scalar_num_1:700; GFX11: ; %bb.0:701; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24702; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0703; GFX11-NEXT: s_load_b64 s[4:5], s[4:5], 0x54704; GFX11-NEXT: v_mov_b32_e32 v2, 0705; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)706; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0707; GFX11-NEXT: s_waitcnt lgkmcnt(0)708; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]709; GFX11-NEXT: s_waitcnt vmcnt(0)710; GFX11-NEXT: v_div_scale_f64 v[0:1], null, v[0:1], v[0:1], s[4:5]711; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]712; GFX11-NEXT: s_endpgm713 %tid = call i32 @llvm.amdgcn.workitem.id.x()714 %gep = getelementptr double, ptr addrspace(1) %in, i32 %tid715 716 %b = load double, ptr addrspace(1) %gep, align 8717 718 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false)719 %result0 = extractvalue { double, i1 } %result, 0720 store double %result0, ptr addrspace(1) %out, align 8721 ret void722}723 724define amdgpu_kernel void @test_div_scale_f64_scalar_num_2(ptr addrspace(1) %out, ptr addrspace(1) %in, [8 x i32], double %a) {725; GFX7-LABEL: test_div_scale_f64_scalar_num_2:726; GFX7: ; %bb.0:727; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9728; GFX7-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x15729; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0730; GFX7-NEXT: v_mov_b32_e32 v1, 0731; GFX7-NEXT: s_mov_b32 s6, 0732; GFX7-NEXT: s_mov_b32 s7, 0xf000733; GFX7-NEXT: s_waitcnt lgkmcnt(0)734; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]735; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64736; GFX7-NEXT: s_mov_b32 s6, -1737; GFX7-NEXT: s_waitcnt vmcnt(0)738; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[8:9], v[0:1], s[8:9]739; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]740; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0741; GFX7-NEXT: s_endpgm742;743; GFX8-LABEL: test_div_scale_f64_scalar_num_2:744; GFX8: ; %bb.0:745; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24746; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x54747; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0748; GFX8-NEXT: s_waitcnt lgkmcnt(0)749; GFX8-NEXT: v_mov_b32_e32 v0, s2750; GFX8-NEXT: v_mov_b32_e32 v1, s3751; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2752; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc753; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]754; GFX8-NEXT: v_mov_b32_e32 v3, s1755; GFX8-NEXT: v_mov_b32_e32 v2, s0756; GFX8-NEXT: s_waitcnt vmcnt(0)757; GFX8-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[4:5], v[0:1], s[4:5]758; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]759; GFX8-NEXT: s_endpgm760;761; GFX10-LABEL: test_div_scale_f64_scalar_num_2:762; GFX10: ; %bb.0:763; GFX10-NEXT: s_clause 0x1764; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24765; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x54766; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0767; GFX10-NEXT: v_mov_b32_e32 v2, 0768; GFX10-NEXT: s_waitcnt lgkmcnt(0)769; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]770; GFX10-NEXT: s_waitcnt vmcnt(0)771; GFX10-NEXT: v_div_scale_f64 v[0:1], s2, s[6:7], v[0:1], s[6:7]772; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]773; GFX10-NEXT: s_endpgm774;775; GFX11-LABEL: test_div_scale_f64_scalar_num_2:776; GFX11: ; %bb.0:777; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24778; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0779; GFX11-NEXT: s_load_b64 s[4:5], s[4:5], 0x54780; GFX11-NEXT: v_mov_b32_e32 v2, 0781; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)782; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0783; GFX11-NEXT: s_waitcnt lgkmcnt(0)784; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]785; GFX11-NEXT: s_waitcnt vmcnt(0)786; GFX11-NEXT: v_div_scale_f64 v[0:1], null, s[4:5], v[0:1], s[4:5]787; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]788; GFX11-NEXT: s_endpgm789 %tid = call i32 @llvm.amdgcn.workitem.id.x()790 %gep = getelementptr double, ptr addrspace(1) %in, i32 %tid791 792 %b = load double, ptr addrspace(1) %gep, align 8793 794 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true)795 %result0 = extractvalue { double, i1 } %result, 0796 store double %result0, ptr addrspace(1) %out, align 8797 ret void798}799 800define amdgpu_kernel void @test_div_scale_f64_scalar_den_1(ptr addrspace(1) %out, ptr addrspace(1) %in, [8 x i32], double %b) {801; GFX7-LABEL: test_div_scale_f64_scalar_den_1:802; GFX7: ; %bb.0:803; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9804; GFX7-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x15805; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0806; GFX7-NEXT: v_mov_b32_e32 v1, 0807; GFX7-NEXT: s_mov_b32 s6, 0808; GFX7-NEXT: s_mov_b32 s7, 0xf000809; GFX7-NEXT: s_waitcnt lgkmcnt(0)810; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]811; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64812; GFX7-NEXT: s_mov_b32 s6, -1813; GFX7-NEXT: s_waitcnt vmcnt(0)814; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[8:9], s[8:9], v[0:1]815; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]816; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0817; GFX7-NEXT: s_endpgm818;819; GFX8-LABEL: test_div_scale_f64_scalar_den_1:820; GFX8: ; %bb.0:821; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24822; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x54823; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0824; GFX8-NEXT: s_waitcnt lgkmcnt(0)825; GFX8-NEXT: v_mov_b32_e32 v0, s2826; GFX8-NEXT: v_mov_b32_e32 v1, s3827; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2828; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc829; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]830; GFX8-NEXT: v_mov_b32_e32 v3, s1831; GFX8-NEXT: v_mov_b32_e32 v2, s0832; GFX8-NEXT: s_waitcnt vmcnt(0)833; GFX8-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[4:5], s[4:5], v[0:1]834; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]835; GFX8-NEXT: s_endpgm836;837; GFX10-LABEL: test_div_scale_f64_scalar_den_1:838; GFX10: ; %bb.0:839; GFX10-NEXT: s_clause 0x1840; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24841; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x54842; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0843; GFX10-NEXT: v_mov_b32_e32 v2, 0844; GFX10-NEXT: s_waitcnt lgkmcnt(0)845; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]846; GFX10-NEXT: s_waitcnt vmcnt(0)847; GFX10-NEXT: v_div_scale_f64 v[0:1], s2, s[6:7], s[6:7], v[0:1]848; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]849; GFX10-NEXT: s_endpgm850;851; GFX11-LABEL: test_div_scale_f64_scalar_den_1:852; GFX11: ; %bb.0:853; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24854; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0855; GFX11-NEXT: s_load_b64 s[4:5], s[4:5], 0x54856; GFX11-NEXT: v_mov_b32_e32 v2, 0857; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)858; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0859; GFX11-NEXT: s_waitcnt lgkmcnt(0)860; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]861; GFX11-NEXT: s_waitcnt vmcnt(0)862; GFX11-NEXT: v_div_scale_f64 v[0:1], null, s[4:5], s[4:5], v[0:1]863; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]864; GFX11-NEXT: s_endpgm865 %tid = call i32 @llvm.amdgcn.workitem.id.x()866 %gep = getelementptr double, ptr addrspace(1) %in, i32 %tid867 868 %a = load double, ptr addrspace(1) %gep, align 8869 870 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false)871 %result0 = extractvalue { double, i1 } %result, 0872 store double %result0, ptr addrspace(1) %out, align 8873 ret void874}875 876define amdgpu_kernel void @test_div_scale_f64_scalar_den_2(ptr addrspace(1) %out, ptr addrspace(1) %in, [8 x i32], double %b) {877; GFX7-LABEL: test_div_scale_f64_scalar_den_2:878; GFX7: ; %bb.0:879; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x9880; GFX7-NEXT: s_load_dwordx2 s[8:9], s[4:5], 0x15881; GFX7-NEXT: v_lshlrev_b32_e32 v0, 3, v0882; GFX7-NEXT: v_mov_b32_e32 v1, 0883; GFX7-NEXT: s_mov_b32 s6, 0884; GFX7-NEXT: s_mov_b32 s7, 0xf000885; GFX7-NEXT: s_waitcnt lgkmcnt(0)886; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]887; GFX7-NEXT: buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64888; GFX7-NEXT: s_mov_b32 s6, -1889; GFX7-NEXT: s_waitcnt vmcnt(0)890; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], v[0:1], s[8:9], v[0:1]891; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]892; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0893; GFX7-NEXT: s_endpgm894;895; GFX8-LABEL: test_div_scale_f64_scalar_den_2:896; GFX8: ; %bb.0:897; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24898; GFX8-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x54899; GFX8-NEXT: v_lshlrev_b32_e32 v2, 3, v0900; GFX8-NEXT: s_waitcnt lgkmcnt(0)901; GFX8-NEXT: v_mov_b32_e32 v0, s2902; GFX8-NEXT: v_mov_b32_e32 v1, s3903; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v2904; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc905; GFX8-NEXT: flat_load_dwordx2 v[0:1], v[0:1]906; GFX8-NEXT: v_mov_b32_e32 v3, s1907; GFX8-NEXT: v_mov_b32_e32 v2, s0908; GFX8-NEXT: s_waitcnt vmcnt(0)909; GFX8-NEXT: v_div_scale_f64 v[0:1], s[2:3], v[0:1], s[4:5], v[0:1]910; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]911; GFX8-NEXT: s_endpgm912;913; GFX10-LABEL: test_div_scale_f64_scalar_den_2:914; GFX10: ; %bb.0:915; GFX10-NEXT: s_clause 0x1916; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x24917; GFX10-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x54918; GFX10-NEXT: v_lshlrev_b32_e32 v0, 3, v0919; GFX10-NEXT: v_mov_b32_e32 v2, 0920; GFX10-NEXT: s_waitcnt lgkmcnt(0)921; GFX10-NEXT: global_load_dwordx2 v[0:1], v0, s[2:3]922; GFX10-NEXT: s_waitcnt vmcnt(0)923; GFX10-NEXT: v_div_scale_f64 v[0:1], s2, v[0:1], s[6:7], v[0:1]924; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]925; GFX10-NEXT: s_endpgm926;927; GFX11-LABEL: test_div_scale_f64_scalar_den_2:928; GFX11: ; %bb.0:929; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x24930; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v0931; GFX11-NEXT: s_load_b64 s[4:5], s[4:5], 0x54932; GFX11-NEXT: v_mov_b32_e32 v2, 0933; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_2)934; GFX11-NEXT: v_lshlrev_b32_e32 v0, 3, v0935; GFX11-NEXT: s_waitcnt lgkmcnt(0)936; GFX11-NEXT: global_load_b64 v[0:1], v0, s[2:3]937; GFX11-NEXT: s_waitcnt vmcnt(0)938; GFX11-NEXT: v_div_scale_f64 v[0:1], null, v[0:1], s[4:5], v[0:1]939; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]940; GFX11-NEXT: s_endpgm941 %tid = call i32 @llvm.amdgcn.workitem.id.x()942 %gep = getelementptr double, ptr addrspace(1) %in, i32 %tid943 944 %a = load double, ptr addrspace(1) %gep, align 8945 946 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true)947 %result0 = extractvalue { double, i1 } %result, 0948 store double %result0, ptr addrspace(1) %out, align 8949 ret void950}951 952define amdgpu_kernel void @test_div_scale_f32_all_scalar_1(ptr addrspace(1) %out, [8 x i32], float %a, [8 x i32], float %b) {953; GFX7-LABEL: test_div_scale_f32_all_scalar_1:954; GFX7: ; %bb.0:955; GFX7-NEXT: s_load_dword s3, s[4:5], 0x1c956; GFX7-NEXT: s_load_dword s6, s[4:5], 0x13957; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x9958; GFX7-NEXT: s_mov_b32 s2, -1959; GFX7-NEXT: s_waitcnt lgkmcnt(0)960; GFX7-NEXT: v_mov_b32_e32 v0, s3961; GFX7-NEXT: v_div_scale_f32 v0, s[4:5], v0, v0, s6962; GFX7-NEXT: s_mov_b32 s3, 0xf000963; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 0964; GFX7-NEXT: s_endpgm965;966; GFX8-LABEL: test_div_scale_f32_all_scalar_1:967; GFX8: ; %bb.0:968; GFX8-NEXT: s_load_dword s0, s[4:5], 0x70969; GFX8-NEXT: s_load_dword s1, s[4:5], 0x4c970; GFX8-NEXT: s_waitcnt lgkmcnt(0)971; GFX8-NEXT: v_mov_b32_e32 v0, s0972; GFX8-NEXT: v_div_scale_f32 v2, s[0:1], v0, v0, s1973; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24974; GFX8-NEXT: s_waitcnt lgkmcnt(0)975; GFX8-NEXT: v_mov_b32_e32 v0, s0976; GFX8-NEXT: v_mov_b32_e32 v1, s1977; GFX8-NEXT: flat_store_dword v[0:1], v2978; GFX8-NEXT: s_endpgm979;980; GFX10-LABEL: test_div_scale_f32_all_scalar_1:981; GFX10: ; %bb.0:982; GFX10-NEXT: s_clause 0x2983; GFX10-NEXT: s_load_dword s2, s[4:5], 0x4c984; GFX10-NEXT: s_load_dword s3, s[4:5], 0x70985; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24986; GFX10-NEXT: v_mov_b32_e32 v1, 0987; GFX10-NEXT: s_waitcnt lgkmcnt(0)988; GFX10-NEXT: v_div_scale_f32 v0, s2, s3, s3, s2989; GFX10-NEXT: global_store_dword v1, v0, s[0:1]990; GFX10-NEXT: s_endpgm991;992; GFX11-LABEL: test_div_scale_f32_all_scalar_1:993; GFX11: ; %bb.0:994; GFX11-NEXT: s_clause 0x2995; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x4c996; GFX11-NEXT: s_load_b32 s3, s[4:5], 0x70997; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x24998; GFX11-NEXT: v_mov_b32_e32 v1, 0999; GFX11-NEXT: s_waitcnt lgkmcnt(0)1000; GFX11-NEXT: v_div_scale_f32 v0, null, s3, s3, s21001; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1002; GFX11-NEXT: s_endpgm1003 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false)1004 %result0 = extractvalue { float, i1 } %result, 01005 store float %result0, ptr addrspace(1) %out, align 41006 ret void1007}1008 1009define amdgpu_kernel void @test_div_scale_f32_all_scalar_2(ptr addrspace(1) %out, [8 x i32], float %a, [8 x i32], float %b) {1010; GFX7-LABEL: test_div_scale_f32_all_scalar_2:1011; GFX7: ; %bb.0:1012; GFX7-NEXT: s_load_dword s3, s[4:5], 0x1c1013; GFX7-NEXT: s_load_dword s6, s[4:5], 0x131014; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91015; GFX7-NEXT: s_mov_b32 s2, -11016; GFX7-NEXT: s_waitcnt lgkmcnt(0)1017; GFX7-NEXT: v_mov_b32_e32 v0, s31018; GFX7-NEXT: v_div_scale_f32 v0, s[4:5], s6, v0, s61019; GFX7-NEXT: s_mov_b32 s3, 0xf0001020; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01021; GFX7-NEXT: s_endpgm1022;1023; GFX8-LABEL: test_div_scale_f32_all_scalar_2:1024; GFX8: ; %bb.0:1025; GFX8-NEXT: s_load_dword s0, s[4:5], 0x701026; GFX8-NEXT: s_load_dword s1, s[4:5], 0x4c1027; GFX8-NEXT: s_waitcnt lgkmcnt(0)1028; GFX8-NEXT: v_mov_b32_e32 v0, s01029; GFX8-NEXT: v_div_scale_f32 v2, s[0:1], s1, v0, s11030; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241031; GFX8-NEXT: s_waitcnt lgkmcnt(0)1032; GFX8-NEXT: v_mov_b32_e32 v0, s01033; GFX8-NEXT: v_mov_b32_e32 v1, s11034; GFX8-NEXT: flat_store_dword v[0:1], v21035; GFX8-NEXT: s_endpgm1036;1037; GFX10-LABEL: test_div_scale_f32_all_scalar_2:1038; GFX10: ; %bb.0:1039; GFX10-NEXT: s_clause 0x21040; GFX10-NEXT: s_load_dword s2, s[4:5], 0x4c1041; GFX10-NEXT: s_load_dword s3, s[4:5], 0x701042; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241043; GFX10-NEXT: v_mov_b32_e32 v1, 01044; GFX10-NEXT: s_waitcnt lgkmcnt(0)1045; GFX10-NEXT: v_div_scale_f32 v0, s2, s2, s3, s21046; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1047; GFX10-NEXT: s_endpgm1048;1049; GFX11-LABEL: test_div_scale_f32_all_scalar_2:1050; GFX11: ; %bb.0:1051; GFX11-NEXT: s_clause 0x21052; GFX11-NEXT: s_load_b32 s2, s[4:5], 0x4c1053; GFX11-NEXT: s_load_b32 s3, s[4:5], 0x701054; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241055; GFX11-NEXT: v_mov_b32_e32 v1, 01056; GFX11-NEXT: s_waitcnt lgkmcnt(0)1057; GFX11-NEXT: v_div_scale_f32 v0, null, s2, s3, s21058; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1059; GFX11-NEXT: s_endpgm1060 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true)1061 %result0 = extractvalue { float, i1 } %result, 01062 store float %result0, ptr addrspace(1) %out, align 41063 ret void1064}1065 1066define amdgpu_kernel void @test_div_scale_f64_all_scalar_1(ptr addrspace(1) %out, [8 x i32], double %a, [8 x i32], double %b) {1067; GFX7-LABEL: test_div_scale_f64_all_scalar_1:1068; GFX7: ; %bb.0:1069; GFX7-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x1d1070; GFX7-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x131071; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91072; GFX7-NEXT: s_waitcnt lgkmcnt(0)1073; GFX7-NEXT: v_mov_b32_e32 v0, s21074; GFX7-NEXT: v_mov_b32_e32 v1, s31075; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], v[0:1], v[0:1], s[6:7]1076; GFX7-NEXT: s_mov_b32 s2, -11077; GFX7-NEXT: s_mov_b32 s3, 0xf0001078; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01079; GFX7-NEXT: s_endpgm1080;1081; GFX8-LABEL: test_div_scale_f64_all_scalar_1:1082; GFX8: ; %bb.0:1083; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x741084; GFX8-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x4c1085; GFX8-NEXT: s_waitcnt lgkmcnt(0)1086; GFX8-NEXT: v_mov_b32_e32 v0, s01087; GFX8-NEXT: v_mov_b32_e32 v1, s11088; GFX8-NEXT: v_div_scale_f64 v[0:1], s[0:1], v[0:1], v[0:1], s[2:3]1089; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241090; GFX8-NEXT: s_waitcnt lgkmcnt(0)1091; GFX8-NEXT: v_mov_b32_e32 v3, s11092; GFX8-NEXT: v_mov_b32_e32 v2, s01093; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1094; GFX8-NEXT: s_endpgm1095;1096; GFX10-LABEL: test_div_scale_f64_all_scalar_1:1097; GFX10: ; %bb.0:1098; GFX10-NEXT: s_clause 0x11099; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x4c1100; GFX10-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x741101; GFX10-NEXT: v_mov_b32_e32 v2, 01102; GFX10-NEXT: s_waitcnt lgkmcnt(0)1103; GFX10-NEXT: v_div_scale_f64 v[0:1], s0, s[2:3], s[2:3], s[0:1]1104; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241105; GFX10-NEXT: s_waitcnt lgkmcnt(0)1106; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1107; GFX10-NEXT: s_endpgm1108;1109; GFX11-LABEL: test_div_scale_f64_all_scalar_1:1110; GFX11: ; %bb.0:1111; GFX11-NEXT: s_clause 0x11112; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x4c1113; GFX11-NEXT: s_load_b64 s[2:3], s[4:5], 0x741114; GFX11-NEXT: v_mov_b32_e32 v2, 01115; GFX11-NEXT: s_waitcnt lgkmcnt(0)1116; GFX11-NEXT: v_div_scale_f64 v[0:1], null, s[2:3], s[2:3], s[0:1]1117; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241118; GFX11-NEXT: s_waitcnt lgkmcnt(0)1119; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1120; GFX11-NEXT: s_endpgm1121 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false)1122 %result0 = extractvalue { double, i1 } %result, 01123 store double %result0, ptr addrspace(1) %out, align 81124 ret void1125}1126 1127define amdgpu_kernel void @test_div_scale_f64_all_scalar_2(ptr addrspace(1) %out, [8 x i32], double %a, [8 x i32], double %b) {1128; GFX7-LABEL: test_div_scale_f64_all_scalar_2:1129; GFX7: ; %bb.0:1130; GFX7-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x1d1131; GFX7-NEXT: s_load_dwordx2 s[6:7], s[4:5], 0x131132; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91133; GFX7-NEXT: s_waitcnt lgkmcnt(0)1134; GFX7-NEXT: v_mov_b32_e32 v0, s21135; GFX7-NEXT: v_mov_b32_e32 v1, s31136; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[6:7], v[0:1], s[6:7]1137; GFX7-NEXT: s_mov_b32 s2, -11138; GFX7-NEXT: s_mov_b32 s3, 0xf0001139; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01140; GFX7-NEXT: s_endpgm1141;1142; GFX8-LABEL: test_div_scale_f64_all_scalar_2:1143; GFX8: ; %bb.0:1144; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x741145; GFX8-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x4c1146; GFX8-NEXT: s_waitcnt lgkmcnt(0)1147; GFX8-NEXT: v_mov_b32_e32 v0, s01148; GFX8-NEXT: v_mov_b32_e32 v1, s11149; GFX8-NEXT: v_div_scale_f64 v[0:1], s[0:1], s[2:3], v[0:1], s[2:3]1150; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241151; GFX8-NEXT: s_waitcnt lgkmcnt(0)1152; GFX8-NEXT: v_mov_b32_e32 v3, s11153; GFX8-NEXT: v_mov_b32_e32 v2, s01154; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1155; GFX8-NEXT: s_endpgm1156;1157; GFX10-LABEL: test_div_scale_f64_all_scalar_2:1158; GFX10: ; %bb.0:1159; GFX10-NEXT: s_clause 0x11160; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x4c1161; GFX10-NEXT: s_load_dwordx2 s[2:3], s[4:5], 0x741162; GFX10-NEXT: v_mov_b32_e32 v2, 01163; GFX10-NEXT: s_waitcnt lgkmcnt(0)1164; GFX10-NEXT: v_div_scale_f64 v[0:1], s0, s[0:1], s[2:3], s[0:1]1165; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241166; GFX10-NEXT: s_waitcnt lgkmcnt(0)1167; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1168; GFX10-NEXT: s_endpgm1169;1170; GFX11-LABEL: test_div_scale_f64_all_scalar_2:1171; GFX11: ; %bb.0:1172; GFX11-NEXT: s_clause 0x11173; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x4c1174; GFX11-NEXT: s_load_b64 s[2:3], s[4:5], 0x741175; GFX11-NEXT: v_mov_b32_e32 v2, 01176; GFX11-NEXT: s_waitcnt lgkmcnt(0)1177; GFX11-NEXT: v_div_scale_f64 v[0:1], null, s[0:1], s[2:3], s[0:1]1178; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241179; GFX11-NEXT: s_waitcnt lgkmcnt(0)1180; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1181; GFX11-NEXT: s_endpgm1182 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true)1183 %result0 = extractvalue { double, i1 } %result, 01184 store double %result0, ptr addrspace(1) %out, align 81185 ret void1186}1187 1188define amdgpu_kernel void @test_div_scale_f32_inline_imm_num(ptr addrspace(1) %out, ptr addrspace(1) %in) {1189; GFX7-LABEL: test_div_scale_f32_inline_imm_num:1190; GFX7: ; %bb.0:1191; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91192; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v01193; GFX7-NEXT: v_mov_b32_e32 v1, 01194; GFX7-NEXT: s_mov_b32 s6, 01195; GFX7-NEXT: s_mov_b32 s7, 0xf0001196; GFX7-NEXT: s_waitcnt lgkmcnt(0)1197; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]1198; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr641199; GFX7-NEXT: s_mov_b32 s6, -11200; GFX7-NEXT: s_waitcnt vmcnt(0)1201; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, 1.01202; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]1203; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01204; GFX7-NEXT: s_endpgm1205;1206; GFX8-LABEL: test_div_scale_f32_inline_imm_num:1207; GFX8: ; %bb.0:1208; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241209; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01210; GFX8-NEXT: s_waitcnt lgkmcnt(0)1211; GFX8-NEXT: v_mov_b32_e32 v0, s21212; GFX8-NEXT: v_mov_b32_e32 v1, s31213; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v21214; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1215; GFX8-NEXT: flat_load_dword v0, v[0:1]1216; GFX8-NEXT: s_waitcnt vmcnt(0)1217; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v0, v0, 1.01218; GFX8-NEXT: v_mov_b32_e32 v0, s01219; GFX8-NEXT: v_mov_b32_e32 v1, s11220; GFX8-NEXT: flat_store_dword v[0:1], v21221; GFX8-NEXT: s_endpgm1222;1223; GFX10-LABEL: test_div_scale_f32_inline_imm_num:1224; GFX10: ; %bb.0:1225; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241226; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01227; GFX10-NEXT: v_mov_b32_e32 v1, 01228; GFX10-NEXT: s_waitcnt lgkmcnt(0)1229; GFX10-NEXT: global_load_dword v0, v0, s[2:3]1230; GFX10-NEXT: s_waitcnt vmcnt(0)1231; GFX10-NEXT: v_div_scale_f32 v0, s2, v0, v0, 1.01232; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1233; GFX10-NEXT: s_endpgm1234;1235; GFX11-LABEL: test_div_scale_f32_inline_imm_num:1236; GFX11: ; %bb.0:1237; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241238; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01239; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1240; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01241; GFX11-NEXT: s_waitcnt lgkmcnt(0)1242; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]1243; GFX11-NEXT: s_waitcnt vmcnt(0)1244; GFX11-NEXT: v_div_scale_f32 v0, null, v0, v0, 1.01245; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1246; GFX11-NEXT: s_endpgm1247 %tid = call i32 @llvm.amdgcn.workitem.id.x()1248 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid1249 %a = load float, ptr addrspace(1) %gep.0, align 41250 1251 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float 1.0, float %a, i1 false)1252 %result0 = extractvalue { float, i1 } %result, 01253 store float %result0, ptr addrspace(1) %out, align 41254 ret void1255}1256 1257define amdgpu_kernel void @test_div_scale_f32_inline_imm_den(ptr addrspace(1) %out, ptr addrspace(1) %in) {1258; GFX7-LABEL: test_div_scale_f32_inline_imm_den:1259; GFX7: ; %bb.0:1260; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91261; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v01262; GFX7-NEXT: v_mov_b32_e32 v1, 01263; GFX7-NEXT: s_mov_b32 s6, 01264; GFX7-NEXT: s_mov_b32 s7, 0xf0001265; GFX7-NEXT: s_waitcnt lgkmcnt(0)1266; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]1267; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr641268; GFX7-NEXT: s_mov_b32 s6, -11269; GFX7-NEXT: s_waitcnt vmcnt(0)1270; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], 2.0, 2.0, v01271; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]1272; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01273; GFX7-NEXT: s_endpgm1274;1275; GFX8-LABEL: test_div_scale_f32_inline_imm_den:1276; GFX8: ; %bb.0:1277; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241278; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01279; GFX8-NEXT: s_waitcnt lgkmcnt(0)1280; GFX8-NEXT: v_mov_b32_e32 v0, s21281; GFX8-NEXT: v_mov_b32_e32 v1, s31282; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v21283; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1284; GFX8-NEXT: flat_load_dword v0, v[0:1]1285; GFX8-NEXT: s_waitcnt vmcnt(0)1286; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], 2.0, 2.0, v01287; GFX8-NEXT: v_mov_b32_e32 v0, s01288; GFX8-NEXT: v_mov_b32_e32 v1, s11289; GFX8-NEXT: flat_store_dword v[0:1], v21290; GFX8-NEXT: s_endpgm1291;1292; GFX10-LABEL: test_div_scale_f32_inline_imm_den:1293; GFX10: ; %bb.0:1294; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241295; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01296; GFX10-NEXT: v_mov_b32_e32 v1, 01297; GFX10-NEXT: s_waitcnt lgkmcnt(0)1298; GFX10-NEXT: global_load_dword v0, v0, s[2:3]1299; GFX10-NEXT: s_waitcnt vmcnt(0)1300; GFX10-NEXT: v_div_scale_f32 v0, s2, 2.0, 2.0, v01301; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1302; GFX10-NEXT: s_endpgm1303;1304; GFX11-LABEL: test_div_scale_f32_inline_imm_den:1305; GFX11: ; %bb.0:1306; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241307; GFX11-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_and_b32 v0, 0x3ff, v01308; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1309; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01310; GFX11-NEXT: s_waitcnt lgkmcnt(0)1311; GFX11-NEXT: global_load_b32 v0, v0, s[2:3]1312; GFX11-NEXT: s_waitcnt vmcnt(0)1313; GFX11-NEXT: v_div_scale_f32 v0, null, 2.0, 2.0, v01314; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1315; GFX11-NEXT: s_endpgm1316 %tid = call i32 @llvm.amdgcn.workitem.id.x()1317 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid1318 %a = load float, ptr addrspace(1) %gep.0, align 41319 1320 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float 2.0, i1 false)1321 %result0 = extractvalue { float, i1 } %result, 01322 store float %result0, ptr addrspace(1) %out, align 41323 ret void1324}1325 1326define amdgpu_kernel void @test_div_scale_f32_fabs_num(ptr addrspace(1) %out, ptr addrspace(1) %in) {1327; GFX7-LABEL: test_div_scale_f32_fabs_num:1328; GFX7: ; %bb.0:1329; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91330; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v01331; GFX7-NEXT: v_mov_b32_e32 v1, 01332; GFX7-NEXT: s_mov_b32 s6, 01333; GFX7-NEXT: s_mov_b32 s7, 0xf0001334; GFX7-NEXT: s_waitcnt lgkmcnt(0)1335; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]1336; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc1337; GFX7-NEXT: s_waitcnt vmcnt(0)1338; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:4 glc1339; GFX7-NEXT: s_waitcnt vmcnt(0)1340; GFX7-NEXT: s_mov_b32 s6, -11341; GFX7-NEXT: v_and_b32_e32 v1, 0x7fffffff, v21342; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, v11343; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]1344; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01345; GFX7-NEXT: s_endpgm1346;1347; GFX8-LABEL: test_div_scale_f32_fabs_num:1348; GFX8: ; %bb.0:1349; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241350; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01351; GFX8-NEXT: s_waitcnt lgkmcnt(0)1352; GFX8-NEXT: v_mov_b32_e32 v0, s21353; GFX8-NEXT: v_mov_b32_e32 v1, s31354; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v21355; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1356; GFX8-NEXT: flat_load_dword v2, v[0:1] glc1357; GFX8-NEXT: s_waitcnt vmcnt(0)1358; GFX8-NEXT: v_add_u32_e32 v0, vcc, 4, v01359; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1360; GFX8-NEXT: flat_load_dword v0, v[0:1] glc1361; GFX8-NEXT: s_waitcnt vmcnt(0)1362; GFX8-NEXT: v_and_b32_e32 v1, 0x7fffffff, v21363; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v0, v0, v11364; GFX8-NEXT: v_mov_b32_e32 v0, s01365; GFX8-NEXT: v_mov_b32_e32 v1, s11366; GFX8-NEXT: flat_store_dword v[0:1], v21367; GFX8-NEXT: s_endpgm1368;1369; GFX10-LABEL: test_div_scale_f32_fabs_num:1370; GFX10: ; %bb.0:1371; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241372; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01373; GFX10-NEXT: s_waitcnt lgkmcnt(0)1374; GFX10-NEXT: global_load_dword v1, v0, s[2:3] glc dlc1375; GFX10-NEXT: s_waitcnt vmcnt(0)1376; GFX10-NEXT: global_load_dword v2, v0, s[2:3] offset:4 glc dlc1377; GFX10-NEXT: s_waitcnt vmcnt(0)1378; GFX10-NEXT: v_and_b32_e32 v0, 0x7fffffff, v11379; GFX10-NEXT: v_mov_b32_e32 v1, 01380; GFX10-NEXT: v_div_scale_f32 v0, s2, v2, v2, v01381; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1382; GFX10-NEXT: s_endpgm1383;1384; GFX11-LABEL: test_div_scale_f32_fabs_num:1385; GFX11: ; %bb.0:1386; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241387; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01388; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1389; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01390; GFX11-NEXT: s_waitcnt lgkmcnt(0)1391; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] glc dlc1392; GFX11-NEXT: s_waitcnt vmcnt(0)1393; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:4 glc dlc1394; GFX11-NEXT: s_waitcnt vmcnt(0)1395; GFX11-NEXT: v_and_b32_e32 v1, 0x7fffffff, v11396; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1397; GFX11-NEXT: v_div_scale_f32 v0, null, v0, v0, v11398; GFX11-NEXT: v_mov_b32_e32 v1, 01399; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1400; GFX11-NEXT: s_endpgm1401 %tid = call i32 @llvm.amdgcn.workitem.id.x()1402 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid1403 %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 11404 1405 %a = load volatile float, ptr addrspace(1) %gep.0, align 41406 %b = load volatile float, ptr addrspace(1) %gep.1, align 41407 1408 %a.fabs = call float @llvm.fabs.f32(float %a)1409 1410 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a.fabs, float %b, i1 false)1411 %result0 = extractvalue { float, i1 } %result, 01412 store float %result0, ptr addrspace(1) %out, align 41413 ret void1414}1415 1416define amdgpu_kernel void @test_div_scale_f32_fabs_den(ptr addrspace(1) %out, ptr addrspace(1) %in) {1417; GFX7-LABEL: test_div_scale_f32_fabs_den:1418; GFX7: ; %bb.0:1419; GFX7-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x91420; GFX7-NEXT: v_lshlrev_b32_e32 v0, 2, v01421; GFX7-NEXT: v_mov_b32_e32 v1, 01422; GFX7-NEXT: s_mov_b32 s6, 01423; GFX7-NEXT: s_mov_b32 s7, 0xf0001424; GFX7-NEXT: s_waitcnt lgkmcnt(0)1425; GFX7-NEXT: s_mov_b64 s[4:5], s[2:3]1426; GFX7-NEXT: buffer_load_dword v2, v[0:1], s[4:7], 0 addr64 glc1427; GFX7-NEXT: s_waitcnt vmcnt(0)1428; GFX7-NEXT: buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 offset:4 glc1429; GFX7-NEXT: s_waitcnt vmcnt(0)1430; GFX7-NEXT: s_mov_b32 s6, -11431; GFX7-NEXT: v_and_b32_e32 v0, 0x7fffffff, v01432; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, v21433; GFX7-NEXT: s_mov_b64 s[2:3], s[6:7]1434; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01435; GFX7-NEXT: s_endpgm1436;1437; GFX8-LABEL: test_div_scale_f32_fabs_den:1438; GFX8: ; %bb.0:1439; GFX8-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241440; GFX8-NEXT: v_lshlrev_b32_e32 v2, 2, v01441; GFX8-NEXT: s_waitcnt lgkmcnt(0)1442; GFX8-NEXT: v_mov_b32_e32 v0, s21443; GFX8-NEXT: v_mov_b32_e32 v1, s31444; GFX8-NEXT: v_add_u32_e32 v0, vcc, v0, v21445; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc1446; GFX8-NEXT: v_add_u32_e32 v2, vcc, 4, v01447; GFX8-NEXT: v_addc_u32_e32 v3, vcc, 0, v1, vcc1448; GFX8-NEXT: flat_load_dword v0, v[0:1] glc1449; GFX8-NEXT: s_waitcnt vmcnt(0)1450; GFX8-NEXT: flat_load_dword v1, v[2:3] glc1451; GFX8-NEXT: s_waitcnt vmcnt(0)1452; GFX8-NEXT: v_and_b32_e32 v1, 0x7fffffff, v11453; GFX8-NEXT: v_div_scale_f32 v2, s[2:3], v1, v1, v01454; GFX8-NEXT: v_mov_b32_e32 v0, s01455; GFX8-NEXT: v_mov_b32_e32 v1, s11456; GFX8-NEXT: flat_store_dword v[0:1], v21457; GFX8-NEXT: s_endpgm1458;1459; GFX10-LABEL: test_div_scale_f32_fabs_den:1460; GFX10: ; %bb.0:1461; GFX10-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x241462; GFX10-NEXT: v_lshlrev_b32_e32 v0, 2, v01463; GFX10-NEXT: s_waitcnt lgkmcnt(0)1464; GFX10-NEXT: global_load_dword v1, v0, s[2:3] glc dlc1465; GFX10-NEXT: s_waitcnt vmcnt(0)1466; GFX10-NEXT: global_load_dword v2, v0, s[2:3] offset:4 glc dlc1467; GFX10-NEXT: s_waitcnt vmcnt(0)1468; GFX10-NEXT: v_and_b32_e32 v0, 0x7fffffff, v21469; GFX10-NEXT: v_div_scale_f32 v0, s2, v0, v0, v11470; GFX10-NEXT: v_mov_b32_e32 v1, 01471; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1472; GFX10-NEXT: s_endpgm1473;1474; GFX11-LABEL: test_div_scale_f32_fabs_den:1475; GFX11: ; %bb.0:1476; GFX11-NEXT: s_load_b128 s[0:3], s[4:5], 0x241477; GFX11-NEXT: v_and_b32_e32 v0, 0x3ff, v01478; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1479; GFX11-NEXT: v_lshlrev_b32_e32 v0, 2, v01480; GFX11-NEXT: s_waitcnt lgkmcnt(0)1481; GFX11-NEXT: global_load_b32 v1, v0, s[2:3] glc dlc1482; GFX11-NEXT: s_waitcnt vmcnt(0)1483; GFX11-NEXT: global_load_b32 v0, v0, s[2:3] offset:4 glc dlc1484; GFX11-NEXT: s_waitcnt vmcnt(0)1485; GFX11-NEXT: v_and_b32_e32 v0, 0x7fffffff, v01486; GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)1487; GFX11-NEXT: v_div_scale_f32 v0, null, v0, v0, v11488; GFX11-NEXT: v_mov_b32_e32 v1, 01489; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1490; GFX11-NEXT: s_endpgm1491 %tid = call i32 @llvm.amdgcn.workitem.id.x()1492 %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid1493 %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 11494 1495 %a = load volatile float, ptr addrspace(1) %gep.0, align 41496 %b = load volatile float, ptr addrspace(1) %gep.1, align 41497 1498 %b.fabs = call float @llvm.fabs.f32(float %b)1499 1500 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b.fabs, i1 false)1501 %result0 = extractvalue { float, i1 } %result, 01502 store float %result0, ptr addrspace(1) %out, align 41503 ret void1504}1505 1506define amdgpu_kernel void @test_div_scale_f32_val_undef_val(ptr addrspace(1) %out) #0 {1507; GFX7-LABEL: test_div_scale_f32_val_undef_val:1508; GFX7: ; %bb.0:1509; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91510; GFX7-NEXT: v_mov_b32_e32 v0, 0x410000001511; GFX7-NEXT: s_waitcnt lgkmcnt(0)1512; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], s0, s0, v01513; GFX7-NEXT: s_mov_b32 s2, -11514; GFX7-NEXT: s_mov_b32 s3, 0xf0001515; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01516; GFX7-NEXT: s_endpgm1517;1518; GFX8-LABEL: test_div_scale_f32_val_undef_val:1519; GFX8: ; %bb.0:1520; GFX8-NEXT: v_mov_b32_e32 v0, 0x410000001521; GFX8-NEXT: v_div_scale_f32 v2, s[0:1], s0, s0, v01522; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241523; GFX8-NEXT: s_waitcnt lgkmcnt(0)1524; GFX8-NEXT: v_mov_b32_e32 v0, s01525; GFX8-NEXT: v_mov_b32_e32 v1, s11526; GFX8-NEXT: flat_store_dword v[0:1], v21527; GFX8-NEXT: s_endpgm1528;1529; GFX10-LABEL: test_div_scale_f32_val_undef_val:1530; GFX10: ; %bb.0:1531; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241532; GFX10-NEXT: v_mov_b32_e32 v1, 01533; GFX10-NEXT: s_waitcnt lgkmcnt(0)1534; GFX10-NEXT: v_div_scale_f32 v0, s2, s0, s0, 0x410000001535; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1536; GFX10-NEXT: s_endpgm1537;1538; GFX11-LABEL: test_div_scale_f32_val_undef_val:1539; GFX11: ; %bb.0:1540; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241541; GFX11-NEXT: v_mov_b32_e32 v1, 01542; GFX11-NEXT: s_waitcnt lgkmcnt(0)1543; GFX11-NEXT: v_div_scale_f32 v0, null, s0, s0, 0x410000001544; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1545; GFX11-NEXT: s_endpgm1546 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float 8.0, float poison, i1 false)1547 %result0 = extractvalue { float, i1 } %result, 01548 store float %result0, ptr addrspace(1) %out, align 41549 ret void1550}1551 1552define amdgpu_kernel void @test_div_scale_f32_undef_val_val(ptr addrspace(1) %out) #0 {1553; GFX7-LABEL: test_div_scale_f32_undef_val_val:1554; GFX7: ; %bb.0:1555; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91556; GFX7-NEXT: v_mov_b32_e32 v0, 0x410000001557; GFX7-NEXT: s_waitcnt lgkmcnt(0)1558; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], v0, v0, s01559; GFX7-NEXT: s_mov_b32 s2, -11560; GFX7-NEXT: s_mov_b32 s3, 0xf0001561; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01562; GFX7-NEXT: s_endpgm1563;1564; GFX8-LABEL: test_div_scale_f32_undef_val_val:1565; GFX8: ; %bb.0:1566; GFX8-NEXT: v_mov_b32_e32 v0, 0x410000001567; GFX8-NEXT: v_div_scale_f32 v2, s[0:1], v0, v0, s01568; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241569; GFX8-NEXT: s_waitcnt lgkmcnt(0)1570; GFX8-NEXT: v_mov_b32_e32 v0, s01571; GFX8-NEXT: v_mov_b32_e32 v1, s11572; GFX8-NEXT: flat_store_dword v[0:1], v21573; GFX8-NEXT: s_endpgm1574;1575; GFX10-LABEL: test_div_scale_f32_undef_val_val:1576; GFX10: ; %bb.0:1577; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241578; GFX10-NEXT: v_mov_b32_e32 v1, 01579; GFX10-NEXT: s_waitcnt lgkmcnt(0)1580; GFX10-NEXT: v_div_scale_f32 v0, s2, 0x41000000, 0x41000000, s01581; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1582; GFX10-NEXT: s_endpgm1583;1584; GFX11-LABEL: test_div_scale_f32_undef_val_val:1585; GFX11: ; %bb.0:1586; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241587; GFX11-NEXT: v_mov_b32_e32 v1, 01588; GFX11-NEXT: s_waitcnt lgkmcnt(0)1589; GFX11-NEXT: v_div_scale_f32 v0, null, 0x41000000, 0x41000000, s01590; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1591; GFX11-NEXT: s_endpgm1592 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float poison, float 8.0, i1 false)1593 %result0 = extractvalue { float, i1 } %result, 01594 store float %result0, ptr addrspace(1) %out, align 41595 ret void1596}1597 1598define amdgpu_kernel void @test_div_scale_f32_undef_undef_val(ptr addrspace(1) %out) #0 {1599; GFX7-LABEL: test_div_scale_f32_undef_undef_val:1600; GFX7: ; %bb.0:1601; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91602; GFX7-NEXT: s_waitcnt lgkmcnt(0)1603; GFX7-NEXT: v_div_scale_f32 v0, s[2:3], s0, s0, s01604; GFX7-NEXT: s_mov_b32 s2, -11605; GFX7-NEXT: s_mov_b32 s3, 0xf0001606; GFX7-NEXT: buffer_store_dword v0, off, s[0:3], 01607; GFX7-NEXT: s_endpgm1608;1609; GFX8-LABEL: test_div_scale_f32_undef_undef_val:1610; GFX8: ; %bb.0:1611; GFX8-NEXT: v_div_scale_f32 v2, s[0:1], s0, s0, s01612; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241613; GFX8-NEXT: s_waitcnt lgkmcnt(0)1614; GFX8-NEXT: v_mov_b32_e32 v0, s01615; GFX8-NEXT: v_mov_b32_e32 v1, s11616; GFX8-NEXT: flat_store_dword v[0:1], v21617; GFX8-NEXT: s_endpgm1618;1619; GFX10-LABEL: test_div_scale_f32_undef_undef_val:1620; GFX10: ; %bb.0:1621; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241622; GFX10-NEXT: v_mov_b32_e32 v1, 01623; GFX10-NEXT: s_waitcnt lgkmcnt(0)1624; GFX10-NEXT: v_div_scale_f32 v0, s2, s0, s0, s01625; GFX10-NEXT: global_store_dword v1, v0, s[0:1]1626; GFX10-NEXT: s_endpgm1627;1628; GFX11-LABEL: test_div_scale_f32_undef_undef_val:1629; GFX11: ; %bb.0:1630; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241631; GFX11-NEXT: v_mov_b32_e32 v1, 01632; GFX11-NEXT: s_waitcnt lgkmcnt(0)1633; GFX11-NEXT: v_div_scale_f32 v0, null, s0, s0, s01634; GFX11-NEXT: global_store_b32 v1, v0, s[0:1]1635; GFX11-NEXT: s_endpgm1636 %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float poison, float poison, i1 false)1637 %result0 = extractvalue { float, i1 } %result, 01638 store float %result0, ptr addrspace(1) %out, align 41639 ret void1640}1641 1642define amdgpu_kernel void @test_div_scale_f64_val_undef_val(ptr addrspace(1) %out) #0 {1643; GFX7-LABEL: test_div_scale_f64_val_undef_val:1644; GFX7: ; %bb.0:1645; GFX7-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x91646; GFX7-NEXT: v_mov_b32_e32 v0, 01647; GFX7-NEXT: v_mov_b32_e32 v1, 0x402000001648; GFX7-NEXT: s_waitcnt lgkmcnt(0)1649; GFX7-NEXT: v_div_scale_f64 v[0:1], s[2:3], s[0:1], s[0:1], v[0:1]1650; GFX7-NEXT: s_mov_b32 s2, -11651; GFX7-NEXT: s_mov_b32 s3, 0xf0001652; GFX7-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 01653; GFX7-NEXT: s_endpgm1654;1655; GFX8-LABEL: test_div_scale_f64_val_undef_val:1656; GFX8: ; %bb.0:1657; GFX8-NEXT: v_mov_b32_e32 v0, 01658; GFX8-NEXT: v_mov_b32_e32 v1, 0x402000001659; GFX8-NEXT: v_div_scale_f64 v[0:1], s[0:1], s[0:1], s[0:1], v[0:1]1660; GFX8-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241661; GFX8-NEXT: s_waitcnt lgkmcnt(0)1662; GFX8-NEXT: v_mov_b32_e32 v3, s11663; GFX8-NEXT: v_mov_b32_e32 v2, s01664; GFX8-NEXT: flat_store_dwordx2 v[2:3], v[0:1]1665; GFX8-NEXT: s_endpgm1666;1667; GFX10-LABEL: test_div_scale_f64_val_undef_val:1668; GFX10: ; %bb.0:1669; GFX10-NEXT: v_div_scale_f64 v[0:1], s0, s[0:1], s[0:1], 0x402000001670; GFX10-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x241671; GFX10-NEXT: v_mov_b32_e32 v2, 01672; GFX10-NEXT: s_waitcnt lgkmcnt(0)1673; GFX10-NEXT: global_store_dwordx2 v2, v[0:1], s[0:1]1674; GFX10-NEXT: s_endpgm1675;1676; GFX11-LABEL: test_div_scale_f64_val_undef_val:1677; GFX11: ; %bb.0:1678; GFX11-NEXT: v_div_scale_f64 v[0:1], null, s[0:1], s[0:1], 0x402000001679; GFX11-NEXT: s_load_b64 s[0:1], s[4:5], 0x241680; GFX11-NEXT: v_mov_b32_e32 v2, 01681; GFX11-NEXT: s_waitcnt lgkmcnt(0)1682; GFX11-NEXT: global_store_b64 v2, v[0:1], s[0:1]1683; GFX11-NEXT: s_endpgm1684 %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double 8.0, double poison, i1 false)1685 %result0 = extractvalue { double, i1 } %result, 01686 store double %result0, ptr addrspace(1) %out, align 81687 ret void1688}1689 1690declare i32 @llvm.amdgcn.workitem.id.x() #11691declare { float, i1 } @llvm.amdgcn.div.scale.f32(float, float, i1) #11692declare { double, i1 } @llvm.amdgcn.div.scale.f64(double, double, i1) #11693declare float @llvm.fabs.f32(float) #11694 1695attributes #0 = { nounwind }1696attributes #1 = { nounwind readnone speculatable }1697