658 lines
20 KiB
LLVM
658 lines
20 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=i686-unknown-unknown -O3 | FileCheck %s --check-prefixes=X86
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -O3 | FileCheck %s --check-prefixes=X64
|
|
|
|
define x86_fp80 @fma(x86_fp80 %x, x86_fp80 %y, x86_fp80 %z) nounwind strictfp {
|
|
; X86-LABEL: fma:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $36, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll fmal
|
|
; X86-NEXT: addl $36, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: fma:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $56, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq fmal
|
|
; X64-NEXT: addq $56, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%fma = call x86_fp80 @llvm.experimental.constrained.fma.f80(x86_fp80 %x, x86_fp80 %y, x86_fp80 %z, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %fma
|
|
}
|
|
|
|
define x86_fp80 @frem(x86_fp80 %x, x86_fp80 %y) nounwind strictfp {
|
|
; X86-LABEL: frem:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $24, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll fmodl
|
|
; X86-NEXT: addl $24, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: frem:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $40, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq fmodl
|
|
; X64-NEXT: addq $40, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%div = call x86_fp80 @llvm.experimental.constrained.frem.f80(x86_fp80 %x, x86_fp80 %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %div
|
|
}
|
|
|
|
define x86_fp80 @ceil(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: ceil:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll ceill
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: ceil:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq ceill
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%ceil = call x86_fp80 @llvm.experimental.constrained.ceil.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %ceil
|
|
}
|
|
|
|
define x86_fp80 @cos(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: cos:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll cosl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: cos:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq cosl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%cos = call x86_fp80 @llvm.experimental.constrained.cos.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %cos
|
|
}
|
|
|
|
define x86_fp80 @exp(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: exp:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll expl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: exp:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq expl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%exp = call x86_fp80 @llvm.experimental.constrained.exp.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %exp
|
|
}
|
|
|
|
define x86_fp80 @exp2(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: exp2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll exp2l
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: exp2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq exp2l
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%exp2 = call x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %exp2
|
|
}
|
|
|
|
define x86_fp80 @floor(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: floor:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll floorl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: floor:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq floorl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%floor = call x86_fp80 @llvm.experimental.constrained.floor.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %floor
|
|
}
|
|
|
|
define x86_fp80 @log(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: log:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll logl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: log:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq logl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%log = call x86_fp80 @llvm.experimental.constrained.log.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %log
|
|
}
|
|
|
|
define x86_fp80 @log10(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: log10:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll log10l
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: log10:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq log10l
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%log10 = call x86_fp80 @llvm.experimental.constrained.log10.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %log10
|
|
}
|
|
|
|
define x86_fp80 @log2(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: log2:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll log2l
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: log2:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq log2l
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%log2 = call x86_fp80 @llvm.experimental.constrained.log2.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %log2
|
|
}
|
|
|
|
define x86_fp80 @maxnum(x86_fp80 %x, x86_fp80 %y) nounwind strictfp {
|
|
; X86-LABEL: maxnum:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $24, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll fmaxl
|
|
; X86-NEXT: addl $24, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: maxnum:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $40, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq fmaxl
|
|
; X64-NEXT: addq $40, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%maxnum = call x86_fp80 @llvm.experimental.constrained.maxnum.f80(x86_fp80 %x, x86_fp80 %y, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %maxnum
|
|
}
|
|
|
|
define x86_fp80 @minnum(x86_fp80 %x, x86_fp80 %y) nounwind strictfp {
|
|
; X86-LABEL: minnum:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $24, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll fminl
|
|
; X86-NEXT: addl $24, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: minnum:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $40, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq fminl
|
|
; X64-NEXT: addq $40, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%minnum = call x86_fp80 @llvm.experimental.constrained.minnum.f80(x86_fp80 %x, x86_fp80 %y, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %minnum
|
|
}
|
|
|
|
define x86_fp80 @nearbyint(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: nearbyint:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll nearbyintl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: nearbyint:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq nearbyintl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%nearbyint = call x86_fp80 @llvm.experimental.constrained.nearbyint.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %nearbyint
|
|
}
|
|
|
|
define x86_fp80 @pow(x86_fp80 %x, x86_fp80 %y) nounwind strictfp {
|
|
; X86-LABEL: pow:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $24, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll powl
|
|
; X86-NEXT: addl $24, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: pow:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $40, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq powl
|
|
; X64-NEXT: addq $40, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%pow = call x86_fp80 @llvm.experimental.constrained.pow.f80(x86_fp80 %x, x86_fp80 %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %pow
|
|
}
|
|
|
|
define x86_fp80 @powi(x86_fp80 %x, i32 %y) nounwind strictfp {
|
|
; X86-LABEL: powi:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $16, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll __powixf2
|
|
; X86-NEXT: addl $16, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: powi:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq __powixf2
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%powi = call x86_fp80 @llvm.experimental.constrained.powi.f80(x86_fp80 %x, i32 %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %powi
|
|
}
|
|
|
|
define x86_fp80 @rint(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: rint:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll rintl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: rint:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq rintl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%rint = call x86_fp80 @llvm.experimental.constrained.rint.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %rint
|
|
}
|
|
|
|
define x86_fp80 @round(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: round:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll roundl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: round:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq roundl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%round = call x86_fp80 @llvm.experimental.constrained.round.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %round
|
|
}
|
|
|
|
define x86_fp80 @roundeven(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: roundeven:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll roundevenl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: roundeven:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq roundevenl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%roundeven = call x86_fp80 @llvm.experimental.constrained.roundeven.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %roundeven
|
|
}
|
|
|
|
define x86_fp80 @sin(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: sin:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll sinl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: sin:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq sinl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%sin = call x86_fp80 @llvm.experimental.constrained.sin.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %sin
|
|
}
|
|
|
|
define x86_fp80 @trunc(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: trunc:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll truncl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: trunc:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq truncl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%trunc = call x86_fp80 @llvm.experimental.constrained.trunc.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret x86_fp80 %trunc
|
|
}
|
|
|
|
define i32 @lrint(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: lrint:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll lrintl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: lrint:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq lrintl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%rint = call i32 @llvm.experimental.constrained.lrint.i32.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret i32 %rint
|
|
}
|
|
|
|
define i64 @llrint(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: llrint:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll llrintl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: llrint:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq llrintl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%rint = call i64 @llvm.experimental.constrained.llrint.i64.f80(x86_fp80 %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
|
|
ret i64 %rint
|
|
}
|
|
|
|
define i32 @lround(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: lround:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll lroundl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: lround:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq lroundl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%round = call i32 @llvm.experimental.constrained.lround.i32.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret i32 %round
|
|
}
|
|
|
|
define i64 @llround(x86_fp80 %x) nounwind strictfp {
|
|
; X86-LABEL: llround:
|
|
; X86: # %bb.0: # %entry
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: fldt {{[0-9]+}}(%esp)
|
|
; X86-NEXT: fstpt (%esp)
|
|
; X86-NEXT: wait
|
|
; X86-NEXT: calll llroundl
|
|
; X86-NEXT: addl $12, %esp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: llround:
|
|
; X64: # %bb.0: # %entry
|
|
; X64-NEXT: subq $24, %rsp
|
|
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
|
|
; X64-NEXT: fstpt (%rsp)
|
|
; X64-NEXT: wait
|
|
; X64-NEXT: callq llroundl
|
|
; X64-NEXT: addq $24, %rsp
|
|
; X64-NEXT: retq
|
|
entry:
|
|
%round = call i64 @llvm.experimental.constrained.llround.i64.f80(x86_fp80 %x, metadata !"fpexcept.strict") #0
|
|
ret i64 %round
|
|
}
|
|
|
|
attributes #0 = { strictfp }
|
|
|
|
declare x86_fp80 @llvm.experimental.constrained.fma.f80(x86_fp80, x86_fp80, x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.frem.f80(x86_fp80, x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.ceil.f80(x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.cos.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.exp.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.exp2.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.floor.f80(x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.log.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.log10.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.log2.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.maxnum.f80(x86_fp80, x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.minnum.f80(x86_fp80, x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.nearbyint.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.pow.f80(x86_fp80, x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.powi.f80(x86_fp80, i32, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.rint.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.round.f80(x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.roundeven.f80(x86_fp80, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.sin.f80(x86_fp80, metadata, metadata)
|
|
declare x86_fp80 @llvm.experimental.constrained.trunc.f80(x86_fp80, metadata)
|
|
declare i32 @llvm.experimental.constrained.lrint.i32.f80(x86_fp80, metadata, metadata)
|
|
declare i64 @llvm.experimental.constrained.llrint.i64.f80(x86_fp80, metadata, metadata)
|
|
declare i32 @llvm.experimental.constrained.lround.i32.f80(x86_fp80, metadata)
|
|
declare i64 @llvm.experimental.constrained.llround.i64.f80(x86_fp80, metadata)
|