user: Translate the below assembly code into C programming language:

```asm
<test_func>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,%eax
  mov    %al,-0x1c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x10(%rbp)
  jmp    L18
L113:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x10(%rbp),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x10(%rbp)
L18:
  cmpl   $0x63,-0x10(%rbp)
  jle    L113
  movl   $0x0,-0x10(%rbp)
  jmp    L84
L145:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x10(%rbp)
  je     L147
  movb   $0x1,-0xc(%rbp)
L147:
  addl   $0x1,-0x10(%rbp)
L84:
  cmpl   $0x63,-0x10(%rbp)
  jle    L145
  movl   $0x0,-0x10(%rbp)
  jmp    L171
L164:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%edx
  add    $0x1,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x10(%rbp)
L171:
  cmpl   $0x63,-0x10(%rbp)
  jle    L164
  movl   $0x0,-0x10(%rbp)
  jmp    L215
L130:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x10(%rbp)
  je     L225
  movb   $0x1,-0xb(%rbp)
L225:
  addl   $0x1,-0x10(%rbp)
L215:
  cmpl   $0x63,-0x10(%rbp)
  jle    L130
  movl   $0x0,-0x10(%rbp)
  jmp    L83
L232:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%edx
  add    $0x2,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x10(%rbp)
L83:
  cmpl   $0x63,-0x10(%rbp)
  jle    L232
  movl   $0x0,-0x10(%rbp)
  jmp    L51
L204:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x10(%rbp),%edx
  add    $0x2,%edx
  cmp    %edx,%eax
  je     L151
  movb   $0x1,-0xa(%rbp)
L151:
  addl   $0x1,-0x10(%rbp)
L51:
  cmpl   $0x63,-0x10(%rbp)
  jle    L204
  movl   $0x0,-0x10(%rbp)
  jmp    L32
L34:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    -0x10(%rbp),%edx
  add    $0x3,%edx
  mov    %edx,(%rax)
  addl   $0x1,-0x10(%rbp)
L32:
  cmpl   $0x63,-0x10(%rbp)
  jle    L34
  movl   $0x0,-0x10(%rbp)
  jmp    L190
L222:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x10(%rbp),%edx
  add    $0x2,%edx
  cmp    %edx,%eax
  je     L79
  movb   $0x1,-0x9(%rbp)
L79:
  addl   $0x1,-0x10(%rbp)
L190:
  cmpl   $0x63,-0x10(%rbp)
  jle    L222
  movl   $0x0,-0x10(%rbp)
  jmp    L14
L93:
  mov    -0x10(%rbp),%eax
  cltq
  movzbl -0xc(%rbp,%rax,1),%eax
  cmp    %al,-0x1c(%rbp)
  je     L10
  mov    $0x1,%eax
  jmp    L214
L10:
  addl   $0x1,-0x10(%rbp)
L14:
  cmpl   $0x3,-0x10(%rbp)
  jle    L93
  mov    $0x0,%eax
L214:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L166
  call   <__stack_chk_fail@plt>
L166:
  leave
  ret
```

assistant: ```c
int test_func(int a[100], char correct_val) {
  int i;
  char results[4] = {0};
#pragma acc data pcopy(a)
#pragma acc parallel loop
  for (i = 0; i < 100; i++) {
    a[i] = i;
  }
  for (i = 0; i < 100; i++) {
    if (a[i] != i)
      results[0] = 1;
  }
#pragma acc data pcopyin(a)
#pragma acc parallel loop
  for (i = 0; i < 100; i++) {
    a[i] = i + 1;
  }
  for (i = 0; i < 100; i++) {
    if (a[i] != i)
      results[1] = 1;
  }
#pragma acc data pcopyout(a)
#pragma acc parallel loop
  for (i = 0; i < 100; i++) {
    a[i] = i + 2;
  }
  for (i = 0; i < 100; i++) {
    if (a[i] != i + 2)
      results[2] = 1;
  }
#pragma acc data pcreate(a)
#pragma acc parallel loop
  for (i = 0; i < 100; i++) {
    a[i] = i + 3;
  }
  for (i = 0; i < 100; i++) {
    if (a[i] != i + 2)
      results[3] = 1;
  }
  for (i = 0; i < 4; i++) {
    if (results[i] != correct_val)
      return 1;
  }
  return 0;
}
```