491 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdhsa -mcpu=kaveri < %s | FileCheck -check-prefixes=GCN,GFX7 %s3; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdhsa -mcpu=fiji < %s | FileCheck -check-prefixes=GCN,GFX8 %s4; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s5 6; TODO: Merge with atomic_load_local.ll7 8define i8 @atomic_load_local_monotonic_i8(ptr addrspace(3) %ptr) {9; GFX7-LABEL: atomic_load_local_monotonic_i8:10; GFX7: ; %bb.0:11; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; GFX7-NEXT: s_mov_b32 m0, -113; GFX7-NEXT: ds_read_u8 v0, v014; GFX7-NEXT: s_waitcnt lgkmcnt(0)15; GFX7-NEXT: s_setpc_b64 s[30:31]16;17; GFX8-LABEL: atomic_load_local_monotonic_i8:18; GFX8: ; %bb.0:19; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)20; GFX8-NEXT: s_mov_b32 m0, -121; GFX8-NEXT: ds_read_u8 v0, v022; GFX8-NEXT: s_waitcnt lgkmcnt(0)23; GFX8-NEXT: s_setpc_b64 s[30:31]24;25; GFX9-LABEL: atomic_load_local_monotonic_i8:26; GFX9: ; %bb.0:27; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)28; GFX9-NEXT: ds_read_u8 v0, v029; GFX9-NEXT: s_waitcnt lgkmcnt(0)30; GFX9-NEXT: s_setpc_b64 s[30:31]31 %load = load atomic i8, ptr addrspace(3) %ptr monotonic, align 132 ret i8 %load33}34 35define i32 @atomic_load_local_monotonic_i8_zext_to_i32(ptr addrspace(3) %ptr) {36; GFX7-LABEL: atomic_load_local_monotonic_i8_zext_to_i32:37; GFX7: ; %bb.0:38; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GFX7-NEXT: s_mov_b32 m0, -140; GFX7-NEXT: ds_read_u8 v0, v041; GFX7-NEXT: s_waitcnt lgkmcnt(0)42; GFX7-NEXT: s_setpc_b64 s[30:31]43;44; GFX8-LABEL: atomic_load_local_monotonic_i8_zext_to_i32:45; GFX8: ; %bb.0:46; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)47; GFX8-NEXT: s_mov_b32 m0, -148; GFX8-NEXT: ds_read_u8 v0, v049; GFX8-NEXT: s_waitcnt lgkmcnt(0)50; GFX8-NEXT: s_setpc_b64 s[30:31]51;52; GFX9-LABEL: atomic_load_local_monotonic_i8_zext_to_i32:53; GFX9: ; %bb.0:54; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)55; GFX9-NEXT: ds_read_u8 v0, v056; GFX9-NEXT: s_waitcnt lgkmcnt(0)57; GFX9-NEXT: s_setpc_b64 s[30:31]58 %load = load atomic i8, ptr addrspace(3) %ptr monotonic, align 159 %ext = zext i8 %load to i3260 ret i32 %ext61}62 63define i32 @atomic_load_local_monotonic_i8_sext_to_i32(ptr addrspace(3) %ptr) {64; GFX7-LABEL: atomic_load_local_monotonic_i8_sext_to_i32:65; GFX7: ; %bb.0:66; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)67; GFX7-NEXT: s_mov_b32 m0, -168; GFX7-NEXT: ds_read_i8 v0, v069; GFX7-NEXT: s_waitcnt lgkmcnt(0)70; GFX7-NEXT: s_setpc_b64 s[30:31]71;72; GFX8-LABEL: atomic_load_local_monotonic_i8_sext_to_i32:73; GFX8: ; %bb.0:74; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)75; GFX8-NEXT: s_mov_b32 m0, -176; GFX8-NEXT: ds_read_i8 v0, v077; GFX8-NEXT: s_waitcnt lgkmcnt(0)78; GFX8-NEXT: s_setpc_b64 s[30:31]79;80; GFX9-LABEL: atomic_load_local_monotonic_i8_sext_to_i32:81; GFX9: ; %bb.0:82; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)83; GFX9-NEXT: ds_read_i8 v0, v084; GFX9-NEXT: s_waitcnt lgkmcnt(0)85; GFX9-NEXT: s_setpc_b64 s[30:31]86 %load = load atomic i8, ptr addrspace(3) %ptr monotonic, align 187 %ext = sext i8 %load to i3288 ret i32 %ext89}90 91define i16 @atomic_load_local_monotonic_i8_zext_to_i16(ptr addrspace(3) %ptr) {92; GFX7-LABEL: atomic_load_local_monotonic_i8_zext_to_i16:93; GFX7: ; %bb.0:94; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)95; GFX7-NEXT: s_mov_b32 m0, -196; GFX7-NEXT: ds_read_u8 v0, v097; GFX7-NEXT: s_waitcnt lgkmcnt(0)98; GFX7-NEXT: s_setpc_b64 s[30:31]99;100; GFX8-LABEL: atomic_load_local_monotonic_i8_zext_to_i16:101; GFX8: ; %bb.0:102; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)103; GFX8-NEXT: s_mov_b32 m0, -1104; GFX8-NEXT: ds_read_u8 v0, v0105; GFX8-NEXT: s_waitcnt lgkmcnt(0)106; GFX8-NEXT: s_setpc_b64 s[30:31]107;108; GFX9-LABEL: atomic_load_local_monotonic_i8_zext_to_i16:109; GFX9: ; %bb.0:110; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)111; GFX9-NEXT: ds_read_u8 v0, v0112; GFX9-NEXT: s_waitcnt lgkmcnt(0)113; GFX9-NEXT: s_setpc_b64 s[30:31]114 %load = load atomic i8, ptr addrspace(3) %ptr monotonic, align 1115 %ext = zext i8 %load to i16116 ret i16 %ext117}118 119define i16 @atomic_load_local_monotonic_i8_sext_to_i16(ptr addrspace(3) %ptr) {120; GFX7-LABEL: atomic_load_local_monotonic_i8_sext_to_i16:121; GFX7: ; %bb.0:122; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)123; GFX7-NEXT: s_mov_b32 m0, -1124; GFX7-NEXT: ds_read_i8 v0, v0125; GFX7-NEXT: s_waitcnt lgkmcnt(0)126; GFX7-NEXT: s_setpc_b64 s[30:31]127;128; GFX8-LABEL: atomic_load_local_monotonic_i8_sext_to_i16:129; GFX8: ; %bb.0:130; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)131; GFX8-NEXT: s_mov_b32 m0, -1132; GFX8-NEXT: ds_read_i8 v0, v0133; GFX8-NEXT: s_waitcnt lgkmcnt(0)134; GFX8-NEXT: s_setpc_b64 s[30:31]135;136; GFX9-LABEL: atomic_load_local_monotonic_i8_sext_to_i16:137; GFX9: ; %bb.0:138; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)139; GFX9-NEXT: ds_read_i8 v0, v0140; GFX9-NEXT: s_waitcnt lgkmcnt(0)141; GFX9-NEXT: s_setpc_b64 s[30:31]142 %load = load atomic i8, ptr addrspace(3) %ptr monotonic, align 1143 %ext = sext i8 %load to i16144 ret i16 %ext145}146 147define i16 @atomic_load_local_monotonic_i16(ptr addrspace(3) %ptr) {148; GFX7-LABEL: atomic_load_local_monotonic_i16:149; GFX7: ; %bb.0:150; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)151; GFX7-NEXT: s_mov_b32 m0, -1152; GFX7-NEXT: ds_read_u16 v0, v0153; GFX7-NEXT: s_waitcnt lgkmcnt(0)154; GFX7-NEXT: s_setpc_b64 s[30:31]155;156; GFX8-LABEL: atomic_load_local_monotonic_i16:157; GFX8: ; %bb.0:158; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)159; GFX8-NEXT: s_mov_b32 m0, -1160; GFX8-NEXT: ds_read_u16 v0, v0161; GFX8-NEXT: s_waitcnt lgkmcnt(0)162; GFX8-NEXT: s_setpc_b64 s[30:31]163;164; GFX9-LABEL: atomic_load_local_monotonic_i16:165; GFX9: ; %bb.0:166; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)167; GFX9-NEXT: ds_read_u16 v0, v0168; GFX9-NEXT: s_waitcnt lgkmcnt(0)169; GFX9-NEXT: s_setpc_b64 s[30:31]170 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2171 ret i16 %load172}173 174define i32 @atomic_load_local_monotonic_i16_zext_to_i32(ptr addrspace(3) %ptr) {175; GFX7-LABEL: atomic_load_local_monotonic_i16_zext_to_i32:176; GFX7: ; %bb.0:177; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)178; GFX7-NEXT: s_mov_b32 m0, -1179; GFX7-NEXT: ds_read_u16 v0, v0180; GFX7-NEXT: s_waitcnt lgkmcnt(0)181; GFX7-NEXT: s_setpc_b64 s[30:31]182;183; GFX8-LABEL: atomic_load_local_monotonic_i16_zext_to_i32:184; GFX8: ; %bb.0:185; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)186; GFX8-NEXT: s_mov_b32 m0, -1187; GFX8-NEXT: ds_read_u16 v0, v0188; GFX8-NEXT: s_waitcnt lgkmcnt(0)189; GFX8-NEXT: s_setpc_b64 s[30:31]190;191; GFX9-LABEL: atomic_load_local_monotonic_i16_zext_to_i32:192; GFX9: ; %bb.0:193; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)194; GFX9-NEXT: ds_read_u16 v0, v0195; GFX9-NEXT: s_waitcnt lgkmcnt(0)196; GFX9-NEXT: s_setpc_b64 s[30:31]197 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2198 %ext = zext i16 %load to i32199 ret i32 %ext200}201 202define i32 @atomic_load_local_monotonic_i16_sext_to_i32(ptr addrspace(3) %ptr) {203; GFX7-LABEL: atomic_load_local_monotonic_i16_sext_to_i32:204; GFX7: ; %bb.0:205; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)206; GFX7-NEXT: s_mov_b32 m0, -1207; GFX7-NEXT: ds_read_i16 v0, v0208; GFX7-NEXT: s_waitcnt lgkmcnt(0)209; GFX7-NEXT: s_setpc_b64 s[30:31]210;211; GFX8-LABEL: atomic_load_local_monotonic_i16_sext_to_i32:212; GFX8: ; %bb.0:213; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)214; GFX8-NEXT: s_mov_b32 m0, -1215; GFX8-NEXT: ds_read_i16 v0, v0216; GFX8-NEXT: s_waitcnt lgkmcnt(0)217; GFX8-NEXT: s_setpc_b64 s[30:31]218;219; GFX9-LABEL: atomic_load_local_monotonic_i16_sext_to_i32:220; GFX9: ; %bb.0:221; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)222; GFX9-NEXT: ds_read_i16 v0, v0223; GFX9-NEXT: s_waitcnt lgkmcnt(0)224; GFX9-NEXT: s_setpc_b64 s[30:31]225 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2226 %ext = sext i16 %load to i32227 ret i32 %ext228}229 230define half @atomic_load_local_monotonic_f16(ptr addrspace(3) %ptr) {231; GFX7-LABEL: atomic_load_local_monotonic_f16:232; GFX7: ; %bb.0:233; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)234; GFX7-NEXT: s_mov_b32 m0, -1235; GFX7-NEXT: ds_read_u16 v0, v0236; GFX7-NEXT: s_waitcnt lgkmcnt(0)237; GFX7-NEXT: s_setpc_b64 s[30:31]238;239; GFX8-LABEL: atomic_load_local_monotonic_f16:240; GFX8: ; %bb.0:241; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)242; GFX8-NEXT: s_mov_b32 m0, -1243; GFX8-NEXT: ds_read_u16 v0, v0244; GFX8-NEXT: s_waitcnt lgkmcnt(0)245; GFX8-NEXT: s_setpc_b64 s[30:31]246;247; GFX9-LABEL: atomic_load_local_monotonic_f16:248; GFX9: ; %bb.0:249; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)250; GFX9-NEXT: ds_read_u16 v0, v0251; GFX9-NEXT: s_waitcnt lgkmcnt(0)252; GFX9-NEXT: s_setpc_b64 s[30:31]253 %load = load atomic half, ptr addrspace(3) %ptr monotonic, align 2254 ret half %load255}256 257define bfloat @atomic_load_local_monotonic_bf16(ptr addrspace(3) %ptr) {258; GFX7-LABEL: atomic_load_local_monotonic_bf16:259; GFX7: ; %bb.0:260; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)261; GFX7-NEXT: s_mov_b32 m0, -1262; GFX7-NEXT: ds_read_u16 v0, v0263; GFX7-NEXT: s_waitcnt lgkmcnt(0)264; GFX7-NEXT: s_setpc_b64 s[30:31]265;266; GFX8-LABEL: atomic_load_local_monotonic_bf16:267; GFX8: ; %bb.0:268; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)269; GFX8-NEXT: s_mov_b32 m0, -1270; GFX8-NEXT: ds_read_u16 v0, v0271; GFX8-NEXT: s_waitcnt lgkmcnt(0)272; GFX8-NEXT: s_setpc_b64 s[30:31]273;274; GFX9-LABEL: atomic_load_local_monotonic_bf16:275; GFX9: ; %bb.0:276; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)277; GFX9-NEXT: ds_read_u16 v0, v0278; GFX9-NEXT: s_waitcnt lgkmcnt(0)279; GFX9-NEXT: s_setpc_b64 s[30:31]280 %load = load atomic bfloat, ptr addrspace(3) %ptr monotonic, align 2281 ret bfloat %load282}283 284define i32 @atomic_load_local_monotonic_f16_zext_to_i32(ptr addrspace(3) %ptr) {285; GFX7-LABEL: atomic_load_local_monotonic_f16_zext_to_i32:286; GFX7: ; %bb.0:287; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)288; GFX7-NEXT: s_mov_b32 m0, -1289; GFX7-NEXT: ds_read_u16 v0, v0290; GFX7-NEXT: s_waitcnt lgkmcnt(0)291; GFX7-NEXT: s_setpc_b64 s[30:31]292;293; GFX8-LABEL: atomic_load_local_monotonic_f16_zext_to_i32:294; GFX8: ; %bb.0:295; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)296; GFX8-NEXT: s_mov_b32 m0, -1297; GFX8-NEXT: ds_read_u16 v0, v0298; GFX8-NEXT: s_waitcnt lgkmcnt(0)299; GFX8-NEXT: s_setpc_b64 s[30:31]300;301; GFX9-LABEL: atomic_load_local_monotonic_f16_zext_to_i32:302; GFX9: ; %bb.0:303; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)304; GFX9-NEXT: ds_read_u16 v0, v0305; GFX9-NEXT: s_waitcnt lgkmcnt(0)306; GFX9-NEXT: s_setpc_b64 s[30:31]307 %load = load atomic half, ptr addrspace(3) %ptr monotonic, align 2308 %cast = bitcast half %load to i16309 %ext = zext i16 %cast to i32310 ret i32 %ext311}312 313define i32 @atomic_load_local_monotonic_bf16_zext_to_i32(ptr addrspace(3) %ptr) {314; GFX7-LABEL: atomic_load_local_monotonic_bf16_zext_to_i32:315; GFX7: ; %bb.0:316; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)317; GFX7-NEXT: s_mov_b32 m0, -1318; GFX7-NEXT: ds_read_u16 v0, v0319; GFX7-NEXT: s_waitcnt lgkmcnt(0)320; GFX7-NEXT: s_setpc_b64 s[30:31]321;322; GFX8-LABEL: atomic_load_local_monotonic_bf16_zext_to_i32:323; GFX8: ; %bb.0:324; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)325; GFX8-NEXT: s_mov_b32 m0, -1326; GFX8-NEXT: ds_read_u16 v0, v0327; GFX8-NEXT: s_waitcnt lgkmcnt(0)328; GFX8-NEXT: s_setpc_b64 s[30:31]329;330; GFX9-LABEL: atomic_load_local_monotonic_bf16_zext_to_i32:331; GFX9: ; %bb.0:332; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)333; GFX9-NEXT: ds_read_u16 v0, v0334; GFX9-NEXT: s_waitcnt lgkmcnt(0)335; GFX9-NEXT: s_setpc_b64 s[30:31]336 %load = load atomic bfloat, ptr addrspace(3) %ptr monotonic, align 2337 %cast = bitcast bfloat %load to i16338 %ext = zext i16 %cast to i32339 ret i32 %ext340}341 342define i32 @atomic_load_local_monotonic_i16_d16_hi_shift(ptr addrspace(3) %ptr) {343; GFX7-LABEL: atomic_load_local_monotonic_i16_d16_hi_shift:344; GFX7: ; %bb.0:345; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)346; GFX7-NEXT: s_mov_b32 m0, -1347; GFX7-NEXT: ds_read_u16 v0, v0348; GFX7-NEXT: s_waitcnt lgkmcnt(0)349; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0350; GFX7-NEXT: s_setpc_b64 s[30:31]351;352; GFX8-LABEL: atomic_load_local_monotonic_i16_d16_hi_shift:353; GFX8: ; %bb.0:354; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)355; GFX8-NEXT: s_mov_b32 m0, -1356; GFX8-NEXT: ds_read_u16 v0, v0357; GFX8-NEXT: s_waitcnt lgkmcnt(0)358; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0359; GFX8-NEXT: s_setpc_b64 s[30:31]360;361; GFX9-LABEL: atomic_load_local_monotonic_i16_d16_hi_shift:362; GFX9: ; %bb.0:363; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)364; GFX9-NEXT: ds_read_u16 v0, v0365; GFX9-NEXT: s_waitcnt lgkmcnt(0)366; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0367; GFX9-NEXT: s_setpc_b64 s[30:31]368 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2369 %ext = zext i16 %load to i32370 %shl = shl i32 %ext, 16371 ret i32 %shl372}373 374define <2 x i16> @atomic_load_local_monotonic_i16_d16_hi_vector_insert(ptr addrspace(3) %ptr, <2 x i16> %vec) {375; GFX7-LABEL: atomic_load_local_monotonic_i16_d16_hi_vector_insert:376; GFX7: ; %bb.0:377; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)378; GFX7-NEXT: s_mov_b32 m0, -1379; GFX7-NEXT: ds_read_u16 v0, v0380; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2381; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1382; GFX7-NEXT: v_or_b32_e32 v1, v2, v1383; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1384; GFX7-NEXT: s_waitcnt lgkmcnt(0)385; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0386; GFX7-NEXT: v_or_b32_e32 v0, v1, v0387; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v0388; GFX7-NEXT: s_setpc_b64 s[30:31]389;390; GFX8-LABEL: atomic_load_local_monotonic_i16_d16_hi_vector_insert:391; GFX8: ; %bb.0:392; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)393; GFX8-NEXT: s_mov_b32 m0, -1394; GFX8-NEXT: ds_read_u16 v0, v0395; GFX8-NEXT: s_waitcnt lgkmcnt(0)396; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0397; GFX8-NEXT: v_or_b32_sdwa v0, v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD398; GFX8-NEXT: s_setpc_b64 s[30:31]399;400; GFX9-LABEL: atomic_load_local_monotonic_i16_d16_hi_vector_insert:401; GFX9: ; %bb.0:402; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)403; GFX9-NEXT: ds_read_u16 v2, v0404; GFX9-NEXT: ds_read_u16_d16_hi v1, v0405; GFX9-NEXT: s_waitcnt lgkmcnt(0)406; GFX9-NEXT: v_mov_b32_e32 v0, v1407; GFX9-NEXT: s_setpc_b64 s[30:31]408 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2409 %insert = insertelement <2 x i16> %vec, i16 %load, i32 1410 ret <2 x i16> %insert411}412 413define i32 @atomic_load_local_monotonic_i16_d16_lo_or(ptr addrspace(3) %ptr, i16 %high) {414; GFX7-LABEL: atomic_load_local_monotonic_i16_d16_lo_or:415; GFX7: ; %bb.0:416; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)417; GFX7-NEXT: s_mov_b32 m0, -1418; GFX7-NEXT: ds_read_u16 v0, v0419; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1420; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1421; GFX7-NEXT: s_waitcnt lgkmcnt(0)422; GFX7-NEXT: v_or_b32_e32 v0, v1, v0423; GFX7-NEXT: s_setpc_b64 s[30:31]424;425; GFX8-LABEL: atomic_load_local_monotonic_i16_d16_lo_or:426; GFX8: ; %bb.0:427; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)428; GFX8-NEXT: s_mov_b32 m0, -1429; GFX8-NEXT: ds_read_u16 v0, v0430; GFX8-NEXT: v_and_b32_e32 v1, 0xffff, v1431; GFX8-NEXT: v_lshlrev_b32_e32 v1, 16, v1432; GFX8-NEXT: s_waitcnt lgkmcnt(0)433; GFX8-NEXT: v_or_b32_e32 v0, v1, v0434; GFX8-NEXT: s_setpc_b64 s[30:31]435;436; GFX9-LABEL: atomic_load_local_monotonic_i16_d16_lo_or:437; GFX9: ; %bb.0:438; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)439; GFX9-NEXT: ds_read_u16 v0, v0440; GFX9-NEXT: v_and_b32_e32 v1, 0xffff, v1441; GFX9-NEXT: s_waitcnt lgkmcnt(0)442; GFX9-NEXT: v_lshl_or_b32 v0, v1, 16, v0443; GFX9-NEXT: s_setpc_b64 s[30:31]444 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2445 %ext = zext i16 %load to i32446 %high.ext = zext i16 %high to i32447 %shl = shl i32 %high.ext, 16448 %or = or i32 %shl, %ext449 ret i32 %or450}451 452define <2 x i16> @atomic_load_local_monotonic_i16_d16_lo_vector_insert(ptr addrspace(3) %ptr, <2 x i16> %vec) {453; GFX7-LABEL: atomic_load_local_monotonic_i16_d16_lo_vector_insert:454; GFX7: ; %bb.0:455; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)456; GFX7-NEXT: s_mov_b32 m0, -1457; GFX7-NEXT: ds_read_u16 v0, v0458; GFX7-NEXT: v_lshlrev_b32_e32 v2, 16, v2459; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1460; GFX7-NEXT: v_or_b32_e32 v1, v2, v1461; GFX7-NEXT: v_and_b32_e32 v1, 0xffff0000, v1462; GFX7-NEXT: s_waitcnt lgkmcnt(0)463; GFX7-NEXT: v_or_b32_e32 v0, v1, v0464; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v0465; GFX7-NEXT: s_setpc_b64 s[30:31]466;467; GFX8-LABEL: atomic_load_local_monotonic_i16_d16_lo_vector_insert:468; GFX8: ; %bb.0:469; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)470; GFX8-NEXT: s_mov_b32 m0, -1471; GFX8-NEXT: ds_read_u16 v0, v0472; GFX8-NEXT: v_and_b32_e32 v1, 0xffff0000, v1473; GFX8-NEXT: s_waitcnt lgkmcnt(0)474; GFX8-NEXT: v_or_b32_e32 v0, v1, v0475; GFX8-NEXT: s_setpc_b64 s[30:31]476;477; GFX9-LABEL: atomic_load_local_monotonic_i16_d16_lo_vector_insert:478; GFX9: ; %bb.0:479; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)480; GFX9-NEXT: ds_read_u16 v2, v0481; GFX9-NEXT: ds_read_u16_d16 v1, v0482; GFX9-NEXT: s_waitcnt lgkmcnt(0)483; GFX9-NEXT: v_mov_b32_e32 v0, v1484; GFX9-NEXT: s_setpc_b64 s[30:31]485 %load = load atomic i16, ptr addrspace(3) %ptr monotonic, align 2486 %insert = insertelement <2 x i16> %vec, i16 %load, i32 0487 ret <2 x i16> %insert488}489;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:490; GCN: {{.*}}491