Statistics
| Branch: | Revision:

root / tests / cris / check_lz.c @ dd43edf4

History | View | Annotate | Download (768 Bytes)

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdint.h>
4
#include "sys.h"
5

    
6
extern inline int cris_lz(int x)
7
{
8
        int r;
9
        asm ("lz\t%1, %0\n" : "=r" (r) : "r" (x));
10
        return r;
11
}
12

    
13
void check_lz(void)
14
{
15
        int i;
16

    
17
        if (cris_lz(0) != 32)
18
                err();
19
        if (cris_lz(1) != 31)
20
                err();
21
        if (cris_lz(2) != 30)
22
                err();
23
        if (cris_lz(4) != 29)
24
                err();
25
        if (cris_lz(8) != 28)
26
                err();
27

    
28
        /* try all positions with a single bit.  */
29
        for (i = 1; i < 32; i++) {
30
                if (cris_lz(1 << (i-1)) != (32 - i))
31
                        err();
32
        }
33

    
34
        /* try all positions with all bits.  */
35
        for (i = 1; i < 32; i++) {
36
                /* split up this computation to clarify it.  */
37
                uint32_t val;
38
                val = (unsigned int)-1 >> (32 - i);
39
                if (cris_lz(val) != (32 - i))
40
                        err();
41
        }
42
}
43

    
44
int main(void)
45
{
46
        check_lz();
47
        pass();
48
        exit(0);
49
}