#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 */

/* Variables and functions */
long abs(long);
void set_bytes(long in, int numbytes, char *out) {
  int i;
  long tmp;
  tmp = abs(in);
  for (i = 0; i < numbytes; i++) {
    out[numbytes - 1 - i] =
        (tmp << (sizeof(long) - (i + 1)) * 8) >> (sizeof(long) - 1) * 8;
  }
  if (in < 0)
    out[0] |= 0x0080;
}


x86 assembly (clang, -O0):
<set_bytes>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <abs@plt>
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1186 <set_bytes+0x76>
mov    -0x28(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rdx
mov    $0x8,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
shl    %cl,%rax
sar    $0x38,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1137 <set_bytes+0x27>
cmpq   $0x0,-0x8(%rbp)
jge    11a0 <set_bytes+0x90>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
or     $0x80,%ecx
mov    %cl,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_bytes>:
push   %rbx
mov    %rdi,%r8
neg    %r8
cmovs  %rdi,%r8
test   %esi,%esi
jle    14f8 <set_bytes+0x3f8>
mov    %esi,%r9d
cmp    $0x10,%esi
jae    1123 <set_bytes+0x23>
xor    %r10d,%r10d
jmp    145e <set_bytes+0x35e>
lea    -0x1(%r9),%r11
lea    -0x1(%rsi),%eax
mov    %eax,%ecx
sub    %r11d,%ecx
xor    %r10d,%r10d
cmp    %eax,%ecx
jg     145e <set_bytes+0x35e>
shr    $0x20,%r11
jne    145e <set_bytes+0x35e>
mov    %r9d,%r10d
and    $0xfffffff0,%r10d
movq   %r8,%xmm0
pshufd $0x44,%xmm0,%xmm8
movdqa 0xea2(%rip),%xmm2
movdqa 0xea9(%rip),%xmm13
movdqa 0xeb0(%rip),%xmm10
movdqa 0xeb8(%rip),%xmm3
movdqa 0xec0(%rip),%xmm5
movdqa 0xec8(%rip),%xmm6
movdqa 0xed0(%rip),%xmm1
movdqa 0xed8(%rip),%xmm0
mov    %r10,%rcx
pcmpeqd %xmm9,%xmm9
movdqa 0xed7(%rip),%xmm15
nopl   0x0(%rax)
movdqa %xmm0,-0x70(%rsp)
movdqa %xmm1,-0x10(%rsp)
movdqa %xmm6,-0x60(%rsp)
movdqa %xmm5,-0x50(%rsp)
movdqa %xmm3,-0x40(%rsp)
movdqa %xmm10,-0x30(%rsp)
movdqa %xmm2,-0x20(%rsp)
movdqa -0x20(%rsp),%xmm2
pxor   %xmm9,%xmm2
movdqa -0x40(%rsp),%xmm4
pxor   %xmm9,%xmm4
movdqa -0x30(%rsp),%xmm14
pxor   %xmm9,%xmm14
movdqa -0x60(%rsp),%xmm6
pxor   %xmm9,%xmm6
movdqa -0x50(%rsp),%xmm5
pxor   %xmm9,%xmm5
movdqa -0x70(%rsp),%xmm0
pxor   %xmm9,%xmm0
movdqa %xmm1,%xmm3
pxor   %xmm9,%xmm3
psllq  $0x3,%xmm3
psllq  $0x3,%xmm0
psllq  $0x3,%xmm5
psllq  $0x3,%xmm6
psllq  $0x3,%xmm14
psllq  $0x3,%xmm4
psllq  $0x3,%xmm2
paddq  %xmm15,%xmm2
paddq  %xmm15,%xmm4
paddq  %xmm15,%xmm14
paddq  %xmm15,%xmm3
movdqa %xmm8,%xmm12
psllq  %xmm3,%xmm12
paddq  %xmm15,%xmm5
pshufd $0xee,%xmm3,%xmm7
movdqa %xmm8,%xmm3
psllq  %xmm7,%xmm3
paddq  %xmm15,%xmm0
movdqa %xmm8,%xmm7
psllq  %xmm0,%xmm7
pshufd $0xee,%xmm0,%xmm1
movdqa %xmm8,%xmm0
psllq  %xmm1,%xmm0
movdqa %xmm8,%xmm1
psllq  %xmm5,%xmm1
paddq  %xmm15,%xmm6
pshufd $0xee,%xmm5,%xmm5
movdqa %xmm8,%xmm11
psllq  %xmm5,%xmm11
movsd  %xmm12,%xmm3
movdqa %xmm8,%xmm12
psllq  %xmm6,%xmm12
pshufd $0xee,%xmm6,%xmm5
movdqa %xmm8,%xmm6
psllq  %xmm5,%xmm6
movdqa %xmm13,%xmm10
movdqa %xmm8,%xmm13
psllq  %xmm14,%xmm13
movsd  %xmm7,%xmm0
pshufd $0xee,%xmm14,%xmm7
movdqa %xmm8,%xmm5
psllq  %xmm7,%xmm5
movsd  %xmm1,%xmm11
movdqa %xmm8,%xmm14
psllq  %xmm4,%xmm14
pshufd $0xee,%xmm4,%xmm7
movdqa %xmm8,%xmm4
psllq  %xmm7,%xmm4
movdqa %xmm8,%xmm7
psllq  %xmm2,%xmm7
movsd  %xmm12,%xmm6
pshufd $0xee,%xmm2,%xmm12
movdqa %xmm8,%xmm2
psllq  %xmm12,%xmm2
movsd  %xmm13,%xmm5
movdqa %xmm10,%xmm13
movdqa %xmm10,%xmm1
pxor   %xmm9,%xmm1
psllq  $0x3,%xmm1
paddq  %xmm15,%xmm1
movsd  %xmm14,%xmm4
movdqa -0x30(%rsp),%xmm10
movsd  %xmm7,%xmm2
movdqa %xmm8,%xmm7
psllq  %xmm1,%xmm7
pshufd $0xee,%xmm1,%xmm12
movdqa %xmm8,%xmm1
psllq  %xmm12,%xmm1
movsd  %xmm7,%xmm1
psrlq  $0x38,%xmm1
psrlq  $0x38,%xmm2
packuswb %xmm2,%xmm1
movdqa -0x20(%rsp),%xmm2
psrlq  $0x38,%xmm4
psrlq  $0x38,%xmm5
packuswb %xmm5,%xmm4
movdqa -0x50(%rsp),%xmm5
packuswb %xmm1,%xmm4
psrlq  $0x38,%xmm6
psrlq  $0x38,%xmm11
packuswb %xmm11,%xmm6
psrlq  $0x38,%xmm0
psrlq  $0x38,%xmm3
packuswb %xmm3,%xmm0
packuswb %xmm6,%xmm0
movdqa -0x60(%rsp),%xmm6
packuswb %xmm4,%xmm0
movdqa -0x40(%rsp),%xmm3
movdqa %xmm0,%xmm1
pxor   %xmm4,%xmm4
punpcklbw %xmm4,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
punpckhbw %xmm4,%xmm0
pshufd $0x4e,%xmm0,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm1,%xmm0
movdqa -0x10(%rsp),%xmm1
cltq
movdqu %xmm0,-0xf(%rdx,%rax,1)
movdqa -0x70(%rsp),%xmm0
movdqa 0xc6a(%rip),%xmm4
paddq  %xmm4,%xmm0
paddq  %xmm4,%xmm1
paddq  %xmm4,%xmm6
paddq  %xmm4,%xmm5
paddq  %xmm4,%xmm3
paddq  %xmm4,%xmm10
paddq  %xmm4,%xmm13
paddq  %xmm4,%xmm2
add    $0xfffffff0,%eax
add    $0xfffffffffffffff0,%rcx
jne    11b0 <set_bytes+0xb0>
cmp    %r9,%r10
je     14f8 <set_bytes+0x3f8>
mov    %r10,%rax
not    %rax
test   $0x1,%r9b
je     1494 <set_bytes+0x394>
mov    %r10,%r11
or     $0x1,%r11
lea    0x0(,%r11,8),%ecx
neg    %cl
mov    %r8,%rbx
shl    %cl,%rbx
shr    $0x38,%rbx
not    %r10d
add    %esi,%r10d
movslq %r10d,%rcx
mov    %bl,(%rdx,%rcx,1)
mov    %r11,%r10
add    %r9,%rax
je     14f8 <set_bytes+0x3f8>
sub    %r10,%r9
lea    0x0(,%r10,8),%rcx
mov    $0x30,%eax
sub    %rcx,%rax
not    %r10d
add    %esi,%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    0x8(%rax),%ecx
mov    %r8,%rsi
shl    %cl,%rsi
shr    $0x38,%rsi
movslq %r10d,%r10
mov    %r8,%rbx
mov    %eax,%ecx
shl    %cl,%rbx
mov    %sil,(%rdx,%r10,1)
shr    $0x38,%rbx
lea    -0x1(%r10),%ecx
movslq %ecx,%rcx
mov    %bl,(%rdx,%rcx,1)
add    $0xfffffffffffffff0,%rax
add    $0xfffffffe,%r10d
add    $0xfffffffffffffffe,%r9
jne    14c0 <set_bytes+0x3c0>
test   %rdi,%rdi
js     14ff <set_bytes+0x3ff>
pop    %rbx
ret
orb    $0x80,(%rdx)
pop    %rbx
ret

LLVM IR (-O0):
define void @set_bytes(i64 %0, i32 %1, i8* %2) {
%4 = alloca i64
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i64
store i64 %0, i64* %4
store i32 %1, i32* %5
store i8* %2, i8** %6
%9 = load i64, i64* %4
%10 = call i64 @abs(i64 %9)
store i64 %10, i64* %8
store i32 0, i32* %7
br label %11
11: ; preds = %32, %3
%12 = load i32, i32* %7
%13 = load i32, i32* %5
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %35
15: ; preds = %11
%16 = load i64, i64* %8
%17 = load i32, i32* %7
%18 = add nsw i32 %17, 1
%19 = sext i32 %18 to i64
%20 = sub i64 8, %19
%21 = mul i64 %20, 8
%22 = shl i64 %16, %21
%23 = ashr i64 %22, 56
%24 = trunc i64 %23 to i8
%25 = load i8*, i8** %6
%26 = load i32, i32* %5
%27 = sub nsw i32 %26, 1
%28 = load i32, i32* %7
%29 = sub nsw i32 %27, %28
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %25, i64 %30
store i8 %24, i8* %31
br label %32
32: ; preds = %15
%33 = load i32, i32* %7
%34 = add nsw i32 %33, 1
store i32 %34, i32* %7
br label %11
35: ; preds = %11
%36 = load i64, i64* %4
%37 = icmp slt i64 %36, 0
br i1 %37, label %38, label %45
38: ; preds = %35
%39 = load i8*, i8** %6
%40 = getelementptr inbounds i8, i8* %39, i64 0
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = or i32 %42, 128
%44 = trunc i32 %43 to i8
store i8 %44, i8* %40
br label %45
45: ; preds = %38, %35
ret void
}

LLVM IR (-O2):
define void @set_bytes(i64 %0, i32 %1, i8* nocapture %2) {
%4 = tail call i64 @llvm.abs.i64(i64 %0, i1 true)
%5 = icmp sgt i32 %1, 0
br i1 %5, label %6, label %89
6: ; preds = %3
%7 = zext i32 %1 to i64
%8 = icmp ult i32 %1, 16
br i1 %8, label %43, label %9
9: ; preds = %6
%10 = add nsw i64 %7, -1
%11 = add i32 %1, -1
%12 = trunc i64 %10 to i32
%13 = sub i32 %11, %12
%14 = icmp sgt i32 %13, %11
%15 = icmp ugt i64 %10, 4294967295
%16 = or i1 %14, %15
br i1 %16, label %43, label %17
17: ; preds = %9
%18 = and i64 %7, 4294967280
%19 = insertelement <16 x i64> poison, i64 %4, i64 0
%20 = shufflevector <16 x i64> %19, <16 x i64> poison, <16 x i32> zeroinitializer
%21 = getelementptr inbounds i8, i8* %2, i64 -15
br label %22
22: ; preds = %22, %17
%23 = phi i64 [ 0, %17 ], [ %38, %22 ]
%24 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %17 ], [ %39, %22 ]
%25 = trunc i64 %23 to i32
%26 = xor <16 x i64> %24, <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>
%27 = shl <16 x i64> %26, <i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3>
%28 = add nsw <16 x i64> %27, <i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64>
%29 = shl <16 x i64> %20, %28
%30 = lshr <16 x i64> %29, <i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56, i64 56>
%31 = trunc <16 x i64> %30 to <16 x i8>
%32 = xor i32 %25, -1
%33 = add i32 %32, %1
%34 = sext i32 %33 to i64
%35 = shufflevector <16 x i8> %31, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%36 = getelementptr inbounds i8, i8* %21, i64 %34
%37 = bitcast i8* %36 to <16 x i8>*
store <16 x i8> %35, <16 x i8>* %37
%38 = add nuw i64 %23, 16
%39 = add <16 x i64> %24, <i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16>
%40 = icmp eq i64 %38, %18
br i1 %40, label %41, label %22
41: ; preds = %22
%42 = icmp eq i64 %18, %7
br i1 %42, label %89, label %43
43: ; preds = %9, %6, %41
%44 = phi i64 [ 0, %9 ], [ 0, %6 ], [ %18, %41 ]
%45 = xor i64 %44, -1
%46 = and i64 %7, 1
%47 = icmp eq i64 %46, 0
br i1 %47, label %60, label %48
48: ; preds = %43
%49 = or i64 %44, 1
%50 = mul nsw i64 %49, -8
%51 = add nsw i64 %50, 64
%52 = shl i64 %4, %51
%53 = lshr i64 %52, 56
%54 = trunc i64 %53 to i8
%55 = trunc i64 %44 to i32
%56 = xor i32 %55, -1
%57 = add i32 %56, %1
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %2, i64 %58
store i8 %54, i8* %59
br label %60
60: ; preds = %48, %43
%61 = phi i64 [ %44, %43 ], [ %49, %48 ]
%62 = sub nsw i64 0, %7
%63 = icmp eq i64 %45, %62
br i1 %63, label %89, label %64
64: ; preds = %60, %64
%65 = phi i64 [ %77, %64 ], [ %61, %60 ]
%66 = add nuw nsw i64 %65, 1
%67 = mul nsw i64 %66, -8
%68 = add nsw i64 %67, 64
%69 = shl i64 %4, %68
%70 = lshr i64 %69, 56
%71 = trunc i64 %70 to i8
%72 = trunc i64 %65 to i32
%73 = xor i32 %72, -1
%74 = add i32 %73, %1
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds i8, i8* %2, i64 %75
store i8 %71, i8* %76
%77 = add nuw nsw i64 %65, 2
%78 = mul nsw i64 %77, -8
%79 = add nsw i64 %78, 64
%80 = shl i64 %4, %79
%81 = lshr i64 %80, 56
%82 = trunc i64 %81 to i8
%83 = trunc i64 %66 to i32
%84 = xor i32 %83, -1
%85 = add i32 %84, %1
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %2, i64 %86
store i8 %82, i8* %87
%88 = icmp eq i64 %77, %7
br i1 %88, label %89, label %64
89: ; preds = %60, %64, %41, %3
%90 = icmp slt i64 %0, 0
br i1 %90, label %91, label %94
91: ; preds = %89
%92 = load i8, i8* %2
%93 = or i8 %92, -128
store i8 %93, i8* %2
br label %94
94: ; preds = %91, %89
ret void
}