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

```asm
<test_lshift>:
  endbr64
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  lea    0x6(%rsp),%rcx
  movzbl D312(%rip),%eax
  mov    %al,0x6(%rsp)
L77:
  movzbl %al,%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  movzbl (%rcx),%eax
  setne  %sil
  lock cmpxchg %sil,0x2eff(%rip)        # 408f <a.23>
  je     L216
  mov    %al,(%rcx)
  jmp    L77
  cs nopw 0x0(%rax,%rax,1)
L216:
  test   %edx,%edx
  je     1080 <test_lshift.cold>
  movzbl D312(%rip),%eax
  test   %al,%al
  je     1080 <test_lshift.cold>
  movzbl D700(%rip),%eax
L37:
  movsbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2ebf(%rip)        # 408e <a.22>
  jne    L37
  cmp    $0x80,%dl
  jne    1080 <test_lshift.cold>
  movzbl D700(%rip),%eax
  cmp    $0x80,%al
  jne    1080 <test_lshift.cold>
  movzbl D687(%rip),%eax
L63:
  movsbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2e8c(%rip)        # 408d <a.21>
  jne    L63
  cmp    $0x80,%dl
  jne    1080 <test_lshift.cold>
  movzbl D687(%rip),%eax
  cmp    $0x80,%al
  jne    1080 <test_lshift.cold>
  movzbl D289(%rip),%eax
L55:
  movzbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2e59(%rip)        # 408c <a.20>
  jne    L55
  cmp    $0x80,%dl
  jne    1080 <test_lshift.cold>
  movzbl D289(%rip),%eax
  cmp    $0x80,%al
  jne    1080 <test_lshift.cold>
  movzwl D683(%rip),%eax
L26:
  movswl %ax,%edx
  shl    $0x7,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2e24(%rip)        # 408a <a.19>
  jne    L26
  cmp    $0x80,%dx
  jne    1080 <test_lshift.cold>
  movzwl D683(%rip),%eax
  cmp    $0x80,%ax
  jne    1080 <test_lshift.cold>
  movzwl D377(%rip),%eax
L21:
  movzwl %ax,%edx
  shl    $0x7,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2deb(%rip)        # 4088 <a.18>
  jne    L21
  cmp    $0x80,%dx
  jne    1080 <test_lshift.cold>
  movzwl D377(%rip),%eax
  cmp    $0x80,%ax
  jne    1080 <test_lshift.cold>
  mov    D685(%rip),%eax
L154:
  mov    %eax,%edx
  shl    $0x7,%edx
  lock cmpxchg %edx,0x2db6(%rip)        # 4084 <a.17>
  jne    L154
  cmp    $0x80,%edx
  jne    1080 <test_lshift.cold>
  mov    D685(%rip),%eax
  cmp    $0x80,%eax
  jne    1080 <test_lshift.cold>
  mov    D532(%rip),%eax
L91:
  mov    %eax,%edx
  shl    $0x7,%edx
  lock cmpxchg %edx,0x2d80(%rip)        # 4080 <a.16>
  jne    L91
  cmp    $0x80,%edx
  jne    1080 <test_lshift.cold>
  mov    D532(%rip),%eax
  cmp    $0x80,%eax
  jne    1080 <test_lshift.cold>
  mov    D539(%rip),%rax
L146:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2d42(%rip)        # 4078 <a.15>
  jne    L146
  cmp    $0x80,%rdx
  jne    1080 <test_lshift.cold>
  mov    D539(%rip),%rax
  cmp    $0x80,%rax
  jne    1080 <test_lshift.cold>
  mov    D692(%rip),%rax
L183:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2d01(%rip)        # 4070 <a.14>
  jne    L183
  cmp    $0x80,%rdx
  jne    1080 <test_lshift.cold>
  mov    D692(%rip),%rax
  cmp    $0x80,%rax
  jne    1080 <test_lshift.cold>
  mov    D678(%rip),%rax
L70:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2cc0(%rip)        # 4068 <a.13>
  jne    L70
  cmp    $0x80,%rdx
  jne    1080 <test_lshift.cold>
  mov    D678(%rip),%rax
  cmp    $0x80,%rax
  jne    1080 <test_lshift.cold>
  mov    D620(%rip),%rax
L184:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2c7f(%rip)        # 4060 <a.12>
  jne    L184
  cmp    $0x80,%rdx
  jne    1080 <test_lshift.cold>
  mov    D620(%rip),%rax
  cmp    $0x80,%rax
  jne    1080 <test_lshift.cold>
  lea    0x7(%rsp),%rcx
  movzbl D347(%rip),%eax
  mov    %al,0x7(%rsp)
L34:
  movzbl %al,%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  movzbl (%rcx),%eax
  setne  %sil
  lock cmpxchg %sil,0x2c34(%rip)        # 405f <a.11>
  je     L165
  mov    %al,(%rcx)
  jmp    L34
  nopl   0x0(%rax)
L165:
  test   %edx,%edx
  je     1080 <test_lshift.cold>
  movzbl D347(%rip),%eax
  test   %al,%al
  je     1080 <test_lshift.cold>
  movzbl D425(%rip),%eax
L61:
  movsbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2bf7(%rip)        # 405e <a.10>
  jne    L61
  cmp    $0x78,%dl
  jne    1080 <test_lshift.cold>
  movzbl D425(%rip),%eax
  cmp    $0x78,%al
  jne    1080 <test_lshift.cold>
  movzbl D250(%rip),%eax
L57:
  movsbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2bc4(%rip)        # 405d <a.9>
  jne    L57
  cmp    $0x78,%dl
  jne    1080 <test_lshift.cold>
  movzbl D250(%rip),%eax
  cmp    $0x78,%al
  jne    1080 <test_lshift.cold>
  movzbl D155(%rip),%eax
L94:
  movzbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2b91(%rip)        # 405c <a.8>
  jne    L94
  cmp    $0x78,%dl
  jne    1080 <test_lshift.cold>
  movzbl D155(%rip),%eax
  cmp    $0x78,%al
  jne    1080 <test_lshift.cold>
  movzwl D201(%rip),%eax
L72:
  movswl %ax,%edx
  shl    $0x3,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2b5c(%rip)        # 405a <a.7>
  jne    L72
  cmp    $0x78,%dx
  jne    1080 <test_lshift.cold>
  movzwl D201(%rip),%eax
  cmp    $0x78,%ax
  jne    1080 <test_lshift.cold>
  movzwl D113(%rip),%eax
L190:
  movzwl %ax,%edx
  shl    $0x3,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2b24(%rip)        # 4058 <a.6>
  jne    L190
  cmp    $0x78,%dx
  jne    1080 <test_lshift.cold>
  movzwl D113(%rip),%eax
  cmp    $0x78,%ax
  jne    1080 <test_lshift.cold>
  mov    D682(%rip),%eax
L139:
  lea    0x0(,%rax,8),%edx
  lock cmpxchg %edx,0x2aee(%rip)        # 4054 <a.5>
  jne    L139
  cmp    $0x78,%edx
  jne    1080 <test_lshift.cold>
  mov    D682(%rip),%eax
  cmp    $0x78,%eax
  jne    1080 <test_lshift.cold>
  mov    D351(%rip),%eax
L52:
  lea    0x0(,%rax,8),%edx
  lock cmpxchg %edx,0x2abb(%rip)        # 4050 <a.4>
  jne    L52
  cmp    $0x78,%edx
  jne    1080 <test_lshift.cold>
  mov    D351(%rip),%eax
  cmp    $0x78,%eax
  jne    1080 <test_lshift.cold>
  mov    D149(%rip),%rax
L202:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2a81(%rip)        # 4048 <a.3>
  jne    L202
  cmp    $0x78,%rdx
  jne    1080 <test_lshift.cold>
  mov    D149(%rip),%rax
  cmp    $0x78,%rax
  jne    1080 <test_lshift.cold>
  mov    D52(%rip),%rax
L159:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2a44(%rip)        # 4040 <a.2>
  jne    L159
  cmp    $0x78,%rdx
  jne    1080 <test_lshift.cold>
  mov    D52(%rip),%rax
  cmp    $0x78,%rax
  jne    1080 <test_lshift.cold>
  mov    D688(%rip),%rax
L102:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2a07(%rip)        # 4038 <a.1>
  jne    L102
  cmp    $0x78,%rdx
  jne    1080 <test_lshift.cold>
  mov    D688(%rip),%rax
  cmp    $0x78,%rax
  jne    1080 <test_lshift.cold>
  mov    D226(%rip),%rax
L41:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x29ca(%rip)        # 4030 <a.0>
  jne    L41
  cmp    $0x78,%rdx
  jne    1080 <test_lshift.cold>
  mov    D226(%rip),%rax
  cmp    $0x78,%rax
  jne    1080 <test_lshift.cold>
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L51
  add    $0x18,%rsp
  ret
L51:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void test_lshift(void) {
  do {
    do {
      static volatile _Atomic(_Bool) a = (_Bool)((1));
      if ((a <<= ((7))) != (_Bool)((_Bool)((1)) << ((7))))
        abort();
      if (a != (_Bool)((_Bool)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(char) a = (char)((1));
      if ((a <<= ((7))) != (char)((char)((1)) << ((7))))
        abort();
      if (a != (char)((char)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed char) a = (signed char)((1));
      if ((a <<= ((7))) != (signed char)((signed char)((1)) << ((7))))
        abort();
      if (a != (signed char)((signed char)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned char) a = (unsigned char)((1));
      if ((a <<= ((7))) != (unsigned char)((unsigned char)((1)) << ((7))))
        abort();
      if (a != (unsigned char)((unsigned char)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed short) a = (signed short)((1));
      if ((a <<= ((7))) != (signed short)((signed short)((1)) << ((7))))
        abort();
      if (a != (signed short)((signed short)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned short) a = (unsigned short)((1));
      if ((a <<= ((7))) != (unsigned short)((unsigned short)((1)) << ((7))))
        abort();
      if (a != (unsigned short)((unsigned short)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed int) a = (signed int)((1));
      if ((a <<= ((7))) != (signed int)((signed int)((1)) << ((7))))
        abort();
      if (a != (signed int)((signed int)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned int) a = (unsigned int)((1));
      if ((a <<= ((7))) != (unsigned int)((unsigned int)((1)) << ((7))))
        abort();
      if (a != (unsigned int)((unsigned int)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long) a = (signed long)((1));
      if ((a <<= ((7))) != (signed long)((signed long)((1)) << ((7))))
        abort();
      if (a != (signed long)((signed long)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long) a = (unsigned long)((1));
      if ((a <<= ((7))) != (unsigned long)((unsigned long)((1)) << ((7))))
        abort();
      if (a != (unsigned long)((unsigned long)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long long) a = (signed long long)((1));
      if ((a <<= ((7))) != (signed long long)((signed long long)((1)) << ((7))))
        abort();
      if (a != (signed long long)((signed long long)((1)) << ((7))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long long) a = (unsigned long long)((1));
      if ((a <<= ((7))) != (unsigned long long)((unsigned long long)((1)) << ((7))))
        abort();
      if (a != (unsigned long long)((unsigned long long)((1)) << ((7))))
        abort();
    } while (0);
  } while (0);
  do {
    do {
      static volatile _Atomic(_Bool) a = (_Bool)((15));
      if ((a <<= ((3))) != (_Bool)((_Bool)((15)) << ((3))))
        abort();
      if (a != (_Bool)((_Bool)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(char) a = (char)((15));
      if ((a <<= ((3))) != (char)((char)((15)) << ((3))))
        abort();
      if (a != (char)((char)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed char) a = (signed char)((15));
      if ((a <<= ((3))) != (signed char)((signed char)((15)) << ((3))))
        abort();
      if (a != (signed char)((signed char)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned char) a = (unsigned char)((15));
      if ((a <<= ((3))) != (unsigned char)((unsigned char)((15)) << ((3))))
        abort();
      if (a != (unsigned char)((unsigned char)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed short) a = (signed short)((15));
      if ((a <<= ((3))) != (signed short)((signed short)((15)) << ((3))))
        abort();
      if (a != (signed short)((signed short)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned short) a = (unsigned short)((15));
      if ((a <<= ((3))) != (unsigned short)((unsigned short)((15)) << ((3))))
        abort();
      if (a != (unsigned short)((unsigned short)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed int) a = (signed int)((15));
      if ((a <<= ((3))) != (signed int)((signed int)((15)) << ((3))))
        abort();
      if (a != (signed int)((signed int)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned int) a = (unsigned int)((15));
      if ((a <<= ((3))) != (unsigned int)((unsigned int)((15)) << ((3))))
        abort();
      if (a != (unsigned int)((unsigned int)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long) a = (signed long)((15));
      if ((a <<= ((3))) != (signed long)((signed long)((15)) << ((3))))
        abort();
      if (a != (signed long)((signed long)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long) a = (unsigned long)((15));
      if ((a <<= ((3))) != (unsigned long)((unsigned long)((15)) << ((3))))
        abort();
      if (a != (unsigned long)((unsigned long)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long long) a = (signed long long)((15));
      if ((a <<= ((3))) != (signed long long)((signed long long)((15)) << ((3))))
        abort();
      if (a != (signed long long)((signed long long)((15)) << ((3))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long long) a = (unsigned long long)((15));
      if ((a <<= ((3))) != (unsigned long long)((unsigned long long)((15)) << ((3))))
        abort();
      if (a != (unsigned long long)((unsigned long long)((15)) << ((3))))
        abort();
    } while (0);
  } while (0);
}
```