1*d4f6e58fSAlex Bennée #include <stdio.h> 2*d4f6e58fSAlex Bennée #include <stdlib.h> 3*d4f6e58fSAlex Bennée #include <stdint.h> 4*d4f6e58fSAlex Bennée #include "sys.h" 5*d4f6e58fSAlex Bennée cris_lz(int x)6*d4f6e58fSAlex Bennéestatic always_inline int cris_lz(int x) 7*d4f6e58fSAlex Bennée { 8*d4f6e58fSAlex Bennée int r; 9*d4f6e58fSAlex Bennée asm ("lz\t%1, %0\n" : "=r" (r) : "r" (x)); 10*d4f6e58fSAlex Bennée return r; 11*d4f6e58fSAlex Bennée } 12*d4f6e58fSAlex Bennée check_lz(void)13*d4f6e58fSAlex Bennéevoid check_lz(void) 14*d4f6e58fSAlex Bennée { 15*d4f6e58fSAlex Bennée int i; 16*d4f6e58fSAlex Bennée 17*d4f6e58fSAlex Bennée if (cris_lz(0) != 32) 18*d4f6e58fSAlex Bennée err(); 19*d4f6e58fSAlex Bennée if (cris_lz(1) != 31) 20*d4f6e58fSAlex Bennée err(); 21*d4f6e58fSAlex Bennée if (cris_lz(2) != 30) 22*d4f6e58fSAlex Bennée err(); 23*d4f6e58fSAlex Bennée if (cris_lz(4) != 29) 24*d4f6e58fSAlex Bennée err(); 25*d4f6e58fSAlex Bennée if (cris_lz(8) != 28) 26*d4f6e58fSAlex Bennée err(); 27*d4f6e58fSAlex Bennée 28*d4f6e58fSAlex Bennée /* try all positions with a single bit. */ 29*d4f6e58fSAlex Bennée for (i = 1; i < 32; i++) { 30*d4f6e58fSAlex Bennée if (cris_lz(1 << (i-1)) != (32 - i)) 31*d4f6e58fSAlex Bennée err(); 32*d4f6e58fSAlex Bennée } 33*d4f6e58fSAlex Bennée 34*d4f6e58fSAlex Bennée /* try all positions with all bits. */ 35*d4f6e58fSAlex Bennée for (i = 1; i < 32; i++) { 36*d4f6e58fSAlex Bennée /* split up this computation to clarify it. */ 37*d4f6e58fSAlex Bennée uint32_t val; 38*d4f6e58fSAlex Bennée val = (unsigned int)-1 >> (32 - i); 39*d4f6e58fSAlex Bennée if (cris_lz(val) != (32 - i)) 40*d4f6e58fSAlex Bennée err(); 41*d4f6e58fSAlex Bennée } 42*d4f6e58fSAlex Bennée } 43*d4f6e58fSAlex Bennée main(void)44*d4f6e58fSAlex Bennéeint main(void) 45*d4f6e58fSAlex Bennée { 46*d4f6e58fSAlex Bennée check_lz(); 47*d4f6e58fSAlex Bennée pass(); 48*d4f6e58fSAlex Bennée exit(0); 49*d4f6e58fSAlex Bennée } 50