github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpn/t-iord_u.c (about) 1 /* Test MPN_INCR_U and MPN_DECR_U. 2 3 Copyright 2001, 2002 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 23 #include "gmp.h" 24 #include "gmp-impl.h" 25 #include "tests.h" 26 27 28 /* The i386 MPN_INCR_U and MPN_DECR_U have special cases for "n" being a 29 compile-time constant 1, so that's exercised explicitly. */ 30 31 32 #define M GMP_NUMB_MAX 33 #define SIZE ((mp_size_t) 10) 34 35 36 void 37 check_one (const char *name, int i, 38 mp_srcptr src, mp_limb_t n, 39 mp_srcptr got, mp_srcptr want, mp_size_t size) 40 { 41 if (! refmpn_equal_anynail (got, want, size)) 42 { 43 printf ("Wrong at %s i=%d\n", name, i); 44 mpn_trace (" src", src, size); 45 mpn_trace (" n", &n, (mp_size_t) 1); 46 mpn_trace (" got", got, size); 47 mpn_trace (" want", want, size); 48 abort (); 49 } 50 } 51 52 53 void 54 check_incr_data (void) 55 { 56 static const struct { 57 mp_limb_t n; 58 const mp_limb_t src[SIZE]; 59 const mp_limb_t want[SIZE]; 60 } data[] = { 61 { 1, { 0 }, { 1 } }, 62 { 1, { 123 }, { 124 } }, 63 { 2, { 0 }, { 2 } }, 64 { 2, { 123 }, { 125 } }, 65 { M, { 0 }, { M } }, 66 67 { 1, { M, 0 }, { 0, 1 } }, 68 { 1, { M, 123 }, { 0, 124 } }, 69 { 2, { M, 0 }, { 1, 1 } }, 70 { 2, { M, 123 }, { 1, 124 } }, 71 { M, { M, 0 }, { M-1, 1 } }, 72 { M, { M, 123 }, { M-1, 124 } }, 73 74 { 1, { M, M, 0 }, { 0, 0, 1 } }, 75 { 1, { M, M, 123 }, { 0, 0, 124 } }, 76 { 2, { M, M, 0 }, { 1, 0, 1 } }, 77 { 2, { M, M, 123 }, { 1, 0, 124 } }, 78 { M, { M, M, 0 }, { M-1, 0, 1 } }, 79 { M, { M, M, 123 }, { M-1, 0, 124 } }, 80 81 { 1, { M, M, M, 0 }, { 0, 0, 0, 1 } }, 82 { 1, { M, M, M, 123 }, { 0, 0, 0, 124 } }, 83 { 2, { M, M, M, 0 }, { 1, 0, 0, 1 } }, 84 { 2, { M, M, M, 123 }, { 1, 0, 0, 124 } }, 85 { M, { M, M, M, 0 }, { M-1, 0, 0, 1 } }, 86 { M, { M, M, M, 123 }, { M-1, 0, 0, 124 } }, 87 88 { 1, { M, M, M, M, 0 }, { 0, 0, 0, 0, 1 } }, 89 { 1, { M, M, M, M, 123 }, { 0, 0, 0, 0, 124 } }, 90 { 2, { M, M, M, M, 0 }, { 1, 0, 0, 0, 1 } }, 91 { 2, { M, M, M, M, 123 }, { 1, 0, 0, 0, 124 } }, 92 { M, { M, M, M, M, 0 }, { M-1, 0, 0, 0, 1 } }, 93 { M, { M, M, M, M, 123 }, { M-1, 0, 0, 0, 124 94 #if defined (__hpux) && ! defined (__GNUC__) 95 /* Some versions (at least HP92453-01 B.11.11.23709.GP) of the 96 HP C compilers fail to zero-fill aggregates as the ISO C standard 97 requires (cf 6.5.7 Initialization). Compensate here: */ 98 , 0, 0, 0, 0, 0 99 #endif 100 } } 101 }; 102 103 mp_limb_t got[SIZE]; 104 int i; 105 106 for (i = 0; i < numberof (data); i++) 107 { 108 refmpn_copyi (got, data[i].src, SIZE); 109 MPN_INCR_U (got, SIZE, data[i].n); 110 check_one ("check_incr (general)", i, 111 data[i].src, data[i].n, 112 got, data[i].want, SIZE); 113 114 if (data[i].n == 1) 115 { 116 refmpn_copyi (got, data[i].src, SIZE); 117 MPN_INCR_U (got, SIZE, CNST_LIMB(1)); 118 check_one ("check_incr (const 1)", i, 119 data[i].src, data[i].n, 120 got, data[i].want, SIZE); 121 } 122 } 123 } 124 125 void 126 check_decr_data (void) 127 { 128 static const struct { 129 mp_limb_t n; 130 const mp_limb_t src[SIZE]; 131 const mp_limb_t want[SIZE]; 132 } data[] = { 133 { 1, { 1 }, { 0 } }, 134 { 1, { 123 }, { 122 } }, 135 { 1, { M }, { M-1 } }, 136 { 2, { 2 }, { 0 } }, 137 { 2, { 123 }, { 121 } }, 138 { M, { M }, { 0 } }, 139 { M-1, { M }, { 1 } }, 140 141 { 1, { 0, 1 }, { M, 0 } }, 142 { 1, { 0, 123 }, { M, 122 } }, 143 { 1, { 0, M }, { M, M-1 } }, 144 { 2, { 0, 123 }, { M-1, 122 } }, 145 { 2, { 1, 123 }, { M, 122 } }, 146 { M, { 0, 123 }, { 1, 122 } }, 147 { M, { M-1, M }, { M, M-1 } }, 148 149 { 1, { 0, 0, 1 }, { M, M, 0 } }, 150 { 1, { 0, 0, 123 }, { M, M, 122 } }, 151 { 1, { 0, 0, M }, { M, M, M-1 } }, 152 { 2, { 0, 0, 123 }, { M-1, M, 122 } }, 153 { 2, { 1, 0, 123 }, { M, M, 122 } }, 154 { M, { 0, 0, 123 }, { 1, M, 122 } }, 155 { M, { M-1, 0, M }, { M, M, M-1 } }, 156 157 { 1, { 0, 0, 0, 1 }, { M, M, M, 0 } }, 158 { 1, { 0, 0, 0, 123 }, { M, M, M, 122 } }, 159 { 1, { 0, 0, 0, M }, { M, M, M, M-1 } }, 160 { 2, { 0, 0, 0, 123 }, { M-1, M, M, 122 } }, 161 { 2, { 1, 0, 0, 123 }, { M, M, M, 122 } }, 162 { M, { 0, 0, 0, 123 }, { 1, M, M, 122 } }, 163 { M, { M-1, 0, 0, M }, { M, M, M, M-1 } }, 164 165 { 1, { 0, 0, 0, 0, 1 }, { M, M, M, M, 0 } }, 166 { 1, { 0, 0, 0, 0, 123 }, { M, M, M, M, 122 } }, 167 { 1, { 0, 0, 0, 0, M }, { M, M, M, M, M-1 } }, 168 { 2, { 0, 0, 0, 0, 123 }, { M-1, M, M, M, 122 } }, 169 { 2, { 1, 0, 0, 0, 123 }, { M, M, M, M, 122 } }, 170 { M, { 0, 0, 0, 0, 123 }, { 1, M, M, M, 122 } }, 171 { M, { M-1, 0, 0, 0, M }, { M, M, M, M, M-1 } }, 172 173 { 1, { 0, 0, 0, 0, 0, 1 }, { M, M, M, M, M, 0 } }, 174 { 1, { 0, 0, 0, 0, 0, 123 }, { M, M, M, M, M, 122 } }, 175 { 1, { 0, 0, 0, 0, 0, M }, { M, M, M, M, M, M-1 } }, 176 { 2, { 0, 0, 0, 0, 0, 123 }, { M-1, M, M, M, M, 122 } }, 177 { 2, { 1, 0, 0, 0, 0, 123 }, { M, M, M, M, M, 122 } }, 178 { M, { 0, 0, 0, 0, 0, 123 }, { 1, M, M, M, M, 122 } }, 179 { M, { M-1, 0, 0, 0, 0, M }, { M, M, M, M, M, M-1 180 #if defined (__hpux) && ! defined (__GNUC__) 181 /* For explanation of this garbage, see previous function. */ 182 , 0, 0, 0, 0 183 #endif 184 } } 185 }; 186 187 mp_limb_t got[SIZE]; 188 int i; 189 190 for (i = 0; i < numberof (data); i++) 191 { 192 refmpn_copyi (got, data[i].src, SIZE); 193 MPN_DECR_U (got, SIZE, data[i].n); 194 check_one ("check_decr_data", i, 195 data[i].src, data[i].n, 196 got, data[i].want, SIZE); 197 198 if (data[i].n == 1) 199 { 200 refmpn_copyi (got, data[i].src, SIZE); 201 MPN_DECR_U (got, SIZE, CNST_LIMB(1)); 202 check_one ("check_decr (const 1)", i, 203 data[i].src, data[i].n, 204 got, data[i].want, SIZE); 205 } 206 } 207 } 208 209 210 int 211 main (void) 212 { 213 tests_start (); 214 mp_trace_base = -16; 215 216 check_incr_data (); 217 check_decr_data (); 218 219 tests_end (); 220 exit (0); 221 }