/ proofs / zbyte1.txt
zbyte1.txt
 1  ==== Find leftmost 0-byte 
 2  
 3  .Implementation
 4  [source]
 5  ----
 6  #include "nlz.h"
 7  inline int zbytel(unsigned x) {
 8      unsigned y;
 9      int n;
10      y = (x & 0x7f7f7f7f) + 0x7f7f7f7f;
11      y = ~(y | x | 0x7f7f7f7f);
12      n = nlz(y) >> 3;
13      return n;
14  }
15  
16  inline int zbytel_nonlz(unsigned x) {
17      unsigned y;
18      int n;
19      y = (x & 0x7f7f7f7f) + 0x7f7f7f7f;
20      y = ~(y | x | 0x7f7f7f7f);
21      if(y == 0) return 4;
22      if(y > 0xffff) return (y >> 31) ^ 1;
23      return (y >> 15) ^ 3;
24  }
25  
26  ----
27  
28  .Proof
29  [source]
30  ----
31  int zbytel_ref(unsigned x) {
32      if((x >> 24) == 0) return 0;
33      if((x & 0x00ff0000) == 0) return 1;
34      if((x & 0x0000ff00) == 0) return 2;
35      if((x & 0x000000ff) == 0) return 3;
36      return 4;
37  }
38  
39  int main() {
40      unsigned x = nondet_unsigned();
41      assert(zbytel(x) == zbytel_ref(x));
42      assert(zbytel_nonlz(x) == zbytel_ref(x));
43  }
44  ----