void CRCBuildTable16(unsigned short aPoly, unsigned short *crcTable) {
  unsigned short i, j;
  unsigned short nData;
  unsigned short nAccum;
  for (i = 0; i < 256; i++) {
    nData = (unsigned short)(i << 8);
    nAccum = 0;
    for (j = 0; j < 8; j++) {
      if ((nData ^ nAccum) & 0x8000)
        nAccum = (nAccum << 1) ^ aPoly;
      else
        nAccum <<= 1;
      nData <<= 1;
    }
    crcTable[i] = nAccum;
  }
}


x86 assembly (clang, -O0):
<CRCBuildTable16>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x2(%rbp)
mov    %rsi,-0x10(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x12(%rbp),%eax
cmp    $0x100,%eax
jge    11be <CRCBuildTable16+0xbe>
movzwl -0x12(%rbp),%eax
shl    $0x8,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x18(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x14(%rbp),%eax
cmp    $0x8,%eax
jge    119d <CRCBuildTable16+0x9d>
movzwl -0x16(%rbp),%eax
movzwl -0x18(%rbp),%ecx
xor    %ecx,%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     1176 <CRCBuildTable16+0x76>
movzwl -0x18(%rbp),%eax
shl    $0x1,%eax
movzwl -0x2(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0x18(%rbp)
jmp    1181 <CRCBuildTable16+0x81>
movzwl -0x18(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0x18(%rbp)
movzwl -0x16(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0x16(%rbp)
mov    -0x14(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x14(%rbp)
jmp    113b <CRCBuildTable16+0x3b>
mov    -0x18(%rbp),%dx
mov    -0x10(%rbp),%rax
movzwl -0x12(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0x12(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x12(%rbp)
jmp    1115 <CRCBuildTable16+0x15>
pop    %rbp
ret

x86 assembly (clang, -O2):
<CRCBuildTable16>:
movd   %edi,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
movdqa 0xeea(%rip),%xmm1
xor    %eax,%eax
movdqa 0xef0(%rip),%xmm2
movdqa %xmm1,%xmm3
psllw  $0x8,%xmm3
psraw  $0xf,%xmm3
pand   %xmm0,%xmm3
movdqa %xmm1,%xmm4
psllw  $0x9,%xmm4
pxor   %xmm3,%xmm4
paddw  %xmm3,%xmm3
psraw  $0xf,%xmm4
pand   %xmm0,%xmm4
pxor   %xmm3,%xmm4
movdqa %xmm1,%xmm3
psllw  $0xa,%xmm3
pxor   %xmm4,%xmm3
paddw  %xmm4,%xmm4
psraw  $0xf,%xmm3
pand   %xmm0,%xmm3
pxor   %xmm4,%xmm3
movdqa %xmm1,%xmm4
psllw  $0xb,%xmm4
pxor   %xmm3,%xmm4
paddw  %xmm3,%xmm3
psraw  $0xf,%xmm4
pand   %xmm0,%xmm4
pxor   %xmm3,%xmm4
movdqa %xmm1,%xmm3
psllw  $0xc,%xmm3
pxor   %xmm4,%xmm3
paddw  %xmm4,%xmm4
psraw  $0xf,%xmm3
pand   %xmm0,%xmm3
pxor   %xmm4,%xmm3
movdqa %xmm1,%xmm4
psllw  $0xd,%xmm4
pxor   %xmm3,%xmm4
paddw  %xmm3,%xmm3
psraw  $0xf,%xmm4
pand   %xmm0,%xmm4
pxor   %xmm3,%xmm4
movdqa %xmm1,%xmm3
psllw  $0xe,%xmm3
pxor   %xmm4,%xmm3
paddw  %xmm4,%xmm4
psraw  $0xf,%xmm3
pand   %xmm0,%xmm3
pxor   %xmm4,%xmm3
movdqa %xmm1,%xmm4
psllw  $0xf,%xmm4
pxor   %xmm3,%xmm4
paddw  %xmm3,%xmm3
psraw  $0xf,%xmm4
pand   %xmm0,%xmm4
pxor   %xmm3,%xmm4
movdqu %xmm4,(%rsi,%rax,2)
add    $0x8,%rax
paddw  %xmm2,%xmm1
cmp    $0x100,%rax
jne    1120 <CRCBuildTable16+0x20>
ret

LLVM IR (-O0):
define void @CRCBuildTable16(i16 zeroext %0, i16* %1) {
%3 = alloca i16
%4 = alloca i16*
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
store i16 %0, i16* %3
store i16* %1, i16** %4
store i16 0, i16* %5
br label %9
9: ; preds = %57, %2
%10 = load i16, i16* %5
%11 = zext i16 %10 to i32
%12 = icmp slt i32 %11, 256
br i1 %12, label %13, label %60
13: ; preds = %9
%14 = load i16, i16* %5
%15 = zext i16 %14 to i32
%16 = shl i32 %15, 8
%17 = trunc i32 %16 to i16
store i16 %17, i16* %7
store i16 0, i16* %8
store i16 0, i16* %6
br label %18
18: ; preds = %48, %13
%19 = load i16, i16* %6
%20 = zext i16 %19 to i32
%21 = icmp slt i32 %20, 8
br i1 %21, label %22, label %51
22: ; preds = %18
%23 = load i16, i16* %7
%24 = zext i16 %23 to i32
%25 = load i16, i16* %8
%26 = zext i16 %25 to i32
%27 = xor i32 %24, %26
%28 = and i32 %27, 32768
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %38
30: ; preds = %22
%31 = load i16, i16* %8
%32 = zext i16 %31 to i32
%33 = shl i32 %32, 1
%34 = load i16, i16* %3
%35 = zext i16 %34 to i32
%36 = xor i32 %33, %35
%37 = trunc i32 %36 to i16
store i16 %37, i16* %8
br label %43
38: ; preds = %22
%39 = load i16, i16* %8
%40 = zext i16 %39 to i32
%41 = shl i32 %40, 1
%42 = trunc i32 %41 to i16
store i16 %42, i16* %8
br label %43
43: ; preds = %38, %30
%44 = load i16, i16* %7
%45 = zext i16 %44 to i32
%46 = shl i32 %45, 1
%47 = trunc i32 %46 to i16
store i16 %47, i16* %7
br label %48
48: ; preds = %43
%49 = load i16, i16* %6
%50 = add i16 %49, 1
store i16 %50, i16* %6
br label %18
51: ; preds = %18
%52 = load i16, i16* %8
%53 = load i16*, i16** %4
%54 = load i16, i16* %5
%55 = zext i16 %54 to i64
%56 = getelementptr inbounds i16, i16* %53, i64 %55
store i16 %52, i16* %56
br label %57
57: ; preds = %51
%58 = load i16, i16* %5
%59 = add i16 %58, 1
store i16 %59, i16* %5
br label %9
60: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @CRCBuildTable16(i16 zeroext %0, i16* nocapture writeonly %1) {
%3 = insertelement <8 x i16> poison, i16 %0, i64 0
%4 = shufflevector <8 x i16> %3, <8 x i16> poison, <8 x i32> zeroinitializer
br label %5
5: ; preds = %5, %2
%6 = phi i64 [ 0, %2 ], [ %55, %5 ]
%7 = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %2 ], [ %56, %5 ]
%8 = and <8 x i16> %7, <i16 128, i16 128, i16 128, i16 128, i16 128, i16 128, i16 128, i16 128>
%9 = icmp eq <8 x i16> %8, zeroinitializer
%10 = select <8 x i1> %9, <8 x i16> zeroinitializer, <8 x i16> %4
%11 = shl <8 x i16> %7, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
%12 = xor <8 x i16> %10, %11
%13 = shl <8 x i16> %10, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%14 = icmp slt <8 x i16> %12, zeroinitializer
%15 = select <8 x i1> %14, <8 x i16> %4, <8 x i16> zeroinitializer
%16 = xor <8 x i16> %15, %13
%17 = shl <8 x i16> %7, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>
%18 = xor <8 x i16> %16, %17
%19 = shl <8 x i16> %16, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%20 = icmp slt <8 x i16> %18, zeroinitializer
%21 = select <8 x i1> %20, <8 x i16> %4, <8 x i16> zeroinitializer
%22 = xor <8 x i16> %21, %19
%23 = shl <8 x i16> %7, <i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11, i16 11>
%24 = xor <8 x i16> %22, %23
%25 = shl <8 x i16> %22, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%26 = icmp slt <8 x i16> %24, zeroinitializer
%27 = select <8 x i1> %26, <8 x i16> %4, <8 x i16> zeroinitializer
%28 = xor <8 x i16> %27, %25
%29 = shl <8 x i16> %7, <i16 12, i16 12, i16 12, i16 12, i16 12, i16 12, i16 12, i16 12>
%30 = xor <8 x i16> %28, %29
%31 = shl <8 x i16> %28, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%32 = icmp slt <8 x i16> %30, zeroinitializer
%33 = select <8 x i1> %32, <8 x i16> %4, <8 x i16> zeroinitializer
%34 = xor <8 x i16> %33, %31
%35 = shl <8 x i16> %7, <i16 13, i16 13, i16 13, i16 13, i16 13, i16 13, i16 13, i16 13>
%36 = xor <8 x i16> %34, %35
%37 = shl <8 x i16> %34, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%38 = icmp slt <8 x i16> %36, zeroinitializer
%39 = select <8 x i1> %38, <8 x i16> %4, <8 x i16> zeroinitializer
%40 = xor <8 x i16> %39, %37
%41 = shl <8 x i16> %7, <i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14, i16 14>
%42 = xor <8 x i16> %40, %41
%43 = shl <8 x i16> %40, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%44 = icmp slt <8 x i16> %42, zeroinitializer
%45 = select <8 x i1> %44, <8 x i16> %4, <8 x i16> zeroinitializer
%46 = xor <8 x i16> %45, %43
%47 = shl <8 x i16> %7, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
%48 = xor <8 x i16> %46, %47
%49 = shl <8 x i16> %46, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%50 = icmp slt <8 x i16> %48, zeroinitializer
%51 = select <8 x i1> %50, <8 x i16> %4, <8 x i16> zeroinitializer
%52 = xor <8 x i16> %51, %49
%53 = getelementptr inbounds i16, i16* %1, i64 %6
%54 = bitcast i16* %53 to <8 x i16>*
store <8 x i16> %52, <8 x i16>* %54
%55 = add nuw i64 %6, 8
%56 = add <8 x i16> %7, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%57 = icmp eq i64 %55, 256
br i1 %57, label %58, label %5
58: ; preds = %5
ret void
}