void reinitialize(unsigned long factors[3][100], unsigned long powers[3][100],
                  unsigned long number_of_factors[3]) {
  int i, j;
  for (i = 0; i < 3; i++) {
    number_of_factors[i] = 0;
    for (j = 0; j < 4; j++)
      factors[i][j] = powers[i][j] = 0;
  }
}


x86 assembly (clang, -O0):
<reinitialize>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x3,-0x1c(%rbp)
jge    119f <reinitialize+0x9f>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
movl   $0x0,-0x20(%rbp)
cmpl   $0x4,-0x20(%rbp)
jge    118c <reinitialize+0x8c>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   $0x320,%rcx,%rcx
add    %rcx,%rax
movslq -0x20(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1138 <reinitialize+0x38>
jmp    1191 <reinitialize+0x91>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1117 <reinitialize+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<reinitialize>:
movq   $0x0,(%rdx)
movq   $0x0,(%rsi)
movq   $0x0,(%rdi)
movq   $0x0,0x8(%rsi)
movq   $0x0,0x8(%rdi)
movq   $0x0,0x10(%rsi)
movq   $0x0,0x10(%rdi)
movq   $0x0,0x18(%rsi)
movq   $0x0,0x18(%rdi)
movq   $0x0,0x8(%rdx)
movq   $0x0,0x320(%rsi)
movq   $0x0,0x320(%rdi)
movq   $0x0,0x328(%rsi)
movq   $0x0,0x328(%rdi)
movq   $0x0,0x330(%rsi)
movq   $0x0,0x330(%rdi)
movq   $0x0,0x338(%rsi)
movq   $0x0,0x338(%rdi)
movq   $0x0,0x10(%rdx)
movq   $0x0,0x640(%rsi)
movq   $0x0,0x640(%rdi)
movq   $0x0,0x648(%rsi)
movq   $0x0,0x648(%rdi)
movq   $0x0,0x650(%rsi)
movq   $0x0,0x650(%rdi)
movq   $0x0,0x658(%rsi)
movq   $0x0,0x658(%rdi)
ret

LLVM IR (-O0):
define void @reinitialize([100 x i64]* %0, [100 x i64]* %1, i64* %2) {
%4 = alloca [100 x i64]*
%5 = alloca [100 x i64]*
%6 = alloca i64*
%7 = alloca i32
%8 = alloca i32
store [100 x i64]* %0, [100 x i64]** %4
store [100 x i64]* %1, [100 x i64]** %5
store i64* %2, i64** %6
store i32 0, i32* %7
br label %9
9: ; preds = %39, %3
%10 = load i32, i32* %7
%11 = icmp slt i32 %10, 3
br i1 %11, label %12, label %42
12: ; preds = %9
%13 = load i64*, i64** %6
%14 = load i32, i32* %7
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i64, i64* %13, i64 %15
store i64 0, i64* %16
store i32 0, i32* %8
br label %17
17: ; preds = %35, %12
%18 = load i32, i32* %8
%19 = icmp slt i32 %18, 4
br i1 %19, label %20, label %38
20: ; preds = %17
%21 = load [100 x i64]*, [100 x i64]** %5
%22 = load i32, i32* %7
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [100 x i64], [100 x i64]* %21, i64 %23
%25 = load i32, i32* %8
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds [100 x i64], [100 x i64]* %24, i64 0, i64 %26
store i64 0, i64* %27
%28 = load [100 x i64]*, [100 x i64]** %4
%29 = load i32, i32* %7
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds [100 x i64], [100 x i64]* %28, i64 %30
%32 = load i32, i32* %8
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [100 x i64], [100 x i64]* %31, i64 0, i64 %33
store i64 0, i64* %34
br label %35
35: ; preds = %20
%36 = load i32, i32* %8
%37 = add nsw i32 %36, 1
store i32 %37, i32* %8
br label %17
38: ; preds = %17
br label %39
39: ; preds = %38
%40 = load i32, i32* %7
%41 = add nsw i32 %40, 1
store i32 %41, i32* %7
br label %9
42: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @reinitialize([100 x i64]* nocapture writeonly %0, [100 x i64]* nocapture writeonly %1, i64* nocapture writeonly %2) {
store i64 0, i64* %2
%4 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 0, i64 0
store i64 0, i64* %4
%5 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 0, i64 0
store i64 0, i64* %5
%6 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 0, i64 1
store i64 0, i64* %6
%7 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 0, i64 1
store i64 0, i64* %7
%8 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 0, i64 2
store i64 0, i64* %8
%9 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 0, i64 2
store i64 0, i64* %9
%10 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 0, i64 3
store i64 0, i64* %10
%11 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 0, i64 3
store i64 0, i64* %11
%12 = getelementptr inbounds i64, i64* %2, i64 1
store i64 0, i64* %12
%13 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 1, i64 0
store i64 0, i64* %13
%14 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 1, i64 0
store i64 0, i64* %14
%15 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 1, i64 1
store i64 0, i64* %15
%16 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 1, i64 1
store i64 0, i64* %16
%17 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 1, i64 2
store i64 0, i64* %17
%18 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 1, i64 2
store i64 0, i64* %18
%19 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 1, i64 3
store i64 0, i64* %19
%20 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 1, i64 3
store i64 0, i64* %20
%21 = getelementptr inbounds i64, i64* %2, i64 2
store i64 0, i64* %21
%22 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 2, i64 0
store i64 0, i64* %22
%23 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 2, i64 0
store i64 0, i64* %23
%24 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 2, i64 1
store i64 0, i64* %24
%25 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 2, i64 1
store i64 0, i64* %25
%26 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 2, i64 2
store i64 0, i64* %26
%27 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 2, i64 2
store i64 0, i64* %27
%28 = getelementptr inbounds [100 x i64], [100 x i64]* %1, i64 2, i64 3
store i64 0, i64* %28
%29 = getelementptr inbounds [100 x i64], [100 x i64]* %0, i64 2, i64 3
store i64 0, i64* %29
ret void
}