user: 下面的汇编指令对应的C源代码是什么:

```asm
<shear>:
  endbr64
  sub    $0x20,%rsp
  movsd  0x10(%rdi),%xmm6
  movupd (%rdi),%xmm5
  movapd %xmm0,%xmm7
  movupd 0x20(%rdi),%xmm4
  movupd 0x40(%rdi),%xmm3
  unpcklpd %xmm1,%xmm7
  movsd  %xmm6,-0x38(%rsp)
  movupd 0x8(%rdi),%xmm6
  movupd 0x60(%rdi),%xmm2
  movapd %xmm5,%xmm13
  movupd 0x10(%rdi),%xmm15
  movupd 0x30(%rdi),%xmm14
  movapd %xmm4,%xmm12
  movapd %xmm3,%xmm11
  movaps %xmm6,-0x78(%rsp)
  movsd  0x30(%rdi),%xmm6
  movapd %xmm2,%xmm10
  movupd 0x50(%rdi),%xmm9
  movhpd %xmm5,-0x40(%rsp)
  unpcklpd %xmm5,%xmm13
  unpcklpd %xmm15,%xmm15
  unpcklpd %xmm4,%xmm12
  movsd  %xmm6,-0x30(%rsp)
  movupd 0x28(%rdi),%xmm6
  unpcklpd %xmm14,%xmm14
  unpcklpd %xmm3,%xmm11
  movlpd %xmm5,-0x48(%rsp)
  unpcklpd %xmm9,%xmm9
  unpcklpd %xmm2,%xmm10
  movaps %xmm6,-0x68(%rsp)
  movsd  0x50(%rdi),%xmm6
  movhpd %xmm4,-0x20(%rsp)
  movsd  %xmm6,-0x18(%rsp)
  movupd 0x48(%rdi),%xmm6
  movlpd %xmm4,-0x28(%rsp)
  movaps %xmm6,-0x58(%rsp)
  movupd 0x68(%rdi),%xmm6
  movhpd %xmm3,-0x8(%rsp)
  movapd %xmm6,%xmm8
  movlpd %xmm3,-0x10(%rsp)
  movhpd %xmm2,0x8(%rsp)
  unpckhpd %xmm6,%xmm8
  movlpd %xmm2,(%rsp)
  movhpd %xmm6,0x10(%rsp)
  cmp    $0x78,%sil
  je     L19
  cmp    $0x79,%sil
  je     L16
  mulpd  %xmm7,%xmm9
  movapd %xmm15,%xmm0
  mulpd  %xmm7,%xmm0
  mulpd  %xmm7,%xmm8
  addpd  %xmm3,%xmm9
  addpd  %xmm5,%xmm0
  addpd  %xmm2,%xmm8
  movups %xmm9,0x40(%rdi)
  movups %xmm0,(%rdi)
  movapd %xmm14,%xmm0
  mulpd  %xmm7,%xmm0
  movups %xmm8,0x60(%rdi)
  addpd  %xmm4,%xmm0
  movups %xmm0,0x20(%rdi)
  add    $0x20,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L16:
  movsd  -0x40(%rsp),%xmm3
  movsd  -0x20(%rsp),%xmm4
  movsd  -0x8(%rsp),%xmm5
  movsd  0x8(%rsp),%xmm7
  movapd %xmm3,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  -0x48(%rsp),%xmm2
  mulsd  %xmm1,%xmm3
  movsd  %xmm2,(%rdi)
  movapd %xmm4,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  -0x28(%rsp),%xmm2
  mulsd  %xmm1,%xmm4
  movsd  %xmm2,0x20(%rdi)
  movapd %xmm5,%xmm2
  mulsd  %xmm0,%xmm2
  mulsd  %xmm7,%xmm0
  addsd  -0x10(%rsp),%xmm2
  addsd  (%rsp),%xmm0
  mulsd  %xmm1,%xmm5
  mulsd  %xmm7,%xmm1
  addsd  0x10(%rsp),%xmm1
  movsd  %xmm2,0x40(%rdi)
  movsd  %xmm0,0x60(%rdi)
  movsd  -0x38(%rsp),%xmm0
  addsd  %xmm3,%xmm0
  movsd  %xmm1,0x70(%rdi)
  movsd  %xmm0,0x10(%rdi)
  movsd  -0x30(%rsp),%xmm0
  addsd  %xmm4,%xmm0
  movsd  %xmm0,0x30(%rdi)
  movsd  -0x18(%rsp),%xmm0
  addsd  %xmm5,%xmm0
  movsd  %xmm0,0x50(%rdi)
  add    $0x20,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L19:
  mulpd  %xmm7,%xmm10
  movapd %xmm13,%xmm0
  mulpd  %xmm7,%xmm0
  addpd  -0x78(%rsp),%xmm0
  mulpd  %xmm7,%xmm11
  addpd  -0x58(%rsp),%xmm11
  movups %xmm0,0x8(%rdi)
  movapd %xmm12,%xmm0
  addpd  %xmm6,%xmm10
  mulpd  %xmm7,%xmm0
  movups %xmm11,0x48(%rdi)
  addpd  -0x68(%rsp),%xmm0
  movups %xmm10,0x68(%rdi)
  movups %xmm0,0x28(%rdi)
  add    $0x20,%rsp
  ret
```

assistant: ```c
shear(a, dir, u, v) double a[4][4], u, v;
char dir;
{
  if (dir == 'x') {
    a[0][1] += u * a[0][0];
    a[1][1] += u * a[1][0];
    a[2][1] += u * a[2][0];
    a[3][1] += u * a[3][0];
    a[0][2] += v * a[0][0];
    a[1][2] += v * a[1][0];
    a[2][2] += v * a[2][0];
    a[3][2] += v * a[3][0];
  } else if (dir == 'y') {
    a[0][0] += u * a[0][1];
    a[1][0] += u * a[1][1];
    a[2][0] += u * a[2][1];
    a[3][0] += u * a[3][1];
    a[0][2] += v * a[0][1];
    a[1][2] += v * a[1][1];
    a[2][2] += v * a[2][1];
    a[3][2] += v * a[3][1];
  } else {
    a[0][0] += u * a[0][2];
    a[1][0] += u * a[1][2];
    a[2][0] += u * a[2][2];
    a[3][0] += u * a[3][2];
    a[0][1] += v * a[0][2];
    a[1][1] += v * a[1][2];
    a[2][1] += v * a[2][2];
    a[3][1] += v * a[3][2];
  }
}
```