1385 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP163; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP164; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI5; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 -mattr=+fullfp16 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI6 7; CHECK-GI: warning: Instruction selection used fallback path for add_f168; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sub_f169; CHECK-GI-NEXT: warning: Instruction selection used fallback path for mul_f1610; CHECK-GI-NEXT: warning: Instruction selection used fallback path for div_f1611; CHECK-GI-NEXT: warning: Instruction selection used fallback path for frem_f1612; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fma_f1613; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_i32_f1614; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_i32_f1615; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptosi_i64_f1616; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptoui_i64_f1617; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i3218; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i3219; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i6420; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i6421; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sitofp_f16_i12822; CHECK-GI-NEXT: warning: Instruction selection used fallback path for uitofp_f16_i12823; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sqrt_f1624; CHECK-GI-NEXT: warning: Instruction selection used fallback path for powi_f1625; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sin_f1626; CHECK-GI-NEXT: warning: Instruction selection used fallback path for cos_f1627; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tan_f1628; CHECK-GI-NEXT: warning: Instruction selection used fallback path for asin_f1629; CHECK-GI-NEXT: warning: Instruction selection used fallback path for acos_f1630; CHECK-GI-NEXT: warning: Instruction selection used fallback path for atan_f1631; CHECK-GI-NEXT: warning: Instruction selection used fallback path for atan2_f1632; CHECK-GI-NEXT: warning: Instruction selection used fallback path for sinh_f1633; CHECK-GI-NEXT: warning: Instruction selection used fallback path for cosh_f1634; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tanh_f1635; CHECK-GI-NEXT: warning: Instruction selection used fallback path for pow_f1636; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log_f1637; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log10_f1638; CHECK-GI-NEXT: warning: Instruction selection used fallback path for log2_f1639; CHECK-GI-NEXT: warning: Instruction selection used fallback path for exp_f1640; CHECK-GI-NEXT: warning: Instruction selection used fallback path for exp2_f1641; CHECK-GI-NEXT: warning: Instruction selection used fallback path for rint_f1642; CHECK-GI-NEXT: warning: Instruction selection used fallback path for nearbyint_f1643; CHECK-GI-NEXT: warning: Instruction selection used fallback path for lrint_f1644; CHECK-GI-NEXT: warning: Instruction selection used fallback path for llrint_f1645; CHECK-GI-NEXT: warning: Instruction selection used fallback path for maxnum_f1646; CHECK-GI-NEXT: warning: Instruction selection used fallback path for minnum_f1647; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ceil_f1648; CHECK-GI-NEXT: warning: Instruction selection used fallback path for floor_f1649; CHECK-GI-NEXT: warning: Instruction selection used fallback path for lround_f1650; CHECK-GI-NEXT: warning: Instruction selection used fallback path for llround_f1651; CHECK-GI-NEXT: warning: Instruction selection used fallback path for round_f1652; CHECK-GI-NEXT: warning: Instruction selection used fallback path for roundeven_f1653; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_f1654; CHECK-GI-NEXT: warning: Instruction selection used fallback path for ldexp_f1655; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_olt_f1656; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ole_f1657; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ogt_f1658; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_oge_f1659; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_oeq_f1660; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_one_f1661; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ult_f1662; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ule_f1663; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ugt_f1664; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_uge_f1665; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_ueq_f1666; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmp_une_f1667; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_olt_f1668; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ole_f1669; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ogt_f1670; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_oge_f1671; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_oeq_f1672; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_one_f1673; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ult_f1674; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ule_f1675; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ugt_f1676; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_uge_f1677; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_ueq_f1678; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcmps_une_f1679; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fptrunc_f16_f3280; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fpext_f32_f1681 82; Check that constrained fp intrinsics are correctly lowered.83 84; Half-precision intrinsics85 86define half @add_f16(half %x, half %y) #0 {87; CHECK-NOFP16-LABEL: add_f16:88; CHECK-NOFP16: // %bb.0:89; CHECK-NOFP16-NEXT: fcvt s1, h190; CHECK-NOFP16-NEXT: fcvt s0, h091; CHECK-NOFP16-NEXT: fadd s0, s0, s192; CHECK-NOFP16-NEXT: fcvt h0, s093; CHECK-NOFP16-NEXT: ret94;95; CHECK-FP16-LABEL: add_f16:96; CHECK-FP16: // %bb.0:97; CHECK-FP16-NEXT: fadd h0, h0, h198; CHECK-FP16-NEXT: ret99 %val = call half @llvm.experimental.constrained.fadd.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0100 ret half %val101}102 103define half @sub_f16(half %x, half %y) #0 {104; CHECK-NOFP16-LABEL: sub_f16:105; CHECK-NOFP16: // %bb.0:106; CHECK-NOFP16-NEXT: fcvt s1, h1107; CHECK-NOFP16-NEXT: fcvt s0, h0108; CHECK-NOFP16-NEXT: fsub s0, s0, s1109; CHECK-NOFP16-NEXT: fcvt h0, s0110; CHECK-NOFP16-NEXT: ret111;112; CHECK-FP16-LABEL: sub_f16:113; CHECK-FP16: // %bb.0:114; CHECK-FP16-NEXT: fsub h0, h0, h1115; CHECK-FP16-NEXT: ret116 %val = call half @llvm.experimental.constrained.fsub.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0117 ret half %val118}119 120define half @mul_f16(half %x, half %y) #0 {121; CHECK-NOFP16-LABEL: mul_f16:122; CHECK-NOFP16: // %bb.0:123; CHECK-NOFP16-NEXT: fcvt s1, h1124; CHECK-NOFP16-NEXT: fcvt s0, h0125; CHECK-NOFP16-NEXT: fmul s0, s0, s1126; CHECK-NOFP16-NEXT: fcvt h0, s0127; CHECK-NOFP16-NEXT: ret128;129; CHECK-FP16-LABEL: mul_f16:130; CHECK-FP16: // %bb.0:131; CHECK-FP16-NEXT: fmul h0, h0, h1132; CHECK-FP16-NEXT: ret133 %val = call half @llvm.experimental.constrained.fmul.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0134 ret half %val135}136 137define half @div_f16(half %x, half %y) #0 {138; CHECK-NOFP16-LABEL: div_f16:139; CHECK-NOFP16: // %bb.0:140; CHECK-NOFP16-NEXT: fcvt s1, h1141; CHECK-NOFP16-NEXT: fcvt s0, h0142; CHECK-NOFP16-NEXT: fdiv s0, s0, s1143; CHECK-NOFP16-NEXT: fcvt h0, s0144; CHECK-NOFP16-NEXT: ret145;146; CHECK-FP16-LABEL: div_f16:147; CHECK-FP16: // %bb.0:148; CHECK-FP16-NEXT: fdiv h0, h0, h1149; CHECK-FP16-NEXT: ret150 %val = call half @llvm.experimental.constrained.fdiv.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0151 ret half %val152}153 154define half @frem_f16(half %x, half %y) #0 {155; CHECK-LABEL: frem_f16:156; CHECK: // %bb.0:157; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill158; CHECK-NEXT: .cfi_def_cfa_offset 16159; CHECK-NEXT: .cfi_offset w30, -16160; CHECK-NEXT: fcvt s1, h1161; CHECK-NEXT: fcvt s0, h0162; CHECK-NEXT: bl fmodf163; CHECK-NEXT: fcvt h0, s0164; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload165; CHECK-NEXT: ret166 %val = call half @llvm.experimental.constrained.frem.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0167 ret half %val168}169 170define half @fma_f16(half %x, half %y, half %z) #0 {171; CHECK-NOFP16-LABEL: fma_f16:172; CHECK-NOFP16: // %bb.0:173; CHECK-NOFP16-NEXT: fcvt s2, h2174; CHECK-NOFP16-NEXT: fcvt s1, h1175; CHECK-NOFP16-NEXT: fcvt s0, h0176; CHECK-NOFP16-NEXT: fmadd s0, s0, s1, s2177; CHECK-NOFP16-NEXT: fcvt h0, s0178; CHECK-NOFP16-NEXT: ret179;180; CHECK-FP16-LABEL: fma_f16:181; CHECK-FP16: // %bb.0:182; CHECK-FP16-NEXT: fmadd h0, h0, h1, h2183; CHECK-FP16-NEXT: ret184 %val = call half @llvm.experimental.constrained.fma.f16(half %x, half %y, half %z, metadata !"round.tonearest", metadata !"fpexcept.strict") #0185 ret half %val186}187 188define i32 @fptosi_i32_f16(half %x) #0 {189; CHECK-NOFP16-LABEL: fptosi_i32_f16:190; CHECK-NOFP16: // %bb.0:191; CHECK-NOFP16-NEXT: fcvt s0, h0192; CHECK-NOFP16-NEXT: fcvtzs w0, s0193; CHECK-NOFP16-NEXT: ret194;195; CHECK-FP16-LABEL: fptosi_i32_f16:196; CHECK-FP16: // %bb.0:197; CHECK-FP16-NEXT: fcvtzs w0, h0198; CHECK-FP16-NEXT: ret199 %val = call i32 @llvm.experimental.constrained.fptosi.i32.f16(half %x, metadata !"fpexcept.strict") #0200 ret i32 %val201}202 203define i32 @fptoui_i32_f16(half %x) #0 {204; CHECK-NOFP16-LABEL: fptoui_i32_f16:205; CHECK-NOFP16: // %bb.0:206; CHECK-NOFP16-NEXT: fcvt s0, h0207; CHECK-NOFP16-NEXT: fcvtzu w0, s0208; CHECK-NOFP16-NEXT: ret209;210; CHECK-FP16-LABEL: fptoui_i32_f16:211; CHECK-FP16: // %bb.0:212; CHECK-FP16-NEXT: fcvtzu w0, h0213; CHECK-FP16-NEXT: ret214 %val = call i32 @llvm.experimental.constrained.fptoui.i32.f16(half %x, metadata !"fpexcept.strict") #0215 ret i32 %val216}217 218define i64 @fptosi_i64_f16(half %x) #0 {219; CHECK-NOFP16-LABEL: fptosi_i64_f16:220; CHECK-NOFP16: // %bb.0:221; CHECK-NOFP16-NEXT: fcvt s0, h0222; CHECK-NOFP16-NEXT: fcvtzs x0, s0223; CHECK-NOFP16-NEXT: ret224;225; CHECK-FP16-LABEL: fptosi_i64_f16:226; CHECK-FP16: // %bb.0:227; CHECK-FP16-NEXT: fcvtzs x0, h0228; CHECK-FP16-NEXT: ret229 %val = call i64 @llvm.experimental.constrained.fptosi.i64.f16(half %x, metadata !"fpexcept.strict") #0230 ret i64 %val231}232 233define i64 @fptoui_i64_f16(half %x) #0 {234; CHECK-NOFP16-LABEL: fptoui_i64_f16:235; CHECK-NOFP16: // %bb.0:236; CHECK-NOFP16-NEXT: fcvt s0, h0237; CHECK-NOFP16-NEXT: fcvtzu x0, s0238; CHECK-NOFP16-NEXT: ret239;240; CHECK-FP16-LABEL: fptoui_i64_f16:241; CHECK-FP16: // %bb.0:242; CHECK-FP16-NEXT: fcvtzu x0, h0243; CHECK-FP16-NEXT: ret244 %val = call i64 @llvm.experimental.constrained.fptoui.i64.f16(half %x, metadata !"fpexcept.strict") #0245 ret i64 %val246}247 248define half @sitofp_f16_i32(i32 %x) #0 {249; CHECK-NOFP16-LABEL: sitofp_f16_i32:250; CHECK-NOFP16: // %bb.0:251; CHECK-NOFP16-NEXT: scvtf s0, w0252; CHECK-NOFP16-NEXT: fcvt h0, s0253; CHECK-NOFP16-NEXT: ret254;255; CHECK-FP16-LABEL: sitofp_f16_i32:256; CHECK-FP16: // %bb.0:257; CHECK-FP16-NEXT: scvtf h0, w0258; CHECK-FP16-NEXT: ret259 %val = call half @llvm.experimental.constrained.sitofp.f16.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0260 ret half %val261}262 263define half @uitofp_f16_i32(i32 %x) #0 {264; CHECK-NOFP16-LABEL: uitofp_f16_i32:265; CHECK-NOFP16: // %bb.0:266; CHECK-NOFP16-NEXT: ucvtf s0, w0267; CHECK-NOFP16-NEXT: fcvt h0, s0268; CHECK-NOFP16-NEXT: ret269;270; CHECK-FP16-LABEL: uitofp_f16_i32:271; CHECK-FP16: // %bb.0:272; CHECK-FP16-NEXT: ucvtf h0, w0273; CHECK-FP16-NEXT: ret274 %val = call half @llvm.experimental.constrained.uitofp.f16.i32(i32 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0275 ret half %val276}277 278define half @sitofp_f16_i64(i64 %x) #0 {279; CHECK-NOFP16-LABEL: sitofp_f16_i64:280; CHECK-NOFP16: // %bb.0:281; CHECK-NOFP16-NEXT: scvtf s0, x0282; CHECK-NOFP16-NEXT: fcvt h0, s0283; CHECK-NOFP16-NEXT: ret284;285; CHECK-FP16-LABEL: sitofp_f16_i64:286; CHECK-FP16: // %bb.0:287; CHECK-FP16-NEXT: scvtf h0, x0288; CHECK-FP16-NEXT: ret289 %val = call half @llvm.experimental.constrained.sitofp.f16.i64(i64 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0290 ret half %val291}292 293define half @uitofp_f16_i64(i64 %x) #0 {294; CHECK-NOFP16-LABEL: uitofp_f16_i64:295; CHECK-NOFP16: // %bb.0:296; CHECK-NOFP16-NEXT: ucvtf s0, x0297; CHECK-NOFP16-NEXT: fcvt h0, s0298; CHECK-NOFP16-NEXT: ret299;300; CHECK-FP16-LABEL: uitofp_f16_i64:301; CHECK-FP16: // %bb.0:302; CHECK-FP16-NEXT: ucvtf h0, x0303; CHECK-FP16-NEXT: ret304 %val = call half @llvm.experimental.constrained.uitofp.f16.i64(i64 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0305 ret half %val306}307 308define half @sitofp_f16_i128(i128 %x) #0 {309; CHECK-NOFP16-LABEL: sitofp_f16_i128:310; CHECK-NOFP16: // %bb.0:311; CHECK-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill312; CHECK-NOFP16-NEXT: .cfi_def_cfa_offset 16313; CHECK-NOFP16-NEXT: .cfi_offset w30, -16314; CHECK-NOFP16-NEXT: bl __floattisf315; CHECK-NOFP16-NEXT: fcvt h0, s0316; CHECK-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload317; CHECK-NOFP16-NEXT: ret318;319; CHECK-FP16-LABEL: sitofp_f16_i128:320; CHECK-FP16: // %bb.0:321; CHECK-FP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill322; CHECK-FP16-NEXT: .cfi_def_cfa_offset 16323; CHECK-FP16-NEXT: .cfi_offset w30, -16324; CHECK-FP16-NEXT: bl __floattihf325; CHECK-FP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload326; CHECK-FP16-NEXT: ret327 %val = call half @llvm.experimental.constrained.sitofp.f16.i128(i128 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0328 ret half %val329}330 331define half @uitofp_f16_i128(i128 %x) #0 {332; CHECK-NOFP16-LABEL: uitofp_f16_i128:333; CHECK-NOFP16: // %bb.0:334; CHECK-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill335; CHECK-NOFP16-NEXT: .cfi_def_cfa_offset 16336; CHECK-NOFP16-NEXT: .cfi_offset w30, -16337; CHECK-NOFP16-NEXT: bl __floatuntisf338; CHECK-NOFP16-NEXT: fcvt h0, s0339; CHECK-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload340; CHECK-NOFP16-NEXT: ret341;342; CHECK-FP16-LABEL: uitofp_f16_i128:343; CHECK-FP16: // %bb.0:344; CHECK-FP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill345; CHECK-FP16-NEXT: .cfi_def_cfa_offset 16346; CHECK-FP16-NEXT: .cfi_offset w30, -16347; CHECK-FP16-NEXT: bl __floatuntihf348; CHECK-FP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload349; CHECK-FP16-NEXT: ret350 %val = call half @llvm.experimental.constrained.uitofp.f16.i128(i128 %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0351 ret half %val352}353 354define half @sqrt_f16(half %x) #0 {355; CHECK-NOFP16-LABEL: sqrt_f16:356; CHECK-NOFP16: // %bb.0:357; CHECK-NOFP16-NEXT: fcvt s0, h0358; CHECK-NOFP16-NEXT: fsqrt s0, s0359; CHECK-NOFP16-NEXT: fcvt h0, s0360; CHECK-NOFP16-NEXT: ret361;362; CHECK-FP16-LABEL: sqrt_f16:363; CHECK-FP16: // %bb.0:364; CHECK-FP16-NEXT: fsqrt h0, h0365; CHECK-FP16-NEXT: ret366 %val = call half @llvm.experimental.constrained.sqrt.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0367 ret half %val368}369 370define half @powi_f16(half %x, i32 %y) #0 {371; CHECK-LABEL: powi_f16:372; CHECK: // %bb.0:373; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill374; CHECK-NEXT: .cfi_def_cfa_offset 16375; CHECK-NEXT: .cfi_offset w30, -16376; CHECK-NEXT: fcvt s0, h0377; CHECK-NEXT: bl __powisf2378; CHECK-NEXT: fcvt h0, s0379; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload380; CHECK-NEXT: ret381 %val = call half @llvm.experimental.constrained.powi.f16(half %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0382 ret half %val383}384 385define half @sin_f16(half %x) #0 {386; CHECK-LABEL: sin_f16:387; CHECK: // %bb.0:388; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill389; CHECK-NEXT: .cfi_def_cfa_offset 16390; CHECK-NEXT: .cfi_offset w30, -16391; CHECK-NEXT: fcvt s0, h0392; CHECK-NEXT: bl sinf393; CHECK-NEXT: fcvt h0, s0394; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload395; CHECK-NEXT: ret396 %val = call half @llvm.experimental.constrained.sin.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0397 ret half %val398}399 400define half @cos_f16(half %x) #0 {401; CHECK-LABEL: cos_f16:402; CHECK: // %bb.0:403; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill404; CHECK-NEXT: .cfi_def_cfa_offset 16405; CHECK-NEXT: .cfi_offset w30, -16406; CHECK-NEXT: fcvt s0, h0407; CHECK-NEXT: bl cosf408; CHECK-NEXT: fcvt h0, s0409; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload410; CHECK-NEXT: ret411 %val = call half @llvm.experimental.constrained.cos.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0412 ret half %val413}414 415define half @tan_f16(half %x) #0 {416; CHECK-LABEL: tan_f16:417; CHECK: // %bb.0:418; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill419; CHECK-NEXT: .cfi_def_cfa_offset 16420; CHECK-NEXT: .cfi_offset w30, -16421; CHECK-NEXT: fcvt s0, h0422; CHECK-NEXT: bl tanf423; CHECK-NEXT: fcvt h0, s0424; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload425; CHECK-NEXT: ret426 %val = call half @llvm.experimental.constrained.tan.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0427 ret half %val428}429 430define half @asin_f16(half %x) #0 {431; CHECK-LABEL: asin_f16:432; CHECK: // %bb.0:433; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill434; CHECK-NEXT: .cfi_def_cfa_offset 16435; CHECK-NEXT: .cfi_offset w30, -16436; CHECK-NEXT: fcvt s0, h0437; CHECK-NEXT: bl asinf438; CHECK-NEXT: fcvt h0, s0439; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload440; CHECK-NEXT: ret441 %val = call half @llvm.experimental.constrained.asin.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0442 ret half %val443}444 445define half @acos_f16(half %x) #0 {446; CHECK-LABEL: acos_f16:447; CHECK: // %bb.0:448; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill449; CHECK-NEXT: .cfi_def_cfa_offset 16450; CHECK-NEXT: .cfi_offset w30, -16451; CHECK-NEXT: fcvt s0, h0452; CHECK-NEXT: bl acosf453; CHECK-NEXT: fcvt h0, s0454; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload455; CHECK-NEXT: ret456 %val = call half @llvm.experimental.constrained.acos.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0457 ret half %val458}459 460define half @atan_f16(half %x) #0 {461; CHECK-LABEL: atan_f16:462; CHECK: // %bb.0:463; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill464; CHECK-NEXT: .cfi_def_cfa_offset 16465; CHECK-NEXT: .cfi_offset w30, -16466; CHECK-NEXT: fcvt s0, h0467; CHECK-NEXT: bl atanf468; CHECK-NEXT: fcvt h0, s0469; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload470; CHECK-NEXT: ret471 %val = call half @llvm.experimental.constrained.atan.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0472 ret half %val473}474 475define half @atan2_f16(half %x, half %y) #0 {476; CHECK-LABEL: atan2_f16:477; CHECK: // %bb.0:478; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill479; CHECK-NEXT: .cfi_def_cfa_offset 16480; CHECK-NEXT: .cfi_offset w30, -16481; CHECK-NEXT: fcvt s1, h1482; CHECK-NEXT: fcvt s0, h0483; CHECK-NEXT: bl atan2f484; CHECK-NEXT: fcvt h0, s0485; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload486; CHECK-NEXT: ret487 %val = call half @llvm.experimental.constrained.atan2.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0488 ret half %val489}490 491define half @sinh_f16(half %x) #0 {492; CHECK-LABEL: sinh_f16:493; CHECK: // %bb.0:494; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill495; CHECK-NEXT: .cfi_def_cfa_offset 16496; CHECK-NEXT: .cfi_offset w30, -16497; CHECK-NEXT: fcvt s0, h0498; CHECK-NEXT: bl sinhf499; CHECK-NEXT: fcvt h0, s0500; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload501; CHECK-NEXT: ret502 %val = call half @llvm.experimental.constrained.sinh.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0503 ret half %val504}505 506define half @cosh_f16(half %x) #0 {507; CHECK-LABEL: cosh_f16:508; CHECK: // %bb.0:509; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill510; CHECK-NEXT: .cfi_def_cfa_offset 16511; CHECK-NEXT: .cfi_offset w30, -16512; CHECK-NEXT: fcvt s0, h0513; CHECK-NEXT: bl coshf514; CHECK-NEXT: fcvt h0, s0515; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload516; CHECK-NEXT: ret517 %val = call half @llvm.experimental.constrained.cosh.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0518 ret half %val519}520 521define half @tanh_f16(half %x) #0 {522; CHECK-LABEL: tanh_f16:523; CHECK: // %bb.0:524; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill525; CHECK-NEXT: .cfi_def_cfa_offset 16526; CHECK-NEXT: .cfi_offset w30, -16527; CHECK-NEXT: fcvt s0, h0528; CHECK-NEXT: bl tanhf529; CHECK-NEXT: fcvt h0, s0530; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload531; CHECK-NEXT: ret532 %val = call half @llvm.experimental.constrained.tanh.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0533 ret half %val534}535 536define half @pow_f16(half %x, half %y) #0 {537; CHECK-LABEL: pow_f16:538; CHECK: // %bb.0:539; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill540; CHECK-NEXT: .cfi_def_cfa_offset 16541; CHECK-NEXT: .cfi_offset w30, -16542; CHECK-NEXT: fcvt s1, h1543; CHECK-NEXT: fcvt s0, h0544; CHECK-NEXT: bl powf545; CHECK-NEXT: fcvt h0, s0546; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload547; CHECK-NEXT: ret548 %val = call half @llvm.experimental.constrained.pow.f16(half %x, half %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0549 ret half %val550}551 552define half @log_f16(half %x) #0 {553; CHECK-LABEL: log_f16:554; CHECK: // %bb.0:555; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill556; CHECK-NEXT: .cfi_def_cfa_offset 16557; CHECK-NEXT: .cfi_offset w30, -16558; CHECK-NEXT: fcvt s0, h0559; CHECK-NEXT: bl logf560; CHECK-NEXT: fcvt h0, s0561; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload562; CHECK-NEXT: ret563 %val = call half @llvm.experimental.constrained.log.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0564 ret half %val565}566 567define half @log10_f16(half %x) #0 {568; CHECK-LABEL: log10_f16:569; CHECK: // %bb.0:570; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill571; CHECK-NEXT: .cfi_def_cfa_offset 16572; CHECK-NEXT: .cfi_offset w30, -16573; CHECK-NEXT: fcvt s0, h0574; CHECK-NEXT: bl log10f575; CHECK-NEXT: fcvt h0, s0576; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload577; CHECK-NEXT: ret578 %val = call half @llvm.experimental.constrained.log10.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0579 ret half %val580}581 582define half @log2_f16(half %x) #0 {583; CHECK-LABEL: log2_f16:584; CHECK: // %bb.0:585; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill586; CHECK-NEXT: .cfi_def_cfa_offset 16587; CHECK-NEXT: .cfi_offset w30, -16588; CHECK-NEXT: fcvt s0, h0589; CHECK-NEXT: bl log2f590; CHECK-NEXT: fcvt h0, s0591; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload592; CHECK-NEXT: ret593 %val = call half @llvm.experimental.constrained.log2.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0594 ret half %val595}596 597define half @exp_f16(half %x) #0 {598; CHECK-LABEL: exp_f16:599; CHECK: // %bb.0:600; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill601; CHECK-NEXT: .cfi_def_cfa_offset 16602; CHECK-NEXT: .cfi_offset w30, -16603; CHECK-NEXT: fcvt s0, h0604; CHECK-NEXT: bl expf605; CHECK-NEXT: fcvt h0, s0606; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload607; CHECK-NEXT: ret608 %val = call half @llvm.experimental.constrained.exp.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0609 ret half %val610}611 612define half @exp2_f16(half %x) #0 {613; CHECK-LABEL: exp2_f16:614; CHECK: // %bb.0:615; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill616; CHECK-NEXT: .cfi_def_cfa_offset 16617; CHECK-NEXT: .cfi_offset w30, -16618; CHECK-NEXT: fcvt s0, h0619; CHECK-NEXT: bl exp2f620; CHECK-NEXT: fcvt h0, s0621; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload622; CHECK-NEXT: ret623 %val = call half @llvm.experimental.constrained.exp2.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0624 ret half %val625}626 627define half @rint_f16(half %x) #0 {628; CHECK-NOFP16-LABEL: rint_f16:629; CHECK-NOFP16: // %bb.0:630; CHECK-NOFP16-NEXT: fcvt s0, h0631; CHECK-NOFP16-NEXT: frintx s0, s0632; CHECK-NOFP16-NEXT: fcvt h0, s0633; CHECK-NOFP16-NEXT: ret634;635; CHECK-FP16-LABEL: rint_f16:636; CHECK-FP16: // %bb.0:637; CHECK-FP16-NEXT: frintx h0, h0638; CHECK-FP16-NEXT: ret639 %val = call half @llvm.experimental.constrained.rint.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0640 ret half %val641}642 643define half @nearbyint_f16(half %x) #0 {644; CHECK-NOFP16-LABEL: nearbyint_f16:645; CHECK-NOFP16: // %bb.0:646; CHECK-NOFP16-NEXT: fcvt s0, h0647; CHECK-NOFP16-NEXT: frinti s0, s0648; CHECK-NOFP16-NEXT: fcvt h0, s0649; CHECK-NOFP16-NEXT: ret650;651; CHECK-FP16-LABEL: nearbyint_f16:652; CHECK-FP16: // %bb.0:653; CHECK-FP16-NEXT: frinti h0, h0654; CHECK-FP16-NEXT: ret655 %val = call half @llvm.experimental.constrained.nearbyint.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0656 ret half %val657}658 659define i32 @lrint_f16(half %x) #0 {660; CHECK-NOFP16-LABEL: lrint_f16:661; CHECK-NOFP16: // %bb.0:662; CHECK-NOFP16-NEXT: fcvt s0, h0663; CHECK-NOFP16-NEXT: frintx s0, s0664; CHECK-NOFP16-NEXT: fcvtzs w0, s0665; CHECK-NOFP16-NEXT: ret666;667; CHECK-FP16-LABEL: lrint_f16:668; CHECK-FP16: // %bb.0:669; CHECK-FP16-NEXT: frintx h0, h0670; CHECK-FP16-NEXT: fcvtzs w0, h0671; CHECK-FP16-NEXT: ret672 %val = call i32 @llvm.experimental.constrained.lrint.i32.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0673 ret i32 %val674}675 676define i64 @llrint_f16(half %x) #0 {677; CHECK-NOFP16-LABEL: llrint_f16:678; CHECK-NOFP16: // %bb.0:679; CHECK-NOFP16-NEXT: fcvt s0, h0680; CHECK-NOFP16-NEXT: frintx s0, s0681; CHECK-NOFP16-NEXT: fcvtzs x0, s0682; CHECK-NOFP16-NEXT: ret683;684; CHECK-FP16-LABEL: llrint_f16:685; CHECK-FP16: // %bb.0:686; CHECK-FP16-NEXT: frintx h0, h0687; CHECK-FP16-NEXT: fcvtzs x0, h0688; CHECK-FP16-NEXT: ret689 %val = call i64 @llvm.experimental.constrained.llrint.i64.f16(half %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #0690 ret i64 %val691}692 693define half @maxnum_f16(half %x, half %y) #0 {694; CHECK-NOFP16-LABEL: maxnum_f16:695; CHECK-NOFP16: // %bb.0:696; CHECK-NOFP16-NEXT: fcvt s1, h1697; CHECK-NOFP16-NEXT: fcvt s0, h0698; CHECK-NOFP16-NEXT: fmaxnm s0, s0, s1699; CHECK-NOFP16-NEXT: fcvt h0, s0700; CHECK-NOFP16-NEXT: ret701;702; CHECK-FP16-LABEL: maxnum_f16:703; CHECK-FP16: // %bb.0:704; CHECK-FP16-NEXT: fmaxnm h0, h0, h1705; CHECK-FP16-NEXT: ret706 %val = call half @llvm.experimental.constrained.maxnum.f16(half %x, half %y, metadata !"fpexcept.strict") #0707 ret half %val708}709 710define half @minnum_f16(half %x, half %y) #0 {711; CHECK-NOFP16-LABEL: minnum_f16:712; CHECK-NOFP16: // %bb.0:713; CHECK-NOFP16-NEXT: fcvt s1, h1714; CHECK-NOFP16-NEXT: fcvt s0, h0715; CHECK-NOFP16-NEXT: fminnm s0, s0, s1716; CHECK-NOFP16-NEXT: fcvt h0, s0717; CHECK-NOFP16-NEXT: ret718;719; CHECK-FP16-LABEL: minnum_f16:720; CHECK-FP16: // %bb.0:721; CHECK-FP16-NEXT: fminnm h0, h0, h1722; CHECK-FP16-NEXT: ret723 %val = call half @llvm.experimental.constrained.minnum.f16(half %x, half %y, metadata !"fpexcept.strict") #0724 ret half %val725}726 727define half @ceil_f16(half %x) #0 {728; CHECK-NOFP16-LABEL: ceil_f16:729; CHECK-NOFP16: // %bb.0:730; CHECK-NOFP16-NEXT: fcvt s0, h0731; CHECK-NOFP16-NEXT: frintp s0, s0732; CHECK-NOFP16-NEXT: fcvt h0, s0733; CHECK-NOFP16-NEXT: ret734;735; CHECK-FP16-LABEL: ceil_f16:736; CHECK-FP16: // %bb.0:737; CHECK-FP16-NEXT: frintp h0, h0738; CHECK-FP16-NEXT: ret739 %val = call half @llvm.experimental.constrained.ceil.f16(half %x, metadata !"fpexcept.strict") #0740 ret half %val741}742 743define half @floor_f16(half %x) #0 {744; CHECK-NOFP16-LABEL: floor_f16:745; CHECK-NOFP16: // %bb.0:746; CHECK-NOFP16-NEXT: fcvt s0, h0747; CHECK-NOFP16-NEXT: frintm s0, s0748; CHECK-NOFP16-NEXT: fcvt h0, s0749; CHECK-NOFP16-NEXT: ret750;751; CHECK-FP16-LABEL: floor_f16:752; CHECK-FP16: // %bb.0:753; CHECK-FP16-NEXT: frintm h0, h0754; CHECK-FP16-NEXT: ret755 %val = call half @llvm.experimental.constrained.floor.f16(half %x, metadata !"fpexcept.strict") #0756 ret half %val757}758 759define i32 @lround_f16(half %x) #0 {760; CHECK-NOFP16-LABEL: lround_f16:761; CHECK-NOFP16: // %bb.0:762; CHECK-NOFP16-NEXT: fcvt s0, h0763; CHECK-NOFP16-NEXT: fcvtas w0, s0764; CHECK-NOFP16-NEXT: ret765;766; CHECK-FP16-LABEL: lround_f16:767; CHECK-FP16: // %bb.0:768; CHECK-FP16-NEXT: fcvtas w0, h0769; CHECK-FP16-NEXT: ret770 %val = call i32 @llvm.experimental.constrained.lround.i32.f16(half %x, metadata !"fpexcept.strict") #0771 ret i32 %val772}773 774define i64 @llround_f16(half %x) #0 {775; CHECK-NOFP16-LABEL: llround_f16:776; CHECK-NOFP16: // %bb.0:777; CHECK-NOFP16-NEXT: fcvt s0, h0778; CHECK-NOFP16-NEXT: fcvtas x0, s0779; CHECK-NOFP16-NEXT: ret780;781; CHECK-FP16-LABEL: llround_f16:782; CHECK-FP16: // %bb.0:783; CHECK-FP16-NEXT: fcvtas x0, h0784; CHECK-FP16-NEXT: ret785 %val = call i64 @llvm.experimental.constrained.llround.i64.f16(half %x, metadata !"fpexcept.strict") #0786 ret i64 %val787}788 789define half @round_f16(half %x) #0 {790; CHECK-NOFP16-LABEL: round_f16:791; CHECK-NOFP16: // %bb.0:792; CHECK-NOFP16-NEXT: fcvt s0, h0793; CHECK-NOFP16-NEXT: frinta s0, s0794; CHECK-NOFP16-NEXT: fcvt h0, s0795; CHECK-NOFP16-NEXT: ret796;797; CHECK-FP16-LABEL: round_f16:798; CHECK-FP16: // %bb.0:799; CHECK-FP16-NEXT: frinta h0, h0800; CHECK-FP16-NEXT: ret801 %val = call half @llvm.experimental.constrained.round.f16(half %x, metadata !"fpexcept.strict") #0802 ret half %val803}804 805define half @roundeven_f16(half %x) #0 {806; CHECK-NOFP16-LABEL: roundeven_f16:807; CHECK-NOFP16: // %bb.0:808; CHECK-NOFP16-NEXT: fcvt s0, h0809; CHECK-NOFP16-NEXT: frintn s0, s0810; CHECK-NOFP16-NEXT: fcvt h0, s0811; CHECK-NOFP16-NEXT: ret812;813; CHECK-FP16-LABEL: roundeven_f16:814; CHECK-FP16: // %bb.0:815; CHECK-FP16-NEXT: frintn h0, h0816; CHECK-FP16-NEXT: ret817 %val = call half @llvm.experimental.constrained.roundeven.f16(half %x, metadata !"fpexcept.strict") #0818 ret half %val819}820 821define half @trunc_f16(half %x) #0 {822; CHECK-NOFP16-LABEL: trunc_f16:823; CHECK-NOFP16: // %bb.0:824; CHECK-NOFP16-NEXT: fcvt s0, h0825; CHECK-NOFP16-NEXT: frintz s0, s0826; CHECK-NOFP16-NEXT: fcvt h0, s0827; CHECK-NOFP16-NEXT: ret828;829; CHECK-FP16-LABEL: trunc_f16:830; CHECK-FP16: // %bb.0:831; CHECK-FP16-NEXT: frintz h0, h0832; CHECK-FP16-NEXT: ret833 %val = call half @llvm.experimental.constrained.trunc.f16(half %x, metadata !"fpexcept.strict") #0834 ret half %val835}836 837define half @ldexp_f16(half %x, i32 %y) #0 {838; CHECK-LABEL: ldexp_f16:839; CHECK: // %bb.0:840; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill841; CHECK-NEXT: .cfi_def_cfa_offset 16842; CHECK-NEXT: .cfi_offset w30, -16843; CHECK-NEXT: fcvt s0, h0844; CHECK-NEXT: bl ldexpf845; CHECK-NEXT: fcvt h0, s0846; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload847; CHECK-NEXT: ret848 %val = call half @llvm.experimental.constrained.ldexp.f16.i32(half %x, i32 %y, metadata !"round.tonearest", metadata !"fpexcept.strict") #0849 ret half %val850}851 852define i32 @fcmp_olt_f16(half %a, half %b) #0 {853; CHECK-NOFP16-LABEL: fcmp_olt_f16:854; CHECK-NOFP16: // %bb.0:855; CHECK-NOFP16-NEXT: fcvt s0, h0856; CHECK-NOFP16-NEXT: fcvt s1, h1857; CHECK-NOFP16-NEXT: fcmp s0, s1858; CHECK-NOFP16-NEXT: cset w0, mi859; CHECK-NOFP16-NEXT: ret860;861; CHECK-FP16-LABEL: fcmp_olt_f16:862; CHECK-FP16: // %bb.0:863; CHECK-FP16-NEXT: fcmp h0, h1864; CHECK-FP16-NEXT: cset w0, mi865; CHECK-FP16-NEXT: ret866 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") #0867 %conv = zext i1 %cmp to i32868 ret i32 %conv869}870 871define i32 @fcmp_ole_f16(half %a, half %b) #0 {872; CHECK-NOFP16-LABEL: fcmp_ole_f16:873; CHECK-NOFP16: // %bb.0:874; CHECK-NOFP16-NEXT: fcvt s0, h0875; CHECK-NOFP16-NEXT: fcvt s1, h1876; CHECK-NOFP16-NEXT: fcmp s0, s1877; CHECK-NOFP16-NEXT: cset w0, ls878; CHECK-NOFP16-NEXT: ret879;880; CHECK-FP16-LABEL: fcmp_ole_f16:881; CHECK-FP16: // %bb.0:882; CHECK-FP16-NEXT: fcmp h0, h1883; CHECK-FP16-NEXT: cset w0, ls884; CHECK-FP16-NEXT: ret885 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") #0886 %conv = zext i1 %cmp to i32887 ret i32 %conv888}889 890define i32 @fcmp_ogt_f16(half %a, half %b) #0 {891; CHECK-NOFP16-LABEL: fcmp_ogt_f16:892; CHECK-NOFP16: // %bb.0:893; CHECK-NOFP16-NEXT: fcvt s0, h0894; CHECK-NOFP16-NEXT: fcvt s1, h1895; CHECK-NOFP16-NEXT: fcmp s0, s1896; CHECK-NOFP16-NEXT: cset w0, gt897; CHECK-NOFP16-NEXT: ret898;899; CHECK-FP16-LABEL: fcmp_ogt_f16:900; CHECK-FP16: // %bb.0:901; CHECK-FP16-NEXT: fcmp h0, h1902; CHECK-FP16-NEXT: cset w0, gt903; CHECK-FP16-NEXT: ret904 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") #0905 %conv = zext i1 %cmp to i32906 ret i32 %conv907}908 909define i32 @fcmp_oge_f16(half %a, half %b) #0 {910; CHECK-NOFP16-LABEL: fcmp_oge_f16:911; CHECK-NOFP16: // %bb.0:912; CHECK-NOFP16-NEXT: fcvt s0, h0913; CHECK-NOFP16-NEXT: fcvt s1, h1914; CHECK-NOFP16-NEXT: fcmp s0, s1915; CHECK-NOFP16-NEXT: cset w0, ge916; CHECK-NOFP16-NEXT: ret917;918; CHECK-FP16-LABEL: fcmp_oge_f16:919; CHECK-FP16: // %bb.0:920; CHECK-FP16-NEXT: fcmp h0, h1921; CHECK-FP16-NEXT: cset w0, ge922; CHECK-FP16-NEXT: ret923 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") #0924 %conv = zext i1 %cmp to i32925 ret i32 %conv926}927 928define i32 @fcmp_oeq_f16(half %a, half %b) #0 {929; CHECK-NOFP16-LABEL: fcmp_oeq_f16:930; CHECK-NOFP16: // %bb.0:931; CHECK-NOFP16-NEXT: fcvt s0, h0932; CHECK-NOFP16-NEXT: fcvt s1, h1933; CHECK-NOFP16-NEXT: fcmp s0, s1934; CHECK-NOFP16-NEXT: cset w0, eq935; CHECK-NOFP16-NEXT: ret936;937; CHECK-FP16-LABEL: fcmp_oeq_f16:938; CHECK-FP16: // %bb.0:939; CHECK-FP16-NEXT: fcmp h0, h1940; CHECK-FP16-NEXT: cset w0, eq941; CHECK-FP16-NEXT: ret942 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") #0943 %conv = zext i1 %cmp to i32944 ret i32 %conv945}946 947define i32 @fcmp_one_f16(half %a, half %b) #0 {948; CHECK-NOFP16-LABEL: fcmp_one_f16:949; CHECK-NOFP16: // %bb.0:950; CHECK-NOFP16-NEXT: fcvt s0, h0951; CHECK-NOFP16-NEXT: fcvt s1, h1952; CHECK-NOFP16-NEXT: fcmp s0, s1953; CHECK-NOFP16-NEXT: cset w8, mi954; CHECK-NOFP16-NEXT: csinc w0, w8, wzr, le955; CHECK-NOFP16-NEXT: ret956;957; CHECK-FP16-LABEL: fcmp_one_f16:958; CHECK-FP16: // %bb.0:959; CHECK-FP16-NEXT: fcmp h0, h1960; CHECK-FP16-NEXT: cset w8, mi961; CHECK-FP16-NEXT: csinc w0, w8, wzr, le962; CHECK-FP16-NEXT: ret963 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") #0964 %conv = zext i1 %cmp to i32965 ret i32 %conv966}967 968define i32 @fcmp_ult_f16(half %a, half %b) #0 {969; CHECK-NOFP16-LABEL: fcmp_ult_f16:970; CHECK-NOFP16: // %bb.0:971; CHECK-NOFP16-NEXT: fcvt s0, h0972; CHECK-NOFP16-NEXT: fcvt s1, h1973; CHECK-NOFP16-NEXT: fcmp s0, s1974; CHECK-NOFP16-NEXT: cset w0, lt975; CHECK-NOFP16-NEXT: ret976;977; CHECK-FP16-LABEL: fcmp_ult_f16:978; CHECK-FP16: // %bb.0:979; CHECK-FP16-NEXT: fcmp h0, h1980; CHECK-FP16-NEXT: cset w0, lt981; CHECK-FP16-NEXT: ret982 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") #0983 %conv = zext i1 %cmp to i32984 ret i32 %conv985}986 987define i32 @fcmp_ule_f16(half %a, half %b) #0 {988; CHECK-NOFP16-LABEL: fcmp_ule_f16:989; CHECK-NOFP16: // %bb.0:990; CHECK-NOFP16-NEXT: fcvt s0, h0991; CHECK-NOFP16-NEXT: fcvt s1, h1992; CHECK-NOFP16-NEXT: fcmp s0, s1993; CHECK-NOFP16-NEXT: cset w0, le994; CHECK-NOFP16-NEXT: ret995;996; CHECK-FP16-LABEL: fcmp_ule_f16:997; CHECK-FP16: // %bb.0:998; CHECK-FP16-NEXT: fcmp h0, h1999; CHECK-FP16-NEXT: cset w0, le1000; CHECK-FP16-NEXT: ret1001 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") #01002 %conv = zext i1 %cmp to i321003 ret i32 %conv1004}1005 1006define i32 @fcmp_ugt_f16(half %a, half %b) #0 {1007; CHECK-NOFP16-LABEL: fcmp_ugt_f16:1008; CHECK-NOFP16: // %bb.0:1009; CHECK-NOFP16-NEXT: fcvt s0, h01010; CHECK-NOFP16-NEXT: fcvt s1, h11011; CHECK-NOFP16-NEXT: fcmp s0, s11012; CHECK-NOFP16-NEXT: cset w0, hi1013; CHECK-NOFP16-NEXT: ret1014;1015; CHECK-FP16-LABEL: fcmp_ugt_f16:1016; CHECK-FP16: // %bb.0:1017; CHECK-FP16-NEXT: fcmp h0, h11018; CHECK-FP16-NEXT: cset w0, hi1019; CHECK-FP16-NEXT: ret1020 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") #01021 %conv = zext i1 %cmp to i321022 ret i32 %conv1023}1024 1025define i32 @fcmp_uge_f16(half %a, half %b) #0 {1026; CHECK-NOFP16-LABEL: fcmp_uge_f16:1027; CHECK-NOFP16: // %bb.0:1028; CHECK-NOFP16-NEXT: fcvt s0, h01029; CHECK-NOFP16-NEXT: fcvt s1, h11030; CHECK-NOFP16-NEXT: fcmp s0, s11031; CHECK-NOFP16-NEXT: cset w0, pl1032; CHECK-NOFP16-NEXT: ret1033;1034; CHECK-FP16-LABEL: fcmp_uge_f16:1035; CHECK-FP16: // %bb.0:1036; CHECK-FP16-NEXT: fcmp h0, h11037; CHECK-FP16-NEXT: cset w0, pl1038; CHECK-FP16-NEXT: ret1039 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") #01040 %conv = zext i1 %cmp to i321041 ret i32 %conv1042}1043 1044define i32 @fcmp_ueq_f16(half %a, half %b) #0 {1045; CHECK-NOFP16-LABEL: fcmp_ueq_f16:1046; CHECK-NOFP16: // %bb.0:1047; CHECK-NOFP16-NEXT: fcvt s0, h01048; CHECK-NOFP16-NEXT: fcvt s1, h11049; CHECK-NOFP16-NEXT: fcmp s0, s11050; CHECK-NOFP16-NEXT: cset w8, eq1051; CHECK-NOFP16-NEXT: csinc w0, w8, wzr, vc1052; CHECK-NOFP16-NEXT: ret1053;1054; CHECK-FP16-LABEL: fcmp_ueq_f16:1055; CHECK-FP16: // %bb.0:1056; CHECK-FP16-NEXT: fcmp h0, h11057; CHECK-FP16-NEXT: cset w8, eq1058; CHECK-FP16-NEXT: csinc w0, w8, wzr, vc1059; CHECK-FP16-NEXT: ret1060 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") #01061 %conv = zext i1 %cmp to i321062 ret i32 %conv1063}1064 1065define i32 @fcmp_une_f16(half %a, half %b) #0 {1066; CHECK-NOFP16-LABEL: fcmp_une_f16:1067; CHECK-NOFP16: // %bb.0:1068; CHECK-NOFP16-NEXT: fcvt s0, h01069; CHECK-NOFP16-NEXT: fcvt s1, h11070; CHECK-NOFP16-NEXT: fcmp s0, s11071; CHECK-NOFP16-NEXT: cset w0, ne1072; CHECK-NOFP16-NEXT: ret1073;1074; CHECK-FP16-LABEL: fcmp_une_f16:1075; CHECK-FP16: // %bb.0:1076; CHECK-FP16-NEXT: fcmp h0, h11077; CHECK-FP16-NEXT: cset w0, ne1078; CHECK-FP16-NEXT: ret1079 %cmp = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") #01080 %conv = zext i1 %cmp to i321081 ret i32 %conv1082}1083 1084define i32 @fcmps_olt_f16(half %a, half %b) #0 {1085; CHECK-NOFP16-LABEL: fcmps_olt_f16:1086; CHECK-NOFP16: // %bb.0:1087; CHECK-NOFP16-NEXT: fcvt s0, h01088; CHECK-NOFP16-NEXT: fcvt s1, h11089; CHECK-NOFP16-NEXT: fcmpe s0, s11090; CHECK-NOFP16-NEXT: cset w0, mi1091; CHECK-NOFP16-NEXT: ret1092;1093; CHECK-FP16-LABEL: fcmps_olt_f16:1094; CHECK-FP16: // %bb.0:1095; CHECK-FP16-NEXT: fcmpe h0, h11096; CHECK-FP16-NEXT: cset w0, mi1097; CHECK-FP16-NEXT: ret1098 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") #01099 %conv = zext i1 %cmp to i321100 ret i32 %conv1101}1102 1103define i32 @fcmps_ole_f16(half %a, half %b) #0 {1104; CHECK-NOFP16-LABEL: fcmps_ole_f16:1105; CHECK-NOFP16: // %bb.0:1106; CHECK-NOFP16-NEXT: fcvt s0, h01107; CHECK-NOFP16-NEXT: fcvt s1, h11108; CHECK-NOFP16-NEXT: fcmpe s0, s11109; CHECK-NOFP16-NEXT: cset w0, ls1110; CHECK-NOFP16-NEXT: ret1111;1112; CHECK-FP16-LABEL: fcmps_ole_f16:1113; CHECK-FP16: // %bb.0:1114; CHECK-FP16-NEXT: fcmpe h0, h11115; CHECK-FP16-NEXT: cset w0, ls1116; CHECK-FP16-NEXT: ret1117 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") #01118 %conv = zext i1 %cmp to i321119 ret i32 %conv1120}1121 1122define i32 @fcmps_ogt_f16(half %a, half %b) #0 {1123; CHECK-NOFP16-LABEL: fcmps_ogt_f16:1124; CHECK-NOFP16: // %bb.0:1125; CHECK-NOFP16-NEXT: fcvt s0, h01126; CHECK-NOFP16-NEXT: fcvt s1, h11127; CHECK-NOFP16-NEXT: fcmpe s0, s11128; CHECK-NOFP16-NEXT: cset w0, gt1129; CHECK-NOFP16-NEXT: ret1130;1131; CHECK-FP16-LABEL: fcmps_ogt_f16:1132; CHECK-FP16: // %bb.0:1133; CHECK-FP16-NEXT: fcmpe h0, h11134; CHECK-FP16-NEXT: cset w0, gt1135; CHECK-FP16-NEXT: ret1136 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") #01137 %conv = zext i1 %cmp to i321138 ret i32 %conv1139}1140 1141define i32 @fcmps_oge_f16(half %a, half %b) #0 {1142; CHECK-NOFP16-LABEL: fcmps_oge_f16:1143; CHECK-NOFP16: // %bb.0:1144; CHECK-NOFP16-NEXT: fcvt s0, h01145; CHECK-NOFP16-NEXT: fcvt s1, h11146; CHECK-NOFP16-NEXT: fcmpe s0, s11147; CHECK-NOFP16-NEXT: cset w0, ge1148; CHECK-NOFP16-NEXT: ret1149;1150; CHECK-FP16-LABEL: fcmps_oge_f16:1151; CHECK-FP16: // %bb.0:1152; CHECK-FP16-NEXT: fcmpe h0, h11153; CHECK-FP16-NEXT: cset w0, ge1154; CHECK-FP16-NEXT: ret1155 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") #01156 %conv = zext i1 %cmp to i321157 ret i32 %conv1158}1159 1160define i32 @fcmps_oeq_f16(half %a, half %b) #0 {1161; CHECK-NOFP16-LABEL: fcmps_oeq_f16:1162; CHECK-NOFP16: // %bb.0:1163; CHECK-NOFP16-NEXT: fcvt s0, h01164; CHECK-NOFP16-NEXT: fcvt s1, h11165; CHECK-NOFP16-NEXT: fcmpe s0, s11166; CHECK-NOFP16-NEXT: cset w0, eq1167; CHECK-NOFP16-NEXT: ret1168;1169; CHECK-FP16-LABEL: fcmps_oeq_f16:1170; CHECK-FP16: // %bb.0:1171; CHECK-FP16-NEXT: fcmpe h0, h11172; CHECK-FP16-NEXT: cset w0, eq1173; CHECK-FP16-NEXT: ret1174 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") #01175 %conv = zext i1 %cmp to i321176 ret i32 %conv1177}1178 1179define i32 @fcmps_one_f16(half %a, half %b) #0 {1180; CHECK-NOFP16-LABEL: fcmps_one_f16:1181; CHECK-NOFP16: // %bb.0:1182; CHECK-NOFP16-NEXT: fcvt s0, h01183; CHECK-NOFP16-NEXT: fcvt s1, h11184; CHECK-NOFP16-NEXT: fcmpe s0, s11185; CHECK-NOFP16-NEXT: cset w8, mi1186; CHECK-NOFP16-NEXT: csinc w0, w8, wzr, le1187; CHECK-NOFP16-NEXT: ret1188;1189; CHECK-FP16-LABEL: fcmps_one_f16:1190; CHECK-FP16: // %bb.0:1191; CHECK-FP16-NEXT: fcmpe h0, h11192; CHECK-FP16-NEXT: cset w8, mi1193; CHECK-FP16-NEXT: csinc w0, w8, wzr, le1194; CHECK-FP16-NEXT: ret1195 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") #01196 %conv = zext i1 %cmp to i321197 ret i32 %conv1198}1199 1200define i32 @fcmps_ult_f16(half %a, half %b) #0 {1201; CHECK-NOFP16-LABEL: fcmps_ult_f16:1202; CHECK-NOFP16: // %bb.0:1203; CHECK-NOFP16-NEXT: fcvt s0, h01204; CHECK-NOFP16-NEXT: fcvt s1, h11205; CHECK-NOFP16-NEXT: fcmpe s0, s11206; CHECK-NOFP16-NEXT: cset w0, lt1207; CHECK-NOFP16-NEXT: ret1208;1209; CHECK-FP16-LABEL: fcmps_ult_f16:1210; CHECK-FP16: // %bb.0:1211; CHECK-FP16-NEXT: fcmpe h0, h11212; CHECK-FP16-NEXT: cset w0, lt1213; CHECK-FP16-NEXT: ret1214 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") #01215 %conv = zext i1 %cmp to i321216 ret i32 %conv1217}1218 1219define i32 @fcmps_ule_f16(half %a, half %b) #0 {1220; CHECK-NOFP16-LABEL: fcmps_ule_f16:1221; CHECK-NOFP16: // %bb.0:1222; CHECK-NOFP16-NEXT: fcvt s0, h01223; CHECK-NOFP16-NEXT: fcvt s1, h11224; CHECK-NOFP16-NEXT: fcmpe s0, s11225; CHECK-NOFP16-NEXT: cset w0, le1226; CHECK-NOFP16-NEXT: ret1227;1228; CHECK-FP16-LABEL: fcmps_ule_f16:1229; CHECK-FP16: // %bb.0:1230; CHECK-FP16-NEXT: fcmpe h0, h11231; CHECK-FP16-NEXT: cset w0, le1232; CHECK-FP16-NEXT: ret1233 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") #01234 %conv = zext i1 %cmp to i321235 ret i32 %conv1236}1237 1238define i32 @fcmps_ugt_f16(half %a, half %b) #0 {1239; CHECK-NOFP16-LABEL: fcmps_ugt_f16:1240; CHECK-NOFP16: // %bb.0:1241; CHECK-NOFP16-NEXT: fcvt s0, h01242; CHECK-NOFP16-NEXT: fcvt s1, h11243; CHECK-NOFP16-NEXT: fcmpe s0, s11244; CHECK-NOFP16-NEXT: cset w0, hi1245; CHECK-NOFP16-NEXT: ret1246;1247; CHECK-FP16-LABEL: fcmps_ugt_f16:1248; CHECK-FP16: // %bb.0:1249; CHECK-FP16-NEXT: fcmpe h0, h11250; CHECK-FP16-NEXT: cset w0, hi1251; CHECK-FP16-NEXT: ret1252 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") #01253 %conv = zext i1 %cmp to i321254 ret i32 %conv1255}1256 1257define i32 @fcmps_uge_f16(half %a, half %b) #0 {1258; CHECK-NOFP16-LABEL: fcmps_uge_f16:1259; CHECK-NOFP16: // %bb.0:1260; CHECK-NOFP16-NEXT: fcvt s0, h01261; CHECK-NOFP16-NEXT: fcvt s1, h11262; CHECK-NOFP16-NEXT: fcmpe s0, s11263; CHECK-NOFP16-NEXT: cset w0, pl1264; CHECK-NOFP16-NEXT: ret1265;1266; CHECK-FP16-LABEL: fcmps_uge_f16:1267; CHECK-FP16: // %bb.0:1268; CHECK-FP16-NEXT: fcmpe h0, h11269; CHECK-FP16-NEXT: cset w0, pl1270; CHECK-FP16-NEXT: ret1271 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") #01272 %conv = zext i1 %cmp to i321273 ret i32 %conv1274}1275 1276define i32 @fcmps_ueq_f16(half %a, half %b) #0 {1277; CHECK-NOFP16-LABEL: fcmps_ueq_f16:1278; CHECK-NOFP16: // %bb.0:1279; CHECK-NOFP16-NEXT: fcvt s0, h01280; CHECK-NOFP16-NEXT: fcvt s1, h11281; CHECK-NOFP16-NEXT: fcmpe s0, s11282; CHECK-NOFP16-NEXT: cset w8, eq1283; CHECK-NOFP16-NEXT: csinc w0, w8, wzr, vc1284; CHECK-NOFP16-NEXT: ret1285;1286; CHECK-FP16-LABEL: fcmps_ueq_f16:1287; CHECK-FP16: // %bb.0:1288; CHECK-FP16-NEXT: fcmpe h0, h11289; CHECK-FP16-NEXT: cset w8, eq1290; CHECK-FP16-NEXT: csinc w0, w8, wzr, vc1291; CHECK-FP16-NEXT: ret1292 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") #01293 %conv = zext i1 %cmp to i321294 ret i32 %conv1295}1296 1297define i32 @fcmps_une_f16(half %a, half %b) #0 {1298; CHECK-NOFP16-LABEL: fcmps_une_f16:1299; CHECK-NOFP16: // %bb.0:1300; CHECK-NOFP16-NEXT: fcvt s0, h01301; CHECK-NOFP16-NEXT: fcvt s1, h11302; CHECK-NOFP16-NEXT: fcmpe s0, s11303; CHECK-NOFP16-NEXT: cset w0, ne1304; CHECK-NOFP16-NEXT: ret1305;1306; CHECK-FP16-LABEL: fcmps_une_f16:1307; CHECK-FP16: // %bb.0:1308; CHECK-FP16-NEXT: fcmpe h0, h11309; CHECK-FP16-NEXT: cset w0, ne1310; CHECK-FP16-NEXT: ret1311 %cmp = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") #01312 %conv = zext i1 %cmp to i321313 ret i32 %conv1314}1315 1316 1317; Intrinsics to convert between floating-point types1318 1319define half @fptrunc_f16_f32(float %x) #0 {1320; CHECK-LABEL: fptrunc_f16_f32:1321; CHECK: // %bb.0:1322; CHECK-NEXT: fcvt h0, s01323; CHECK-NEXT: ret1324 %val = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict") #01325 ret half %val1326}1327 1328define float @fpext_f32_f16(half %x) #0 {1329; CHECK-LABEL: fpext_f32_f16:1330; CHECK: // %bb.0:1331; CHECK-NEXT: fcvt s0, h01332; CHECK-NEXT: ret1333 %val = call float @llvm.experimental.constrained.fpext.f32.f16(half %x, metadata !"fpexcept.strict") #01334 ret float %val1335}1336 1337 1338attributes #0 = { strictfp }1339 1340declare half @llvm.experimental.constrained.fadd.f16(half, half, metadata, metadata)1341declare half @llvm.experimental.constrained.fsub.f16(half, half, metadata, metadata)1342declare half @llvm.experimental.constrained.fmul.f16(half, half, metadata, metadata)1343declare half @llvm.experimental.constrained.fdiv.f16(half, half, metadata, metadata)1344declare half @llvm.experimental.constrained.frem.f16(half, half, metadata, metadata)1345declare half @llvm.experimental.constrained.fma.f16(half, half, half, metadata, metadata)1346declare i32 @llvm.experimental.constrained.fptosi.i32.f16(half, metadata)1347declare i32 @llvm.experimental.constrained.fptoui.i32.f16(half, metadata)1348declare i64 @llvm.experimental.constrained.fptosi.i64.f16(half, metadata)1349declare i64 @llvm.experimental.constrained.fptoui.i64.f16(half, metadata)1350declare half @llvm.experimental.constrained.sitofp.f16.i32(i32, metadata, metadata)1351declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata)1352declare half @llvm.experimental.constrained.sitofp.f16.i64(i64, metadata, metadata)1353declare half @llvm.experimental.constrained.uitofp.f16.i64(i64, metadata, metadata)1354declare half @llvm.experimental.constrained.sitofp.f16.i128(i128, metadata, metadata)1355declare half @llvm.experimental.constrained.uitofp.f16.i128(i128, metadata, metadata)1356declare half @llvm.experimental.constrained.sqrt.f16(half, metadata, metadata)1357declare half @llvm.experimental.constrained.powi.f16(half, i32, metadata, metadata)1358declare half @llvm.experimental.constrained.sin.f16(half, metadata, metadata)1359declare half @llvm.experimental.constrained.cos.f16(half, metadata, metadata)1360declare half @llvm.experimental.constrained.tan.f16(half, metadata, metadata)1361declare half @llvm.experimental.constrained.pow.f16(half, half, metadata, metadata)1362declare half @llvm.experimental.constrained.log.f16(half, metadata, metadata)1363declare half @llvm.experimental.constrained.log10.f16(half, metadata, metadata)1364declare half @llvm.experimental.constrained.log2.f16(half, metadata, metadata)1365declare half @llvm.experimental.constrained.exp.f16(half, metadata, metadata)1366declare half @llvm.experimental.constrained.exp2.f16(half, metadata, metadata)1367declare half @llvm.experimental.constrained.rint.f16(half, metadata, metadata)1368declare half @llvm.experimental.constrained.nearbyint.f16(half, metadata, metadata)1369declare i32 @llvm.experimental.constrained.lrint.i32.f16(half, metadata, metadata)1370declare i64 @llvm.experimental.constrained.llrint.i64.f16(half, metadata, metadata)1371declare half @llvm.experimental.constrained.maxnum.f16(half, half, metadata)1372declare half @llvm.experimental.constrained.minnum.f16(half, half, metadata)1373declare half @llvm.experimental.constrained.ceil.f16(half, metadata)1374declare half @llvm.experimental.constrained.floor.f16(half, metadata)1375declare i32 @llvm.experimental.constrained.lround.i32.f16(half, metadata)1376declare i64 @llvm.experimental.constrained.llround.i64.f16(half, metadata)1377declare half @llvm.experimental.constrained.round.f16(half, metadata)1378declare half @llvm.experimental.constrained.roundeven.f16(half, metadata)1379declare half @llvm.experimental.constrained.trunc.f16(half, metadata)1380declare i1 @llvm.experimental.constrained.fcmps.f16(half, half, metadata, metadata)1381declare i1 @llvm.experimental.constrained.fcmp.f16(half, half, metadata, metadata)1382 1383declare half @llvm.experimental.constrained.fptrunc.f16.f32(float, metadata, metadata)1384declare float @llvm.experimental.constrained.fpext.f32.f16(half, metadata)1385