user: Please show me the C implementation that matches the assembly code listed below:

```asm
<test_lshift>:
  endbr64
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movzbl D481(%rip),%eax
  mov    %al,0x6(%rsp)
L653:
  movzbl 0x6(%rsp),%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  setne  %cl
  movzbl 0x6(%rsp),%eax
  lock cmpxchg %cl,0x2f19(%rip)        # 408f <a.23>
  sete   %cl
  je     L227
  mov    %al,0x6(%rsp)
L227:
  test   %cl,%cl
  je     L653
  test   %edx,%edx
  je     L723
  movzbl D481(%rip),%eax
  test   %al,%al
  je     L129
  movzbl D456(%rip),%eax
L497:
  movsbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2edc(%rip)        # 408e <a.22>
  jne    L497
  cmp    $0x80,%dl
  jne    L19
  movzbl D456(%rip),%eax
  cmp    $0x80,%al
  jne    L130
  movzbl D45(%rip),%eax
L564:
  movsbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2ea9(%rip)        # 408d <a.21>
  jne    L564
  cmp    $0x80,%dl
  jne    L670
  movzbl D45(%rip),%eax
  cmp    $0x80,%al
  jne    L461
  movzbl D125(%rip),%eax
L266:
  movzbl %al,%edx
  shl    $0x7,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2e76(%rip)        # 408c <a.20>
  jne    L266
  cmp    $0x80,%dl
  jne    L526
  movzbl D125(%rip),%eax
  cmp    $0x80,%al
  jne    L735
  movzwl D189(%rip),%eax
L506:
  movswl %ax,%edx
  shl    $0x7,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2e41(%rip)        # 408a <a.19>
  jne    L506
  cmp    $0x80,%dx
  jne    L249
  movzwl D189(%rip),%eax
  cmp    $0x80,%ax
  jne    L364
  movzwl D203(%rip),%eax
L448:
  movzwl %ax,%edx
  shl    $0x7,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2e08(%rip)        # 4088 <a.18>
  jne    L448
  cmp    $0x80,%dx
  jne    L479
  movzwl D203(%rip),%eax
  cmp    $0x80,%ax
  jne    L118
  mov    D145(%rip),%eax
L560:
  mov    %eax,%edx
  shl    $0x7,%edx
  lock cmpxchg %edx,0x2dd3(%rip)        # 4084 <a.17>
  jne    L560
  cmp    $0x80,%edx
  jne    L489
  mov    D145(%rip),%eax
  cmp    $0x80,%eax
  jne    L377
  mov    D684(%rip),%eax
L289:
  mov    %eax,%edx
  shl    $0x7,%edx
  lock cmpxchg %edx,0x2d9d(%rip)        # 4080 <a.16>
  jne    L289
  cmp    $0x80,%edx
  jne    L187
  mov    D684(%rip),%eax
  cmp    $0x80,%eax
  jne    L366
  mov    D428(%rip),%rax
L705:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2d5f(%rip)        # 4078 <a.15>
  jne    L705
  cmp    $0x80,%rdx
  jne    L305
  mov    D428(%rip),%rax
  cmp    $0x80,%rax
  jne    L477
  mov    D599(%rip),%rax
L253:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2d1e(%rip)        # 4070 <a.14>
  jne    L253
  cmp    $0x80,%rdx
  jne    L449
  mov    D599(%rip),%rax
  cmp    $0x80,%rax
  jne    L265
  mov    D177(%rip),%rax
L383:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2cdd(%rip)        # 4068 <a.13>
  jne    L383
  cmp    $0x80,%rdx
  jne    L273
  mov    D177(%rip),%rax
  cmp    $0x80,%rax
  jne    L423
  mov    D689(%rip),%rax
L722:
  mov    %rax,%rdx
  shl    $0x7,%rdx
  lock cmpxchg %rdx,0x2c9c(%rip)        # 4060 <a.12>
  jne    L722
  cmp    $0x80,%rdx
  jne    L436
  mov    D689(%rip),%rax
  cmp    $0x80,%rax
  jne    L609
  movzbl D85(%rip),%eax
  mov    %al,0x7(%rsp)
L686:
  movzbl 0x7(%rsp),%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  setne  %cl
  movzbl 0x7(%rsp),%eax
  lock cmpxchg %cl,0x2c54(%rip)        # 405f <a.11>
  sete   %cl
  je     L409
  mov    %al,0x7(%rsp)
L409:
  test   %cl,%cl
  je     L686
  test   %edx,%edx
  je     L601
  movzbl D85(%rip),%eax
  test   %al,%al
  je     L576
  movzbl D168(%rip),%eax
L727:
  movsbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2c17(%rip)        # 405e <a.10>
  jne    L727
  cmp    $0x78,%dl
  jne    L96
  movzbl D168(%rip),%eax
  cmp    $0x78,%al
  jne    L718
  movzbl D123(%rip),%eax
L596:
  movsbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2be4(%rip)        # 405d <a.9>
  jne    L596
  cmp    $0x78,%dl
  jne    L76
  movzbl D123(%rip),%eax
  cmp    $0x78,%al
  jne    L1
  movzbl D266(%rip),%eax
L725:
  movzbl %al,%edx
  shl    $0x3,%edx
  movzbl %dl,%ecx
  lock cmpxchg %cl,0x2bb1(%rip)        # 405c <a.8>
  jne    L725
  cmp    $0x78,%dl
  jne    L563
  movzbl D266(%rip),%eax
  cmp    $0x78,%al
  jne    L499
  movzwl D462(%rip),%eax
L139:
  movswl %ax,%edx
  shl    $0x3,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2b7c(%rip)        # 405a <a.7>
  jne    L139
  cmp    $0x78,%dx
  jne    L140
  movzwl D462(%rip),%eax
  cmp    $0x78,%ax
  jne    L285
  movzwl D63(%rip),%eax
L80:
  movzwl %ax,%edx
  shl    $0x3,%edx
  movzwl %dx,%ecx
  lock cmpxchg %cx,0x2b44(%rip)        # 4058 <a.6>
  jne    L80
  cmp    $0x78,%dx
  jne    L56
  movzwl D63(%rip),%eax
  cmp    $0x78,%ax
  jne    L46
  mov    D169(%rip),%eax
L102:
  lea    0x0(,%rax,8),%edx
  lock cmpxchg %edx,0x2b0e(%rip)        # 4054 <a.5>
  jne    L102
  cmp    $0x78,%edx
  jne    L485
  mov    D169(%rip),%eax
  cmp    $0x78,%eax
  jne    L551
  mov    D365(%rip),%eax
L275:
  lea    0x0(,%rax,8),%edx
  lock cmpxchg %edx,0x2adb(%rip)        # 4050 <a.4>
  jne    L275
  cmp    $0x78,%edx
  jne    L339
  mov    D365(%rip),%eax
  cmp    $0x78,%eax
  jne    L252
  mov    D414(%rip),%rax
L255:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2aa1(%rip)        # 4048 <a.3>
  jne    L255
  cmp    $0x78,%rdx
  jne    L698
  mov    D414(%rip),%rax
  cmp    $0x78,%rax
  jne    L476
  mov    D275(%rip),%rax
L60:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2a64(%rip)        # 4040 <a.2>
  jne    L60
  cmp    $0x78,%rdx
  jne    L452
  mov    D275(%rip),%rax
  cmp    $0x78,%rax
  jne    L640
  mov    D634(%rip),%rax
L430:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x2a27(%rip)        # 4038 <a.1>
  jne    L430
  cmp    $0x78,%rdx
  jne    L721
  mov    D634(%rip),%rax
  cmp    $0x78,%rax
  jne    L402
  mov    D661(%rip),%rax
L233:
  lea    0x0(,%rax,8),%rdx
  lock cmpxchg %rdx,0x29ea(%rip)        # 4030 <a.0>
  jne    L233
  cmp    $0x78,%rdx
  jne    L379
  mov    D661(%rip),%rax
  cmp    $0x78,%rax
  jne    L241
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L328
  add    $0x18,%rsp
  ret
L723:
  call   <abort@plt>
L129:
  call   <abort@plt>
L19:
  call   <abort@plt>
L130:
  call   <abort@plt>
L670:
  call   <abort@plt>
L461:
  call   <abort@plt>
L526:
  call   <abort@plt>
L735:
  call   <abort@plt>
L249:
  call   <abort@plt>
L364:
  call   <abort@plt>
L479:
  call   <abort@plt>
L118:
  call   <abort@plt>
L489:
  call   <abort@plt>
L377:
  call   <abort@plt>
L187:
  call   <abort@plt>
L366:
  call   <abort@plt>
L305:
  call   <abort@plt>
L477:
  call   <abort@plt>
L449:
  call   <abort@plt>
L265:
  call   <abort@plt>
L273:
  call   <abort@plt>
L423:
  call   <abort@plt>
L436:
  call   <abort@plt>
L609:
  call   <abort@plt>
L601:
  call   <abort@plt>
L576:
  call   <abort@plt>
L96:
  call   <abort@plt>
L718:
  call   <abort@plt>
L76:
  call   <abort@plt>
L1:
  call   <abort@plt>
L563:
  call   <abort@plt>
L499:
  call   <abort@plt>
L140:
  call   <abort@plt>
L285:
  call   <abort@plt>
L56:
  call   <abort@plt>
L46:
  call   <abort@plt>
L485:
  call   <abort@plt>
L551:
  call   <abort@plt>
L339:
  call   <abort@plt>
L252:
  call   <abort@plt>
L698:
  call   <abort@plt>
L476:
  call   <abort@plt>
L452:
  call   <abort@plt>
L640:
  call   <abort@plt>
L721:
  call   <abort@plt>
L402:
  call   <abort@plt>
L379:
  call   <abort@plt>
L241:
  call   <abort@plt>
L328:
  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);
}
```