#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint32_t;
typedef unsigned long imm12;

/* Variables and functions */
int /*<<< orphan*/ ROR_C(int, int, int *, int *);
int ThumbExpandImm_C(uint32_t imm12, uint32_t carry_in, uint32_t *imm32,
                     int *carry_out) {
  uint32_t imm12_8 = ((imm12) & (0xFFFFFFFF >> (32 - (8))));
  if (((imm12 >> 10) & 0x3) == 0) {
    switch ((imm12 >> 8) & 0x3) {
    case 0x0:
      *imm32 = imm12_8;
      break;
    case 0x1:
      if (imm12_8 == 0) {
        return -1;
      } else {
        *imm32 = (imm12_8 << 16) | imm12_8;
      }
      break;
    case 0x2:
      if (imm12_8 == 0) {
        return -2;
      } else {
        *imm32 = (imm12_8 << 24) | (imm12_8 << 8);
      }
      break;
    case 0x3:
      if (imm12_8 == 0) {
        return -3;
      } else {
        *imm32 = (imm12_8 << 24) | (imm12_8 << 16) | (imm12_8 << 8) | imm12_8;
      }
      break;
    default:
      return -4;
    }
    *carry_out = carry_in;
  } else {
    uint32_t unrotated = (1ul << 7) | ((imm12) & (0xFFFFFFFF >> (32 - (7))));
    ROR_C(unrotated, ((imm12 >> 7) & (0xFFFFFFFF >> (32 - (5)))), imm32,
          carry_out);
  }
  return 0;
}


x86 assembly (clang, -O0):
<ThumbExpandImm_C>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%eax
sar    $0xa,%eax
and    $0x3,%eax
cmp    $0x0,%eax
jne    122a <ThumbExpandImm_C+0x11a>
mov    -0x8(%rbp),%eax
shr    $0x8,%eax
and    $0x3,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x3,%eax
ja     1210 <ThumbExpandImm_C+0x100>
mov    -0x30(%rbp),%rax
lea    0xe9a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    121c <ThumbExpandImm_C+0x10c>
cmpl   $0x0,-0x24(%rbp)
jne    1193 <ThumbExpandImm_C+0x83>
movl   $0xffffffff,-0x4(%rbp)
jmp    125b <ThumbExpandImm_C+0x14b>
mov    -0x24(%rbp),%ecx
shl    $0x10,%ecx
or     -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    121c <ThumbExpandImm_C+0x10c>
cmpl   $0x0,-0x24(%rbp)
jne    11bd <ThumbExpandImm_C+0xad>
movl   $0xfffffffe,-0x4(%rbp)
jmp    125b <ThumbExpandImm_C+0x14b>
mov    -0x24(%rbp),%ecx
shl    $0x18,%ecx
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
or     %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    121c <ThumbExpandImm_C+0x10c>
cmpl   $0x0,-0x24(%rbp)
jne    11ec <ThumbExpandImm_C+0xdc>
movl   $0xfffffffd,-0x4(%rbp)
jmp    125b <ThumbExpandImm_C+0x14b>
mov    -0x24(%rbp),%ecx
shl    $0x18,%ecx
mov    -0x24(%rbp),%eax
shl    $0x10,%eax
or     %eax,%ecx
mov    -0x24(%rbp),%eax
shl    $0x8,%eax
or     %eax,%ecx
or     -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    121c <ThumbExpandImm_C+0x10c>
movl   $0xfffffffc,-0x4(%rbp)
jmp    125b <ThumbExpandImm_C+0x14b>
mov    -0xc(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
jmp    1254 <ThumbExpandImm_C+0x144>
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
mov    %eax,%eax
or     $0x80,%rax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%edi
mov    -0x8(%rbp),%esi
sar    $0x7,%esi
and    $0x1f,%esi
mov    -0x18(%rbp),%rdx
mov    -0x20(%rbp),%rcx
call   1030 <ROR_C@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ThumbExpandImm_C>:
push   %rax
mov    %edi,%eax
test   $0xc00,%edi
je     1136 <ThumbExpandImm_C+0x26>
mov    %eax,%esi
or     $0x80,%esi
movzbl %sil,%edi
shr    $0x7,%eax
and    $0x1f,%eax
mov    %eax,%esi
call   1030 <ROR_C@plt>
jmp    118d <ThumbExpandImm_C+0x7d>
movzbl %al,%r8d
mov    %eax,%edi
shr    $0x8,%edi
and    $0x3,%edi
lea    0xeb7(%rip),%r9
movslq (%r9,%rdi,4),%rdi
add    %r9,%rdi
jmp    *%rdi
test   %r8d,%r8d
je     1191 <ThumbExpandImm_C+0x81>
mov    %r8d,%eax
shl    $0x10,%eax
jmp    1185 <ThumbExpandImm_C+0x75>
test   %r8d,%r8d
je     1198 <ThumbExpandImm_C+0x88>
shl    $0x18,%eax
shl    $0x8,%r8d
jmp    1185 <ThumbExpandImm_C+0x75>
test   %r8d,%r8d
je     119f <ThumbExpandImm_C+0x8f>
shl    $0x18,%eax
mov    %r8d,%edi
shl    $0x10,%edi
or     %eax,%edi
mov    %r8d,%eax
shl    $0x8,%eax
or     %edi,%eax
or     %eax,%r8d
mov    %r8d,(%rdx)
mov    %esi,(%rcx)
xor    %eax,%eax
pop    %rcx
ret
mov    $0xffffffff,%eax
pop    %rcx
ret
mov    $0xfffffffe,%eax
pop    %rcx
ret
mov    $0xfffffffd,%eax
pop    %rcx
ret

LLVM IR (-O0):
define i32 @ThumbExpandImm_C(i32 %0, i32 %1, i32* %2, i32* %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32
%11 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32* %2, i32** %8
store i32* %3, i32** %9
%12 = load i32, i32* %6
%13 = and i32 %12, 255
store i32 %13, i32* %10
%14 = load i32, i32* %6
%15 = ashr i32 %14, 10
%16 = and i32 %15, 3
%17 = icmp eq i32 %16, 0
br i1 %17, label %18, label %69
18: ; preds = %4
%19 = load i32, i32* %6
%20 = ashr i32 %19, 8
%21 = and i32 %20, 3
switch i32 %21, label %65 [
i32 0, label %22
i32 1, label %25
i32 2, label %36
i32 3, label %48
]
22: ; preds = %18
%23 = load i32, i32* %10
%24 = load i32*, i32** %8
store i32 %23, i32* %24
br label %66
25: ; preds = %18
%26 = load i32, i32* %10
%27 = icmp eq i32 %26, 0
br i1 %27, label %28, label %29
28: ; preds = %25
store i32 -1, i32* %5
br label %83
29: ; preds = %25
%30 = load i32, i32* %10
%31 = shl i32 %30, 16
%32 = load i32, i32* %10
%33 = or i32 %31, %32
%34 = load i32*, i32** %8
store i32 %33, i32* %34
br label %35
35: ; preds = %29
br label %66
36: ; preds = %18
%37 = load i32, i32* %10
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %40
39: ; preds = %36
store i32 -2, i32* %5
br label %83
40: ; preds = %36
%41 = load i32, i32* %10
%42 = shl i32 %41, 24
%43 = load i32, i32* %10
%44 = shl i32 %43, 8
%45 = or i32 %42, %44
%46 = load i32*, i32** %8
store i32 %45, i32* %46
br label %47
47: ; preds = %40
br label %66
48: ; preds = %18
%49 = load i32, i32* %10
%50 = icmp eq i32 %49, 0
br i1 %50, label %51, label %52
51: ; preds = %48
store i32 -3, i32* %5
br label %83
52: ; preds = %48
%53 = load i32, i32* %10
%54 = shl i32 %53, 24
%55 = load i32, i32* %10
%56 = shl i32 %55, 16
%57 = or i32 %54, %56
%58 = load i32, i32* %10
%59 = shl i32 %58, 8
%60 = or i32 %57, %59
%61 = load i32, i32* %10
%62 = or i32 %60, %61
%63 = load i32*, i32** %8
store i32 %62, i32* %63
br label %64
64: ; preds = %52
br label %66
65: ; preds = %18
store i32 -4, i32* %5
br label %83
66: ; preds = %64, %47, %35, %22
%67 = load i32, i32* %7
%68 = load i32*, i32** %9
store i32 %67, i32* %68
br label %82
69: ; preds = %4
%70 = load i32, i32* %6
%71 = and i32 %70, 127
%72 = zext i32 %71 to i64
%73 = or i64 128, %72
%74 = trunc i64 %73 to i32
store i32 %74, i32* %11
%75 = load i32, i32* %11
%76 = load i32, i32* %6
%77 = ashr i32 %76, 7
%78 = and i32 %77, 31
%79 = load i32*, i32** %8
%80 = load i32*, i32** %9
%81 = call i32 @ROR_C(i32 %75, i32 %78, i32* %79, i32* %80)
br label %82
82: ; preds = %69, %66
store i32 0, i32* %5
br label %83
83: ; preds = %82, %65, %51, %39, %28
%84 = load i32, i32* %5
ret i32 %84
}

LLVM IR (-O2):
define i32 @ThumbExpandImm_C(i32 %0, i32 %1, i32* %2, i32* %3) {
%5 = and i32 %0, 255
%6 = and i32 %0, 3072
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %33
8: ; preds = %4
%9 = lshr i32 %0, 8
%10 = and i32 %9, 3
switch i32 %10, label %30 [
i32 0, label %31
i32 1, label %11
i32 2, label %15
i32 3, label %21
]
11: ; preds = %8
%12 = icmp eq i32 %5, 0
br i1 %12, label %39, label %13
13: ; preds = %11
%14 = mul nuw nsw i32 %5, 65537
br label %31
15: ; preds = %8
%16 = icmp eq i32 %5, 0
br i1 %16, label %39, label %17
17: ; preds = %15
%18 = shl i32 %0, 24
%19 = shl nuw nsw i32 %5, 8
%20 = or i32 %19, %18
br label %31
21: ; preds = %8
%22 = icmp eq i32 %5, 0
br i1 %22, label %39, label %23
23: ; preds = %21
%24 = shl i32 %0, 24
%25 = shl nuw nsw i32 %5, 16
%26 = or i32 %25, %24
%27 = shl nuw nsw i32 %5, 8
%28 = or i32 %26, %27
%29 = or i32 %28, %5
br label %31
30: ; preds = %8
unreachable
31: ; preds = %8, %23, %17, %13
%32 = phi i32 [ %29, %23 ], [ %20, %17 ], [ %14, %13 ], [ %5, %8 ]
store i32 %32, i32* %2
store i32 %1, i32* %3
br label %39
33: ; preds = %4
%34 = and i32 %0, 127
%35 = or i32 %34, 128
%36 = lshr i32 %0, 7
%37 = and i32 %36, 31
%38 = tail call i32 @ROR_C(i32 %35, i32 %37, i32* %2, i32* %3)
br label %39
39: ; preds = %31, %33, %21, %15, %11
%40 = phi i32 [ -1, %11 ], [ -2, %15 ], [ -3, %21 ], [ 0, %33 ], [ 0, %31 ]
ret i32 %40
}