1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX9 %s 3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GFX8 %s 4 5define void @undef_lo_v2i16(i16 %arg0) { 6; GFX9-LABEL: undef_lo_v2i16: 7; GFX9: ; %bb.0: 8; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 9; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 10; GFX9-NEXT: ;;#ASMSTART 11; GFX9-NEXT: ; use v0 12; GFX9-NEXT: ;;#ASMEND 13; GFX9-NEXT: s_setpc_b64 s[30:31] 14; 15; GFX8-LABEL: undef_lo_v2i16: 16; GFX8: ; %bb.0: 17; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 18; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0 19; GFX8-NEXT: ;;#ASMSTART 20; GFX8-NEXT: ; use v0 21; GFX8-NEXT: ;;#ASMEND 22; GFX8-NEXT: s_setpc_b64 s[30:31] 23 %undef.lo = insertelement <2 x i16> undef, i16 %arg0, i32 1 24 call void asm sideeffect "; use $0", "v"(<2 x i16> %undef.lo); 25 ret void 26} 27 28define void @undef_lo_v2f16(half %arg0) { 29; GFX9-LABEL: undef_lo_v2f16: 30; GFX9: ; %bb.0: 31; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 32; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 33; GFX9-NEXT: ;;#ASMSTART 34; GFX9-NEXT: ; use v0 35; GFX9-NEXT: ;;#ASMEND 36; GFX9-NEXT: s_setpc_b64 s[30:31] 37; 38; GFX8-LABEL: undef_lo_v2f16: 39; GFX8: ; %bb.0: 40; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 41; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0 42; GFX8-NEXT: ;;#ASMSTART 43; GFX8-NEXT: ; use v0 44; GFX8-NEXT: ;;#ASMEND 45; GFX8-NEXT: s_setpc_b64 s[30:31] 46 %undef.lo = insertelement <2 x half> undef, half %arg0, i32 1 47 call void asm sideeffect "; use $0", "v"(<2 x half> %undef.lo); 48 ret void 49} 50 51define void @undef_lo_op_v2f16(half %arg0) { 52; GFX9-LABEL: undef_lo_op_v2f16: 53; GFX9: ; %bb.0: 54; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 55; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 56; GFX9-NEXT: v_pk_add_f16 v0, v0, 1.0 op_sel_hi:[1,0] 57; GFX9-NEXT: ;;#ASMSTART 58; GFX9-NEXT: ; use v0 59; GFX9-NEXT: ;;#ASMEND 60; GFX9-NEXT: s_setpc_b64 s[30:31] 61; 62; GFX8-LABEL: undef_lo_op_v2f16: 63; GFX8: ; %bb.0: 64; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 65; GFX8-NEXT: v_mov_b32_e32 v1, 0x3c00 66; GFX8-NEXT: v_add_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 67; GFX8-NEXT: v_or_b32_e32 v0, 0x7e00, v0 68; GFX8-NEXT: ;;#ASMSTART 69; GFX8-NEXT: ; use v0 70; GFX8-NEXT: ;;#ASMEND 71; GFX8-NEXT: s_setpc_b64 s[30:31] 72 %undef.lo = insertelement <2 x half> undef, half %arg0, i32 1 73 %op = fadd <2 x half> %undef.lo, <half 1.0, half 1.0> 74 call void asm sideeffect "; use $0", "v"(<2 x half> %op); 75 ret void 76} 77 78define void @undef_lo_op_v2i16(i16 %arg0) { 79; GFX9-LABEL: undef_lo_op_v2i16: 80; GFX9: ; %bb.0: 81; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 82; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 83; GFX9-NEXT: s_movk_i32 s4, 0x63 84; GFX9-NEXT: v_pk_add_u16 v0, v0, s4 op_sel_hi:[1,0] 85; GFX9-NEXT: ;;#ASMSTART 86; GFX9-NEXT: ; use v0 87; GFX9-NEXT: ;;#ASMEND 88; GFX9-NEXT: s_setpc_b64 s[30:31] 89; 90; GFX8-LABEL: undef_lo_op_v2i16: 91; GFX8: ; %bb.0: 92; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 93; GFX8-NEXT: v_mov_b32_e32 v1, 0x63 94; GFX8-NEXT: v_add_u16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD 95; GFX8-NEXT: ;;#ASMSTART 96; GFX8-NEXT: ; use v0 97; GFX8-NEXT: ;;#ASMEND 98; GFX8-NEXT: s_setpc_b64 s[30:31] 99 %undef.lo = insertelement <2 x i16> undef, i16 %arg0, i32 1 100 %op = add <2 x i16> %undef.lo, <i16 99, i16 99> 101 call void asm sideeffect "; use $0", "v"(<2 x i16> %op); 102 ret void 103} 104 105define void @undef_lo3_v4i16(i16 %arg0) { 106; GFX9-LABEL: undef_lo3_v4i16: 107; GFX9: ; %bb.0: 108; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 109; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 110; GFX9-NEXT: ;;#ASMSTART 111; GFX9-NEXT: ; use v[0:1] 112; GFX9-NEXT: ;;#ASMEND 113; GFX9-NEXT: s_setpc_b64 s[30:31] 114; 115; GFX8-LABEL: undef_lo3_v4i16: 116; GFX8: ; %bb.0: 117; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 118; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0 119; GFX8-NEXT: ;;#ASMSTART 120; GFX8-NEXT: ; use v[0:1] 121; GFX8-NEXT: ;;#ASMEND 122; GFX8-NEXT: s_setpc_b64 s[30:31] 123 %undef.lo = insertelement <4 x i16> undef, i16 %arg0, i32 1 124 call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.lo); 125 ret void 126} 127 128define void @undef_lo3_v4f16(half %arg0) { 129; GFX9-LABEL: undef_lo3_v4f16: 130; GFX9: ; %bb.0: 131; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 132; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 133; GFX9-NEXT: ;;#ASMSTART 134; GFX9-NEXT: ; use v[0:1] 135; GFX9-NEXT: ;;#ASMEND 136; GFX9-NEXT: s_setpc_b64 s[30:31] 137; 138; GFX8-LABEL: undef_lo3_v4f16: 139; GFX8: ; %bb.0: 140; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 141; GFX8-NEXT: v_lshlrev_b32_e32 v0, 16, v0 142; GFX8-NEXT: ;;#ASMSTART 143; GFX8-NEXT: ; use v[0:1] 144; GFX8-NEXT: ;;#ASMEND 145; GFX8-NEXT: s_setpc_b64 s[30:31] 146 %undef.lo = insertelement <4 x half> undef, half %arg0, i32 1 147 call void asm sideeffect "; use $0", "v"(<4 x half> %undef.lo); 148 ret void 149} 150 151define void @undef_lo2_v4i16(<2 x i16> %arg0) { 152; GFX9-LABEL: undef_lo2_v4i16: 153; GFX9: ; %bb.0: 154; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 155; GFX9-NEXT: s_mov_b32 s4, 0x7060302 156; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4 157; GFX9-NEXT: ;;#ASMSTART 158; GFX9-NEXT: ; use v[0:1] 159; GFX9-NEXT: ;;#ASMEND 160; GFX9-NEXT: s_setpc_b64 s[30:31] 161; 162; GFX8-LABEL: undef_lo2_v4i16: 163; GFX8: ; %bb.0: 164; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 165; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v0 166; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 16 167; GFX8-NEXT: ;;#ASMSTART 168; GFX8-NEXT: ; use v[0:1] 169; GFX8-NEXT: ;;#ASMEND 170; GFX8-NEXT: s_setpc_b64 s[30:31] 171 %undef.lo = shufflevector <2 x i16> %arg0, <2 x i16> undef, <4 x i32> <i32 1, i32 1, i32 2, i32 3> 172 call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.lo); 173 ret void 174} 175 176define void @undef_lo2_v4f16(<2 x half> %arg0) { 177; GFX9-LABEL: undef_lo2_v4f16: 178; GFX9: ; %bb.0: 179; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 180; GFX9-NEXT: s_mov_b32 s4, 0x7060302 181; GFX9-NEXT: v_perm_b32 v0, v0, v0, s4 182; GFX9-NEXT: ;;#ASMSTART 183; GFX9-NEXT: ; use v[0:1] 184; GFX9-NEXT: ;;#ASMEND 185; GFX9-NEXT: s_setpc_b64 s[30:31] 186; 187; GFX8-LABEL: undef_lo2_v4f16: 188; GFX8: ; %bb.0: 189; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 190; GFX8-NEXT: v_lshrrev_b32_e32 v1, 16, v0 191; GFX8-NEXT: v_alignbit_b32 v0, v1, v0, 16 192; GFX8-NEXT: ;;#ASMSTART 193; GFX8-NEXT: ; use v[0:1] 194; GFX8-NEXT: ;;#ASMEND 195; GFX8-NEXT: s_setpc_b64 s[30:31] 196 %undef.lo = shufflevector <2 x half> %arg0, <2 x half> undef, <4 x i32> <i32 1, i32 1, i32 2, i32 3> 197 call void asm sideeffect "; use $0", "v"(<4 x half> %undef.lo); 198 ret void 199} 200 201define void @undef_hi_v2i16(i16 %arg0) { 202; GFX9-LABEL: undef_hi_v2i16: 203; GFX9: ; %bb.0: 204; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 205; GFX9-NEXT: ;;#ASMSTART 206; GFX9-NEXT: ; use v0 207; GFX9-NEXT: ;;#ASMEND 208; GFX9-NEXT: s_setpc_b64 s[30:31] 209; 210; GFX8-LABEL: undef_hi_v2i16: 211; GFX8: ; %bb.0: 212; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 213; GFX8-NEXT: ;;#ASMSTART 214; GFX8-NEXT: ; use v0 215; GFX8-NEXT: ;;#ASMEND 216; GFX8-NEXT: s_setpc_b64 s[30:31] 217 %undef.hi = insertelement <2 x i16> undef, i16 %arg0, i32 0 218 call void asm sideeffect "; use $0", "v"(<2 x i16> %undef.hi); 219 ret void 220} 221 222define void @undef_hi_v2f16(half %arg0) { 223; GFX9-LABEL: undef_hi_v2f16: 224; GFX9: ; %bb.0: 225; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 226; GFX9-NEXT: ;;#ASMSTART 227; GFX9-NEXT: ; use v0 228; GFX9-NEXT: ;;#ASMEND 229; GFX9-NEXT: s_setpc_b64 s[30:31] 230; 231; GFX8-LABEL: undef_hi_v2f16: 232; GFX8: ; %bb.0: 233; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 234; GFX8-NEXT: ;;#ASMSTART 235; GFX8-NEXT: ; use v0 236; GFX8-NEXT: ;;#ASMEND 237; GFX8-NEXT: s_setpc_b64 s[30:31] 238 %undef.hi = insertelement <2 x half> undef, half %arg0, i32 0 239 call void asm sideeffect "; use $0", "v"(<2 x half> %undef.hi); 240 ret void 241} 242 243define void @undef_hi_op_v2f16(half %arg0) { 244; GFX9-LABEL: undef_hi_op_v2f16: 245; GFX9: ; %bb.0: 246; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 247; GFX9-NEXT: v_pk_add_f16 v0, v0, 1.0 op_sel_hi:[1,0] 248; GFX9-NEXT: ;;#ASMSTART 249; GFX9-NEXT: ; use v0 250; GFX9-NEXT: ;;#ASMEND 251; GFX9-NEXT: s_setpc_b64 s[30:31] 252; 253; GFX8-LABEL: undef_hi_op_v2f16: 254; GFX8: ; %bb.0: 255; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 256; GFX8-NEXT: v_add_f16_e32 v0, 1.0, v0 257; GFX8-NEXT: v_or_b32_e32 v0, 0x7e000000, v0 258; GFX8-NEXT: ;;#ASMSTART 259; GFX8-NEXT: ; use v0 260; GFX8-NEXT: ;;#ASMEND 261; GFX8-NEXT: s_setpc_b64 s[30:31] 262 %undef.hi = insertelement <2 x half> undef, half %arg0, i32 0 263 %op = fadd <2 x half> %undef.hi, <half 1.0, half 1.0> 264 call void asm sideeffect "; use $0", "v"(<2 x half> %op); 265 ret void 266} 267 268define void @undef_hi_op_v2i16(i16 %arg0) { 269; GFX9-LABEL: undef_hi_op_v2i16: 270; GFX9: ; %bb.0: 271; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 272; GFX9-NEXT: s_movk_i32 s4, 0x63 273; GFX9-NEXT: v_pk_add_u16 v0, v0, s4 op_sel_hi:[1,0] 274; GFX9-NEXT: ;;#ASMSTART 275; GFX9-NEXT: ; use v0 276; GFX9-NEXT: ;;#ASMEND 277; GFX9-NEXT: s_setpc_b64 s[30:31] 278; 279; GFX8-LABEL: undef_hi_op_v2i16: 280; GFX8: ; %bb.0: 281; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 282; GFX8-NEXT: v_add_u16_e32 v0, 0x63, v0 283; GFX8-NEXT: ;;#ASMSTART 284; GFX8-NEXT: ; use v0 285; GFX8-NEXT: ;;#ASMEND 286; GFX8-NEXT: s_setpc_b64 s[30:31] 287 %undef.hi = insertelement <2 x i16> undef, i16 %arg0, i32 0 288 %op = add <2 x i16> %undef.hi, <i16 99, i16 99> 289 call void asm sideeffect "; use $0", "v"(<2 x i16> %op); 290 ret void 291} 292 293define void @undef_hi3_v4i16(i16 %arg0) { 294; GFX9-LABEL: undef_hi3_v4i16: 295; GFX9: ; %bb.0: 296; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 297; GFX9-NEXT: ;;#ASMSTART 298; GFX9-NEXT: ; use v[0:1] 299; GFX9-NEXT: ;;#ASMEND 300; GFX9-NEXT: s_setpc_b64 s[30:31] 301; 302; GFX8-LABEL: undef_hi3_v4i16: 303; GFX8: ; %bb.0: 304; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 305; GFX8-NEXT: ;;#ASMSTART 306; GFX8-NEXT: ; use v[0:1] 307; GFX8-NEXT: ;;#ASMEND 308; GFX8-NEXT: s_setpc_b64 s[30:31] 309 %undef.hi = insertelement <4 x i16> undef, i16 %arg0, i32 0 310 call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.hi); 311 ret void 312} 313 314define void @undef_hi3_v4f16(half %arg0) { 315; GFX9-LABEL: undef_hi3_v4f16: 316; GFX9: ; %bb.0: 317; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 318; GFX9-NEXT: ;;#ASMSTART 319; GFX9-NEXT: ; use v[0:1] 320; GFX9-NEXT: ;;#ASMEND 321; GFX9-NEXT: s_setpc_b64 s[30:31] 322; 323; GFX8-LABEL: undef_hi3_v4f16: 324; GFX8: ; %bb.0: 325; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 326; GFX8-NEXT: ;;#ASMSTART 327; GFX8-NEXT: ; use v[0:1] 328; GFX8-NEXT: ;;#ASMEND 329; GFX8-NEXT: s_setpc_b64 s[30:31] 330 %undef.hi = insertelement <4 x half> undef, half %arg0, i32 0 331 call void asm sideeffect "; use $0", "v"(<4 x half> %undef.hi); 332 ret void 333} 334 335define void @undef_hi2_v4i16(<2 x i16> %arg0) { 336; GFX9-LABEL: undef_hi2_v4i16: 337; GFX9: ; %bb.0: 338; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 339; GFX9-NEXT: ;;#ASMSTART 340; GFX9-NEXT: ; use v[0:1] 341; GFX9-NEXT: ;;#ASMEND 342; GFX9-NEXT: s_setpc_b64 s[30:31] 343; 344; GFX8-LABEL: undef_hi2_v4i16: 345; GFX8: ; %bb.0: 346; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 347; GFX8-NEXT: ;;#ASMSTART 348; GFX8-NEXT: ; use v[0:1] 349; GFX8-NEXT: ;;#ASMEND 350; GFX8-NEXT: s_setpc_b64 s[30:31] 351 %undef.hi = shufflevector <2 x i16> %arg0, <2 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 352 call void asm sideeffect "; use $0", "v"(<4 x i16> %undef.hi); 353 ret void 354} 355 356define void @undef_hi2_v4f16(<2 x half> %arg0) { 357; GFX9-LABEL: undef_hi2_v4f16: 358; GFX9: ; %bb.0: 359; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 360; GFX9-NEXT: ;;#ASMSTART 361; GFX9-NEXT: ; use v[0:1] 362; GFX9-NEXT: ;;#ASMEND 363; GFX9-NEXT: s_setpc_b64 s[30:31] 364; 365; GFX8-LABEL: undef_hi2_v4f16: 366; GFX8: ; %bb.0: 367; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 368; GFX8-NEXT: ;;#ASMSTART 369; GFX8-NEXT: ; use v[0:1] 370; GFX8-NEXT: ;;#ASMEND 371; GFX8-NEXT: s_setpc_b64 s[30:31] 372 %undef.hi = shufflevector <2 x half> %arg0, <2 x half> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 373 call void asm sideeffect "; use $0", "v"(<4 x half> %undef.hi); 374 ret void 375} 376 377