From e647ff0d7d734d8e07d39670302b86f3c69bb0d5 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 26 Dec 2019 20:09:32 -0800 Subject: [PATCH] [X86] Add tests for constrained float intrinsics on i686-pc-windows-msvc. NFC We need to promote these to double due to missing libcalls on Windows. --- llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll diff --git a/llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll b/llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll new file mode 100644 index 0000000..86a66ff --- /dev/null +++ b/llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll @@ -0,0 +1,135 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -O3 -mtriple=i686-pc-windows-msvc -mattr=+cmov < %s | FileCheck %s + +define float @ceil(float %x) #0 { +; CHECK-LABEL: ceil: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _ceilf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.ceil.f32(float %x, metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @cos(float %x) #0 { +; CHECK-LABEL: cos: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _cosf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.cos.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @exp(float %x) #0 { +; CHECK-LABEL: exp: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _expf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.exp.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @floor(float %x) #0 { +; CHECK-LABEL: floor: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _floorf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.floor.f32(float %x, metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @frem(float %x, float %y) #0 { +; CHECK-LABEL: frem: +; CHECK: # %bb.0: +; CHECK-NEXT: subl $8, %esp +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _fmodf +; CHECK-NEXT: addl $8, %esp +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.frem.f32(float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @log(float %x) #0 { +; CHECK-LABEL: log: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _logf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.log.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @log10(float %x) #0 { +; CHECK-LABEL: log10: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _log10f +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.log10.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @pow(float %x, float %y) #0 { +; CHECK-LABEL: pow: +; CHECK: # %bb.0: +; CHECK-NEXT: subl $8, %esp +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _powf +; CHECK-NEXT: addl $8, %esp +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.pow.f32(float %x, float %y, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +define float @sin(float %x) #0 { +; CHECK-LABEL: sin: +; CHECK: # %bb.0: +; CHECK-NEXT: pushl %eax +; CHECK-NEXT: flds {{[0-9]+}}(%esp) +; CHECK-NEXT: fstps (%esp) +; CHECK-NEXT: calll _sinf +; CHECK-NEXT: popl %eax +; CHECK-NEXT: retl + %result = call float @llvm.experimental.constrained.sin.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 + ret float %result +} + +attributes #0 = { strictfp } + +declare float @llvm.experimental.constrained.ceil.f32(float, metadata) +declare float @llvm.experimental.constrained.cos.f32(float, metadata, metadata) +declare float @llvm.experimental.constrained.exp.f32(float, metadata, metadata) +declare float @llvm.experimental.constrained.floor.f32(float, metadata) +declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata) +declare float @llvm.experimental.constrained.log.f32(float, metadata, metadata) +declare float @llvm.experimental.constrained.log10.f32(float, metadata, metadata) +declare float @llvm.experimental.constrained.pow.f32(float, float, metadata, metadata) +declare float @llvm.experimental.constrained.sin.f32(float, metadata, metadata) -- 2.7.4