forked from OSchip/llvm-project
104 lines
3.2 KiB
LLVM
104 lines
3.2 KiB
LLVM
; RUN: llc -verify-machineinstrs -mcpu=pwr9 -enable-ppc-quad-precision \
|
|
; RUN: -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
|
|
; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s
|
|
|
|
@A = common global fp128 0xL00000000000000000000000000000000, align 16
|
|
@B = common global fp128 0xL00000000000000000000000000000000, align 16
|
|
@C = common global fp128 0xL00000000000000000000000000000000, align 16
|
|
@D = common global fp128 0xL00000000000000000000000000000000, align 16
|
|
|
|
define fp128 @testSqrtOdd(fp128 %a) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.sqrtf128.round.to.odd(fp128 %a)
|
|
ret fp128 %0
|
|
; CHECK-LABEL: testSqrtOdd
|
|
; CHECK: xssqrtqpo v2, v2
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fp128 @llvm.ppc.sqrtf128.round.to.odd(fp128)
|
|
|
|
define void @testFMAOdd(fp128 %a, fp128 %b, fp128 %c) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.fmaf128.round.to.odd(fp128 %a, fp128 %b, fp128 %c)
|
|
store fp128 %0, fp128* @A, align 16
|
|
%sub = fsub fp128 0xL00000000000000008000000000000000, %c
|
|
%1 = call fp128 @llvm.ppc.fmaf128.round.to.odd(fp128 %a, fp128 %b, fp128 %sub)
|
|
store fp128 %1, fp128* @B, align 16
|
|
%2 = call fp128 @llvm.ppc.fmaf128.round.to.odd(fp128 %a, fp128 %b, fp128 %c)
|
|
%sub1 = fsub fp128 0xL00000000000000008000000000000000, %2
|
|
store fp128 %sub1, fp128* @C, align 16
|
|
%sub2 = fsub fp128 0xL00000000000000008000000000000000, %c
|
|
%3 = call fp128 @llvm.ppc.fmaf128.round.to.odd(fp128 %a, fp128 %b, fp128 %sub2)
|
|
%sub3 = fsub fp128 0xL00000000000000008000000000000000, %3
|
|
store fp128 %sub3, fp128* @D, align 16
|
|
ret void
|
|
; CHECK-LABEL: testFMAOdd
|
|
; CHECK-DAG: xsmaddqpo v{{[0-9]+}}, v2, v3
|
|
; CHECK-DAG: xsmsubqpo v{{[0-9]+}}, v2, v3
|
|
; CHECK-DAG: xsnmaddqpo v{{[0-9]+}}, v2, v3
|
|
; CHECK-DAG: xsnmsubqpo v{{[0-9]+}}, v2, v3
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fp128 @llvm.ppc.fmaf128.round.to.odd(fp128, fp128, fp128)
|
|
|
|
define fp128 @testAddOdd(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.addf128.round.to.odd(fp128 %a, fp128 %b)
|
|
ret fp128 %0
|
|
; CHECK-LABEL: testAddOdd
|
|
; CHECK: xsaddqpo v2, v2, v3
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fp128 @llvm.ppc.addf128.round.to.odd(fp128, fp128)
|
|
|
|
define fp128 @testSubOdd(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.subf128.round.to.odd(fp128 %a, fp128 %b)
|
|
ret fp128 %0
|
|
; CHECK-LABEL: testSubOdd
|
|
; CHECK: xssubqpo v2, v2, v3
|
|
; CHECK: blr
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare fp128 @llvm.ppc.subf128.round.to.odd(fp128, fp128)
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define fp128 @testMulOdd(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.mulf128.round.to.odd(fp128 %a, fp128 %b)
|
|
ret fp128 %0
|
|
; CHECK-LABEL: testMulOdd
|
|
; CHECK: xsmulqpo v2, v2, v3
|
|
; CHECK: blr
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare fp128 @llvm.ppc.mulf128.round.to.odd(fp128, fp128)
|
|
|
|
define fp128 @testDivOdd(fp128 %a, fp128 %b) {
|
|
entry:
|
|
%0 = call fp128 @llvm.ppc.divf128.round.to.odd(fp128 %a, fp128 %b)
|
|
ret fp128 %0
|
|
; CHECK-LABEL: testDivOdd
|
|
; CHECK: xsdivqpo v2, v2, v3
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fp128 @llvm.ppc.divf128.round.to.odd(fp128, fp128)
|
|
|
|
define double @testTruncOdd(fp128 %a) {
|
|
entry:
|
|
%0 = call double @llvm.ppc.truncf128.round.to.odd(fp128 %a)
|
|
ret double %0
|
|
; CHECK-LABEL: testTruncOdd
|
|
; CHECK: xscvqpdpo v2, v2
|
|
; CHECK: xxlor f1, v2, v2
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare double @llvm.ppc.truncf128.round.to.odd(fp128)
|