github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpn/t-instrument.c (about) 1 /* Test assembler support for --enable-profiling=instrument. 2 3 Copyright 2002, 2003 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 #include "gmp.h" 23 #include "gmp-impl.h" 24 #include "longlong.h" 25 #include "tests.h" 26 27 28 #if WANT_PROFILING_INSTRUMENT 29 30 /* This program exercises each mpn routine that might be implemented in 31 assembler. It ensures the __cyg_profile_func_enter and exit calls have 32 come out right, and that in the x86 code "ret_internal" is correctly used 33 for PIC setups. */ 34 35 36 /* Changes to enter_seen done by __cyg_profile_func_enter are essentially 37 unknown to the optimizer, so must use volatile. */ 38 volatile int enter_seen; 39 40 /* Dummy used to stop various calls going dead. */ 41 unsigned long notdead; 42 43 const char *name = "<none>"; 44 int old_ncall; 45 46 struct { 47 void *this_fn; 48 void *call_site; 49 } call[100]; 50 int ncall; 51 52 53 void __cyg_profile_func_enter (void *, void *) 54 __attribute__ ((no_instrument_function)); 55 56 void 57 __cyg_profile_func_enter (void *this_fn, void *call_site) 58 { 59 #if 0 60 printf ("%24s %p %p\n", name, this_fn, call_site); 61 #endif 62 ASSERT_ALWAYS (ncall >= 0); 63 ASSERT_ALWAYS (ncall <= numberof (call)); 64 65 if (ncall >= numberof (call)) 66 { 67 printf ("__cyg_profile_func_enter: oops, call stack full, from %s\n", name); 68 abort (); 69 } 70 71 enter_seen = 1; 72 call[ncall].this_fn = this_fn; 73 call[ncall].call_site = call_site; 74 ncall++; 75 } 76 77 void __cyg_profile_func_exit (void *, void *) 78 __attribute__ ((no_instrument_function)); 79 80 void 81 __cyg_profile_func_exit (void *this_fn, void *call_site) 82 { 83 ASSERT_ALWAYS (ncall >= 0); 84 ASSERT_ALWAYS (ncall <= numberof (call)); 85 86 if (ncall == 0) 87 { 88 printf ("__cyg_profile_func_exit: call stack empty, from %s\n", name); 89 abort (); 90 } 91 92 ncall--; 93 if (this_fn != call[ncall].this_fn || call_site != call[ncall].call_site) 94 { 95 printf ("__cyg_profile_func_exit: unbalanced this_fn/call_site from %s\n", name); 96 printf (" this_fn got %p\n", this_fn); 97 printf (" want %p\n", call[ncall].this_fn); 98 printf (" call_site got %p\n", call_site); 99 printf (" want %p\n", call[ncall].call_site); 100 abort (); 101 } 102 } 103 104 105 void 106 pre (const char *str) 107 { 108 name = str; 109 enter_seen = 0; 110 old_ncall = ncall; 111 } 112 113 void 114 post (void) 115 { 116 if (! enter_seen) 117 { 118 printf ("did not reach __cyg_profile_func_enter from %s\n", name); 119 abort (); 120 } 121 122 if (ncall != old_ncall) 123 { 124 printf ("unbalance enter/exit calls from %s\n", name); 125 printf (" ncall %d\n", ncall); 126 printf (" old_ncall %d\n", old_ncall); 127 abort (); 128 } 129 } 130 131 void 132 check (void) 133 { 134 mp_limb_t wp[100], xp[100], yp[100]; 135 mp_size_t size = 100; 136 137 refmpn_zero (xp, size); 138 refmpn_zero (yp, size); 139 refmpn_zero (wp, size); 140 141 pre ("mpn_add_n"); 142 mpn_add_n (wp, xp, yp, size); 143 post (); 144 145 #if HAVE_NATIVE_mpn_add_nc 146 pre ("mpn_add_nc"); 147 mpn_add_nc (wp, xp, yp, size, CNST_LIMB(0)); 148 post (); 149 #endif 150 151 #if HAVE_NATIVE_mpn_addlsh1_n 152 pre ("mpn_addlsh1_n"); 153 mpn_addlsh1_n (wp, xp, yp, size); 154 post (); 155 #endif 156 157 #if HAVE_NATIVE_mpn_and_n 158 pre ("mpn_and_n"); 159 mpn_and_n (wp, xp, yp, size); 160 post (); 161 #endif 162 163 #if HAVE_NATIVE_mpn_andn_n 164 pre ("mpn_andn_n"); 165 mpn_andn_n (wp, xp, yp, size); 166 post (); 167 #endif 168 169 pre ("mpn_addmul_1"); 170 mpn_addmul_1 (wp, xp, size, yp[0]); 171 post (); 172 173 #if HAVE_NATIVE_mpn_addmul_1c 174 pre ("mpn_addmul_1c"); 175 mpn_addmul_1c (wp, xp, size, yp[0], CNST_LIMB(0)); 176 post (); 177 #endif 178 179 #if HAVE_NATIVE_mpn_com 180 pre ("mpn_com"); 181 mpn_com (wp, xp, size); 182 post (); 183 #endif 184 185 #if HAVE_NATIVE_mpn_copyd 186 pre ("mpn_copyd"); 187 mpn_copyd (wp, xp, size); 188 post (); 189 #endif 190 191 #if HAVE_NATIVE_mpn_copyi 192 pre ("mpn_copyi"); 193 mpn_copyi (wp, xp, size); 194 post (); 195 #endif 196 197 pre ("mpn_divexact_1"); 198 mpn_divexact_1 (wp, xp, size, CNST_LIMB(123)); 199 post (); 200 201 pre ("mpn_divexact_by3c"); 202 mpn_divexact_by3c (wp, xp, size, CNST_LIMB(0)); 203 post (); 204 205 pre ("mpn_divrem_1"); 206 mpn_divrem_1 (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123)); 207 post (); 208 209 #if HAVE_NATIVE_mpn_divrem_1c 210 pre ("mpn_divrem_1c"); 211 mpn_divrem_1c (wp, (mp_size_t) 0, xp, size, CNST_LIMB(123), CNST_LIMB(122)); 212 post (); 213 #endif 214 215 pre ("mpn_gcd_1"); 216 xp[0] |= 1; 217 notdead += (unsigned long) mpn_gcd_1 (xp, size, CNST_LIMB(123)); 218 post (); 219 220 pre ("mpn_hamdist"); 221 notdead += mpn_hamdist (xp, yp, size); 222 post (); 223 224 #if HAVE_NATIVE_mpn_ior_n 225 pre ("mpn_ior_n"); 226 mpn_ior_n (wp, xp, yp, size); 227 post (); 228 #endif 229 230 #if HAVE_NATIVE_mpn_iorn_n 231 pre ("mpn_iorn_n"); 232 mpn_iorn_n (wp, xp, yp, size); 233 post (); 234 #endif 235 236 pre ("mpn_lshift"); 237 mpn_lshift (wp, xp, size, 1); 238 post (); 239 240 pre ("mpn_mod_1"); 241 notdead += mpn_mod_1 (xp, size, CNST_LIMB(123)); 242 post (); 243 244 #if HAVE_NATIVE_mpn_mod_1c 245 pre ("mpn_mod_1c"); 246 notdead += mpn_mod_1c (xp, size, CNST_LIMB(123), CNST_LIMB(122)); 247 post (); 248 #endif 249 250 #if GMP_NUMB_BITS % 4 == 0 251 pre ("mpn_mod_34lsub1"); 252 notdead += mpn_mod_34lsub1 (xp, size); 253 post (); 254 #endif 255 256 pre ("mpn_modexact_1_odd"); 257 notdead += mpn_modexact_1_odd (xp, size, CNST_LIMB(123)); 258 post (); 259 260 pre ("mpn_modexact_1c_odd"); 261 notdead += mpn_modexact_1c_odd (xp, size, CNST_LIMB(123), CNST_LIMB(456)); 262 post (); 263 264 pre ("mpn_mul_1"); 265 mpn_mul_1 (wp, xp, size, yp[0]); 266 post (); 267 268 #if HAVE_NATIVE_mpn_mul_1c 269 pre ("mpn_mul_1c"); 270 mpn_mul_1c (wp, xp, size, yp[0], CNST_LIMB(0)); 271 post (); 272 #endif 273 274 #if HAVE_NATIVE_mpn_mul_2 275 pre ("mpn_mul_2"); 276 mpn_mul_2 (wp, xp, size-1, yp); 277 post (); 278 #endif 279 280 pre ("mpn_mul_basecase"); 281 mpn_mul_basecase (wp, xp, (mp_size_t) 3, yp, (mp_size_t) 3); 282 post (); 283 284 #if HAVE_NATIVE_mpn_nand_n 285 pre ("mpn_nand_n"); 286 mpn_nand_n (wp, xp, yp, size); 287 post (); 288 #endif 289 290 #if HAVE_NATIVE_mpn_nior_n 291 pre ("mpn_nior_n"); 292 mpn_nior_n (wp, xp, yp, size); 293 post (); 294 #endif 295 296 pre ("mpn_popcount"); 297 notdead += mpn_popcount (xp, size); 298 post (); 299 300 pre ("mpn_preinv_mod_1"); 301 notdead += mpn_preinv_mod_1 (xp, size, GMP_NUMB_MAX, 302 refmpn_invert_limb (GMP_NUMB_MAX)); 303 post (); 304 305 #if USE_PREINV_DIVREM_1 || HAVE_NATIVE_mpn_preinv_divrem_1 306 pre ("mpn_preinv_divrem_1"); 307 mpn_preinv_divrem_1 (wp, (mp_size_t) 0, xp, size, GMP_NUMB_MAX, 308 refmpn_invert_limb (GMP_NUMB_MAX), 0); 309 post (); 310 #endif 311 312 #if HAVE_NATIVE_mpn_rsh1add_n 313 pre ("mpn_rsh1add_n"); 314 mpn_rsh1add_n (wp, xp, yp, size); 315 post (); 316 #endif 317 318 #if HAVE_NATIVE_mpn_rsh1sub_n 319 pre ("mpn_rsh1sub_n"); 320 mpn_rsh1sub_n (wp, xp, yp, size); 321 post (); 322 #endif 323 324 pre ("mpn_rshift"); 325 mpn_rshift (wp, xp, size, 1); 326 post (); 327 328 pre ("mpn_sqr_basecase"); 329 mpn_sqr_basecase (wp, xp, (mp_size_t) 3); 330 post (); 331 332 pre ("mpn_submul_1"); 333 mpn_submul_1 (wp, xp, size, yp[0]); 334 post (); 335 336 #if HAVE_NATIVE_mpn_submul_1c 337 pre ("mpn_submul_1c"); 338 mpn_submul_1c (wp, xp, size, yp[0], CNST_LIMB(0)); 339 post (); 340 #endif 341 342 pre ("mpn_sub_n"); 343 mpn_sub_n (wp, xp, yp, size); 344 post (); 345 346 #if HAVE_NATIVE_mpn_sub_nc 347 pre ("mpn_sub_nc"); 348 mpn_sub_nc (wp, xp, yp, size, CNST_LIMB(0)); 349 post (); 350 #endif 351 352 #if HAVE_NATIVE_mpn_sublsh1_n 353 pre ("mpn_sublsh1_n"); 354 mpn_sublsh1_n (wp, xp, yp, size); 355 post (); 356 #endif 357 358 #if HAVE_NATIVE_mpn_udiv_qrnnd 359 pre ("mpn_udiv_qrnnd"); 360 mpn_udiv_qrnnd (&wp[0], CNST_LIMB(122), xp[0], CNST_LIMB(123)); 361 post (); 362 #endif 363 364 #if HAVE_NATIVE_mpn_udiv_qrnnd_r 365 pre ("mpn_udiv_qrnnd_r"); 366 mpn_udiv_qrnnd (CNST_LIMB(122), xp[0], CNST_LIMB(123), &wp[0]); 367 post (); 368 #endif 369 370 #if HAVE_NATIVE_mpn_umul_ppmm 371 pre ("mpn_umul_ppmm"); 372 mpn_umul_ppmm (&wp[0], xp[0], yp[0]); 373 post (); 374 #endif 375 376 #if HAVE_NATIVE_mpn_umul_ppmm_r 377 pre ("mpn_umul_ppmm_r"); 378 mpn_umul_ppmm_r (&wp[0], xp[0], yp[0]); 379 post (); 380 #endif 381 382 #if HAVE_NATIVE_mpn_xor_n 383 pre ("mpn_xor_n"); 384 mpn_xor_n (wp, xp, yp, size); 385 post (); 386 #endif 387 388 #if HAVE_NATIVE_mpn_xnor_n 389 pre ("mpn_xnor_n"); 390 mpn_xnor_n (wp, xp, yp, size); 391 post (); 392 #endif 393 } 394 395 396 int 397 main (void) 398 { 399 tests_start (); 400 401 check (); 402 403 tests_end (); 404 exit (0); 405 } 406 407 408 #else /* ! WANT_PROFILING_INSTRUMENT */ 409 410 int 411 main (void) 412 { 413 exit (0); 414 } 415 416 #endif