user: 请从给定的汇编指令推导出C源代码:

```asm
<constant_shift>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %esi,-0xc(%rbp)
  cmpl   $0x3f,-0xc(%rbp)
  ja     L101
  mov    -0xc(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D13(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D13(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  shlq   -0x8(%rbp)
  jmp    L489
  shlq   $0x2,-0x8(%rbp)
  jmp    L489
  shlq   $0x3,-0x8(%rbp)
  jmp    L489
  shlq   $0x4,-0x8(%rbp)
  jmp    L489
  shlq   $0x5,-0x8(%rbp)
  jmp    L489
  shlq   $0x6,-0x8(%rbp)
  jmp    L489
  shlq   $0x7,-0x8(%rbp)
  jmp    L489
  shlq   $0x8,-0x8(%rbp)
  jmp    L489
  shlq   $0x9,-0x8(%rbp)
  jmp    L489
  shlq   $0xa,-0x8(%rbp)
  jmp    L489
  shlq   $0xb,-0x8(%rbp)
  jmp    L489
  shlq   $0xc,-0x8(%rbp)
  jmp    L489
  shlq   $0xd,-0x8(%rbp)
  jmp    L489
  shlq   $0xe,-0x8(%rbp)
  jmp    L489
  shlq   $0xf,-0x8(%rbp)
  jmp    L489
  shlq   $0x10,-0x8(%rbp)
  jmp    L489
  shlq   $0x11,-0x8(%rbp)
  jmp    L489
  shlq   $0x12,-0x8(%rbp)
  jmp    L489
  shlq   $0x13,-0x8(%rbp)
  jmp    L489
  shlq   $0x14,-0x8(%rbp)
  jmp    L489
  shlq   $0x15,-0x8(%rbp)
  jmp    L489
  shlq   $0x16,-0x8(%rbp)
  jmp    L489
  shlq   $0x17,-0x8(%rbp)
  jmp    L489
  shlq   $0x18,-0x8(%rbp)
  jmp    L489
  shlq   $0x19,-0x8(%rbp)
  jmp    L489
  shlq   $0x1a,-0x8(%rbp)
  jmp    L489
  shlq   $0x1b,-0x8(%rbp)
  jmp    L489
  shlq   $0x1c,-0x8(%rbp)
  jmp    L489
  shlq   $0x1d,-0x8(%rbp)
  jmp    L489
  shlq   $0x1e,-0x8(%rbp)
  jmp    L489
  shlq   $0x1f,-0x8(%rbp)
  jmp    L489
  shlq   $0x20,-0x8(%rbp)
  jmp    L489
  shlq   $0x21,-0x8(%rbp)
  jmp    L489
  shlq   $0x22,-0x8(%rbp)
  jmp    L489
  shlq   $0x23,-0x8(%rbp)
  jmp    L489
  shlq   $0x24,-0x8(%rbp)
  jmp    L489
  shlq   $0x25,-0x8(%rbp)
  jmp    L489
  shlq   $0x26,-0x8(%rbp)
  jmp    L489
  shlq   $0x27,-0x8(%rbp)
  jmp    L489
  shlq   $0x28,-0x8(%rbp)
  jmp    L489
  shlq   $0x29,-0x8(%rbp)
  jmp    L489
  shlq   $0x2a,-0x8(%rbp)
  jmp    L489
  shlq   $0x2b,-0x8(%rbp)
  jmp    L489
  shlq   $0x2c,-0x8(%rbp)
  jmp    L489
  shlq   $0x2d,-0x8(%rbp)
  jmp    L489
  shlq   $0x2e,-0x8(%rbp)
  jmp    L489
  shlq   $0x2f,-0x8(%rbp)
  jmp    L489
  shlq   $0x30,-0x8(%rbp)
  jmp    L489
  shlq   $0x31,-0x8(%rbp)
  jmp    L489
  shlq   $0x32,-0x8(%rbp)
  jmp    L489
  shlq   $0x33,-0x8(%rbp)
  jmp    L489
  shlq   $0x34,-0x8(%rbp)
  jmp    L489
  shlq   $0x35,-0x8(%rbp)
  jmp    L489
  shlq   $0x36,-0x8(%rbp)
  jmp    L489
  shlq   $0x37,-0x8(%rbp)
  jmp    L489
  shlq   $0x38,-0x8(%rbp)
  jmp    L489
  shlq   $0x39,-0x8(%rbp)
  jmp    L489
  shlq   $0x3a,-0x8(%rbp)
  jmp    L489
  shlq   $0x3b,-0x8(%rbp)
  jmp    L489
  shlq   $0x3c,-0x8(%rbp)
  jmp    L489
  shlq   $0x3d,-0x8(%rbp)
  jmp    L489
  shlq   $0x3e,-0x8(%rbp)
  jmp    L489
  shlq   $0x3f,-0x8(%rbp)
  jmp    L489
L101:
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L489
  nop
L489:
  mov    -0x8(%rbp),%rax
  leave
  ret
```

assistant: ```c
unsigned long long constant_shift(unsigned long long x, int i) {
  switch (i) {
  case 0:
    x = x << 0;
    break;
  case 1:
    x = x << 1;
    break;
  case 2:
    x = x << 2;
    break;
  case 3:
    x = x << 3;
    break;
  case 4:
    x = x << 4;
    break;
  case 5:
    x = x << 5;
    break;
  case 6:
    x = x << 6;
    break;
  case 7:
    x = x << 7;
    break;
  case 8:
    x = x << 8;
    break;
  case 9:
    x = x << 9;
    break;
  case 10:
    x = x << 10;
    break;
  case 11:
    x = x << 11;
    break;
  case 12:
    x = x << 12;
    break;
  case 13:
    x = x << 13;
    break;
  case 14:
    x = x << 14;
    break;
  case 15:
    x = x << 15;
    break;
  case 16:
    x = x << 16;
    break;
  case 17:
    x = x << 17;
    break;
  case 18:
    x = x << 18;
    break;
  case 19:
    x = x << 19;
    break;
  case 20:
    x = x << 20;
    break;
  case 21:
    x = x << 21;
    break;
  case 22:
    x = x << 22;
    break;
  case 23:
    x = x << 23;
    break;
  case 24:
    x = x << 24;
    break;
  case 25:
    x = x << 25;
    break;
  case 26:
    x = x << 26;
    break;
  case 27:
    x = x << 27;
    break;
  case 28:
    x = x << 28;
    break;
  case 29:
    x = x << 29;
    break;
  case 30:
    x = x << 30;
    break;
  case 31:
    x = x << 31;
    break;
  case 32:
    x = x << 32;
    break;
  case 33:
    x = x << 33;
    break;
  case 34:
    x = x << 34;
    break;
  case 35:
    x = x << 35;
    break;
  case 36:
    x = x << 36;
    break;
  case 37:
    x = x << 37;
    break;
  case 38:
    x = x << 38;
    break;
  case 39:
    x = x << 39;
    break;
  case 40:
    x = x << 40;
    break;
  case 41:
    x = x << 41;
    break;
  case 42:
    x = x << 42;
    break;
  case 43:
    x = x << 43;
    break;
  case 44:
    x = x << 44;
    break;
  case 45:
    x = x << 45;
    break;
  case 46:
    x = x << 46;
    break;
  case 47:
    x = x << 47;
    break;
  case 48:
    x = x << 48;
    break;
  case 49:
    x = x << 49;
    break;
  case 50:
    x = x << 50;
    break;
  case 51:
    x = x << 51;
    break;
  case 52:
    x = x << 52;
    break;
  case 53:
    x = x << 53;
    break;
  case 54:
    x = x << 54;
    break;
  case 55:
    x = x << 55;
    break;
  case 56:
    x = x << 56;
    break;
  case 57:
    x = x << 57;
    break;
  case 58:
    x = x << 58;
    break;
  case 59:
    x = x << 59;
    break;
  case 60:
    x = x << 60;
    break;
  case 61:
    x = x << 61;
    break;
  case 62:
    x = x << 62;
    break;
  case 63:
    x = x << 63;
    break;
  default:
    abort();
  }
  return x;
}
```