#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 uint8_t;
typedef int uint32_t;

/* Variables and functions */
void *cgc_memset(void *ptr, int value, size_t num) {
  void *ptr_temp = ptr;
  uint8_t set_value_byte = (uint8_t)value;
  uint32_t set_value_dword = (set_value_byte << 24) | (set_value_byte << 16) |
                             (set_value_byte << 8) | set_value_byte;
  while (num >= 4) {
    *((uint32_t *)ptr) = set_value_dword;
    ptr += 4;
    num -= 4;
  }
  while (num > 0) {
    *((uint8_t *)ptr++) = set_value_byte;
    num--;
  }
  return (ptr_temp);
}


x86 assembly (clang, -O0):
<cgc_memset>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x18,%eax
mov    -0x24(%rbp),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
mov    -0x24(%rbp),%ecx
shl    $0x8,%ecx
or     %ecx,%eax
or     -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
cmpq   $0x4,-0x18(%rbp)
jb     116a <cgc_memset+0x6a>
mov    -0x28(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1139 <cgc_memset+0x39>
jmp    116f <cgc_memset+0x6f>
cmpq   $0x0,-0x18(%rbp)
jbe    119f <cgc_memset+0x9f>
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    116f <cgc_memset+0x6f>
mov    -0x20(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cgc_memset>:
push   %rbx
mov    %rdi,%rax
cmp    $0x4,%rdx
jb     1135 <cgc_memset+0x35>
mov    %esi,%ecx
shl    $0x18,%ecx
mov    %esi,%r11d
shl    $0x10,%r11d
mov    %esi,%edi
shl    $0x8,%edi
or     %ecx,%edi
or     %esi,%r11d
or     %edi,%r11d
lea    -0x4(%rdx),%r8
cmp    $0x1c,%r8
jae    113d <cgc_memset+0x3d>
mov    %rax,%rdi
jmp    1200 <cgc_memset+0x100>
mov    %rax,%rdi
jmp    1211 <cgc_memset+0x111>
shr    $0x2,%r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff8,%r9
movd   %r11d,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x8(%r9),%rcx
mov    %rcx,%rdi
shr    $0x3,%rdi
add    $0x1,%rdi
mov    %edi,%r10d
and    $0x3,%r10d
cmp    $0x18,%rcx
jae    1176 <cgc_memset+0x76>
xor    %ecx,%ecx
jmp    11b9 <cgc_memset+0xb9>
and    $0xfffffffffffffffc,%rdi
xor    %ecx,%ecx
nopl   0x0(%rax)
movdqu %xmm0,(%rax,%rcx,4)
movdqu %xmm0,0x10(%rax,%rcx,4)
movdqu %xmm0,0x20(%rax,%rcx,4)
movdqu %xmm0,0x30(%rax,%rcx,4)
movdqu %xmm0,0x40(%rax,%rcx,4)
movdqu %xmm0,0x50(%rax,%rcx,4)
movdqu %xmm0,0x60(%rax,%rcx,4)
movdqu %xmm0,0x70(%rax,%rcx,4)
add    $0x20,%rcx
add    $0xfffffffffffffffc,%rdi
jne    1180 <cgc_memset+0x80>
lea    0x0(,%r9,4),%rbx
test   %r10,%r10
je     11f4 <cgc_memset+0xf4>
lea    (%rax,%rcx,4),%rcx
add    $0x10,%rcx
shl    $0x5,%r10
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu %xmm0,-0x10(%rcx,%rdi,1)
movdqu %xmm0,(%rcx,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%r10
jne    11e0 <cgc_memset+0xe0>
lea    (%rax,%r9,4),%rdi
sub    %rbx,%rdx
cmp    %r9,%r8
je     1211 <cgc_memset+0x111>
mov    %r11d,(%rdi)
add    $0x4,%rdi
add    $0xfffffffffffffffc,%rdx
cmp    $0x3,%rdx
ja     1200 <cgc_memset+0x100>
test   %rdx,%rdx
je     1278 <cgc_memset+0x178>
lea    -0x1(%rdx),%r8
mov    %rdx,%rcx
and    $0x7,%rcx
je     1242 <cgc_memset+0x142>
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
mov    %esi,(%rdi,%rbx,1)
add    $0x1,%rbx
cmp    %rbx,%rcx
jne    1230 <cgc_memset+0x130>
add    %rbx,%rdi
sub    %rbx,%rdx
cmp    $0x7,%r8
jb     1278 <cgc_memset+0x178>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %esi,(%rdi,%rcx,1)
mov    %esi,0x1(%rdi,%rcx,1)
mov    %esi,0x2(%rdi,%rcx,1)
mov    %esi,0x3(%rdi,%rcx,1)
mov    %esi,0x4(%rdi,%rcx,1)
mov    %esi,0x5(%rdi,%rcx,1)
mov    %esi,0x6(%rdi,%rcx,1)
mov    %esi,0x7(%rdi,%rcx,1)
add    $0x8,%rcx
cmp    %rcx,%rdx
jne    1250 <cgc_memset+0x150>
pop    %rbx
ret

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

LLVM IR (-O2):
define i8* @cgc_memset(i8* returned writeonly %0, i32 %1, i64 %2) {
%4 = shl i32 %1, 24
%5 = shl i32 %1, 16
%6 = shl i32 %1, 8
%7 = or i32 %5, %1
%8 = or i32 %7, %4
%9 = or i32 %8, %6
%10 = icmp ugt i64 %2, 3
br i1 %10, label %11, label %81
11: ; preds = %3
%12 = add i64 %2, -4
%13 = lshr i64 %12, 2
%14 = add nuw nsw i64 %13, 1
%15 = icmp ult i64 %12, 28
br i1 %15, label %78, label %16
16: ; preds = %11
%17 = and i64 %14, 9223372036854775800
%18 = shl i64 %17, 2
%19 = getelementptr i8, i8* %0, i64 %18
%20 = mul i64 %17, -4
%21 = add i64 %20, %2
%22 = insertelement <4 x i32> poison, i32 %9, i64 0
%23 = shufflevector <4 x i32> %22, <4 x i32> poison, <4 x i32> zeroinitializer
%24 = insertelement <4 x i32> poison, i32 %9, i64 0
%25 = shufflevector <4 x i32> %24, <4 x i32> poison, <4 x i32> zeroinitializer
%26 = add nsw i64 %17, -8
%27 = lshr exact i64 %26, 3
%28 = add nuw nsw i64 %27, 1
%29 = and i64 %28, 3
%30 = icmp ult i64 %26, 24
br i1 %30, label %62, label %31
31: ; preds = %16
%32 = and i64 %28, 4611686018427387900
br label %33
33: ; preds = %33, %31
%34 = phi i64 [ 0, %31 ], [ %59, %33 ]
%35 = phi i64 [ 0, %31 ], [ %60, %33 ]
%36 = shl i64 %34, 2
%37 = getelementptr i8, i8* %0, i64 %36
%38 = bitcast i8* %37 to <4 x i32>*
store <4 x i32> %23, <4 x i32>* %38
%39 = getelementptr i8, i8* %37, i64 16
%40 = bitcast i8* %39 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %40
%41 = shl i64 %34, 2
%42 = or i64 %41, 32
%43 = getelementptr i8, i8* %0, i64 %42
%44 = bitcast i8* %43 to <4 x i32>*
store <4 x i32> %23, <4 x i32>* %44
%45 = getelementptr i8, i8* %43, i64 16
%46 = bitcast i8* %45 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %46
%47 = shl i64 %34, 2
%48 = or i64 %47, 64
%49 = getelementptr i8, i8* %0, i64 %48
%50 = bitcast i8* %49 to <4 x i32>*
store <4 x i32> %23, <4 x i32>* %50
%51 = getelementptr i8, i8* %49, i64 16
%52 = bitcast i8* %51 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %52
%53 = shl i64 %34, 2
%54 = or i64 %53, 96
%55 = getelementptr i8, i8* %0, i64 %54
%56 = bitcast i8* %55 to <4 x i32>*
store <4 x i32> %23, <4 x i32>* %56
%57 = getelementptr i8, i8* %55, i64 16
%58 = bitcast i8* %57 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %58
%59 = add nuw i64 %34, 32
%60 = add i64 %35, 4
%61 = icmp eq i64 %60, %32
br i1 %61, label %62, label %33
62: ; preds = %33, %16
%63 = phi i64 [ 0, %16 ], [ %59, %33 ]
%64 = icmp eq i64 %29, 0
br i1 %64, label %76, label %65
65: ; preds = %62, %65
%66 = phi i64 [ %73, %65 ], [ %63, %62 ]
%67 = phi i64 [ %74, %65 ], [ 0, %62 ]
%68 = shl i64 %66, 2
%69 = getelementptr i8, i8* %0, i64 %68
%70 = bitcast i8* %69 to <4 x i32>*
store <4 x i32> %23, <4 x i32>* %70
%71 = getelementptr i8, i8* %69, i64 16
%72 = bitcast i8* %71 to <4 x i32>*
store <4 x i32> %25, <4 x i32>* %72
%73 = add nuw i64 %66, 8
%74 = add i64 %67, 1
%75 = icmp eq i64 %74, %29
br i1 %75, label %76, label %65
76: ; preds = %65, %62
%77 = icmp eq i64 %14, %17
br i1 %77, label %81, label %78
78: ; preds = %11, %76
%79 = phi i8* [ %0, %11 ], [ %19, %76 ]
%80 = phi i64 [ %2, %11 ], [ %21, %76 ]
br label %102
81: ; preds = %102, %76, %3
%82 = phi i64 [ %2, %3 ], [ %21, %76 ], [ %107, %102 ]
%83 = phi i8* [ %0, %3 ], [ %19, %76 ], [ %106, %102 ]
%84 = icmp eq i64 %82, 0
br i1 %84, label %130, label %85
85: ; preds = %81
%86 = add i64 %82, -1
%87 = and i64 %82, 7
%88 = icmp eq i64 %87, 0
br i1 %88, label %98, label %89
89: ; preds = %85, %89
%90 = phi i8* [ %93, %89 ], [ %83, %85 ]
%91 = phi i64 [ %95, %89 ], [ %82, %85 ]
%92 = phi i64 [ %96, %89 ], [ 0, %85 ]
%93 = getelementptr inbounds i8, i8* %90, i64 1
%94 = bitcast i8* %90 to i32*
store i32 %1, i32* %94
%95 = add i64 %91, -1
%96 = add i64 %92, 1
%97 = icmp eq i64 %96, %87
br i1 %97, label %98, label %89
98: ; preds = %89, %85
%99 = phi i8* [ %83, %85 ], [ %93, %89 ]
%100 = phi i64 [ %82, %85 ], [ %95, %89 ]
%101 = icmp ult i64 %86, 7
br i1 %101, label %130, label %109
102: ; preds = %78, %102
%103 = phi i8* [ %106, %102 ], [ %79, %78 ]
%104 = phi i64 [ %107, %102 ], [ %80, %78 ]
%105 = bitcast i8* %103 to i32*
store i32 %9, i32* %105
%106 = getelementptr i8, i8* %103, i64 4
%107 = add i64 %104, -4
%108 = icmp ugt i64 %107, 3
br i1 %108, label %102, label %81
109: ; preds = %98, %109
%110 = phi i8* [ %126, %109 ], [ %99, %98 ]
%111 = phi i64 [ %128, %109 ], [ %100, %98 ]
%112 = getelementptr inbounds i8, i8* %110, i64 1
%113 = bitcast i8* %110 to i32*
store i32 %1, i32* %113
%114 = getelementptr inbounds i8, i8* %110, i64 2
%115 = bitcast i8* %112 to i32*
store i32 %1, i32* %115
%116 = getelementptr inbounds i8, i8* %110, i64 3
%117 = bitcast i8* %114 to i32*
store i32 %1, i32* %117
%118 = getelementptr inbounds i8, i8* %110, i64 4
%119 = bitcast i8* %116 to i32*
store i32 %1, i32* %119
%120 = getelementptr inbounds i8, i8* %110, i64 5
%121 = bitcast i8* %118 to i32*
store i32 %1, i32* %121
%122 = getelementptr inbounds i8, i8* %110, i64 6
%123 = bitcast i8* %120 to i32*
store i32 %1, i32* %123
%124 = getelementptr inbounds i8, i8* %110, i64 7
%125 = bitcast i8* %122 to i32*
store i32 %1, i32* %125
%126 = getelementptr inbounds i8, i8* %110, i64 8
%127 = bitcast i8* %124 to i32*
store i32 %1, i32* %127
%128 = add i64 %111, -8
%129 = icmp eq i64 %128, 0
br i1 %129, label %130, label %109
130: ; preds = %98, %109, %81
ret i8* %0
}