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

```asm
<test_or>:
  endbr64
  sub    $0x18,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movzbl D54(%rip),%eax
  mov    %al,0x6(%rsp)
  mov    $0x1,%ecx
L723:
  movzbl 0x6(%rsp),%eax
  lock cmpxchg %cl,0x2f21(%rip)        # 408f <a.23>
  sete   %dl
  je     L236
  mov    %al,0x6(%rsp)
L236:
  test   %dl,%dl
  je     L723
  movzbl D54(%rip),%eax
  test   %al,%al
  je     L284
  movzbl D460(%rip),%eax
L489:
  mov    %eax,%edx
  or     $0x56,%edx
  lock cmpxchg %dl,0x2ef0(%rip)        # 408e <a.22>
  jne    L489
  cmp    $0x76,%dl
  jne    L128
  movzbl D460(%rip),%eax
  cmp    $0x76,%al
  jne    L235
  movzbl D558(%rip),%eax
L643:
  mov    %eax,%edx
  or     $0x56,%edx
  lock cmpxchg %dl,0x2ec1(%rip)        # 408d <a.21>
  jne    L643
  cmp    $0x76,%dl
  jne    L528
  movzbl D558(%rip),%eax
  cmp    $0x76,%al
  jne    L322
  movzbl D331(%rip),%eax
L315:
  mov    %eax,%edx
  or     $0x56,%edx
  lock cmpxchg %dl,0x2e92(%rip)        # 408c <a.20>
  jne    L315
  cmp    $0x76,%dl
  jne    L124
  movzbl D331(%rip),%eax
  cmp    $0x76,%al
  jne    L509
  movzwl D675(%rip),%eax
L238:
  mov    %eax,%edx
  or     $0x7856,%dx
  lock cmpxchg %dx,0x2e5f(%rip)        # 408a <a.19>
  jne    L238
  cmp    $0x7a76,%dx
  jne    L604
  movzwl D675(%rip),%eax
  cmp    $0x7a76,%ax
  jne    L198
  movzwl D198(%rip),%eax
L280:
  mov    %eax,%edx
  or     $0x7856,%dx
  lock cmpxchg %dx,0x2e28(%rip)        # 4088 <a.18>
  jne    L280
  cmp    $0x7a76,%dx
  jne    L566
  movzwl D198(%rip),%eax
  cmp    $0x7a76,%ax
  jne    L391
  mov    D567(%rip),%eax
L517:
  mov    %eax,%edx
  or     $0x7856,%edx
  lock cmpxchg %edx,0x2df0(%rip)        # 4084 <a.17>
  jne    L517
  cmp    $0x7a76,%edx
  jne    L661
  mov    D567(%rip),%eax
  cmp    $0x7a76,%eax
  jne    L502
  mov    D354(%rip),%eax
L443:
  mov    %eax,%edx
  or     $0x7856,%edx
  lock cmpxchg %edx,0x2db7(%rip)        # 4080 <a.16>
  jne    L443
  cmp    $0x7a76,%edx
  jne    L328
  mov    D354(%rip),%eax
  cmp    $0x7a76,%eax
  jne    L59
  mov    D309(%rip),%rax
L316:
  mov    %rax,%rdx
  or     $0x7856,%rdx
  lock cmpxchg %rdx,0x2d76(%rip)        # 4078 <a.15>
  jne    L316
  cmp    $0x7a76,%rdx
  jne    L337
  mov    D309(%rip),%rax
  cmp    $0x7a76,%rax
  jne    L260
  mov    D22(%rip),%rax
L698:
  mov    %rax,%rdx
  or     $0x7856,%rdx
  lock cmpxchg %rdx,0x2d32(%rip)        # 4070 <a.14>
  jne    L698
  cmp    $0x7a76,%rdx
  jne    L265
  mov    D22(%rip),%rax
  cmp    $0x7a76,%rax
  jne    L452
  mov    D8(%rip),%rax
L119:
  mov    %rax,%rdx
  or     $0x7856,%rdx
  lock cmpxchg %rdx,0x2cee(%rip)        # 4068 <a.13>
  jne    L119
  cmp    $0x7a76,%rdx
  jne    L212
  mov    D8(%rip),%rax
  cmp    $0x7a76,%rax
  jne    L292
  mov    D502(%rip),%rax
L390:
  mov    %rax,%rdx
  or     $0x7856,%rdx
  lock cmpxchg %rdx,0x2caa(%rip)        # 4060 <a.12>
  jne    L390
  cmp    $0x7a76,%rdx
  jne    L590
  mov    D502(%rip),%rax
  cmp    $0x7a76,%rax
  jne    L376
  movzbl D308(%rip),%eax
  mov    %al,0x7(%rsp)
  mov    $0x1,%ecx
L466:
  movzbl 0x7(%rsp),%eax
  lock cmpxchg %cl,0x2c6a(%rip)        # 405f <a.11>
  sete   %dl
  je     L720
  mov    %al,0x7(%rsp)
L720:
  test   %dl,%dl
  je     L466
  movzbl D308(%rip),%eax
  test   %al,%al
  je     L140
  movzbl D404(%rip),%eax
L299:
  mov    %eax,%edx
  or     $0x78,%edx
  lock cmpxchg %dl,0x2c39(%rip)        # 405e <a.10>
  jne    L299
  cmp    $0xff,%dl
  jne    L45
  movzbl D404(%rip),%eax
  cmp    $0xff,%al
  jne    L422
  movzbl D520(%rip),%eax
L629:
  mov    %eax,%edx
  or     $0x78,%edx
  lock cmpxchg %dl,0x2c0a(%rip)        # 405d <a.9>
  jne    L629
  cmp    $0xff,%dl
  jne    L249
  movzbl D520(%rip),%eax
  cmp    $0xff,%al
  jne    L477
  movzbl D555(%rip),%eax
L145:
  mov    %eax,%edx
  or     $0x78,%edx
  lock cmpxchg %dl,0x2bdb(%rip)        # 405c <a.8>
  jne    L145
  cmp    $0xff,%dl
  jne    L620
  movzbl D555(%rip),%eax
  cmp    $0xff,%al
  jne    L309
  movzwl D440(%rip),%eax
L424:
  mov    %eax,%edx
  or     $0x5678,%dx
  lock cmpxchg %dx,0x2ba8(%rip)        # 405a <a.7>
  jne    L424
  cmp    $0xdfff,%dx
  jne    L371
  movzwl D440(%rip),%eax
  cmp    $0xdfff,%ax
  jne    L240
  movzwl D387(%rip),%eax
L354:
  mov    %eax,%edx
  or     $0x5678,%dx
  lock cmpxchg %dx,0x2b71(%rip)        # 4058 <a.6>
  jne    L354
  cmp    $0xdfff,%dx
  jne    L428
  movzwl D387(%rip),%eax
  cmp    $0xdfff,%ax
  jne    L42
  mov    D70(%rip),%eax
L703:
  mov    %eax,%edx
  or     $0x12345678,%edx
  lock cmpxchg %edx,0x2b39(%rip)        # 4054 <a.5>
  jne    L703
  cmp    $0xffffdfff,%edx
  jne    L406
  mov    D70(%rip),%eax
  cmp    $0xffffdfff,%eax
  jne    L366
  mov    D485(%rip),%eax
L459:
  mov    %eax,%edx
  or     $0x12345678,%edx
  lock cmpxchg %edx,0x2b00(%rip)        # 4050 <a.4>
  jne    L459
  cmp    $0xffffdfff,%edx
  jne    L594
  mov    D485(%rip),%eax
  cmp    $0xffffdfff,%eax
  jne    L490
  mov    D231(%rip),%rax
L522:
  mov    %rax,%rdx
  or     $0x12345678,%rdx
  lock cmpxchg %rdx,0x2abf(%rip)        # 4048 <a.3>
  jne    L522
  cmp    $0xffffffffffffdfff,%rdx
  jne    L127
  mov    D231(%rip),%rax
  cmp    $0xffffffffffffdfff,%rax
  jne    L563
  mov    D147(%rip),%rax
L361:
  mov    %rax,%rdx
  or     $0x12345678,%rdx
  lock cmpxchg %rdx,0x2a7b(%rip)        # 4040 <a.2>
  jne    L361
  cmp    $0xffffffffffffdfff,%rdx
  jne    L345
  mov    D147(%rip),%rax
  cmp    $0xffffffffffffdfff,%rax
  jne    L245
  mov    D379(%rip),%rax
L173:
  mov    %rax,%rdx
  or     $0x12345678,%rdx
  lock cmpxchg %rdx,0x2a37(%rip)        # 4038 <a.1>
  jne    L173
  cmp    $0xffffffffffffdfff,%rdx
  jne    L115
  mov    D379(%rip),%rax
  cmp    $0xffffffffffffdfff,%rax
  jne    L474
  mov    D477(%rip),%rax
L23:
  mov    %rax,%rdx
  or     $0x12345678,%rdx
  lock cmpxchg %rdx,0x29f3(%rip)        # 4030 <a.0>
  jne    L23
  cmp    $0xffffffffffffdfff,%rdx
  jne    L534
  mov    D477(%rip),%rax
  cmp    $0xffffffffffffdfff,%rax
  jne    L355
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L164
  add    $0x18,%rsp
  ret
L284:
  call   <abort@plt>
L128:
  call   <abort@plt>
L235:
  call   <abort@plt>
L528:
  call   <abort@plt>
L322:
  call   <abort@plt>
L124:
  call   <abort@plt>
L509:
  call   <abort@plt>
L604:
  call   <abort@plt>
L198:
  call   <abort@plt>
L566:
  call   <abort@plt>
L391:
  call   <abort@plt>
L661:
  call   <abort@plt>
L502:
  call   <abort@plt>
L328:
  call   <abort@plt>
L59:
  call   <abort@plt>
L337:
  call   <abort@plt>
L260:
  call   <abort@plt>
L265:
  call   <abort@plt>
L452:
  call   <abort@plt>
L212:
  call   <abort@plt>
L292:
  call   <abort@plt>
L590:
  call   <abort@plt>
L376:
  call   <abort@plt>
L140:
  call   <abort@plt>
L45:
  call   <abort@plt>
L422:
  call   <abort@plt>
L249:
  call   <abort@plt>
L477:
  call   <abort@plt>
L620:
  call   <abort@plt>
L309:
  call   <abort@plt>
L371:
  call   <abort@plt>
L240:
  call   <abort@plt>
L428:
  call   <abort@plt>
L42:
  call   <abort@plt>
L406:
  call   <abort@plt>
L366:
  call   <abort@plt>
L594:
  call   <abort@plt>
L490:
  call   <abort@plt>
L127:
  call   <abort@plt>
L563:
  call   <abort@plt>
L345:
  call   <abort@plt>
L245:
  call   <abort@plt>
L115:
  call   <abort@plt>
L474:
  call   <abort@plt>
L534:
  call   <abort@plt>
L355:
  call   <abort@plt>
L164:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void test_or(void) {
  do {
    do {
      static volatile _Atomic(_Bool) a = (_Bool)((0x1234));
      if ((a |= ((0x7856))) != (_Bool)((_Bool)((0x1234)) | ((0x7856))))
        abort();
      if (a != (_Bool)((_Bool)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(char) a = (char)((0x1234));
      if ((a |= ((0x7856))) != (char)((char)((0x1234)) | ((0x7856))))
        abort();
      if (a != (char)((char)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed char) a = (signed char)((0x1234));
      if ((a |= ((0x7856))) != (signed char)((signed char)((0x1234)) | ((0x7856))))
        abort();
      if (a != (signed char)((signed char)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned char) a = (unsigned char)((0x1234));
      if ((a |= ((0x7856))) != (unsigned char)((unsigned char)((0x1234)) | ((0x7856))))
        abort();
      if (a != (unsigned char)((unsigned char)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed short) a = (signed short)((0x1234));
      if ((a |= ((0x7856))) != (signed short)((signed short)((0x1234)) | ((0x7856))))
        abort();
      if (a != (signed short)((signed short)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned short) a = (unsigned short)((0x1234));
      if ((a |= ((0x7856))) != (unsigned short)((unsigned short)((0x1234)) | ((0x7856))))
        abort();
      if (a != (unsigned short)((unsigned short)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed int) a = (signed int)((0x1234));
      if ((a |= ((0x7856))) != (signed int)((signed int)((0x1234)) | ((0x7856))))
        abort();
      if (a != (signed int)((signed int)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned int) a = (unsigned int)((0x1234));
      if ((a |= ((0x7856))) != (unsigned int)((unsigned int)((0x1234)) | ((0x7856))))
        abort();
      if (a != (unsigned int)((unsigned int)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long) a = (signed long)((0x1234));
      if ((a |= ((0x7856))) != (signed long)((signed long)((0x1234)) | ((0x7856))))
        abort();
      if (a != (signed long)((signed long)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long) a = (unsigned long)((0x1234));
      if ((a |= ((0x7856))) != (unsigned long)((unsigned long)((0x1234)) | ((0x7856))))
        abort();
      if (a != (unsigned long)((unsigned long)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long long) a = (signed long long)((0x1234));
      if ((a |= ((0x7856))) != (signed long long)((signed long long)((0x1234)) | ((0x7856))))
        abort();
      if (a != (signed long long)((signed long long)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long long) a = (unsigned long long)((0x1234));
      if ((a |= ((0x7856))) != (unsigned long long)((unsigned long long)((0x1234)) | ((0x7856))))
        abort();
      if (a != (unsigned long long)((unsigned long long)((0x1234)) | ((0x7856))))
        abort();
    } while (0);
  } while (0);
  do {
    do {
      static volatile _Atomic(_Bool) a = (_Bool)((-12345));
      if ((a |= ((0x12345678))) != (_Bool)((_Bool)((-12345)) | ((0x12345678))))
        abort();
      if (a != (_Bool)((_Bool)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(char) a = (char)((-12345));
      if ((a |= ((0x12345678))) != (char)((char)((-12345)) | ((0x12345678))))
        abort();
      if (a != (char)((char)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed char) a = (signed char)((-12345));
      if ((a |= ((0x12345678))) != (signed char)((signed char)((-12345)) | ((0x12345678))))
        abort();
      if (a != (signed char)((signed char)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned char) a = (unsigned char)((-12345));
      if ((a |= ((0x12345678))) != (unsigned char)((unsigned char)((-12345)) | ((0x12345678))))
        abort();
      if (a != (unsigned char)((unsigned char)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed short) a = (signed short)((-12345));
      if ((a |= ((0x12345678))) != (signed short)((signed short)((-12345)) | ((0x12345678))))
        abort();
      if (a != (signed short)((signed short)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned short) a = (unsigned short)((-12345));
      if ((a |= ((0x12345678))) != (unsigned short)((unsigned short)((-12345)) | ((0x12345678))))
        abort();
      if (a != (unsigned short)((unsigned short)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed int) a = (signed int)((-12345));
      if ((a |= ((0x12345678))) != (signed int)((signed int)((-12345)) | ((0x12345678))))
        abort();
      if (a != (signed int)((signed int)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned int) a = (unsigned int)((-12345));
      if ((a |= ((0x12345678))) != (unsigned int)((unsigned int)((-12345)) | ((0x12345678))))
        abort();
      if (a != (unsigned int)((unsigned int)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long) a = (signed long)((-12345));
      if ((a |= ((0x12345678))) != (signed long)((signed long)((-12345)) | ((0x12345678))))
        abort();
      if (a != (signed long)((signed long)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long) a = (unsigned long)((-12345));
      if ((a |= ((0x12345678))) != (unsigned long)((unsigned long)((-12345)) | ((0x12345678))))
        abort();
      if (a != (unsigned long)((unsigned long)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(signed long long) a = (signed long long)((-12345));
      if ((a |= ((0x12345678))) != (signed long long)((signed long long)((-12345)) | ((0x12345678))))
        abort();
      if (a != (signed long long)((signed long long)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
    do {
      static volatile _Atomic(unsigned long long) a = (unsigned long long)((-12345));
      if ((a |= ((0x12345678))) != (unsigned long long)((unsigned long long)((-12345)) | ((0x12345678))))
        abort();
      if (a != (unsigned long long)((unsigned long long)((-12345)) | ((0x12345678))))
        abort();
    } while (0);
  } while (0);
}
```