mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
6f3828aa04
Add generic instructions for load complement, load negative and load positive for fp32 and fp64, and let isel prefer them. They do not clobber CC, and so give scheduler more freedom. SystemZElimCompare pass will convert them when it can to the CC-setting variants. Regression tests updated to expect the new opcodes in places where the old ones where used. New test case SystemZ/fp-cmp-05.ll checks that SystemZCompareElim.cpp can handle the new opcodes. README.txt updated (bullet removed). Note that fp128 is not yet handled, because it is relatively rare, and is a bit trickier, because of the fact that l.dfr would operate on the sign bit of one of the subregisters of a fp128, but we would not want to copy the other sub-reg in case src and dst regs are not the same. Reviewed by Ulrich Weigand. llvm-svn: 249046
42 lines
1.1 KiB
LLVM
42 lines
1.1 KiB
LLVM
; Test floating-point absolute.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
|
|
|
; Test f32.
|
|
declare float @llvm.fabs.f32(float %f)
|
|
define float @f1(float %f) {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: lpdfr %f0, %f0
|
|
; CHECK: br %r14
|
|
%res = call float @llvm.fabs.f32(float %f)
|
|
ret float %res
|
|
}
|
|
|
|
; Test f64.
|
|
declare double @llvm.fabs.f64(double %f)
|
|
define double @f2(double %f) {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: lpdfr %f0, %f0
|
|
; CHECK: br %r14
|
|
%res = call double @llvm.fabs.f64(double %f)
|
|
ret double %res
|
|
}
|
|
|
|
; Test f128. With the loads and stores, a pure absolute would probably
|
|
; be better implemented using an NI on the upper byte. Do some extra
|
|
; processing so that using FPRs is unequivocally better.
|
|
declare fp128 @llvm.fabs.f128(fp128 %f)
|
|
define void @f3(fp128 *%ptr, fp128 *%ptr2) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: lpxbr
|
|
; CHECK: dxbr
|
|
; CHECK: br %r14
|
|
%orig = load fp128 , fp128 *%ptr
|
|
%abs = call fp128 @llvm.fabs.f128(fp128 %orig)
|
|
%op2 = load fp128 , fp128 *%ptr2
|
|
%res = fdiv fp128 %abs, %op2
|
|
store fp128 %res, fp128 *%ptr
|
|
ret void
|
|
}
|