unsigned calc_bextr_u32(unsigned src1, unsigned src2) {
  unsigned res = 0;
  unsigned char start = (src2 & 0xff);
  unsigned char len = (int)((src2 >> 8) & 0xff);
  if (start < 32) {
    unsigned i;
    unsigned last = (start + len) < 32 ? start + len : 32;
    src1 >>= start;
    for (i = start; i < last; ++i) {
      res |= (src1 & 1) << (i - start);
      src1 >>= 1;
    }
  }
  return res;
}


x86 assembly (clang, -O0):
<calc_bextr_u32>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%eax
and    $0xff,%eax
mov    %al,-0xd(%rbp)
mov    -0x8(%rbp),%eax
shr    $0x8,%eax
and    $0xff,%eax
mov    %al,-0xe(%rbp)
movzbl -0xd(%rbp),%eax
cmp    $0x20,%eax
jge    11c1 <calc_bextr_u32+0xc1>
movzbl -0xd(%rbp),%eax
movzbl -0xe(%rbp),%ecx
add    %ecx,%eax
cmp    $0x20,%eax
jge    115c <calc_bextr_u32+0x5c>
movzbl -0xd(%rbp),%eax
movzbl -0xe(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
jmp    1169 <calc_bextr_u32+0x69>
mov    $0x20,%eax
mov    %eax,-0x1c(%rbp)
jmp    1169 <calc_bextr_u32+0x69>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x18(%rbp)
movzbl -0xd(%rbp),%ecx
mov    -0x4(%rbp),%eax
shr    %cl,%eax
mov    %eax,-0x4(%rbp)
movzbl -0xd(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jae    11bc <calc_bextr_u32+0xbc>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
mov    -0x14(%rbp),%ecx
movzbl -0xd(%rbp),%edx
sub    %edx,%ecx
shl    %cl,%eax
or     -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x4(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1182 <calc_bextr_u32+0x82>
jmp    11c1 <calc_bextr_u32+0xc1>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<calc_bextr_u32>:
mov    %esi,%ecx
movzbl %cl,%r8d
xor    %eax,%eax
cmp    $0x1f,%r8d
ja     11d6 <calc_bextr_u32+0xd6>
movzbl %ch,%ecx
add    %r8d,%ecx
cmp    $0x20,%ecx
mov    $0x20,%edx
cmovb  %ecx,%edx
mov    %edx,%r9d
sub    %r8d,%r9d
jbe    11d6 <calc_bextr_u32+0xd6>
mov    %r8d,%ecx
shr    %cl,%edi
mov    %r8d,%eax
not    %eax
add    %eax,%edx
mov    %r9d,%r10d
and    $0x3,%r10d
cmp    $0x3,%edx
jae    1156 <calc_bextr_u32+0x56>
xor    %eax,%eax
mov    %r8d,%esi
test   %r10d,%r10d
jne    11b0 <calc_bextr_u32+0xb0>
jmp    11d6 <calc_bextr_u32+0xd6>
push   %rbx
and    $0xfffffffc,%r9d
xor    %eax,%eax
xor    %esi,%esi
nop
mov    %edi,%r11d
and    $0x1,%r11d
mov    %esi,%ecx
shl    %cl,%r11d
mov    %edi,%edx
shr    %edx
and    $0x1,%edx
lea    0x1(%rsi),%ecx
shl    %cl,%edx
or     %eax,%r11d
mov    %edi,%ebx
shr    $0x2,%ebx
and    $0x1,%ebx
lea    0x2(%rsi),%ecx
shl    %cl,%ebx
or     %r11d,%edx
mov    %edi,%eax
shr    $0x3,%eax
and    $0x1,%eax
lea    0x3(%rsi),%ecx
shl    %cl,%eax
or     %ebx,%eax
or     %edx,%eax
shr    $0x4,%edi
add    $0x4,%esi
cmp    %r9d,%esi
jne    1160 <calc_bextr_u32+0x60>
add    %r8d,%esi
pop    %rbx
test   %r10d,%r10d
je     11d6 <calc_bextr_u32+0xd6>
sub    %r8d,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %edi,%edx
and    $0x1,%edx
mov    %esi,%ecx
shl    %cl,%edx
or     %edx,%eax
shr    %edi
add    $0x1,%esi
add    $0xffffffff,%r10d
jne    11c0 <calc_bextr_u32+0xc0>
ret

LLVM IR (-O0):
define i32 @calc_bextr_u32(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8
%7 = alloca i8
%8 = alloca i32
%9 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
store i32 0, i32* %5
%10 = load i32, i32* %4
%11 = and i32 %10, 255
%12 = trunc i32 %11 to i8
store i8 %12, i8* %6
%13 = load i32, i32* %4
%14 = lshr i32 %13, 8
%15 = and i32 %14, 255
%16 = trunc i32 %15 to i8
store i8 %16, i8* %7
%17 = load i8, i8* %6
%18 = zext i8 %17 to i32
%19 = icmp slt i32 %18, 32
br i1 %19, label %20, label %62
20: ; preds = %2
%21 = load i8, i8* %6
%22 = zext i8 %21 to i32
%23 = load i8, i8* %7
%24 = zext i8 %23 to i32
%25 = add nsw i32 %22, %24
%26 = icmp slt i32 %25, 32
br i1 %26, label %27, label %33
27: ; preds = %20
%28 = load i8, i8* %6
%29 = zext i8 %28 to i32
%30 = load i8, i8* %7
%31 = zext i8 %30 to i32
%32 = add nsw i32 %29, %31
br label %34
33: ; preds = %20
br label %34
34: ; preds = %33, %27
%35 = phi i32 [ %32, %27 ], [ 32, %33 ]
store i32 %35, i32* %9
%36 = load i8, i8* %6
%37 = zext i8 %36 to i32
%38 = load i32, i32* %3
%39 = lshr i32 %38, %37
store i32 %39, i32* %3
%40 = load i8, i8* %6
%41 = zext i8 %40 to i32
store i32 %41, i32* %8
br label %42
42: ; preds = %58, %34
%43 = load i32, i32* %8
%44 = load i32, i32* %9
%45 = icmp ult i32 %43, %44
br i1 %45, label %46, label %61
46: ; preds = %42
%47 = load i32, i32* %3
%48 = and i32 %47, 1
%49 = load i32, i32* %8
%50 = load i8, i8* %6
%51 = zext i8 %50 to i32
%52 = sub i32 %49, %51
%53 = shl i32 %48, %52
%54 = load i32, i32* %5
%55 = or i32 %54, %53
store i32 %55, i32* %5
%56 = load i32, i32* %3
%57 = lshr i32 %56, 1
store i32 %57, i32* %3
br label %58
58: ; preds = %46
%59 = load i32, i32* %8
%60 = add i32 %59, 1
store i32 %60, i32* %8
br label %42
61: ; preds = %42
br label %62
62: ; preds = %61, %2
%63 = load i32, i32* %5
ret i32 %63
}

LLVM IR (-O2):
define i32 @calc_bextr_u32(i32 %0, i32 %1) {
%3 = and i32 %1, 255
%4 = icmp ult i32 %3, 32
br i1 %4, label %5, label %71
5: ; preds = %2
%6 = lshr i32 %1, 8
%7 = and i32 %6, 255
%8 = add nuw nsw i32 %7, %3
%9 = icmp ult i32 %8, 32
%10 = select i1 %9, i32 %8, i32 32
%11 = icmp ugt i32 %10, %3
br i1 %11, label %12, label %71
12: ; preds = %5
%13 = lshr i32 %0, %3
%14 = sub nsw i32 %10, %3
%15 = xor i32 %3, -1
%16 = add nsw i32 %10, %15
%17 = and i32 %14, 3
%18 = icmp ult i32 %16, 3
br i1 %18, label %52, label %19
19: ; preds = %12
%20 = and i32 %14, -4
br label %21
21: ; preds = %21, %19
%22 = phi i32 [ %13, %19 ], [ %48, %21 ]
%23 = phi i32 [ %3, %19 ], [ %49, %21 ]
%24 = phi i32 [ 0, %19 ], [ %47, %21 ]
%25 = phi i32 [ 0, %19 ], [ %50, %21 ]
%26 = and i32 %22, 1
%27 = sub nuw nsw i32 %23, %3
%28 = shl nuw i32 %26, %27
%29 = or i32 %28, %24
%30 = lshr i32 %22, 1
%31 = add nuw nsw i32 %23, 1
%32 = and i32 %30, 1
%33 = sub nuw nsw i32 %31, %3
%34 = shl nuw i32 %32, %33
%35 = or i32 %34, %29
%36 = lshr i32 %22, 2
%37 = add nuw nsw i32 %23, 2
%38 = and i32 %36, 1
%39 = sub nuw nsw i32 %37, %3
%40 = shl nuw i32 %38, %39
%41 = or i32 %40, %35
%42 = lshr i32 %22, 3
%43 = add nuw nsw i32 %23, 3
%44 = and i32 %42, 1
%45 = sub nuw nsw i32 %43, %3
%46 = shl nuw i32 %44, %45
%47 = or i32 %46, %41
%48 = lshr i32 %22, 4
%49 = add nuw nsw i32 %23, 4
%50 = add i32 %25, 4
%51 = icmp eq i32 %50, %20
br i1 %51, label %52, label %21
52: ; preds = %21, %12
%53 = phi i32 [ undef, %12 ], [ %47, %21 ]
%54 = phi i32 [ %13, %12 ], [ %48, %21 ]
%55 = phi i32 [ %3, %12 ], [ %49, %21 ]
%56 = phi i32 [ 0, %12 ], [ %47, %21 ]
%57 = icmp eq i32 %17, 0
br i1 %57, label %71, label %58
58: ; preds = %52, %58
%59 = phi i32 [ %67, %58 ], [ %54, %52 ]
%60 = phi i32 [ %68, %58 ], [ %55, %52 ]
%61 = phi i32 [ %66, %58 ], [ %56, %52 ]
%62 = phi i32 [ %69, %58 ], [ 0, %52 ]
%63 = and i32 %59, 1
%64 = sub nuw nsw i32 %60, %3
%65 = shl nuw i32 %63, %64
%66 = or i32 %65, %61
%67 = lshr i32 %59, 1
%68 = add nuw nsw i32 %60, 1
%69 = add i32 %62, 1
%70 = icmp eq i32 %69, %17
br i1 %70, label %71, label %58
71: ; preds = %52, %58, %5, %2
%72 = phi i32 [ 0, %2 ], [ 0, %5 ], [ %53, %52 ], [ %66, %58 ]
ret i32 %72
}