1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -fp-contract=fast | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s -check-prefix=CHECK-NOFAST 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) 5*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd(float %a, float %b, float %c) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd: 9*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmadd: 10*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.fma.f32(float %a, float %b, float %c) 11*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 12*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 13*9880d681SAndroid Build Coastguard Worker ret float %val 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub(float %a, float %b, float %c) { 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub: 18*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmsub: 19*9880d681SAndroid Build Coastguard Worker %nega = fsub float -0.0, %a 20*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.fma.f32(float %nega, float %b, float %c) 21*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 23*9880d681SAndroid Build Coastguard Worker ret float %val 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmadd(float %a, float %b, float %c) { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmadd: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmadd: 29*9880d681SAndroid Build Coastguard Worker %nega = fsub float -0.0, %a 30*9880d681SAndroid Build Coastguard Worker %negc = fsub float -0.0, %c 31*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.fma.f32(float %nega, float %b, float %negc) 32*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 33*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 34*9880d681SAndroid Build Coastguard Worker ret float %val 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmsub(float %a, float %b, float %c) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmsub: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmsub: 40*9880d681SAndroid Build Coastguard Worker %negc = fsub float -0.0, %c 41*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.fma.f32(float %a, float %b, float %negc) 42*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 43*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 44*9880d681SAndroid Build Coastguard Worker ret float %val 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine double @testd_fmadd(double %a, double %b, double %c) { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fmadd: 49*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fmadd: 50*9880d681SAndroid Build Coastguard Worker %val = call double @llvm.fma.f64(double %a, double %b, double %c) 51*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 52*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 53*9880d681SAndroid Build Coastguard Worker ret double %val 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine double @testd_fmsub(double %a, double %b, double %c) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fmsub: 58*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fmsub: 59*9880d681SAndroid Build Coastguard Worker %nega = fsub double -0.0, %a 60*9880d681SAndroid Build Coastguard Worker %val = call double @llvm.fma.f64(double %nega, double %b, double %c) 61*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 62*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 63*9880d681SAndroid Build Coastguard Worker ret double %val 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine double @testd_fnmadd(double %a, double %b, double %c) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fnmadd: 68*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fnmadd: 69*9880d681SAndroid Build Coastguard Worker %nega = fsub double -0.0, %a 70*9880d681SAndroid Build Coastguard Worker %negc = fsub double -0.0, %c 71*9880d681SAndroid Build Coastguard Worker %val = call double @llvm.fma.f64(double %nega, double %b, double %negc) 72*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 73*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 74*9880d681SAndroid Build Coastguard Worker ret double %val 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine double @testd_fnmsub(double %a, double %b, double %c) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testd_fnmsub: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: testd_fnmsub: 80*9880d681SAndroid Build Coastguard Worker %negc = fsub double -0.0, %c 81*9880d681SAndroid Build Coastguard Worker %val = call double @llvm.fma.f64(double %a, double %b, double %negc) 82*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fnmsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 84*9880d681SAndroid Build Coastguard Worker ret double %val 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd_unfused(float %a, float %b, float %c) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd_unfused: 89*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmadd_unfused: 90*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 91*9880d681SAndroid Build Coastguard Worker %sum = fadd float %a, %prod 92*9880d681SAndroid Build Coastguard Worker; CHECK: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 93*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 94*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 95*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 96*9880d681SAndroid Build Coastguard Worker ret float %sum 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub_unfused(float %a, float %b, float %c) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub_unfused: 101*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fmsub_unfused: 102*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 103*9880d681SAndroid Build Coastguard Worker %diff = fsub float %a, %prod 104*9880d681SAndroid Build Coastguard Worker; CHECK: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 105*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 106*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 107*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 108*9880d681SAndroid Build Coastguard Worker ret float %diff 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmadd_unfused(float %a, float %b, float %c) { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmadd_unfused: 113*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmadd_unfused: 114*9880d681SAndroid Build Coastguard Worker %nega = fsub float -0.0, %a 115*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 116*9880d681SAndroid Build Coastguard Worker %diff = fsub float %nega, %prod 117*9880d681SAndroid Build Coastguard Worker; CHECK: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 118*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fnmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 119*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 120*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 121*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: ret 122*9880d681SAndroid Build Coastguard Worker ret float %diff 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine float @test_fnmsub_unfused(float %a, float %b, float %c) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fnmsub_unfused: 127*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-LABEL: test_fnmsub_unfused: 128*9880d681SAndroid Build Coastguard Worker %nega = fsub float -0.0, %a 129*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 130*9880d681SAndroid Build Coastguard Worker %sum = fadd float %nega, %prod 131*9880d681SAndroid Build Coastguard Worker; CHECK: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 132*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST-NOT: fnmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 133*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 134*9880d681SAndroid Build Coastguard Worker; CHECK-NOFAST: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 135*9880d681SAndroid Build Coastguard Worker ret float %sum 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; Another set of tests that check for multiply single use 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine float @test_fmadd_unfused_su(float %a, float %b, float %c) { 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmadd_unfused_su: 142*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 143*9880d681SAndroid Build Coastguard Worker %sum = fadd float %a, %prod 144*9880d681SAndroid Build Coastguard Worker %res = fadd float %sum, %prod 145*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 146*9880d681SAndroid Build Coastguard Worker; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 147*9880d681SAndroid Build Coastguard Worker; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 148*9880d681SAndroid Build Coastguard Worker; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 149*9880d681SAndroid Build Coastguard Worker ret float %res 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine float @test_fmsub_unfused_su(float %a, float %b, float %c) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fmsub_unfused_su: 154*9880d681SAndroid Build Coastguard Worker %prod = fmul float %b, %c 155*9880d681SAndroid Build Coastguard Worker %diff = fsub float %a, %prod 156*9880d681SAndroid Build Coastguard Worker %res = fsub float %diff, %prod 157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 158*9880d681SAndroid Build Coastguard Worker; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 159*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 160*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 161*9880d681SAndroid Build Coastguard Worker ret float %res 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164