.file "fmax.s"


// Copyright (c) 2001 - 2003, Intel Corporation
// All rights reserved.
//
// Contributed 2001 by the Intel Numerics Group, Intel Corporation
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * The name of Intel Corporation may not be used to endorse or promote
// products derived from this software without specific prior written
// permission.

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Intel Corporation is the author of this code, and requests that all
// problem reports or change requests be submitted to it directly at
// http://www.intel.com/software/products/opensource/libraries/num.htm.
//
// History
//==============================================================
// 05/31/01 Initial version
// 05/20/02 Cleaned up namespace and sf0 syntax
// 02/10/03 Reordered header: .section, .global, .proc, .align
//
// API
//==============================================================
// double fmax  (double x, double y)
//
// Overview of operation
//==============================================================
// returns the algebraic maximum of 2 input values
//
// Special cases:
//    fmax(x, nan) returns x if x is numeric  // Must special case this one
//    fmax(nan, y) returns y if y is numeric
//    fmax(nan1, nan2) returns quietized nan2
//    fmax(+0,+0) returns +0
//    fmax(-0,+0) returns +0
//    fmax(-0,-0) returns -0
//    fmax(+0,-0) returns +0                  // Must special case this one
//
// SNaN causes invalid to be set

// floating-point registers used: 2
// f8,  input x, output
// f9,  input y

.section .text
GLOBAL_LIBM_ENTRY(fmax)

{ .mfi
      nop.m 999
      fcmp.unord.s0 p6,p7 = f8, f9 // Is x or y a nan? Raise invalid or denormal
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p7)  fclass.m.unc  p8,p9 = f9, 0x06 // If no nan, is y=-0?
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p6)  fclass.m.unc  p10,p0 = f8, 0xc3 // Is x nan?
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p9)  fmax.s0  f8 = f8, f9    // Normal case, no nan and y not -0
      nop.i 999
}
;;

{ .mfi
      nop.m 999
(p8)  fmax.s0  f8 = f9, f8    // No nan and y -0
      nop.i 999
}
;;

{ .mfb
      nop.m 999
(p10) fmerge.s  f8 = f9, f9   // If x nan, return y, else do nothing (returns x)
      br.ret.sptk    b0
}
;;

GLOBAL_LIBM_END(fmax)
libm_alias_double_other (fmax, fmax)
