parityti2_test.c revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
1//===-- parityti2_test.c - Test __parityti2 -------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file tests __parityti2 for the compiler_rt library.
11//
12//===----------------------------------------------------------------------===//
13
14#include "int_lib.h"
15#include <stdio.h>
16#include <stdlib.h>
17
18#ifdef CRT_HAS_128BIT
19
20// Returns: 1 if number of bits is odd else returns 0
21
22si_int __parityti2(ti_int a);
23
24int naive_parity(ti_int a)
25{
26    int r = 0;
27    for (; a; a = a & (a - 1))
28        r = ~r;
29    return r & 1;
30}
31
32int test__parityti2(ti_int a)
33{
34    si_int x = __parityti2(a);
35    si_int expected = naive_parity(a);
36    if (x != expected)
37    {
38        twords at;
39        at.all = a;
40        printf("error in __parityti2(0x%.16llX%.16llX) = %d, expected %d\n",
41               at.s.high, at.s.low, x, expected);
42    }
43    return x != expected;
44}
45
46char assumption_1[sizeof(ti_int) == 2*sizeof(di_int)] = {0};
47char assumption_2[sizeof(di_int)*CHAR_BIT == 64] = {0};
48
49#endif
50
51int main()
52{
53#ifdef CRT_HAS_128BIT
54    int i;
55    for (i = 0; i < 10000; ++i)
56        if (test__parityti2(((ti_int)rand() << 96) + ((ti_int)rand() << 64) +
57                            ((ti_int)rand() << 32) + rand()))
58            return 1;
59
60#else
61    printf("skipped\n");
62#endif
63   return 0;
64}
65