mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
c56f83f1a4
Before z14, we did not have any FMA instruction for 128-bit floating-point, so the @llvm.fma.f128 intrinsic needs to be expanded to a libcall on those platforms. This worked correctly for regular FMA, but was implemented incorrectly for the strict version. This was not noticed because we did not have test coverage for this case. This patch fixes that incorrect expansion and adds the missing test cases.
22 lines
704 B
LLVM
22 lines
704 B
LLVM
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
|
|
|
declare fp128 @llvm.experimental.constrained.fma.f128(fp128 %f1, fp128 %f2, fp128 %f3, metadata, metadata)
|
|
|
|
define void @f1(fp128 *%ptr1, fp128 *%ptr2, fp128 *%ptr3, fp128 *%dst) #0 {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: brasl %r14, fmal
|
|
; CHECK: br %r14
|
|
%f1 = load fp128, fp128 *%ptr1
|
|
%f2 = load fp128, fp128 *%ptr2
|
|
%f3 = load fp128, fp128 *%ptr3
|
|
%res = call fp128 @llvm.experimental.constrained.fma.f128 (
|
|
fp128 %f1, fp128 %f2, fp128 %f3,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #0
|
|
store fp128 %res, fp128 *%dst
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { strictfp }
|
|
|