1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s 2; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-HSA -check-prefix=FUNC %s 3; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=GCN-NOHSA -check-prefix=FUNC %s 4; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 5 6; FUNC-LABEL: {{^}}constant_load_i16: 7; GCN-NOHSA: buffer_load_ushort v{{[0-9]+}} 8; GCN-HSA: flat_load_ushort 9 10; EG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 11define void @constant_load_i16(i16 addrspace(1)* %out, i16 addrspace(2)* %in) { 12entry: 13 %ld = load i16, i16 addrspace(2)* %in 14 store i16 %ld, i16 addrspace(1)* %out 15 ret void 16} 17 18; FUNC-LABEL: {{^}}constant_load_v2i16: 19; GCN: s_load_dword s 20 21; EG: VTX_READ_32 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 22define void @constant_load_v2i16(<2 x i16> addrspace(1)* %out, <2 x i16> addrspace(2)* %in) { 23entry: 24 %ld = load <2 x i16>, <2 x i16> addrspace(2)* %in 25 store <2 x i16> %ld, <2 x i16> addrspace(1)* %out 26 ret void 27} 28 29; FUNC-LABEL: {{^}}constant_load_v3i16: 30; GCN: s_load_dwordx2 s 31 32; EG-DAG: VTX_READ_32 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 33; EG-DAG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 4, #1 34define void @constant_load_v3i16(<3 x i16> addrspace(1)* %out, <3 x i16> addrspace(2)* %in) { 35entry: 36 %ld = load <3 x i16>, <3 x i16> addrspace(2)* %in 37 store <3 x i16> %ld, <3 x i16> addrspace(1)* %out 38 ret void 39} 40 41; FUNC-LABEL: {{^}}constant_load_v4i16: 42; GCN: s_load_dwordx2 43 44; EG: VTX_READ_64 T{{[0-9]+}}.XY, T{{[0-9]+}}.X, 0, #1 45define void @constant_load_v4i16(<4 x i16> addrspace(1)* %out, <4 x i16> addrspace(2)* %in) { 46entry: 47 %ld = load <4 x i16>, <4 x i16> addrspace(2)* %in 48 store <4 x i16> %ld, <4 x i16> addrspace(1)* %out 49 ret void 50} 51 52; FUNC-LABEL: {{^}}constant_load_v8i16: 53; GCN: s_load_dwordx4 54 55; EG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 56define void @constant_load_v8i16(<8 x i16> addrspace(1)* %out, <8 x i16> addrspace(2)* %in) { 57entry: 58 %ld = load <8 x i16>, <8 x i16> addrspace(2)* %in 59 store <8 x i16> %ld, <8 x i16> addrspace(1)* %out 60 ret void 61} 62 63; FUNC-LABEL: {{^}}constant_load_v16i16: 64; GCN: s_load_dwordx8 65 66; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 67; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 16, #1 68define void @constant_load_v16i16(<16 x i16> addrspace(1)* %out, <16 x i16> addrspace(2)* %in) { 69entry: 70 %ld = load <16 x i16>, <16 x i16> addrspace(2)* %in 71 store <16 x i16> %ld, <16 x i16> addrspace(1)* %out 72 ret void 73} 74 75; FUNC-LABEL: {{^}}constant_zextload_i16_to_i32: 76; GCN-NOHSA: buffer_load_ushort 77; GCN-NOHSA: buffer_store_dword 78 79; GCN-HSA: flat_load_ushort 80; GCN-HSA: flat_store_dword 81 82; EG: VTX_READ_16 T{{[0-9]+\.X, T[0-9]+\.X}}, 0, #1 83define void @constant_zextload_i16_to_i32(i32 addrspace(1)* %out, i16 addrspace(2)* %in) #0 { 84 %a = load i16, i16 addrspace(2)* %in 85 %ext = zext i16 %a to i32 86 store i32 %ext, i32 addrspace(1)* %out 87 ret void 88} 89 90; FUNC-LABEL: {{^}}constant_sextload_i16_to_i32: 91; GCN-NOHSA: buffer_load_sshort 92; GCN-NOHSA: buffer_store_dword 93 94; GCN-HSA: flat_load_sshort 95; GCN-HSA: flat_store_dword 96 97; EG: VTX_READ_16 [[DST:T[0-9]\.[XYZW]]], [[DST]], 0, #1 98; EG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST]], 0.0, literal 99; EG: 16 100define void @constant_sextload_i16_to_i32(i32 addrspace(1)* %out, i16 addrspace(2)* %in) #0 { 101 %a = load i16, i16 addrspace(2)* %in 102 %ext = sext i16 %a to i32 103 store i32 %ext, i32 addrspace(1)* %out 104 ret void 105} 106 107; FUNC-LABEL: {{^}}constant_zextload_v1i16_to_v1i32: 108; GCN-NOHSA: buffer_load_ushort 109; GCN-HSA: flat_load_ushort 110 111; EG: VTX_READ_16 T{{[0-9]+\.X, T[0-9]+\.X}}, 0, #1 112define void @constant_zextload_v1i16_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i16> addrspace(2)* %in) #0 { 113 %load = load <1 x i16>, <1 x i16> addrspace(2)* %in 114 %ext = zext <1 x i16> %load to <1 x i32> 115 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 116 ret void 117} 118 119; FUNC-LABEL: {{^}}constant_sextload_v1i16_to_v1i32: 120; GCN-NOHSA: buffer_load_sshort 121; GCN-HSA: flat_load_sshort 122 123; EG: VTX_READ_16 [[DST:T[0-9]\.[XYZW]]], [[DST]], 0, #1 124; EG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, [[DST]], 0.0, literal 125; EG: 16 126define void @constant_sextload_v1i16_to_v1i32(<1 x i32> addrspace(1)* %out, <1 x i16> addrspace(2)* %in) #0 { 127 %load = load <1 x i16>, <1 x i16> addrspace(2)* %in 128 %ext = sext <1 x i16> %load to <1 x i32> 129 store <1 x i32> %ext, <1 x i32> addrspace(1)* %out 130 ret void 131} 132 133; FUNC-LABEL: {{^}}constant_zextload_v2i16_to_v2i32: 134; GCN: s_load_dword s 135; GCN-DAG: s_and_b32 s{{[0-9]+}}, s{{[0-9]+}}, 0xffff{{$}} 136; GCN-DAG: s_lshr_b32 s{{[0-9]+}}, s{{[0-9]+}}, 16 137 138; v2i16 is naturally 4 byte aligned 139; EG: VTX_READ_32 [[DST:T[0-9]\.[XYZW]]], [[DST]], 0, #1 140; TODO: This should use DST, but for some there are redundant MOVs 141; EG: BFE_UINT {{[* ]*}}T{{[0-9].[XYZW]}}, {{PV.[XYZW]}}, literal 142; EG: 16 143define void @constant_zextload_v2i16_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i16> addrspace(2)* %in) #0 { 144 %load = load <2 x i16>, <2 x i16> addrspace(2)* %in 145 %ext = zext <2 x i16> %load to <2 x i32> 146 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 147 ret void 148} 149 150; FUNC-LABEL: {{^}}constant_sextload_v2i16_to_v2i32: 151; GCN: s_load_dword s 152; GCN-DAG: s_ashr_i32 153; GCN-DAG: s_sext_i32_i16 154 155; v2i16 is naturally 4 byte aligned 156; EG: VTX_READ_32 [[DST:T[0-9]\.[XYZW]]], [[DST]], 0, #1 157; TODO: These should use DST, but for some there are redundant MOVs 158; TODO: We should also use ASHR instead of LSHR + BFE 159; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{PV.[XYZW]}}, 0.0, literal 160; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{PV.[XYZW]}}, 0.0, literal 161; EG-DAG: 16 162; EG-DAG: 16 163define void @constant_sextload_v2i16_to_v2i32(<2 x i32> addrspace(1)* %out, <2 x i16> addrspace(2)* %in) #0 { 164 %load = load <2 x i16>, <2 x i16> addrspace(2)* %in 165 %ext = sext <2 x i16> %load to <2 x i32> 166 store <2 x i32> %ext, <2 x i32> addrspace(1)* %out 167 ret void 168} 169 170; FUNC-LABEL: {{^}}constant_constant_zextload_v3i16_to_v3i32: 171; GCN: s_load_dwordx2 172 173; v3i16 is naturally 8 byte aligned 174; EG-DAG: VTX_READ_32 [[DST_HI:T[0-9]\.[XYZW]]], [[DST_HI]], 0, #1 175; EG-DAG: VTX_READ_16 [[DST_LO:T[0-9]\.[XYZW]]], [[DST_LO]], 4, #1 176; TODO: This should use DST, but for some there are redundant MOVs 177; EG: LSHR {{[* ]*}}{{T[0-9].[XYZW]}}, {{T[0-9].[XYZW]}}, literal 178; EG: 16 179define void @constant_constant_zextload_v3i16_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i16> addrspace(2)* %in) { 180entry: 181 %ld = load <3 x i16>, <3 x i16> addrspace(2)* %in 182 %ext = zext <3 x i16> %ld to <3 x i32> 183 store <3 x i32> %ext, <3 x i32> addrspace(1)* %out 184 ret void 185} 186 187; FUNC-LABEL: {{^}}constant_constant_sextload_v3i16_to_v3i32: 188; GCN: s_load_dwordx2 189 190; v3i16 is naturally 8 byte aligned 191; EG-DAG: VTX_READ_32 [[DST_HI:T[0-9]\.[XYZW]]], [[DST_HI]], 0, #1 192; EG-DAG: VTX_READ_16 [[DST_LO:T[0-9]\.[XYZW]]], [[DST_LO]], 4, #1 193; TODO: These should use DST, but for some there are redundant MOVs 194; EG-DAG: ASHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{PV.[XYZW]}}, literal 195; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{T[0-9].[XYZW]}}, 0.0, literal 196; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{T[0-9].[XYZW]}}, 0.0, literal 197; EG-DAG: 16 198; EG-DAG: 16 199define void @constant_constant_sextload_v3i16_to_v3i32(<3 x i32> addrspace(1)* %out, <3 x i16> addrspace(2)* %in) { 200entry: 201 %ld = load <3 x i16>, <3 x i16> addrspace(2)* %in 202 %ext = sext <3 x i16> %ld to <3 x i32> 203 store <3 x i32> %ext, <3 x i32> addrspace(1)* %out 204 ret void 205} 206 207; FUNC-LABEL: {{^}}constant_constant_zextload_v4i16_to_v4i32: 208; GCN: s_load_dwordx2 209; GCN-DAG: s_and_b32 210; GCN-DAG: s_lshr_b32 211 212; v4i16 is naturally 8 byte aligned 213; EG: VTX_READ_64 [[DST:T[0-9]\.XY]], {{T[0-9].[XYZW]}}, 0, #1 214; TODO: These should use DST, but for some there are redundant MOVs 215; EG-DAG: BFE_UINT {{[* ]*}}T{{[0-9].[XYZW]}}, {{PV.[XYZW]}}, literal 216; EG-DAG: 16 217; EG-DAG: BFE_UINT {{[* ]*}}T{{[0-9].[XYZW]}}, {{T[0-9].[XYZW]}}, literal 218; EG-DAG: AND_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{T[0-9].[XYZW]}}, literal 219; EG-DAG: 16 220define void @constant_constant_zextload_v4i16_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i16> addrspace(2)* %in) #0 { 221 %load = load <4 x i16>, <4 x i16> addrspace(2)* %in 222 %ext = zext <4 x i16> %load to <4 x i32> 223 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 224 ret void 225} 226 227; FUNC-LABEL: {{^}}constant_sextload_v4i16_to_v4i32: 228; GCN: s_load_dwordx2 229; GCN-DAG: s_ashr_i32 230; GCN-DAG: s_sext_i32_i16 231 232; v4i16 is naturally 8 byte aligned 233; EG: VTX_READ_64 [[DST:T[0-9]\.XY]], {{T[0-9].[XYZW]}}, 0, #1 234; TODO: These should use DST, but for some there are redundant MOVs 235; TODO: We should use ASHR instead of LSHR + BFE 236; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 237; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 238; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 239; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 240; EG-DAG: 16 241; EG-DAG: 16 242; EG-DAG: 16 243; EG-DAG: 16 244define void @constant_sextload_v4i16_to_v4i32(<4 x i32> addrspace(1)* %out, <4 x i16> addrspace(2)* %in) #0 { 245 %load = load <4 x i16>, <4 x i16> addrspace(2)* %in 246 %ext = sext <4 x i16> %load to <4 x i32> 247 store <4 x i32> %ext, <4 x i32> addrspace(1)* %out 248 ret void 249} 250 251; FUNC-LABEL: {{^}}constant_zextload_v8i16_to_v8i32: 252; GCN: s_load_dwordx4 253; GCN-DAG: s_and_b32 254; GCN-DAG: s_lshr_b32 255 256; v8i16 is naturally 16 byte aligned 257; EG: VTX_READ_128 [[DST:T[0-9]\.XYZW]], {{T[0-9].[XYZW]}}, 0, #1 258; TODO: These should use DST, but for some there are redundant MOVs 259; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 260; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 261; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 262; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 263; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 264; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 265; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 266; EG-DAG: LSHR {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, literal 267; EG-DAG: 16 268; EG-DAG: 16 269; EG-DAG: 16 270; EG-DAG: 16 271; EG-DAG: 16 272; EG-DAG: 16 273; EG-DAG: 16 274; EG-DAG: 16 275define void @constant_zextload_v8i16_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i16> addrspace(2)* %in) #0 { 276 %load = load <8 x i16>, <8 x i16> addrspace(2)* %in 277 %ext = zext <8 x i16> %load to <8 x i32> 278 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 279 ret void 280} 281 282; FUNC-LABEL: {{^}}constant_sextload_v8i16_to_v8i32: 283; GCN: s_load_dwordx4 284; GCN-DAG: s_ashr_i32 285; GCN-DAG: s_sext_i32_i16 286 287; v8i16 is naturally 16 byte aligned 288; EG: VTX_READ_128 [[DST:T[0-9]\.XYZW]], {{T[0-9].[XYZW]}}, 0, #1 289; TODO: These should use DST, but for some there are redundant MOVs 290; TODO: We should use ASHR instead of LSHR + BFE 291; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 292; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 293; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 294; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 295; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 296; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 297; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 298; EG-DAG: BFE_INT {{[* ]*}}T{{[0-9].[XYZW]}}, {{.*}}, 0.0, literal 299; EG-DAG: 16 300; EG-DAG: 16 301; EG-DAG: 16 302; EG-DAG: 16 303; EG-DAG: 16 304; EG-DAG: 16 305; EG-DAG: 16 306; EG-DAG: 16 307define void @constant_sextload_v8i16_to_v8i32(<8 x i32> addrspace(1)* %out, <8 x i16> addrspace(2)* %in) #0 { 308 %load = load <8 x i16>, <8 x i16> addrspace(2)* %in 309 %ext = sext <8 x i16> %load to <8 x i32> 310 store <8 x i32> %ext, <8 x i32> addrspace(1)* %out 311 ret void 312} 313 314; FUNC-LABEL: {{^}}constant_zextload_v16i16_to_v16i32: 315; GCN: s_load_dwordx8 316; GCN-DAG: s_and_b32 317; GCN-DAG: s_lshr_b32 318 319; v16i16 is naturally 32 byte aligned 320; EG-DAG: VTX_READ_128 [[DST_HI:T[0-9]+\.XYZW]], {{T[0-9]+.[XYZW]}}, 0, #1 321; EG-DAG: VTX_READ_128 [[DST_LO:T[0-9]+\.XYZW]], {{T[0-9]+.[XYZW]}}, 16, #1 322define void @constant_zextload_v16i16_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i16> addrspace(2)* %in) #0 { 323 %load = load <16 x i16>, <16 x i16> addrspace(2)* %in 324 %ext = zext <16 x i16> %load to <16 x i32> 325 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 326 ret void 327} 328 329; FUNC-LABEL: {{^}}constant_sextload_v16i16_to_v16i32: 330; GCN: s_load_dwordx8 331; GCN-DAG: s_ashr_i32 332; GCN-DAG: s_sext_i32_i16 333 334; v16i16 is naturally 32 byte aligned 335; EG-DAG: VTX_READ_128 [[DST_HI:T[0-9]+\.XYZW]], {{T[0-9]+\.[XYZW]}}, 0, #1 336; EG-DAG: VTX_READ_128 [[DST_LO:T[0-9]+\.XYZW]], {{T[0-9]+\.[XYZW]}}, 16, #1 337define void @constant_sextload_v16i16_to_v16i32(<16 x i32> addrspace(1)* %out, <16 x i16> addrspace(2)* %in) #0 { 338 %load = load <16 x i16>, <16 x i16> addrspace(2)* %in 339 %ext = sext <16 x i16> %load to <16 x i32> 340 store <16 x i32> %ext, <16 x i32> addrspace(1)* %out 341 ret void 342} 343 344; FUNC-LABEL: {{^}}constant_zextload_v32i16_to_v32i32: 345; GCN-DAG: s_load_dwordx16 346; GCN-DAG: s_mov_b32 [[K:s[0-9]+]], 0xffff{{$}} 347; GCN-DAG: s_lshr_b32 s{{[0-9]+}}, s{{[0-9]+}}, 16 348; GCN-DAG: s_and_b32 s{{[0-9]+}}, s{{[0-9]+}}, [[K]] 349 350; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 0, #1 351; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 16, #1 352; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 32, #1 353; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 48, #1 354define void @constant_zextload_v32i16_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i16> addrspace(2)* %in) #0 { 355 %load = load <32 x i16>, <32 x i16> addrspace(2)* %in 356 %ext = zext <32 x i16> %load to <32 x i32> 357 store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 358 ret void 359} 360 361; FUNC-LABEL: {{^}}constant_sextload_v32i16_to_v32i32: 362; GCN: s_load_dwordx16 363; GCN-DAG: s_ashr_i32 364; GCN-DAG: s_sext_i32_i16 365 366; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 0, #1 367; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 16, #1 368; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 32, #1 369; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 48, #1 370define void @constant_sextload_v32i16_to_v32i32(<32 x i32> addrspace(1)* %out, <32 x i16> addrspace(2)* %in) #0 { 371 %load = load <32 x i16>, <32 x i16> addrspace(2)* %in 372 %ext = sext <32 x i16> %load to <32 x i32> 373 store <32 x i32> %ext, <32 x i32> addrspace(1)* %out 374 ret void 375} 376 377; FUNC-LABEL: {{^}}constant_zextload_v64i16_to_v64i32: 378; GCN: s_load_dwordx16 379; GCN: s_load_dwordx16 380 381; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 0, #1 382; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 16, #1 383; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 32, #1 384; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 48, #1 385; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 64, #1 386; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 80, #1 387; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 96, #1 388; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 112, #1 389define void @constant_zextload_v64i16_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i16> addrspace(2)* %in) #0 { 390 %load = load <64 x i16>, <64 x i16> addrspace(2)* %in 391 %ext = zext <64 x i16> %load to <64 x i32> 392 store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 393 ret void 394} 395 396; FUNC-LABEL: {{^}}constant_sextload_v64i16_to_v64i32: 397 398; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 0, #1 399; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 16, #1 400; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 32, #1 401; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 48, #1 402; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 64, #1 403; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 80, #1 404; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 96, #1 405; EG-DAG: VTX_READ_128 {{T[0-9]+\.XYZW}}, {{T[0-9]+\.[XYZW]}}, 112, #1 406define void @constant_sextload_v64i16_to_v64i32(<64 x i32> addrspace(1)* %out, <64 x i16> addrspace(2)* %in) #0 { 407 %load = load <64 x i16>, <64 x i16> addrspace(2)* %in 408 %ext = sext <64 x i16> %load to <64 x i32> 409 store <64 x i32> %ext, <64 x i32> addrspace(1)* %out 410 ret void 411} 412 413; FUNC-LABEL: {{^}}constant_zextload_i16_to_i64: 414; GCN-NOHSA-DAG: buffer_load_ushort v[[LO:[0-9]+]], 415; GCN-HSA-DAG: flat_load_ushort v[[LO:[0-9]+]], 416; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}} 417 418; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]] 419; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]{{\]}} 420 421; EG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 422; EG: MOV {{.*}}, 0.0 423define void @constant_zextload_i16_to_i64(i64 addrspace(1)* %out, i16 addrspace(2)* %in) #0 { 424 %a = load i16, i16 addrspace(2)* %in 425 %ext = zext i16 %a to i64 426 store i64 %ext, i64 addrspace(1)* %out 427 ret void 428} 429 430; FUNC-LABEL: {{^}}constant_sextload_i16_to_i64: 431; GCN-NOHSA-DAG: buffer_load_sshort v[[LO:[0-9]+]], 432; GCN-HSA-DAG: flat_load_sshort v[[LO:[0-9]+]], 433; GCN-DAG: v_ashrrev_i32_e32 v[[HI:[0-9]+]], 31, v[[LO]] 434 435; GCN-NOHSA: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]] 436; GCN-HSA: flat_store_dwordx2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[LO]]:[[HI]]{{\]}} 437 438; EG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 439; EG: ASHR {{\**}} {{T[0-9]\.[XYZW]}}, {{.*}}, literal 440; TODO: Why not 15 ? 441; EG: 31 442define void @constant_sextload_i16_to_i64(i64 addrspace(1)* %out, i16 addrspace(2)* %in) #0 { 443 %a = load i16, i16 addrspace(2)* %in 444 %ext = sext i16 %a to i64 445 store i64 %ext, i64 addrspace(1)* %out 446 ret void 447} 448 449; FUNC-LABEL: {{^}}constant_zextload_v1i16_to_v1i64: 450 451; EG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 452; EG: MOV {{.*}}, 0.0 453define void @constant_zextload_v1i16_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i16> addrspace(2)* %in) #0 { 454 %load = load <1 x i16>, <1 x i16> addrspace(2)* %in 455 %ext = zext <1 x i16> %load to <1 x i64> 456 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 457 ret void 458} 459 460; FUNC-LABEL: {{^}}constant_sextload_v1i16_to_v1i64: 461 462; EG: VTX_READ_16 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 463; EG: ASHR {{\**}} {{T[0-9]\.[XYZW]}}, {{.*}}, literal 464; TODO: Why not 15 ? 465; EG: 31 466define void @constant_sextload_v1i16_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i16> addrspace(2)* %in) #0 { 467 %load = load <1 x i16>, <1 x i16> addrspace(2)* %in 468 %ext = sext <1 x i16> %load to <1 x i64> 469 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out 470 ret void 471} 472 473; FUNC-LABEL: {{^}}constant_zextload_v2i16_to_v2i64: 474 475; EG: VTX_READ_32 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 476define void @constant_zextload_v2i16_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i16> addrspace(2)* %in) #0 { 477 %load = load <2 x i16>, <2 x i16> addrspace(2)* %in 478 %ext = zext <2 x i16> %load to <2 x i64> 479 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 480 ret void 481} 482 483; FUNC-LABEL: {{^}}constant_sextload_v2i16_to_v2i64: 484 485; EG: VTX_READ_32 T{{[0-9]+}}.X, T{{[0-9]+}}.X, 0, #1 486define void @constant_sextload_v2i16_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i16> addrspace(2)* %in) #0 { 487 %load = load <2 x i16>, <2 x i16> addrspace(2)* %in 488 %ext = sext <2 x i16> %load to <2 x i64> 489 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out 490 ret void 491} 492 493; FUNC-LABEL: {{^}}constant_zextload_v4i16_to_v4i64: 494 495; EG: VTX_READ_64 T{{[0-9]+}}.XY, T{{[0-9]+}}.X, 0, #1 496define void @constant_zextload_v4i16_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i16> addrspace(2)* %in) #0 { 497 %load = load <4 x i16>, <4 x i16> addrspace(2)* %in 498 %ext = zext <4 x i16> %load to <4 x i64> 499 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 500 ret void 501} 502 503; FUNC-LABEL: {{^}}constant_sextload_v4i16_to_v4i64: 504 505; EG: VTX_READ_64 T{{[0-9]+}}.XY, T{{[0-9]+}}.X, 0, #1 506define void @constant_sextload_v4i16_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i16> addrspace(2)* %in) #0 { 507 %load = load <4 x i16>, <4 x i16> addrspace(2)* %in 508 %ext = sext <4 x i16> %load to <4 x i64> 509 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out 510 ret void 511} 512 513; FUNC-LABEL: {{^}}constant_zextload_v8i16_to_v8i64: 514 515; EG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 516define void @constant_zextload_v8i16_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i16> addrspace(2)* %in) #0 { 517 %load = load <8 x i16>, <8 x i16> addrspace(2)* %in 518 %ext = zext <8 x i16> %load to <8 x i64> 519 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 520 ret void 521} 522 523; FUNC-LABEL: {{^}}constant_sextload_v8i16_to_v8i64: 524 525; EG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 526define void @constant_sextload_v8i16_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i16> addrspace(2)* %in) #0 { 527 %load = load <8 x i16>, <8 x i16> addrspace(2)* %in 528 %ext = sext <8 x i16> %load to <8 x i64> 529 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out 530 ret void 531} 532 533; FUNC-LABEL: {{^}}constant_zextload_v16i16_to_v16i64: 534 535; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 536; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 16, #1 537define void @constant_zextload_v16i16_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i16> addrspace(2)* %in) #0 { 538 %load = load <16 x i16>, <16 x i16> addrspace(2)* %in 539 %ext = zext <16 x i16> %load to <16 x i64> 540 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 541 ret void 542} 543 544; FUNC-LABEL: {{^}}constant_sextload_v16i16_to_v16i64: 545 546; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 547; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 16, #1 548define void @constant_sextload_v16i16_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i16> addrspace(2)* %in) #0 { 549 %load = load <16 x i16>, <16 x i16> addrspace(2)* %in 550 %ext = sext <16 x i16> %load to <16 x i64> 551 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out 552 ret void 553} 554 555; FUNC-LABEL: {{^}}constant_zextload_v32i16_to_v32i64: 556 557; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 558; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 16, #1 559; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 32, #1 560; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 48, #1 561define void @constant_zextload_v32i16_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i16> addrspace(2)* %in) #0 { 562 %load = load <32 x i16>, <32 x i16> addrspace(2)* %in 563 %ext = zext <32 x i16> %load to <32 x i64> 564 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 565 ret void 566} 567 568; FUNC-LABEL: {{^}}constant_sextload_v32i16_to_v32i64: 569 570; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 0, #1 571; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 16, #1 572; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 32, #1 573; EG-DAG: VTX_READ_128 T{{[0-9]+}}.XYZW, T{{[0-9]+}}.X, 48, #1 574define void @constant_sextload_v32i16_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i16> addrspace(2)* %in) #0 { 575 %load = load <32 x i16>, <32 x i16> addrspace(2)* %in 576 %ext = sext <32 x i16> %load to <32 x i64> 577 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out 578 ret void 579} 580 581; These trigger undefined register machine verifier errors 582 583; ; XFUNC-LABEL: {{^}}constant_zextload_v64i16_to_v64i64: 584; define void @constant_zextload_v64i16_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i16> addrspace(2)* %in) #0 { 585; %load = load <64 x i16>, <64 x i16> addrspace(2)* %in 586; %ext = zext <64 x i16> %load to <64 x i64> 587; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 588; ret void 589; } 590 591; ; XFUNC-LABEL: {{^}}constant_sextload_v64i16_to_v64i64: 592; define void @constant_sextload_v64i16_to_v64i64(<64 x i64> addrspace(1)* %out, <64 x i16> addrspace(2)* %in) #0 { 593; %load = load <64 x i16>, <64 x i16> addrspace(2)* %in 594; %ext = sext <64 x i16> %load to <64 x i64> 595; store <64 x i64> %ext, <64 x i64> addrspace(1)* %out 596; ret void 597; } 598 599attributes #0 = { nounwind } 600