1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+vfp2 %s -o - | FileCheck %s -check-prefix=VFP2 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s -check-prefix=NEON 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s -check-prefix=A8 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a9 %s -o - | FileCheck %s -check-prefix=A9 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=cortex-a9 -float-abi=hard %s -o - | FileCheck %s -check-prefix=HARD 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine float @t1(float %acc, float %a, float %b) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t1: 10*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f32 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t1: 13*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f32 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t1: 16*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 17*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 18*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 19*9880d681SAndroid Build Coastguard Worker %1 = fadd float %acc, %0 20*9880d681SAndroid Build Coastguard Worker ret float %1 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine double @t2(double %acc, double %a, double %b) { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t2: 26*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f64 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t2: 29*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f64 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t2: 32*9880d681SAndroid Build Coastguard Worker; A8: vmul.f64 33*9880d681SAndroid Build Coastguard Worker; A8: vadd.f64 34*9880d681SAndroid Build Coastguard Worker %0 = fmul double %a, %b 35*9880d681SAndroid Build Coastguard Worker %1 = fadd double %acc, %0 36*9880d681SAndroid Build Coastguard Worker ret double %1 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine float @t3(float %acc, float %a, float %b) { 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker; VFP2-LABEL: t3: 42*9880d681SAndroid Build Coastguard Worker; VFP2: vmla.f32 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; NEON-LABEL: t3: 45*9880d681SAndroid Build Coastguard Worker; NEON: vmla.f32 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t3: 48*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 49*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 50*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 51*9880d681SAndroid Build Coastguard Worker %1 = fadd float %0, %acc 52*9880d681SAndroid Build Coastguard Worker ret float %1 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; It's possible to make use of fp vmla / vmls on Cortex-A9. 56*9880d681SAndroid Build Coastguard Worker; rdar://8659675 57*9880d681SAndroid Build Coastguard Workerdefine void @t4(float %acc1, float %a, float %b, float %acc2, float %c, float* %P1, float* %P2) { 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t4: 60*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 61*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 62*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 63*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Two vmla with now RAW hazard 66*9880d681SAndroid Build Coastguard Worker; A9-LABEL: t4: 67*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32 68*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; HARD-LABEL: t4: 71*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s0, s1, s2 72*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s3, s1, s4 73*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 74*9880d681SAndroid Build Coastguard Worker %1 = fadd float %acc1, %0 75*9880d681SAndroid Build Coastguard Worker %2 = fmul float %a, %c 76*9880d681SAndroid Build Coastguard Worker %3 = fadd float %acc2, %2 77*9880d681SAndroid Build Coastguard Worker store float %1, float* %P1 78*9880d681SAndroid Build Coastguard Worker store float %3, float* %P2 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine float @t5(float %a, float %b, float %c, float %d, float %e) { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker; A8-LABEL: t5: 85*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 86*9880d681SAndroid Build Coastguard Worker; A8: vmul.f32 87*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 88*9880d681SAndroid Build Coastguard Worker; A8: vadd.f32 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; A9-LABEL: t5: 91*9880d681SAndroid Build Coastguard Worker; A9: vmla.f32 92*9880d681SAndroid Build Coastguard Worker; A9: vmul.f32 93*9880d681SAndroid Build Coastguard Worker; A9: vadd.f32 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; HARD-LABEL: t5: 96*9880d681SAndroid Build Coastguard Worker; HARD: vmla.f32 s4, s0, s1 97*9880d681SAndroid Build Coastguard Worker; HARD: vmul.f32 s0, s2, s3 98*9880d681SAndroid Build Coastguard Worker; HARD: vadd.f32 s0, s4, s0 99*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 100*9880d681SAndroid Build Coastguard Worker %1 = fadd float %e, %0 101*9880d681SAndroid Build Coastguard Worker %2 = fmul float %c, %d 102*9880d681SAndroid Build Coastguard Worker %3 = fadd float %1, %2 103*9880d681SAndroid Build Coastguard Worker ret float %3 104*9880d681SAndroid Build Coastguard Worker} 105