Annotation of OpenXM_contrib/gmp/tests/mpn/t-aors_1.c, Revision 1.1
1.1 ! ohara 1: /* Test mpn_add_1 and mpn_sub_1.
! 2:
! 3: Copyright 2001, 2002 Free Software Foundation, Inc.
! 4:
! 5: This file is part of the GNU MP Library.
! 6:
! 7: The GNU MP Library is free software; you can redistribute it and/or modify
! 8: it under the terms of the GNU Lesser General Public License as published by
! 9: the Free Software Foundation; either version 2.1 of the License, or (at your
! 10: option) any later version.
! 11:
! 12: The GNU MP Library is distributed in the hope that it will be useful, but
! 13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
! 15: License for more details.
! 16:
! 17: You should have received a copy of the GNU Lesser General Public License
! 18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 20: MA 02111-1307, USA.
! 21: */
! 22:
! 23: #include <stdio.h>
! 24: #include <stdlib.h>
! 25:
! 26: #include "gmp.h"
! 27: #include "gmp-impl.h"
! 28: #include "tests.h"
! 29:
! 30:
! 31: #define M GMP_NUMB_MAX
! 32: #define ASIZE 10
! 33: #define MAGIC 0x1234
! 34:
! 35: #define SETUP() \
! 36: do { \
! 37: refmpn_random (got, data[i].size); \
! 38: got[data[i].size] = MAGIC; \
! 39: } while (0)
! 40:
! 41: #define SETUP_INPLACE() \
! 42: do { \
! 43: refmpn_copyi (got, data[i].src, data[i].size); \
! 44: got[data[i].size] = MAGIC; \
! 45: } while (0)
! 46:
! 47: #define VERIFY(name) \
! 48: do { \
! 49: verify (name, i, data[i].src, data[i].n, \
! 50: got_c, data[i].want_c, \
! 51: got, data[i].want, data[i].size); \
! 52: } while (0)
! 53:
! 54: typedef mp_limb_t (*mpn_aors_1_t)
! 55: _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
! 56: mpn_aors_1_t fudge _PROTO ((mpn_aors_1_t));
! 57:
! 58:
! 59: void
! 60: verify (const char *name, int i,
! 61: mp_srcptr src, mp_limb_t n,
! 62: mp_limb_t got_c, mp_limb_t want_c,
! 63: mp_srcptr got, mp_srcptr want, mp_size_t size)
! 64: {
! 65: if (got[size] != MAGIC)
! 66: {
! 67: printf ("Overwrite at %s i=%d\n", name, i);
! 68: abort ();
! 69: }
! 70:
! 71: if (got_c != want_c || ! refmpn_equal_anynail (got, want, size))
! 72: {
! 73: printf ("Wrong at %s i=%d size=%ld\n", name, i, size);
! 74: mpn_trace (" src", src, size);
! 75: mpn_trace (" n", &n, (mp_size_t) 1);
! 76: mpn_trace (" got", got, size);
! 77: mpn_trace (" want", want, size);
! 78: mpn_trace (" got c", &got_c, (mp_size_t) 1);
! 79: mpn_trace ("want c", &want_c, (mp_size_t) 1);
! 80: abort ();
! 81: }
! 82: }
! 83:
! 84:
! 85: void
! 86: check_add_1 (void)
! 87: {
! 88: static const struct {
! 89: mp_size_t size;
! 90: mp_limb_t n;
! 91: const mp_limb_t src[ASIZE];
! 92: mp_limb_t want_c;
! 93: const mp_limb_t want[ASIZE];
! 94: } data[] = {
! 95: { 1, 0, { 0 }, 0, { 0 } },
! 96: { 1, 0, { 1 }, 0, { 1 } },
! 97: { 1, 1, { 0 }, 0, { 1 } },
! 98: { 1, 0, { M }, 0, { M } },
! 99: { 1, M, { 0 }, 0, { M } },
! 100: { 1, 1, { 123 }, 0, { 124 } },
! 101:
! 102: { 1, 1, { M }, 1, { 0 } },
! 103: { 1, M, { 1 }, 1, { 0 } },
! 104: { 1, M, { M }, 1, { M-1 } },
! 105:
! 106: { 2, 0, { 0, 0 }, 0, { 0, 0 } },
! 107: { 2, 0, { 1, 0 }, 0, { 1, 0 } },
! 108: { 2, 1, { 0, 0 }, 0, { 1, 0 } },
! 109: { 2, 0, { M, 0 }, 0, { M, 0 } },
! 110: { 2, M, { 0, 0 }, 0, { M, 0 } },
! 111: { 2, 1, { M, 0 }, 0, { 0, 1 } },
! 112: { 2, M, { 1, 0 }, 0, { 0, 1 } },
! 113: { 2, M, { M, 0 }, 0, { M-1, 1 } },
! 114: { 2, M, { M, 0 }, 0, { M-1, 1 } },
! 115:
! 116: { 2, 1, { M, M }, 1, { 0, 0 } },
! 117: { 2, M, { 1, M }, 1, { 0, 0 } },
! 118: { 2, M, { M, M }, 1, { M-1, 0 } },
! 119: { 2, M, { M, M }, 1, { M-1, 0 } },
! 120:
! 121: { 3, 1, { M, M, M }, 1, { 0, 0, 0 } },
! 122: { 3, M, { 1, M, M }, 1, { 0, 0, 0 } },
! 123: { 3, M, { M, M, M }, 1, { M-1, 0, 0 } },
! 124: { 3, M, { M, M, M }, 1, { M-1, 0, 0 } },
! 125:
! 126: { 4, 1, { M, M, M, M }, 1, { 0, 0, 0, 0 } },
! 127: { 4, M, { 1, M, M, M }, 1, { 0, 0, 0, 0 } },
! 128: { 4, M, { M, M, M, M }, 1, { M-1, 0, 0, 0 } },
! 129: { 4, M, { M, M, M, M }, 1, { M-1, 0, 0, 0 } },
! 130:
! 131: { 4, M, { M, 0, M, M }, 0, { M-1, 1, M, M } },
! 132: { 4, M, { M, M-1, M, M }, 0, { M-1, M, M, M } },
! 133:
! 134: { 4, M, { M, M, 0, M }, 0, { M-1, 0, 1, M } },
! 135: { 4, M, { M, M, M-1, M }, 0, { M-1, 0, M, M } },
! 136: };
! 137:
! 138: mp_limb_t got[ASIZE];
! 139: mp_limb_t got_c;
! 140: int i;
! 141:
! 142: for (i = 0; i < numberof (data); i++)
! 143: {
! 144: SETUP ();
! 145: got_c = mpn_add_1 (got, data[i].src, data[i].size, data[i].n);
! 146: VERIFY ("check_add_1 (separate)");
! 147:
! 148: SETUP_INPLACE ();
! 149: got_c = mpn_add_1 (got, got, data[i].size, data[i].n);
! 150: VERIFY ("check_add_1 (in-place)");
! 151:
! 152: if (data[i].n == 1)
! 153: {
! 154: SETUP ();
! 155: got_c = mpn_add_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
! 156: VERIFY ("check_add_1 (separate, const 1)");
! 157:
! 158: SETUP_INPLACE ();
! 159: got_c = mpn_add_1 (got, got, data[i].size, CNST_LIMB(1));
! 160: VERIFY ("check_add_1 (in-place, const 1)");
! 161: }
! 162:
! 163: /* Same again on functions, not inlines. */
! 164: SETUP ();
! 165: got_c = (*fudge(mpn_add_1)) (got, data[i].src, data[i].size, data[i].n);
! 166: VERIFY ("check_add_1 (function, separate)");
! 167:
! 168: SETUP_INPLACE ();
! 169: got_c = (*fudge(mpn_add_1)) (got, got, data[i].size, data[i].n);
! 170: VERIFY ("check_add_1 (function, in-place)");
! 171: }
! 172: }
! 173:
! 174: void
! 175: check_sub_1 (void)
! 176: {
! 177: static const struct {
! 178: mp_size_t size;
! 179: mp_limb_t n;
! 180: const mp_limb_t src[ASIZE];
! 181: mp_limb_t want_c;
! 182: const mp_limb_t want[ASIZE];
! 183: } data[] = {
! 184: { 1, 0, { 0 }, 0, { 0 } },
! 185: { 1, 0, { 1 }, 0, { 1 } },
! 186: { 1, 1, { 1 }, 0, { 0 } },
! 187: { 1, 0, { M }, 0, { M } },
! 188: { 1, 1, { M }, 0, { M-1 } },
! 189: { 1, 1, { 123 }, 0, { 122 } },
! 190:
! 191: { 1, 1, { 0 }, 1, { M } },
! 192: { 1, M, { 0 }, 1, { 1 } },
! 193:
! 194: { 2, 0, { 0, 0 }, 0, { 0, 0 } },
! 195: { 2, 0, { 1, 0 }, 0, { 1, 0 } },
! 196: { 2, 1, { 1, 0 }, 0, { 0, 0 } },
! 197: { 2, 0, { M, 0 }, 0, { M, 0 } },
! 198: { 2, 1, { M, 0 }, 0, { M-1, 0 } },
! 199: { 2, 1, { 123, 0 }, 0, { 122, 0 } },
! 200:
! 201: { 2, 1, { 0, 0 }, 1, { M, M } },
! 202: { 2, M, { 0, 0 }, 1, { 1, M } },
! 203:
! 204: { 3, 0, { 0, 0, 0 }, 0, { 0, 0, 0 } },
! 205: { 3, 0, { 123, 0, 0 }, 0, { 123, 0, 0 } },
! 206:
! 207: { 3, 1, { 0, 0, 0 }, 1, { M, M, M } },
! 208: { 3, M, { 0, 0, 0 }, 1, { 1, M, M } },
! 209:
! 210: { 4, 1, { 0, 0, 0, 0 }, 1, { M, M, M, M } },
! 211: { 4, M, { 0, 0, 0, 0 }, 1, { 1, M, M, M } },
! 212:
! 213: { 4, 1, { 0, 0, 1, 42 }, 0, { M, M, 0, 42 } },
! 214: { 4, M, { 0, 0, 123, 24 }, 0, { 1, M, 122, 24 } },
! 215: };
! 216:
! 217: mp_limb_t got[ASIZE];
! 218: mp_limb_t got_c;
! 219: int i;
! 220:
! 221: for (i = 0; i < numberof (data); i++)
! 222: {
! 223: SETUP ();
! 224: got_c = mpn_sub_1 (got, data[i].src, data[i].size, data[i].n);
! 225: VERIFY ("check_sub_1 (separate)");
! 226:
! 227: SETUP_INPLACE ();
! 228: got_c = mpn_sub_1 (got, got, data[i].size, data[i].n);
! 229: VERIFY ("check_sub_1 (in-place)");
! 230:
! 231: if (data[i].n == 1)
! 232: {
! 233: SETUP ();
! 234: got_c = mpn_sub_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
! 235: VERIFY ("check_sub_1 (separate, const 1)");
! 236:
! 237: SETUP_INPLACE ();
! 238: got_c = mpn_sub_1 (got, got, data[i].size, CNST_LIMB(1));
! 239: VERIFY ("check_sub_1 (in-place, const 1)");
! 240: }
! 241:
! 242: /* Same again on functions, not inlines. */
! 243: SETUP ();
! 244: got_c = (*fudge(mpn_sub_1)) (got, data[i].src, data[i].size, data[i].n);
! 245: VERIFY ("check_sub_1 (function, separate)");
! 246:
! 247: SETUP_INPLACE ();
! 248: got_c = (*fudge(mpn_sub_1)) (got, got, data[i].size, data[i].n);
! 249: VERIFY ("check_sub_1 (function, in-place)");
! 250: }
! 251: }
! 252:
! 253: /* Try to prevent the optimizer inlining. */
! 254: mpn_aors_1_t
! 255: fudge (mpn_aors_1_t f)
! 256: {
! 257: return f;
! 258: }
! 259:
! 260: int
! 261: main (void)
! 262: {
! 263: tests_start ();
! 264: mp_trace_base = -16;
! 265:
! 266: check_add_1 ();
! 267: check_sub_1 ();
! 268:
! 269: tests_end ();
! 270: exit (0);
! 271: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>