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 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG %s 6 7; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-GISEL %s 8; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-GISEL %s 9; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-GISEL %s 10; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL %s 11 12; define float @test_ldexp_f32_i16(ptr addrspace(1) %out, float %a, i16 %b) #0 { 13; %result = call float @llvm.experimental.constrained.ldexp.f32.i16(float %a, i16 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 14; ret float %result 15; } 16 17define float @test_ldexp_f32_i32(ptr addrspace(1) %out, float %a, i32 %b) #0 { 18; GFX6-LABEL: test_ldexp_f32_i32: 19; GFX6: ; %bb.0: 20; GFX6-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 21; GFX6-NEXT: v_ldexp_f32_e32 v0, v2, v3 22; GFX6-NEXT: s_setpc_b64 s[30:31] 23; 24; GFX8-LABEL: test_ldexp_f32_i32: 25; GFX8: ; %bb.0: 26; GFX8-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 27; GFX8-NEXT: v_ldexp_f32 v0, v2, v3 28; GFX8-NEXT: s_setpc_b64 s[30:31] 29; 30; GFX9-LABEL: test_ldexp_f32_i32: 31; GFX9: ; %bb.0: 32; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 33; GFX9-NEXT: v_ldexp_f32 v0, v2, v3 34; GFX9-NEXT: s_setpc_b64 s[30:31] 35; 36; GFX11-LABEL: test_ldexp_f32_i32: 37; GFX11: ; %bb.0: 38; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 39; GFX11-NEXT: v_ldexp_f32 v0, v2, v3 40; GFX11-NEXT: s_setpc_b64 s[30:31] 41 %result = call float @llvm.experimental.constrained.ldexp.f32.i32(float %a, i32 %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 42 ret float %result 43} 44 45; define <2 x float> @test_ldexp_v2f32_v2i16(ptr addrspace(1) %out, <2 x float> %a, <2 x i16> %b) #0 { 46; %result = call <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i16(<2 x float> %a, <2 x i16> %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 47; ret <2 x float> %result 48; } 49 50define <2 x float> @test_ldexp_v2f32_v2i32(ptr addrspace(1) %out, <2 x float> %a, <2 x i32> %b) #0 { 51; GFX6-SDAG-LABEL: test_ldexp_v2f32_v2i32: 52; GFX6-SDAG: ; %bb.0: 53; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 54; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v3, v5 55; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v2, v4 56; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 57; 58; GFX8-SDAG-LABEL: test_ldexp_v2f32_v2i32: 59; GFX8-SDAG: ; %bb.0: 60; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 61; GFX8-SDAG-NEXT: v_ldexp_f32 v1, v3, v5 62; GFX8-SDAG-NEXT: v_ldexp_f32 v0, v2, v4 63; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 64; 65; GFX9-SDAG-LABEL: test_ldexp_v2f32_v2i32: 66; GFX9-SDAG: ; %bb.0: 67; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 68; GFX9-SDAG-NEXT: v_ldexp_f32 v1, v3, v5 69; GFX9-SDAG-NEXT: v_ldexp_f32 v0, v2, v4 70; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 71; 72; GFX11-LABEL: test_ldexp_v2f32_v2i32: 73; GFX11: ; %bb.0: 74; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 75; GFX11-NEXT: v_ldexp_f32 v0, v2, v4 76; GFX11-NEXT: v_ldexp_f32 v1, v3, v5 77; GFX11-NEXT: s_setpc_b64 s[30:31] 78; 79; GFX6-GISEL-LABEL: test_ldexp_v2f32_v2i32: 80; GFX6-GISEL: ; %bb.0: 81; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 82; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v2, v4 83; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v3, v5 84; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 85; 86; GFX8-GISEL-LABEL: test_ldexp_v2f32_v2i32: 87; GFX8-GISEL: ; %bb.0: 88; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 89; GFX8-GISEL-NEXT: v_ldexp_f32 v0, v2, v4 90; GFX8-GISEL-NEXT: v_ldexp_f32 v1, v3, v5 91; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 92; 93; GFX9-GISEL-LABEL: test_ldexp_v2f32_v2i32: 94; GFX9-GISEL: ; %bb.0: 95; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 96; GFX9-GISEL-NEXT: v_ldexp_f32 v0, v2, v4 97; GFX9-GISEL-NEXT: v_ldexp_f32 v1, v3, v5 98; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 99 %result = call <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i32(<2 x float> %a, <2 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 100 ret <2 x float> %result 101} 102 103define <3 x float> @test_ldexp_v3f32_v3i32(ptr addrspace(1) %out, <3 x float> %a, <3 x i32> %b) #0 { 104; GFX6-SDAG-LABEL: test_ldexp_v3f32_v3i32: 105; GFX6-SDAG: ; %bb.0: 106; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 107; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v4, v4, v7 108; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v3, v6 109; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v2, v5 110; GFX6-SDAG-NEXT: v_mov_b32_e32 v2, v4 111; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 112; 113; GFX8-SDAG-LABEL: test_ldexp_v3f32_v3i32: 114; GFX8-SDAG: ; %bb.0: 115; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 116; GFX8-SDAG-NEXT: v_ldexp_f32 v4, v4, v7 117; GFX8-SDAG-NEXT: v_ldexp_f32 v1, v3, v6 118; GFX8-SDAG-NEXT: v_ldexp_f32 v0, v2, v5 119; GFX8-SDAG-NEXT: v_mov_b32_e32 v2, v4 120; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 121; 122; GFX9-SDAG-LABEL: test_ldexp_v3f32_v3i32: 123; GFX9-SDAG: ; %bb.0: 124; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 125; GFX9-SDAG-NEXT: v_ldexp_f32 v4, v4, v7 126; GFX9-SDAG-NEXT: v_ldexp_f32 v1, v3, v6 127; GFX9-SDAG-NEXT: v_ldexp_f32 v0, v2, v5 128; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, v4 129; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 130; 131; GFX11-LABEL: test_ldexp_v3f32_v3i32: 132; GFX11: ; %bb.0: 133; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 134; GFX11-NEXT: v_ldexp_f32 v0, v2, v5 135; GFX11-NEXT: v_ldexp_f32 v1, v3, v6 136; GFX11-NEXT: v_ldexp_f32 v2, v4, v7 137; GFX11-NEXT: s_setpc_b64 s[30:31] 138; 139; GFX6-GISEL-LABEL: test_ldexp_v3f32_v3i32: 140; GFX6-GISEL: ; %bb.0: 141; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 142; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v2, v5 143; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v3, v6 144; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v4, v7 145; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 146; 147; GFX8-GISEL-LABEL: test_ldexp_v3f32_v3i32: 148; GFX8-GISEL: ; %bb.0: 149; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 150; GFX8-GISEL-NEXT: v_ldexp_f32 v0, v2, v5 151; GFX8-GISEL-NEXT: v_ldexp_f32 v1, v3, v6 152; GFX8-GISEL-NEXT: v_ldexp_f32 v2, v4, v7 153; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 154; 155; GFX9-GISEL-LABEL: test_ldexp_v3f32_v3i32: 156; GFX9-GISEL: ; %bb.0: 157; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 158; GFX9-GISEL-NEXT: v_ldexp_f32 v0, v2, v5 159; GFX9-GISEL-NEXT: v_ldexp_f32 v1, v3, v6 160; GFX9-GISEL-NEXT: v_ldexp_f32 v2, v4, v7 161; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 162 %result = call <3 x float> @llvm.experimental.constrained.ldexp.v3f32.v3i32(<3 x float> %a, <3 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 163 ret <3 x float> %result 164} 165 166define <4 x float> @test_ldexp_v4f32_v4i32(ptr addrspace(1) %out, <4 x float> %a, <4 x i32> %b) #0 { 167; GFX6-SDAG-LABEL: test_ldexp_v4f32_v4i32: 168; GFX6-SDAG: ; %bb.0: 169; GFX6-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 170; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v5, v5, v9 171; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v4, v4, v8 172; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v1, v3, v7 173; GFX6-SDAG-NEXT: v_ldexp_f32_e32 v0, v2, v6 174; GFX6-SDAG-NEXT: v_mov_b32_e32 v2, v4 175; GFX6-SDAG-NEXT: v_mov_b32_e32 v3, v5 176; GFX6-SDAG-NEXT: s_setpc_b64 s[30:31] 177; 178; GFX8-SDAG-LABEL: test_ldexp_v4f32_v4i32: 179; GFX8-SDAG: ; %bb.0: 180; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 181; GFX8-SDAG-NEXT: v_ldexp_f32 v5, v5, v9 182; GFX8-SDAG-NEXT: v_ldexp_f32 v4, v4, v8 183; GFX8-SDAG-NEXT: v_ldexp_f32 v1, v3, v7 184; GFX8-SDAG-NEXT: v_ldexp_f32 v0, v2, v6 185; GFX8-SDAG-NEXT: v_mov_b32_e32 v2, v4 186; GFX8-SDAG-NEXT: v_mov_b32_e32 v3, v5 187; GFX8-SDAG-NEXT: s_setpc_b64 s[30:31] 188; 189; GFX9-SDAG-LABEL: test_ldexp_v4f32_v4i32: 190; GFX9-SDAG: ; %bb.0: 191; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 192; GFX9-SDAG-NEXT: v_ldexp_f32 v5, v5, v9 193; GFX9-SDAG-NEXT: v_ldexp_f32 v4, v4, v8 194; GFX9-SDAG-NEXT: v_ldexp_f32 v1, v3, v7 195; GFX9-SDAG-NEXT: v_ldexp_f32 v0, v2, v6 196; GFX9-SDAG-NEXT: v_mov_b32_e32 v2, v4 197; GFX9-SDAG-NEXT: v_mov_b32_e32 v3, v5 198; GFX9-SDAG-NEXT: s_setpc_b64 s[30:31] 199; 200; GFX11-LABEL: test_ldexp_v4f32_v4i32: 201; GFX11: ; %bb.0: 202; GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 203; GFX11-NEXT: v_ldexp_f32 v0, v2, v6 204; GFX11-NEXT: v_ldexp_f32 v1, v3, v7 205; GFX11-NEXT: v_ldexp_f32 v2, v4, v8 206; GFX11-NEXT: v_ldexp_f32 v3, v5, v9 207; GFX11-NEXT: s_setpc_b64 s[30:31] 208; 209; GFX6-GISEL-LABEL: test_ldexp_v4f32_v4i32: 210; GFX6-GISEL: ; %bb.0: 211; GFX6-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 212; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v0, v2, v6 213; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v1, v3, v7 214; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v2, v4, v8 215; GFX6-GISEL-NEXT: v_ldexp_f32_e32 v3, v5, v9 216; GFX6-GISEL-NEXT: s_setpc_b64 s[30:31] 217; 218; GFX8-GISEL-LABEL: test_ldexp_v4f32_v4i32: 219; GFX8-GISEL: ; %bb.0: 220; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 221; GFX8-GISEL-NEXT: v_ldexp_f32 v0, v2, v6 222; GFX8-GISEL-NEXT: v_ldexp_f32 v1, v3, v7 223; GFX8-GISEL-NEXT: v_ldexp_f32 v2, v4, v8 224; GFX8-GISEL-NEXT: v_ldexp_f32 v3, v5, v9 225; GFX8-GISEL-NEXT: s_setpc_b64 s[30:31] 226; 227; GFX9-GISEL-LABEL: test_ldexp_v4f32_v4i32: 228; GFX9-GISEL: ; %bb.0: 229; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 230; GFX9-GISEL-NEXT: v_ldexp_f32 v0, v2, v6 231; GFX9-GISEL-NEXT: v_ldexp_f32 v1, v3, v7 232; GFX9-GISEL-NEXT: v_ldexp_f32 v2, v4, v8 233; GFX9-GISEL-NEXT: v_ldexp_f32 v3, v5, v9 234; GFX9-GISEL-NEXT: s_setpc_b64 s[30:31] 235 %result = call <4 x float> @llvm.experimental.constrained.ldexp.v4f32.v4i32(<4 x float> %a, <4 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict") 236 ret <4 x float> %result 237} 238 239declare float @llvm.experimental.constrained.ldexp.f32.i16(float, i16, metadata, metadata) #1 240declare float @llvm.experimental.constrained.ldexp.f32.i32(float, i32, metadata, metadata) #1 241declare <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i16(<2 x float>, <2 x i16>, metadata, metadata) #1 242declare <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>, metadata, metadata) #1 243declare <3 x float> @llvm.experimental.constrained.ldexp.v3f32.v3i32(<3 x float>, <3 x i32>, metadata, metadata) #1 244declare <4 x float> @llvm.experimental.constrained.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>, metadata, metadata) #1 245 246attributes #0 = { strictfp } 247attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } 248;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 249; GCN: {{.*}} 250; GFX11-GISEL: {{.*}} 251; GFX11-SDAG: {{.*}} 252