10ee04a1eSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 20ee04a1eSMatt Arsenault; RUN: llc -mtriple=arm-- -mattr=+fullfp16 < %s | FileCheck %s 30ee04a1eSMatt Arsenault 40ee04a1eSMatt Arsenaultdefine float @select_fneg_a_or_8_cmp_olt_a_neg8_f32(float %a, float %b) #0 { 50ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_olt_a_neg8_f32: 60ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 70ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-8.000000e+00 80ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 93b80d029SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s2, s0 100ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 113b80d029SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 120ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 130ee04a1eSMatt Arsenault %fneg.a = fneg nnan nsz float %a 140ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %a, -8.0 150ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %fneg.a, float 8.0 160ee04a1eSMatt Arsenault ret float %min.a 170ee04a1eSMatt Arsenault} 180ee04a1eSMatt Arsenault 190ee04a1eSMatt Arsenaultdefine half @select_fneg_a_or_8_cmp_olt_a_neg8_f16(half %a, half %b) #0 { 200ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_olt_a_neg8_f16: 210ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 220ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f16 s0, #-8.000000e+00 233b80d029SMatt Arsenault; CHECK-NEXT: vmov.f16 s2, r0 243b80d029SMatt Arsenault; CHECK-NEXT: vminnm.f16 s0, s2, s0 253b80d029SMatt Arsenault; CHECK-NEXT: vneg.f16 s0, s0 260ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 270ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 280ee04a1eSMatt Arsenault %fneg.a = fneg nnan nsz half %a 290ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt half %a, -8.0 300ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, half %fneg.a, half 8.0 310ee04a1eSMatt Arsenault ret half %min.a 320ee04a1eSMatt Arsenault} 330ee04a1eSMatt Arsenault 340ee04a1eSMatt Arsenaultdefine float @select_fneg_a_or_8_cmp_ogt_a_neg8_f32(float %a, float %b) #0 { 350ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_ogt_a_neg8_f32: 360ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 370ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-8.000000e+00 380ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 393b80d029SMatt Arsenault; CHECK-NEXT: vmaxnm.f32 s0, s2, s0 400ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 413b80d029SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 420ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 430ee04a1eSMatt Arsenault %fneg.a = fneg nnan nsz float %a 440ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz ogt float %a, -8.0 450ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %fneg.a, float 8.0 460ee04a1eSMatt Arsenault ret float %min.a 470ee04a1eSMatt Arsenault} 480ee04a1eSMatt Arsenault 490ee04a1eSMatt Arsenaultdefine half @select_fneg_a_or_8_cmp_ogt_a_neg8_f16(half %a, half %b) #0 { 500ee04a1eSMatt Arsenault; CHECK-LABEL: select_fneg_a_or_8_cmp_ogt_a_neg8_f16: 510ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 520ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f16 s0, #-8.000000e+00 533b80d029SMatt Arsenault; CHECK-NEXT: vmov.f16 s2, r0 543b80d029SMatt Arsenault; CHECK-NEXT: vmaxnm.f16 s0, s2, s0 553b80d029SMatt Arsenault; CHECK-NEXT: vneg.f16 s0, s0 560ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 570ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 580ee04a1eSMatt Arsenault %fneg.a = fneg nnan nsz half %a 590ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz ogt half %a, -8.0 600ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, half %fneg.a, half 8.0 610ee04a1eSMatt Arsenault ret half %min.a 620ee04a1eSMatt Arsenault} 630ee04a1eSMatt Arsenault 640ee04a1eSMatt Arsenaultdefine float @select_fsub0_or_8_cmp_olt_fsub1_neg8_f32(float %a, float %b) #0 { 650ee04a1eSMatt Arsenault; CHECK-LABEL: select_fsub0_or_8_cmp_olt_fsub1_neg8_f32: 660ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 670ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #4.000000e+00 680ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 690ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #-8.000000e+00 70*65420c80SMatt Arsenault; CHECK-NEXT: vsub.f32 s0, s0, s2 71*65420c80SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s0, s4 720ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 73*65420c80SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 740ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 750ee04a1eSMatt Arsenault %sub.0 = fsub nnan nsz float 4.0, %a 760ee04a1eSMatt Arsenault %sub.1 = fsub nnan nsz float %a, 4.0 770ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %sub.0, -8.0 780ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %sub.1, float 8.0 790ee04a1eSMatt Arsenault ret float %min.a 800ee04a1eSMatt Arsenault} 810ee04a1eSMatt Arsenault 820ee04a1eSMatt Arsenaultdefine float @select_fsub0_or_neg8_cmp_olt_fsub1_8_f32(float %a, float %b) #0 { 830ee04a1eSMatt Arsenault; CHECK-LABEL: select_fsub0_or_neg8_cmp_olt_fsub1_8_f32: 840ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 850ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #4.000000e+00 860ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 870ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #8.000000e+00 88*65420c80SMatt Arsenault; CHECK-NEXT: vsub.f32 s0, s0, s2 89*65420c80SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s0, s4 900ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 91*65420c80SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 920ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 930ee04a1eSMatt Arsenault %sub.0 = fsub nnan nsz float 4.0, %a 940ee04a1eSMatt Arsenault %sub.1 = fsub nnan nsz float %a, 4.0 950ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %sub.0, 8.0 960ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %sub.1, float -8.0 970ee04a1eSMatt Arsenault ret float %min.a 980ee04a1eSMatt Arsenault} 990ee04a1eSMatt Arsenault 1000ee04a1eSMatt Arsenaultdefine float @select_mul4_or_neg8_cmp_olt_mulneg4_8_f32(float %a, float %b) #0 { 1010ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_neg8_cmp_olt_mulneg4_8_f32: 1020ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 1030ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-4.000000e+00 1040ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 105*65420c80SMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #8.000000e+00 1060ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s0, s2, s0 107*65420c80SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s0, s4 1080ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 109*65420c80SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 1100ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 1110ee04a1eSMatt Arsenault %mul.0 = fmul nnan nsz float %a, 4.0 1120ee04a1eSMatt Arsenault %mul.1 = fmul nnan nsz float %a, -4.0 1130ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0 1140ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0 1150ee04a1eSMatt Arsenault ret float %min.a 1160ee04a1eSMatt Arsenault} 1170ee04a1eSMatt Arsenault 1180ee04a1eSMatt Arsenaultdefine float @select_mul4_or_8_cmp_olt_mulneg4_neg8_f32(float %a, float %b) #0 { 1190ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_8_cmp_olt_mulneg4_neg8_f32: 1200ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 1210ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-4.000000e+00 1220ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 123*65420c80SMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #-8.000000e+00 1240ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s0, s2, s0 125*65420c80SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s0, s4 1260ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 127*65420c80SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 1280ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 1290ee04a1eSMatt Arsenault %mul.0 = fmul nnan nsz float %a, 4.0 1300ee04a1eSMatt Arsenault %mul.1 = fmul nnan nsz float %a, -4.0 1310ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %mul.1, -8.0 1320ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float 8.0 1330ee04a1eSMatt Arsenault ret float %min.a 1340ee04a1eSMatt Arsenault} 1350ee04a1eSMatt Arsenault 1360ee04a1eSMatt Arsenaultdefine float @select_mul4_or_8_cmp_olt_mulneg4_8_f32(float %a, float %b) #0 { 1370ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_8_cmp_olt_mulneg4_8_f32: 1380ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 1390ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-4.000000e+00 1400ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 1410ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s6, #8.000000e+00 1420ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #4.000000e+00 1430ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s0, s2, s0 1440ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s2, s2, s4 1450ee04a1eSMatt Arsenault; CHECK-NEXT: vcmp.f32 s6, s0 1460ee04a1eSMatt Arsenault; CHECK-NEXT: vmrs APSR_nzcv, fpscr 1470ee04a1eSMatt Arsenault; CHECK-NEXT: vselgt.f32 s0, s2, s6 1480ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 1490ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 1500ee04a1eSMatt Arsenault %mul.0 = fmul nnan nsz float %a, 4.0 1510ee04a1eSMatt Arsenault %mul.1 = fmul nnan nsz float %a, -4.0 1520ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0 1530ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float 8.0 1540ee04a1eSMatt Arsenault ret float %min.a 1550ee04a1eSMatt Arsenault} 1560ee04a1eSMatt Arsenault 1570ee04a1eSMatt Arsenaultdefine float @select_mul4_or_neg8_cmp_olt_mulneg4_neg8_f32(float %a, float %b) #0 { 1580ee04a1eSMatt Arsenault; CHECK-LABEL: select_mul4_or_neg8_cmp_olt_mulneg4_neg8_f32: 1590ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 1600ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #-4.000000e+00 1610ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 1620ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s6, #-8.000000e+00 1630ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #4.000000e+00 1640ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s0, s2, s0 1650ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s2, s2, s4 1660ee04a1eSMatt Arsenault; CHECK-NEXT: vcmp.f32 s6, s0 1670ee04a1eSMatt Arsenault; CHECK-NEXT: vmrs APSR_nzcv, fpscr 1680ee04a1eSMatt Arsenault; CHECK-NEXT: vselgt.f32 s0, s2, s6 1690ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 1700ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 1710ee04a1eSMatt Arsenault %mul.0 = fmul nnan nsz float %a, 4.0 1720ee04a1eSMatt Arsenault %mul.1 = fmul nnan nsz float %a, -4.0 1730ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %mul.1, -8.0 1740ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0 1750ee04a1eSMatt Arsenault ret float %min.a 1760ee04a1eSMatt Arsenault} 1770ee04a1eSMatt Arsenault 1780ee04a1eSMatt Arsenaultdefine float @select_mulneg4_or_neg8_cmp_olt_mul4_8_f32(float %a, float %b) #0 { 1790ee04a1eSMatt Arsenault; CHECK-LABEL: select_mulneg4_or_neg8_cmp_olt_mul4_8_f32: 1800ee04a1eSMatt Arsenault; CHECK: @ %bb.0: 1810ee04a1eSMatt Arsenault; CHECK-NEXT: vmov.f32 s0, #4.000000e+00 1820ee04a1eSMatt Arsenault; CHECK-NEXT: vmov s2, r0 183*65420c80SMatt Arsenault; CHECK-NEXT: vmov.f32 s4, #8.000000e+00 1840ee04a1eSMatt Arsenault; CHECK-NEXT: vmul.f32 s0, s2, s0 185*65420c80SMatt Arsenault; CHECK-NEXT: vminnm.f32 s0, s0, s4 1860ee04a1eSMatt Arsenault; CHECK-NEXT: vmov r0, s0 187*65420c80SMatt Arsenault; CHECK-NEXT: eor r0, r0, #-2147483648 1880ee04a1eSMatt Arsenault; CHECK-NEXT: mov pc, lr 1890ee04a1eSMatt Arsenault %mul.0 = fmul nnan nsz float %a, -4.0 1900ee04a1eSMatt Arsenault %mul.1 = fmul nnan nsz float %a, 4.0 1910ee04a1eSMatt Arsenault %cmp.a = fcmp nnan nsz olt float %mul.1, 8.0 1920ee04a1eSMatt Arsenault %min.a = select nnan nsz i1 %cmp.a, float %mul.0, float -8.0 1930ee04a1eSMatt Arsenault ret float %min.a 1940ee04a1eSMatt Arsenault} 1950ee04a1eSMatt Arsenault 1960ee04a1eSMatt Arsenault; FIXME: Should be unnecessary 1970ee04a1eSMatt Arsenaultattributes #0 = { "no-signed-zeros-fp-math"="true" } 198