Example #1
0
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);
}
Example #2
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:
		;
	}
}
Example #3
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:
		;
	}
}
Example #4
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);
}
Example #5
0
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);
}
Example #6
0
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;
}