mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
3f23d4b8c3
tryLatency compares two sched candidates. For the top zone it prefers the one with lesser depth, but only if that depth is greater than the total latency of the instructions we've already scheduled -- otherwise its latency would be hidden and there would be no stall. Unfortunately it only tests the depth of one of the candidates. This can lead to situations where the TopDepthReduce heuristic does not kick in, but a lower priority heuristic chooses the other candidate, whose depth *is* greater than the already scheduled latency, which causes a stall. The fix is to apply the heuristic if the depth of *either* candidate is greater than the already scheduled latency. All this also applies to the BotHeightReduce heuristic in the bottom zone. Differential Revision: https://reviews.llvm.org/D72392
1566 lines
48 KiB
LLVM
1566 lines
48 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -O3 -mtriple=powerpc64le-linux-gnu < %s | FileCheck --check-prefix=PC64LE %s
|
|
; RUN: llc -O3 -mtriple=powerpc64le-linux-gnu -mcpu=pwr9 < %s | FileCheck --check-prefix=PC64LE9 %s
|
|
; RUN: llc -O3 -mtriple=powerpc64-linux-gnu < %s | FileCheck --check-prefix=PC64 %s
|
|
|
|
define ppc_fp128 @test_fadd_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_fadd_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __gcc_qadd
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fadd_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __gcc_qadd
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fadd_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __gcc_qadd
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%add = call ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %add
|
|
}
|
|
|
|
define ppc_fp128 @test_fsub_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_fsub_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __gcc_qsub
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fsub_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __gcc_qsub
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fsub_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __gcc_qsub
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%sub = call ppc_fp128 @llvm.experimental.constrained.fsub.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %sub
|
|
}
|
|
|
|
define ppc_fp128 @test_fmul_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_fmul_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __gcc_qmul
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fmul_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __gcc_qmul
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fmul_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __gcc_qmul
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%mul = call ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %mul
|
|
}
|
|
|
|
define ppc_fp128 @test_fdiv_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_fdiv_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __gcc_qdiv
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fdiv_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __gcc_qdiv
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fdiv_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __gcc_qdiv
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%div = call ppc_fp128 @llvm.experimental.constrained.fdiv.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %div
|
|
}
|
|
|
|
define ppc_fp128 @test_frem_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_frem_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl fmodl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_frem_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl fmodl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_frem_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl fmodl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%rem = call ppc_fp128 @llvm.experimental.constrained.frem.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %rem
|
|
}
|
|
|
|
define ppc_fp128 @test_fma_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second, ppc_fp128 %third) #0 {
|
|
; PC64LE-LABEL: test_fma_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl fmal
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fma_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl fmal
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fma_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl fmal
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%add = call ppc_fp128 @llvm.experimental.constrained.fma.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
ppc_fp128 %third,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %add
|
|
}
|
|
|
|
define ppc_fp128 @test_sqrt_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_sqrt_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl sqrtl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_sqrt_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl sqrtl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_sqrt_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl sqrtl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%sqrt = call ppc_fp128 @llvm.experimental.constrained.sqrt.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %sqrt
|
|
}
|
|
|
|
define ppc_fp128 @test_pow_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_pow_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl powl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_pow_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl powl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_pow_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl powl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%pow = call ppc_fp128 @llvm.experimental.constrained.pow.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %pow
|
|
}
|
|
|
|
define ppc_fp128 @test_powi_ppc_fp128(ppc_fp128 %first, i32 %second) #0 {
|
|
; PC64LE-LABEL: test_powi_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: clrldi 5, 5, 32
|
|
; PC64LE-NEXT: bl __powitf2
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_powi_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: clrldi 5, 5, 32
|
|
; PC64LE9-NEXT: bl __powitf2
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_powi_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: clrldi 5, 5, 32
|
|
; PC64-NEXT: bl __powitf2
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%powi = call ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(
|
|
ppc_fp128 %first,
|
|
i32 %second,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %powi
|
|
}
|
|
|
|
define ppc_fp128 @test_sin_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_sin_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl sinl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_sin_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl sinl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_sin_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl sinl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%sin = call ppc_fp128 @llvm.experimental.constrained.sin.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %sin
|
|
}
|
|
|
|
define ppc_fp128 @test_cos_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_cos_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl cosl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_cos_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl cosl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_cos_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl cosl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%cos = call ppc_fp128 @llvm.experimental.constrained.cos.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %cos
|
|
}
|
|
|
|
define ppc_fp128 @test_exp_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_exp_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl expl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_exp_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl expl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_exp_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl expl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%exp = call ppc_fp128 @llvm.experimental.constrained.exp.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %exp
|
|
}
|
|
|
|
define ppc_fp128 @test_exp2_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_exp2_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl exp2l
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_exp2_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl exp2l
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_exp2_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl exp2l
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%exp2 = call ppc_fp128 @llvm.experimental.constrained.exp2.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %exp2
|
|
}
|
|
|
|
define ppc_fp128 @test_log_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_log_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl logl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_log_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl logl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_log_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl logl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%log = call ppc_fp128 @llvm.experimental.constrained.log.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %log
|
|
}
|
|
|
|
define ppc_fp128 @test_log2_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_log2_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl log2l
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_log2_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl log2l
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_log2_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl log2l
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%log2 = call ppc_fp128 @llvm.experimental.constrained.log2.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %log2
|
|
}
|
|
|
|
define ppc_fp128 @test_log10_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_log10_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl log10l
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_log10_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl log10l
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_log10_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl log10l
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%log10 = call ppc_fp128 @llvm.experimental.constrained.log10.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %log10
|
|
}
|
|
|
|
define ppc_fp128 @test_rint_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_rint_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl rintl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_rint_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl rintl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_rint_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl rintl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%rint = call ppc_fp128 @llvm.experimental.constrained.rint.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %rint
|
|
}
|
|
|
|
define ppc_fp128 @test_nearbyint_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_nearbyint_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl nearbyintl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_nearbyint_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl nearbyintl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_nearbyint_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl nearbyintl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%nearbyint = call ppc_fp128 @llvm.experimental.constrained.nearbyint.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %nearbyint
|
|
}
|
|
|
|
define ppc_fp128 @test_maxnum_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_maxnum_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl fmaxl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_maxnum_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl fmaxl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_maxnum_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl fmaxl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%maxnum = call ppc_fp128 @llvm.experimental.constrained.maxnum.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %maxnum
|
|
}
|
|
|
|
define ppc_fp128 @test_minnum_ppc_fp128(ppc_fp128 %first, ppc_fp128 %second) #0 {
|
|
; PC64LE-LABEL: test_minnum_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl fminl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_minnum_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl fminl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_minnum_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl fminl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%minnum = call ppc_fp128 @llvm.experimental.constrained.minnum.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %second,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %minnum
|
|
}
|
|
|
|
define ppc_fp128 @test_ceil_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_ceil_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl ceill
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_ceil_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl ceill
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_ceil_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl ceill
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%ceil = call ppc_fp128 @llvm.experimental.constrained.ceil.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %ceil
|
|
}
|
|
|
|
define ppc_fp128 @test_floor_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_floor_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl floorl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_floor_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl floorl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_floor_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl floorl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%floor = call ppc_fp128 @llvm.experimental.constrained.floor.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %floor
|
|
}
|
|
|
|
define ppc_fp128 @test_round_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_round_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl roundl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_round_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl roundl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_round_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl roundl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%round = call ppc_fp128 @llvm.experimental.constrained.round.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %round
|
|
}
|
|
|
|
define ppc_fp128 @test_trunc_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_trunc_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl truncl
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_trunc_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl truncl
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_trunc_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl truncl
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%trunc = call ppc_fp128 @llvm.experimental.constrained.trunc.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %trunc
|
|
}
|
|
|
|
define float @test_fptrunc_ppc_fp128_f32(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptrunc_ppc_fp128_f32:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: xsrsp 1, 1
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptrunc_ppc_fp128_f32:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: xsrsp 1, 1
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptrunc_ppc_fp128_f32:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: frsp 1, 1
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fptrunc = call float @llvm.experimental.constrained.fptrunc.ppcf128.f32(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret float %fptrunc
|
|
}
|
|
|
|
define double @test_fptrunc_ppc_fp128_f64(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptrunc_ppc_fp128_f64:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptrunc_ppc_fp128_f64:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptrunc_ppc_fp128_f64:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fptrunc = call double @llvm.experimental.constrained.fptrunc.ppcf128.f64(
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
ret double %fptrunc
|
|
}
|
|
|
|
define ppc_fp128 @test_fpext_ppc_fp128_f32(float %first) #0 {
|
|
; PC64LE-LABEL: test_fpext_ppc_fp128_f32:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fpext_ppc_fp128_f32:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fpext_ppc_fp128_f32:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: addis 3, 2, .LCPI26_0@toc@ha
|
|
; PC64-NEXT: lfs 2, .LCPI26_0@toc@l(3)
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(
|
|
float %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %fpext
|
|
}
|
|
|
|
define ppc_fp128 @test_fpext_ppc_fp128_f64(double %first) #0 {
|
|
; PC64LE-LABEL: test_fpext_ppc_fp128_f64:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fpext_ppc_fp128_f64:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fpext_ppc_fp128_f64:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: addis 3, 2, .LCPI27_0@toc@ha
|
|
; PC64-NEXT: lfs 2, .LCPI27_0@toc@l(3)
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call ppc_fp128 @llvm.experimental.constrained.fpext.f64.ppcf128(
|
|
double %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret ppc_fp128 %fpext
|
|
}
|
|
|
|
define i64 @test_fptosi_ppc_i64_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptosi_ppc_i64_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __fixtfdi
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptosi_ppc_i64_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __fixtfdi
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptosi_ppc_i64_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __fixtfdi
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call i64 @llvm.experimental.constrained.fptosi.i64.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret i64 %fpext
|
|
}
|
|
|
|
define i32 @test_fptosi_ppc_i32_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptosi_ppc_i32_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __gcc_qtou
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptosi_ppc_i32_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __gcc_qtou
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptosi_ppc_i32_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __gcc_qtou
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call i32 @llvm.experimental.constrained.fptosi.i32.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret i32 %fpext
|
|
}
|
|
|
|
define i64 @test_fptoui_ppc_i64_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptoui_ppc_i64_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __fixunstfdi
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptoui_ppc_i64_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __fixunstfdi
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptoui_ppc_i64_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __fixunstfdi
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call i64 @llvm.experimental.constrained.fptoui.i64.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret i64 %fpext
|
|
}
|
|
|
|
define i32 @test_fptoui_ppc_i32_ppc_fp128(ppc_fp128 %first) #0 {
|
|
; PC64LE-LABEL: test_fptoui_ppc_i32_ppc_fp128:
|
|
; PC64LE: # %bb.0: # %entry
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -32(1)
|
|
; PC64LE-NEXT: bl __fixunstfsi
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: addi 1, 1, 32
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_fptoui_ppc_i32_ppc_fp128:
|
|
; PC64LE9: # %bb.0: # %entry
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -32(1)
|
|
; PC64LE9-NEXT: bl __fixunstfsi
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: addi 1, 1, 32
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_fptoui_ppc_i32_ppc_fp128:
|
|
; PC64: # %bb.0: # %entry
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -112(1)
|
|
; PC64-NEXT: bl __fixunstfsi
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: addi 1, 1, 112
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
entry:
|
|
%fpext = call i32 @llvm.experimental.constrained.fptoui.i32.ppcf128(
|
|
ppc_fp128 %first,
|
|
metadata !"fpexcept.strict") #1
|
|
ret i32 %fpext
|
|
}
|
|
|
|
; Test that resultant libcalls retain order even when their non-strict FLOP form could be
|
|
; trivially optimized into differing sequences.
|
|
define void @test_constrained_libcall_multichain(float* %firstptr, ppc_fp128* %result) #0 {
|
|
; PC64LE-LABEL: test_constrained_libcall_multichain:
|
|
; PC64LE: # %bb.0:
|
|
; PC64LE-NEXT: mflr 0
|
|
; PC64LE-NEXT: std 29, -48(1) # 8-byte Folded Spill
|
|
; PC64LE-NEXT: std 30, -40(1) # 8-byte Folded Spill
|
|
; PC64LE-NEXT: stfd 29, -24(1) # 8-byte Folded Spill
|
|
; PC64LE-NEXT: stfd 30, -16(1) # 8-byte Folded Spill
|
|
; PC64LE-NEXT: stfd 31, -8(1) # 8-byte Folded Spill
|
|
; PC64LE-NEXT: std 0, 16(1)
|
|
; PC64LE-NEXT: stdu 1, -80(1)
|
|
; PC64LE-NEXT: mr 29, 3
|
|
; PC64LE-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE-NEXT: li 3, 0
|
|
; PC64LE-NEXT: mr 30, 4
|
|
; PC64LE-NEXT: lfsx 31, 0, 29
|
|
; PC64LE-NEXT: xxlxor 4, 4, 4
|
|
; PC64LE-NEXT: std 3, 8(4)
|
|
; PC64LE-NEXT: fmr 1, 31
|
|
; PC64LE-NEXT: fmr 3, 31
|
|
; PC64LE-NEXT: stfdx 31, 0, 4
|
|
; PC64LE-NEXT: bl __gcc_qadd
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: fmr 3, 1
|
|
; PC64LE-NEXT: fmr 4, 2
|
|
; PC64LE-NEXT: fmr 30, 1
|
|
; PC64LE-NEXT: fmr 29, 2
|
|
; PC64LE-NEXT: stfd 2, 24(30)
|
|
; PC64LE-NEXT: stfd 1, 16(30)
|
|
; PC64LE-NEXT: bl __gcc_qmul
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: fmr 1, 31
|
|
; PC64LE-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE-NEXT: li 5, 2
|
|
; PC64LE-NEXT: stfd 29, 40(30)
|
|
; PC64LE-NEXT: stfd 30, 32(30)
|
|
; PC64LE-NEXT: bl __powitf2
|
|
; PC64LE-NEXT: nop
|
|
; PC64LE-NEXT: xsrsp 0, 1
|
|
; PC64LE-NEXT: stfsx 0, 0, 29
|
|
; PC64LE-NEXT: stfd 1, -16(30)
|
|
; PC64LE-NEXT: stfd 2, -8(30)
|
|
; PC64LE-NEXT: addi 1, 1, 80
|
|
; PC64LE-NEXT: ld 0, 16(1)
|
|
; PC64LE-NEXT: lfd 31, -8(1) # 8-byte Folded Reload
|
|
; PC64LE-NEXT: lfd 30, -16(1) # 8-byte Folded Reload
|
|
; PC64LE-NEXT: ld 30, -40(1) # 8-byte Folded Reload
|
|
; PC64LE-NEXT: lfd 29, -24(1) # 8-byte Folded Reload
|
|
; PC64LE-NEXT: ld 29, -48(1) # 8-byte Folded Reload
|
|
; PC64LE-NEXT: mtlr 0
|
|
; PC64LE-NEXT: blr
|
|
;
|
|
; PC64LE9-LABEL: test_constrained_libcall_multichain:
|
|
; PC64LE9: # %bb.0:
|
|
; PC64LE9-NEXT: mflr 0
|
|
; PC64LE9-NEXT: std 29, -48(1) # 8-byte Folded Spill
|
|
; PC64LE9-NEXT: std 30, -40(1) # 8-byte Folded Spill
|
|
; PC64LE9-NEXT: stfd 29, -24(1) # 8-byte Folded Spill
|
|
; PC64LE9-NEXT: stfd 30, -16(1) # 8-byte Folded Spill
|
|
; PC64LE9-NEXT: stfd 31, -8(1) # 8-byte Folded Spill
|
|
; PC64LE9-NEXT: std 0, 16(1)
|
|
; PC64LE9-NEXT: stdu 1, -80(1)
|
|
; PC64LE9-NEXT: lfs 31, 0(3)
|
|
; PC64LE9-NEXT: mr 29, 3
|
|
; PC64LE9-NEXT: li 3, 0
|
|
; PC64LE9-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE9-NEXT: xxlxor 4, 4, 4
|
|
; PC64LE9-NEXT: mr 30, 4
|
|
; PC64LE9-NEXT: std 3, 8(4)
|
|
; PC64LE9-NEXT: fmr 1, 31
|
|
; PC64LE9-NEXT: fmr 3, 31
|
|
; PC64LE9-NEXT: stfd 31, 0(4)
|
|
; PC64LE9-NEXT: bl __gcc_qadd
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: fmr 3, 1
|
|
; PC64LE9-NEXT: fmr 4, 2
|
|
; PC64LE9-NEXT: fmr 30, 1
|
|
; PC64LE9-NEXT: fmr 29, 2
|
|
; PC64LE9-NEXT: stfd 2, 24(30)
|
|
; PC64LE9-NEXT: stfd 1, 16(30)
|
|
; PC64LE9-NEXT: bl __gcc_qmul
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: fmr 1, 31
|
|
; PC64LE9-NEXT: xxlxor 2, 2, 2
|
|
; PC64LE9-NEXT: li 5, 2
|
|
; PC64LE9-NEXT: stfd 29, 40(30)
|
|
; PC64LE9-NEXT: stfd 30, 32(30)
|
|
; PC64LE9-NEXT: bl __powitf2
|
|
; PC64LE9-NEXT: nop
|
|
; PC64LE9-NEXT: xsrsp 0, 1
|
|
; PC64LE9-NEXT: stfs 0, 0(29)
|
|
; PC64LE9-NEXT: stfd 1, -16(30)
|
|
; PC64LE9-NEXT: stfd 2, -8(30)
|
|
; PC64LE9-NEXT: addi 1, 1, 80
|
|
; PC64LE9-NEXT: ld 0, 16(1)
|
|
; PC64LE9-NEXT: lfd 31, -8(1) # 8-byte Folded Reload
|
|
; PC64LE9-NEXT: lfd 30, -16(1) # 8-byte Folded Reload
|
|
; PC64LE9-NEXT: ld 30, -40(1) # 8-byte Folded Reload
|
|
; PC64LE9-NEXT: ld 29, -48(1) # 8-byte Folded Reload
|
|
; PC64LE9-NEXT: mtlr 0
|
|
; PC64LE9-NEXT: lfd 29, -24(1) # 8-byte Folded Reload
|
|
; PC64LE9-NEXT: blr
|
|
;
|
|
; PC64-LABEL: test_constrained_libcall_multichain:
|
|
; PC64: # %bb.0:
|
|
; PC64-NEXT: mflr 0
|
|
; PC64-NEXT: std 0, 16(1)
|
|
; PC64-NEXT: stdu 1, -176(1)
|
|
; PC64-NEXT: std 29, 120(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: mr 29, 3
|
|
; PC64-NEXT: li 3, 0
|
|
; PC64-NEXT: stfd 31, 168(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: std 30, 128(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: mr 30, 4
|
|
; PC64-NEXT: lfs 31, 0(29)
|
|
; PC64-NEXT: std 3, 8(4)
|
|
; PC64-NEXT: addis 3, 2, .LCPI32_0@toc@ha
|
|
; PC64-NEXT: stfd 30, 160(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: lfs 30, .LCPI32_0@toc@l(3)
|
|
; PC64-NEXT: fmr 1, 31
|
|
; PC64-NEXT: fmr 3, 31
|
|
; PC64-NEXT: stfd 28, 144(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: fmr 2, 30
|
|
; PC64-NEXT: fmr 4, 30
|
|
; PC64-NEXT: stfd 29, 152(1) # 8-byte Folded Spill
|
|
; PC64-NEXT: stfd 31, 0(4)
|
|
; PC64-NEXT: bl __gcc_qadd
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: fmr 3, 1
|
|
; PC64-NEXT: fmr 4, 2
|
|
; PC64-NEXT: fmr 29, 1
|
|
; PC64-NEXT: fmr 28, 2
|
|
; PC64-NEXT: stfd 2, 24(30)
|
|
; PC64-NEXT: stfd 1, 16(30)
|
|
; PC64-NEXT: bl __gcc_qmul
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: fmr 1, 31
|
|
; PC64-NEXT: fmr 2, 30
|
|
; PC64-NEXT: li 5, 2
|
|
; PC64-NEXT: stfd 28, 40(30)
|
|
; PC64-NEXT: stfd 29, 32(30)
|
|
; PC64-NEXT: bl __powitf2
|
|
; PC64-NEXT: nop
|
|
; PC64-NEXT: frsp 0, 1
|
|
; PC64-NEXT: stfs 0, 0(29)
|
|
; PC64-NEXT: ld 29, 120(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: stfd 1, -16(30)
|
|
; PC64-NEXT: stfd 2, -8(30)
|
|
; PC64-NEXT: ld 30, 128(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: lfd 31, 168(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: lfd 30, 160(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: lfd 29, 152(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: lfd 28, 144(1) # 8-byte Folded Reload
|
|
; PC64-NEXT: addi 1, 1, 176
|
|
; PC64-NEXT: ld 0, 16(1)
|
|
; PC64-NEXT: mtlr 0
|
|
; PC64-NEXT: blr
|
|
%load = load float, float* %firstptr
|
|
%first = call ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(
|
|
float %load,
|
|
metadata !"fpexcept.strict") #1
|
|
store ppc_fp128 %first, ppc_fp128* %result
|
|
|
|
; For unconstrained FLOPs, these next two FP instructions would necessarily
|
|
; be executed in series with one another.
|
|
%fadd = call ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(
|
|
ppc_fp128 %first,
|
|
ppc_fp128 %first,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
%stridx1 = getelementptr ppc_fp128, ppc_fp128* %result, i32 1
|
|
store ppc_fp128 %fadd, ppc_fp128* %stridx1
|
|
%fmul = call ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(
|
|
ppc_fp128 %fadd,
|
|
ppc_fp128 %fadd,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
%stridx2 = getelementptr ppc_fp128, ppc_fp128* %stridx1, i32 1
|
|
store ppc_fp128 %fadd, ppc_fp128* %stridx2
|
|
|
|
; For unconstrained FLOPs, these next two FP instructions could be reordered
|
|
; or even executed in parallel with respect to the previous two instructions.
|
|
; However, strict floating point rules would not allow this.
|
|
%powi = call ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(
|
|
ppc_fp128 %first,
|
|
i32 2,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
%tinypow = call float @llvm.experimental.constrained.fptrunc.ppcf128.f32(
|
|
ppc_fp128 %powi,
|
|
metadata !"round.dynamic",
|
|
metadata !"fpexcept.strict") #1
|
|
store float %tinypow, float* %firstptr
|
|
%stridxn1 = getelementptr ppc_fp128, ppc_fp128* %result, i32 -1
|
|
store ppc_fp128 %powi, ppc_fp128* %stridxn1
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { nounwind strictfp }
|
|
attributes #1 = { strictfp }
|
|
|
|
declare ppc_fp128 @llvm.experimental.constrained.fadd.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.ceil.ppcf128(ppc_fp128, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.cos.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fdiv.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.exp.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.exp2.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.floor.ppcf128(ppc_fp128, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fma.ppcf128(ppc_fp128, ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fpext.f32.ppcf128(float, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fpext.f64.ppcf128(double, metadata)
|
|
declare float @llvm.experimental.constrained.fptrunc.ppcf128.f32(ppc_fp128, metadata, metadata)
|
|
declare double @llvm.experimental.constrained.fptrunc.ppcf128.f64(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.log.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.log10.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.log2.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.maxnum.ppcf128(ppc_fp128, ppc_fp128, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.minnum.ppcf128(ppc_fp128, ppc_fp128, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fmul.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.nearbyint.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.pow.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.powi.ppcf128(ppc_fp128, i32, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.frem.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.rint.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.round.ppcf128(ppc_fp128, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.sin.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.sqrt.ppcf128(ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.fsub.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
|
|
declare ppc_fp128 @llvm.experimental.constrained.trunc.ppcf128(ppc_fp128, metadata)
|
|
declare i64 @llvm.experimental.constrained.fptosi.i64.ppcf128(ppc_fp128, metadata)
|
|
declare i32 @llvm.experimental.constrained.fptosi.i32.ppcf128(ppc_fp128, metadata)
|
|
declare i64 @llvm.experimental.constrained.fptoui.i64.ppcf128(ppc_fp128, metadata)
|
|
declare i32 @llvm.experimental.constrained.fptoui.i32.ppcf128(ppc_fp128, metadata)
|