1// WebAssemblyInstrFloat.td-WebAssembly Float codegen support ---*- tablegen -*- 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief WebAssembly Floating-point operand code-gen constructs. 12/// 13//===----------------------------------------------------------------------===// 14 15defm ADD : BinaryFP<fadd>; 16defm SUB : BinaryFP<fsub>; 17defm MUL : BinaryFP<fmul>; 18defm DIV : BinaryFP<fdiv>; 19defm SQRT : UnaryFP<fsqrt>; 20 21defm ABS : UnaryFP<fabs>; 22defm NEG : UnaryFP<fneg>; 23defm COPYSIGN : BinaryFP<fcopysign>; 24 25defm CEIL : UnaryFP<fceil>; 26defm FLOOR : UnaryFP<ffloor>; 27defm TRUNC : UnaryFP<ftrunc>; 28defm NEAREST : UnaryFP<fnearbyint>; 29 30// WebAssembly doesn't expose inexact exceptions, so map frint to fnearbyint. 31def : Pat<(frint f32:$src), (NEAREST_F32 f32:$src)>; 32def : Pat<(frint f64:$src), (NEAREST_F64 f64:$src)>; 33 34defm EQ : ComparisonFP<SETOEQ>; 35defm NE : ComparisonFP<SETUNE>; 36defm LT : ComparisonFP<SETOLT>; 37defm LE : ComparisonFP<SETOLE>; 38defm GT : ComparisonFP<SETOGT>; 39defm GE : ComparisonFP<SETOGE>; 40 41// Don't care floating-point comparisons, supported via other comparisons. 42def : Pat<(seteq f32:$lhs, f32:$rhs), (EQ_F32 f32:$lhs, f32:$rhs)>; 43def : Pat<(setne f32:$lhs, f32:$rhs), (NE_F32 f32:$lhs, f32:$rhs)>; 44def : Pat<(setlt f32:$lhs, f32:$rhs), (LT_F32 f32:$lhs, f32:$rhs)>; 45def : Pat<(setle f32:$lhs, f32:$rhs), (LE_F32 f32:$lhs, f32:$rhs)>; 46def : Pat<(setgt f32:$lhs, f32:$rhs), (GT_F32 f32:$lhs, f32:$rhs)>; 47def : Pat<(setge f32:$lhs, f32:$rhs), (GE_F32 f32:$lhs, f32:$rhs)>; 48def : Pat<(seteq f64:$lhs, f64:$rhs), (EQ_F64 f64:$lhs, f64:$rhs)>; 49def : Pat<(setne f64:$lhs, f64:$rhs), (NE_F64 f64:$lhs, f64:$rhs)>; 50def : Pat<(setlt f64:$lhs, f64:$rhs), (LT_F64 f64:$lhs, f64:$rhs)>; 51def : Pat<(setle f64:$lhs, f64:$rhs), (LE_F64 f64:$lhs, f64:$rhs)>; 52def : Pat<(setgt f64:$lhs, f64:$rhs), (GT_F64 f64:$lhs, f64:$rhs)>; 53def : Pat<(setge f64:$lhs, f64:$rhs), (GE_F64 f64:$lhs, f64:$rhs)>; 54 55/* 56 * TODO(jfb): Add the following for 32-bit and 64-bit. 57 * 58 * f32.min: minimum (binary operator); if either operand is NaN, returns NaN 59 * f32.max: maximum (binary operator); if either operand is NaN, returns NaN 60 */ 61