#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 int32_t;

/* Variables and functions */
int /*<<< orphan*/ shuffle_signed(int *, int);
int32_t nrand32(int n) {
  int32_t v = 0;
  static signed pos[32] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                           11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                           22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
  shuffle_signed(pos, 32);
  while (n--)
    v |= (1 << pos[n]);
  return v;
}


x86 assembly (clang, -O0):
<nrand32>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
lea    0x2f07(%rip),%rdi
mov    $0x20,%esi
call   1030 <shuffle_signed@plt>
mov    -0x4(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x4(%rbp)
cmp    $0x0,%eax
je     1167 <nrand32+0x57>
movslq -0x4(%rbp),%rcx
lea    0x2ede(%rip),%rax
mov    (%rax,%rcx,4),%ecx
mov    $0x1,%eax
shl    %cl,%eax
or     -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
jmp    1133 <nrand32+0x23>
mov    -0x8(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nrand32>:
push   %r14
push   %rbx
push   %rax
mov    %edi,%ebx
lea    0x2f13(%rip),%r14
mov    %r14,%rdi
mov    $0x20,%esi
call   1030 <shuffle_signed@plt>
test   %ebx,%ebx
je     1142 <nrand32+0x32>
movslq %ebx,%rdx
lea    -0x1(%rbx),%eax
mov    %ebx,%ecx
and    $0x3,%ecx
cmp    $0x3,%eax
jae    1146 <nrand32+0x36>
xor    %eax,%eax
jmp    117d <nrand32+0x6d>
xor    %eax,%eax
jmp    119f <nrand32+0x8f>
and    $0xfffffffc,%ebx
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
movzbl -0x4(%r14,%rdx,4),%esi
bts    %esi,%eax
movzbl -0x8(%r14,%rdx,4),%esi
bts    %esi,%eax
movzbl -0x10(%r14,%rdx,4),%esi
movzbl -0xc(%r14,%rdx,4),%edi
bts    %edi,%eax
add    $0xfffffffffffffffc,%rdx
bts    %esi,%eax
add    $0xfffffffc,%ebx
jne    1150 <nrand32+0x40>
test   %ecx,%ecx
je     119f <nrand32+0x8f>
lea    (%r14,%rdx,4),%rdx
add    $0xfffffffffffffffc,%rdx
neg    %ecx
xor    %esi,%esi
nopl   (%rax)
movzbl (%rdx,%rsi,4),%edi
bts    %edi,%eax
add    $0xffffffffffffffff,%rsi
cmp    %esi,%ecx
jne    1190 <nrand32+0x80>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
@nrand32.pos = internal global [32 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31]
define i32 @nrand32(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
%4 = call i32 @shuffle_signed(i32* getelementptr inbounds ([32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 0), i32 32)
br label %5
5: ; preds = %9, %1
%6 = load i32, i32* %2
%7 = add nsw i32 %6, -1
store i32 %7, i32* %2
%8 = icmp ne i32 %6, 0
br i1 %8, label %9, label %17
9: ; preds = %5
%10 = load i32, i32* %2
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %11
%13 = load i32, i32* %12
%14 = shl i32 1, %13
%15 = load i32, i32* %3
%16 = or i32 %15, %14
store i32 %16, i32* %3
br label %5
17: ; preds = %5
%18 = load i32, i32* %3
ret i32 %18
}

LLVM IR (-O2):
@nrand32.pos = internal global [32 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31]
define i32 @nrand32(i32 %0) {
%2 = tail call i32 @shuffle_signed(i32* getelementptr inbounds ([32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 0), i32 32)
%3 = icmp eq i32 %0, 0
br i1 %3, label %53, label %4
4: ; preds = %1
%5 = sext i32 %0 to i64
%6 = add i32 %0, -1
%7 = and i32 %0, 3
%8 = icmp ult i32 %6, 3
br i1 %8, label %37, label %9
9: ; preds = %4
%10 = and i32 %0, -4
br label %11
11: ; preds = %11, %9
%12 = phi i64 [ %5, %9 ], [ %30, %11 ]
%13 = phi i32 [ 0, %9 ], [ %34, %11 ]
%14 = phi i32 [ 0, %9 ], [ %35, %11 ]
%15 = add nsw i64 %12, -1
%16 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %15
%17 = load i32, i32* %16
%18 = shl nuw i32 1, %17
%19 = or i32 %18, %13
%20 = add nsw i64 %12, -2
%21 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %20
%22 = load i32, i32* %21
%23 = shl nuw i32 1, %22
%24 = or i32 %23, %19
%25 = add nsw i64 %12, -3
%26 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = shl nuw i32 1, %27
%29 = or i32 %28, %24
%30 = add nsw i64 %12, -4
%31 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %30
%32 = load i32, i32* %31
%33 = shl nuw i32 1, %32
%34 = or i32 %33, %29
%35 = add i32 %14, 4
%36 = icmp eq i32 %35, %10
br i1 %36, label %37, label %11
37: ; preds = %11, %4
%38 = phi i32 [ undef, %4 ], [ %34, %11 ]
%39 = phi i64 [ %5, %4 ], [ %30, %11 ]
%40 = phi i32 [ 0, %4 ], [ %34, %11 ]
%41 = icmp eq i32 %7, 0
br i1 %41, label %53, label %42
42: ; preds = %37, %42
%43 = phi i64 [ %46, %42 ], [ %39, %37 ]
%44 = phi i32 [ %50, %42 ], [ %40, %37 ]
%45 = phi i32 [ %51, %42 ], [ 0, %37 ]
%46 = add nsw i64 %43, -1
%47 = getelementptr inbounds [32 x i32], [32 x i32]* @nrand32.pos, i64 0, i64 %46
%48 = load i32, i32* %47
%49 = shl nuw i32 1, %48
%50 = or i32 %49, %44
%51 = add i32 %45, 1
%52 = icmp eq i32 %51, %7
br i1 %52, label %53, label %42
53: ; preds = %37, %42, %1
%54 = phi i32 [ 0, %1 ], [ %38, %37 ], [ %50, %42 ]
ret i32 %54
}