1*a47a12beSStefan Roese /* 2*a47a12beSStefan Roese * Copyright (C) 2007 3*a47a12beSStefan Roese * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4*a47a12beSStefan Roese * 5*a47a12beSStefan Roese * See file CREDITS for list of people who contributed to this 6*a47a12beSStefan Roese * project. 7*a47a12beSStefan Roese * 8*a47a12beSStefan Roese * This program is free software; you can redistribute it and/or 9*a47a12beSStefan Roese * modify it under the terms of the GNU General Public License as 10*a47a12beSStefan Roese * published by the Free Software Foundation; either version 2 of 11*a47a12beSStefan Roese * the License, or (at your option) any later version. 12*a47a12beSStefan Roese * 13*a47a12beSStefan Roese * This program is distributed in the hope that it will be useful, 14*a47a12beSStefan Roese * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*a47a12beSStefan Roese * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*a47a12beSStefan Roese * GNU General Public License for more details. 17*a47a12beSStefan Roese * 18*a47a12beSStefan Roese * You should have received a copy of the GNU General Public License 19*a47a12beSStefan Roese * along with this program; if not, write to the Free Software 20*a47a12beSStefan Roese * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*a47a12beSStefan Roese * MA 02111-1307 USA 22*a47a12beSStefan Roese */ 23*a47a12beSStefan Roese /* 24*a47a12beSStefan Roese * Test for correctness of composite floating-point comparisons. 25*a47a12beSStefan Roese * Written by Paolo Bonzini, 26th May 2004. 26*a47a12beSStefan Roese * This file is originally a part of the GCC testsuite. 27*a47a12beSStefan Roese */ 28*a47a12beSStefan Roese 29*a47a12beSStefan Roese #include <common.h> 30*a47a12beSStefan Roese 31*a47a12beSStefan Roese #include <post.h> 32*a47a12beSStefan Roese 33*a47a12beSStefan Roese #if CONFIG_POST & CONFIG_SYS_POST_FPU 34*a47a12beSStefan Roese 35*a47a12beSStefan Roese GNU_FPOST_ATTR 36*a47a12beSStefan Roese 37*a47a12beSStefan Roese static int failed; 38*a47a12beSStefan Roese 39*a47a12beSStefan Roese #define TEST(c) if ((c) != ok) failed++ 40*a47a12beSStefan Roese #define ORD(a, b) (!__builtin_isunordered ((a), (b))) 41*a47a12beSStefan Roese #define UNORD(a, b) (__builtin_isunordered ((a), (b))) 42*a47a12beSStefan Roese #define UNEQ(a, b) (__builtin_isunordered ((a), (b)) || ((a) == (b))) 43*a47a12beSStefan Roese #define UNLT(a, b) (__builtin_isunordered ((a), (b)) || ((a) < (b))) 44*a47a12beSStefan Roese #define UNLE(a, b) (__builtin_isunordered ((a), (b)) || ((a) <= (b))) 45*a47a12beSStefan Roese #define UNGT(a, b) (__builtin_isunordered ((a), (b)) || ((a) > (b))) 46*a47a12beSStefan Roese #define UNGE(a, b) (__builtin_isunordered ((a), (b)) || ((a) >= (b))) 47*a47a12beSStefan Roese #define LTGT(a, b) (__builtin_islessgreater ((a), (b))) 48*a47a12beSStefan Roese 49*a47a12beSStefan Roese static float pinf; 50*a47a12beSStefan Roese static float ninf; 51*a47a12beSStefan Roese static float NaN; 52*a47a12beSStefan Roese 53*a47a12beSStefan Roese static void iuneq (float x, float y, int ok) 54*a47a12beSStefan Roese { 55*a47a12beSStefan Roese TEST (UNEQ (x, y)); 56*a47a12beSStefan Roese TEST (!LTGT (x, y)); 57*a47a12beSStefan Roese TEST (UNLE (x, y) && UNGE (x,y)); 58*a47a12beSStefan Roese } 59*a47a12beSStefan Roese 60*a47a12beSStefan Roese static void ieq (float x, float y, int ok) 61*a47a12beSStefan Roese { 62*a47a12beSStefan Roese TEST (ORD (x, y) && UNEQ (x, y)); 63*a47a12beSStefan Roese } 64*a47a12beSStefan Roese 65*a47a12beSStefan Roese static void iltgt (float x, float y, int ok) 66*a47a12beSStefan Roese { 67*a47a12beSStefan Roese TEST (!UNEQ (x, y)); /* Not optimizable. */ 68*a47a12beSStefan Roese TEST (LTGT (x, y)); /* Same, __builtin_islessgreater does not trap. */ 69*a47a12beSStefan Roese TEST (ORD (x, y) && (UNLT (x, y) || UNGT (x,y))); 70*a47a12beSStefan Roese } 71*a47a12beSStefan Roese 72*a47a12beSStefan Roese static void ine (float x, float y, int ok) 73*a47a12beSStefan Roese { 74*a47a12beSStefan Roese TEST (UNLT (x, y) || UNGT (x, y)); 75*a47a12beSStefan Roese } 76*a47a12beSStefan Roese 77*a47a12beSStefan Roese static void iunlt (float x, float y, int ok) 78*a47a12beSStefan Roese { 79*a47a12beSStefan Roese TEST (UNLT (x, y)); 80*a47a12beSStefan Roese TEST (UNORD (x, y) || (x < y)); 81*a47a12beSStefan Roese } 82*a47a12beSStefan Roese 83*a47a12beSStefan Roese static void ilt (float x, float y, int ok) 84*a47a12beSStefan Roese { 85*a47a12beSStefan Roese TEST (ORD (x, y) && UNLT (x, y)); /* Not optimized */ 86*a47a12beSStefan Roese TEST ((x <= y) && (x != y)); 87*a47a12beSStefan Roese TEST ((x <= y) && (y != x)); 88*a47a12beSStefan Roese TEST ((x != y) && (x <= y)); /* Not optimized */ 89*a47a12beSStefan Roese TEST ((y != x) && (x <= y)); /* Not optimized */ 90*a47a12beSStefan Roese } 91*a47a12beSStefan Roese 92*a47a12beSStefan Roese static void iunle (float x, float y, int ok) 93*a47a12beSStefan Roese { 94*a47a12beSStefan Roese TEST (UNLE (x, y)); 95*a47a12beSStefan Roese TEST (UNORD (x, y) || (x <= y)); 96*a47a12beSStefan Roese } 97*a47a12beSStefan Roese 98*a47a12beSStefan Roese static void ile (float x, float y, int ok) 99*a47a12beSStefan Roese { 100*a47a12beSStefan Roese TEST (ORD (x, y) && UNLE (x, y)); /* Not optimized */ 101*a47a12beSStefan Roese TEST ((x < y) || (x == y)); 102*a47a12beSStefan Roese TEST ((y > x) || (x == y)); 103*a47a12beSStefan Roese TEST ((x == y) || (x < y)); /* Not optimized */ 104*a47a12beSStefan Roese TEST ((y == x) || (x < y)); /* Not optimized */ 105*a47a12beSStefan Roese } 106*a47a12beSStefan Roese 107*a47a12beSStefan Roese static void iungt (float x, float y, int ok) 108*a47a12beSStefan Roese { 109*a47a12beSStefan Roese TEST (UNGT (x, y)); 110*a47a12beSStefan Roese TEST (UNORD (x, y) || (x > y)); 111*a47a12beSStefan Roese } 112*a47a12beSStefan Roese 113*a47a12beSStefan Roese static void igt (float x, float y, int ok) 114*a47a12beSStefan Roese { 115*a47a12beSStefan Roese TEST (ORD (x, y) && UNGT (x, y)); /* Not optimized */ 116*a47a12beSStefan Roese TEST ((x >= y) && (x != y)); 117*a47a12beSStefan Roese TEST ((x >= y) && (y != x)); 118*a47a12beSStefan Roese TEST ((x != y) && (x >= y)); /* Not optimized */ 119*a47a12beSStefan Roese TEST ((y != x) && (x >= y)); /* Not optimized */ 120*a47a12beSStefan Roese } 121*a47a12beSStefan Roese 122*a47a12beSStefan Roese static void iunge (float x, float y, int ok) 123*a47a12beSStefan Roese { 124*a47a12beSStefan Roese TEST (UNGE (x, y)); 125*a47a12beSStefan Roese TEST (UNORD (x, y) || (x >= y)); 126*a47a12beSStefan Roese } 127*a47a12beSStefan Roese 128*a47a12beSStefan Roese static void ige (float x, float y, int ok) 129*a47a12beSStefan Roese { 130*a47a12beSStefan Roese TEST (ORD (x, y) && UNGE (x, y)); /* Not optimized */ 131*a47a12beSStefan Roese TEST ((x > y) || (x == y)); 132*a47a12beSStefan Roese TEST ((y < x) || (x == y)); 133*a47a12beSStefan Roese TEST ((x == y) || (x > y)); /* Not optimized */ 134*a47a12beSStefan Roese TEST ((y == x) || (x > y)); /* Not optimized */ 135*a47a12beSStefan Roese } 136*a47a12beSStefan Roese 137*a47a12beSStefan Roese int fpu_post_test_math6 (void) 138*a47a12beSStefan Roese { 139*a47a12beSStefan Roese pinf = __builtin_inf (); 140*a47a12beSStefan Roese ninf = -__builtin_inf (); 141*a47a12beSStefan Roese NaN = __builtin_nan (""); 142*a47a12beSStefan Roese 143*a47a12beSStefan Roese iuneq (ninf, pinf, 0); 144*a47a12beSStefan Roese iuneq (NaN, NaN, 1); 145*a47a12beSStefan Roese iuneq (pinf, ninf, 0); 146*a47a12beSStefan Roese iuneq (1, 4, 0); 147*a47a12beSStefan Roese iuneq (3, 3, 1); 148*a47a12beSStefan Roese iuneq (5, 2, 0); 149*a47a12beSStefan Roese 150*a47a12beSStefan Roese ieq (1, 4, 0); 151*a47a12beSStefan Roese ieq (3, 3, 1); 152*a47a12beSStefan Roese ieq (5, 2, 0); 153*a47a12beSStefan Roese 154*a47a12beSStefan Roese iltgt (ninf, pinf, 1); 155*a47a12beSStefan Roese iltgt (NaN, NaN, 0); 156*a47a12beSStefan Roese iltgt (pinf, ninf, 1); 157*a47a12beSStefan Roese iltgt (1, 4, 1); 158*a47a12beSStefan Roese iltgt (3, 3, 0); 159*a47a12beSStefan Roese iltgt (5, 2, 1); 160*a47a12beSStefan Roese 161*a47a12beSStefan Roese ine (1, 4, 1); 162*a47a12beSStefan Roese ine (3, 3, 0); 163*a47a12beSStefan Roese ine (5, 2, 1); 164*a47a12beSStefan Roese 165*a47a12beSStefan Roese iunlt (NaN, ninf, 1); 166*a47a12beSStefan Roese iunlt (pinf, NaN, 1); 167*a47a12beSStefan Roese iunlt (pinf, ninf, 0); 168*a47a12beSStefan Roese iunlt (pinf, pinf, 0); 169*a47a12beSStefan Roese iunlt (ninf, ninf, 0); 170*a47a12beSStefan Roese iunlt (1, 4, 1); 171*a47a12beSStefan Roese iunlt (3, 3, 0); 172*a47a12beSStefan Roese iunlt (5, 2, 0); 173*a47a12beSStefan Roese 174*a47a12beSStefan Roese ilt (1, 4, 1); 175*a47a12beSStefan Roese ilt (3, 3, 0); 176*a47a12beSStefan Roese ilt (5, 2, 0); 177*a47a12beSStefan Roese 178*a47a12beSStefan Roese iunle (NaN, ninf, 1); 179*a47a12beSStefan Roese iunle (pinf, NaN, 1); 180*a47a12beSStefan Roese iunle (pinf, ninf, 0); 181*a47a12beSStefan Roese iunle (pinf, pinf, 1); 182*a47a12beSStefan Roese iunle (ninf, ninf, 1); 183*a47a12beSStefan Roese iunle (1, 4, 1); 184*a47a12beSStefan Roese iunle (3, 3, 1); 185*a47a12beSStefan Roese iunle (5, 2, 0); 186*a47a12beSStefan Roese 187*a47a12beSStefan Roese ile (1, 4, 1); 188*a47a12beSStefan Roese ile (3, 3, 1); 189*a47a12beSStefan Roese ile (5, 2, 0); 190*a47a12beSStefan Roese 191*a47a12beSStefan Roese iungt (NaN, ninf, 1); 192*a47a12beSStefan Roese iungt (pinf, NaN, 1); 193*a47a12beSStefan Roese iungt (pinf, ninf, 1); 194*a47a12beSStefan Roese iungt (pinf, pinf, 0); 195*a47a12beSStefan Roese iungt (ninf, ninf, 0); 196*a47a12beSStefan Roese iungt (1, 4, 0); 197*a47a12beSStefan Roese iungt (3, 3, 0); 198*a47a12beSStefan Roese iungt (5, 2, 1); 199*a47a12beSStefan Roese 200*a47a12beSStefan Roese igt (1, 4, 0); 201*a47a12beSStefan Roese igt (3, 3, 0); 202*a47a12beSStefan Roese igt (5, 2, 1); 203*a47a12beSStefan Roese 204*a47a12beSStefan Roese iunge (NaN, ninf, 1); 205*a47a12beSStefan Roese iunge (pinf, NaN, 1); 206*a47a12beSStefan Roese iunge (ninf, pinf, 0); 207*a47a12beSStefan Roese iunge (pinf, pinf, 1); 208*a47a12beSStefan Roese iunge (ninf, ninf, 1); 209*a47a12beSStefan Roese iunge (1, 4, 0); 210*a47a12beSStefan Roese iunge (3, 3, 1); 211*a47a12beSStefan Roese iunge (5, 2, 1); 212*a47a12beSStefan Roese 213*a47a12beSStefan Roese ige (1, 4, 0); 214*a47a12beSStefan Roese ige (3, 3, 1); 215*a47a12beSStefan Roese ige (5, 2, 1); 216*a47a12beSStefan Roese 217*a47a12beSStefan Roese if (failed) { 218*a47a12beSStefan Roese post_log ("Error in FPU math6 test\n"); 219*a47a12beSStefan Roese return -1; 220*a47a12beSStefan Roese } 221*a47a12beSStefan Roese return 0; 222*a47a12beSStefan Roese } 223*a47a12beSStefan Roese 224*a47a12beSStefan Roese #endif /* CONFIG_POST & CONFIG_SYS_POST_FPU */ 225