125 lines · plain
1; RUN: llc -mtriple=arm-eabi -mattr=+vfp2 %s -o - | FileCheck %s -check-prefix=VFP22; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s -check-prefix=NEON3; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s -check-prefix=A84; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a9 %s -o - | FileCheck %s -check-prefix=A95; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=cortex-a9 -float-abi=hard %s -o - | FileCheck %s -check-prefix=HARD6; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=cortex-m4 -float-abi=hard %s -o - | FileCheck %s -check-prefix=VMLA7; RUN: llc -mtriple=arm-linux-gnueabi -mcpu=cortex-m33 -float-abi=hard %s -o - | FileCheck %s -check-prefix=VMLA8 9define float @t1(float %acc, float %a, float %b) {10entry:11; VFP2-LABEL: t1:12; VFP2: vmla.f3213 14; NEON-LABEL: t1:15; NEON: vmla.f3216 17; A8-LABEL: t1:18; A8: vmul.f3219; A8: vadd.f3220 21; VMLA-LABEL: t1:22; VMLA: vmul.f3223; VMLA-NEXT: vadd.f3224 25 %0 = fmul float %a, %b26 %1 = fadd float %acc, %027 ret float %128}29 30define float @vmla_minsize(float %acc, float %a, float %b) #0 {31entry:32; VMLA-LABEL: vmla_minsize:33; VMLA: vmla.f32 s0, s1, s234; VMLA-NEXT: bx lr35 36 %0 = fmul float %a, %b37 %1 = fadd float %acc, %038 ret float %139}40 41define double @t2(double %acc, double %a, double %b) {42entry:43; VFP2-LABEL: t2:44; VFP2: vmla.f6445 46; NEON-LABEL: t2:47; NEON: vmla.f6448 49; A8-LABEL: t2:50; A8: vmul.f6451; A8: vadd.f6452 %0 = fmul double %a, %b53 %1 = fadd double %acc, %054 ret double %155}56 57define float @t3(float %acc, float %a, float %b) {58entry:59; VFP2-LABEL: t3:60; VFP2: vmla.f3261 62; NEON-LABEL: t3:63; NEON: vmla.f3264 65; A8-LABEL: t3:66; A8: vmul.f3267; A8: vadd.f3268 %0 = fmul float %a, %b69 %1 = fadd float %0, %acc70 ret float %171}72 73; It's possible to make use of fp vmla / vmls on Cortex-A9.74; rdar://865967575define void @t4(float %acc1, float %a, float %b, float %acc2, float %c, ptr %P1, ptr %P2) {76entry:77; A8-LABEL: t4:78; A8: vmul.f3279; A8: vmul.f3280; A8: vadd.f3281; A8: vadd.f3282 83; Two vmla with now RAW hazard84; A9-LABEL: t4:85; A9: vmla.f3286; A9: vmla.f3287 88; HARD-LABEL: t4:89; HARD: vmla.f32 s0, s1, s290; HARD: vmla.f32 s3, s1, s491 %0 = fmul float %a, %b92 %1 = fadd float %acc1, %093 %2 = fmul float %a, %c94 %3 = fadd float %acc2, %295 store float %1, ptr %P196 store float %3, ptr %P297 ret void98}99 100define float @t5(float %a, float %b, float %c, float %d, float %e) {101entry:102; A8-LABEL: t5:103; A8: vmul.f32104; A8: vmul.f32105; A8: vadd.f32106; A8: vadd.f32107 108; A9-LABEL: t5:109; A9: vmla.f32110; A9: vmul.f32111; A9: vadd.f32112 113; HARD-LABEL: t5:114; HARD: vmla.f32 s4, s0, s1115; HARD: vmul.f32 s0, s2, s3116; HARD: vadd.f32 s0, s4, s0117 %0 = fmul float %a, %b118 %1 = fadd float %e, %0119 %2 = fmul float %c, %d120 %3 = fadd float %1, %2121 ret float %3122}123 124attributes #0 = { minsize nounwind optsize }125