diff options
author | Dominic Steinitz <dominic@steinitz.org> | 2017-03-07 09:26:16 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-03-07 13:32:33 -0500 |
commit | 12ccf767af3373e319b75d5d61fe79df4a389e45 (patch) | |
tree | ec4bf27785be88d67617ddddd5968e4c128fb6a1 /compiler/llvmGen/LlvmCodeGen/CodeGen.hs | |
parent | 48759c0ef0e7ce718b52557599ebbb884c19a2ad (diff) | |
download | haskell-12ccf767af3373e319b75d5d61fe79df4a389e45.tar.gz |
Generate better fp abs for X86 and llvm with default cmm otherwise
Currently we have this in libraries/base/GHC/Float.hs:
```
abs x | x == 0 = 0 -- handles (-0.0)
| x > 0 = x
| otherwise = negateFloat x
```
But 3-4 years ago it was noted that this was inefficient:
https://mail.haskell.org/pipermail/libraries/2013-April/019690.html
We can generate better code for X86 and llvm and for others generate
some custom cmm code which is similar to what the compiler generates
now.
Reviewers: austin, simonmar, hvr, bgamari
Reviewed By: bgamari
Subscribers: dfeuer, thomie
Differential Revision: https://phabricator.haskell.org/D3265
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen/CodeGen.hs')
-rw-r--r-- | compiler/llvmGen/LlvmCodeGen/CodeGen.hs | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs index d88d234057..40c5498255 100644 --- a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs +++ b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs @@ -690,6 +690,7 @@ cmmPrimOpFunctions mop = do MO_F32_Exp -> fsLit "expf" MO_F32_Log -> fsLit "logf" MO_F32_Sqrt -> fsLit "llvm.sqrt.f32" + MO_F32_Fabs -> fsLit "llvm.fabs.f32" MO_F32_Pwr -> fsLit "llvm.pow.f32" MO_F32_Sin -> fsLit "llvm.sin.f32" @@ -707,6 +708,7 @@ cmmPrimOpFunctions mop = do MO_F64_Exp -> fsLit "exp" MO_F64_Log -> fsLit "log" MO_F64_Sqrt -> fsLit "llvm.sqrt.f64" + MO_F64_Fabs -> fsLit "llvm.fabs.f64" MO_F64_Pwr -> fsLit "llvm.pow.f64" MO_F64_Sin -> fsLit "llvm.sin.f64" |