int _mulint(int a, int b) {
  int result = 0;
  unsigned char i;
  for (i = 0; i < 8u; i++) {
    if (a & 0x0001u)
      result += b;
    if (sizeof(a) > 1 && (a & 0x00000100ul))
      result += (b << 8u);
    if (sizeof(a) > 2 && (a & 0x00010000ul))
      result += (b << 16u);
    if (sizeof(a) > 3 && (a & 0x01000000ul))
      result += (b << 24u);
    a = ((unsigned int)a) >> 1u;
    b <<= 1u;
  }
  return result;
}


x86 assembly (clang, -O0):
<_mulint>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movb   $0x0,-0xd(%rbp)
movzbl -0xd(%rbp),%eax
cmp    $0x8,%eax
jae    11b9 <_mulint+0xb9>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     113a <_mulint+0x3a>
mov    -0x8(%rbp),%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
movslq -0x4(%rbp),%rax
and    $0x100,%rax
cmp    $0x0,%rax
je     115a <_mulint+0x5a>
mov    -0x8(%rbp),%eax
shl    $0x8,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
movslq -0x4(%rbp),%rax
and    $0x10000,%rax
cmp    $0x0,%rax
je     117a <_mulint+0x7a>
mov    -0x8(%rbp),%eax
shl    $0x10,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
movslq -0x4(%rbp),%rax
and    $0x1000000,%rax
cmp    $0x0,%rax
je     119a <_mulint+0x9a>
mov    -0x8(%rbp),%eax
shl    $0x18,%eax
add    -0xc(%rbp),%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0xd(%rbp),%al
add    $0x1,%al
mov    %al,-0xd(%rbp)
jmp    1115 <_mulint+0x15>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_mulint>:
push   %rbx
mov    %edi,%r8d
mov    %edi,%edx
and    $0x1,%edx
neg    %edx
and    %esi,%edx
mov    %esi,%r10d
shl    $0x8,%r10d
xor    %eax,%eax
test   $0x100,%r8d
cmove  %eax,%r10d
mov    %edi,%r9d
mov    %edi,%r11d
add    %edx,%r10d
mov    %esi,%edx
shl    $0x10,%edx
test   $0x10000,%r8d
cmove  %eax,%edx
add    %r10d,%edx
mov    %esi,%ecx
shl    $0x18,%ecx
test   $0x1000000,%r8d
cmove  %eax,%ecx
add    %edx,%ecx
shr    %r9d
lea    (%rsi,%rsi,1),%edx
shl    $0x1e,%r11d
sar    $0x1f,%r11d
and    %edx,%r11d
add    %ecx,%r11d
mov    %esi,%ecx
shl    $0x9,%ecx
test   $0x100,%r9d
cmove  %eax,%ecx
add    %r11d,%ecx
mov    %esi,%edx
shl    $0x11,%edx
test   $0x10000,%r9d
cmove  %eax,%edx
add    %ecx,%edx
mov    %esi,%ecx
shl    $0x19,%ecx
test   $0x1000000,%r9d
cmove  %eax,%ecx
mov    %edi,%r8d
mov    %edi,%r9d
add    %edx,%ecx
shr    $0x2,%r8d
lea    0x0(,%rsi,4),%edx
shl    $0x1d,%r9d
sar    $0x1f,%r9d
and    %edx,%r9d
add    %ecx,%r9d
mov    %esi,%r11d
shl    $0xa,%r11d
test   $0x100,%r8d
cmove  %eax,%r11d
mov    %edi,%r10d
mov    %edi,%ebx
add    %r9d,%r11d
mov    %esi,%ecx
shl    $0x12,%ecx
test   $0x10000,%r8d
cmove  %eax,%ecx
add    %r11d,%ecx
mov    %esi,%edx
shl    $0x1a,%edx
test   $0x1000000,%r8d
cmove  %eax,%edx
add    %ecx,%edx
shr    $0x3,%r10d
lea    0x0(,%rsi,8),%ecx
shl    $0x1c,%ebx
sar    $0x1f,%ebx
and    %ecx,%ebx
add    %edx,%ebx
mov    %esi,%ecx
shl    $0xb,%ecx
test   $0x100,%r10d
cmove  %eax,%ecx
add    %ebx,%ecx
mov    %esi,%ebx
shl    $0x13,%ebx
test   $0x10000,%r10d
cmove  %eax,%ebx
add    %ecx,%ebx
mov    %esi,%ecx
shl    $0x1b,%ecx
test   $0x1000000,%r10d
cmove  %eax,%ecx
mov    %edi,%r8d
mov    %edi,%edx
add    %ebx,%ecx
shr    $0x4,%r8d
mov    %esi,%ebx
shl    $0x4,%ebx
shl    $0x1b,%edx
sar    $0x1f,%edx
and    %ebx,%edx
add    %ecx,%edx
mov    %esi,%ecx
shl    $0xc,%ecx
test   $0x100,%r8d
cmove  %eax,%ecx
mov    %edi,%r10d
mov    %edi,%ebx
add    %edx,%ecx
mov    %esi,%edx
shl    $0x14,%edx
test   $0x10000,%r8d
cmove  %eax,%edx
add    %ecx,%edx
mov    %esi,%ecx
shl    $0x1c,%ecx
test   $0x1000000,%r8d
cmove  %eax,%ecx
add    %edx,%ecx
shr    $0x5,%r10d
mov    %esi,%edx
shl    $0x5,%edx
shl    $0x1a,%ebx
sar    $0x1f,%ebx
and    %edx,%ebx
add    %ecx,%ebx
mov    %esi,%ecx
shl    $0xd,%ecx
test   $0x100,%r10d
cmove  %eax,%ecx
add    %ebx,%ecx
mov    %esi,%r9d
shl    $0x15,%r9d
test   $0x10000,%r10d
cmove  %eax,%r9d
add    %ecx,%r9d
mov    %esi,%edx
shl    $0x1d,%edx
test   $0x1000000,%r10d
cmove  %eax,%edx
mov    %edi,%r8d
mov    %edi,%ecx
mov    %edi,%r10d
add    %r9d,%edx
mov    %esi,%ebx
shl    $0x6,%ebx
shl    $0x19,%ecx
sar    $0x1f,%ecx
and    %ebx,%ecx
shr    $0x6,%r8d
add    %edx,%ecx
mov    %esi,%edx
shl    $0xe,%edx
test   $0x100,%r8d
cmove  %eax,%edx
movsbl %dil,%edi
add    %ecx,%edx
mov    %esi,%ecx
shl    $0x16,%ecx
test   $0x10000,%r8d
cmove  %eax,%ecx
add    %edx,%ecx
mov    %esi,%edx
shl    $0x1e,%edx
test   $0x1000000,%r8d
cmove  %eax,%edx
add    %ecx,%edx
shr    $0x7,%r10d
mov    %esi,%ecx
shl    $0x7,%ecx
and    %ecx,%edi
add    %edx,%edi
mov    %esi,%ecx
shl    $0xf,%ecx
test   $0x100,%r10d
cmove  %eax,%ecx
add    %edi,%ecx
mov    %esi,%edx
shl    $0x17,%edx
test   $0x10000,%r10d
cmove  %eax,%edx
add    %ecx,%edx
shl    $0x1f,%esi
test   $0x1000000,%r10d
cmovne %esi,%eax
add    %edx,%eax
pop    %rbx
ret

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

LLVM IR (-O2):
define i32 @_mulint(i32 %0, i32 %1) {
%3 = and i32 %0, 1
%4 = icmp eq i32 %3, 0
%5 = select i1 %4, i32 0, i32 %1
%6 = zext i32 %0 to i64
%7 = and i64 %6, 256
%8 = icmp eq i64 %7, 0
%9 = shl i32 %1, 8
%10 = select i1 %8, i32 0, i32 %9
%11 = add nsw i32 %5, %10
%12 = and i64 %6, 65536
%13 = icmp eq i64 %12, 0
%14 = shl i32 %1, 16
%15 = select i1 %13, i32 0, i32 %14
%16 = add nsw i32 %11, %15
%17 = and i64 %6, 16777216
%18 = icmp eq i64 %17, 0
%19 = shl i32 %1, 24
%20 = select i1 %18, i32 0, i32 %19
%21 = add nsw i32 %16, %20
%22 = lshr i32 %0, 1
%23 = shl i32 %1, 1
%24 = and i32 %0, 2
%25 = icmp eq i32 %24, 0
%26 = select i1 %25, i32 0, i32 %23
%27 = add nsw i32 %26, %21
%28 = zext i32 %22 to i64
%29 = and i64 %28, 256
%30 = icmp eq i64 %29, 0
%31 = shl i32 %1, 9
%32 = select i1 %30, i32 0, i32 %31
%33 = add nsw i32 %27, %32
%34 = and i64 %28, 65536
%35 = icmp eq i64 %34, 0
%36 = shl i32 %1, 17
%37 = select i1 %35, i32 0, i32 %36
%38 = add nsw i32 %33, %37
%39 = and i64 %28, 16777216
%40 = icmp eq i64 %39, 0
%41 = shl i32 %1, 25
%42 = select i1 %40, i32 0, i32 %41
%43 = add nsw i32 %38, %42
%44 = lshr i32 %0, 2
%45 = shl i32 %1, 2
%46 = and i32 %0, 4
%47 = icmp eq i32 %46, 0
%48 = select i1 %47, i32 0, i32 %45
%49 = add nsw i32 %48, %43
%50 = zext i32 %44 to i64
%51 = and i64 %50, 256
%52 = icmp eq i64 %51, 0
%53 = shl i32 %1, 10
%54 = select i1 %52, i32 0, i32 %53
%55 = add nsw i32 %49, %54
%56 = and i64 %50, 65536
%57 = icmp eq i64 %56, 0
%58 = shl i32 %1, 18
%59 = select i1 %57, i32 0, i32 %58
%60 = add nsw i32 %55, %59
%61 = and i64 %50, 16777216
%62 = icmp eq i64 %61, 0
%63 = shl i32 %1, 26
%64 = select i1 %62, i32 0, i32 %63
%65 = add nsw i32 %60, %64
%66 = lshr i32 %0, 3
%67 = shl i32 %1, 3
%68 = and i32 %0, 8
%69 = icmp eq i32 %68, 0
%70 = select i1 %69, i32 0, i32 %67
%71 = add nsw i32 %70, %65
%72 = zext i32 %66 to i64
%73 = and i64 %72, 256
%74 = icmp eq i64 %73, 0
%75 = shl i32 %1, 11
%76 = select i1 %74, i32 0, i32 %75
%77 = add nsw i32 %71, %76
%78 = and i64 %72, 65536
%79 = icmp eq i64 %78, 0
%80 = shl i32 %1, 19
%81 = select i1 %79, i32 0, i32 %80
%82 = add nsw i32 %77, %81
%83 = and i64 %72, 16777216
%84 = icmp eq i64 %83, 0
%85 = shl i32 %1, 27
%86 = select i1 %84, i32 0, i32 %85
%87 = add nsw i32 %82, %86
%88 = lshr i32 %0, 4
%89 = shl i32 %1, 4
%90 = and i32 %0, 16
%91 = icmp eq i32 %90, 0
%92 = select i1 %91, i32 0, i32 %89
%93 = add nsw i32 %92, %87
%94 = zext i32 %88 to i64
%95 = and i64 %94, 256
%96 = icmp eq i64 %95, 0
%97 = shl i32 %1, 12
%98 = select i1 %96, i32 0, i32 %97
%99 = add nsw i32 %93, %98
%100 = and i64 %94, 65536
%101 = icmp eq i64 %100, 0
%102 = shl i32 %1, 20
%103 = select i1 %101, i32 0, i32 %102
%104 = add nsw i32 %99, %103
%105 = and i64 %94, 16777216
%106 = icmp eq i64 %105, 0
%107 = shl i32 %1, 28
%108 = select i1 %106, i32 0, i32 %107
%109 = add nsw i32 %104, %108
%110 = lshr i32 %0, 5
%111 = shl i32 %1, 5
%112 = and i32 %0, 32
%113 = icmp eq i32 %112, 0
%114 = select i1 %113, i32 0, i32 %111
%115 = add nsw i32 %114, %109
%116 = zext i32 %110 to i64
%117 = and i64 %116, 256
%118 = icmp eq i64 %117, 0
%119 = shl i32 %1, 13
%120 = select i1 %118, i32 0, i32 %119
%121 = add nsw i32 %115, %120
%122 = and i64 %116, 65536
%123 = icmp eq i64 %122, 0
%124 = shl i32 %1, 21
%125 = select i1 %123, i32 0, i32 %124
%126 = add nsw i32 %121, %125
%127 = and i64 %116, 16777216
%128 = icmp eq i64 %127, 0
%129 = shl i32 %1, 29
%130 = select i1 %128, i32 0, i32 %129
%131 = add nsw i32 %126, %130
%132 = lshr i32 %0, 6
%133 = shl i32 %1, 6
%134 = and i32 %0, 64
%135 = icmp eq i32 %134, 0
%136 = select i1 %135, i32 0, i32 %133
%137 = add nsw i32 %136, %131
%138 = zext i32 %132 to i64
%139 = and i64 %138, 256
%140 = icmp eq i64 %139, 0
%141 = shl i32 %1, 14
%142 = select i1 %140, i32 0, i32 %141
%143 = add nsw i32 %137, %142
%144 = and i64 %138, 65536
%145 = icmp eq i64 %144, 0
%146 = shl i32 %1, 22
%147 = select i1 %145, i32 0, i32 %146
%148 = add nsw i32 %143, %147
%149 = and i64 %138, 16777216
%150 = icmp eq i64 %149, 0
%151 = shl i32 %1, 30
%152 = select i1 %150, i32 0, i32 %151
%153 = add nsw i32 %148, %152
%154 = lshr i32 %0, 7
%155 = shl i32 %1, 7
%156 = and i32 %0, 128
%157 = icmp eq i32 %156, 0
%158 = select i1 %157, i32 0, i32 %155
%159 = add nsw i32 %158, %153
%160 = zext i32 %154 to i64
%161 = and i64 %160, 256
%162 = icmp eq i64 %161, 0
%163 = shl i32 %1, 15
%164 = select i1 %162, i32 0, i32 %163
%165 = add nsw i32 %159, %164
%166 = and i64 %160, 65536
%167 = icmp eq i64 %166, 0
%168 = shl i32 %1, 23
%169 = select i1 %167, i32 0, i32 %168
%170 = add nsw i32 %165, %169
%171 = and i64 %160, 16777216
%172 = icmp eq i64 %171, 0
%173 = shl i32 %1, 31
%174 = select i1 %172, i32 0, i32 %173
%175 = add nsw i32 %170, %174
ret i32 %175
}