int APLWAHDecoder::extractHalf(const Word& w) { len1 = _bextr_u32(w,29,2); len2 = _bextr_u32(w,27,2); int CounterLen =5*(len1 + len2); counter = _bextr_u32(w,0,27 - CounterLen); lit = _bextr_u32(w,27 - CounterLen,CounterLen); isEmpty = false; return counter + (len1 != 0) + (len2 != 0); }
void APLWAHDecoder::extractL2() { int pos = 0; lit2 = 0x80000000; switch(len2){ case 3: lit2 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 2: lit2 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 1: lit2 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 0: ; } }
void APLWAHDecoder::extractL1() { int pos = len2*5; lit1 = 0x80000000; switch(len1){ case 3: lit1 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 2: lit1 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 1: lit1 |= (0x1<<_bextr_u32(lit,pos,5)); pos+=5; case 0: ; } }
unsigned int test_bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z) { // CHECK-LABEL: test_bextr_u32 // CHECK: and i32 %{{.*}}, 255 // CHECK: and i32 %{{.*}}, 255 // CHECK: shl i32 %{{.*}}, 8 // CHECK: or i32 %{{.*}}, %{{.*}} // CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}}) return _bextr_u32(__X, __Y, __Z); }
unsigned int test_bextr_u32(unsigned int __X, unsigned int __Y, unsigned int __Z) { // CHECK: @llvm.x86.bmi.bextr.32 return _bextr_u32(__X, __Y, __Z); }
int APLWAHDecoder::decodeLit(Word w, array<int,32>& plist){ int cnt = 0; int ret = 0; if(_bittestandreset((long*)&w,31)){ while(w != 0){ int i = _tzcnt_u32(w); _bittestandreset((long*)&w,i); plist[cnt] = i; cnt++; } ret = 31; } else{ int len1 = _bextr_u32(w,29,2); int len2 = _bextr_u32(w,27,2); int counter = _bextr_u32(w,0,27 - 5*(len1 + len2)); int pos = 22; if(len1 != 0){ switch(len1){ case 3: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; case 2: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; case 1: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; } ret +=31; } ret += counter*31; if(len2 != 0){ switch(len2){ case 3: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; case 2: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; case 1: plist[cnt] = (ret + _bextr_u32(w,pos,5)); cnt++; pos -= 5; } ret+=31; } } plist[cnt] = -1; return ret; }