[llvm] [llvm] Ensure that soft float targets don't emit `fma()` libcalls. (PR #106615)
Alex Rønne Petersen via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 31 07:01:13 PDT 2024
================
@@ -0,0 +1,75 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=arm < %s | FileCheck %s -check-prefix=SOFT-FLOAT
+; RUN: llc -mtriple=arm -mattr=+vfp4d16sp < %s | FileCheck %s -check-prefix=SOFT-FLOAT-VFP32
+; RUN: llc -mtriple=arm -mattr=+vfp4d16sp,+fp64 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-VFP64
+
+define float @fma_f32(float %a, float %b, float %c) "use-soft-float"="true" {
+; SOFT-FLOAT-LABEL: fma_f32:
+; SOFT-FLOAT: @ %bb.0:
+; SOFT-FLOAT-NEXT: push {r4, lr}
+; SOFT-FLOAT-NEXT: mov r4, r2
+; SOFT-FLOAT-NEXT: bl __mulsf3
+; SOFT-FLOAT-NEXT: mov r1, r4
+; SOFT-FLOAT-NEXT: bl __addsf3
+; SOFT-FLOAT-NEXT: pop {r4, lr}
+; SOFT-FLOAT-NEXT: mov pc, lr
+;
+; SOFT-FLOAT-VFP32-LABEL: fma_f32:
+; SOFT-FLOAT-VFP32: @ %bb.0:
+; SOFT-FLOAT-VFP32-NEXT: push {r4, lr}
+; SOFT-FLOAT-VFP32-NEXT: mov r4, r2
+; SOFT-FLOAT-VFP32-NEXT: bl __mulsf3
+; SOFT-FLOAT-VFP32-NEXT: mov r1, r4
+; SOFT-FLOAT-VFP32-NEXT: bl __addsf3
+; SOFT-FLOAT-VFP32-NEXT: pop {r4, lr}
+; SOFT-FLOAT-VFP32-NEXT: mov pc, lr
+;
+; SOFT-FLOAT-VFP64-LABEL: fma_f32:
+; SOFT-FLOAT-VFP64: @ %bb.0:
+; SOFT-FLOAT-VFP64-NEXT: push {r4, lr}
+; SOFT-FLOAT-VFP64-NEXT: mov r4, r2
+; SOFT-FLOAT-VFP64-NEXT: bl __mulsf3
+; SOFT-FLOAT-VFP64-NEXT: mov r1, r4
+; SOFT-FLOAT-VFP64-NEXT: bl __addsf3
+; SOFT-FLOAT-VFP64-NEXT: pop {r4, lr}
+; SOFT-FLOAT-VFP64-NEXT: mov pc, lr
+ %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
+ ret float %1
+}
+
+define double @fma_f64(double %a, double %b, double %c) "use-soft-float"="true" {
+; SOFT-FLOAT-LABEL: fma_f64:
+; SOFT-FLOAT: @ %bb.0:
+; SOFT-FLOAT-NEXT: push {r11, lr}
+; SOFT-FLOAT-NEXT: bl __muldf3
+; SOFT-FLOAT-NEXT: ldr r2, [sp, #8]
+; SOFT-FLOAT-NEXT: ldr r3, [sp, #12]
+; SOFT-FLOAT-NEXT: bl __adddf3
+; SOFT-FLOAT-NEXT: pop {r11, lr}
+; SOFT-FLOAT-NEXT: mov pc, lr
+;
+; SOFT-FLOAT-VFP32-LABEL: fma_f64:
+; SOFT-FLOAT-VFP32: @ %bb.0:
+; SOFT-FLOAT-VFP32-NEXT: push {r11, lr}
+; SOFT-FLOAT-VFP32-NEXT: bl __muldf3
+; SOFT-FLOAT-VFP32-NEXT: ldr r2, [sp, #8]
+; SOFT-FLOAT-VFP32-NEXT: ldr r3, [sp, #12]
+; SOFT-FLOAT-VFP32-NEXT: bl __adddf3
+; SOFT-FLOAT-VFP32-NEXT: pop {r11, lr}
+; SOFT-FLOAT-VFP32-NEXT: mov pc, lr
+;
+; SOFT-FLOAT-VFP64-LABEL: fma_f64:
+; SOFT-FLOAT-VFP64: @ %bb.0:
+; SOFT-FLOAT-VFP64-NEXT: push {r11, lr}
+; SOFT-FLOAT-VFP64-NEXT: bl __muldf3
+; SOFT-FLOAT-VFP64-NEXT: ldr r2, [sp, #8]
+; SOFT-FLOAT-VFP64-NEXT: ldr r3, [sp, #12]
+; SOFT-FLOAT-VFP64-NEXT: bl __adddf3
+; SOFT-FLOAT-VFP64-NEXT: pop {r11, lr}
+; SOFT-FLOAT-VFP64-NEXT: mov pc, lr
+ %1 = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
+ ret double %1
----------------
alexrp wrote:
Would you mind elaborating on the named values point? I'm fairly new to contributing to LLVM, so I don't know if there's some significance there that I'm missing. Even if I change it to a named value, I don't know that I can come up with anything better than `result` (or something equally generic). :thinking:
https://github.com/llvm/llvm-project/pull/106615
More information about the llvm-commits
mailing list