brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.0 KiB · 3e889c0 Raw
514 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,GFX10 %s6; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GCN,GFX11-TRUE16 %s7; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GCN,GFX11-FAKE16 %s8 9define half @v_constrained_fptrunc_f32_to_f16_fpexcept_strict(float %arg) #0 {10; SI-LABEL: v_constrained_fptrunc_f32_to_f16_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_fptrunc_f32_to_f16_fpexcept_strict:19; GFX89:       ; %bb.0:20; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)21; GFX89-NEXT:    v_cvt_f16_f32_e32 v0, v022; GFX89-NEXT:    s_setpc_b64 s[30:31]23;24; GFX10-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict:25; GFX10:       ; %bb.0:26; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)27; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v028; GFX10-NEXT:    s_setpc_b64 s[30:31]29;30; GFX11-TRUE16-LABEL: v_constrained_fptrunc_f32_to_f16_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_f16_f32_e32 v0.l, v034; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]35;36; GFX11-FAKE16-LABEL: v_constrained_fptrunc_f32_to_f16_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_f16_f32_e32 v0, v040; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]41  %val = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")42  ret half %val43}44 45define <2 x half> @v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict(<2 x float> %arg) #0 {46; SI-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_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 v1, v150; SI-NEXT:    v_cvt_f16_f32_e32 v0, v051; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v152; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v053; 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; GFX8-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict:58; GFX8:       ; %bb.0:59; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)60; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v061; GFX8-NEXT:    v_cvt_f16_f32_sdwa v1, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD62; GFX8-NEXT:    v_or_b32_e32 v0, v0, v163; GFX8-NEXT:    s_setpc_b64 s[30:31]64;65; GFX9-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict:66; GFX9:       ; %bb.0:67; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v069; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v170; GFX9-NEXT:    s_mov_b32 s4, 0x504010071; GFX9-NEXT:    v_perm_b32 v0, v1, v0, s472; GFX9-NEXT:    s_setpc_b64 s[30:31]73;74; GFX10-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict:75; GFX10:       ; %bb.0:76; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)77; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v078; GFX10-NEXT:    v_cvt_f16_f32_e32 v1, v179; GFX10-NEXT:    v_perm_b32 v0, v1, v0, 0x504010080; GFX10-NEXT:    s_setpc_b64 s[30:31]81;82; GFX11-TRUE16-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict:83; GFX11-TRUE16:       ; %bb.0:84; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)85; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v1.h, v186; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v1.l, v087; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v188; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]89;90; GFX11-FAKE16-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict:91; GFX11-FAKE16:       ; %bb.0:92; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)93; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v094; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v1, v195; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x504010096; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]97  %val = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")98  ret <2 x half> %val99}100 101define <3 x half> @v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict(<3 x float> %arg) #0 {102; SI-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:103; SI:       ; %bb.0:104; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)105; SI-NEXT:    v_cvt_f16_f32_e32 v2, v2106; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1107; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0108; SI-NEXT:    v_and_b32_e32 v2, 0xffff, v2109; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1110; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0111; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0112; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1113; SI-NEXT:    v_cvt_f32_f16_e32 v2, v2114; SI-NEXT:    s_setpc_b64 s[30:31]115;116; GFX8-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:117; GFX8:       ; %bb.0:118; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)119; GFX8-NEXT:    v_cvt_f16_f32_sdwa v3, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD120; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0121; GFX8-NEXT:    v_cvt_f16_f32_e32 v1, v2122; GFX8-NEXT:    v_or_b32_e32 v0, v0, v3123; GFX8-NEXT:    s_setpc_b64 s[30:31]124;125; GFX9-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:126; GFX9:       ; %bb.0:127; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0129; GFX9-NEXT:    v_cvt_f16_f32_e32 v3, v1130; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v2131; GFX9-NEXT:    s_mov_b32 s4, 0x5040100132; GFX9-NEXT:    v_perm_b32 v0, v3, v0, s4133; GFX9-NEXT:    s_setpc_b64 s[30:31]134;135; GFX10-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:136; GFX10:       ; %bb.0:137; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)138; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0139; GFX10-NEXT:    v_cvt_f16_f32_e32 v1, v1140; GFX10-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100141; GFX10-NEXT:    v_cvt_f16_f32_e32 v1, v2142; GFX10-NEXT:    s_setpc_b64 s[30:31]143;144; GFX11-TRUE16-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:145; GFX11-TRUE16:       ; %bb.0:146; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)147; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v3.h, v1148; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v3.l, v0149; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v1.l, v2150; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v0, v3151; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]152;153; GFX11-FAKE16-LABEL: v_constrained_fptrunc_v3f32_to_v3f16_fpexcept_strict:154; GFX11-FAKE16:       ; %bb.0:155; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)156; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v0157; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v1, v1158; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100159; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v1, v2160; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]161  %val = call <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f32(<3 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")162  ret <3 x half> %val163}164 165define float @v_constrained_fptrunc_f64_to_f32_fpexcept_strict(double %arg) #0 {166; GCN-LABEL: v_constrained_fptrunc_f64_to_f32_fpexcept_strict:167; GCN:       ; %bb.0:168; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)169; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]170; GCN-NEXT:    s_setpc_b64 s[30:31]171  %val = call float @llvm.experimental.constrained.fptrunc.f32.f64(double %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")172  ret float %val173}174 175define <2 x float> @v_constrained_fptrunc_v2f64_to_v2f32_fpexcept_strict(<2 x double> %arg) #0 {176; GCN-LABEL: v_constrained_fptrunc_v2f64_to_v2f32_fpexcept_strict:177; GCN:       ; %bb.0:178; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)179; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]180; GCN-NEXT:    v_cvt_f32_f64_e32 v1, v[2:3]181; GCN-NEXT:    s_setpc_b64 s[30:31]182  %val = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")183  ret <2 x float> %val184}185 186define <3 x float> @v_constrained_fptrunc_v3f64_to_v3f32_fpexcept_strict(<3 x double> %arg) #0 {187; GCN-LABEL: v_constrained_fptrunc_v3f64_to_v3f32_fpexcept_strict:188; GCN:       ; %bb.0:189; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)190; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]191; GCN-NEXT:    v_cvt_f32_f64_e32 v1, v[2:3]192; GCN-NEXT:    v_cvt_f32_f64_e32 v2, v[4:5]193; GCN-NEXT:    s_setpc_b64 s[30:31]194  %val = call <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(<3 x double> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")195  ret <3 x float> %val196}197 198; FIXME:199; define half @v_constrained_fptrunc_f64_to_f16_fpexcept_strict(double %arg) #0 {200;   %val = call half @llvm.experimental.constrained.fptrunc.f16.f64(double %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")201;   ret half %val202; }203 204; define <2 x half> @v_constrained_fptrunc_v2f64_to_v2f16_fpexcept_strict(<2 x double> %arg) #0 {205;   %val = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f64(<2 x double> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")206;   ret <2 x half> %val207; }208 209; define <3 x half> @v_constrained_fptrunc_v3f64_to_v3f16_fpexcept_strict(<3 x double> %arg) #0 {210;   %val = call <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f64(<3 x double> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")211;   ret <3 x half> %val212; }213 214define half @v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict(float %arg) #0 {215; SI-LABEL: v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict:216; SI:       ; %bb.0:217; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0219; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0220; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0221; SI-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0222; SI-NEXT:    s_setpc_b64 s[30:31]223;224; GFX89-LABEL: v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict:225; GFX89:       ; %bb.0:226; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)227; GFX89-NEXT:    v_cvt_f16_f32_e32 v0, v0228; GFX89-NEXT:    v_xor_b32_e32 v0, 0x8000, v0229; GFX89-NEXT:    s_setpc_b64 s[30:31]230;231; GFX10-LABEL: v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict:232; GFX10:       ; %bb.0:233; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)234; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0235; GFX10-NEXT:    v_xor_b32_e32 v0, 0x8000, v0236; GFX10-NEXT:    s_setpc_b64 s[30:31]237;238; GFX11-TRUE16-LABEL: v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict:239; GFX11-TRUE16:       ; %bb.0:240; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v0.l, v0242; GFX11-TRUE16-NEXT:    v_xor_b16 v0.l, 0x8000, v0.l243; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]244;245; GFX11-FAKE16-LABEL: v_constrained_fneg_fptrunc_f32_to_f16_fpexcept_strict:246; GFX11-FAKE16:       ; %bb.0:247; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)248; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v0249; GFX11-FAKE16-NEXT:    v_xor_b32_e32 v0, 0x8000, v0250; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]251  %val = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")252  %neg.val = fneg half %val253  ret half %neg.val254}255 256define half @v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict(float %arg) #0 {257; SI-LABEL: v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict:258; SI:       ; %bb.0:259; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)260; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v0261; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0262; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0263; SI-NEXT:    s_setpc_b64 s[30:31]264;265; GFX89-LABEL: v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict:266; GFX89:       ; %bb.0:267; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)268; GFX89-NEXT:    v_cvt_f16_f32_e64 v0, -v0269; GFX89-NEXT:    s_setpc_b64 s[30:31]270;271; GFX10-LABEL: v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict:272; GFX10:       ; %bb.0:273; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)274; GFX10-NEXT:    v_cvt_f16_f32_e64 v0, -v0275; GFX10-NEXT:    s_setpc_b64 s[30:31]276;277; GFX11-TRUE16-LABEL: v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict:278; GFX11-TRUE16:       ; %bb.0:279; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)280; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e64 v0.l, -v0281; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]282;283; GFX11-FAKE16-LABEL: v_constrained_fptrunc_fneg_f32_to_f16_fpexcept_strict:284; GFX11-FAKE16:       ; %bb.0:285; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)286; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e64 v0, -v0287; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]288  %neg.arg = fneg float %arg289  %val = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %neg.arg, metadata !"round.tonearest", metadata !"fpexcept.strict")290  ret half %val291}292 293define float @v_constrained_fneg_fptrunc_f64_to_f32_fpexcept_strict(double %arg) #0 {294; GCN-LABEL: v_constrained_fneg_fptrunc_f64_to_f32_fpexcept_strict:295; GCN:       ; %bb.0:296; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)297; GCN-NEXT:    v_cvt_f32_f64_e32 v0, v[0:1]298; GCN-NEXT:    v_xor_b32_e32 v0, 0x80000000, v0299; GCN-NEXT:    s_setpc_b64 s[30:31]300  %val = call float @llvm.experimental.constrained.fptrunc.f32.f64(double %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")301  %neg.val = fneg float %val302  ret float %neg.val303}304 305define float @v_constrained_fptrunc_fneg_f64_to_f32_fpexcept_strict(double %arg) #0 {306; GCN-LABEL: v_constrained_fptrunc_fneg_f64_to_f32_fpexcept_strict:307; GCN:       ; %bb.0:308; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)309; GCN-NEXT:    v_cvt_f32_f64_e64 v0, -v[0:1]310; GCN-NEXT:    s_setpc_b64 s[30:31]311  %neg.arg = fneg double %arg312  %val = call float @llvm.experimental.constrained.fptrunc.f32.f64(double %neg.arg, metadata !"round.tonearest", metadata !"fpexcept.strict")313  ret float %val314}315 316define void @v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi(float %arg, ptr addrspace(1) %ptr) #0 {317; SI-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi:318; SI:       ; %bb.0:319; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)320; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0321; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0322; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0323; SI-NEXT:    s_setpc_b64 s[30:31]324;325; GFX89-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi:326; GFX89:       ; %bb.0:327; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)328; GFX89-NEXT:    v_cvt_f16_f32_e32 v0, v0329; GFX89-NEXT:    s_setpc_b64 s[30:31]330;331; GFX10-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi:332; GFX10:       ; %bb.0:333; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)334; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0335; GFX10-NEXT:    s_setpc_b64 s[30:31]336;337; GFX11-TRUE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi:338; GFX11-TRUE16:       ; %bb.0:339; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)340; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v0.l, v0341; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]342;343; GFX11-FAKE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi:344; GFX11-FAKE16:       ; %bb.0:345; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)346; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v0347; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]348  %result = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")349  ret void350}351 352define void @v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi(<2 x float> %arg, ptr addrspace(1) %ptr) #0 {353; SI-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:354; SI:       ; %bb.0:355; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)356; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1357; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0358; SI-NEXT:    s_mov_b32 s6, 0359; SI-NEXT:    s_mov_b32 s7, 0xf000360; SI-NEXT:    v_and_b32_e32 v1, 0xffff, v1361; SI-NEXT:    v_cvt_f32_f16_e32 v1, v1362; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0363; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0364; SI-NEXT:    s_mov_b32 s4, s6365; SI-NEXT:    v_cvt_f16_f32_e32 v1, v1366; SI-NEXT:    s_mov_b32 s5, s6367; SI-NEXT:    v_cvt_f16_f32_e32 v0, v0368; SI-NEXT:    v_lshlrev_b32_e32 v1, 16, v1369; SI-NEXT:    v_or_b32_e32 v0, v0, v1370; SI-NEXT:    buffer_store_dword v0, v[2:3], s[4:7], 0 addr64371; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0)372; SI-NEXT:    s_setpc_b64 s[30:31]373;374; GFX8-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:375; GFX8:       ; %bb.0:376; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)377; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0378; GFX8-NEXT:    v_cvt_f16_f32_sdwa v1, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD379; GFX8-NEXT:    v_or_b32_e32 v0, v0, v1380; GFX8-NEXT:    flat_store_dword v[2:3], v0381; GFX8-NEXT:    s_waitcnt vmcnt(0)382; GFX8-NEXT:    s_setpc_b64 s[30:31]383;384; GFX9-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:385; GFX9:       ; %bb.0:386; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)387; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0388; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v1389; GFX9-NEXT:    s_mov_b32 s4, 0x5040100390; GFX9-NEXT:    v_perm_b32 v0, v1, v0, s4391; GFX9-NEXT:    global_store_dword v[2:3], v0, off392; GFX9-NEXT:    s_waitcnt vmcnt(0)393; GFX9-NEXT:    s_setpc_b64 s[30:31]394;395; GFX10-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:396; GFX10:       ; %bb.0:397; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)398; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0399; GFX10-NEXT:    v_cvt_f16_f32_e32 v1, v1400; GFX10-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100401; GFX10-NEXT:    global_store_dword v[2:3], v0, off402; GFX10-NEXT:    s_setpc_b64 s[30:31]403;404; GFX11-TRUE16-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:405; GFX11-TRUE16:       ; %bb.0:406; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)407; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v1.h, v1408; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e32 v1.l, v0409; GFX11-TRUE16-NEXT:    global_store_b32 v[2:3], v1, off410; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]411;412; GFX11-FAKE16-LABEL: v_constrained_fptrunc_v2f32_to_v2f16_fpexcept_strict_noabi:413; GFX11-FAKE16:       ; %bb.0:414; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)415; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v0, v0416; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e32 v1, v1417; GFX11-FAKE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100418; GFX11-FAKE16-NEXT:    global_store_b32 v[2:3], v0, off419; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]420  %result = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float> %arg, metadata !"round.tonearest", metadata !"fpexcept.strict")421  store <2 x half> %result, ptr addrspace(1) %ptr422  ret void423}424 425define void @v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg(float %arg, ptr addrspace(1) %ptr) #0 {426; SI-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg:427; SI:       ; %bb.0:428; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)429; SI-NEXT:    v_cvt_f16_f32_e64 v0, -v0430; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0431; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0432; SI-NEXT:    s_setpc_b64 s[30:31]433;434; GFX89-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg:435; GFX89:       ; %bb.0:436; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)437; GFX89-NEXT:    v_cvt_f16_f32_e64 v0, -v0438; GFX89-NEXT:    s_setpc_b64 s[30:31]439;440; GFX10-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg:441; GFX10:       ; %bb.0:442; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)443; GFX10-NEXT:    v_cvt_f16_f32_e64 v0, -v0444; GFX10-NEXT:    s_setpc_b64 s[30:31]445;446; GFX11-TRUE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg:447; GFX11-TRUE16:       ; %bb.0:448; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)449; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e64 v0.l, -v0450; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]451;452; GFX11-FAKE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fneg:453; GFX11-FAKE16:       ; %bb.0:454; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)455; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e64 v0, -v0456; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]457  %neg.arg = fneg float %arg458  %result = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %neg.arg, metadata !"round.tonearest", metadata !"fpexcept.strict")459  ret void460}461 462define void @v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs(float %arg, ptr addrspace(1) %ptr) #0 {463; SI-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs:464; SI:       ; %bb.0:465; SI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)466; SI-NEXT:    v_cvt_f16_f32_e64 v0, |v0|467; SI-NEXT:    v_and_b32_e32 v0, 0xffff, v0468; SI-NEXT:    v_cvt_f32_f16_e32 v0, v0469; SI-NEXT:    s_setpc_b64 s[30:31]470;471; GFX89-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs:472; GFX89:       ; %bb.0:473; GFX89-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)474; GFX89-NEXT:    v_cvt_f16_f32_e64 v0, |v0|475; GFX89-NEXT:    s_setpc_b64 s[30:31]476;477; GFX10-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs:478; GFX10:       ; %bb.0:479; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)480; GFX10-NEXT:    v_cvt_f16_f32_e64 v0, |v0|481; GFX10-NEXT:    s_setpc_b64 s[30:31]482;483; GFX11-TRUE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs:484; GFX11-TRUE16:       ; %bb.0:485; GFX11-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)486; GFX11-TRUE16-NEXT:    v_cvt_f16_f32_e64 v0.l, |v0|487; GFX11-TRUE16-NEXT:    s_setpc_b64 s[30:31]488;489; GFX11-FAKE16-LABEL: v_constrained_fptrunc_f32_to_f16_fpexcept_strict_noabi_fabs:490; GFX11-FAKE16:       ; %bb.0:491; GFX11-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)492; GFX11-FAKE16-NEXT:    v_cvt_f16_f32_e64 v0, |v0|493; GFX11-FAKE16-NEXT:    s_setpc_b64 s[30:31]494  %abs.arg = call float @llvm.fabs.f32(float %arg) #0495  %result = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %abs.arg, metadata !"round.tonearest", metadata !"fpexcept.strict")496  ret void497}498 499declare half @llvm.experimental.constrained.fptrunc.f16.f32(float, metadata, metadata)500declare <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float>, metadata, metadata)501declare <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f32(<3 x float>, metadata, metadata)502 503declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)504declare <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double>, metadata, metadata)505declare <3 x float> @llvm.experimental.constrained.fptrunc.v3f32.v3f64(<3 x double>, metadata, metadata)506 507declare half @llvm.experimental.constrained.fptrunc.f16.f64(double, metadata, metadata)508declare <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f64(<2 x double>, metadata, metadata)509declare <3 x half> @llvm.experimental.constrained.fptrunc.v3f16.v3f64(<3 x double>, metadata, metadata)510 511declare float @llvm.fabs.f32(float)512 513attributes #0 = { strictfp }514