void NoteTablePropogate(unsigned short *base_table, unsigned short *Tone) {
  int x, y;
  for (y = 0; y < 12; y++)
    Tone[y] = base_table[y];
  for (x = 0; x < 84; x++) {
    Tone[x + 12] = Tone[x] >> 1;
  }
}


x86 assembly (clang, -O0):
<NoteTablePropogate>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0xc,-0x18(%rbp)
jge    1143 <NoteTablePropogate+0x43>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,2),%dx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1113 <NoteTablePropogate+0x13>
movl   $0x0,-0x14(%rbp)
cmpl   $0x54,-0x14(%rbp)
jge    1185 <NoteTablePropogate+0x85>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzwl (%rax,%rcx,2),%eax
sar    $0x1,%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0xc,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    114a <NoteTablePropogate+0x4a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<NoteTablePropogate>:
movzwl (%rdi),%eax
mov    %ax,(%rsi)
movzwl 0x2(%rdi),%ecx
mov    %cx,0x2(%rsi)
movzwl 0x4(%rdi),%ecx
mov    %cx,0x4(%rsi)
movzwl 0x6(%rdi),%ecx
mov    %cx,0x6(%rsi)
movzwl 0x8(%rdi),%ecx
mov    %cx,0x8(%rsi)
movzwl 0xa(%rdi),%ecx
mov    %cx,0xa(%rsi)
movzwl 0xc(%rdi),%ecx
mov    %cx,0xc(%rsi)
movzwl 0xe(%rdi),%ecx
mov    %cx,0xe(%rsi)
movzwl 0x10(%rdi),%ecx
mov    %cx,0x10(%rsi)
movzwl 0x12(%rdi),%ecx
mov    %cx,0x12(%rsi)
movzwl 0x14(%rdi),%ecx
mov    %cx,0x14(%rsi)
movzwl 0x16(%rdi),%ecx
mov    %cx,0x16(%rsi)
shr    %eax
mov    %ax,0x18(%rsi)
movq   0x2(%rsi),%xmm0
movdqa %xmm0,%xmm2
psrlw  $0x1,%xmm2
movq   0xa(%rsi),%xmm1
movdqa %xmm1,%xmm3
psrlw  $0x1,%xmm3
punpcklqdq %xmm3,%xmm2
movdqu %xmm2,0x1a(%rsi)
movq   0x12(%rsi),%xmm2
movdqa %xmm2,%xmm3
psrlw  $0x1,%xmm3
movdqa %xmm0,%xmm4
psrlw  $0x2,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x2a(%rsi)
movdqa %xmm1,%xmm3
psrlw  $0x2,%xmm3
movdqa %xmm2,%xmm4
psrlw  $0x2,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x3a(%rsi)
movdqa %xmm0,%xmm3
psrlw  $0x3,%xmm3
movdqa %xmm1,%xmm4
psrlw  $0x3,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x4a(%rsi)
movdqa %xmm2,%xmm3
psrlw  $0x3,%xmm3
movdqa %xmm0,%xmm4
psrlw  $0x4,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x5a(%rsi)
movdqa %xmm1,%xmm3
psrlw  $0x4,%xmm3
movdqa %xmm2,%xmm4
psrlw  $0x4,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x6a(%rsi)
movdqa %xmm0,%xmm3
psrlw  $0x5,%xmm3
movdqa %xmm1,%xmm4
psrlw  $0x5,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x7a(%rsi)
movdqa %xmm2,%xmm3
psrlw  $0x5,%xmm3
movdqa %xmm0,%xmm4
psrlw  $0x6,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x8a(%rsi)
movdqa %xmm1,%xmm3
psrlw  $0x6,%xmm3
psrlw  $0x6,%xmm2
punpcklqdq %xmm2,%xmm3
movdqu %xmm3,0x9a(%rsi)
psrlw  $0x7,%xmm0
psrlw  $0x7,%xmm1
punpcklqdq %xmm1,%xmm0
movdqu %xmm0,0xaa(%rsi)
movzwl 0xa2(%rsi),%eax
shr    %eax
mov    %ax,0xba(%rsi)
movzwl 0xa4(%rsi),%eax
shr    %eax
mov    %ax,0xbc(%rsi)
movzwl 0xa6(%rsi),%eax
shr    %eax
mov    %ax,0xbe(%rsi)
ret

LLVM IR (-O0):
define void @NoteTablePropogate(i16* %0, i16* %1) {
%3 = alloca i16*
%4 = alloca i16*
%5 = alloca i32
%6 = alloca i32
store i16* %0, i16** %3
store i16* %1, i16** %4
store i32 0, i32* %6
br label %7
7: ; preds = %20, %2
%8 = load i32, i32* %6
%9 = icmp slt i32 %8, 12
br i1 %9, label %10, label %23
10: ; preds = %7
%11 = load i16*, i16** %3
%12 = load i32, i32* %6
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i16, i16* %11, i64 %13
%15 = load i16, i16* %14
%16 = load i16*, i16** %4
%17 = load i32, i32* %6
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i16, i16* %16, i64 %18
store i16 %15, i16* %19
br label %20
20: ; preds = %10
%21 = load i32, i32* %6
%22 = add nsw i32 %21, 1
store i32 %22, i32* %6
br label %7
23: ; preds = %7
store i32 0, i32* %5
br label %24
24: ; preds = %41, %23
%25 = load i32, i32* %5
%26 = icmp slt i32 %25, 84
br i1 %26, label %27, label %44
27: ; preds = %24
%28 = load i16*, i16** %4
%29 = load i32, i32* %5
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i16, i16* %28, i64 %30
%32 = load i16, i16* %31
%33 = zext i16 %32 to i32
%34 = ashr i32 %33, 1
%35 = trunc i32 %34 to i16
%36 = load i16*, i16** %4
%37 = load i32, i32* %5
%38 = add nsw i32 %37, 12
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i16, i16* %36, i64 %39
store i16 %35, i16* %40
br label %41
41: ; preds = %27
%42 = load i32, i32* %5
%43 = add nsw i32 %42, 1
store i32 %43, i32* %5
br label %24
44: ; preds = %24
ret void
}

LLVM IR (-O2):
define void @NoteTablePropogate(i16* nocapture %0, i16* nocapture %1) {
%3 = load i16, i16* %0
store i16 %3, i16* %1
%4 = getelementptr inbounds i16, i16* %0, i64 1
%5 = load i16, i16* %4
%6 = getelementptr inbounds i16, i16* %1, i64 1
store i16 %5, i16* %6
%7 = getelementptr inbounds i16, i16* %0, i64 2
%8 = load i16, i16* %7
%9 = getelementptr inbounds i16, i16* %1, i64 2
store i16 %8, i16* %9
%10 = getelementptr inbounds i16, i16* %0, i64 3
%11 = load i16, i16* %10
%12 = getelementptr inbounds i16, i16* %1, i64 3
store i16 %11, i16* %12
%13 = getelementptr inbounds i16, i16* %0, i64 4
%14 = load i16, i16* %13
%15 = getelementptr inbounds i16, i16* %1, i64 4
store i16 %14, i16* %15
%16 = getelementptr inbounds i16, i16* %0, i64 5
%17 = load i16, i16* %16
%18 = getelementptr inbounds i16, i16* %1, i64 5
store i16 %17, i16* %18
%19 = getelementptr inbounds i16, i16* %0, i64 6
%20 = load i16, i16* %19
%21 = getelementptr inbounds i16, i16* %1, i64 6
store i16 %20, i16* %21
%22 = getelementptr inbounds i16, i16* %0, i64 7
%23 = load i16, i16* %22
%24 = getelementptr inbounds i16, i16* %1, i64 7
store i16 %23, i16* %24
%25 = getelementptr inbounds i16, i16* %0, i64 8
%26 = load i16, i16* %25
%27 = getelementptr inbounds i16, i16* %1, i64 8
store i16 %26, i16* %27
%28 = getelementptr inbounds i16, i16* %0, i64 9
%29 = load i16, i16* %28
%30 = getelementptr inbounds i16, i16* %1, i64 9
store i16 %29, i16* %30
%31 = getelementptr inbounds i16, i16* %0, i64 10
%32 = load i16, i16* %31
%33 = getelementptr inbounds i16, i16* %1, i64 10
store i16 %32, i16* %33
%34 = getelementptr inbounds i16, i16* %0, i64 11
%35 = load i16, i16* %34
%36 = getelementptr inbounds i16, i16* %1, i64 11
store i16 %35, i16* %36
%37 = lshr i16 %3, 1
%38 = getelementptr inbounds i16, i16* %1, i64 12
store i16 %37, i16* %38
%39 = getelementptr inbounds i16, i16* %1, i64 1
%40 = bitcast i16* %39 to <4 x i16>*
%41 = load <4 x i16>, <4 x i16>* %40
%42 = lshr <4 x i16> %41, <i16 1, i16 1, i16 1, i16 1>
%43 = getelementptr inbounds i16, i16* %1, i64 13
%44 = bitcast i16* %43 to <4 x i16>*
store <4 x i16> %42, <4 x i16>* %44
%45 = getelementptr inbounds i16, i16* %1, i64 5
%46 = bitcast i16* %45 to <4 x i16>*
%47 = load <4 x i16>, <4 x i16>* %46
%48 = lshr <4 x i16> %47, <i16 1, i16 1, i16 1, i16 1>
%49 = getelementptr inbounds i16, i16* %1, i64 17
%50 = bitcast i16* %49 to <4 x i16>*
store <4 x i16> %48, <4 x i16>* %50
%51 = getelementptr inbounds i16, i16* %1, i64 9
%52 = bitcast i16* %51 to <4 x i16>*
%53 = load <4 x i16>, <4 x i16>* %52
%54 = lshr <4 x i16> %53, <i16 1, i16 1, i16 1, i16 1>
%55 = getelementptr inbounds i16, i16* %1, i64 21
%56 = bitcast i16* %55 to <4 x i16>*
store <4 x i16> %54, <4 x i16>* %56
%57 = getelementptr inbounds i16, i16* %1, i64 13
%58 = bitcast i16* %57 to <4 x i16>*
%59 = load <4 x i16>, <4 x i16>* %58
%60 = lshr <4 x i16> %59, <i16 1, i16 1, i16 1, i16 1>
%61 = getelementptr inbounds i16, i16* %1, i64 25
%62 = bitcast i16* %61 to <4 x i16>*
store <4 x i16> %60, <4 x i16>* %62
%63 = getelementptr inbounds i16, i16* %1, i64 17
%64 = bitcast i16* %63 to <4 x i16>*
%65 = load <4 x i16>, <4 x i16>* %64
%66 = lshr <4 x i16> %65, <i16 1, i16 1, i16 1, i16 1>
%67 = getelementptr inbounds i16, i16* %1, i64 29
%68 = bitcast i16* %67 to <4 x i16>*
store <4 x i16> %66, <4 x i16>* %68
%69 = getelementptr inbounds i16, i16* %1, i64 21
%70 = bitcast i16* %69 to <4 x i16>*
%71 = load <4 x i16>, <4 x i16>* %70
%72 = lshr <4 x i16> %71, <i16 1, i16 1, i16 1, i16 1>
%73 = getelementptr inbounds i16, i16* %1, i64 33
%74 = bitcast i16* %73 to <4 x i16>*
store <4 x i16> %72, <4 x i16>* %74
%75 = getelementptr inbounds i16, i16* %1, i64 25
%76 = bitcast i16* %75 to <4 x i16>*
%77 = load <4 x i16>, <4 x i16>* %76
%78 = lshr <4 x i16> %77, <i16 1, i16 1, i16 1, i16 1>
%79 = getelementptr inbounds i16, i16* %1, i64 37
%80 = bitcast i16* %79 to <4 x i16>*
store <4 x i16> %78, <4 x i16>* %80
%81 = getelementptr inbounds i16, i16* %1, i64 29
%82 = bitcast i16* %81 to <4 x i16>*
%83 = load <4 x i16>, <4 x i16>* %82
%84 = lshr <4 x i16> %83, <i16 1, i16 1, i16 1, i16 1>
%85 = getelementptr inbounds i16, i16* %1, i64 41
%86 = bitcast i16* %85 to <4 x i16>*
store <4 x i16> %84, <4 x i16>* %86
%87 = getelementptr inbounds i16, i16* %1, i64 33
%88 = bitcast i16* %87 to <4 x i16>*
%89 = load <4 x i16>, <4 x i16>* %88
%90 = lshr <4 x i16> %89, <i16 1, i16 1, i16 1, i16 1>
%91 = getelementptr inbounds i16, i16* %1, i64 45
%92 = bitcast i16* %91 to <4 x i16>*
store <4 x i16> %90, <4 x i16>* %92
%93 = getelementptr inbounds i16, i16* %1, i64 37
%94 = bitcast i16* %93 to <4 x i16>*
%95 = load <4 x i16>, <4 x i16>* %94
%96 = lshr <4 x i16> %95, <i16 1, i16 1, i16 1, i16 1>
%97 = getelementptr inbounds i16, i16* %1, i64 49
%98 = bitcast i16* %97 to <4 x i16>*
store <4 x i16> %96, <4 x i16>* %98
%99 = getelementptr inbounds i16, i16* %1, i64 41
%100 = bitcast i16* %99 to <4 x i16>*
%101 = load <4 x i16>, <4 x i16>* %100
%102 = lshr <4 x i16> %101, <i16 1, i16 1, i16 1, i16 1>
%103 = getelementptr inbounds i16, i16* %1, i64 53
%104 = bitcast i16* %103 to <4 x i16>*
store <4 x i16> %102, <4 x i16>* %104
%105 = getelementptr inbounds i16, i16* %1, i64 45
%106 = bitcast i16* %105 to <4 x i16>*
%107 = load <4 x i16>, <4 x i16>* %106
%108 = lshr <4 x i16> %107, <i16 1, i16 1, i16 1, i16 1>
%109 = getelementptr inbounds i16, i16* %1, i64 57
%110 = bitcast i16* %109 to <4 x i16>*
store <4 x i16> %108, <4 x i16>* %110
%111 = getelementptr inbounds i16, i16* %1, i64 49
%112 = bitcast i16* %111 to <4 x i16>*
%113 = load <4 x i16>, <4 x i16>* %112
%114 = lshr <4 x i16> %113, <i16 1, i16 1, i16 1, i16 1>
%115 = getelementptr inbounds i16, i16* %1, i64 61
%116 = bitcast i16* %115 to <4 x i16>*
store <4 x i16> %114, <4 x i16>* %116
%117 = getelementptr inbounds i16, i16* %1, i64 53
%118 = bitcast i16* %117 to <4 x i16>*
%119 = load <4 x i16>, <4 x i16>* %118
%120 = lshr <4 x i16> %119, <i16 1, i16 1, i16 1, i16 1>
%121 = getelementptr inbounds i16, i16* %1, i64 65
%122 = bitcast i16* %121 to <4 x i16>*
store <4 x i16> %120, <4 x i16>* %122
%123 = getelementptr inbounds i16, i16* %1, i64 57
%124 = bitcast i16* %123 to <4 x i16>*
%125 = load <4 x i16>, <4 x i16>* %124
%126 = lshr <4 x i16> %125, <i16 1, i16 1, i16 1, i16 1>
%127 = getelementptr inbounds i16, i16* %1, i64 69
%128 = bitcast i16* %127 to <4 x i16>*
store <4 x i16> %126, <4 x i16>* %128
%129 = getelementptr inbounds i16, i16* %1, i64 61
%130 = bitcast i16* %129 to <4 x i16>*
%131 = load <4 x i16>, <4 x i16>* %130
%132 = lshr <4 x i16> %131, <i16 1, i16 1, i16 1, i16 1>
%133 = getelementptr inbounds i16, i16* %1, i64 73
%134 = bitcast i16* %133 to <4 x i16>*
store <4 x i16> %132, <4 x i16>* %134
%135 = getelementptr inbounds i16, i16* %1, i64 65
%136 = bitcast i16* %135 to <4 x i16>*
%137 = load <4 x i16>, <4 x i16>* %136
%138 = lshr <4 x i16> %137, <i16 1, i16 1, i16 1, i16 1>
%139 = getelementptr inbounds i16, i16* %1, i64 77
%140 = bitcast i16* %139 to <4 x i16>*
store <4 x i16> %138, <4 x i16>* %140
%141 = getelementptr inbounds i16, i16* %1, i64 69
%142 = bitcast i16* %141 to <4 x i16>*
%143 = load <4 x i16>, <4 x i16>* %142
%144 = lshr <4 x i16> %143, <i16 1, i16 1, i16 1, i16 1>
%145 = getelementptr inbounds i16, i16* %1, i64 81
%146 = bitcast i16* %145 to <4 x i16>*
store <4 x i16> %144, <4 x i16>* %146
%147 = getelementptr inbounds i16, i16* %1, i64 73
%148 = bitcast i16* %147 to <4 x i16>*
%149 = load <4 x i16>, <4 x i16>* %148
%150 = lshr <4 x i16> %149, <i16 1, i16 1, i16 1, i16 1>
%151 = getelementptr inbounds i16, i16* %1, i64 85
%152 = bitcast i16* %151 to <4 x i16>*
store <4 x i16> %150, <4 x i16>* %152
%153 = getelementptr inbounds i16, i16* %1, i64 77
%154 = bitcast i16* %153 to <4 x i16>*
%155 = load <4 x i16>, <4 x i16>* %154
%156 = lshr <4 x i16> %155, <i16 1, i16 1, i16 1, i16 1>
%157 = getelementptr inbounds i16, i16* %1, i64 89
%158 = bitcast i16* %157 to <4 x i16>*
store <4 x i16> %156, <4 x i16>* %158
%159 = getelementptr inbounds i16, i16* %1, i64 81
%160 = load i16, i16* %159
%161 = lshr i16 %160, 1
%162 = getelementptr inbounds i16, i16* %1, i64 93
store i16 %161, i16* %162
%163 = getelementptr inbounds i16, i16* %1, i64 82
%164 = load i16, i16* %163
%165 = lshr i16 %164, 1
%166 = getelementptr inbounds i16, i16* %1, i64 94
store i16 %165, i16* %166
%167 = getelementptr inbounds i16, i16* %1, i64 83
%168 = load i16, i16* %167
%169 = lshr i16 %168, 1
%170 = getelementptr inbounds i16, i16* %1, i64 95
store i16 %169, i16* %170
ret void
}