unsigned int sub_AQf4(unsigned int a1, unsigned int a2) {
  const unsigned int v10 = ((a2 << 9) >> 4) | 0x10000000;
  unsigned int v11 = ((a1 << 9) >> 4) | 0x10000000;
  unsigned int v12 = (a1 ^ a2) & 0x80000000;
  unsigned int v14 =
      (v11 >= v10) + ((a1 >> 23) & 0xFF) - ((a2 >> 23) & 0xFF) + 0x7D;
  unsigned int v15 = 0x800000;
  unsigned int v16;
  unsigned int result;
  if (v11 < v10)
    v11 *= 2;
  do {
    if (v11 >= v10) {
      v11 -= v10;
      v12 |= v15;
    }
    if (v11 >= v10 >> 1) {
      v11 -= v10 >> 1;
      v12 |= v15 >> 1;
    }
    if (v11 >= v10 >> 2) {
      v11 -= v10 >> 2;
      v12 |= v15 >> 2;
    }
    if (v11 >= v10 >> 3) {
      v11 -= v10 >> 3;
      v12 |= v15 >> 3;
    }
    v11 *= 16;
    v16 = (v11 == 0);
    if (v11) {
      v15 >>= 4;
      v16 = (v15 == 0);
    }
  } while (!v16);
  if (v14 > 0xFD)
    return (v12 & 0x80000000) | 0x7F800000;
  result = (v14 << 23) + (v11 >= v10) + v12;
  if (v11 == v10)
    result &= 0xFFFFFFFE;
  return result;
}


x86 assembly (clang, -O0):
<sub_AQf4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x9,%eax
shr    $0x4,%eax
or     $0x10000000,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
shl    $0x9,%eax
shr    $0x4,%eax
or     $0x10000000,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%eax
xor    -0xc(%rbp),%eax
and    $0x80000000,%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x8(%rbp),%ecx
shr    $0x17,%ecx
and    $0xff,%ecx
add    %ecx,%eax
mov    -0xc(%rbp),%ecx
shr    $0x17,%ecx
and    $0xff,%ecx
sub    %ecx,%eax
add    $0x7d,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x800000,-0x20(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jae    1186 <sub_AQf4+0x86>
mov    -0x14(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    118b <sub_AQf4+0x8b>
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jb     11ab <sub_AQf4+0xab>
mov    -0x10(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%ecx
shr    $0x1,%ecx
cmp    %ecx,%eax
jb     11d6 <sub_AQf4+0xd6>
mov    -0x10(%rbp),%ecx
shr    $0x1,%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%eax
shr    $0x1,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%ecx
shr    $0x2,%ecx
cmp    %ecx,%eax
jb     1201 <sub_AQf4+0x101>
mov    -0x10(%rbp),%ecx
shr    $0x2,%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%eax
shr    $0x2,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%ecx
shr    $0x3,%ecx
cmp    %ecx,%eax
jb     122c <sub_AQf4+0x12c>
mov    -0x10(%rbp),%ecx
shr    $0x3,%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%eax
shr    $0x3,%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1266 <sub_AQf4+0x166>
mov    -0x20(%rbp),%eax
shr    $0x4,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x24(%rbp)
jmp    126b <sub_AQf4+0x16b>
cmpl   $0x0,-0x24(%rbp)
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    118b <sub_AQf4+0x8b>
cmpl   $0xfd,-0x1c(%rbp)
jbe    129e <sub_AQf4+0x19e>
mov    -0x18(%rbp),%eax
and    $0x80000000,%eax
or     $0x7f800000,%eax
mov    %eax,-0x4(%rbp)
jmp    12d6 <sub_AQf4+0x1d6>
mov    -0x1c(%rbp),%eax
shl    $0x17,%eax
mov    -0x14(%rbp),%ecx
cmp    -0x10(%rbp),%ecx
setae  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    12d0 <sub_AQf4+0x1d0>
mov    -0x28(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sub_AQf4>:
push   %rbp
push   %r15
push   %r14
push   %rbx
mov    %esi,%r8d
shl    $0x5,%r8d
and    $0xfffffe0,%r8d
or     $0x10000000,%r8d
mov    %edi,%r9d
shl    $0x5,%r9d
and    $0xfffffe0,%r9d
or     $0x10000000,%r9d
mov    %esi,%edx
xor    %edi,%edx
and    $0x80000000,%edx
shr    $0x17,%edi
movzbl %dil,%r10d
shr    $0x17,%esi
movzbl %sil,%eax
sub    %eax,%r10d
add    $0x7d,%r10d
cmp    %r8d,%r9d
setb   %cl
mov    %r9d,%esi
shl    %cl,%esi
mov    %r8d,%r11d
shr    %r11d
mov    %r8d,%r14d
shr    $0x2,%r14d
mov    %r8d,%r15d
shr    $0x3,%r15d
mov    $0x800000,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %ebp,%ebp
cmp    %r8d,%esi
mov    %r8d,%ecx
cmovb  %ebp,%ecx
mov    %edi,%eax
cmovb  %ebp,%eax
sub    %ecx,%esi
or     %edx,%eax
mov    $0x0,%ecx
mov    $0x0,%edx
cmp    %r11d,%esi
jb     11aa <sub_AQf4+0xaa>
mov    %edi,%edx
shr    %edx
mov    %r11d,%ecx
sub    %ecx,%esi
or     %eax,%edx
mov    $0x0,%ecx
mov    $0x0,%ebx
cmp    %r14d,%esi
jb     11c5 <sub_AQf4+0xc5>
mov    %edi,%ebx
shr    $0x2,%ebx
mov    %r14d,%ecx
or     %ebx,%edx
sub    %ecx,%esi
mov    $0x0,%ecx
cmp    %r15d,%esi
jb     11db <sub_AQf4+0xdb>
mov    %edi,%ecx
shr    $0x3,%ecx
mov    %r15d,%ebp
or     %ecx,%edx
sub    %ebp,%esi
shl    $0x4,%esi
mov    %edi,%ebx
shr    $0x4,%ebx
mov    %edi,%ecx
test   %esi,%esi
je     11ef <sub_AQf4+0xef>
mov    %ebx,%ecx
je     11f8 <sub_AQf4+0xf8>
cmp    $0xf,%edi
mov    %ecx,%edi
ja     1180 <sub_AQf4+0x80>
cmp    %r8d,%r9d
sbb    $0xffffffff,%r10d
cmp    $0xfe,%r10d
jb     1214 <sub_AQf4+0x114>
and    $0x80000000,%eax
or     $0x7f800000,%eax
jmp    122c <sub_AQf4+0x12c>
shl    $0x17,%r10d
add    %r10d,%edx
cmp    %r8d,%esi
sbb    $0xffffffff,%edx
mov    %edx,%eax
and    $0xfffffffe,%eax
cmp    %r8d,%esi
cmovne %edx,%eax
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @sub_AQf4(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
%13 = load i32, i32* %5
%14 = shl i32 %13, 9
%15 = lshr i32 %14, 4
%16 = or i32 %15, 268435456
store i32 %16, i32* %6
%17 = load i32, i32* %4
%18 = shl i32 %17, 9
%19 = lshr i32 %18, 4
%20 = or i32 %19, 268435456
store i32 %20, i32* %7
%21 = load i32, i32* %4
%22 = load i32, i32* %5
%23 = xor i32 %21, %22
%24 = and i32 %23, -2147483648
store i32 %24, i32* %8
%25 = load i32, i32* %7
%26 = load i32, i32* %6
%27 = icmp uge i32 %25, %26
%28 = zext i1 %27 to i32
%29 = load i32, i32* %4
%30 = lshr i32 %29, 23
%31 = and i32 %30, 255
%32 = add i32 %28, %31
%33 = load i32, i32* %5
%34 = lshr i32 %33, 23
%35 = and i32 %34, 255
%36 = sub i32 %32, %35
%37 = add i32 %36, 125
store i32 %37, i32* %9
store i32 8388608, i32* %10
%38 = load i32, i32* %7
%39 = load i32, i32* %6
%40 = icmp ult i32 %38, %39
br i1 %40, label %41, label %44
41: ; preds = %2
%42 = load i32, i32* %7
%43 = mul i32 %42, 2
store i32 %43, i32* %7
br label %44
44: ; preds = %41, %2
br label %45
45: ; preds = %113, %44
%46 = load i32, i32* %7
%47 = load i32, i32* %6
%48 = icmp uge i32 %46, %47
br i1 %48, label %49, label %56
49: ; preds = %45
%50 = load i32, i32* %6
%51 = load i32, i32* %7
%52 = sub i32 %51, %50
store i32 %52, i32* %7
%53 = load i32, i32* %10
%54 = load i32, i32* %8
%55 = or i32 %54, %53
store i32 %55, i32* %8
br label %56
56: ; preds = %49, %45
%57 = load i32, i32* %7
%58 = load i32, i32* %6
%59 = lshr i32 %58, 1
%60 = icmp uge i32 %57, %59
br i1 %60, label %61, label %70
61: ; preds = %56
%62 = load i32, i32* %6
%63 = lshr i32 %62, 1
%64 = load i32, i32* %7
%65 = sub i32 %64, %63
store i32 %65, i32* %7
%66 = load i32, i32* %10
%67 = lshr i32 %66, 1
%68 = load i32, i32* %8
%69 = or i32 %68, %67
store i32 %69, i32* %8
br label %70
70: ; preds = %61, %56
%71 = load i32, i32* %7
%72 = load i32, i32* %6
%73 = lshr i32 %72, 2
%74 = icmp uge i32 %71, %73
br i1 %74, label %75, label %84
75: ; preds = %70
%76 = load i32, i32* %6
%77 = lshr i32 %76, 2
%78 = load i32, i32* %7
%79 = sub i32 %78, %77
store i32 %79, i32* %7
%80 = load i32, i32* %10
%81 = lshr i32 %80, 2
%82 = load i32, i32* %8
%83 = or i32 %82, %81
store i32 %83, i32* %8
br label %84
84: ; preds = %75, %70
%85 = load i32, i32* %7
%86 = load i32, i32* %6
%87 = lshr i32 %86, 3
%88 = icmp uge i32 %85, %87
br i1 %88, label %89, label %98
89: ; preds = %84
%90 = load i32, i32* %6
%91 = lshr i32 %90, 3
%92 = load i32, i32* %7
%93 = sub i32 %92, %91
store i32 %93, i32* %7
%94 = load i32, i32* %10
%95 = lshr i32 %94, 3
%96 = load i32, i32* %8
%97 = or i32 %96, %95
store i32 %97, i32* %8
br label %98
98: ; preds = %89, %84
%99 = load i32, i32* %7
%100 = mul i32 %99, 16
store i32 %100, i32* %7
%101 = load i32, i32* %7
%102 = icmp eq i32 %101, 0
%103 = zext i1 %102 to i32
store i32 %103, i32* %11
%104 = load i32, i32* %7
%105 = icmp ne i32 %104, 0
br i1 %105, label %106, label %112
106: ; preds = %98
%107 = load i32, i32* %10
%108 = lshr i32 %107, 4
store i32 %108, i32* %10
%109 = load i32, i32* %10
%110 = icmp eq i32 %109, 0
%111 = zext i1 %110 to i32
store i32 %111, i32* %11
br label %112
112: ; preds = %106, %98
br label %113
113: ; preds = %112
%114 = load i32, i32* %11
%115 = icmp ne i32 %114, 0
%116 = xor i1 %115, true
br i1 %116, label %45, label %117
117: ; preds = %113
%118 = load i32, i32* %9
%119 = icmp ugt i32 %118, 253
br i1 %119, label %120, label %124
120: ; preds = %117
%121 = load i32, i32* %8
%122 = and i32 %121, -2147483648
%123 = or i32 %122, 2139095040
store i32 %123, i32* %3
br label %142
124: ; preds = %117
%125 = load i32, i32* %9
%126 = shl i32 %125, 23
%127 = load i32, i32* %7
%128 = load i32, i32* %6
%129 = icmp uge i32 %127, %128
%130 = zext i1 %129 to i32
%131 = add i32 %126, %130
%132 = load i32, i32* %8
%133 = add i32 %131, %132
store i32 %133, i32* %12
%134 = load i32, i32* %7
%135 = load i32, i32* %6
%136 = icmp eq i32 %134, %135
br i1 %136, label %137, label %140
137: ; preds = %124
%138 = load i32, i32* %12
%139 = and i32 %138, -2
store i32 %139, i32* %12
br label %140
140: ; preds = %137, %124
%141 = load i32, i32* %12
store i32 %141, i32* %3
br label %142
142: ; preds = %140, %120
%143 = load i32, i32* %3
ret i32 %143
}

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