user: Converte this assembly snippet into its equivalent C code:

```asm
<k_check_epi32_overflow_4>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%r12
  mov    %rsi,%r15
  mov    %rdx,%rbx
  mov    %rcx,%r14
  mov    %r8,%r13
  mov    $0xffffffff,%edi
  call   <_mm_set1_epi32@plt>
  mov    %eax,%ebp
  mov    $0x1,%esi
  mov    (%r12),%edi
  call   <_mm_slli_epi64@plt>
  mov    %eax,%r12d
  mov    $0x1,%esi
  mov    (%r15),%edi
  call   <_mm_slli_epi64@plt>
  mov    %eax,%r15d
  mov    $0x1,%esi
  mov    (%rbx),%edi
  call   <_mm_slli_epi64@plt>
  mov    %eax,%ebx
  mov    $0x1,%esi
  mov    (%r14),%edi
  call   <_mm_slli_epi64@plt>
  mov    %eax,%r14d
  mov    $0x1,%ecx
  mov    $0x3,%edx
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <_MM_SHUFFLE@plt>
  mov    %eax,%esi
  mov    %r12d,%edi
  call   <_mm_shuffle_epi32@plt>
  mov    %eax,%r12d
  mov    $0x1,%ecx
  mov    $0x3,%edx
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <_MM_SHUFFLE@plt>
  mov    %eax,%esi
  mov    %r15d,%edi
  call   <_mm_shuffle_epi32@plt>
  mov    %eax,%r15d
  mov    $0x1,%ecx
  mov    $0x3,%edx
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <_MM_SHUFFLE@plt>
  mov    %eax,%esi
  mov    %ebx,%edi
  call   <_mm_shuffle_epi32@plt>
  mov    %eax,%ebx
  mov    $0x1,%ecx
  mov    $0x3,%edx
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <_MM_SHUFFLE@plt>
  mov    %eax,%esi
  mov    %r14d,%edi
  call   <_mm_shuffle_epi32@plt>
  mov    %eax,%r14d
  mov    %r15d,%esi
  mov    %r12d,%edi
  call   <_mm_unpacklo_epi64@plt>
  mov    %eax,%r12d
  mov    %r14d,%esi
  mov    %ebx,%edi
  call   <_mm_unpacklo_epi64@plt>
  mov    %eax,%ebx
  mov    0x0(%r13),%esi
  mov    %r12d,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%r14d
  mov    0x0(%r13),%esi
  mov    %ebx,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%r13d
  mov    %ebp,%esi
  mov    %r12d,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%r12d
  mov    %ebp,%esi
  mov    %ebx,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%ebp
  mov    %r12d,%esi
  mov    %r14d,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%edi
  call   <_mm_movemask_epi8@plt>
  mov    %eax,%ebx
  mov    %ebp,%esi
  mov    %r13d,%edi
  call   <_mm_cmpeq_epi32@plt>
  mov    %eax,%edi
  call   <_mm_movemask_epi8@plt>
  add    %ebx,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int k_check_epi32_overflow_4(const __m128i *preg0, const __m128i *preg1, const __m128i *preg2, const __m128i *preg3, const __m128i *zero) {
  __m128i minus_one = _mm_set1_epi32(-1);
  __m128i reg0_shifted = _mm_slli_epi64(*preg0, 1);
  __m128i reg1_shifted = _mm_slli_epi64(*preg1, 1);
  __m128i reg2_shifted = _mm_slli_epi64(*preg2, 1);
  __m128i reg3_shifted = _mm_slli_epi64(*preg3, 1);
  __m128i reg0_top_dwords = _mm_shuffle_epi32(reg0_shifted, _MM_SHUFFLE(0, 0, 3, 1));
  __m128i reg1_top_dwords = _mm_shuffle_epi32(reg1_shifted, _MM_SHUFFLE(0, 0, 3, 1));
  __m128i reg2_top_dwords = _mm_shuffle_epi32(reg2_shifted, _MM_SHUFFLE(0, 0, 3, 1));
  __m128i reg3_top_dwords = _mm_shuffle_epi32(reg3_shifted, _MM_SHUFFLE(0, 0, 3, 1));
  __m128i top_dwords_01 = _mm_unpacklo_epi64(reg0_top_dwords, reg1_top_dwords);
  __m128i top_dwords_23 = _mm_unpacklo_epi64(reg2_top_dwords, reg3_top_dwords);
  __m128i valid_positve_01 = _mm_cmpeq_epi32(top_dwords_01, *zero);
  __m128i valid_positve_23 = _mm_cmpeq_epi32(top_dwords_23, *zero);
  __m128i valid_negative_01 = _mm_cmpeq_epi32(top_dwords_01, minus_one);
  __m128i valid_negative_23 = _mm_cmpeq_epi32(top_dwords_23, minus_one);
  int overflow_01 = _mm_movemask_epi8(_mm_cmpeq_epi32(valid_positve_01, valid_negative_01));
  int overflow_23 = _mm_movemask_epi8(_mm_cmpeq_epi32(valid_positve_23, valid_negative_23));
  return (overflow_01 + overflow_23);
}
```