1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-- -mcpu=tahiti -verify-machineinstrs | FileCheck %s -check-prefixes=GCN,SI 3; RUN: llc < %s -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-- -mcpu=fiji -mattr=-flat-for-global -verify-machineinstrs | FileCheck %s -check-prefixes=GCN,VI 4 5define amdgpu_kernel void @select_f16( 6; SI-LABEL: select_f16: 7; SI: ; %bb.0: ; %entry 8; SI-NEXT: s_load_dwordx8 s[4:11], s[0:1], 0x9 9; SI-NEXT: s_load_dwordx2 s[0:1], s[0:1], 0x11 10; SI-NEXT: s_mov_b32 s15, 0xf000 11; SI-NEXT: s_mov_b32 s14, -1 12; SI-NEXT: s_mov_b32 s22, s14 13; SI-NEXT: s_waitcnt lgkmcnt(0) 14; SI-NEXT: s_mov_b32 s20, s6 15; SI-NEXT: s_mov_b32 s21, s7 16; SI-NEXT: s_mov_b32 s23, s15 17; SI-NEXT: s_mov_b32 s16, s10 18; SI-NEXT: s_mov_b32 s17, s11 19; SI-NEXT: s_mov_b32 s2, s14 20; SI-NEXT: s_mov_b32 s3, s15 21; SI-NEXT: s_mov_b32 s18, s14 22; SI-NEXT: s_mov_b32 s19, s15 23; SI-NEXT: s_mov_b32 s10, s14 24; SI-NEXT: s_mov_b32 s11, s15 25; SI-NEXT: buffer_load_ushort v0, off, s[20:23], 0 26; SI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 27; SI-NEXT: buffer_load_ushort v2, off, s[16:19], 0 28; SI-NEXT: buffer_load_ushort v3, off, s[0:3], 0 29; SI-NEXT: s_mov_b32 s12, s4 30; SI-NEXT: s_mov_b32 s13, s5 31; SI-NEXT: s_waitcnt vmcnt(3) 32; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 33; SI-NEXT: s_waitcnt vmcnt(2) 34; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 35; SI-NEXT: s_waitcnt vmcnt(1) 36; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 37; SI-NEXT: s_waitcnt vmcnt(0) 38; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 39; SI-NEXT: v_cmp_lt_f32_e32 vcc, v0, v1 40; SI-NEXT: v_cndmask_b32_e32 v0, v3, v2, vcc 41; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 42; SI-NEXT: buffer_store_short v0, off, s[12:15], 0 43; SI-NEXT: s_endpgm 44; 45; VI-LABEL: select_f16: 46; VI: ; %bb.0: ; %entry 47; VI-NEXT: s_load_dwordx8 s[4:11], s[0:1], 0x24 48; VI-NEXT: s_load_dwordx2 s[12:13], s[0:1], 0x44 49; VI-NEXT: s_mov_b32 s3, 0xf000 50; VI-NEXT: s_mov_b32 s2, -1 51; VI-NEXT: s_mov_b32 s14, s2 52; VI-NEXT: s_waitcnt lgkmcnt(0) 53; VI-NEXT: s_mov_b32 s0, s4 54; VI-NEXT: s_mov_b32 s1, s5 55; VI-NEXT: s_mov_b32 s4, s6 56; VI-NEXT: s_mov_b32 s5, s7 57; VI-NEXT: s_mov_b32 s6, s2 58; VI-NEXT: s_mov_b32 s7, s3 59; VI-NEXT: s_mov_b32 s16, s10 60; VI-NEXT: s_mov_b32 s17, s11 61; VI-NEXT: s_mov_b32 s15, s3 62; VI-NEXT: s_mov_b32 s18, s2 63; VI-NEXT: s_mov_b32 s19, s3 64; VI-NEXT: s_mov_b32 s10, s2 65; VI-NEXT: s_mov_b32 s11, s3 66; VI-NEXT: buffer_load_ushort v0, off, s[4:7], 0 67; VI-NEXT: buffer_load_ushort v1, off, s[8:11], 0 68; VI-NEXT: buffer_load_ushort v2, off, s[16:19], 0 69; VI-NEXT: buffer_load_ushort v3, off, s[12:15], 0 70; VI-NEXT: s_waitcnt vmcnt(2) 71; VI-NEXT: v_cmp_lt_f16_e32 vcc, v0, v1 72; VI-NEXT: s_waitcnt vmcnt(0) 73; VI-NEXT: v_cndmask_b32_e32 v0, v3, v2, vcc 74; VI-NEXT: buffer_store_short v0, off, s[0:3], 0 75; VI-NEXT: s_endpgm 76 half addrspace(1)* %r, 77 half addrspace(1)* %a, 78 half addrspace(1)* %b, 79 half addrspace(1)* %c, 80 half addrspace(1)* %d) { 81entry: 82 %a.val = load volatile half, half addrspace(1)* %a 83 %b.val = load volatile half, half addrspace(1)* %b 84 %c.val = load volatile half, half addrspace(1)* %c 85 %d.val = load volatile half, half addrspace(1)* %d 86 %fcmp = fcmp olt half %a.val, %b.val 87 %r.val = select i1 %fcmp, half %c.val, half %d.val 88 store half %r.val, half addrspace(1)* %r 89 ret void 90} 91 92define amdgpu_kernel void @select_f16_imm_a( 93; SI-LABEL: select_f16_imm_a: 94; SI: ; %bb.0: ; %entry 95; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 96; SI-NEXT: s_mov_b32 s11, 0xf000 97; SI-NEXT: s_mov_b32 s10, -1 98; SI-NEXT: s_mov_b32 s18, s10 99; SI-NEXT: s_mov_b32 s19, s11 100; SI-NEXT: s_waitcnt lgkmcnt(0) 101; SI-NEXT: s_mov_b32 s16, s2 102; SI-NEXT: s_mov_b32 s17, s3 103; SI-NEXT: s_mov_b32 s12, s6 104; SI-NEXT: s_mov_b32 s13, s7 105; SI-NEXT: s_mov_b32 s14, s10 106; SI-NEXT: s_mov_b32 s15, s11 107; SI-NEXT: s_mov_b32 s6, s10 108; SI-NEXT: s_mov_b32 s7, s11 109; SI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 110; SI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 111; SI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 112; SI-NEXT: s_mov_b32 s8, s0 113; SI-NEXT: s_mov_b32 s9, s1 114; SI-NEXT: s_waitcnt vmcnt(2) 115; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 116; SI-NEXT: s_waitcnt vmcnt(1) 117; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 118; SI-NEXT: s_waitcnt vmcnt(0) 119; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 120; SI-NEXT: v_cmp_lt_f32_e32 vcc, 0.5, v0 121; SI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 122; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 123; SI-NEXT: buffer_store_short v0, off, s[8:11], 0 124; SI-NEXT: s_endpgm 125; 126; VI-LABEL: select_f16_imm_a: 127; VI: ; %bb.0: ; %entry 128; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 129; VI-NEXT: s_mov_b32 s11, 0xf000 130; VI-NEXT: s_mov_b32 s10, -1 131; VI-NEXT: s_mov_b32 s14, s10 132; VI-NEXT: s_mov_b32 s15, s11 133; VI-NEXT: s_waitcnt lgkmcnt(0) 134; VI-NEXT: s_mov_b32 s8, s0 135; VI-NEXT: s_mov_b32 s9, s1 136; VI-NEXT: s_mov_b32 s0, s2 137; VI-NEXT: s_mov_b32 s1, s3 138; VI-NEXT: s_mov_b32 s2, s10 139; VI-NEXT: s_mov_b32 s3, s11 140; VI-NEXT: s_mov_b32 s12, s6 141; VI-NEXT: s_mov_b32 s13, s7 142; VI-NEXT: s_mov_b32 s6, s10 143; VI-NEXT: s_mov_b32 s7, s11 144; VI-NEXT: buffer_load_ushort v0, off, s[0:3], 0 145; VI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 146; VI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 147; VI-NEXT: s_waitcnt vmcnt(2) 148; VI-NEXT: v_cmp_lt_f16_e32 vcc, 0.5, v0 149; VI-NEXT: s_waitcnt vmcnt(0) 150; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 151; VI-NEXT: buffer_store_short v0, off, s[8:11], 0 152; VI-NEXT: s_endpgm 153 half addrspace(1)* %r, 154 half addrspace(1)* %b, 155 half addrspace(1)* %c, 156 half addrspace(1)* %d) { 157entry: 158 %b.val = load volatile half, half addrspace(1)* %b 159 %c.val = load volatile half, half addrspace(1)* %c 160 %d.val = load volatile half, half addrspace(1)* %d 161 %fcmp = fcmp olt half 0xH3800, %b.val 162 %r.val = select i1 %fcmp, half %c.val, half %d.val 163 store half %r.val, half addrspace(1)* %r 164 ret void 165} 166 167define amdgpu_kernel void @select_f16_imm_b( 168; SI-LABEL: select_f16_imm_b: 169; SI: ; %bb.0: ; %entry 170; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 171; SI-NEXT: s_mov_b32 s11, 0xf000 172; SI-NEXT: s_mov_b32 s10, -1 173; SI-NEXT: s_mov_b32 s18, s10 174; SI-NEXT: s_mov_b32 s19, s11 175; SI-NEXT: s_waitcnt lgkmcnt(0) 176; SI-NEXT: s_mov_b32 s16, s2 177; SI-NEXT: s_mov_b32 s17, s3 178; SI-NEXT: s_mov_b32 s12, s6 179; SI-NEXT: s_mov_b32 s13, s7 180; SI-NEXT: s_mov_b32 s14, s10 181; SI-NEXT: s_mov_b32 s15, s11 182; SI-NEXT: s_mov_b32 s6, s10 183; SI-NEXT: s_mov_b32 s7, s11 184; SI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 185; SI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 186; SI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 187; SI-NEXT: s_mov_b32 s8, s0 188; SI-NEXT: s_mov_b32 s9, s1 189; SI-NEXT: s_waitcnt vmcnt(2) 190; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 191; SI-NEXT: s_waitcnt vmcnt(1) 192; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 193; SI-NEXT: s_waitcnt vmcnt(0) 194; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 195; SI-NEXT: v_cmp_gt_f32_e32 vcc, 0.5, v0 196; SI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 197; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 198; SI-NEXT: buffer_store_short v0, off, s[8:11], 0 199; SI-NEXT: s_endpgm 200; 201; VI-LABEL: select_f16_imm_b: 202; VI: ; %bb.0: ; %entry 203; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 204; VI-NEXT: s_mov_b32 s11, 0xf000 205; VI-NEXT: s_mov_b32 s10, -1 206; VI-NEXT: s_mov_b32 s14, s10 207; VI-NEXT: s_mov_b32 s15, s11 208; VI-NEXT: s_waitcnt lgkmcnt(0) 209; VI-NEXT: s_mov_b32 s8, s0 210; VI-NEXT: s_mov_b32 s9, s1 211; VI-NEXT: s_mov_b32 s0, s2 212; VI-NEXT: s_mov_b32 s1, s3 213; VI-NEXT: s_mov_b32 s2, s10 214; VI-NEXT: s_mov_b32 s3, s11 215; VI-NEXT: s_mov_b32 s12, s6 216; VI-NEXT: s_mov_b32 s13, s7 217; VI-NEXT: s_mov_b32 s6, s10 218; VI-NEXT: s_mov_b32 s7, s11 219; VI-NEXT: buffer_load_ushort v0, off, s[0:3], 0 220; VI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 221; VI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 222; VI-NEXT: s_waitcnt vmcnt(2) 223; VI-NEXT: v_cmp_gt_f16_e32 vcc, 0.5, v0 224; VI-NEXT: s_waitcnt vmcnt(0) 225; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 226; VI-NEXT: buffer_store_short v0, off, s[8:11], 0 227; VI-NEXT: s_endpgm 228 half addrspace(1)* %r, 229 half addrspace(1)* %a, 230 half addrspace(1)* %c, 231 half addrspace(1)* %d) { 232entry: 233 %a.val = load volatile half, half addrspace(1)* %a 234 %c.val = load volatile half, half addrspace(1)* %c 235 %d.val = load volatile half, half addrspace(1)* %d 236 %fcmp = fcmp olt half %a.val, 0xH3800 237 %r.val = select i1 %fcmp, half %c.val, half %d.val 238 store half %r.val, half addrspace(1)* %r 239 ret void 240} 241 242define amdgpu_kernel void @select_f16_imm_c( 243; SI-LABEL: select_f16_imm_c: 244; SI: ; %bb.0: ; %entry 245; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 246; SI-NEXT: s_mov_b32 s11, 0xf000 247; SI-NEXT: s_mov_b32 s10, -1 248; SI-NEXT: s_mov_b32 s18, s10 249; SI-NEXT: s_mov_b32 s19, s11 250; SI-NEXT: s_waitcnt lgkmcnt(0) 251; SI-NEXT: s_mov_b32 s16, s2 252; SI-NEXT: s_mov_b32 s17, s3 253; SI-NEXT: s_mov_b32 s12, s6 254; SI-NEXT: s_mov_b32 s13, s7 255; SI-NEXT: s_mov_b32 s14, s10 256; SI-NEXT: s_mov_b32 s15, s11 257; SI-NEXT: s_mov_b32 s6, s10 258; SI-NEXT: s_mov_b32 s7, s11 259; SI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 260; SI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 261; SI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 262; SI-NEXT: s_mov_b32 s8, s0 263; SI-NEXT: s_mov_b32 s9, s1 264; SI-NEXT: s_waitcnt vmcnt(2) 265; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 266; SI-NEXT: s_waitcnt vmcnt(1) 267; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 268; SI-NEXT: s_waitcnt vmcnt(0) 269; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 270; SI-NEXT: v_cmp_nlt_f32_e32 vcc, v0, v1 271; SI-NEXT: v_cndmask_b32_e32 v0, 0.5, v2, vcc 272; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 273; SI-NEXT: buffer_store_short v0, off, s[8:11], 0 274; SI-NEXT: s_endpgm 275; 276; VI-LABEL: select_f16_imm_c: 277; VI: ; %bb.0: ; %entry 278; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 279; VI-NEXT: s_mov_b32 s11, 0xf000 280; VI-NEXT: s_mov_b32 s10, -1 281; VI-NEXT: s_mov_b32 s14, s10 282; VI-NEXT: s_mov_b32 s15, s11 283; VI-NEXT: s_waitcnt lgkmcnt(0) 284; VI-NEXT: s_mov_b32 s8, s0 285; VI-NEXT: s_mov_b32 s9, s1 286; VI-NEXT: s_mov_b32 s0, s2 287; VI-NEXT: s_mov_b32 s1, s3 288; VI-NEXT: s_mov_b32 s2, s10 289; VI-NEXT: s_mov_b32 s3, s11 290; VI-NEXT: s_mov_b32 s12, s6 291; VI-NEXT: s_mov_b32 s13, s7 292; VI-NEXT: s_mov_b32 s6, s10 293; VI-NEXT: s_mov_b32 s7, s11 294; VI-NEXT: buffer_load_ushort v0, off, s[0:3], 0 295; VI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 296; VI-NEXT: buffer_load_ushort v3, off, s[12:15], 0 297; VI-NEXT: v_mov_b32_e32 v2, 0x3800 298; VI-NEXT: s_waitcnt vmcnt(1) 299; VI-NEXT: v_cmp_nlt_f16_e32 vcc, v0, v1 300; VI-NEXT: s_waitcnt vmcnt(0) 301; VI-NEXT: v_cndmask_b32_e32 v0, v2, v3, vcc 302; VI-NEXT: buffer_store_short v0, off, s[8:11], 0 303; VI-NEXT: s_endpgm 304 half addrspace(1)* %r, 305 half addrspace(1)* %a, 306 half addrspace(1)* %b, 307 half addrspace(1)* %d) { 308entry: 309 %a.val = load volatile half, half addrspace(1)* %a 310 %b.val = load volatile half, half addrspace(1)* %b 311 %d.val = load volatile half, half addrspace(1)* %d 312 %fcmp = fcmp olt half %a.val, %b.val 313 %r.val = select i1 %fcmp, half 0xH3800, half %d.val 314 store half %r.val, half addrspace(1)* %r 315 ret void 316} 317 318define amdgpu_kernel void @select_f16_imm_d( 319; SI-LABEL: select_f16_imm_d: 320; SI: ; %bb.0: ; %entry 321; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 322; SI-NEXT: s_mov_b32 s11, 0xf000 323; SI-NEXT: s_mov_b32 s10, -1 324; SI-NEXT: s_mov_b32 s18, s10 325; SI-NEXT: s_mov_b32 s19, s11 326; SI-NEXT: s_waitcnt lgkmcnt(0) 327; SI-NEXT: s_mov_b32 s16, s2 328; SI-NEXT: s_mov_b32 s17, s3 329; SI-NEXT: s_mov_b32 s12, s6 330; SI-NEXT: s_mov_b32 s13, s7 331; SI-NEXT: s_mov_b32 s14, s10 332; SI-NEXT: s_mov_b32 s15, s11 333; SI-NEXT: s_mov_b32 s6, s10 334; SI-NEXT: s_mov_b32 s7, s11 335; SI-NEXT: buffer_load_ushort v0, off, s[16:19], 0 336; SI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 337; SI-NEXT: buffer_load_ushort v2, off, s[12:15], 0 338; SI-NEXT: s_mov_b32 s8, s0 339; SI-NEXT: s_mov_b32 s9, s1 340; SI-NEXT: s_waitcnt vmcnt(2) 341; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 342; SI-NEXT: s_waitcnt vmcnt(1) 343; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 344; SI-NEXT: s_waitcnt vmcnt(0) 345; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 346; SI-NEXT: v_cmp_lt_f32_e32 vcc, v0, v1 347; SI-NEXT: v_cndmask_b32_e32 v0, 0.5, v2, vcc 348; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 349; SI-NEXT: buffer_store_short v0, off, s[8:11], 0 350; SI-NEXT: s_endpgm 351; 352; VI-LABEL: select_f16_imm_d: 353; VI: ; %bb.0: ; %entry 354; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 355; VI-NEXT: s_mov_b32 s11, 0xf000 356; VI-NEXT: s_mov_b32 s10, -1 357; VI-NEXT: s_mov_b32 s14, s10 358; VI-NEXT: s_mov_b32 s15, s11 359; VI-NEXT: s_waitcnt lgkmcnt(0) 360; VI-NEXT: s_mov_b32 s8, s0 361; VI-NEXT: s_mov_b32 s9, s1 362; VI-NEXT: s_mov_b32 s0, s2 363; VI-NEXT: s_mov_b32 s1, s3 364; VI-NEXT: s_mov_b32 s2, s10 365; VI-NEXT: s_mov_b32 s3, s11 366; VI-NEXT: s_mov_b32 s12, s6 367; VI-NEXT: s_mov_b32 s13, s7 368; VI-NEXT: s_mov_b32 s6, s10 369; VI-NEXT: s_mov_b32 s7, s11 370; VI-NEXT: buffer_load_ushort v0, off, s[0:3], 0 371; VI-NEXT: buffer_load_ushort v1, off, s[4:7], 0 372; VI-NEXT: buffer_load_ushort v3, off, s[12:15], 0 373; VI-NEXT: v_mov_b32_e32 v2, 0x3800 374; VI-NEXT: s_waitcnt vmcnt(1) 375; VI-NEXT: v_cmp_lt_f16_e32 vcc, v0, v1 376; VI-NEXT: s_waitcnt vmcnt(0) 377; VI-NEXT: v_cndmask_b32_e32 v0, v2, v3, vcc 378; VI-NEXT: buffer_store_short v0, off, s[8:11], 0 379; VI-NEXT: s_endpgm 380 half addrspace(1)* %r, 381 half addrspace(1)* %a, 382 half addrspace(1)* %b, 383 half addrspace(1)* %c) { 384entry: 385 %a.val = load volatile half, half addrspace(1)* %a 386 %b.val = load volatile half, half addrspace(1)* %b 387 %c.val = load volatile half, half addrspace(1)* %c 388 %fcmp = fcmp olt half %a.val, %b.val 389 %r.val = select i1 %fcmp, half %c.val, half 0xH3800 390 store half %r.val, half addrspace(1)* %r 391 ret void 392} 393 394define amdgpu_kernel void @select_v2f16( 395; SI-LABEL: select_v2f16: 396; SI: ; %bb.0: ; %entry 397; SI-NEXT: s_load_dwordx8 s[4:11], s[0:1], 0x9 398; SI-NEXT: s_load_dwordx2 s[12:13], s[0:1], 0x11 399; SI-NEXT: s_mov_b32 s3, 0xf000 400; SI-NEXT: s_mov_b32 s2, -1 401; SI-NEXT: s_mov_b32 s22, s2 402; SI-NEXT: s_waitcnt lgkmcnt(0) 403; SI-NEXT: s_mov_b32 s20, s6 404; SI-NEXT: s_mov_b32 s21, s7 405; SI-NEXT: s_mov_b32 s23, s3 406; SI-NEXT: s_mov_b32 s16, s10 407; SI-NEXT: s_mov_b32 s17, s11 408; SI-NEXT: s_mov_b32 s14, s2 409; SI-NEXT: s_mov_b32 s15, s3 410; SI-NEXT: s_mov_b32 s18, s2 411; SI-NEXT: s_mov_b32 s19, s3 412; SI-NEXT: s_mov_b32 s10, s2 413; SI-NEXT: s_mov_b32 s11, s3 414; SI-NEXT: buffer_load_dword v0, off, s[20:23], 0 415; SI-NEXT: buffer_load_dword v1, off, s[8:11], 0 416; SI-NEXT: buffer_load_dword v2, off, s[12:15], 0 417; SI-NEXT: buffer_load_dword v3, off, s[16:19], 0 418; SI-NEXT: s_mov_b32 s0, s4 419; SI-NEXT: s_mov_b32 s1, s5 420; SI-NEXT: s_waitcnt vmcnt(3) 421; SI-NEXT: v_lshrrev_b32_e32 v5, 16, v0 422; SI-NEXT: s_waitcnt vmcnt(2) 423; SI-NEXT: v_lshrrev_b32_e32 v6, 16, v1 424; SI-NEXT: s_waitcnt vmcnt(1) 425; SI-NEXT: v_cvt_f32_f16_e32 v4, v2 426; SI-NEXT: s_waitcnt vmcnt(0) 427; SI-NEXT: v_lshrrev_b32_e32 v7, 16, v3 428; SI-NEXT: v_lshrrev_b32_e32 v2, 16, v2 429; SI-NEXT: v_cvt_f32_f16_e32 v5, v5 430; SI-NEXT: v_cvt_f32_f16_e32 v6, v6 431; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 432; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 433; SI-NEXT: v_cvt_f32_f16_e32 v7, v7 434; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 435; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 436; SI-NEXT: v_cmp_lt_f32_e32 vcc, v5, v6 437; SI-NEXT: v_cndmask_b32_e32 v2, v2, v7, vcc 438; SI-NEXT: v_cmp_lt_f32_e32 vcc, v0, v1 439; SI-NEXT: v_cndmask_b32_e32 v0, v4, v3, vcc 440; SI-NEXT: v_cvt_f16_f32_e32 v2, v2 441; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 442; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v2 443; SI-NEXT: v_or_b32_e32 v0, v0, v1 444; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 445; SI-NEXT: s_endpgm 446; 447; VI-LABEL: select_v2f16: 448; VI: ; %bb.0: ; %entry 449; VI-NEXT: s_load_dwordx8 s[4:11], s[0:1], 0x24 450; VI-NEXT: s_load_dwordx2 s[12:13], s[0:1], 0x44 451; VI-NEXT: s_mov_b32 s3, 0xf000 452; VI-NEXT: s_mov_b32 s2, -1 453; VI-NEXT: s_mov_b32 s14, s2 454; VI-NEXT: s_waitcnt lgkmcnt(0) 455; VI-NEXT: s_mov_b32 s0, s4 456; VI-NEXT: s_mov_b32 s1, s5 457; VI-NEXT: s_mov_b32 s4, s6 458; VI-NEXT: s_mov_b32 s5, s7 459; VI-NEXT: s_mov_b32 s6, s2 460; VI-NEXT: s_mov_b32 s7, s3 461; VI-NEXT: s_mov_b32 s16, s10 462; VI-NEXT: s_mov_b32 s17, s11 463; VI-NEXT: s_mov_b32 s15, s3 464; VI-NEXT: s_mov_b32 s18, s2 465; VI-NEXT: s_mov_b32 s19, s3 466; VI-NEXT: s_mov_b32 s10, s2 467; VI-NEXT: s_mov_b32 s11, s3 468; VI-NEXT: buffer_load_dword v0, off, s[4:7], 0 469; VI-NEXT: buffer_load_dword v1, off, s[8:11], 0 470; VI-NEXT: buffer_load_dword v2, off, s[12:15], 0 471; VI-NEXT: buffer_load_dword v3, off, s[16:19], 0 472; VI-NEXT: s_waitcnt vmcnt(3) 473; VI-NEXT: v_lshrrev_b32_e32 v6, 16, v0 474; VI-NEXT: s_waitcnt vmcnt(2) 475; VI-NEXT: v_cmp_lt_f16_e32 vcc, v0, v1 476; VI-NEXT: v_lshrrev_b32_e32 v5, 16, v1 477; VI-NEXT: s_waitcnt vmcnt(0) 478; VI-NEXT: v_cndmask_b32_e32 v0, v2, v3, vcc 479; VI-NEXT: v_lshrrev_b32_e32 v4, 16, v2 480; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v3 481; VI-NEXT: v_cmp_lt_f16_e32 vcc, v6, v5 482; VI-NEXT: v_cndmask_b32_e32 v1, v4, v1, vcc 483; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 484; VI-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 485; VI-NEXT: buffer_store_dword v0, off, s[0:3], 0 486; VI-NEXT: s_endpgm 487 <2 x half> addrspace(1)* %r, 488 <2 x half> addrspace(1)* %a, 489 <2 x half> addrspace(1)* %b, 490 <2 x half> addrspace(1)* %c, 491 <2 x half> addrspace(1)* %d) { 492entry: 493 %a.val = load <2 x half>, <2 x half> addrspace(1)* %a 494 %b.val = load <2 x half>, <2 x half> addrspace(1)* %b 495 %c.val = load <2 x half>, <2 x half> addrspace(1)* %c 496 %d.val = load <2 x half>, <2 x half> addrspace(1)* %d 497 %fcmp = fcmp olt <2 x half> %a.val, %b.val 498 %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val 499 store <2 x half> %r.val, <2 x half> addrspace(1)* %r 500 ret void 501} 502 503define amdgpu_kernel void @select_v2f16_imm_a( 504; SI-LABEL: select_v2f16_imm_a: 505; SI: ; %bb.0: ; %entry 506; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 507; SI-NEXT: s_mov_b32 s11, 0xf000 508; SI-NEXT: s_mov_b32 s10, -1 509; SI-NEXT: s_mov_b32 s14, s10 510; SI-NEXT: s_mov_b32 s15, s11 511; SI-NEXT: s_waitcnt lgkmcnt(0) 512; SI-NEXT: s_mov_b32 s12, s6 513; SI-NEXT: s_mov_b32 s13, s7 514; SI-NEXT: s_mov_b32 s16, s2 515; SI-NEXT: s_mov_b32 s17, s3 516; SI-NEXT: s_mov_b32 s18, s10 517; SI-NEXT: s_mov_b32 s19, s11 518; SI-NEXT: s_mov_b32 s6, s10 519; SI-NEXT: s_mov_b32 s7, s11 520; SI-NEXT: buffer_load_dword v0, off, s[16:19], 0 521; SI-NEXT: buffer_load_dword v1, off, s[4:7], 0 522; SI-NEXT: buffer_load_dword v2, off, s[12:15], 0 523; SI-NEXT: s_mov_b32 s2, 0x3f200000 524; SI-NEXT: s_mov_b32 s8, s0 525; SI-NEXT: s_mov_b32 s9, s1 526; SI-NEXT: s_waitcnt vmcnt(2) 527; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v0 528; SI-NEXT: s_waitcnt vmcnt(1) 529; SI-NEXT: v_lshrrev_b32_e32 v4, 16, v1 530; SI-NEXT: s_waitcnt vmcnt(0) 531; SI-NEXT: v_lshrrev_b32_e32 v5, 16, v2 532; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 533; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 534; SI-NEXT: v_cvt_f32_f16_e32 v4, v4 535; SI-NEXT: v_cvt_f32_f16_e32 v5, v5 536; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 537; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 538; SI-NEXT: v_cmp_lt_f32_e32 vcc, s2, v3 539; SI-NEXT: v_cndmask_b32_e32 v3, v5, v4, vcc 540; SI-NEXT: v_cmp_lt_f32_e32 vcc, 0.5, v0 541; SI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 542; SI-NEXT: v_cvt_f16_f32_e32 v3, v3 543; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 544; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v3 545; SI-NEXT: v_or_b32_e32 v0, v0, v1 546; SI-NEXT: buffer_store_dword v0, off, s[8:11], 0 547; SI-NEXT: s_endpgm 548; 549; VI-LABEL: select_v2f16_imm_a: 550; VI: ; %bb.0: ; %entry 551; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 552; VI-NEXT: s_mov_b32 s11, 0xf000 553; VI-NEXT: s_mov_b32 s10, -1 554; VI-NEXT: s_mov_b32 s14, s10 555; VI-NEXT: s_mov_b32 s15, s11 556; VI-NEXT: s_waitcnt lgkmcnt(0) 557; VI-NEXT: s_mov_b32 s8, s0 558; VI-NEXT: s_mov_b32 s9, s1 559; VI-NEXT: s_mov_b32 s12, s6 560; VI-NEXT: s_mov_b32 s13, s7 561; VI-NEXT: s_mov_b32 s0, s2 562; VI-NEXT: s_mov_b32 s1, s3 563; VI-NEXT: s_mov_b32 s2, s10 564; VI-NEXT: s_mov_b32 s3, s11 565; VI-NEXT: s_mov_b32 s6, s10 566; VI-NEXT: s_mov_b32 s7, s11 567; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0 568; VI-NEXT: buffer_load_dword v1, off, s[4:7], 0 569; VI-NEXT: buffer_load_dword v2, off, s[12:15], 0 570; VI-NEXT: s_movk_i32 s0, 0x3900 571; VI-NEXT: s_waitcnt vmcnt(2) 572; VI-NEXT: v_lshrrev_b32_e32 v3, 16, v0 573; VI-NEXT: v_cmp_lt_f16_e32 vcc, 0.5, v0 574; VI-NEXT: s_waitcnt vmcnt(0) 575; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 576; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1 577; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2 578; VI-NEXT: v_cmp_lt_f16_e32 vcc, s0, v3 579; VI-NEXT: v_cndmask_b32_e32 v1, v2, v1, vcc 580; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 581; VI-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 582; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 583; VI-NEXT: s_endpgm 584 <2 x half> addrspace(1)* %r, 585 <2 x half> addrspace(1)* %b, 586 <2 x half> addrspace(1)* %c, 587 <2 x half> addrspace(1)* %d) { 588entry: 589 %b.val = load <2 x half>, <2 x half> addrspace(1)* %b 590 %c.val = load <2 x half>, <2 x half> addrspace(1)* %c 591 %d.val = load <2 x half>, <2 x half> addrspace(1)* %d 592 %fcmp = fcmp olt <2 x half> <half 0xH3800, half 0xH3900>, %b.val 593 %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val 594 store <2 x half> %r.val, <2 x half> addrspace(1)* %r 595 ret void 596} 597 598define amdgpu_kernel void @select_v2f16_imm_b( 599; SI-LABEL: select_v2f16_imm_b: 600; SI: ; %bb.0: ; %entry 601; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 602; SI-NEXT: s_mov_b32 s11, 0xf000 603; SI-NEXT: s_mov_b32 s10, -1 604; SI-NEXT: s_mov_b32 s14, s10 605; SI-NEXT: s_mov_b32 s15, s11 606; SI-NEXT: s_waitcnt lgkmcnt(0) 607; SI-NEXT: s_mov_b32 s12, s6 608; SI-NEXT: s_mov_b32 s13, s7 609; SI-NEXT: s_mov_b32 s16, s2 610; SI-NEXT: s_mov_b32 s17, s3 611; SI-NEXT: s_mov_b32 s18, s10 612; SI-NEXT: s_mov_b32 s19, s11 613; SI-NEXT: s_mov_b32 s6, s10 614; SI-NEXT: s_mov_b32 s7, s11 615; SI-NEXT: buffer_load_dword v0, off, s[16:19], 0 616; SI-NEXT: buffer_load_dword v1, off, s[4:7], 0 617; SI-NEXT: buffer_load_dword v2, off, s[12:15], 0 618; SI-NEXT: s_mov_b32 s2, 0x3f200000 619; SI-NEXT: s_mov_b32 s8, s0 620; SI-NEXT: s_mov_b32 s9, s1 621; SI-NEXT: s_waitcnt vmcnt(2) 622; SI-NEXT: v_lshrrev_b32_e32 v3, 16, v0 623; SI-NEXT: s_waitcnt vmcnt(1) 624; SI-NEXT: v_lshrrev_b32_e32 v4, 16, v1 625; SI-NEXT: s_waitcnt vmcnt(0) 626; SI-NEXT: v_lshrrev_b32_e32 v5, 16, v2 627; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 628; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 629; SI-NEXT: v_cvt_f32_f16_e32 v4, v4 630; SI-NEXT: v_cvt_f32_f16_e32 v5, v5 631; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 632; SI-NEXT: v_cvt_f32_f16_e32 v2, v2 633; SI-NEXT: v_cmp_gt_f32_e32 vcc, s2, v3 634; SI-NEXT: v_cndmask_b32_e32 v3, v5, v4, vcc 635; SI-NEXT: v_cmp_gt_f32_e32 vcc, 0.5, v0 636; SI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 637; SI-NEXT: v_cvt_f16_f32_e32 v3, v3 638; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 639; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v3 640; SI-NEXT: v_or_b32_e32 v0, v0, v1 641; SI-NEXT: buffer_store_dword v0, off, s[8:11], 0 642; SI-NEXT: s_endpgm 643; 644; VI-LABEL: select_v2f16_imm_b: 645; VI: ; %bb.0: ; %entry 646; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 647; VI-NEXT: s_mov_b32 s11, 0xf000 648; VI-NEXT: s_mov_b32 s10, -1 649; VI-NEXT: s_mov_b32 s14, s10 650; VI-NEXT: s_mov_b32 s15, s11 651; VI-NEXT: s_waitcnt lgkmcnt(0) 652; VI-NEXT: s_mov_b32 s8, s0 653; VI-NEXT: s_mov_b32 s9, s1 654; VI-NEXT: s_mov_b32 s12, s6 655; VI-NEXT: s_mov_b32 s13, s7 656; VI-NEXT: s_mov_b32 s0, s2 657; VI-NEXT: s_mov_b32 s1, s3 658; VI-NEXT: s_mov_b32 s2, s10 659; VI-NEXT: s_mov_b32 s3, s11 660; VI-NEXT: s_mov_b32 s6, s10 661; VI-NEXT: s_mov_b32 s7, s11 662; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0 663; VI-NEXT: buffer_load_dword v1, off, s[4:7], 0 664; VI-NEXT: buffer_load_dword v2, off, s[12:15], 0 665; VI-NEXT: s_movk_i32 s0, 0x3900 666; VI-NEXT: s_waitcnt vmcnt(2) 667; VI-NEXT: v_lshrrev_b32_e32 v3, 16, v0 668; VI-NEXT: v_cmp_gt_f16_e32 vcc, 0.5, v0 669; VI-NEXT: s_waitcnt vmcnt(0) 670; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 671; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1 672; VI-NEXT: v_lshrrev_b32_e32 v2, 16, v2 673; VI-NEXT: v_cmp_gt_f16_e32 vcc, s0, v3 674; VI-NEXT: v_cndmask_b32_e32 v1, v2, v1, vcc 675; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 676; VI-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 677; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 678; VI-NEXT: s_endpgm 679 <2 x half> addrspace(1)* %r, 680 <2 x half> addrspace(1)* %a, 681 <2 x half> addrspace(1)* %c, 682 <2 x half> addrspace(1)* %d) { 683entry: 684 %a.val = load <2 x half>, <2 x half> addrspace(1)* %a 685 %c.val = load <2 x half>, <2 x half> addrspace(1)* %c 686 %d.val = load <2 x half>, <2 x half> addrspace(1)* %d 687 %fcmp = fcmp olt <2 x half> %a.val, <half 0xH3800, half 0xH3900> 688 %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> %d.val 689 store <2 x half> %r.val, <2 x half> addrspace(1)* %r 690 ret void 691} 692 693define amdgpu_kernel void @select_v2f16_imm_c( 694; SI-LABEL: select_v2f16_imm_c: 695; SI: ; %bb.0: ; %entry 696; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 697; SI-NEXT: s_mov_b32 s11, 0xf000 698; SI-NEXT: s_mov_b32 s10, -1 699; SI-NEXT: s_mov_b32 s18, s10 700; SI-NEXT: s_mov_b32 s19, s11 701; SI-NEXT: s_waitcnt lgkmcnt(0) 702; SI-NEXT: s_mov_b32 s12, s6 703; SI-NEXT: s_mov_b32 s13, s7 704; SI-NEXT: s_mov_b32 s6, s10 705; SI-NEXT: s_mov_b32 s7, s11 706; SI-NEXT: s_mov_b32 s16, s2 707; SI-NEXT: s_mov_b32 s17, s3 708; SI-NEXT: s_mov_b32 s14, s10 709; SI-NEXT: s_mov_b32 s15, s11 710; SI-NEXT: buffer_load_dword v0, off, s[16:19], 0 711; SI-NEXT: buffer_load_dword v1, off, s[12:15], 0 712; SI-NEXT: buffer_load_dword v3, off, s[4:7], 0 713; SI-NEXT: v_mov_b32_e32 v2, 0x3f200000 714; SI-NEXT: s_mov_b32 s8, s0 715; SI-NEXT: s_mov_b32 s9, s1 716; SI-NEXT: s_waitcnt vmcnt(2) 717; SI-NEXT: v_cvt_f32_f16_e32 v4, v0 718; SI-NEXT: v_lshrrev_b32_e32 v0, 16, v0 719; SI-NEXT: s_waitcnt vmcnt(0) 720; SI-NEXT: v_lshrrev_b32_e32 v5, 16, v3 721; SI-NEXT: v_lshrrev_b32_e32 v6, 16, v1 722; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 723; SI-NEXT: v_cvt_f32_f16_e32 v5, v5 724; SI-NEXT: v_cvt_f32_f16_e32 v6, v6 725; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 726; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 727; SI-NEXT: v_cmp_nlt_f32_e32 vcc, v0, v5 728; SI-NEXT: v_cndmask_b32_e32 v0, v2, v6, vcc 729; SI-NEXT: v_cmp_nlt_f32_e32 vcc, v4, v3 730; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 731; SI-NEXT: v_cndmask_b32_e32 v1, 0.5, v1, vcc 732; SI-NEXT: v_cvt_f16_f32_e32 v1, v1 733; SI-NEXT: v_lshlrev_b32_e32 v0, 16, v0 734; SI-NEXT: v_or_b32_e32 v0, v1, v0 735; SI-NEXT: buffer_store_dword v0, off, s[8:11], 0 736; SI-NEXT: s_endpgm 737; 738; VI-LABEL: select_v2f16_imm_c: 739; VI: ; %bb.0: ; %entry 740; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 741; VI-NEXT: s_mov_b32 s11, 0xf000 742; VI-NEXT: s_mov_b32 s10, -1 743; VI-NEXT: s_mov_b32 s14, s10 744; VI-NEXT: s_mov_b32 s15, s11 745; VI-NEXT: s_waitcnt lgkmcnt(0) 746; VI-NEXT: s_mov_b32 s8, s0 747; VI-NEXT: s_mov_b32 s9, s1 748; VI-NEXT: s_mov_b32 s12, s6 749; VI-NEXT: s_mov_b32 s13, s7 750; VI-NEXT: s_mov_b32 s0, s2 751; VI-NEXT: s_mov_b32 s1, s3 752; VI-NEXT: s_mov_b32 s6, s10 753; VI-NEXT: s_mov_b32 s7, s11 754; VI-NEXT: s_mov_b32 s2, s10 755; VI-NEXT: s_mov_b32 s3, s11 756; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0 757; VI-NEXT: buffer_load_dword v1, off, s[12:15], 0 758; VI-NEXT: buffer_load_dword v4, off, s[4:7], 0 759; VI-NEXT: v_mov_b32_e32 v2, 0x3800 760; VI-NEXT: v_mov_b32_e32 v3, 0x3900 761; VI-NEXT: s_waitcnt vmcnt(2) 762; VI-NEXT: v_lshrrev_b32_e32 v6, 16, v0 763; VI-NEXT: s_waitcnt vmcnt(0) 764; VI-NEXT: v_cmp_nlt_f16_e32 vcc, v0, v4 765; VI-NEXT: v_lshrrev_b32_e32 v5, 16, v4 766; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 767; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1 768; VI-NEXT: v_cmp_nlt_f16_e32 vcc, v6, v5 769; VI-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc 770; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 771; VI-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 772; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 773; VI-NEXT: s_endpgm 774 <2 x half> addrspace(1)* %r, 775 <2 x half> addrspace(1)* %a, 776 <2 x half> addrspace(1)* %b, 777 <2 x half> addrspace(1)* %d) { 778entry: 779 %a.val = load <2 x half>, <2 x half> addrspace(1)* %a 780 %b.val = load <2 x half>, <2 x half> addrspace(1)* %b 781 %d.val = load <2 x half>, <2 x half> addrspace(1)* %d 782 %fcmp = fcmp olt <2 x half> %a.val, %b.val 783 %r.val = select <2 x i1> %fcmp, <2 x half> <half 0xH3800, half 0xH3900>, <2 x half> %d.val 784 store <2 x half> %r.val, <2 x half> addrspace(1)* %r 785 ret void 786} 787 788define amdgpu_kernel void @select_v2f16_imm_d( 789; SI-LABEL: select_v2f16_imm_d: 790; SI: ; %bb.0: ; %entry 791; SI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x9 792; SI-NEXT: s_mov_b32 s11, 0xf000 793; SI-NEXT: s_mov_b32 s10, -1 794; SI-NEXT: s_mov_b32 s18, s10 795; SI-NEXT: s_mov_b32 s19, s11 796; SI-NEXT: s_waitcnt lgkmcnt(0) 797; SI-NEXT: s_mov_b32 s12, s6 798; SI-NEXT: s_mov_b32 s13, s7 799; SI-NEXT: s_mov_b32 s6, s10 800; SI-NEXT: s_mov_b32 s7, s11 801; SI-NEXT: s_mov_b32 s16, s2 802; SI-NEXT: s_mov_b32 s17, s3 803; SI-NEXT: s_mov_b32 s14, s10 804; SI-NEXT: s_mov_b32 s15, s11 805; SI-NEXT: buffer_load_dword v0, off, s[16:19], 0 806; SI-NEXT: buffer_load_dword v1, off, s[12:15], 0 807; SI-NEXT: buffer_load_dword v3, off, s[4:7], 0 808; SI-NEXT: v_mov_b32_e32 v2, 0x3f200000 809; SI-NEXT: s_mov_b32 s8, s0 810; SI-NEXT: s_mov_b32 s9, s1 811; SI-NEXT: s_waitcnt vmcnt(2) 812; SI-NEXT: v_lshrrev_b32_e32 v4, 16, v0 813; SI-NEXT: s_waitcnt vmcnt(1) 814; SI-NEXT: v_lshrrev_b32_e32 v6, 16, v1 815; SI-NEXT: s_waitcnt vmcnt(0) 816; SI-NEXT: v_lshrrev_b32_e32 v5, 16, v3 817; SI-NEXT: v_cvt_f32_f16_e32 v4, v4 818; SI-NEXT: v_cvt_f32_f16_e32 v5, v5 819; SI-NEXT: v_cvt_f32_f16_e32 v0, v0 820; SI-NEXT: v_cvt_f32_f16_e32 v6, v6 821; SI-NEXT: v_cvt_f32_f16_e32 v3, v3 822; SI-NEXT: v_cvt_f32_f16_e32 v1, v1 823; SI-NEXT: v_cmp_lt_f32_e32 vcc, v4, v5 824; SI-NEXT: v_cndmask_b32_e32 v2, v2, v6, vcc 825; SI-NEXT: v_cmp_lt_f32_e32 vcc, v0, v3 826; SI-NEXT: v_cndmask_b32_e32 v0, 0.5, v1, vcc 827; SI-NEXT: v_cvt_f16_f32_e32 v2, v2 828; SI-NEXT: v_cvt_f16_f32_e32 v0, v0 829; SI-NEXT: v_lshlrev_b32_e32 v1, 16, v2 830; SI-NEXT: v_or_b32_e32 v0, v0, v1 831; SI-NEXT: buffer_store_dword v0, off, s[8:11], 0 832; SI-NEXT: s_endpgm 833; 834; VI-LABEL: select_v2f16_imm_d: 835; VI: ; %bb.0: ; %entry 836; VI-NEXT: s_load_dwordx8 s[0:7], s[0:1], 0x24 837; VI-NEXT: s_mov_b32 s11, 0xf000 838; VI-NEXT: s_mov_b32 s10, -1 839; VI-NEXT: s_mov_b32 s14, s10 840; VI-NEXT: s_mov_b32 s15, s11 841; VI-NEXT: s_waitcnt lgkmcnt(0) 842; VI-NEXT: s_mov_b32 s8, s0 843; VI-NEXT: s_mov_b32 s9, s1 844; VI-NEXT: s_mov_b32 s12, s6 845; VI-NEXT: s_mov_b32 s13, s7 846; VI-NEXT: s_mov_b32 s0, s2 847; VI-NEXT: s_mov_b32 s1, s3 848; VI-NEXT: s_mov_b32 s6, s10 849; VI-NEXT: s_mov_b32 s7, s11 850; VI-NEXT: s_mov_b32 s2, s10 851; VI-NEXT: s_mov_b32 s3, s11 852; VI-NEXT: buffer_load_dword v0, off, s[0:3], 0 853; VI-NEXT: buffer_load_dword v1, off, s[12:15], 0 854; VI-NEXT: buffer_load_dword v4, off, s[4:7], 0 855; VI-NEXT: v_mov_b32_e32 v2, 0x3800 856; VI-NEXT: v_mov_b32_e32 v3, 0x3900 857; VI-NEXT: s_waitcnt vmcnt(2) 858; VI-NEXT: v_lshrrev_b32_e32 v6, 16, v0 859; VI-NEXT: s_waitcnt vmcnt(0) 860; VI-NEXT: v_cmp_lt_f16_e32 vcc, v0, v4 861; VI-NEXT: v_lshrrev_b32_e32 v5, 16, v4 862; VI-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc 863; VI-NEXT: v_lshrrev_b32_e32 v1, 16, v1 864; VI-NEXT: v_cmp_lt_f16_e32 vcc, v6, v5 865; VI-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc 866; VI-NEXT: v_lshlrev_b32_e32 v1, 16, v1 867; VI-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD 868; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 869; VI-NEXT: s_endpgm 870 <2 x half> addrspace(1)* %r, 871 <2 x half> addrspace(1)* %a, 872 <2 x half> addrspace(1)* %b, 873 <2 x half> addrspace(1)* %c) { 874entry: 875 %a.val = load <2 x half>, <2 x half> addrspace(1)* %a 876 %b.val = load <2 x half>, <2 x half> addrspace(1)* %b 877 %c.val = load <2 x half>, <2 x half> addrspace(1)* %c 878 %fcmp = fcmp olt <2 x half> %a.val, %b.val 879 %r.val = select <2 x i1> %fcmp, <2 x half> %c.val, <2 x half> <half 0xH3800, half 0xH3900> 880 store <2 x half> %r.val, <2 x half> addrspace(1)* %r 881 ret void 882} 883