1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-SDAG %s 3; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-SDAG %s 4; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-SDAG %s 5; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG-TRUE16 %s 6; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG-FAKE16 %s 7 8; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-GISEL %s 9; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-GISEL %s 10; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-GISEL %s 11; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL-TRUE16 %s 12; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL-FAKE16 %s 13 14define float @test_ldexp_f32_i32(ptr addrspace(1) %out, float %a, i32 %b) { 15; GFX6-LABEL: test_ldexp_f32_i32: 16; GFX6: ; %bb.0: 17; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 18; GFX6-NEXT: v_ldexp_f32_e32 v0, v2, v3 19; GFX6-NEXT: s_setpc_b64 s[30:31] 20; 21; GFX8-LABEL: test_ldexp_f32_i32: 22; GFX8: ; %bb.0: 23; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 24; GFX8-NEXT: v_ldexp_f32 v0, v2, v3 25; GFX8-NEXT: s_setpc_b64 s[30:31] 26; 27; GFX9-LABEL: test_ldexp_f32_i32: 28; GFX9: ; %bb.0: 29; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 30; GFX9-NEXT: v_ldexp_f32 v0, v2, v3 31; GFX9-NEXT: s_setpc_b64 s[30:31] 32; 33; GFX11-LABEL: test_ldexp_f32_i32: 34; GFX11: ; %bb.0: 35; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 36; GFX11-NEXT: v_ldexp_f32 v0, v2, v3 37; GFX11-NEXT: s_setpc_b64 s[30:31] 38 %result = call float @llvm.ldexp.f32.i32(float %a, i32 %b) 39 ret float %result 40} 41 42define <2 x float> @test_ldexp_v2f32_v2i32(ptr addrspace(1) %out, <2 x float> %a, <2 x i32> %b) { 43; GFX6-LABEL: test_ldexp_v2f32_v2i32: 44; GFX6: ; %bb.0: 45; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 46; GFX6-NEXT: v_ldexp_f32_e32 v0, v2, v4 47; GFX6-NEXT: v_ldexp_f32_e32 v1, v3, v5 48; GFX6-NEXT: s_setpc_b64 s[30:31] 49; 50; GFX8-LABEL: test_ldexp_v2f32_v2i32: 51; GFX8: ; %bb.0: 52; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 53; GFX8-NEXT: v_ldexp_f32 v0, v2, v4 54; GFX8-NEXT: v_ldexp_f32 v1, v3, v5 55; GFX8-NEXT: s_setpc_b64 s[30:31] 56; 57; GFX9-LABEL: test_ldexp_v2f32_v2i32: 58; GFX9: ; %bb.0: 59; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 60; GFX9-NEXT: v_ldexp_f32 v0, v2, v4 61; GFX9-NEXT: v_ldexp_f32 v1, v3, v5 62; GFX9-NEXT: s_setpc_b64 s[30:31] 63; 64; GFX11-LABEL: test_ldexp_v2f32_v2i32: 65; GFX11: ; %bb.0: 66; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 67; GFX11-NEXT: v_ldexp_f32 v0, v2, v4 68; GFX11-NEXT: v_ldexp_f32 v1, v3, v5 69; GFX11-NEXT: s_setpc_b64 s[30:31] 70 %result = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %a, <2 x i32> %b) 71 ret <2 x float> %result 72} 73 74define <3 x float> @test_ldexp_v3f32_v3i32(ptr addrspace(1) %out, <3 x float> %a, <3 x i32> %b) { 75; GFX6-LABEL: test_ldexp_v3f32_v3i32: 76; GFX6: ; %bb.0: 77; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 78; GFX6-NEXT: v_ldexp_f32_e32 v0, v2, v5 79; GFX6-NEXT: v_ldexp_f32_e32 v1, v3, v6 80; GFX6-NEXT: v_ldexp_f32_e32 v2, v4, v7 81; GFX6-NEXT: s_setpc_b64 s[30:31] 82; 83; GFX8-LABEL: test_ldexp_v3f32_v3i32: 84; GFX8: ; %bb.0: 85; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 86; GFX8-NEXT: v_ldexp_f32 v0, v2, v5 87; GFX8-NEXT: v_ldexp_f32 v1, v3, v6 88; GFX8-NEXT: v_ldexp_f32 v2, v4, v7 89; GFX8-NEXT: s_setpc_b64 s[30:31] 90; 91; GFX9-LABEL: test_ldexp_v3f32_v3i32: 92; GFX9: ; %bb.0: 93; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 94; GFX9-NEXT: v_ldexp_f32 v0, v2, v5 95; GFX9-NEXT: v_ldexp_f32 v1, v3, v6 96; GFX9-NEXT: v_ldexp_f32 v2, v4, v7 97; GFX9-NEXT: s_setpc_b64 s[30:31] 98; 99; GFX11-LABEL: test_ldexp_v3f32_v3i32: 100; GFX11: ; %bb.0: 101; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 102; GFX11-NEXT: v_ldexp_f32 v0, v2, v5 103; GFX11-NEXT: v_ldexp_f32 v1, v3, v6 104; GFX11-NEXT: v_ldexp_f32 v2, v4, v7 105; GFX11-NEXT: s_setpc_b64 s[30:31] 106 %result = call <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float> %a, <3 x i32> %b) 107 ret <3 x float> %result 108} 109 110define <4 x float> @test_ldexp_v4f32_v4i32(ptr addrspace(1) %out, <4 x float> %a, <4 x i32> %b) { 111; GFX6-LABEL: test_ldexp_v4f32_v4i32: 112; GFX6: ; %bb.0: 113; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 114; GFX6-NEXT: v_ldexp_f32_e32 v0, v2, v6 115; GFX6-NEXT: v_ldexp_f32_e32 v1, v3, v7 116; GFX6-NEXT: v_ldexp_f32_e32 v2, v4, v8 117; GFX6-NEXT: v_ldexp_f32_e32 v3, v5, v9 118; GFX6-NEXT: s_setpc_b64 s[30:31] 119; 120; GFX8-LABEL: test_ldexp_v4f32_v4i32: 121; GFX8: ; %bb.0: 122; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 123; GFX8-NEXT: v_ldexp_f32 v0, v2, v6 124; GFX8-NEXT: v_ldexp_f32 v1, v3, v7 125; GFX8-NEXT: v_ldexp_f32 v2, v4, v8 126; GFX8-NEXT: v_ldexp_f32 v3, v5, v9 127; GFX8-NEXT: s_setpc_b64 s[30:31] 128; 129; GFX9-LABEL: test_ldexp_v4f32_v4i32: 130; GFX9: ; %bb.0: 131; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 132; GFX9-NEXT: v_ldexp_f32 v0, v2, v6 133; GFX9-NEXT: v_ldexp_f32 v1, v3, v7 134; GFX9-NEXT: v_ldexp_f32 v2, v4, v8 135; GFX9-NEXT: v_ldexp_f32 v3, v5, v9 136; GFX9-NEXT: s_setpc_b64 s[30:31] 137; 138; GFX11-LABEL: test_ldexp_v4f32_v4i32: 139; GFX11: ; %bb.0: 140; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 141; GFX11-NEXT: v_ldexp_f32 v0, v2, v6 142; GFX11-NEXT: v_ldexp_f32 v1, v3, v7 143; GFX11-NEXT: v_ldexp_f32 v2, v4, v8 144; GFX11-NEXT: v_ldexp_f32 v3, v5, v9 145; GFX11-NEXT: s_setpc_b64 s[30:31] 146 %result = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %a, <4 x i32> %b) 147 ret <4 x float> %result 148} 149 150define double @test_ldexp_f64_i32(double %a, i32 %b) { 151; GCN-LABEL: test_ldexp_f64_i32: 152; GCN: ; %bb.0: 153; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 154; GCN-NEXT: v_ldexp_f64 v[0:1], v[0:1], v2 155; GCN-NEXT: s_setpc_b64 s[30:31] 156 %result = call double @llvm.ldexp.f64.i32(double %a, i32 %b) 157 ret double %result 158} 159 160define <2 x double> @test_ldexp_v2f64_v2i32(<2 x double> %a, <2 x i32> %b) { 161; GCN-LABEL: test_ldexp_v2f64_v2i32: 162; GCN: ; %bb.0: 163; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 164; GCN-NEXT: v_ldexp_f64 v[0:1], v[0:1], v4 165; GCN-NEXT: v_ldexp_f64 v[2:3], v[2:3], v5 166; GCN-NEXT: s_setpc_b64 s[30:31] 167 %result = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %a, <2 x i32> %b) 168 ret <2 x double> %result 169} 170 171; Broken for DAG 172; define float @test_ldexp_f32_i16(float %a, i16 %b) { 173; %result = call float @llvm.ldexp.f32.i16(float %a, i16 %b) 174; ret float %result 175; } 176 177; FIXME: Should be able to truncate to i32 178; define float @test_ldexp_f32_i64(float %a, i64 %b) { 179; %result = call float @llvm.ldexp.f32.i64(float %a, i64 %b) 180; ret float %result 181; } 182 183; define <2 x float> @test_ldexp_v2f32_v2i16(<2 x float> %a, <2 x i16> %b) { 184; %result = call <2 x float> @llvm.ldexp.v2f32.v2i16(<2 x float> %a, <2 x i16> %b) 185; ret <2 x float> %result 186; } 187 188; FIXME: Should be able to truncate to i32 189; define <2 x float> @test_ldexp_v2f32_v2i64(<2 x float> %a, <2 x i64> %b) { 190; %result = call <2 x float> @llvm.ldexp.v2f32.v2i64(<2 x float> %a, <2 x i64> %b) 191; ret <2 x float> %result 192; } 193 194define half @test_ldexp_f16_i8(half %a, i8 %b) { 195; GFX6-SDAG-LABEL: test_ldexp_f16_i8: 196; GFX6-SDAG: ; %bb.0: 197; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 198; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 199; GFX6-SDAG-NEXT: v_bfe_i32 v1, v1, 0, 8 200; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 201; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v1 202; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 203; 204; GFX8-SDAG-LABEL: test_ldexp_f16_i8: 205; GFX8-SDAG: ; %bb.0: 206; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 207; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v0, v0, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 208; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 209; 210; GFX9-SDAG-LABEL: test_ldexp_f16_i8: 211; GFX9-SDAG: ; %bb.0: 212; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 213; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v0, v0, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0 214; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 215; 216; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i8: 217; GFX11-SDAG-TRUE16: ; %bb.0: 218; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 219; GFX11-SDAG-TRUE16-NEXT: v_bfe_i32 v1, v1, 0, 8 220; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 221; GFX11-SDAG-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l 222; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v0.h 223; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 224; 225; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i8: 226; GFX11-SDAG-FAKE16: ; %bb.0: 227; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 228; GFX11-SDAG-FAKE16-NEXT: v_bfe_i32 v1, v1, 0, 8 229; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 230; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 231; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 232; 233; GFX6-GISEL-LABEL: test_ldexp_f16_i8: 234; GFX6-GISEL: ; %bb.0: 235; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 236; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 237; GFX6-GISEL-NEXT: v_bfe_i32 v1, v1, 0, 8 238; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v1 239; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 240; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 241; 242; GFX8-GISEL-LABEL: test_ldexp_f16_i8: 243; GFX8-GISEL: ; %bb.0: 244; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 245; GFX8-GISEL-NEXT: v_bfe_i32 v1, v1, 0, 8 246; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, 0xffff8000 247; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, 0x7fff 248; GFX8-GISEL-NEXT: v_med3_i32 v1, v1, v2, v3 249; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v0, v0, v1 250; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 251; 252; GFX9-GISEL-LABEL: test_ldexp_f16_i8: 253; GFX9-GISEL: ; %bb.0: 254; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 255; GFX9-GISEL-NEXT: v_bfe_i32 v1, v1, 0, 8 256; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0xffff8000 257; GFX9-GISEL-NEXT: v_mov_b32_e32 v3, 0x7fff 258; GFX9-GISEL-NEXT: v_med3_i32 v1, v1, v2, v3 259; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v0, v0, v1 260; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 261; 262; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i8: 263; GFX11-GISEL-TRUE16: ; %bb.0: 264; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 265; GFX11-GISEL-TRUE16-NEXT: v_bfe_i32 v1, v1, 0, 8 266; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v2, 0x7fff 267; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 268; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v2 269; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 270; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 271; 272; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i8: 273; GFX11-GISEL-FAKE16: ; %bb.0: 274; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 275; GFX11-GISEL-FAKE16-NEXT: v_bfe_i32 v1, v1, 0, 8 276; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v2, 0x7fff 277; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 278; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v2 279; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 280; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 281 %result = call half @llvm.ldexp.f16.i8(half %a, i8 %b) 282 ret half %result 283} 284 285define half @test_ldexp_f16_i16(half %a, i16 %b) { 286; GFX6-SDAG-LABEL: test_ldexp_f16_i16: 287; GFX6-SDAG: ; %bb.0: 288; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 289; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 290; GFX6-SDAG-NEXT: v_bfe_i32 v1, v1, 0, 16 291; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 292; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v1 293; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 294; 295; GFX8-LABEL: test_ldexp_f16_i16: 296; GFX8: ; %bb.0: 297; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 298; GFX8-NEXT: v_ldexp_f16_e32 v0, v0, v1 299; GFX8-NEXT: s_setpc_b64 s[30:31] 300; 301; GFX9-LABEL: test_ldexp_f16_i16: 302; GFX9: ; %bb.0: 303; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 304; GFX9-NEXT: v_ldexp_f16_e32 v0, v0, v1 305; GFX9-NEXT: s_setpc_b64 s[30:31] 306; 307; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i16: 308; GFX11-SDAG-TRUE16: ; %bb.0: 309; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 310; GFX11-SDAG-TRUE16-NEXT: v_mov_b16_e32 v0.h, v1.l 311; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 312; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v0.h 313; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 314; 315; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i16: 316; GFX11-SDAG-FAKE16: ; %bb.0: 317; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 318; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 319; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 320; 321; GFX6-GISEL-LABEL: test_ldexp_f16_i16: 322; GFX6-GISEL: ; %bb.0: 323; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 324; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 325; GFX6-GISEL-NEXT: v_bfe_i32 v1, v1, 0, 16 326; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v1 327; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 328; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 329; 330; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i16: 331; GFX11-GISEL-TRUE16: ; %bb.0: 332; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 333; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 334; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 335; 336; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i16: 337; GFX11-GISEL-FAKE16: ; %bb.0: 338; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 339; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 340; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 341 %result = call half @llvm.ldexp.f16.i16(half %a, i16 %b) 342 ret half %result 343} 344 345define half @test_ldexp_f16_i32(half %a, i32 %b) { 346; GFX6-SDAG-LABEL: test_ldexp_f16_i32: 347; GFX6-SDAG: ; %bb.0: 348; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 349; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 350; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 351; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v1 352; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 353; 354; GFX8-SDAG-LABEL: test_ldexp_f16_i32: 355; GFX8-SDAG: ; %bb.0: 356; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 357; GFX8-SDAG-NEXT: s_movk_i32 s4, 0x8000 358; GFX8-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fff 359; GFX8-SDAG-NEXT: v_med3_i32 v1, v1, s4, v2 360; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 361; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 362; 363; GFX9-SDAG-LABEL: test_ldexp_f16_i32: 364; GFX9-SDAG: ; %bb.0: 365; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 366; GFX9-SDAG-NEXT: s_movk_i32 s4, 0x8000 367; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, 0x7fff 368; GFX9-SDAG-NEXT: v_med3_i32 v1, v1, s4, v2 369; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 370; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 371; 372; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i32: 373; GFX11-SDAG-TRUE16: ; %bb.0: 374; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 375; GFX11-SDAG-TRUE16-NEXT: s_movk_i32 s0, 0x8000 376; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 377; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v1, v1, s0, 0x7fff 378; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 379; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 380; 381; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i32: 382; GFX11-SDAG-FAKE16: ; %bb.0: 383; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 384; GFX11-SDAG-FAKE16-NEXT: s_movk_i32 s0, 0x8000 385; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) 386; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v1, v1, s0, 0x7fff 387; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 388; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 389; 390; GFX6-GISEL-LABEL: test_ldexp_f16_i32: 391; GFX6-GISEL: ; %bb.0: 392; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 393; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 394; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v1 395; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 396; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 397; 398; GFX8-GISEL-LABEL: test_ldexp_f16_i32: 399; GFX8-GISEL: ; %bb.0: 400; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 401; GFX8-GISEL-NEXT: v_mov_b32_e32 v2, 0xffff8000 402; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, 0x7fff 403; GFX8-GISEL-NEXT: v_med3_i32 v1, v1, v2, v3 404; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v0, v0, v1 405; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 406; 407; GFX9-GISEL-LABEL: test_ldexp_f16_i32: 408; GFX9-GISEL: ; %bb.0: 409; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 410; GFX9-GISEL-NEXT: v_mov_b32_e32 v2, 0xffff8000 411; GFX9-GISEL-NEXT: v_mov_b32_e32 v3, 0x7fff 412; GFX9-GISEL-NEXT: v_med3_i32 v1, v1, v2, v3 413; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v0, v0, v1 414; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 415; 416; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i32: 417; GFX11-GISEL-TRUE16: ; %bb.0: 418; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 419; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v2, 0x7fff 420; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 421; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v2 422; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 423; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 424; 425; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i32: 426; GFX11-GISEL-FAKE16: ; %bb.0: 427; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 428; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v2, 0x7fff 429; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) 430; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v2 431; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 432; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 433 %result = call half @llvm.ldexp.f16.i32(half %a, i32 %b) 434 ret half %result 435} 436 437define <2 x half> @test_ldexp_v2f16_v2i32(<2 x half> %a, <2 x i32> %b) { 438; GFX6-SDAG-LABEL: test_ldexp_v2f16_v2i32: 439; GFX6-SDAG: ; %bb.0: 440; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 441; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 442; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 443; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 444; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 445; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v2 446; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v3 447; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 448; 449; GFX8-SDAG-LABEL: test_ldexp_v2f16_v2i32: 450; GFX8-SDAG: ; %bb.0: 451; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 452; GFX8-SDAG-NEXT: s_movk_i32 s4, 0x8000 453; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, 0x7fff 454; GFX8-SDAG-NEXT: v_med3_i32 v2, v2, s4, v3 455; GFX8-SDAG-NEXT: v_med3_i32 v1, v1, s4, v3 456; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 457; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 458; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2 459; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 460; 461; GFX9-SDAG-LABEL: test_ldexp_v2f16_v2i32: 462; GFX9-SDAG: ; %bb.0: 463; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 464; GFX9-SDAG-NEXT: s_movk_i32 s4, 0x8000 465; GFX9-SDAG-NEXT: v_mov_b32_e32 v3, 0x7fff 466; GFX9-SDAG-NEXT: v_med3_i32 v2, v2, s4, v3 467; GFX9-SDAG-NEXT: v_med3_i32 v1, v1, s4, v3 468; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v2, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 469; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 470; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v2 471; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 472; 473; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v2f16_v2i32: 474; GFX11-SDAG-TRUE16: ; %bb.0: 475; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 476; GFX11-SDAG-TRUE16-NEXT: s_movk_i32 s0, 0x8000 477; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 478; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 479; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v1, v1, s0, 0x7fff 480; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 481; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v3.l, v2.l 482; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 483; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 484; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 485; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 486; 487; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i32: 488; GFX11-SDAG-FAKE16: ; %bb.0: 489; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 490; GFX11-SDAG-FAKE16-NEXT: s_movk_i32 s0, 0x8000 491; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 492; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 493; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v1, v1, s0, 0x7fff 494; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 495; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v2, v3, v2 496; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 497; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 498; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v2 499; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 500; 501; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i32: 502; GFX6-GISEL: ; %bb.0: 503; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 504; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 505; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 506; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v2 507; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v3 508; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 509; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 510; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 511; 512; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i32: 513; GFX8-GISEL: ; %bb.0: 514; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 515; GFX8-GISEL-NEXT: v_mov_b32_e32 v3, 0xffff8000 516; GFX8-GISEL-NEXT: v_mov_b32_e32 v4, 0x7fff 517; GFX8-GISEL-NEXT: v_med3_i32 v1, v1, v3, v4 518; GFX8-GISEL-NEXT: v_med3_i32 v2, v2, v3, v4 519; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v1, v0, v1 520; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 521; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v1, v0 522; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 523; 524; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i32: 525; GFX9-GISEL: ; %bb.0: 526; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 527; GFX9-GISEL-NEXT: v_mov_b32_e32 v3, 0xffff8000 528; GFX9-GISEL-NEXT: v_mov_b32_e32 v4, 0x7fff 529; GFX9-GISEL-NEXT: v_med3_i32 v1, v1, v3, v4 530; GFX9-GISEL-NEXT: v_med3_i32 v2, v2, v3, v4 531; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v1, v0, v1 532; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 533; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v1 534; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 535; 536; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i32: 537; GFX11-GISEL-TRUE16: ; %bb.0: 538; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 539; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v3, 0x7fff 540; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 541; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) 542; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v3 543; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v3 544; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 545; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 546; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v4.l, v2.l 547; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.l 548; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 549; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 550; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v1, 0xffff, v1 551; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 552; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, v1 553; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 554; 555; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i32: 556; GFX11-GISEL-FAKE16: ; %bb.0: 557; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 558; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v3, 0x7fff 559; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 560; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) 561; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v1, 0xffff8000, v1, v3 562; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v3 563; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 564; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 565; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v4, v2 566; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 567; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 568; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0 569; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 570 %result = call <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half> %a, <2 x i32> %b) 571 ret <2 x half> %result 572} 573 574define <2 x half> @test_ldexp_v2f16_v2i16(<2 x half> %a, <2 x i16> %b) { 575; GFX6-SDAG-LABEL: test_ldexp_v2f16_v2i16: 576; GFX6-SDAG: ; %bb.0: 577; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 578; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 579; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 580; GFX6-SDAG-NEXT: v_bfe_i32 v3, v3, 0, 16 581; GFX6-SDAG-NEXT: v_bfe_i32 v2, v2, 0, 16 582; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 583; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 584; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v2 585; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v3 586; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 587; 588; GFX8-SDAG-LABEL: test_ldexp_v2f16_v2i16: 589; GFX8-SDAG: ; %bb.0: 590; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 591; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 592; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 593; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v2 594; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 595; 596; GFX9-SDAG-LABEL: test_ldexp_v2f16_v2i16: 597; GFX9-SDAG: ; %bb.0: 598; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 599; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 600; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v1 601; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v2 602; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 603; 604; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v2f16_v2i16: 605; GFX11-SDAG-TRUE16: ; %bb.0: 606; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 607; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v2, 16, v1 608; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 609; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 610; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) 611; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v3.l, v2.l 612; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 613; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 614; 615; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i16: 616; GFX11-SDAG-FAKE16: ; %bb.0: 617; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 618; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v1 619; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v0 620; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 621; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) 622; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v2, v3, v2 623; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v2 624; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 625; 626; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i16: 627; GFX6-GISEL: ; %bb.0: 628; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 629; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 630; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 631; GFX6-GISEL-NEXT: v_bfe_i32 v2, v2, 0, 16 632; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v2 633; GFX6-GISEL-NEXT: v_bfe_i32 v2, v3, 0, 16 634; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v2 635; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 636; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 637; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 638; 639; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i16: 640; GFX8-GISEL: ; %bb.0: 641; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 642; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v1 643; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 644; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0 645; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 646; 647; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i16: 648; GFX9-GISEL: ; %bb.0: 649; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 650; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v1 651; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 652; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v2 653; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 654; 655; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i16: 656; GFX11-GISEL-TRUE16: ; %bb.0: 657; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 658; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v2, 16, v0 659; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v3, 16, v1 660; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v1.l 661; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 662; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v2.l, v3.l 663; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v1.l, v0.l 664; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 665; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 666; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v1, 0xffff, v1 667; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 668; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, v1 669; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 670; 671; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i16: 672; GFX11-GISEL-FAKE16: ; %bb.0: 673; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 674; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v2, 16, v0 675; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v3, 16, v1 676; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v1 677; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 678; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v2, v3 679; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 680; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 681; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v1, 16, v0 682; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 683 %result = call <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half> %a, <2 x i16> %b) 684 ret <2 x half> %result 685} 686 687define <3 x half> @test_ldexp_v3f16_v3i32(<3 x half> %a, <3 x i32> %b) { 688; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i32: 689; GFX6-SDAG: ; %bb.0: 690; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 691; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 692; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 693; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v2, v2 694; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 695; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 696; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v2, v2 697; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v3 698; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v4 699; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v2, v2, v5 700; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 701; 702; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i32: 703; GFX8-SDAG: ; %bb.0: 704; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 705; GFX8-SDAG-NEXT: s_movk_i32 s4, 0x8000 706; GFX8-SDAG-NEXT: v_mov_b32_e32 v5, 0x7fff 707; GFX8-SDAG-NEXT: v_med3_i32 v2, v2, s4, v5 708; GFX8-SDAG-NEXT: v_med3_i32 v3, v3, s4, v5 709; GFX8-SDAG-NEXT: v_med3_i32 v4, v4, s4, v5 710; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v2, v0, v2 711; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 712; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v4 713; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v2, v0 714; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 715; 716; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i32: 717; GFX9-SDAG: ; %bb.0: 718; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 719; GFX9-SDAG-NEXT: s_movk_i32 s4, 0x8000 720; GFX9-SDAG-NEXT: v_mov_b32_e32 v5, 0x7fff 721; GFX9-SDAG-NEXT: v_med3_i32 v3, v3, s4, v5 722; GFX9-SDAG-NEXT: v_med3_i32 v2, v2, s4, v5 723; GFX9-SDAG-NEXT: v_med3_i32 v4, v4, s4, v5 724; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 725; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 726; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v4 727; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v3 728; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 729; 730; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i32: 731; GFX11-SDAG-TRUE16: ; %bb.0: 732; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 733; GFX11-SDAG-TRUE16-NEXT: s_movk_i32 s0, 0x8000 734; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 16, v0 735; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v3, v3, s0, 0x7fff 736; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 737; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v4, v4, s0, 0x7fff 738; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) 739; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v5.l, v3.l 740; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 741; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) 742; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v4.l 743; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 744; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 745; 746; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i32: 747; GFX11-SDAG-FAKE16: ; %bb.0: 748; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 749; GFX11-SDAG-FAKE16-NEXT: s_movk_i32 s0, 0x8000 750; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v0 751; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v3, v3, s0, 0x7fff 752; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 753; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 754; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v3, v5, v3 755; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 756; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v2, v4, s0, 0x7fff 757; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 758; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v3 759; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v2 760; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 761; 762; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i32: 763; GFX6-GISEL: ; %bb.0: 764; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 765; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 766; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 767; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v2, v2 768; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v3 769; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v4 770; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v2, v5 771; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 772; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 773; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v2, v2 774; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 775; 776; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i32: 777; GFX8-GISEL: ; %bb.0: 778; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 779; GFX8-GISEL-NEXT: v_mov_b32_e32 v5, 0xffff8000 780; GFX8-GISEL-NEXT: v_mov_b32_e32 v6, 0x7fff 781; GFX8-GISEL-NEXT: v_med3_i32 v2, v2, v5, v6 782; GFX8-GISEL-NEXT: v_med3_i32 v3, v3, v5, v6 783; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v2 784; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 785; GFX8-GISEL-NEXT: v_med3_i32 v3, v4, v5, v6 786; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v1, v1, v3 787; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0 788; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 789; 790; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i32: 791; GFX9-GISEL: ; %bb.0: 792; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 793; GFX9-GISEL-NEXT: v_mov_b32_e32 v5, 0xffff8000 794; GFX9-GISEL-NEXT: v_mov_b32_e32 v6, 0x7fff 795; GFX9-GISEL-NEXT: v_med3_i32 v2, v2, v5, v6 796; GFX9-GISEL-NEXT: v_med3_i32 v3, v3, v5, v6 797; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v2 798; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 799; GFX9-GISEL-NEXT: v_med3_i32 v3, v4, v5, v6 800; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v1, v1, v3 801; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v2 802; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 803; 804; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i32: 805; GFX11-GISEL-TRUE16: ; %bb.0: 806; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 807; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v5, 0x7fff 808; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0 809; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) 810; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v5 811; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v3, 0xffff8000, v3, v5 812; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 813; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) 814; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v6.l, v3.l 815; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v3, 0xffff8000, v4, v5 816; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l 817; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) 818; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 819; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v3.l 820; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) 821; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v2, 0xffff, v2 822; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, v2 823; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 824; 825; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i32: 826; GFX11-GISEL-FAKE16: ; %bb.0: 827; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 828; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v5, 0x7fff 829; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0 830; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) 831; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v5 832; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v3, 0xffff8000, v3, v5 833; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 834; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) 835; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v2, v6, v3 836; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v3, 0xffff8000, v4, v5 837; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 838; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 839; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v3 840; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0 841; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 842 %result = call <3 x half> @llvm.ldexp.v3f16.v3i32(<3 x half> %a, <3 x i32> %b) 843 ret <3 x half> %result 844} 845 846define <3 x half> @test_ldexp_v3f16_v3i16(<3 x half> %a, <3 x i16> %b) { 847; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i16: 848; GFX6-SDAG: ; %bb.0: 849; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 850; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v2, v2 851; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 852; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 853; GFX6-SDAG-NEXT: v_bfe_i32 v5, v5, 0, 16 854; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v2, v2 855; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 856; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 857; GFX6-SDAG-NEXT: v_bfe_i32 v4, v4, 0, 16 858; GFX6-SDAG-NEXT: v_bfe_i32 v3, v3, 0, 16 859; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v3 860; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v4 861; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v2, v2, v5 862; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 863; 864; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i16: 865; GFX8-SDAG: ; %bb.0: 866; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 867; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 868; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 869; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v3 870; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v4 871; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 872; 873; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i16: 874; GFX9-SDAG: ; %bb.0: 875; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 876; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v4, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 877; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 878; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v3 879; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v4 880; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 881; 882; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i16: 883; GFX11-SDAG-TRUE16: ; %bb.0: 884; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 885; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v2 886; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 16, v0 887; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 888; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v3.l 889; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) 890; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v5.l, v4.l 891; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 892; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 893; 894; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i16: 895; GFX11-SDAG-FAKE16: ; %bb.0: 896; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 897; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v2 898; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v0 899; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 900; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v3 901; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) 902; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v2, v5, v4 903; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v2 904; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 905; 906; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i16: 907; GFX6-GISEL: ; %bb.0: 908; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 909; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 910; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 911; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v2, v2 912; GFX6-GISEL-NEXT: v_bfe_i32 v3, v3, 0, 16 913; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v3 914; GFX6-GISEL-NEXT: v_bfe_i32 v3, v4, 0, 16 915; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v3 916; GFX6-GISEL-NEXT: v_bfe_i32 v3, v5, 0, 16 917; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v2, v3 918; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 919; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 920; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v2, v2 921; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 922; 923; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i16: 924; GFX8-GISEL: ; %bb.0: 925; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 926; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v4, v0, v2 927; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 928; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v1, v1, v3 929; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0 930; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 931; 932; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i16: 933; GFX9-GISEL: ; %bb.0: 934; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 935; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v4, v0, v2 936; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 937; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v1, v1, v3 938; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v4 939; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 940; 941; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i16: 942; GFX11-GISEL-TRUE16: ; %bb.0: 943; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 944; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 945; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2 946; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 947; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v3.l 948; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) 949; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v4.l, v5.l 950; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l 951; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 952; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 953; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v2, 0xffff, v2 954; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 955; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v0, 16, v2 956; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 957; 958; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i16: 959; GFX11-GISEL-FAKE16: ; %bb.0: 960; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 961; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 962; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2 963; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 964; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v3 965; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) 966; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v2, v4, v5 967; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 968; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) 969; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0 970; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 971 %result = call <3 x half> @llvm.ldexp.v3f16.v3i16(<3 x half> %a, <3 x i16> %b) 972 ret <3 x half> %result 973} 974 975define <4 x half> @test_ldexp_v4f16_v4i32(<4 x half> %a, <4 x i32> %b) { 976; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i32: 977; GFX6-SDAG: ; %bb.0: 978; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 979; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 980; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 981; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v2, v2 982; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v3, v3 983; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 984; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 985; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v2, v2 986; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v3, v3 987; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v4 988; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v5 989; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v2, v2, v6 990; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v3, v3, v7 991; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 992; 993; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i32: 994; GFX8-SDAG: ; %bb.0: 995; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 996; GFX8-SDAG-NEXT: s_movk_i32 s4, 0x8000 997; GFX8-SDAG-NEXT: v_mov_b32_e32 v6, 0x7fff 998; GFX8-SDAG-NEXT: v_med3_i32 v4, v4, s4, v6 999; GFX8-SDAG-NEXT: v_med3_i32 v5, v5, s4, v6 1000; GFX8-SDAG-NEXT: v_med3_i32 v2, v2, s4, v6 1001; GFX8-SDAG-NEXT: v_med3_i32 v3, v3, s4, v6 1002; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v4, v1, v4 1003; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v1, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1004; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v2, v0, v2 1005; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1006; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v2, v0 1007; GFX8-SDAG-NEXT: v_or_b32_e32 v1, v4, v1 1008; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 1009; 1010; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i32: 1011; GFX9-SDAG: ; %bb.0: 1012; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1013; GFX9-SDAG-NEXT: s_movk_i32 s4, 0x8000 1014; GFX9-SDAG-NEXT: v_mov_b32_e32 v6, 0x7fff 1015; GFX9-SDAG-NEXT: v_med3_i32 v5, v5, s4, v6 1016; GFX9-SDAG-NEXT: v_med3_i32 v4, v4, s4, v6 1017; GFX9-SDAG-NEXT: v_med3_i32 v3, v3, s4, v6 1018; GFX9-SDAG-NEXT: v_med3_i32 v2, v2, s4, v6 1019; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v5, v1, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1020; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v4 1021; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1022; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 1023; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v3 1024; GFX9-SDAG-NEXT: v_pack_b32_f16 v1, v1, v5 1025; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 1026; 1027; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i32: 1028; GFX11-SDAG-TRUE16: ; %bb.0: 1029; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1030; GFX11-SDAG-TRUE16-NEXT: s_movk_i32 s0, 0x8000 1031; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v1 1032; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v5, v5, s0, 0x7fff 1033; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v3, v3, s0, 0x7fff 1034; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 16, v0 1035; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 1036; GFX11-SDAG-TRUE16-NEXT: v_med3_i32 v4, v4, s0, 0x7fff 1037; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.h, v6.l, v5.l 1038; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1039; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v7.l, v3.l 1040; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 1041; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) 1042; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v4.l 1043; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 1044; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) 1045; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v1, v1.l, v1.h 1046; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 1047; 1048; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i32: 1049; GFX11-SDAG-FAKE16: ; %bb.0: 1050; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1051; GFX11-SDAG-FAKE16-NEXT: s_movk_i32 s0, 0x8000 1052; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v1 1053; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v5, v5, s0, 0x7fff 1054; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v3, v3, s0, 0x7fff 1055; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v0 1056; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v2, v2, s0, 0x7fff 1057; GFX11-SDAG-FAKE16-NEXT: v_med3_i32 v4, v4, s0, 0x7fff 1058; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v5, v6, v5 1059; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1060; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v3, v7, v3 1061; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 1062; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) 1063; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v4 1064; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v3 1065; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) 1066; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v1, v1, v5 1067; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 1068; 1069; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i32: 1070; GFX6-GISEL: ; %bb.0: 1071; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1072; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 1073; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 1074; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v2, v2 1075; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v3, v3 1076; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v4 1077; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v5 1078; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v2, v6 1079; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v3, v3, v7 1080; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 1081; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 1082; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v2, v2 1083; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v3, v3 1084; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 1085; 1086; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i32: 1087; GFX8-GISEL: ; %bb.0: 1088; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1089; GFX8-GISEL-NEXT: v_mov_b32_e32 v6, 0xffff8000 1090; GFX8-GISEL-NEXT: v_mov_b32_e32 v7, 0x7fff 1091; GFX8-GISEL-NEXT: v_med3_i32 v2, v2, v6, v7 1092; GFX8-GISEL-NEXT: v_med3_i32 v3, v3, v6, v7 1093; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v2 1094; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1095; GFX8-GISEL-NEXT: v_med3_i32 v3, v4, v6, v7 1096; GFX8-GISEL-NEXT: v_med3_i32 v4, v5, v6, v7 1097; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v3, v1, v3 1098; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v1, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1099; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v2, v0 1100; GFX8-GISEL-NEXT: v_or_b32_e32 v1, v3, v1 1101; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 1102; 1103; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i32: 1104; GFX9-GISEL: ; %bb.0: 1105; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1106; GFX9-GISEL-NEXT: v_mov_b32_e32 v6, 0xffff8000 1107; GFX9-GISEL-NEXT: v_mov_b32_e32 v7, 0x7fff 1108; GFX9-GISEL-NEXT: v_med3_i32 v2, v2, v6, v7 1109; GFX9-GISEL-NEXT: v_med3_i32 v3, v3, v6, v7 1110; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v2, v0, v2 1111; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1112; GFX9-GISEL-NEXT: v_med3_i32 v3, v4, v6, v7 1113; GFX9-GISEL-NEXT: v_med3_i32 v4, v5, v6, v7 1114; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v3, v1, v3 1115; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD 1116; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v2 1117; GFX9-GISEL-NEXT: v_lshl_or_b32 v1, v1, 16, v3 1118; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 1119; 1120; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i32: 1121; GFX11-GISEL-TRUE16: ; %bb.0: 1122; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1123; GFX11-GISEL-TRUE16-NEXT: v_mov_b32_e32 v6, 0x7fff 1124; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 16, v0 1125; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v8, 16, v1 1126; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4) 1127; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v6 1128; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v4, 0xffff8000, v4, v6 1129; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v3, 0xffff8000, v3, v6 1130; GFX11-GISEL-TRUE16-NEXT: v_med3_i32 v5, 0xffff8000, v5, v6 1131; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 1132; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1133; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v1.l, v4.l 1134; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v7.l, v3.l 1135; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1136; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.h, v8.l, v5.l 1137; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l 1138; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1139; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 1140; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v3.l, v1.l 1141; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1142; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v1.l, v1.h 1143; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v2, 0xffff, v2 1144; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) 1145; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v4, 0xffff, v0 1146; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v3, 16, v2 1147; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) 1148; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v1, v1, 16, v4 1149; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 1150; 1151; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i32: 1152; GFX11-GISEL-FAKE16: ; %bb.0: 1153; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1154; GFX11-GISEL-FAKE16-NEXT: v_mov_b32_e32 v6, 0x7fff 1155; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v0 1156; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v8, 16, v1 1157; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4) 1158; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v2, 0xffff8000, v2, v6 1159; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v4, 0xffff8000, v4, v6 1160; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v3, 0xffff8000, v3, v6 1161; GFX11-GISEL-FAKE16-NEXT: v_med3_i32 v5, 0xffff8000, v5, v6 1162; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 1163; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1164; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v4 1165; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v2, v7, v3 1166; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1167; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v3, v8, v5 1168; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 1169; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) 1170; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v1, 0xffff, v1 1171; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0 1172; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) 1173; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v1, v3, 16, v1 1174; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 1175 %result = call <4 x half> @llvm.ldexp.v4f16.v4i32(<4 x half> %a, <4 x i32> %b) 1176 ret <4 x half> %result 1177} 1178 1179define <4 x half> @test_ldexp_v4f16_v4i16(<4 x half> %a, <4 x i16> %b) { 1180; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i16: 1181; GFX6-SDAG: ; %bb.0: 1182; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1183; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v3, v3 1184; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v2, v2 1185; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v0, v0 1186; GFX6-SDAG-NEXT: v_cvt_f16_f32_e32 v1, v1 1187; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v3, v3 1188; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v2, v2 1189; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v0, v0 1190; GFX6-SDAG-NEXT: v_cvt_f32_f16_e32 v1, v1 1191; GFX6-SDAG-NEXT: v_bfe_i32 v7, v7, 0, 16 1192; GFX6-SDAG-NEXT: v_bfe_i32 v6, v6, 0, 16 1193; GFX6-SDAG-NEXT: v_bfe_i32 v5, v5, 0, 16 1194; GFX6-SDAG-NEXT: v_bfe_i32 v4, v4, 0, 16 1195; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v0, v4 1196; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v1, v5 1197; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v2, v2, v6 1198; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v3, v3, v7 1199; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 1200; 1201; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i16: 1202; GFX8-SDAG: ; %bb.0: 1203; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1204; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1205; GFX8-SDAG-NEXT: v_ldexp_f16_sdwa v5, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1206; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v3 1207; GFX8-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 1208; GFX8-SDAG-NEXT: v_or_b32_e32 v0, v0, v5 1209; GFX8-SDAG-NEXT: v_or_b32_e32 v1, v1, v4 1210; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 1211; 1212; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i16: 1213; GFX9-SDAG: ; %bb.0: 1214; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1215; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1216; GFX9-SDAG-NEXT: v_ldexp_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1217; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v1, v1, v3 1218; GFX9-SDAG-NEXT: v_ldexp_f16_e32 v0, v0, v2 1219; GFX9-SDAG-NEXT: v_pack_b32_f16 v0, v0, v5 1220; GFX9-SDAG-NEXT: v_pack_b32_f16 v1, v1, v4 1221; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 1222; 1223; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i16: 1224; GFX11-SDAG-TRUE16: ; %bb.0: 1225; GFX11-SDAG-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1226; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3 1227; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2 1228; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0 1229; GFX11-SDAG-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1 1230; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v1.l, v3.l 1231; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 1232; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1233; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v6.l, v5.l 1234; GFX11-SDAG-TRUE16-NEXT: v_ldexp_f16_e32 v1.h, v7.l, v4.l 1235; GFX11-SDAG-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 1236; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v0, v0.l, v0.h 1237; GFX11-SDAG-TRUE16-NEXT: v_pack_b32_f16 v1, v1.l, v1.h 1238; GFX11-SDAG-TRUE16-NEXT: s_setpc_b64 s[30:31] 1239; 1240; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i16: 1241; GFX11-SDAG-FAKE16: ; %bb.0: 1242; GFX11-SDAG-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1243; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v3 1244; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v2 1245; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v0 1246; GFX11-SDAG-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v1 1247; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v3 1248; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 1249; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1250; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v2, v6, v5 1251; GFX11-SDAG-FAKE16-NEXT: v_ldexp_f16_e32 v3, v7, v4 1252; GFX11-SDAG-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 1253; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v0, v0, v2 1254; GFX11-SDAG-FAKE16-NEXT: v_pack_b32_f16 v1, v1, v3 1255; GFX11-SDAG-FAKE16-NEXT: s_setpc_b64 s[30:31] 1256; 1257; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i16: 1258; GFX6-GISEL: ; %bb.0: 1259; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1260; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v0, v0 1261; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v1, v1 1262; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v2, v2 1263; GFX6-GISEL-NEXT: v_bfe_i32 v4, v4, 0, 16 1264; GFX6-GISEL-NEXT: v_cvt_f32_f16_e32 v3, v3 1265; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v0, v4 1266; GFX6-GISEL-NEXT: v_bfe_i32 v4, v5, 0, 16 1267; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v1, v4 1268; GFX6-GISEL-NEXT: v_bfe_i32 v4, v6, 0, 16 1269; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v2, v4 1270; GFX6-GISEL-NEXT: v_bfe_i32 v4, v7, 0, 16 1271; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v3, v3, v4 1272; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v0, v0 1273; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v1, v1 1274; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v2, v2 1275; GFX6-GISEL-NEXT: v_cvt_f16_f32_e32 v3, v3 1276; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 1277; 1278; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i16: 1279; GFX8-GISEL: ; %bb.0: 1280; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1281; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v4, v0, v2 1282; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1283; GFX8-GISEL-NEXT: v_ldexp_f16_e32 v2, v1, v3 1284; GFX8-GISEL-NEXT: v_ldexp_f16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1285; GFX8-GISEL-NEXT: v_or_b32_e32 v0, v4, v0 1286; GFX8-GISEL-NEXT: v_or_b32_e32 v1, v2, v1 1287; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 1288; 1289; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i16: 1290; GFX9-GISEL: ; %bb.0: 1291; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1292; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v4, v0, v2 1293; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1294; GFX9-GISEL-NEXT: v_ldexp_f16_e32 v2, v1, v3 1295; GFX9-GISEL-NEXT: v_ldexp_f16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1 1296; GFX9-GISEL-NEXT: v_lshl_or_b32 v0, v0, 16, v4 1297; GFX9-GISEL-NEXT: v_lshl_or_b32 v1, v1, 16, v2 1298; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 1299; 1300; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i16: 1301; GFX11-GISEL-TRUE16: ; %bb.0: 1302; GFX11-GISEL-TRUE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1303; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 1304; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v5, 16, v1 1305; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v6, 16, v2 1306; GFX11-GISEL-TRUE16-NEXT: v_lshrrev_b32_e32 v7, 16, v3 1307; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.l, v0.l, v2.l 1308; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v0.h, v1.l, v3.l 1309; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1310; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.l, v4.l, v6.l 1311; GFX11-GISEL-TRUE16-NEXT: v_ldexp_f16_e32 v1.h, v5.l, v7.l 1312; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1313; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v2.l, v0.l 1314; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v0.l, v0.h 1315; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1316; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v3.l, v1.l 1317; GFX11-GISEL-TRUE16-NEXT: v_mov_b16_e32 v1.l, v1.h 1318; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1319; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v2, 0xffff, v2 1320; GFX11-GISEL-TRUE16-NEXT: v_and_b32_e32 v4, 0xffff, v0 1321; GFX11-GISEL-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 1322; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v0, v3, 16, v2 1323; GFX11-GISEL-TRUE16-NEXT: v_lshl_or_b32 v1, v1, 16, v4 1324; GFX11-GISEL-TRUE16-NEXT: s_setpc_b64 s[30:31] 1325; 1326; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i16: 1327; GFX11-GISEL-FAKE16: ; %bb.0: 1328; GFX11-GISEL-FAKE16-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 1329; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v4, 16, v0 1330; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v5, 16, v1 1331; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v6, 16, v2 1332; GFX11-GISEL-FAKE16-NEXT: v_lshrrev_b32_e32 v7, 16, v3 1333; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v0, v0, v2 1334; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v1, v1, v3 1335; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1336; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v2, v4, v6 1337; GFX11-GISEL-FAKE16-NEXT: v_ldexp_f16_e32 v3, v5, v7 1338; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) 1339; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v0, 0xffff, v0 1340; GFX11-GISEL-FAKE16-NEXT: v_and_b32_e32 v1, 0xffff, v1 1341; GFX11-GISEL-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) 1342; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v0, v2, 16, v0 1343; GFX11-GISEL-FAKE16-NEXT: v_lshl_or_b32 v1, v3, 16, v1 1344; GFX11-GISEL-FAKE16-NEXT: s_setpc_b64 s[30:31] 1345 %result = call <4 x half> @llvm.ldexp.v4f16.v4i16(<4 x half> %a, <4 x i16> %b) 1346 ret <4 x half> %result 1347} 1348 1349declare float @llvm.ldexp.f32.i32(float, i32) #0 1350declare float @llvm.ldexp.f32.i16(float, i16) #0 1351declare float @llvm.ldexp.f32.i64(float, i64) #0 1352declare half @llvm.ldexp.f16.i8(half, i8) #0 1353declare half @llvm.ldexp.f16.i16(half, i16) #0 1354declare half @llvm.ldexp.f16.i32(half, i32) #0 1355declare <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half>, <2 x i16>) #0 1356declare <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half>, <2 x i32>) #0 1357declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0 1358declare <2 x float> @llvm.ldexp.v2f32.v2i16(<2 x float>, <2 x i16>) #0 1359declare <2 x float> @llvm.ldexp.v2f32.v2i64(<2 x float>, <2 x i64>) #0 1360declare <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float>, <3 x i32>) #0 1361declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0 1362declare double @llvm.ldexp.f64.i32(double, i32) #0 1363declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0 1364 1365attributes #0 = { nounwind readnone } 1366