1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

[WebAssembly] Implement mixed-type ISD::FCOPYSIGN.

ISD::FCOPYSIGN permits its operands to have differing types, and DAGCombiner
uses this. Add some def : Pat rules to expand this out into an explicit
conversion and a normal copysign operation.

llvm-svn: 255220
This commit is contained in:
Dan Gohman 2015-12-10 04:55:31 +00:00
parent 0ff43d51a6
commit aa6cf3803d
3 changed files with 35 additions and 1 deletions

View File

@ -38,6 +38,12 @@ defm NEAREST : UnaryFP<fnearbyint, "nearest">;
} // Defs = [ARGUMENTS] } // Defs = [ARGUMENTS]
// DAGCombine oddly folds casts into the rhs of copysign. Unfold them.
def : Pat<(fcopysign F64:$lhs, F32:$rhs),
(COPYSIGN_F64 F64:$lhs, (F64_PROMOTE_F32 F32:$rhs))>;
def : Pat<(fcopysign F32:$lhs, F64:$rhs),
(COPYSIGN_F32 F32:$lhs, (F32_DEMOTE_F64 F64:$rhs))>;
// WebAssembly doesn't expose inexact exceptions, so map frint to fnearbyint. // WebAssembly doesn't expose inexact exceptions, so map frint to fnearbyint.
def : Pat<(frint f32:$src), (NEAREST_F32 f32:$src)>; def : Pat<(frint f32:$src), (NEAREST_F32 f32:$src)>;
def : Pat<(frint f64:$src), (NEAREST_F64 f64:$src)>; def : Pat<(frint f64:$src), (NEAREST_F64 f64:$src)>;

View File

@ -154,7 +154,7 @@ include "WebAssemblyInstrMemory.td"
include "WebAssemblyInstrCall.td" include "WebAssemblyInstrCall.td"
include "WebAssemblyInstrControl.td" include "WebAssemblyInstrControl.td"
include "WebAssemblyInstrInteger.td" include "WebAssemblyInstrInteger.td"
include "WebAssemblyInstrFloat.td"
include "WebAssemblyInstrConv.td" include "WebAssemblyInstrConv.td"
include "WebAssemblyInstrFloat.td"
include "WebAssemblyInstrAtomics.td" include "WebAssemblyInstrAtomics.td"
include "WebAssemblyInstrSIMD.td" include "WebAssemblyInstrSIMD.td"

View File

@ -0,0 +1,28 @@
; RUN: llc < %s -asm-verbose=false | FileCheck %s
; DAGCombiner oddly folds casts into the rhs of copysign. Test that they get
; unfolded.
target datalayout = "e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown"
declare double @copysign(double, double) nounwind readnone
declare float @copysignf(float, float) nounwind readnone
; CHECK-LABEL: fold_promote:
; CHECK: f64.promote/f32 $push0=, $1
; CHECK: f64.copysign $push1=, $0, $pop0
define double @fold_promote(double %a, float %b) {
%c = fpext float %b to double
%t = call double @copysign(double %a, double %c)
ret double %t
}
; CHECK-LABEL: fold_demote:
; CHECK: f32.demote/f64 $push0=, $1
; CHECK: f32.copysign $push1=, $0, $pop0
define float @fold_demote(float %a, double %b) {
%c = fptrunc double %b to float
%t = call float @copysignf(float %a, float %c)
ret float %t
}