forked from mirror/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
775 B
C
50 lines
775 B
C
#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);
|
|
}
|