1 // SPDX-License-Identifier: GPL-2.0-or-later 1 2 /* 3 * Linux/PA-RISC Project (http://www.parisc-li 4 * 5 * Floating-point emulation code 6 * Copyright (C) 2001 Hewlett-Packard (Paul B 7 */ 8 /* 9 * BEGIN_DESC 10 * 11 * File: 12 * @(#) pa/spmath/sfcmp.c 13 * 14 * Purpose: 15 * sgl_cmp: compare two values 16 * 17 * External Interfaces: 18 * sgl_fcmp(leftptr, rightptr, cond, stat 19 * 20 * Internal Interfaces: 21 * 22 * Theory: 23 * <<please update with a overview of the 24 * 25 * END_DESC 26 */ 27 28 29 #include "float.h" 30 #include "sgl_float.h" 31 32 /* 33 * sgl_cmp: compare two values 34 */ 35 int 36 sgl_fcmp (sgl_floating_point * leftptr, sgl_fl 37 unsigned int cond, unsigned int *sta 38 39 /* The predicate to be 40 41 { 42 register unsigned int left, right; 43 register int xorresult; 44 45 /* Create local copies of the numbers */ 46 left = *leftptr; 47 right = *rightptr; 48 49 /* 50 * Test for NaN 51 */ 52 if( (Sgl_exponent(left) == SGL_INFINITY 53 || (Sgl_exponent(right) == SGL_INFINIT 54 { 55 /* Check if a NaN is involved. Signal 56 * comparing a signaling NaN or when c 57 * low bit of the condition is set */ 58 if( ( (Sgl_exponent(left) == SGL_INFI 59 && Sgl_isnotzero_mantissa(left) 60 && (Exception(cond) || Sgl_isone_s 61 || 62 ( (Sgl_exponent(right) == SGL_INF 63 && Sgl_isnotzero_mantissa(right) 64 && (Exception(cond) || Sgl_isone_s 65 { 66 if( Is_invalidtrap_enabled() ) { 67 Set_status_cbit(Unordered(cond 68 return(INVALIDEXCEPTION); 69 } 70 else Set_invalidflag(); 71 Set_status_cbit(Unordered(cond)); 72 return(NOEXCEPTION); 73 } 74 /* All the exceptional conditions are 75 NaN compares */ 76 else if( ((Sgl_exponent(left) == SGL_I 77 && Sgl_isnotzero_mantissa(left)) 78 || 79 ((Sgl_exponent(right) == SGL_INFIN 80 && Sgl_isnotzero_mantissa(right)) 81 { 82 /* NaNs always compare unordered. 83 Set_status_cbit(Unordered(cond)); 84 return(NOEXCEPTION); 85 } 86 /* infinities will drop down to the no 87 } 88 /* First compare for unequal signs => less 89 * special equal case */ 90 Sgl_xortointp1(left,right,xorresult); 91 if( xorresult < 0 ) 92 { 93 /* left negative => less, left positiv 94 * equal is possible if both operands 95 if( Sgl_iszero_exponentmantissa(left) 96 && Sgl_iszero_exponentmantissa(right 97 { 98 Set_status_cbit(Equal(cond)); 99 } 100 else if( Sgl_isone_sign(left) ) 101 { 102 Set_status_cbit(Lessthan(cond)); 103 } 104 else 105 { 106 Set_status_cbit(Greaterthan(cond)) 107 } 108 } 109 /* Signs are the same. Treat negative num 110 * from the positives because of the rever 111 else if( Sgl_all(left) == Sgl_all(right) ) 112 { 113 Set_status_cbit(Equal(cond)); 114 } 115 else if( Sgl_iszero_sign(left) ) 116 { 117 /* Positive compare */ 118 if( Sgl_all(left) < Sgl_all(right) ) 119 { 120 Set_status_cbit(Lessthan(cond)); 121 } 122 else 123 { 124 Set_status_cbit(Greaterthan(cond)) 125 } 126 } 127 else 128 { 129 /* Negative compare. Signed or unsign 130 * both work the same. That distincti 131 * important when the sign bits differ 132 if( Sgl_all(left) > Sgl_all(right) ) 133 { 134 Set_status_cbit(Lessthan(cond)); 135 } 136 else 137 { 138 Set_status_cbit(Greaterthan(cond)) 139 } 140 } 141 return(NOEXCEPTION); 142 } 143
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.