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

```asm
<idct4x4dc>:
  endbr64
  movq   (%rdi),%xmm1
  movq   0x8(%rdi),%xmm4
  movq   0x10(%rdi),%xmm2
  movq   0x18(%rdi),%xmm3
  movdqa %xmm1,%xmm5
  movdqa %xmm1,%xmm0
  punpcklwd %xmm4,%xmm1
  punpcklwd %xmm4,%xmm5
  punpcklwd %xmm4,%xmm0
  movdqa %xmm2,%xmm4
  pshufd $0xe,%xmm5,%xmm5
  punpcklwd %xmm3,%xmm4
  movdqa %xmm2,%xmm6
  punpcklwd %xmm5,%xmm0
  pshufd $0xe,%xmm4,%xmm4
  punpcklwd %xmm5,%xmm1
  punpcklwd %xmm3,%xmm6
  punpcklwd %xmm3,%xmm2
  pshufd $0xe,%xmm1,%xmm1
  punpcklwd %xmm4,%xmm6
  punpcklwd %xmm4,%xmm2
  movdqa %xmm0,%xmm9
  pshufd $0xe,%xmm2,%xmm2
  punpcklwd %xmm6,%xmm9
  movdqa %xmm0,%xmm4
  movdqa %xmm1,%xmm8
  pshufd $0xe,%xmm9,%xmm9
  punpcklwd %xmm6,%xmm4
  punpcklwd %xmm2,%xmm8
  movdqa %xmm1,%xmm7
  punpcklwd %xmm6,%xmm0
  punpcklwd %xmm9,%xmm4
  pshufd $0xe,%xmm8,%xmm8
  punpcklwd %xmm2,%xmm7
  punpcklwd %xmm9,%xmm0
  punpcklwd %xmm2,%xmm1
  punpcklwd %xmm8,%xmm7
  pshufd $0xe,%xmm0,%xmm0
  movdqa %xmm4,%xmm5
  punpcklwd %xmm8,%xmm1
  pshufd $0xe,%xmm1,%xmm1
  paddw  %xmm7,%xmm5
  movdqa %xmm0,%xmm3
  paddw  %xmm1,%xmm3
  psubw  %xmm7,%xmm4
  movdqa %xmm5,%xmm2
  paddw  %xmm3,%xmm2
  psubw  %xmm3,%xmm5
  movdqa %xmm1,%xmm3
  psubw  %xmm0,%xmm3
  psubw  %xmm1,%xmm0
  movdqa %xmm2,%xmm1
  paddw  %xmm4,%xmm0
  paddw  %xmm4,%xmm3
  movdqa %xmm2,%xmm4
  punpcklwd %xmm5,%xmm4
  punpcklwd %xmm5,%xmm1
  punpcklwd %xmm5,%xmm2
  pshufd $0xe,%xmm4,%xmm4
  punpcklwd %xmm4,%xmm1
  punpcklwd %xmm4,%xmm2
  movdqa %xmm3,%xmm4
  punpcklwd %xmm0,%xmm4
  movdqa %xmm3,%xmm5
  punpcklwd %xmm0,%xmm3
  pshufd $0xe,%xmm4,%xmm4
  pshufd $0xe,%xmm2,%xmm2
  punpcklwd %xmm0,%xmm5
  punpcklwd %xmm4,%xmm3
  punpcklwd %xmm4,%xmm5
  movdqa %xmm2,%xmm8
  pshufd $0xe,%xmm3,%xmm3
  movdqa %xmm1,%xmm9
  movdqa %xmm1,%xmm4
  punpcklwd %xmm3,%xmm8
  movdqa %xmm2,%xmm7
  punpcklwd %xmm5,%xmm1
  punpcklwd %xmm3,%xmm2
  pshufd $0xe,%xmm8,%xmm8
  movdqa %xmm1,%xmm0
  punpcklwd %xmm5,%xmm9
  movdqa %xmm2,%xmm1
  punpcklwd %xmm3,%xmm7
  pshufd $0xe,%xmm9,%xmm9
  punpcklwd %xmm8,%xmm1
  punpcklwd %xmm8,%xmm7
  pshufd $0xe,%xmm1,%xmm1
  punpcklwd %xmm9,%xmm0
  punpcklwd %xmm5,%xmm4
  pshufd $0xe,%xmm0,%xmm0
  movdqa %xmm1,%xmm2
  punpcklwd %xmm9,%xmm4
  paddw  %xmm0,%xmm2
  movdqa %xmm7,%xmm6
  paddw  %xmm4,%xmm6
  psubw  %xmm7,%xmm4
  movdqa %xmm2,%xmm3
  paddw  %xmm6,%xmm3
  psubw  %xmm2,%xmm6
  movdqa %xmm1,%xmm2
  psubw  %xmm0,%xmm2
  psubw  %xmm1,%xmm0
  movq   %xmm3,(%rdi)
  paddw  %xmm4,%xmm2
  paddw  %xmm4,%xmm0
  movq   %xmm6,0x8(%rdi)
  movq   %xmm2,0x10(%rdi)
  movq   %xmm0,0x18(%rdi)
  ret
```

assistant: ```c
void idct4x4dc(short d[4][4]) {
  short tmp[4][4];
  int s01, s23;
  int d01, d23;
  int i;
  for (i = 0; i < 4; i++) {
    s01 = d[i][0] + d[i][1];
    d01 = d[i][0] - d[i][1];
    s23 = d[i][2] + d[i][3];
    d23 = d[i][2] - d[i][3];
    tmp[0][i] = s01 + s23;
    tmp[1][i] = s01 - s23;
    tmp[2][i] = d01 - d23;
    tmp[3][i] = d01 + d23;
  }
  for (i = 0; i < 4; i++) {
    s01 = tmp[i][0] + tmp[i][1];
    d01 = tmp[i][0] - tmp[i][1];
    s23 = tmp[i][2] + tmp[i][3];
    d23 = tmp[i][2] - tmp[i][3];
    d[0][i] = s01 + s23;
    d[1][i] = s01 - s23;
    d[2][i] = d01 - d23;
    d[3][i] = d01 + d23;
  }
}
```