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

```asm
<_jenkins_little2_step>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  jmp    L16
L21:
  mov    -0x8(%rbp),%rax
  mov    (%rax),%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x24,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  sar    $0x1c,%eax
  or     %edx,%eax
  xor    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  mov    -0x14(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sar    $0x1a,%eax
  or     %edx,%eax
  xor    %eax,-0x1c(%rbp)
  mov    -0x18(%rbp),%eax
  add    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  sub    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  shl    $0x8,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  sar    $0x18,%eax
  or     %edx,%eax
  xor    %eax,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  shl    $0x10,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  sar    $0x10,%eax
  or     %edx,%eax
  xor    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  mov    -0x14(%rbp),%eax
  shl    $0x13,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sar    $0xd,%eax
  or     %edx,%eax
  xor    %eax,-0x1c(%rbp)
  mov    -0x18(%rbp),%eax
  add    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  sub    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  sar    $0x1c,%eax
  or     %edx,%eax
  xor    %eax,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  subq   $0xc,-0x30(%rbp)
  addq   $0x30,-0x8(%rbp)
L16:
  cmpq   $0xb,-0x30(%rbp)
  ja     L21
  cmpq   $0xc,-0x30(%rbp)
  ja     L11
  mov    -0x30(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  lea    D9(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D9(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x8(%rbp),%rax
  add    $0x2c,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x24,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x1c,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x14,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  shl    $0x18,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  add    %eax,-0x14(%rbp)
  mov    -0x8(%rbp),%rax
  mov    (%rax),%eax
  add    %eax,-0x14(%rbp)
  nop
L11:
  mov    -0x38(%rbp),%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0x38(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x38(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x18(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x30(%rbp),%rax
  pop    %rbp
  ret
```

assistant: ```c
size_t _jenkins_little2_step(const void *key, size_t length, uint32_t st[3]) {
  uint32_t a = st[0], b = st[1], c = st[2];
  union {
    const void *ptr;
    size_t i;
  } u;
  u.ptr = key;
  if (0 && ((u.i & 0x3) == 0)) {
    const uint32_t *k = (const uint32_t *)key;
    while (length >= 12) {
      a += k[0];
      b += k[1];
      c += k[2];
      {
        a -= c;
        a ^= (((c) << (4)) | ((c) >> (32 - (4))));
        c += b;
        b -= a;
        b ^= (((a) << (6)) | ((a) >> (32 - (6))));
        a += c;
        c -= b;
        c ^= (((b) << (8)) | ((b) >> (32 - (8))));
        b += a;
        a -= c;
        a ^= (((c) << (16)) | ((c) >> (32 - (16))));
        c += b;
        b -= a;
        b ^= (((a) << (19)) | ((a) >> (32 - (19))));
        a += c;
        c -= b;
        c ^= (((b) << (4)) | ((b) >> (32 - (4))));
        b += a;
      };
      length -= 12;
      k += 3;
    }
    switch (length) {
    case 12:
      c += k[2];
      b += k[1];
      a += k[0];
      break;
    case 11:
      c += k[2] & 0xffffff;
      b += k[1];
      a += k[0];
      break;
    case 10:
      c += k[2] & 0xffff;
      b += k[1];
      a += k[0];
      break;
    case 9:
      c += k[2] & 0xff;
      b += k[1];
      a += k[0];
      break;
    case 8:
      b += k[1];
      a += k[0];
      break;
    case 7:
      b += k[1] & 0xffffff;
      a += k[0];
      break;
    case 6:
      b += k[1] & 0xffff;
      a += k[0];
      break;
    case 5:
      b += k[1] & 0xff;
      a += k[0];
      break;
    case 4:
      a += k[0];
      break;
    case 3:
      a += k[0] & 0xffffff;
      break;
    case 2:
      a += k[0] & 0xffff;
      break;
    case 1:
      a += k[0] & 0xff;
      break;
    }
  } else if (0 && ((u.i & 0x1) == 0)) {
    const uint16_t *k = (const uint16_t *)key;
    const uint8_t *k8;
    while (length >= 12) {
      a += k[0] + (((uint32_t)k[1]) << 16);
      b += k[2] + (((uint32_t)k[3]) << 16);
      c += k[4] + (((uint32_t)k[5]) << 16);
      {
        a -= c;
        a ^= (((c) << (4)) | ((c) >> (32 - (4))));
        c += b;
        b -= a;
        b ^= (((a) << (6)) | ((a) >> (32 - (6))));
        a += c;
        c -= b;
        c ^= (((b) << (8)) | ((b) >> (32 - (8))));
        b += a;
        a -= c;
        a ^= (((c) << (16)) | ((c) >> (32 - (16))));
        c += b;
        b -= a;
        b ^= (((a) << (19)) | ((a) >> (32 - (19))));
        a += c;
        c -= b;
        c ^= (((b) << (4)) | ((b) >> (32 - (4))));
        b += a;
      };
      length -= 12;
      k += 6;
    }
    k8 = (const uint8_t *)k;
    switch (length) {
    case 12:
      c += k[4] + (((uint32_t)k[5]) << 16);
      b += k[2] + (((uint32_t)k[3]) << 16);
      a += k[0] + (((uint32_t)k[1]) << 16);
      break;
    case 11:
      c += ((uint32_t)k8[10]) << 16;
    case 10:
      c += k[4];
      b += k[2] + (((uint32_t)k[3]) << 16);
      a += k[0] + (((uint32_t)k[1]) << 16);
      break;
    case 9:
      c += k8[8];
    case 8:
      b += k[2] + (((uint32_t)k[3]) << 16);
      a += k[0] + (((uint32_t)k[1]) << 16);
      break;
    case 7:
      b += ((uint32_t)k8[6]) << 16;
    case 6:
      b += k[2];
      a += k[0] + (((uint32_t)k[1]) << 16);
      break;
    case 5:
      b += k8[4];
    case 4:
      a += k[0] + (((uint32_t)k[1]) << 16);
      break;
    case 3:
      a += ((uint32_t)k8[2]) << 16;
    case 2:
      a += k[0];
      break;
    case 1:
      a += k8[0];
      break;
    }
  } else {
    const uint8_t *k = (const uint8_t *)key;
    while (length >= 12) {
      a += k[0];
      a += ((uint32_t)k[1]) << 8;
      a += ((uint32_t)k[2]) << 16;
      a += ((uint32_t)k[3]) << 24;
      b += k[4];
      b += ((uint32_t)k[5]) << 8;
      b += ((uint32_t)k[6]) << 16;
      b += ((uint32_t)k[7]) << 24;
      c += k[8];
      c += ((uint32_t)k[9]) << 8;
      c += ((uint32_t)k[10]) << 16;
      c += ((uint32_t)k[11]) << 24;
      {
        a -= c;
        a ^= (((c) << (4)) | ((c) >> (32 - (4))));
        c += b;
        b -= a;
        b ^= (((a) << (6)) | ((a) >> (32 - (6))));
        a += c;
        c -= b;
        c ^= (((b) << (8)) | ((b) >> (32 - (8))));
        b += a;
        a -= c;
        a ^= (((c) << (16)) | ((c) >> (32 - (16))));
        c += b;
        b -= a;
        b ^= (((a) << (19)) | ((a) >> (32 - (19))));
        a += c;
        c -= b;
        c ^= (((b) << (4)) | ((b) >> (32 - (4))));
        b += a;
      };
      length -= 12;
      k += 12;
    }
    switch (length) {
    case 12:
      c += ((uint32_t)k[11]) << 24;
    case 11:
      c += ((uint32_t)k[10]) << 16;
    case 10:
      c += ((uint32_t)k[9]) << 8;
    case 9:
      c += k[8];
    case 8:
      b += ((uint32_t)k[7]) << 24;
    case 7:
      b += ((uint32_t)k[6]) << 16;
    case 6:
      b += ((uint32_t)k[5]) << 8;
    case 5:
      b += k[4];
    case 4:
      a += ((uint32_t)k[3]) << 24;
    case 3:
      a += ((uint32_t)k[2]) << 16;
    case 2:
      a += ((uint32_t)k[1]) << 8;
    case 1:
      a += k[0];
      break;
    }
  }
  st[0] = a;
  st[1] = b;
  st[2] = c;
  return length;
}
```