#include <stdio.h> | |
#include <stdlib.h> | |
#include <stdint.h> | |
#include "sys.h" | |
static always_inline int cris_lz(int x) | |
{ | |
int r; | |
asm ("lz\t%1, %0\n" : "=r" (r) : "r" (x)); | |
return r; | |
} | |
void check_lz(void) | |
{ | |
int i; | |
if (cris_lz(0) != 32) | |
err(); | |
if (cris_lz(1) != 31) | |
err(); | |
if (cris_lz(2) != 30) | |
err(); | |
if (cris_lz(4) != 29) | |
err(); | |
if (cris_lz(8) != 28) | |
err(); | |
/* try all positions with a single bit. */ | |
for (i = 1; i < 32; i++) { | |
if (cris_lz(1 << (i-1)) != (32 - i)) | |
err(); | |
} | |
/* try all positions with all bits. */ | |
for (i = 1; i < 32; i++) { | |
/* split up this computation to clarify it. */ | |
uint32_t val; | |
val = (unsigned int)-1 >> (32 - i); | |
if (cris_lz(val) != (32 - i)) | |
err(); | |
} | |
} | |
int main(void) | |
{ | |
check_lz(); | |
pass(); | |
exit(0); | |
} |