273 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 6define i8 @atomic_load_flat_monotonic_i8(ptr %ptr) {7; GCN-LABEL: atomic_load_flat_monotonic_i8:8; GCN: ; %bb.0:9; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10; GCN-NEXT: flat_load_ubyte v0, v[0:1] glc11; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)12; GCN-NEXT: s_setpc_b64 s[30:31]13 %load = load atomic i8, ptr %ptr monotonic, align 114 ret i8 %load15}16 17define i32 @atomic_load_flat_monotonic_i8_zext_to_i32(ptr %ptr) {18; GCN-LABEL: atomic_load_flat_monotonic_i8_zext_to_i32:19; GCN: ; %bb.0:20; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)21; GCN-NEXT: flat_load_ubyte v0, v[0:1] glc22; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)23; GCN-NEXT: s_setpc_b64 s[30:31]24 %load = load atomic i8, ptr %ptr monotonic, align 125 %ext = zext i8 %load to i3226 ret i32 %ext27}28 29define i32 @atomic_load_flat_monotonic_i8_sext_to_i32(ptr %ptr) {30; GCN-LABEL: atomic_load_flat_monotonic_i8_sext_to_i32:31; GCN: ; %bb.0:32; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)33; GCN-NEXT: flat_load_sbyte v0, v[0:1] glc34; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)35; GCN-NEXT: s_setpc_b64 s[30:31]36 %load = load atomic i8, ptr %ptr monotonic, align 137 %ext = sext i8 %load to i3238 ret i32 %ext39}40 41define i16 @atomic_load_flat_monotonic_i8_zext_to_i16(ptr %ptr) {42; GCN-LABEL: atomic_load_flat_monotonic_i8_zext_to_i16:43; GCN: ; %bb.0:44; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)45; GCN-NEXT: flat_load_ubyte v0, v[0:1] glc46; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)47; GCN-NEXT: s_setpc_b64 s[30:31]48 %load = load atomic i8, ptr %ptr monotonic, align 149 %ext = zext i8 %load to i1650 ret i16 %ext51}52 53define i16 @atomic_load_flat_monotonic_i8_sext_to_i16(ptr %ptr) {54; GCN-LABEL: atomic_load_flat_monotonic_i8_sext_to_i16:55; GCN: ; %bb.0:56; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)57; GCN-NEXT: flat_load_sbyte v0, v[0:1] glc58; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)59; GCN-NEXT: s_setpc_b64 s[30:31]60 %load = load atomic i8, ptr %ptr monotonic, align 161 %ext = sext i8 %load to i1662 ret i16 %ext63}64 65define i16 @atomic_load_flat_monotonic_i16(ptr %ptr) {66; GCN-LABEL: atomic_load_flat_monotonic_i16:67; GCN: ; %bb.0:68; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)69; GCN-NEXT: flat_load_ushort v0, v[0:1] glc70; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)71; GCN-NEXT: s_setpc_b64 s[30:31]72 %load = load atomic i16, ptr %ptr monotonic, align 273 ret i16 %load74}75 76define i32 @atomic_load_flat_monotonic_i16_zext_to_i32(ptr %ptr) {77; GCN-LABEL: atomic_load_flat_monotonic_i16_zext_to_i32:78; GCN: ; %bb.0:79; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; GCN-NEXT: flat_load_ushort v0, v[0:1] glc81; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)82; GCN-NEXT: s_setpc_b64 s[30:31]83 %load = load atomic i16, ptr %ptr monotonic, align 284 %ext = zext i16 %load to i3285 ret i32 %ext86}87 88define i32 @atomic_load_flat_monotonic_i16_sext_to_i32(ptr %ptr) {89; GCN-LABEL: atomic_load_flat_monotonic_i16_sext_to_i32:90; GCN: ; %bb.0:91; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)92; GCN-NEXT: flat_load_sshort v0, v[0:1] glc93; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)94; GCN-NEXT: s_setpc_b64 s[30:31]95 %load = load atomic i16, ptr %ptr monotonic, align 296 %ext = sext i16 %load to i3297 ret i32 %ext98}99 100define half @atomic_load_flat_monotonic_f16(ptr %ptr) {101; GCN-LABEL: atomic_load_flat_monotonic_f16:102; GCN: ; %bb.0:103; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)104; GCN-NEXT: flat_load_ushort v0, v[0:1] glc105; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)106; GCN-NEXT: s_setpc_b64 s[30:31]107 %load = load atomic half, ptr %ptr monotonic, align 2108 ret half %load109}110 111define bfloat @atomic_load_flat_monotonic_bf16(ptr %ptr) {112; GCN-LABEL: atomic_load_flat_monotonic_bf16:113; GCN: ; %bb.0:114; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)115; GCN-NEXT: flat_load_ushort v0, v[0:1] glc116; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)117; GCN-NEXT: s_setpc_b64 s[30:31]118 %load = load atomic bfloat, ptr %ptr monotonic, align 2119 ret bfloat %load120}121 122define i32 @atomic_load_flat_monotonic_f16_zext_to_i32(ptr %ptr) {123; GCN-LABEL: atomic_load_flat_monotonic_f16_zext_to_i32:124; GCN: ; %bb.0:125; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)126; GCN-NEXT: flat_load_ushort v0, v[0:1] glc127; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)128; GCN-NEXT: s_setpc_b64 s[30:31]129 %load = load atomic half, ptr %ptr monotonic, align 2130 %cast = bitcast half %load to i16131 %ext = zext i16 %cast to i32132 ret i32 %ext133}134 135define i32 @atomic_load_flat_monotonic_bf16_zext_to_i32(ptr %ptr) {136; GCN-LABEL: atomic_load_flat_monotonic_bf16_zext_to_i32:137; GCN: ; %bb.0:138; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)139; GCN-NEXT: flat_load_ushort v0, v[0:1] glc140; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)141; GCN-NEXT: s_setpc_b64 s[30:31]142 %load = load atomic bfloat, ptr %ptr monotonic, align 2143 %cast = bitcast bfloat %load to i16144 %ext = zext i16 %cast to i32145 ret i32 %ext146}147 148define i32 @atomic_load_flat_monotonic_i16_d16_hi_shift(ptr %ptr) {149; GCN-LABEL: atomic_load_flat_monotonic_i16_d16_hi_shift:150; GCN: ; %bb.0:151; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)152; GCN-NEXT: flat_load_ushort v0, v[0:1] glc153; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)154; GCN-NEXT: v_lshlrev_b32_e32 v0, 16, v0155; GCN-NEXT: s_setpc_b64 s[30:31]156 %load = load atomic i16, ptr %ptr monotonic, align 2157 %ext = zext i16 %load to i32158 %shl = shl i32 %ext, 16159 ret i32 %shl160}161 162define <2 x i16> @atomic_load_flat_monotonic_i16_d16_hi_vector_insert(ptr %ptr, <2 x i16> %vec) {163; GFX7-LABEL: atomic_load_flat_monotonic_i16_d16_hi_vector_insert:164; GFX7: ; %bb.0:165; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)166; GFX7-NEXT: flat_load_ushort v0, v[0:1] glc167; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v3168; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2169; GFX7-NEXT: v_or_b32_e32 v1, v1, v2170; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v1171; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)172; GFX7-NEXT: v_lshlrev_b32_e32 v0, 16, v0173; GFX7-NEXT: v_or_b32_e32 v0, v1, v0174; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v0175; GFX7-NEXT: s_setpc_b64 s[30:31]176;177; GFX8-LABEL: atomic_load_flat_monotonic_i16_d16_hi_vector_insert:178; GFX8: ; %bb.0:179; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)180; GFX8-NEXT: flat_load_ushort v0, v[0:1] glc181; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)182; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0183; GFX8-NEXT: v_or_b32_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD184; GFX8-NEXT: s_setpc_b64 s[30:31]185;186; GFX9-LABEL: atomic_load_flat_monotonic_i16_d16_hi_vector_insert:187; GFX9: ; %bb.0:188; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)189; GFX9-NEXT: flat_load_ushort v3, v[0:1] glc190; GFX9-NEXT: s_nop 0191; GFX9-NEXT: flat_load_short_d16_hi v2, v[0:1] glc192; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)193; GFX9-NEXT: v_mov_b32_e32 v0, v2194; GFX9-NEXT: s_setpc_b64 s[30:31]195 %load = load atomic i16, ptr %ptr monotonic, align 2196 %insert = insertelement <2 x i16> %vec, i16 %load, i32 1197 ret <2 x i16> %insert198}199 200define i32 @atomic_load_flat_monotonic_i16_d16_lo_or(ptr %ptr, i16 %high) {201; GFX7-LABEL: atomic_load_flat_monotonic_i16_d16_lo_or:202; GFX7: ; %bb.0:203; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)204; GFX7-NEXT: flat_load_ushort v0, v[0:1] glc205; GFX7-NEXT: v_and_b32_e32 v1, 0xffff, v2206; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v1207; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)208; GFX7-NEXT: v_or_b32_e32 v0, v1, v0209; GFX7-NEXT: s_setpc_b64 s[30:31]210;211; GFX8-LABEL: atomic_load_flat_monotonic_i16_d16_lo_or:212; GFX8: ; %bb.0:213; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)214; GFX8-NEXT: flat_load_ushort v0, v[0:1] glc215; GFX8-NEXT: v_and_b32_e32 v1, 0xffff, v2216; GFX8-NEXT: v_lshlrev_b32_e32 v1, 16, v1217; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)218; GFX8-NEXT: v_or_b32_e32 v0, v1, v0219; GFX8-NEXT: s_setpc_b64 s[30:31]220;221; GFX9-LABEL: atomic_load_flat_monotonic_i16_d16_lo_or:222; GFX9: ; %bb.0:223; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)224; GFX9-NEXT: flat_load_ushort v0, v[0:1] glc225; GFX9-NEXT: v_and_b32_e32 v1, 0xffff, v2226; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)227; GFX9-NEXT: v_lshl_or_b32 v0, v1, 16, v0228; GFX9-NEXT: s_setpc_b64 s[30:31]229 %load = load atomic i16, ptr %ptr monotonic, align 2230 %ext = zext i16 %load to i32231 %high.ext = zext i16 %high to i32232 %shl = shl i32 %high.ext, 16233 %or = or i32 %shl, %ext234 ret i32 %or235}236 237define <2 x i16> @atomic_load_flat_monotonic_i16_d16_lo_vector_insert(ptr %ptr, <2 x i16> %vec) {238; GFX7-LABEL: atomic_load_flat_monotonic_i16_d16_lo_vector_insert:239; GFX7: ; %bb.0:240; GFX7-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GFX7-NEXT: flat_load_ushort v0, v[0:1] glc242; GFX7-NEXT: v_lshlrev_b32_e32 v1, 16, v3243; GFX7-NEXT: v_and_b32_e32 v2, 0xffff, v2244; GFX7-NEXT: v_or_b32_e32 v1, v1, v2245; GFX7-NEXT: v_and_b32_e32 v1, 0xffff0000, v1246; GFX7-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)247; GFX7-NEXT: v_or_b32_e32 v0, v1, v0248; GFX7-NEXT: v_lshrrev_b32_e32 v1, 16, v0249; GFX7-NEXT: s_setpc_b64 s[30:31]250;251; GFX8-LABEL: atomic_load_flat_monotonic_i16_d16_lo_vector_insert:252; GFX8: ; %bb.0:253; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)254; GFX8-NEXT: flat_load_ushort v0, v[0:1] glc255; GFX8-NEXT: v_and_b32_e32 v1, 0xffff0000, v2256; GFX8-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)257; GFX8-NEXT: v_or_b32_e32 v0, v1, v0258; GFX8-NEXT: s_setpc_b64 s[30:31]259;260; GFX9-LABEL: atomic_load_flat_monotonic_i16_d16_lo_vector_insert:261; GFX9: ; %bb.0:262; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)263; GFX9-NEXT: flat_load_ushort v3, v[0:1] glc264; GFX9-NEXT: s_nop 0265; GFX9-NEXT: flat_load_short_d16 v2, v[0:1] glc266; GFX9-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)267; GFX9-NEXT: v_mov_b32_e32 v0, v2268; GFX9-NEXT: s_setpc_b64 s[30:31]269 %load = load atomic i16, ptr %ptr monotonic, align 2270 %insert = insertelement <2 x i16> %vec, i16 %load, i32 0271 ret <2 x i16> %insert272}273