1044 lines · plain
1; RUN: llc -mtriple=amdgcn-- < %s | FileCheck -allow-deprecated-dag-overlap -check-prefixes=GCN,SICIVI,FUNC %s2; RUN: llc -mtriple=amdgcn-- -mcpu=tonga -mattr=-enable-ds128 < %s | FileCheck -allow-deprecated-dag-overlap -check-prefixes=GCN,SICIVI,FUNC %s3; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 -mattr=-enable-ds128 < %s | FileCheck -allow-deprecated-dag-overlap -check-prefixes=GCN,GFX9,FUNC %s4; RUN: llc -mtriple=r600-- -mcpu=redwood < %s | FileCheck -allow-deprecated-dag-overlap -check-prefix=EG -check-prefix=FUNC %s5 6; Testing for ds_read/write_b1287; RUN: llc -mtriple=amdgcn -mcpu=tonga -mattr=+enable-ds128 < %s | FileCheck -allow-deprecated-dag-overlap -check-prefixes=CIVI,FUNC %s8; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -mattr=+enable-ds128 < %s | FileCheck -allow-deprecated-dag-overlap -check-prefixes=CIVI,FUNC %s9 10; FUNC-LABEL: {{^}}local_load_i8:11; GCN-NOT: s_wqm_b6412; SICIVI: s_mov_b32 m013; GFX9-NOT: m014; GCN: ds_read_u815 16; EG: LDS_UBYTE_READ_RET17define amdgpu_kernel void @local_load_i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {18entry:19 %ld = load i8, ptr addrspace(3) %in20 store i8 %ld, ptr addrspace(3) %out21 ret void22}23 24; FUNC-LABEL: {{^}}local_load_v2i8:25; GCN-NOT: s_wqm_b6426; SICIVI: s_mov_b32 m027; GFX9-NOT: m028; GCN: ds_read_u1629 30; EG: LDS_USHORT_READ_RET31define amdgpu_kernel void @local_load_v2i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {32entry:33 %ld = load <2 x i8>, ptr addrspace(3) %in34 store <2 x i8> %ld, ptr addrspace(3) %out35 ret void36}37 38; FUNC-LABEL: {{^}}local_load_v3i8:39; GFX9-NOT: m040; GCN: ds_read_b3241 42; EG: DS_READ_RET43define amdgpu_kernel void @local_load_v3i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {44entry:45 %ld = load <3 x i8>, ptr addrspace(3) %in46 store <3 x i8> %ld, ptr addrspace(3) %out47 ret void48}49 50; FUNC-LABEL: {{^}}local_load_v4i8:51; GFX9-NOT: m052; GCN: ds_read_b3253 54; EG: LDS_READ_RET55define amdgpu_kernel void @local_load_v4i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {56entry:57 %ld = load <4 x i8>, ptr addrspace(3) %in58 store <4 x i8> %ld, ptr addrspace(3) %out59 ret void60}61 62; FUNC-LABEL: {{^}}local_load_v8i8:63; GFX9-NOT: m064; GCN: ds_read_b6465 66; EG: LDS_READ_RET67; EG: LDS_READ_RET68define amdgpu_kernel void @local_load_v8i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {69entry:70 %ld = load <8 x i8>, ptr addrspace(3) %in71 store <8 x i8> %ld, ptr addrspace(3) %out72 ret void73}74 75; FUNC-LABEL: {{^}}local_load_v16i8:76; GFX9-NOT: m077; GCN: ds_read2_b64 v[[[LO:[0-9]+]]:[[HI:[0-9]+]]], v{{[0-9]+}} offset1:1{{$}}78; GCN: ds_write2_b64 v{{[0-9]+}}, v[[[LO]]:{{[0-9]+}}], v[{{[0-9]+}}:[[HI]]] offset1:1{{$}}79 80; EG: LDS_READ_RET81; EG: LDS_READ_RET82; EG: LDS_READ_RET83; EG: LDS_READ_RET84define amdgpu_kernel void @local_load_v16i8(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {85entry:86 %ld = load <16 x i8>, ptr addrspace(3) %in87 store <16 x i8> %ld, ptr addrspace(3) %out88 ret void89}90 91; FUNC-LABEL: {{^}}local_zextload_i8_to_i32:92; GFX9-NOT: m093; GCN-NOT: s_wqm_b6494; SICIVI: s_mov_b32 m095; GCN: ds_read_u896 97; EG: LDS_UBYTE_READ_RET98define amdgpu_kernel void @local_zextload_i8_to_i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {99 %a = load i8, ptr addrspace(3) %in100 %ext = zext i8 %a to i32101 store i32 %ext, ptr addrspace(3) %out102 ret void103}104 105; FUNC-LABEL: {{^}}local_sextload_i8_to_i32:106; GCN-NOT: s_wqm_b64107; GFX9-NOT: m0108; SICIVI: s_mov_b32 m0109; GCN: ds_read_i8110 111; EG: LDS_UBYTE_READ_RET112; EG: BFE_INT113define amdgpu_kernel void @local_sextload_i8_to_i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {114 %ld = load i8, ptr addrspace(3) %in115 %ext = sext i8 %ld to i32116 store i32 %ext, ptr addrspace(3) %out117 ret void118}119 120; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i32:121 122; EG: LDS_UBYTE_READ_RET123define amdgpu_kernel void @local_zextload_v1i8_to_v1i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {124 %load = load <1 x i8>, ptr addrspace(3) %in125 %ext = zext <1 x i8> %load to <1 x i32>126 store <1 x i32> %ext, ptr addrspace(3) %out127 ret void128}129 130; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i32:131; GFX9-NOT: m0132 133; EG: LDS_UBYTE_READ_RET134; EG: BFE_INT135define amdgpu_kernel void @local_sextload_v1i8_to_v1i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {136 %load = load <1 x i8>, ptr addrspace(3) %in137 %ext = sext <1 x i8> %load to <1 x i32>138 store <1 x i32> %ext, ptr addrspace(3) %out139 ret void140}141 142; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i32:143; GFX9-NOT: m0144; GCN: ds_read_u16145 146; EG: LDS_USHORT_READ_RET147define amdgpu_kernel void @local_zextload_v2i8_to_v2i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {148 %load = load <2 x i8>, ptr addrspace(3) %in149 %ext = zext <2 x i8> %load to <2 x i32>150 store <2 x i32> %ext, ptr addrspace(3) %out151 ret void152}153 154; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i32:155; GCN-NOT: s_wqm_b64156; GFX9-NOT: m0157; SICIVI: s_mov_b32 m0158; GCN: ds_read_u16159; FIXME: Need to optimize this sequence to avoid extra shift on VI.160; t23: i16 = srl t39, Constant:i32<8>161; t31: i32 = any_extend t23162; t33: i32 = sign_extend_inreg t31, ValueType:ch:i8163 164; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 8, 8165; GCN-DAG: v_bfe_i32 v{{[0-9]+}}, v{{[0-9]+}}, 0, 8166 167; EG: LDS_USHORT_READ_RET168; EG-DAG: BFE_INT169; EG-DAG: BFE_INT170define amdgpu_kernel void @local_sextload_v2i8_to_v2i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {171 %load = load <2 x i8>, ptr addrspace(3) %in172 %ext = sext <2 x i8> %load to <2 x i32>173 store <2 x i32> %ext, ptr addrspace(3) %out174 ret void175}176 177; FUNC-LABEL: {{^}}local_zextload_v3i8_to_v3i32:178; GFX9-NOT: m0179; GCN: ds_read_b32180 181; GCN-DAG: v_bfe_u32 v{{[0-9]+}}, v{{[0-9]+}}, 8, 8182; GCN-DAG: v_bfe_u32 v{{[0-9]+}}, v{{[0-9]+}}, 16, 8183; GCN-DAG: v_and_b32_e32 v{{[0-9]+}}, 0xff,184 185; EG: LDS_READ_RET186define amdgpu_kernel void @local_zextload_v3i8_to_v3i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {187entry:188 %ld = load <3 x i8>, ptr addrspace(3) %in189 %ext = zext <3 x i8> %ld to <3 x i32>190 store <3 x i32> %ext, ptr addrspace(3) %out191 ret void192}193 194; FUNC-LABEL: {{^}}local_sextload_v3i8_to_v3i32:195; GCN-NOT: s_wqm_b64196; GFX9-NOT: m0197; SICIVI: s_mov_b32 m0198; GCN: ds_read_b32199 200; GCN-DAG: v_bfe_i32201; GCN-DAG: v_bfe_i32202; GCN-DAG: v_bfe_i32203; GCN-DAG: v_bfe_i32204 205; SI-DAG: ds_write_b64206; SI-DAG: ds_write_b32207; CIVI-DAG: ds_write_b96208; GFX9-DAG: ds_write_b96209 210; EG: LDS_READ_RET211; EG-DAG: BFE_INT212; EG-DAG: BFE_INT213; EG-DAG: BFE_INT214define amdgpu_kernel void @local_sextload_v3i8_to_v3i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {215entry:216 %ld = load <3 x i8>, ptr addrspace(3) %in217 %ext = sext <3 x i8> %ld to <3 x i32>218 store <3 x i32> %ext, ptr addrspace(3) %out219 ret void220}221 222; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i32:223; GCN-NOT: s_wqm_b64224; GFX9-NOT: m0225; SICIVI: s_mov_b32 m0226; GCN: ds_read_b32227 228; EG: LDS_READ_RET229; EG-DAG: BFE_UINT230; EG-DAG: BFE_UINT231; EG-DAG: BFE_UINT232define amdgpu_kernel void @local_zextload_v4i8_to_v4i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {233 %load = load <4 x i8>, ptr addrspace(3) %in234 %ext = zext <4 x i8> %load to <4 x i32>235 store <4 x i32> %ext, ptr addrspace(3) %out236 ret void237}238 239; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i32:240; GCN-NOT: s_wqm_b64241; GFX9-NOT: m0242; SICIVI: s_mov_b32 m0243; GCN: ds_read_b32244 245; EG-DAG: LDS_READ_RET246; EG-DAG: BFE_INT247; EG-DAG: BFE_INT248; EG-DAG: BFE_INT249; EG-DAG: BFE_INT250define amdgpu_kernel void @local_sextload_v4i8_to_v4i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {251 %load = load <4 x i8>, ptr addrspace(3) %in252 %ext = sext <4 x i8> %load to <4 x i32>253 store <4 x i32> %ext, ptr addrspace(3) %out254 ret void255}256 257; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i32:258; SICIVI: s_mov_b32 m0259; GFX9-NOT: m0260 261; EG-DAG: LDS_READ_RET262; EG-DAG: LDS_READ_RET263; EG-DAG: BFE_UINT264; EG-DAG: BFE_UINT265; EG-DAG: BFE_UINT266; EG-DAG: BFE_UINT267; EG-DAG: BFE_UINT268; EG-DAG: BFE_UINT269define amdgpu_kernel void @local_zextload_v8i8_to_v8i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {270 %load = load <8 x i8>, ptr addrspace(3) %in271 %ext = zext <8 x i8> %load to <8 x i32>272 store <8 x i32> %ext, ptr addrspace(3) %out273 ret void274}275 276; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i32:277; SICIVI: s_mov_b32 m0278; GFX9-NOT: m0279 280; EG-DAG: LDS_READ_RET281; EG-DAG: LDS_READ_RET282; EG-DAG: BFE_INT283; EG-DAG: BFE_INT284; EG-DAG: BFE_INT285; EG-DAG: BFE_INT286; EG-DAG: BFE_INT287; EG-DAG: BFE_INT288; EG-DAG: BFE_INT289; EG-DAG: BFE_INT290define amdgpu_kernel void @local_sextload_v8i8_to_v8i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {291 %load = load <8 x i8>, ptr addrspace(3) %in292 %ext = sext <8 x i8> %load to <8 x i32>293 store <8 x i32> %ext, ptr addrspace(3) %out294 ret void295}296 297; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i32:298; SICIVI: s_mov_b32 m0299; GFX9-NOT: m0300 301; EG-DAG: LDS_READ_RET302; EG-DAG: LDS_READ_RET303; EG-DAG: LDS_READ_RET304; EG-DAG: LDS_READ_RET305; EG-DAG: BFE_UINT306; EG-DAG: BFE_UINT307; EG-DAG: BFE_UINT308; EG-DAG: BFE_UINT309; EG-DAG: BFE_UINT310; EG-DAG: BFE_UINT311; EG-DAG: BFE_UINT312; EG-DAG: BFE_UINT313; EG-DAG: BFE_UINT314; EG-DAG: BFE_UINT315; EG-DAG: BFE_UINT316; EG-DAG: BFE_UINT317define amdgpu_kernel void @local_zextload_v16i8_to_v16i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {318 %load = load <16 x i8>, ptr addrspace(3) %in319 %ext = zext <16 x i8> %load to <16 x i32>320 store <16 x i32> %ext, ptr addrspace(3) %out321 ret void322}323 324; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i32:325; SICIVI: s_mov_b32 m0326; GFX9-NOT: m0327 328; EG-DAG: LDS_READ_RET329; EG-DAG: LDS_READ_RET330; EG-DAG: LDS_READ_RET331; EG-DAG: LDS_READ_RET332; EG-DAG: BFE_INT333; EG-DAG: BFE_INT334; EG-DAG: BFE_INT335; EG-DAG: BFE_INT336; EG-DAG: BFE_INT337; EG-DAG: BFE_INT338; EG-DAG: BFE_INT339; EG-DAG: BFE_INT340; EG-DAG: BFE_INT341; EG-DAG: BFE_INT342; EG-DAG: BFE_INT343; EG-DAG: BFE_INT344; EG-DAG: BFE_INT345; EG-DAG: BFE_INT346; EG-DAG: BFE_INT347; EG-DAG: BFE_INT348define amdgpu_kernel void @local_sextload_v16i8_to_v16i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {349 %load = load <16 x i8>, ptr addrspace(3) %in350 %ext = sext <16 x i8> %load to <16 x i32>351 store <16 x i32> %ext, ptr addrspace(3) %out352 ret void353}354 355; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i32:356; SICIVI: s_mov_b32 m0357; GFX9-NOT: m0358 359; EG-DAG: LDS_READ_RET360; EG-DAG: LDS_READ_RET361; EG-DAG: LDS_READ_RET362; EG-DAG: LDS_READ_RET363; EG-DAG: LDS_READ_RET364; EG-DAG: LDS_READ_RET365; EG-DAG: LDS_READ_RET366; EG-DAG: LDS_READ_RET367define amdgpu_kernel void @local_zextload_v32i8_to_v32i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {368 %load = load <32 x i8>, ptr addrspace(3) %in369 %ext = zext <32 x i8> %load to <32 x i32>370 store <32 x i32> %ext, ptr addrspace(3) %out371 ret void372}373 374; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i32:375; SICIVI: s_mov_b32 m0376; GFX9-NOT: m0377 378; EG-DAG: LDS_READ_RET379; EG-DAG: LDS_READ_RET380; EG-DAG: LDS_READ_RET381; EG-DAG: LDS_READ_RET382; EG-DAG: LDS_READ_RET383; EG-DAG: LDS_READ_RET384; EG-DAG: LDS_READ_RET385; EG-DAG: LDS_READ_RET386define amdgpu_kernel void @local_sextload_v32i8_to_v32i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {387 %load = load <32 x i8>, ptr addrspace(3) %in388 %ext = sext <32 x i8> %load to <32 x i32>389 store <32 x i32> %ext, ptr addrspace(3) %out390 ret void391}392 393; FUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i32:394; SICIVI: s_mov_b32 m0395; GFX9-NOT: m0396 397; EG-DAG: LDS_READ_RET398; EG-DAG: LDS_READ_RET399; EG-DAG: LDS_READ_RET400; EG-DAG: LDS_READ_RET401; EG-DAG: LDS_READ_RET402; EG-DAG: LDS_READ_RET403; EG-DAG: LDS_READ_RET404; EG-DAG: LDS_READ_RET405; EG-DAG: LDS_READ_RET406; EG-DAG: LDS_READ_RET407; EG-DAG: LDS_READ_RET408; EG-DAG: LDS_READ_RET409; EG-DAG: LDS_READ_RET410; EG-DAG: LDS_READ_RET411; EG-DAG: LDS_READ_RET412; EG-DAG: LDS_READ_RET413define amdgpu_kernel void @local_zextload_v64i8_to_v64i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {414 %load = load <64 x i8>, ptr addrspace(3) %in415 %ext = zext <64 x i8> %load to <64 x i32>416 store <64 x i32> %ext, ptr addrspace(3) %out417 ret void418}419 420; FUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i32:421; SICIVI: s_mov_b32 m0422; GFX9-NOT: m0423 424; EG-DAG: LDS_READ_RET425; EG-DAG: LDS_READ_RET426; EG-DAG: LDS_READ_RET427; EG-DAG: LDS_READ_RET428; EG-DAG: LDS_READ_RET429; EG-DAG: LDS_READ_RET430; EG-DAG: LDS_READ_RET431; EG-DAG: LDS_READ_RET432; EG-DAG: LDS_READ_RET433; EG-DAG: LDS_READ_RET434; EG-DAG: LDS_READ_RET435; EG-DAG: LDS_READ_RET436; EG-DAG: LDS_READ_RET437; EG-DAG: LDS_READ_RET438; EG-DAG: LDS_READ_RET439; EG-DAG: LDS_READ_RET440define amdgpu_kernel void @local_sextload_v64i8_to_v64i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {441 %load = load <64 x i8>, ptr addrspace(3) %in442 %ext = sext <64 x i8> %load to <64 x i32>443 store <64 x i32> %ext, ptr addrspace(3) %out444 ret void445}446 447; FUNC-LABEL: {{^}}local_zextload_i8_to_i64:448; SICIVI: s_mov_b32 m0449; GFX9-NOT: m0450 451; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}452; GCN-DAG: ds_read_u8 v[[LO:[0-9]+]],453; GCN: ds_write_b64 v{{[0-9]+}}, v[[[LO]]:[[HI]]]454 455; EG: LDS_UBYTE_READ_RET456; EG: MOV {{.*}}, literal457; EG: 0.0458define amdgpu_kernel void @local_zextload_i8_to_i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {459 %a = load i8, ptr addrspace(3) %in460 %ext = zext i8 %a to i64461 store i64 %ext, ptr addrspace(3) %out462 ret void463}464 465; FUNC-LABEL: {{^}}local_sextload_i8_to_i64:466; SICIVI: s_mov_b32 m0467; GFX9-NOT: m0468 469; GCN: ds_read_i8 v[[LO:[0-9]+]],470; GCN: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]]471 472; GCN: ds_write_b64 v{{[0-9]+}}, v[[[LO]]:[[HI]]]473 474; EG: LDS_UBYTE_READ_RET475; EG: ASHR476; TODO: why not 7?477; EG: 31478define amdgpu_kernel void @local_sextload_i8_to_i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {479 %a = load i8, ptr addrspace(3) %in480 %ext = sext i8 %a to i64481 store i64 %ext, ptr addrspace(3) %out482 ret void483}484 485; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i64:486; SICIVI: s_mov_b32 m0487; GFX9-NOT: m0488 489; EG: LDS_UBYTE_READ_RET490; EG: MOV {{.*}}, literal491; TODO: merge?492; EG: 0.0493define amdgpu_kernel void @local_zextload_v1i8_to_v1i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {494 %load = load <1 x i8>, ptr addrspace(3) %in495 %ext = zext <1 x i8> %load to <1 x i64>496 store <1 x i64> %ext, ptr addrspace(3) %out497 ret void498}499 500; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i64:501; SICIVI: s_mov_b32 m0502; GFX9-NOT: m0503 504; EG: LDS_UBYTE_READ_RET505; EG: ASHR506; TODO: why not 7?507; EG: 31508define amdgpu_kernel void @local_sextload_v1i8_to_v1i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {509 %load = load <1 x i8>, ptr addrspace(3) %in510 %ext = sext <1 x i8> %load to <1 x i64>511 store <1 x i64> %ext, ptr addrspace(3) %out512 ret void513}514 515; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i64:516; SICIVI: s_mov_b32 m0517; GFX9-NOT: m0518 519; EG: LDS_USHORT_READ_RET520define amdgpu_kernel void @local_zextload_v2i8_to_v2i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {521 %load = load <2 x i8>, ptr addrspace(3) %in522 %ext = zext <2 x i8> %load to <2 x i64>523 store <2 x i64> %ext, ptr addrspace(3) %out524 ret void525}526 527; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i64:528; SICIVI: s_mov_b32 m0529; GFX9-NOT: m0530 531; EG: LDS_USHORT_READ_RET532; EG: BFE_INT533; EG: BFE_INT534define amdgpu_kernel void @local_sextload_v2i8_to_v2i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {535 %load = load <2 x i8>, ptr addrspace(3) %in536 %ext = sext <2 x i8> %load to <2 x i64>537 store <2 x i64> %ext, ptr addrspace(3) %out538 ret void539}540 541; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i64:542; SICIVI: s_mov_b32 m0543; GFX9-NOT: m0544 545; EG: LDS_READ_RET546define amdgpu_kernel void @local_zextload_v4i8_to_v4i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {547 %load = load <4 x i8>, ptr addrspace(3) %in548 %ext = zext <4 x i8> %load to <4 x i64>549 store <4 x i64> %ext, ptr addrspace(3) %out550 ret void551}552 553; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i64:554; SICIVI: s_mov_b32 m0555; GFX9-NOT: m0556 557; EG: LDS_READ_RET558define amdgpu_kernel void @local_sextload_v4i8_to_v4i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {559 %load = load <4 x i8>, ptr addrspace(3) %in560 %ext = sext <4 x i8> %load to <4 x i64>561 store <4 x i64> %ext, ptr addrspace(3) %out562 ret void563}564 565; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i64:566; SICIVI: s_mov_b32 m0567; GFX9-NOT: m0568 569; EG: LDS_READ_RET570; EG: LDS_READ_RET571define amdgpu_kernel void @local_zextload_v8i8_to_v8i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {572 %load = load <8 x i8>, ptr addrspace(3) %in573 %ext = zext <8 x i8> %load to <8 x i64>574 store <8 x i64> %ext, ptr addrspace(3) %out575 ret void576}577 578; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i64:579; SICIVI: s_mov_b32 m0580; GFX9-NOT: m0581 582; EG: LDS_READ_RET583; EG: LDS_READ_RET584; EG-DAG: ASHR585; EG-DAG: ASHR586; EG-DAG: BFE_INT587; EG-DAG: BFE_INT588; EG-DAG: BFE_INT589; EG-DAG: BFE_INT590; EG-DAG: BFE_INT591; EG-DAG: BFE_INT592; EG-DAG: BFE_INT593define amdgpu_kernel void @local_sextload_v8i8_to_v8i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {594 %load = load <8 x i8>, ptr addrspace(3) %in595 %ext = sext <8 x i8> %load to <8 x i64>596 store <8 x i64> %ext, ptr addrspace(3) %out597 ret void598}599 600; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i64:601; SICIVI: s_mov_b32 m0602; GFX9-NOT: m0603 604; EG: LDS_READ_RET605; EG: LDS_READ_RET606; EG: LDS_READ_RET607; EG: LDS_READ_RET608define amdgpu_kernel void @local_zextload_v16i8_to_v16i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {609 %load = load <16 x i8>, ptr addrspace(3) %in610 %ext = zext <16 x i8> %load to <16 x i64>611 store <16 x i64> %ext, ptr addrspace(3) %out612 ret void613}614 615; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i64:616; SICIVI: s_mov_b32 m0617; GFX9-NOT: m0618 619; EG: LDS_READ_RET620; EG: LDS_READ_RET621; EG: LDS_READ_RET622; EG: LDS_READ_RET623define amdgpu_kernel void @local_sextload_v16i8_to_v16i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {624 %load = load <16 x i8>, ptr addrspace(3) %in625 %ext = sext <16 x i8> %load to <16 x i64>626 store <16 x i64> %ext, ptr addrspace(3) %out627 ret void628}629 630; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i64:631; SICIVI: s_mov_b32 m0632; GFX9-NOT: m0633 634; EG: LDS_READ_RET635; EG: LDS_READ_RET636; EG: LDS_READ_RET637; EG: LDS_READ_RET638; EG: LDS_READ_RET639; EG: LDS_READ_RET640; EG: LDS_READ_RET641; EG: LDS_READ_RET642define amdgpu_kernel void @local_zextload_v32i8_to_v32i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {643 %load = load <32 x i8>, ptr addrspace(3) %in644 %ext = zext <32 x i8> %load to <32 x i64>645 store <32 x i64> %ext, ptr addrspace(3) %out646 ret void647}648 649; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i64:650; SICIVI: s_mov_b32 m0651; GFX9-NOT: m0652 653; EG: LDS_READ_RET654; EG: LDS_READ_RET655; EG: LDS_READ_RET656; EG: LDS_READ_RET657; EG: LDS_READ_RET658; EG: LDS_READ_RET659; EG: LDS_READ_RET660; EG: LDS_READ_RET661define amdgpu_kernel void @local_sextload_v32i8_to_v32i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {662 %load = load <32 x i8>, ptr addrspace(3) %in663 %ext = sext <32 x i8> %load to <32 x i64>664 store <32 x i64> %ext, ptr addrspace(3) %out665 ret void666}667 668; XFUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i64:669; define amdgpu_kernel void @local_zextload_v64i8_to_v64i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {670; %load = load <64 x i8>, ptr addrspace(3) %in671; %ext = zext <64 x i8> %load to <64 x i64>672; store <64 x i64> %ext, ptr addrspace(3) %out673; ret void674; }675 676; XFUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i64:677; define amdgpu_kernel void @local_sextload_v64i8_to_v64i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {678; %load = load <64 x i8>, ptr addrspace(3) %in679; %ext = sext <64 x i8> %load to <64 x i64>680; store <64 x i64> %ext, ptr addrspace(3) %out681; ret void682; }683 684; FUNC-LABEL: {{^}}local_zextload_i8_to_i16:685; SICIVI: s_mov_b32 m0686; GFX9-NOT: m0687; GCN: ds_read_u8 v[[VAL:[0-9]+]],688; GCN: ds_write_b16 v[[VAL:[0-9]+]]689 690; EG: LDS_UBYTE_READ_RET691; EG: LDS_SHORT_WRITE692define amdgpu_kernel void @local_zextload_i8_to_i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {693 %a = load i8, ptr addrspace(3) %in694 %ext = zext i8 %a to i16695 store i16 %ext, ptr addrspace(3) %out696 ret void697}698 699; FUNC-LABEL: {{^}}local_sextload_i8_to_i16:700; SICIVI: s_mov_b32 m0701; GFX9-NOT: m0702; GCN: ds_read_i8 v[[VAL:[0-9]+]],703; GCN: ds_write_b16 v{{[0-9]+}}, v[[VAL]]704 705; EG: LDS_UBYTE_READ_RET706; EG: BFE_INT707; EG: LDS_SHORT_WRITE708define amdgpu_kernel void @local_sextload_i8_to_i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {709 %a = load i8, ptr addrspace(3) %in710 %ext = sext i8 %a to i16711 store i16 %ext, ptr addrspace(3) %out712 ret void713}714 715; FUNC-LABEL: {{^}}local_zextload_v1i8_to_v1i16:716; SICIVI: s_mov_b32 m0717; GFX9-NOT: m0718 719; EG: LDS_UBYTE_READ_RET720; EG: LDS_SHORT_WRITE721define amdgpu_kernel void @local_zextload_v1i8_to_v1i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {722 %load = load <1 x i8>, ptr addrspace(3) %in723 %ext = zext <1 x i8> %load to <1 x i16>724 store <1 x i16> %ext, ptr addrspace(3) %out725 ret void726}727 728; FUNC-LABEL: {{^}}local_sextload_v1i8_to_v1i16:729; SICIVI: s_mov_b32 m0730; GFX9-NOT: m0731 732; EG: LDS_UBYTE_READ_RET733; EG: BFE_INT734; EG: LDS_SHORT_WRITE735define amdgpu_kernel void @local_sextload_v1i8_to_v1i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {736 %load = load <1 x i8>, ptr addrspace(3) %in737 %ext = sext <1 x i8> %load to <1 x i16>738 store <1 x i16> %ext, ptr addrspace(3) %out739 ret void740}741 742; FUNC-LABEL: {{^}}local_zextload_v2i8_to_v2i16:743; SICIVI: s_mov_b32 m0744; GFX9-NOT: m0745 746; EG: LDS_USHORT_READ_RET747; EG: LDS_WRITE748define amdgpu_kernel void @local_zextload_v2i8_to_v2i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {749 %load = load <2 x i8>, ptr addrspace(3) %in750 %ext = zext <2 x i8> %load to <2 x i16>751 store <2 x i16> %ext, ptr addrspace(3) %out752 ret void753}754 755; FUNC-LABEL: {{^}}local_sextload_v2i8_to_v2i16:756; SICIVI: s_mov_b32 m0757; GFX9-NOT: m0758 759; EG: LDS_USHORT_READ_RET760; EG: BFE_INT761; EG: BFE_INT762; EG: LDS_WRITE763define amdgpu_kernel void @local_sextload_v2i8_to_v2i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {764 %load = load <2 x i8>, ptr addrspace(3) %in765 %ext = sext <2 x i8> %load to <2 x i16>766 store <2 x i16> %ext, ptr addrspace(3) %out767 ret void768}769 770; FUNC-LABEL: {{^}}local_zextload_v4i8_to_v4i16:771; SICIVI: s_mov_b32 m0772; GFX9-NOT: m0773 774; EG: LDS_READ_RET775; EG: LDS_WRITE776; EG: LDS_WRITE777define amdgpu_kernel void @local_zextload_v4i8_to_v4i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {778 %load = load <4 x i8>, ptr addrspace(3) %in779 %ext = zext <4 x i8> %load to <4 x i16>780 store <4 x i16> %ext, ptr addrspace(3) %out781 ret void782}783 784; FUNC-LABEL: {{^}}local_sextload_v4i8_to_v4i16:785; SICIVI: s_mov_b32 m0786; GFX9-NOT: m0787 788; EG: LDS_READ_RET789; TODO: these do LSHR + BFE_INT, instead of just BFE_INT/ASHR790; EG-DAG: BFE_INT791; EG-DAG: BFE_INT792; EG-DAG: BFE_INT793; EG-DAG: BFE_INT794; EG: LDS_WRITE795; EG: LDS_WRITE796define amdgpu_kernel void @local_sextload_v4i8_to_v4i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {797 %load = load <4 x i8>, ptr addrspace(3) %in798 %ext = sext <4 x i8> %load to <4 x i16>799 store <4 x i16> %ext, ptr addrspace(3) %out800 ret void801}802 803; FUNC-LABEL: {{^}}local_zextload_v8i8_to_v8i16:804; SICIVI: s_mov_b32 m0805; GFX9-NOT: m0806 807; EG: LDS_READ_RET808; EG: LDS_READ_RET809; EG: LDS_WRITE810; EG: LDS_WRITE811; EG: LDS_WRITE812; EG: LDS_WRITE813define amdgpu_kernel void @local_zextload_v8i8_to_v8i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {814 %load = load <8 x i8>, ptr addrspace(3) %in815 %ext = zext <8 x i8> %load to <8 x i16>816 store <8 x i16> %ext, ptr addrspace(3) %out817 ret void818}819 820; FUNC-LABEL: {{^}}local_sextload_v8i8_to_v8i16:821; SICIVI: s_mov_b32 m0822; GFX9-NOT: m0823 824; EG: LDS_READ_RET825; EG: LDS_READ_RET826; TODO: these do LSHR + BFE_INT, instead of just BFE_INT/ASHR827; EG-DAG: BFE_INT828; EG-DAG: BFE_INT829; EG-DAG: BFE_INT830; EG-DAG: BFE_INT831; EG-DAG: BFE_INT832; EG-DAG: BFE_INT833; EG-DAG: BFE_INT834; EG-DAG: BFE_INT835; EG: LDS_WRITE836; EG: LDS_WRITE837; EG: LDS_WRITE838; EG: LDS_WRITE839define amdgpu_kernel void @local_sextload_v8i8_to_v8i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {840 %load = load <8 x i8>, ptr addrspace(3) %in841 %ext = sext <8 x i8> %load to <8 x i16>842 store <8 x i16> %ext, ptr addrspace(3) %out843 ret void844}845 846; FUNC-LABEL: {{^}}local_zextload_v16i8_to_v16i16:847; SICIVI: s_mov_b32 m0848; GFX9-NOT: m0849 850; EG: LDS_READ_RET851; EG: LDS_READ_RET852; EG: LDS_READ_RET853; EG: LDS_READ_RET854; EG: LDS_WRITE855; EG: LDS_WRITE856; EG: LDS_WRITE857; EG: LDS_WRITE858; EG: LDS_WRITE859; EG: LDS_WRITE860; EG: LDS_WRITE861; EG: LDS_WRITE862define amdgpu_kernel void @local_zextload_v16i8_to_v16i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {863 %load = load <16 x i8>, ptr addrspace(3) %in864 %ext = zext <16 x i8> %load to <16 x i16>865 store <16 x i16> %ext, ptr addrspace(3) %out866 ret void867}868 869; FUNC-LABEL: {{^}}local_sextload_v16i8_to_v16i16:870; SICIVI: s_mov_b32 m0871; GFX9-NOT: m0872 873; EG: LDS_READ_RET874; EG: LDS_READ_RET875; EG: LDS_READ_RET876; EG: LDS_READ_RET877; TODO: these do LSHR + BFE_INT, instead of just BFE_INT/ASHR878; EG-DAG: BFE_INT879; EG-DAG: BFE_INT880; EG-DAG: BFE_INT881; EG-DAG: BFE_INT882; EG-DAG: BFE_INT883; EG-DAG: BFE_INT884; EG-DAG: BFE_INT885; EG-DAG: BFE_INT886; EG-DAG: BFE_INT887; EG-DAG: BFE_INT888; EG-DAG: BFE_INT889; EG-DAG: BFE_INT890; EG-DAG: BFE_INT891; EG-DAG: BFE_INT892; EG-DAG: BFE_INT893; EG-DAG: BFE_INT894; EG: LDS_WRITE895; EG: LDS_WRITE896; EG: LDS_WRITE897; EG: LDS_WRITE898; EG: LDS_WRITE899; EG: LDS_WRITE900; EG: LDS_WRITE901; EG: LDS_WRITE902define amdgpu_kernel void @local_sextload_v16i8_to_v16i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {903 %load = load <16 x i8>, ptr addrspace(3) %in904 %ext = sext <16 x i8> %load to <16 x i16>905 store <16 x i16> %ext, ptr addrspace(3) %out906 ret void907}908 909; FUNC-LABEL: {{^}}local_zextload_v32i8_to_v32i16:910; SICIVI: s_mov_b32 m0911; GFX9-NOT: m0912 913; EG: LDS_READ_RET914; EG: LDS_READ_RET915; EG: LDS_READ_RET916; EG: LDS_READ_RET917; EG: LDS_READ_RET918; EG: LDS_READ_RET919; EG: LDS_READ_RET920; EG: LDS_READ_RET921; EG: LDS_WRITE922; EG: LDS_WRITE923; EG: LDS_WRITE924; EG: LDS_WRITE925; EG: LDS_WRITE926; EG: LDS_WRITE927; EG: LDS_WRITE928; EG: LDS_WRITE929; EG: LDS_WRITE930; EG: LDS_WRITE931; EG: LDS_WRITE932; EG: LDS_WRITE933; EG: LDS_WRITE934; EG: LDS_WRITE935; EG: LDS_WRITE936; EG: LDS_WRITE937define amdgpu_kernel void @local_zextload_v32i8_to_v32i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {938 %load = load <32 x i8>, ptr addrspace(3) %in939 %ext = zext <32 x i8> %load to <32 x i16>940 store <32 x i16> %ext, ptr addrspace(3) %out941 ret void942}943 944; FUNC-LABEL: {{^}}local_sextload_v32i8_to_v32i16:945; SICIVI: s_mov_b32 m0946; GFX9-NOT: m0947 948; EG: LDS_READ_RET949; EG: LDS_READ_RET950; EG: LDS_READ_RET951; EG: LDS_READ_RET952; EG: LDS_READ_RET953; EG: LDS_READ_RET954; EG: LDS_READ_RET955; EG: LDS_READ_RET956; TODO: these do LSHR + BFE_INT, instead of just BFE_INT/ASHR957; EG-DAG: BFE_INT958; EG-DAG: BFE_INT959; EG-DAG: BFE_INT960; EG-DAG: BFE_INT961; EG-DAG: BFE_INT962; EG-DAG: BFE_INT963; EG-DAG: BFE_INT964; EG-DAG: BFE_INT965; EG-DAG: BFE_INT966; EG-DAG: BFE_INT967; EG-DAG: BFE_INT968; EG-DAG: BFE_INT969; EG-DAG: BFE_INT970; EG-DAG: BFE_INT971; EG-DAG: BFE_INT972; EG-DAG: BFE_INT973; EG-DAG: BFE_INT974; EG-DAG: BFE_INT975; EG-DAG: BFE_INT976; EG-DAG: BFE_INT977; EG-DAG: BFE_INT978; EG-DAG: BFE_INT979; EG-DAG: BFE_INT980; EG-DAG: BFE_INT981; EG-DAG: BFE_INT982; EG-DAG: BFE_INT983; EG-DAG: BFE_INT984; EG-DAG: BFE_INT985; EG: LDS_WRITE986; EG: LDS_WRITE987; EG: LDS_WRITE988; EG: LDS_WRITE989; EG: LDS_WRITE990; EG: LDS_WRITE991; EG: LDS_WRITE992; EG: LDS_WRITE993; EG: LDS_WRITE994; EG: LDS_WRITE995; EG: LDS_WRITE996; EG: LDS_WRITE997; EG: LDS_WRITE998; EG: LDS_WRITE999; EG: LDS_WRITE1000; EG: LDS_WRITE1001define amdgpu_kernel void @local_sextload_v32i8_to_v32i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {1002 %load = load <32 x i8>, ptr addrspace(3) %in1003 %ext = sext <32 x i8> %load to <32 x i16>1004 store <32 x i16> %ext, ptr addrspace(3) %out1005 ret void1006}1007 1008; XFUNC-LABEL: {{^}}local_zextload_v64i8_to_v64i16:1009; define amdgpu_kernel void @local_zextload_v64i8_to_v64i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {1010; %load = load <64 x i8>, ptr addrspace(3) %in1011; %ext = zext <64 x i8> %load to <64 x i16>1012; store <64 x i16> %ext, ptr addrspace(3) %out1013; ret void1014; }1015 1016; XFUNC-LABEL: {{^}}local_sextload_v64i8_to_v64i16:1017; define amdgpu_kernel void @local_sextload_v64i8_to_v64i16(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {1018; %load = load <64 x i8>, ptr addrspace(3) %in1019; %ext = sext <64 x i8> %load to <64 x i16>1020; store <64 x i16> %ext, ptr addrspace(3) %out1021; ret void1022; }1023 1024; Tests if ds_read/write_b128 gets generated for the 16 byte aligned load.1025; FUNC-LABEL: {{^}}local_v16i8_to_128:1026 1027; SI-NOT: ds_read_b1281028; SI-NOT: ds_write_b1281029 1030; CIVI: ds_read_b1281031; CIVI: ds_write_b1281032 1033; EG: LDS_READ_RET1034; EG: LDS_READ_RET1035; EG: LDS_READ_RET1036; EG: LDS_READ_RET1037define amdgpu_kernel void @local_v16i8_to_128(ptr addrspace(3) %out, ptr addrspace(3) %in) {1038 %ld = load <16 x i8>, ptr addrspace(3) %in, align 161039 store <16 x i8> %ld, ptr addrspace(3) %out, align 161040 ret void1041}1042 1043attributes #0 = { nounwind }1044