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

```asm
<shear>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x8(%rbp)
  mov    %esi,%eax
  movsd  %xmm0,-0x18(%rbp)
  movsd  %xmm1,-0x20(%rbp)
  mov    %al,-0xc(%rbp)
  cmpb   $0x78,-0xc(%rbp)
  jne    L29
  mov    -0x8(%rbp),%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  jmp    L35
L29:
  cmpb   $0x79,-0xc(%rbp)
  jne    L28
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rax)
  jmp    L35
L28:
  mov    -0x8(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x8(%rbp),%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x8(%rbp),%rax
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x20,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x40,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm1
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  add    $0x60,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
L35:
  nop
  pop    %rbp
  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];
  }
}
```