int conv_to_utf32(unsigned *target, const char *source, unsigned limit) {
  int rc = 0;
  int j;
  unsigned mask = 0;
  if ((*source & 0x80) == 0) {
    rc = 1;
    mask = (unsigned)*source;
  } else if ((*source & 0xe0) == 0xc0) {
    rc = 2;
    mask = (unsigned)(*source & 0x1f);
  } else if ((*source & 0xf0) == 0xe0) {
    rc = 3;
    mask = (unsigned)(*source & 0x0f);
  } else if ((*source & 0xf8) == 0xf0) {
    rc = 4;
    mask = (unsigned)(*source & 0x07);
  } else if ((*source & 0xfc) == 0xf8) {
    rc = 5;
    mask = (unsigned)(*source & 0x03);
  } else if ((*source & 0xfe) == 0xfc) {
    rc = 6;
    mask = (unsigned)(*source & 0x01);
  }
  if ((unsigned)rc > limit) {
    rc = 0;
  }
  if (rc > 1) {
    for (j = 1; j < rc; j++) {
      if ((source[j] & 0xc0) != 0x80)
        break;
    }
    if (j != rc) {
      rc = 0;
    }
  }
  if (target != 0) {
    int shift = 0;
    *target = 0;
    for (j = 1; j < rc; j++) {
      *target |= (unsigned)(source[rc - j] & 0x3f) << shift;
      shift += 6;
    }
    *target |= mask << shift;
  }
  return rc;
}


x86 assembly (clang, -O0):
<conv_to_utf32>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
jne    1148 <conv_to_utf32+0x48>
movl   $0x1,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
jmp    124c <conv_to_utf32+0x14c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    1178 <conv_to_utf32+0x78>
movl   $0x2,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x1f,%eax
mov    %eax,-0x20(%rbp)
jmp    1247 <conv_to_utf32+0x147>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    11a8 <conv_to_utf32+0xa8>
movl   $0x3,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xf,%eax
mov    %eax,-0x20(%rbp)
jmp    1242 <conv_to_utf32+0x142>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    11d8 <conv_to_utf32+0xd8>
movl   $0x4,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7,%eax
mov    %eax,-0x20(%rbp)
jmp    123d <conv_to_utf32+0x13d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xfc,%eax
cmp    $0xf8,%eax
jne    1208 <conv_to_utf32+0x108>
movl   $0x5,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x3,%eax
mov    %eax,-0x20(%rbp)
jmp    1238 <conv_to_utf32+0x138>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0xfe,%eax
cmp    $0xfc,%eax
jne    1233 <conv_to_utf32+0x133>
movl   $0x6,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1238 <conv_to_utf32+0x138>
jmp    123d <conv_to_utf32+0x13d>
jmp    1242 <conv_to_utf32+0x142>
jmp    1247 <conv_to_utf32+0x147>
jmp    124c <conv_to_utf32+0x14c>
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jbe    125f <conv_to_utf32+0x15f>
movl   $0x0,-0x18(%rbp)
cmpl   $0x1,-0x18(%rbp)
jle    12c8 <conv_to_utf32+0x1c8>
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    12b0 <conv_to_utf32+0x1b0>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0xc0,%eax
cmp    $0x80,%eax
je     129d <conv_to_utf32+0x19d>
jmp    12b0 <conv_to_utf32+0x1b0>
jmp    12a2 <conv_to_utf32+0x1a2>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1270 <conv_to_utf32+0x170>
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
je     12c3 <conv_to_utf32+0x1c3>
movl   $0x0,-0x18(%rbp)
jmp    12c8 <conv_to_utf32+0x1c8>
cmpq   $0x0,-0x8(%rbp)
je     1343 <conv_to_utf32+0x243>
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1331 <conv_to_utf32+0x231>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x3f,%eax
mov    -0x24(%rbp),%ecx
shl    %cl,%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
or     (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    12eb <conv_to_utf32+0x1eb>
mov    -0x20(%rbp),%eax
mov    -0x24(%rbp),%ecx
shl    %cl,%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
or     (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<conv_to_utf32>:
movsbl (%rsi),%r8d
mov    $0x1,%ecx
test   $0x80,%r8b
je     119c <conv_to_utf32+0x9c>
mov    %r8d,%eax
and    $0xe0,%eax
cmp    $0xc0,%eax
jne    112d <conv_to_utf32+0x2d>
and    $0x1f,%r8d
mov    $0x2,%ecx
jmp    119c <conv_to_utf32+0x9c>
mov    %r8d,%eax
and    $0xf0,%eax
cmp    $0xe0,%eax
jne    1147 <conv_to_utf32+0x47>
and    $0xf,%r8d
mov    $0x3,%ecx
jmp    119c <conv_to_utf32+0x9c>
mov    %r8d,%eax
and    $0xf8,%eax
cmp    $0xf0,%eax
jne    1161 <conv_to_utf32+0x61>
and    $0x7,%r8d
mov    $0x4,%ecx
jmp    119c <conv_to_utf32+0x9c>
mov    %r8d,%eax
and    $0xfc,%eax
cmp    $0xf8,%eax
jne    117b <conv_to_utf32+0x7b>
and    $0x3,%r8d
mov    $0x5,%ecx
jmp    119c <conv_to_utf32+0x9c>
mov    %r8d,%eax
and    $0xfe,%eax
and    $0x1,%r8d
xor    %r9d,%r9d
cmp    $0xfc,%eax
mov    $0x6,%ecx
cmovne %r9d,%ecx
cmovne %r9d,%r8d
xor    %eax,%eax
cmp    %edx,%ecx
cmovbe %ecx,%eax
cmp    $0x2,%eax
jb     122e <conv_to_utf32+0x12e>
mov    0x1(%rsi),%dl
and    $0xc0,%dl
mov    $0x1,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
cmp    $0x2,%eax
je     1225 <conv_to_utf32+0x125>
mov    0x2(%rsi),%dl
and    $0xc0,%dl
mov    $0x2,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
cmp    $0x3,%eax
je     1225 <conv_to_utf32+0x125>
mov    0x3(%rsi),%dl
and    $0xc0,%dl
mov    $0x3,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
cmp    $0x4,%eax
je     1225 <conv_to_utf32+0x125>
mov    0x4(%rsi),%dl
and    $0xc0,%dl
mov    $0x4,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
cmp    $0x5,%eax
je     1225 <conv_to_utf32+0x125>
mov    0x5(%rsi),%dl
and    $0xc0,%dl
mov    $0x5,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
cmp    $0x6,%eax
je     1225 <conv_to_utf32+0x125>
mov    0x6(%rsi),%dl
and    $0xc0,%dl
mov    $0x6,%ecx
cmp    $0x80,%dl
jne    1227 <conv_to_utf32+0x127>
mov    %eax,%ecx
xor    %edx,%edx
cmp    %eax,%ecx
cmovne %edx,%eax
test   %rdi,%rdi
je     12e8 <conv_to_utf32+0x1e8>
movl   $0x0,(%rdi)
xor    %edx,%edx
mov    $0x0,%ecx
cmp    $0x2,%eax
jl     12df <conv_to_utf32+0x1df>
mov    %eax,%r9d
movzbl -0x1(%r9,%rsi,1),%edx
and    $0x3f,%edx
mov    %edx,(%rdi)
mov    $0x6,%ecx
cmp    $0x2,%eax
je     12df <conv_to_utf32+0x1df>
movzbl -0x2(%r9,%rsi,1),%ecx
and    $0x3f,%ecx
shl    $0x6,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
mov    $0xc,%ecx
cmp    $0x3,%eax
je     12df <conv_to_utf32+0x1df>
movzbl -0x3(%r9,%rsi,1),%ecx
and    $0x3f,%ecx
shl    $0xc,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
mov    $0x12,%ecx
cmp    $0x4,%eax
je     12df <conv_to_utf32+0x1df>
movzbl -0x4(%r9,%rsi,1),%ecx
and    $0x3f,%ecx
shl    $0x12,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
mov    $0x18,%ecx
cmp    $0x5,%eax
je     12df <conv_to_utf32+0x1df>
movzbl -0x5(%r9,%rsi,1),%ecx
and    $0x3f,%ecx
shl    $0x18,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
mov    $0x1e,%ecx
cmp    $0x6,%eax
je     12df <conv_to_utf32+0x1df>
movzbl -0x6(%r9,%rsi,1),%ecx
shl    $0x1e,%ecx
or     %ecx,%edx
mov    %edx,(%rdi)
mov    $0x24,%ecx
shl    %cl,%r8d
or     %edx,%r8d
mov    %r8d,(%rdi)
ret

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

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