1. 程式人生 > >RISC-V踩坑記----__builtin_clz((x)庫函式的應用

RISC-V踩坑記----__builtin_clz((x)庫函式的應用

  RISC-V的確是個好東西,可是,免費的東西往往需要付出代價才能得到了,最近遇到了一個演算法中的問題,追了好久,最終追到了這個庫函式中,沒想到,這個庫函式居然還隱藏著一些貓膩。值得記下來啊。

首先上一個在X86平臺下的例子:

   1 #include <stdio.h>

 2 /* Position of the most significant bit of x */
 3 #define gap8_fl1(x)             (31 - __builtin_clz((x)))
 4 
 5 static int array[32];
 6
int main() 7 { 8 int test = 0xFFFFF00; 9 10 while(test > 0) 11 { 12 test = test>>1; 13 printf("test:%x gap8:%d \n",test,gap8_fl1(test)); 14 } 21 22 return 0; 23 } 24 ~

  這個是編譯器的庫函式,表示要獲取你輸入引數的位數。

測試結果:

test:7ffff80 gap8:26 
test:3ffffc0 gap8:
25 test:1ffffe0 gap8:24 test:fffff0 gap8:23 test:7ffff8 gap8:22 test:3ffffc gap8:21 test:1ffffe gap8:20 test:fffff gap8:19 test:7ffff gap8:18 test:3ffff gap8:17 test:1ffff gap8:16 test:ffff gap8:15 test:7fff gap8:14 test:3fff gap8:13 test:1fff gap8:12 test:fff gap8:11 test:7ff gap8:
10 test:3ff gap8:9 test:1ff gap8:8 test:ff gap8:7 test:7f gap8:6 test:3f gap8:5 test:1f gap8:4 test:f gap8:3 test:7 gap8:2 test:3 gap8:1 test:1 gap8:0 test:0 gap8:0

  讓我們再看一下在RISC-V平臺下的列印:

test:7ffff80 gap8:26 
test:3ffffc0 gap8:25 
test:1ffffe0 gap8:24 
test:fffff0 gap8:23 
test:7ffff8 gap8:22 
test:3ffffc gap8:21 
test:1ffffe gap8:20 
test:fffff gap8:19 
test:7ffff gap8:18 
test:3ffff gap8:17 
test:1ffff gap8:16 
test:ffff gap8:15 
test:7fff gap8:14 
test:3fff gap8:13 
test:1fff gap8:12 
test:fff gap8:11 
test:7ff gap8:10 
test:3ff gap8:9 
test:1ff gap8:8 
test:ff gap8:7 
test:7f gap8:6 
test:3f gap8:5 
test:1f gap8:4 
test:f gap8:3 
test:7 gap8:2 
test:3 gap8:1 
test:1 gap8:0 
test:0 gap8:32

  這裡就有一個差別,就是當x等於0的時候,__builtin_clz((x)的值在risc-v中居然是-1,這個坑真是的不小啊。算是學習了。