brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.6 KiB · 40aac82 Raw
607 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,SI %s3; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx803 < %s | FileCheck -check-prefixes=GCN,GFX89,GFX8 %s4; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX89,GFX9 %s5; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GCN,GFX1011,GFX10 %s6; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GCN,GFX1011,GFX11,GFX11-TRUE16 %s7; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GCN,GFX1011,GFX11,GFX11-FAKE16 %s8 9define float @v_constrained_fpext_f16_to_f32_fpexcept_strict(half %arg) #0 {10; SI-LABEL: v_constrained_fpext_f16_to_f32_fpexcept_strict:11; SI:       ; %bb.0:12; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; SI-NEXT:    v_cvt_f16_f32_e32 v0, v014; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v015; SI-NEXT:    v_cvt_f32_f16_e32 v0, v016; SI-NEXT:    s_setpc_b64 s[30:31]17;18; GFX89-LABEL: v_constrained_fpext_f16_to_f32_fpexcept_strict:19; GFX89:       ; %bb.0:20; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)21; GFX89-NEXT:    v_cvt_f32_f16_e32 v0, v022; GFX89-NEXT:    s_setpc_b64 s[30:31]23;24; GFX10-LABEL: v_constrained_fpext_f16_to_f32_fpexcept_strict:25; GFX10:       ; %bb.0:26; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)27; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v028; GFX10-NEXT:    s_setpc_b64 s[30:31]29;30; GFX11-TRUE16-LABEL: v_constrained_fpext_f16_to_f32_fpexcept_strict:31; GFX11-TRUE16:       ; %bb.0:32; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)33; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l34; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]35;36; GFX11-FAKE16-LABEL: v_constrained_fpext_f16_to_f32_fpexcept_strict:37; GFX11-FAKE16:       ; %bb.0:38; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v040; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]41  %result = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg, metadata !"fpexcept.strict")42  ret float %result43}44 45define <2 x float> @v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict(<2 x half> %arg) #0 {46; SI-LABEL: v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict:47; SI:       ; %bb.0:48; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)49; SI-NEXT:    v_cvt_f16_f32_e32 v0, v050; SI-NEXT:    v_cvt_f16_f32_e32 v1, v151; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v052; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v153; SI-NEXT:    v_cvt_f32_f16_e32 v0, v054; SI-NEXT:    v_cvt_f32_f16_e32 v1, v155; SI-NEXT:    s_setpc_b64 s[30:31]56;57; GFX89-LABEL: v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict:58; GFX89:       ; %bb.0:59; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)60; GFX89-NEXT:    v_cvt_f32_f16_e32 v2, v061; GFX89-NEXT:    v_cvt_f32_f16_sdwa v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_162; GFX89-NEXT:    v_mov_b32_e32 v0, v263; GFX89-NEXT:    s_setpc_b64 s[30:31]64;65; GFX10-LABEL: v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict:66; GFX10:       ; %bb.0:67; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v069; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_170; GFX10-NEXT:    v_mov_b32_e32 v0, v271; GFX10-NEXT:    s_setpc_b64 s[30:31]72;73; GFX11-TRUE16-LABEL: v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict:74; GFX11-TRUE16:       ; %bb.0:75; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)76; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v2, v0.l77; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v1, v0.h78; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v279; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]80;81; GFX11-FAKE16-LABEL: v_constrained_fpext_v2f16_to_v2f32_fpexcept_strict:82; GFX11-FAKE16:       ; %bb.0:83; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)84; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v085; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v086; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v1, v187; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]88  %result = call <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half> %arg, metadata !"fpexcept.strict")89  ret <2 x float>   %result90}91 92define <3 x float> @v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict(<3 x half> %arg) #0 {93; SI-LABEL: v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict:94; SI:       ; %bb.0:95; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)96; SI-NEXT:    v_cvt_f16_f32_e32 v0, v097; SI-NEXT:    v_cvt_f16_f32_e32 v1, v198; SI-NEXT:    v_cvt_f16_f32_e32 v2, v299; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0100; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1101; SI-NEXT:    v_and_b32_e32 v2, 0xffff, v2102; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0103; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1104; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2105; SI-NEXT:    s_setpc_b64 s[30:31]106;107; GFX89-LABEL: v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict:108; GFX89:       ; %bb.0:109; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)110; GFX89-NEXT:    v_cvt_f32_f16_e32 v4, v0111; GFX89-NEXT:    v_cvt_f32_f16_sdwa v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1112; GFX89-NEXT:    v_cvt_f32_f16_e32 v2, v1113; GFX89-NEXT:    v_mov_b32_e32 v0, v4114; GFX89-NEXT:    v_mov_b32_e32 v1, v3115; GFX89-NEXT:    s_setpc_b64 s[30:31]116;117; GFX10-LABEL: v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict:118; GFX10:       ; %bb.0:119; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)120; GFX10-NEXT:    v_cvt_f32_f16_e32 v4, v0121; GFX10-NEXT:    v_cvt_f32_f16_sdwa v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1122; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v1123; GFX10-NEXT:    v_mov_b32_e32 v0, v4124; GFX10-NEXT:    v_mov_b32_e32 v1, v3125; GFX10-NEXT:    s_setpc_b64 s[30:31]126;127; GFX11-TRUE16-LABEL: v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict:128; GFX11-TRUE16:       ; %bb.0:129; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)130; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v4, v0.l131; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v3, v0.h132; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v2, v1.l133; GFX11-TRUE16-NEXT:    v_dual_mov_b32 v0, v4 :: v_dual_mov_b32 v1, v3134; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]135;136; GFX11-FAKE16-LABEL: v_constrained_fpext_v3f16_to_v3f32_fpexcept_strict:137; GFX11-FAKE16:       ; %bb.0:138; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)139; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0140; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0141; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v3, v2142; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v2, v1143; GFX11-FAKE16-NEXT:    v_mov_b32_e32 v1, v3144; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]145  %result = call <3 x float> @llvm.experimental.constrained.fpext.v3f32.v3f16(<3 x half> %arg, metadata !"fpexcept.strict")146  ret <3 x float>   %result147}148 149define double @v_constrained_fpext_f32_to_f64_fpexcept_strict(float %arg) #0 {150; GCN-LABEL: v_constrained_fpext_f32_to_f64_fpexcept_strict:151; GCN:       ; %bb.0:152; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)153; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0154; GCN-NEXT:    s_setpc_b64 s[30:31]155  %result = call double @llvm.experimental.constrained.fpext.f64.f32(float %arg, metadata !"fpexcept.strict")156  ret double %result157}158 159define <2 x double> @v_constrained_fpext_v2f32_to_v2f64_fpexcept_strict(<2 x float> %arg) #0 {160; GCN-LABEL: v_constrained_fpext_v2f32_to_v2f64_fpexcept_strict:161; GCN:       ; %bb.0:162; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)163; GCN-NEXT:    v_mov_b32_e32 v2, v1164; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0165; GCN-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2166; GCN-NEXT:    s_setpc_b64 s[30:31]167  %result = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float> %arg, metadata !"fpexcept.strict")168  ret <2 x double>   %result169}170 171define <3 x double> @v_constrained_fpext_v3f32_to_v3f64_fpexcept_strict(<3 x float> %arg) #0 {172; SI-LABEL: v_constrained_fpext_v3f32_to_v3f64_fpexcept_strict:173; SI:       ; %bb.0:174; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; SI-NEXT:    v_mov_b32_e32 v4, v2176; SI-NEXT:    v_mov_b32_e32 v2, v1177; SI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0178; SI-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2179; SI-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4180; SI-NEXT:    s_setpc_b64 s[30:31]181;182; GFX89-LABEL: v_constrained_fpext_v3f32_to_v3f64_fpexcept_strict:183; GFX89:       ; %bb.0:184; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)185; GFX89-NEXT:    v_mov_b32_e32 v4, v2186; GFX89-NEXT:    v_mov_b32_e32 v2, v1187; GFX89-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0188; GFX89-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2189; GFX89-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4190; GFX89-NEXT:    s_setpc_b64 s[30:31]191;192; GFX1011-LABEL: v_constrained_fpext_v3f32_to_v3f64_fpexcept_strict:193; GFX1011:       ; %bb.0:194; GFX1011-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)195; GFX1011-NEXT:    v_mov_b32_e32 v4, v2196; GFX1011-NEXT:    v_mov_b32_e32 v2, v1197; GFX1011-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0198; GFX1011-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4199; GFX1011-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2200; GFX1011-NEXT:    s_setpc_b64 s[30:31]201  %result = call <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(<3 x float> %arg, metadata !"fpexcept.strict")202  ret <3 x double>   %result203}204 205define double @v_constrained_fpext_f16_to_f64_fpexcept_strict(half %arg) #0 {206; SI-LABEL: v_constrained_fpext_f16_to_f64_fpexcept_strict:207; SI:       ; %bb.0:208; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)209; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0210; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0211; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0212; SI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0213; SI-NEXT:    s_setpc_b64 s[30:31]214;215; GFX89-LABEL: v_constrained_fpext_f16_to_f64_fpexcept_strict:216; GFX89:       ; %bb.0:217; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; GFX89-NEXT:    v_cvt_f32_f16_e32 v0, v0219; GFX89-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0220; GFX89-NEXT:    s_setpc_b64 s[30:31]221;222; GFX10-LABEL: v_constrained_fpext_f16_to_f64_fpexcept_strict:223; GFX10:       ; %bb.0:224; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)225; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0226; GFX10-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0227; GFX10-NEXT:    s_setpc_b64 s[30:31]228;229; GFX11-TRUE16-LABEL: v_constrained_fpext_f16_to_f64_fpexcept_strict:230; GFX11-TRUE16:       ; %bb.0:231; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)232; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l233; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0234; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]235;236; GFX11-FAKE16-LABEL: v_constrained_fpext_f16_to_f64_fpexcept_strict:237; GFX11-FAKE16:       ; %bb.0:238; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)239; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0240; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0241; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]242  %result = call double @llvm.experimental.constrained.fpext.f64.f16(half %arg, metadata !"fpexcept.strict")243  ret double %result244}245 246define <2 x double> @v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict(<2 x half> %arg) #0 {247; SI-LABEL: v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict:248; SI:       ; %bb.0:249; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)250; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0251; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1252; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0253; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1254; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0255; SI-NEXT:    v_cvt_f32_f16_e32 v2, v1256; SI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0257; SI-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2258; SI-NEXT:    s_setpc_b64 s[30:31]259;260; GFX89-LABEL: v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict:261; GFX89:       ; %bb.0:262; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)263; GFX89-NEXT:    v_cvt_f32_f16_e32 v1, v0264; GFX89-NEXT:    v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1265; GFX89-NEXT:    v_cvt_f64_f32_e32 v[0:1], v1266; GFX89-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2267; GFX89-NEXT:    s_setpc_b64 s[30:31]268;269; GFX10-LABEL: v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict:270; GFX10:       ; %bb.0:271; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)272; GFX10-NEXT:    v_cvt_f32_f16_e32 v1, v0273; GFX10-NEXT:    v_cvt_f32_f16_sdwa v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1274; GFX10-NEXT:    v_cvt_f64_f32_e32 v[0:1], v1275; GFX10-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2276; GFX10-NEXT:    s_setpc_b64 s[30:31]277;278; GFX11-TRUE16-LABEL: v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict:279; GFX11-TRUE16:       ; %bb.0:280; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)281; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v1, v0.l282; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v2, v0.h283; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v1284; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2285; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]286;287; GFX11-FAKE16-LABEL: v_constrained_fpext_v2f16_to_v2f64_fpexcept_strict:288; GFX11-FAKE16:       ; %bb.0:289; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)290; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0291; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0292; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v2, v1293; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0294; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2295; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]296  %result = call <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half> %arg, metadata !"fpexcept.strict")297  ret <2 x double>   %result298}299 300define <3 x double> @v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict(<3 x half> %arg) #0 {301; SI-LABEL: v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict:302; SI:       ; %bb.0:303; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)304; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2305; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0306; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1307; SI-NEXT:    v_and_b32_e32 v2, 0xffff, v2308; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0309; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1310; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0311; SI-NEXT:    v_cvt_f32_f16_e32 v3, v1312; SI-NEXT:    v_cvt_f32_f16_e32 v4, v2313; SI-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0314; SI-NEXT:    v_cvt_f64_f32_e32 v[2:3], v3315; SI-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4316; SI-NEXT:    s_setpc_b64 s[30:31]317;318; GFX89-LABEL: v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict:319; GFX89:       ; %bb.0:320; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)321; GFX89-NEXT:    v_cvt_f32_f16_e32 v2, v0322; GFX89-NEXT:    v_cvt_f32_f16_sdwa v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1323; GFX89-NEXT:    v_cvt_f32_f16_e32 v4, v1324; GFX89-NEXT:    v_cvt_f64_f32_e32 v[0:1], v2325; GFX89-NEXT:    v_cvt_f64_f32_e32 v[2:3], v3326; GFX89-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4327; GFX89-NEXT:    s_setpc_b64 s[30:31]328;329; GFX10-LABEL: v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict:330; GFX10:       ; %bb.0:331; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)332; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v0333; GFX10-NEXT:    v_cvt_f32_f16_sdwa v3, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1334; GFX10-NEXT:    v_cvt_f32_f16_e32 v4, v1335; GFX10-NEXT:    v_cvt_f64_f32_e32 v[0:1], v2336; GFX10-NEXT:    v_cvt_f64_f32_e32 v[2:3], v3337; GFX10-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4338; GFX10-NEXT:    s_setpc_b64 s[30:31]339;340; GFX11-TRUE16-LABEL: v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict:341; GFX11-TRUE16:       ; %bb.0:342; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)343; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v2, v0.l344; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v3, v0.h345; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v4, v1.l346; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v2347; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[2:3], v3348; GFX11-TRUE16-NEXT:    v_cvt_f64_f32_e32 v[4:5], v4349; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]350;351; GFX11-FAKE16-LABEL: v_constrained_fpext_v3f16_to_v2f64_fpexcept_strict:352; GFX11-FAKE16:       ; %bb.0:353; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)354; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0355; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0356; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v3, v1357; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v2, v2358; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0359; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[4:5], v3360; GFX11-FAKE16-NEXT:    v_cvt_f64_f32_e32 v[2:3], v2361; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]362  %result = call <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f16(<3 x half> %arg, metadata !"fpexcept.strict")363  ret <3 x double>   %result364}365 366define float @v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict(half %arg) #0 {367; SI-LABEL: v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict:368; SI:       ; %bb.0:369; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)370; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0371; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0372; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0373; SI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0374; SI-NEXT:    s_setpc_b64 s[30:31]375;376; GFX89-LABEL: v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict:377; GFX89:       ; %bb.0:378; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)379; GFX89-NEXT:    v_cvt_f32_f16_e32 v0, v0380; GFX89-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0381; GFX89-NEXT:    s_setpc_b64 s[30:31]382;383; GFX10-LABEL: v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict:384; GFX10:       ; %bb.0:385; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)386; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0387; GFX10-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0388; GFX10-NEXT:    s_setpc_b64 s[30:31]389;390; GFX11-TRUE16-LABEL: v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict:391; GFX11-TRUE16:       ; %bb.0:392; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)393; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l394; GFX11-TRUE16-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0395; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]396;397; GFX11-FAKE16-LABEL: v_constrained_fneg_fpext_f16_to_f32_fpexcept_strict:398; GFX11-FAKE16:       ; %bb.0:399; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)400; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0401; GFX11-FAKE16-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0402; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]403  %result = call float @llvm.experimental.constrained.fpext.f32.f16(half %arg, metadata !"fpexcept.strict")404  %neg.result = fneg float %result405  ret float %neg.result406}407 408define float @v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict(half %arg) #0 {409; SI-LABEL: v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict:410; SI:       ; %bb.0:411; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)412; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0413; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0414; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0415; SI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0416; SI-NEXT:    s_setpc_b64 s[30:31]417;418; GFX89-LABEL: v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict:419; GFX89:       ; %bb.0:420; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)421; GFX89-NEXT:    v_cvt_f32_f16_e64 v0, -v0422; GFX89-NEXT:    s_setpc_b64 s[30:31]423;424; GFX10-LABEL: v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict:425; GFX10:       ; %bb.0:426; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)427; GFX10-NEXT:    v_cvt_f32_f16_e64 v0, -v0428; GFX10-NEXT:    s_setpc_b64 s[30:31]429;430; GFX11-TRUE16-LABEL: v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict:431; GFX11-TRUE16:       ; %bb.0:432; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)433; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e64 v0, -v0.l434; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]435;436; GFX11-FAKE16-LABEL: v_constrained_fpext_fneg_f16_to_f32_fpexcept_strict:437; GFX11-FAKE16:       ; %bb.0:438; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)439; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e64 v0, -v0440; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]441  %neg.arg = fneg half %arg442  %result = call float @llvm.experimental.constrained.fpext.f32.f16(half %neg.arg, metadata !"fpexcept.strict")443  ret float %result444}445 446define double @v_constrained_fpext_fneg_f32_to_f64_fpexcept_strict(float %arg) #0 {447; GCN-LABEL: v_constrained_fpext_fneg_f32_to_f64_fpexcept_strict:448; GCN:       ; %bb.0:449; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)450; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0451; GCN-NEXT:    s_setpc_b64 s[30:31]452  %neg.arg = fneg float %arg453  %result = call double @llvm.experimental.constrained.fpext.f64.f32(float %arg, metadata !"fpexcept.strict")454  ret double %result455}456 457define double @v_constrained_fneg_fpext_f32_to_f64_fpexcept_strict(float %arg) #0 {458; GCN-LABEL: v_constrained_fneg_fpext_f32_to_f64_fpexcept_strict:459; GCN:       ; %bb.0:460; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)461; GCN-NEXT:    v_cvt_f64_f32_e32 v[0:1], v0462; GCN-NEXT:    v_xor_b32_e32 v1, 0x80000000, v1463; GCN-NEXT:    s_setpc_b64 s[30:31]464  %result = call double @llvm.experimental.constrained.fpext.f64.f32(float %arg, metadata !"fpexcept.strict")465  %neg.result = fneg double %result466  ret double %neg.result467}468 469define float @v_constrained_fpext_f16_to_f32_noabi(ptr addrspace(1) %ptr) #0 {470; SI-LABEL: v_constrained_fpext_f16_to_f32_noabi:471; SI:       ; %bb.0:472; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)473; SI-NEXT:    s_mov_b32 s6, 0474; SI-NEXT:    s_mov_b32 s7, 0xf000475; SI-NEXT:    s_mov_b32 s4, s6476; SI-NEXT:    s_mov_b32 s5, s6477; SI-NEXT:    buffer_load_ushort v0, v[0:1], s[4:7], 0 addr64478; SI-NEXT:    s_waitcnt vmcnt(0)479; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0480; SI-NEXT:    s_setpc_b64 s[30:31]481;482; GFX8-LABEL: v_constrained_fpext_f16_to_f32_noabi:483; GFX8:       ; %bb.0:484; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)485; GFX8-NEXT:    flat_load_ushort v0, v[0:1]486; GFX8-NEXT:    s_waitcnt vmcnt(0)487; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0488; GFX8-NEXT:    s_setpc_b64 s[30:31]489;490; GFX9-LABEL: v_constrained_fpext_f16_to_f32_noabi:491; GFX9:       ; %bb.0:492; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)493; GFX9-NEXT:    global_load_ushort v0, v[0:1], off494; GFX9-NEXT:    s_waitcnt vmcnt(0)495; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0496; GFX9-NEXT:    s_setpc_b64 s[30:31]497;498; GFX10-LABEL: v_constrained_fpext_f16_to_f32_noabi:499; GFX10:       ; %bb.0:500; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)501; GFX10-NEXT:    global_load_ushort v0, v[0:1], off502; GFX10-NEXT:    s_waitcnt vmcnt(0)503; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0504; GFX10-NEXT:    s_setpc_b64 s[30:31]505;506; GFX11-TRUE16-LABEL: v_constrained_fpext_f16_to_f32_noabi:507; GFX11-TRUE16:       ; %bb.0:508; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)509; GFX11-TRUE16-NEXT:    global_load_d16_b16 v0, v[0:1], off510; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)511; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v0.l512; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]513;514; GFX11-FAKE16-LABEL: v_constrained_fpext_f16_to_f32_noabi:515; GFX11-FAKE16:       ; %bb.0:516; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)517; GFX11-FAKE16-NEXT:    global_load_u16 v0, v[0:1], off518; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)519; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0520; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]521  %val = load half, ptr addrspace(1) %ptr522  %result = call float @llvm.experimental.constrained.fpext.f32.f16(half %val, metadata !"fpexcept.strict")523  ret float %result524}525 526define <2 x float> @v_constrained_fpext_v2f16_to_v2f32_noabi(ptr addrspace(1) %ptr) #0 {527; SI-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:528; SI:       ; %bb.0:529; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)530; SI-NEXT:    s_mov_b32 s6, 0531; SI-NEXT:    s_mov_b32 s7, 0xf000532; SI-NEXT:    s_mov_b32 s4, s6533; SI-NEXT:    s_mov_b32 s5, s6534; SI-NEXT:    buffer_load_dword v1, v[0:1], s[4:7], 0 addr64535; SI-NEXT:    s_waitcnt vmcnt(0)536; SI-NEXT:    v_cvt_f32_f16_e32 v0, v1537; SI-NEXT:    v_lshrrev_b32_e32 v1, 16, v1538; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1539; SI-NEXT:    s_setpc_b64 s[30:31]540;541; GFX8-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:542; GFX8:       ; %bb.0:543; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)544; GFX8-NEXT:    flat_load_dword v1, v[0:1]545; GFX8-NEXT:    s_waitcnt vmcnt(0)546; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v1547; GFX8-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1548; GFX8-NEXT:    s_setpc_b64 s[30:31]549;550; GFX9-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:551; GFX9:       ; %bb.0:552; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)553; GFX9-NEXT:    global_load_dword v1, v[0:1], off554; GFX9-NEXT:    s_waitcnt vmcnt(0)555; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v1556; GFX9-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1557; GFX9-NEXT:    s_setpc_b64 s[30:31]558;559; GFX10-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:560; GFX10:       ; %bb.0:561; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)562; GFX10-NEXT:    global_load_dword v1, v[0:1], off563; GFX10-NEXT:    s_waitcnt vmcnt(0)564; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v1565; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1566; GFX10-NEXT:    s_setpc_b64 s[30:31]567;568; GFX11-TRUE16-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:569; GFX11-TRUE16:       ; %bb.0:570; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)571; GFX11-TRUE16-NEXT:    global_load_b32 v1, v[0:1], off572; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0)573; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v0, v1.l574; GFX11-TRUE16-NEXT:    v_cvt_f32_f16_e32 v1, v1.h575; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]576;577; GFX11-FAKE16-LABEL: v_constrained_fpext_v2f16_to_v2f32_noabi:578; GFX11-FAKE16:       ; %bb.0:579; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)580; GFX11-FAKE16-NEXT:    global_load_b32 v0, v[0:1], off581; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0)582; GFX11-FAKE16-NEXT:    v_lshrrev_b32_e32 v1, 16, v0583; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v0, v0584; GFX11-FAKE16-NEXT:    v_cvt_f32_f16_e32 v1, v1585; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]586  %val = load <2 x half>, ptr addrspace(1) %ptr587  %result = call <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half> %val, metadata !"fpexcept.strict")588  ret <2 x float> %result589}590 591declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata) #1592declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f32(<2 x float>, metadata) #1593declare <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f32(<3 x float>, metadata) #1594 595declare double @llvm.experimental.constrained.fpext.f64.f16(half, metadata) #1596declare <2 x double> @llvm.experimental.constrained.fpext.v2f64.v2f16(<2 x half>, metadata) #1597declare <3 x double> @llvm.experimental.constrained.fpext.v3f64.v3f16(<3 x half>, metadata) #1598 599declare float @llvm.experimental.constrained.fpext.f32.f16(half, metadata) #1600declare <2 x float> @llvm.experimental.constrained.fpext.v2f32.v2f16(<2 x half>, metadata) #1601declare <3 x float> @llvm.experimental.constrained.fpext.v3f32.v3f16(<3 x half>, metadata) #1602 603attributes #0 = { strictfp }604attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }605;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:606; GFX11: {{.*}}607