brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.0 KiB · 8532a7f Raw
786 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=amdgcn < %s | FileCheck -check-prefix=GCN %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx906 < %s | FileCheck -check-prefix=GFX906 %s5; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16 %s6; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16 %s7 8define amdgpu_kernel void @uniform_vec_0_i16(ptr addrspace(1) %out, i16 %a) {9; GCN-LABEL: uniform_vec_0_i16:10; GCN:       ; %bb.0:11; GCN-NEXT:    s_load_dword s2, s[4:5], 0xb12; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x913; GCN-NEXT:    s_mov_b32 s3, 0xf00014; GCN-NEXT:    s_waitcnt lgkmcnt(0)15; GCN-NEXT:    s_lshl_b32 s4, s2, 1616; GCN-NEXT:    s_mov_b32 s2, -117; GCN-NEXT:    v_mov_b32_e32 v0, s418; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 019; GCN-NEXT:    s_endpgm20;21; GFX9-LABEL: uniform_vec_0_i16:22; GFX9:       ; %bb.0:23; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x2c24; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2425; GFX9-NEXT:    v_mov_b32_e32 v0, 026; GFX9-NEXT:    s_waitcnt lgkmcnt(0)27; GFX9-NEXT:    s_lshl_b32 s2, s2, 1628; GFX9-NEXT:    v_mov_b32_e32 v1, s229; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]30; GFX9-NEXT:    s_endpgm31;32; GFX906-LABEL: uniform_vec_0_i16:33; GFX906:       ; %bb.0:34; GFX906-NEXT:    s_load_dword s2, s[4:5], 0x2c35; GFX906-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2436; GFX906-NEXT:    v_mov_b32_e32 v0, 037; GFX906-NEXT:    s_waitcnt lgkmcnt(0)38; GFX906-NEXT:    s_lshl_b32 s2, s2, 1639; GFX906-NEXT:    v_mov_b32_e32 v1, s240; GFX906-NEXT:    global_store_dword v0, v1, s[0:1]41; GFX906-NEXT:    s_endpgm42;43; GFX11-LABEL: uniform_vec_0_i16:44; GFX11:       ; %bb.0:45; GFX11-NEXT:    s_clause 0x146; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x2c47; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x2448; GFX11-NEXT:    s_waitcnt lgkmcnt(0)49; GFX11-NEXT:    s_lshl_b32 s2, s2, 1650; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)51; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s252; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]53; GFX11-NEXT:    s_endpgm54  %tmp = insertelement <2 x i16> poison, i16 0, i32 055  %vec = insertelement <2 x i16> %tmp, i16 %a, i32 156  %val = bitcast <2 x i16> %vec to i3257  store i32 %val, ptr addrspace(1) %out, align 458  ret void59}60 61define i32 @divergent_vec_0_i16(i16 %a) {62; GCN-LABEL: divergent_vec_0_i16:63; GCN:       ; %bb.0:64; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)65; GCN-NEXT:    v_lshlrev_b32_e32 v0, 16, v066; GCN-NEXT:    s_setpc_b64 s[30:31]67;68; GFX9-LABEL: divergent_vec_0_i16:69; GFX9:       ; %bb.0:70; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)71; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 16, v072; GFX9-NEXT:    s_setpc_b64 s[30:31]73;74; GFX906-LABEL: divergent_vec_0_i16:75; GFX906:       ; %bb.0:76; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)77; GFX906-NEXT:    v_lshlrev_b32_e32 v0, 16, v078; GFX906-NEXT:    s_setpc_b64 s[30:31]79;80; GFX11-TRUE16-LABEL: divergent_vec_0_i16:81; GFX11-TRUE16:       ; %bb.0:82; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)83; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, 084; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.h, v0.l85; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)86; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v187; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]88;89; GFX11-FAKE16-LABEL: divergent_vec_0_i16:90; GFX11-FAKE16:       ; %bb.0:91; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)92; GFX11-FAKE16-NEXT:    v_lshlrev_b32_e32 v0, 16, v093; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]94  %tmp = insertelement <2 x i16> poison, i16 0, i32 095  %vec = insertelement <2 x i16> %tmp, i16 %a, i32 196  %val = bitcast <2 x i16> %vec to i3297  ret i32 %val98}99 100define amdgpu_kernel void @uniform_vec_i16_0(ptr addrspace(1) %out, i16 %a) {101; GCN-LABEL: uniform_vec_i16_0:102; GCN:       ; %bb.0:103; GCN-NEXT:    s_load_dword s2, s[4:5], 0xb104; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9105; GCN-NEXT:    s_mov_b32 s3, 0xf000106; GCN-NEXT:    s_waitcnt lgkmcnt(0)107; GCN-NEXT:    s_and_b32 s4, s2, 0xffff108; GCN-NEXT:    s_mov_b32 s2, -1109; GCN-NEXT:    v_mov_b32_e32 v0, s4110; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0111; GCN-NEXT:    s_endpgm112;113; GFX9-LABEL: uniform_vec_i16_0:114; GFX9:       ; %bb.0:115; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x2c116; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24117; GFX9-NEXT:    v_mov_b32_e32 v0, 0118; GFX9-NEXT:    s_waitcnt lgkmcnt(0)119; GFX9-NEXT:    s_and_b32 s2, 0xffff, s2120; GFX9-NEXT:    v_mov_b32_e32 v1, s2121; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]122; GFX9-NEXT:    s_endpgm123;124; GFX906-LABEL: uniform_vec_i16_0:125; GFX906:       ; %bb.0:126; GFX906-NEXT:    s_load_dword s2, s[4:5], 0x2c127; GFX906-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24128; GFX906-NEXT:    v_mov_b32_e32 v0, 0129; GFX906-NEXT:    s_waitcnt lgkmcnt(0)130; GFX906-NEXT:    s_and_b32 s2, 0xffff, s2131; GFX906-NEXT:    v_mov_b32_e32 v1, s2132; GFX906-NEXT:    global_store_dword v0, v1, s[0:1]133; GFX906-NEXT:    s_endpgm134;135; GFX11-LABEL: uniform_vec_i16_0:136; GFX11:       ; %bb.0:137; GFX11-NEXT:    s_clause 0x1138; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x2c139; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24140; GFX11-NEXT:    s_waitcnt lgkmcnt(0)141; GFX11-NEXT:    s_and_b32 s2, 0xffff, s2142; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)143; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2144; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]145; GFX11-NEXT:    s_endpgm146  %tmp = insertelement <2 x i16> poison, i16 %a, i32 0147  %vec = insertelement <2 x i16> %tmp, i16 0, i32 1148  %val = bitcast <2 x i16> %vec to i32149  store i32 %val, ptr addrspace(1) %out, align 4150  ret void151}152 153define i32 @divergent_vec_i16_0(i16 %a) {154; GCN-LABEL: divergent_vec_i16_0:155; GCN:       ; %bb.0:156; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)157; GCN-NEXT:    v_and_b32_e32 v0, 0xffff, v0158; GCN-NEXT:    s_setpc_b64 s[30:31]159;160; GFX9-LABEL: divergent_vec_i16_0:161; GFX9:       ; %bb.0:162; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)163; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0164; GFX9-NEXT:    s_setpc_b64 s[30:31]165;166; GFX906-LABEL: divergent_vec_i16_0:167; GFX906:       ; %bb.0:168; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)169; GFX906-NEXT:    v_and_b32_e32 v0, 0xffff, v0170; GFX906-NEXT:    s_setpc_b64 s[30:31]171;172; GFX11-TRUE16-LABEL: divergent_vec_i16_0:173; GFX11-TRUE16:       ; %bb.0:174; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.h, 0176; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l177; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)178; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v1179; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]180;181; GFX11-FAKE16-LABEL: divergent_vec_i16_0:182; GFX11-FAKE16:       ; %bb.0:183; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)184; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0185; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]186  %tmp = insertelement <2 x i16> poison, i16 %a, i32 0187  %vec = insertelement <2 x i16> %tmp, i16 0, i32 1188  %val = bitcast <2 x i16> %vec to i32189  ret i32 %val190}191 192define amdgpu_kernel void @uniform_vec_f16_0(ptr addrspace(1) %out, half %a) {193; GCN-LABEL: uniform_vec_f16_0:194; GCN:       ; %bb.0:195; GCN-NEXT:    s_load_dword s2, s[4:5], 0xb196; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9197; GCN-NEXT:    s_mov_b32 s3, 0xf000198; GCN-NEXT:    s_waitcnt lgkmcnt(0)199; GCN-NEXT:    s_and_b32 s4, s2, 0xffff200; GCN-NEXT:    s_mov_b32 s2, -1201; GCN-NEXT:    v_mov_b32_e32 v0, s4202; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0203; GCN-NEXT:    s_endpgm204;205; GFX9-LABEL: uniform_vec_f16_0:206; GFX9:       ; %bb.0:207; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x2c208; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24209; GFX9-NEXT:    v_mov_b32_e32 v0, 0210; GFX9-NEXT:    s_waitcnt lgkmcnt(0)211; GFX9-NEXT:    s_and_b32 s2, 0xffff, s2212; GFX9-NEXT:    v_mov_b32_e32 v1, s2213; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]214; GFX9-NEXT:    s_endpgm215;216; GFX906-LABEL: uniform_vec_f16_0:217; GFX906:       ; %bb.0:218; GFX906-NEXT:    s_load_dword s2, s[4:5], 0x2c219; GFX906-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x24220; GFX906-NEXT:    v_mov_b32_e32 v0, 0221; GFX906-NEXT:    s_waitcnt lgkmcnt(0)222; GFX906-NEXT:    s_and_b32 s2, 0xffff, s2223; GFX906-NEXT:    v_mov_b32_e32 v1, s2224; GFX906-NEXT:    global_store_dword v0, v1, s[0:1]225; GFX906-NEXT:    s_endpgm226;227; GFX11-LABEL: uniform_vec_f16_0:228; GFX11:       ; %bb.0:229; GFX11-NEXT:    s_clause 0x1230; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x2c231; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x24232; GFX11-NEXT:    s_waitcnt lgkmcnt(0)233; GFX11-NEXT:    s_and_b32 s2, 0xffff, s2234; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)235; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2236; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]237; GFX11-NEXT:    s_endpgm238  %tmp = insertelement <2 x half> poison, half %a, i32 0239  %vec = insertelement <2 x half> %tmp, half 0.0, i32 1240  %val = bitcast <2 x half> %vec to float241  store float %val, ptr addrspace(1) %out, align 4242  ret void243}244 245define float @divergent_vec_f16_0(half %a) {246; GCN-LABEL: divergent_vec_f16_0:247; GCN:       ; %bb.0:248; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)249; GCN-NEXT:    v_cvt_f16_f32_e32 v0, v0250; GCN-NEXT:    s_setpc_b64 s[30:31]251;252; GFX9-LABEL: divergent_vec_f16_0:253; GFX9:       ; %bb.0:254; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)255; GFX9-NEXT:    v_and_b32_e32 v0, 0xffff, v0256; GFX9-NEXT:    s_setpc_b64 s[30:31]257;258; GFX906-LABEL: divergent_vec_f16_0:259; GFX906:       ; %bb.0:260; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX906-NEXT:    v_and_b32_e32 v0, 0xffff, v0262; GFX906-NEXT:    s_setpc_b64 s[30:31]263;264; GFX11-TRUE16-LABEL: divergent_vec_f16_0:265; GFX11-TRUE16:       ; %bb.0:266; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.h, 0268; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l269; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)270; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v1271; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]272;273; GFX11-FAKE16-LABEL: divergent_vec_f16_0:274; GFX11-FAKE16:       ; %bb.0:275; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)276; GFX11-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0277; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]278  %tmp = insertelement <2 x half> poison, half %a, i32 0279  %vec = insertelement <2 x half> %tmp, half 0.0, i32 1280  %val = bitcast <2 x half> %vec to float281  ret float %val282}283 284define amdgpu_kernel void @uniform_vec_i16_LL(ptr addrspace(4) %in0, ptr addrspace(4) %in1) {285; GCN-LABEL: uniform_vec_i16_LL:286; GCN:       ; %bb.0:287; GCN-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9288; GCN-NEXT:    s_waitcnt lgkmcnt(0)289; GCN-NEXT:    s_load_dword s0, s[0:1], 0x0290; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0291; GCN-NEXT:    s_waitcnt lgkmcnt(0)292; GCN-NEXT:    s_and_b32 s0, s0, 0xffff293; GCN-NEXT:    s_lshl_b32 s1, s1, 16294; GCN-NEXT:    s_or_b32 s0, s0, s1295; GCN-NEXT:    ;;#ASMSTART296; GCN-NEXT:    ; use s0297; GCN-NEXT:    ;;#ASMEND298; GCN-NEXT:    s_endpgm299;300; GFX9-LABEL: uniform_vec_i16_LL:301; GFX9:       ; %bb.0:302; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24303; GFX9-NEXT:    s_waitcnt lgkmcnt(0)304; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x0305; GFX9-NEXT:    s_load_dword s5, s[2:3], 0x0306; GFX9-NEXT:    s_waitcnt lgkmcnt(0)307; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s4, s5308; GFX9-NEXT:    ;;#ASMSTART309; GFX9-NEXT:    ; use s0310; GFX9-NEXT:    ;;#ASMEND311; GFX9-NEXT:    s_endpgm312;313; GFX906-LABEL: uniform_vec_i16_LL:314; GFX906:       ; %bb.0:315; GFX906-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24316; GFX906-NEXT:    s_waitcnt lgkmcnt(0)317; GFX906-NEXT:    s_load_dword s4, s[0:1], 0x0318; GFX906-NEXT:    s_load_dword s5, s[2:3], 0x0319; GFX906-NEXT:    s_waitcnt lgkmcnt(0)320; GFX906-NEXT:    s_pack_ll_b32_b16 s0, s4, s5321; GFX906-NEXT:    ;;#ASMSTART322; GFX906-NEXT:    ; use s0323; GFX906-NEXT:    ;;#ASMEND324; GFX906-NEXT:    s_endpgm325;326; GFX11-LABEL: uniform_vec_i16_LL:327; GFX11:       ; %bb.0:328; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24329; GFX11-NEXT:    s_waitcnt lgkmcnt(0)330; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x0331; GFX11-NEXT:    s_load_b32 s1, s[2:3], 0x0332; GFX11-NEXT:    s_waitcnt lgkmcnt(0)333; GFX11-NEXT:    s_pack_ll_b32_b16 s0, s0, s1334; GFX11-NEXT:    ;;#ASMSTART335; GFX11-NEXT:    ; use s0336; GFX11-NEXT:    ;;#ASMEND337; GFX11-NEXT:    s_endpgm338  %val0 = load volatile i32, ptr addrspace(4) %in0339  %val1 = load volatile i32, ptr addrspace(4) %in1340  %lo = trunc i32 %val0 to i16341  %hi = trunc i32 %val1 to i16342  %vec.0 = insertelement <2 x i16> poison, i16 %lo, i32 0343  %vec.1 = insertelement <2 x i16> %vec.0, i16 %hi, i32 1344  %vec.i32 = bitcast <2 x i16> %vec.1 to i32345  call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0346  ret void347}348 349define i32 @divergent_vec_i16_LL(i16 %a, i16 %b) {350; GCN-LABEL: divergent_vec_i16_LL:351; GCN:       ; %bb.0:352; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)353; GCN-NEXT:    v_lshlrev_b32_e32 v1, 16, v1354; GCN-NEXT:    v_and_b32_e32 v0, 0xffff, v0355; GCN-NEXT:    v_or_b32_e32 v0, v0, v1356; GCN-NEXT:    s_setpc_b64 s[30:31]357;358; GFX9-LABEL: divergent_vec_i16_LL:359; GFX9:       ; %bb.0:360; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)361; GFX9-NEXT:    s_mov_b32 s4, 0x5040100362; GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4363; GFX9-NEXT:    s_setpc_b64 s[30:31]364;365; GFX906-LABEL: divergent_vec_i16_LL:366; GFX906:       ; %bb.0:367; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)368; GFX906-NEXT:    s_mov_b32 s4, 0x5040100369; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4370; GFX906-NEXT:    s_setpc_b64 s[30:31]371;372; GFX11-TRUE16-LABEL: divergent_vec_i16_LL:373; GFX11-TRUE16:       ; %bb.0:374; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)375; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l376; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]377;378; GFX11-FAKE16-LABEL: divergent_vec_i16_LL:379; GFX11-FAKE16:       ; %bb.0:380; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)381; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100382; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]383  %tmp = insertelement <2 x i16> poison, i16 %a, i32 0384  %vec = insertelement <2 x i16> %tmp, i16 %b, i32 1385  %val = bitcast <2 x i16> %vec to i32386  ret i32 %val387}388 389define amdgpu_kernel void @uniform_vec_i16_LH(ptr addrspace(1) %out, i16 %a, i32 %b) {390; GCN-LABEL: uniform_vec_i16_LH:391; GCN:       ; %bb.0:392; GCN-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9393; GCN-NEXT:    s_waitcnt lgkmcnt(0)394; GCN-NEXT:    s_mov_b64 s[4:5], s[2:3]395; GCN-NEXT:    s_mov_b32 s3, 0xf000396; GCN-NEXT:    s_and_b32 s2, s5, 0xffff0000397; GCN-NEXT:    s_and_b32 s4, s4, 0xffff398; GCN-NEXT:    s_or_b32 s4, s4, s2399; GCN-NEXT:    s_mov_b32 s2, -1400; GCN-NEXT:    v_mov_b32_e32 v0, s4401; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0402; GCN-NEXT:    s_endpgm403;404; GFX9-LABEL: uniform_vec_i16_LH:405; GFX9:       ; %bb.0:406; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24407; GFX9-NEXT:    v_mov_b32_e32 v0, 0408; GFX9-NEXT:    s_waitcnt lgkmcnt(0)409; GFX9-NEXT:    s_pack_lh_b32_b16 s2, s2, s3410; GFX9-NEXT:    v_mov_b32_e32 v1, s2411; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]412; GFX9-NEXT:    s_endpgm413;414; GFX906-LABEL: uniform_vec_i16_LH:415; GFX906:       ; %bb.0:416; GFX906-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24417; GFX906-NEXT:    v_mov_b32_e32 v0, 0418; GFX906-NEXT:    s_waitcnt lgkmcnt(0)419; GFX906-NEXT:    s_pack_lh_b32_b16 s2, s2, s3420; GFX906-NEXT:    v_mov_b32_e32 v1, s2421; GFX906-NEXT:    global_store_dword v0, v1, s[0:1]422; GFX906-NEXT:    s_endpgm423;424; GFX11-LABEL: uniform_vec_i16_LH:425; GFX11:       ; %bb.0:426; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24427; GFX11-NEXT:    s_waitcnt lgkmcnt(0)428; GFX11-NEXT:    s_pack_lh_b32_b16 s2, s2, s3429; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)430; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2431; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]432; GFX11-NEXT:    s_endpgm433  %shift = lshr i32 %b, 16434  %tr = trunc i32 %shift to i16435  %tmp = insertelement <2 x i16> poison, i16 %a, i32 0436  %vec = insertelement <2 x i16> %tmp, i16 %tr, i32 1437  %val = bitcast <2 x i16> %vec to i32438  store i32 %val, ptr addrspace(1) %out, align 4439  ret void440}441 442define i32 @divergent_vec_i16_LH(i16 %a, i32 %b) {443; GCN-LABEL: divergent_vec_i16_LH:444; GCN:       ; %bb.0:445; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)446; GCN-NEXT:    s_mov_b32 s4, 0xffff447; GCN-NEXT:    v_bfi_b32 v0, s4, v0, v1448; GCN-NEXT:    s_setpc_b64 s[30:31]449;450; GFX9-LABEL: divergent_vec_i16_LH:451; GFX9:       ; %bb.0:452; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)453; GFX9-NEXT:    s_mov_b32 s4, 0xffff454; GFX9-NEXT:    v_bfi_b32 v0, s4, v0, v1455; GFX9-NEXT:    s_setpc_b64 s[30:31]456;457; GFX906-LABEL: divergent_vec_i16_LH:458; GFX906:       ; %bb.0:459; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)460; GFX906-NEXT:    s_mov_b32 s4, 0xffff461; GFX906-NEXT:    v_bfi_b32 v0, s4, v0, v1462; GFX906-NEXT:    s_setpc_b64 s[30:31]463;464; GFX11-TRUE16-LABEL: divergent_vec_i16_LH:465; GFX11-TRUE16:       ; %bb.0:466; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)467; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l468; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)469; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v1470; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]471;472; GFX11-FAKE16-LABEL: divergent_vec_i16_LH:473; GFX11-FAKE16:       ; %bb.0:474; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)475; GFX11-FAKE16-NEXT:    v_bfi_b32 v0, 0xffff, v0, v1476; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]477  %shift = lshr i32 %b, 16478  %tr = trunc i32 %shift to i16479  %tmp = insertelement <2 x i16> poison, i16 %a, i32 0480  %vec = insertelement <2 x i16> %tmp, i16 %tr, i32 1481  %val = bitcast <2 x i16> %vec to i32482  ret i32 %val483}484 485define amdgpu_kernel void @uniform_vec_i16_HH(ptr addrspace(1) %out, i32 %a, i32 %b) {486; GCN-LABEL: uniform_vec_i16_HH:487; GCN:       ; %bb.0:488; GCN-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9489; GCN-NEXT:    s_mov_b32 s7, 0xf000490; GCN-NEXT:    s_waitcnt lgkmcnt(0)491; GCN-NEXT:    s_lshr_b32 s3, s3, 16492; GCN-NEXT:    s_lshr_b64 s[2:3], s[2:3], 16493; GCN-NEXT:    s_mov_b32 s6, -1494; GCN-NEXT:    s_mov_b32 s4, s0495; GCN-NEXT:    s_mov_b32 s5, s1496; GCN-NEXT:    v_mov_b32_e32 v0, s2497; GCN-NEXT:    buffer_store_dword v0, off, s[4:7], 0498; GCN-NEXT:    s_endpgm499;500; GFX9-LABEL: uniform_vec_i16_HH:501; GFX9:       ; %bb.0:502; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24503; GFX9-NEXT:    v_mov_b32_e32 v0, 0504; GFX9-NEXT:    s_waitcnt lgkmcnt(0)505; GFX9-NEXT:    s_pack_hh_b32_b16 s2, s2, s3506; GFX9-NEXT:    v_mov_b32_e32 v1, s2507; GFX9-NEXT:    global_store_dword v0, v1, s[0:1]508; GFX9-NEXT:    s_endpgm509;510; GFX906-LABEL: uniform_vec_i16_HH:511; GFX906:       ; %bb.0:512; GFX906-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24513; GFX906-NEXT:    v_mov_b32_e32 v0, 0514; GFX906-NEXT:    s_waitcnt lgkmcnt(0)515; GFX906-NEXT:    s_pack_hh_b32_b16 s2, s2, s3516; GFX906-NEXT:    v_mov_b32_e32 v1, s2517; GFX906-NEXT:    global_store_dword v0, v1, s[0:1]518; GFX906-NEXT:    s_endpgm519;520; GFX11-LABEL: uniform_vec_i16_HH:521; GFX11:       ; %bb.0:522; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24523; GFX11-NEXT:    s_waitcnt lgkmcnt(0)524; GFX11-NEXT:    s_pack_hh_b32_b16 s2, s2, s3525; GFX11-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)526; GFX11-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2527; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1]528; GFX11-NEXT:    s_endpgm529  %shift_a = lshr i32 %a, 16530  %tr_a = trunc i32 %shift_a to i16531  %shift_b = lshr i32 %b, 16532  %tr_b = trunc i32 %shift_b to i16533  %tmp = insertelement <2 x i16> poison, i16 %tr_a, i32 0534  %vec = insertelement <2 x i16> %tmp, i16 %tr_b, i32 1535  %val = bitcast <2 x i16> %vec to i32536  store i32 %val, ptr addrspace(1) %out, align 4537  ret void538}539 540define i32 @divergent_vec_i16_HH(i32 %a, i32 %b) {541; GCN-LABEL: divergent_vec_i16_HH:542; GCN:       ; %bb.0:543; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)544; GCN-NEXT:    v_lshrrev_b32_e32 v1, 16, v1545; GCN-NEXT:    v_alignbit_b32 v0, v1, v0, 16546; GCN-NEXT:    s_setpc_b64 s[30:31]547;548; GFX9-LABEL: divergent_vec_i16_HH:549; GFX9:       ; %bb.0:550; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)551; GFX9-NEXT:    s_mov_b32 s4, 0x7060302552; GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4553; GFX9-NEXT:    s_setpc_b64 s[30:31]554;555; GFX906-LABEL: divergent_vec_i16_HH:556; GFX906:       ; %bb.0:557; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)558; GFX906-NEXT:    s_mov_b32 s4, 0x7060302559; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4560; GFX906-NEXT:    s_setpc_b64 s[30:31]561;562; GFX11-TRUE16-LABEL: divergent_vec_i16_HH:563; GFX11-TRUE16:       ; %bb.0:564; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)565; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.h566; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)567; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v1568; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]569;570; GFX11-FAKE16-LABEL: divergent_vec_i16_HH:571; GFX11-FAKE16:       ; %bb.0:572; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)573; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x7060302574; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]575  %shift_a = lshr i32 %a, 16576  %tr_a = trunc i32 %shift_a to i16577  %shift_b = lshr i32 %b, 16578  %tr_b = trunc i32 %shift_b to i16579  %tmp = insertelement <2 x i16> poison, i16 %tr_a, i32 0580  %vec = insertelement <2 x i16> %tmp, i16 %tr_b, i32 1581  %val = bitcast <2 x i16> %vec to i32582  ret i32 %val583}584 585define amdgpu_kernel void @uniform_vec_f16_LL(ptr addrspace(4) %in0, ptr addrspace(4) %in1) {586; GCN-LABEL: uniform_vec_f16_LL:587; GCN:       ; %bb.0:588; GCN-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x9589; GCN-NEXT:    s_waitcnt lgkmcnt(0)590; GCN-NEXT:    s_load_dword s0, s[0:1], 0x0591; GCN-NEXT:    s_load_dword s1, s[2:3], 0x0592; GCN-NEXT:    s_waitcnt lgkmcnt(0)593; GCN-NEXT:    s_and_b32 s0, s0, 0xffff594; GCN-NEXT:    s_lshl_b32 s1, s1, 16595; GCN-NEXT:    s_or_b32 s0, s0, s1596; GCN-NEXT:    ;;#ASMSTART597; GCN-NEXT:    ; use s0598; GCN-NEXT:    ;;#ASMEND599; GCN-NEXT:    s_endpgm600;601; GFX9-LABEL: uniform_vec_f16_LL:602; GFX9:       ; %bb.0:603; GFX9-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24604; GFX9-NEXT:    s_waitcnt lgkmcnt(0)605; GFX9-NEXT:    s_load_dword s4, s[0:1], 0x0606; GFX9-NEXT:    s_load_dword s5, s[2:3], 0x0607; GFX9-NEXT:    s_waitcnt lgkmcnt(0)608; GFX9-NEXT:    s_pack_ll_b32_b16 s0, s4, s5609; GFX9-NEXT:    ;;#ASMSTART610; GFX9-NEXT:    ; use s0611; GFX9-NEXT:    ;;#ASMEND612; GFX9-NEXT:    s_endpgm613;614; GFX906-LABEL: uniform_vec_f16_LL:615; GFX906:       ; %bb.0:616; GFX906-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x24617; GFX906-NEXT:    s_waitcnt lgkmcnt(0)618; GFX906-NEXT:    s_load_dword s4, s[0:1], 0x0619; GFX906-NEXT:    s_load_dword s5, s[2:3], 0x0620; GFX906-NEXT:    s_waitcnt lgkmcnt(0)621; GFX906-NEXT:    s_pack_ll_b32_b16 s0, s4, s5622; GFX906-NEXT:    ;;#ASMSTART623; GFX906-NEXT:    ; use s0624; GFX906-NEXT:    ;;#ASMEND625; GFX906-NEXT:    s_endpgm626;627; GFX11-LABEL: uniform_vec_f16_LL:628; GFX11:       ; %bb.0:629; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x24630; GFX11-NEXT:    s_waitcnt lgkmcnt(0)631; GFX11-NEXT:    s_load_b32 s0, s[0:1], 0x0632; GFX11-NEXT:    s_load_b32 s1, s[2:3], 0x0633; GFX11-NEXT:    s_waitcnt lgkmcnt(0)634; GFX11-NEXT:    s_pack_ll_b32_b16 s0, s0, s1635; GFX11-NEXT:    ;;#ASMSTART636; GFX11-NEXT:    ; use s0637; GFX11-NEXT:    ;;#ASMEND638; GFX11-NEXT:    s_endpgm639  %val0 = load volatile i32, ptr addrspace(4) %in0640  %val1 = load volatile i32, ptr addrspace(4) %in1641  %lo.i = trunc i32 %val0 to i16642  %hi.i = trunc i32 %val1 to i16643  %lo = bitcast i16 %lo.i to half644  %hi = bitcast i16 %hi.i to half645  %vec.0 = insertelement <2 x half> poison, half %lo, i32 0646  %vec.1 = insertelement <2 x half> %vec.0, half %hi, i32 1647  %vec.i32 = bitcast <2 x half> %vec.1 to i32648 649  call void asm sideeffect "; use $0", "s"(i32 %vec.i32) #0650  ret void651}652 653define float @divergent_vec_f16_LL(half %a, half %b) {654; GCN-LABEL: divergent_vec_f16_LL:655; GCN:       ; %bb.0:656; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)657; GCN-NEXT:    v_cvt_f16_f32_e32 v0, v0658; GCN-NEXT:    v_cvt_f16_f32_e32 v1, v1659; GCN-NEXT:    v_lshlrev_b32_e32 v1, 16, v1660; GCN-NEXT:    v_or_b32_e32 v0, v0, v1661; GCN-NEXT:    s_setpc_b64 s[30:31]662;663; GFX9-LABEL: divergent_vec_f16_LL:664; GFX9:       ; %bb.0:665; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)666; GFX9-NEXT:    s_mov_b32 s4, 0x5040100667; GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4668; GFX9-NEXT:    s_setpc_b64 s[30:31]669;670; GFX906-LABEL: divergent_vec_f16_LL:671; GFX906:       ; %bb.0:672; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)673; GFX906-NEXT:    s_mov_b32 s4, 0x5040100674; GFX906-NEXT:    v_perm_b32 v0, v1, v0, s4675; GFX906-NEXT:    s_setpc_b64 s[30:31]676;677; GFX11-TRUE16-LABEL: divergent_vec_f16_LL:678; GFX11-TRUE16:       ; %bb.0:679; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)680; GFX11-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l681; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]682;683; GFX11-FAKE16-LABEL: divergent_vec_f16_LL:684; GFX11-FAKE16:       ; %bb.0:685; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)686; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100687; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]688  %tmp = insertelement <2 x half> poison, half %a, i32 0689  %vec = insertelement <2 x half> %tmp, half %b, i32 1690  %val = bitcast <2 x half> %vec to float691  ret float %val692}693 694define <2 x i16> @build_vec_v2i16_undeflo_divergent(ptr addrspace(3) %in) #0 {695; GCN-LABEL: build_vec_v2i16_undeflo_divergent:696; GCN:       ; %bb.0: ; %entry697; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)698; GCN-NEXT:    s_mov_b32 m0, -1699; GCN-NEXT:    ds_read_u16 v0, v0700; GCN-NEXT:    s_waitcnt lgkmcnt(0)701; GCN-NEXT:    s_setpc_b64 s[30:31]702;703; GFX9-LABEL: build_vec_v2i16_undeflo_divergent:704; GFX9:       ; %bb.0: ; %entry705; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)706; GFX9-NEXT:    ds_read_u16_d16 v0, v0707; GFX9-NEXT:    s_waitcnt lgkmcnt(0)708; GFX9-NEXT:    s_setpc_b64 s[30:31]709;710; GFX906-LABEL: build_vec_v2i16_undeflo_divergent:711; GFX906:       ; %bb.0: ; %entry712; GFX906-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)713; GFX906-NEXT:    ds_read_u16 v0, v0714; GFX906-NEXT:    s_waitcnt lgkmcnt(0)715; GFX906-NEXT:    s_setpc_b64 s[30:31]716;717; GFX11-LABEL: build_vec_v2i16_undeflo_divergent:718; GFX11:       ; %bb.0: ; %entry719; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)720; GFX11-NEXT:    ds_load_u16_d16 v0, v0721; GFX11-NEXT:    s_waitcnt lgkmcnt(0)722; GFX11-NEXT:    s_setpc_b64 s[30:31]723entry:724  %load = load i16, ptr addrspace(3) %in725  %build = insertelement <2 x i16> poison, i16 %load, i32 0726  ret <2 x i16> %build727}728 729define amdgpu_kernel void @build_vec_v2i16_undeflo_uniform(ptr addrspace(3) %in, ptr addrspace(1) %out) #0 {730; GCN-LABEL: build_vec_v2i16_undeflo_uniform:731; GCN:       ; %bb.0: ; %entry732; GCN-NEXT:    s_load_dword s2, s[4:5], 0x9733; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0xb734; GCN-NEXT:    s_waitcnt lgkmcnt(0)735; GCN-NEXT:    v_mov_b32_e32 v0, s2736; GCN-NEXT:    s_mov_b32 m0, -1737; GCN-NEXT:    ds_read_u16 v0, v0738; GCN-NEXT:    s_mov_b32 s3, 0xf000739; GCN-NEXT:    s_mov_b32 s2, -1740; GCN-NEXT:    s_waitcnt lgkmcnt(0)741; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0742; GCN-NEXT:    s_endpgm743;744; GFX9-LABEL: build_vec_v2i16_undeflo_uniform:745; GFX9:       ; %bb.0: ; %entry746; GFX9-NEXT:    s_load_dword s2, s[4:5], 0x24747; GFX9-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2c748; GFX9-NEXT:    v_mov_b32_e32 v1, 0749; GFX9-NEXT:    s_waitcnt lgkmcnt(0)750; GFX9-NEXT:    v_mov_b32_e32 v0, s2751; GFX9-NEXT:    ds_read_u16_d16 v0, v0752; GFX9-NEXT:    s_waitcnt lgkmcnt(0)753; GFX9-NEXT:    global_store_dword v1, v0, s[0:1]754; GFX9-NEXT:    s_endpgm755;756; GFX906-LABEL: build_vec_v2i16_undeflo_uniform:757; GFX906:       ; %bb.0: ; %entry758; GFX906-NEXT:    s_load_dword s2, s[4:5], 0x24759; GFX906-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2c760; GFX906-NEXT:    v_mov_b32_e32 v1, 0761; GFX906-NEXT:    s_waitcnt lgkmcnt(0)762; GFX906-NEXT:    v_mov_b32_e32 v0, s2763; GFX906-NEXT:    ds_read_u16 v0, v0764; GFX906-NEXT:    s_waitcnt lgkmcnt(0)765; GFX906-NEXT:    global_store_dword v1, v0, s[0:1]766; GFX906-NEXT:    s_endpgm767;768; GFX11-LABEL: build_vec_v2i16_undeflo_uniform:769; GFX11:       ; %bb.0: ; %entry770; GFX11-NEXT:    s_clause 0x1771; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x24772; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x2c773; GFX11-NEXT:    s_waitcnt lgkmcnt(0)774; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2775; GFX11-NEXT:    ds_load_u16_d16 v0, v0776; GFX11-NEXT:    s_waitcnt lgkmcnt(0)777; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1]778; GFX11-NEXT:    s_endpgm779entry:780  %load = load i16, ptr addrspace(3) %in781  %build = insertelement <2 x i16> poison, i16 %load, i32 0782  %result = bitcast <2 x i16> %build to i32783  store i32 %result, ptr addrspace(1) %out784  ret void785}786