Fruitless optimizations

This commit is contained in:
Grigory Chudov
2013-03-24 19:18:34 -04:00
parent 78fc1f0287
commit 79b0cb069b
3 changed files with 267 additions and 128 deletions

View File

@@ -71,11 +71,11 @@ namespace CUETools.Codecs
#endregion
private byte* buffer_m;
private byte* bptr_m;
private int buffer_len_m;
private int have_bits_m;
private ulong cache_m;
private ushort crc16_m;
public byte* bptr_m;
public int buffer_len_m;
public int have_bits_m;
public ulong cache_m;
public ushort crc16_m;
public int Position
{
@@ -296,6 +296,38 @@ namespace CUETools.Codecs
return v;
}
public void read_int_block(int n, int k, int* r)
{
fill();
byte* bptr = bptr_m;
int have_bits = have_bits_m;
ulong cache = cache_m;
ushort crc = crc16_m;
fixed (ushort* t = Crc16.table)
{
for (int i = n; i > 0; i--)
{
while (have_bits < 56)
{
have_bits += 8;
byte b = *(bptr++);
cache |= (ulong)b << (64 - have_bits);
crc = (ushort)((crc << 8) ^ t[(crc >> 8) ^ b]);
}
int res = (int)((long)cache >> 64 - k);
cache <<= k;
have_bits -= k;
*(r++) = res;
}
}
have_bits_m = have_bits;
cache_m = cache;
bptr_m = bptr;
crc16_m = crc;
}
public void read_rice_block(int n, int k, int* r)
{
fill();

View File

@@ -755,160 +755,170 @@ namespace CUETools.Codecs
}
public static unsafe void
decode_residual(int* res, int* smp, int n, int order,
decode_residual(int* smp, int n, int order,
int* coefs, int shift)
{
for (int i = 0; i < order; i++)
smp[i] = res[i];
int* s = smp;
int* r = res + order;
int c0 = coefs[0];
int c1 = coefs[1];
switch (order)
int* cc = stackalloc int[12];
for (int i = 0; i < 12; i++)
cc[i] = 0;
if (order <= 12)
{
for (int i = 0; i < order; i++)
cc[i] = coefs[order - 1 - i];
}
switch (order)
{
case 1:
for (int i = n - order; i > 0; i--)
{
int pred = c0 * *(s++);
*s = *(r++) + (pred >> shift);
int pred = *cc * *(s++);
*s += pred >> shift;
}
break;
case 2:
for (int i = n - order; i > 0; i--)
{
int pred = c1 * *(s++) + c0 * *(s++);
*(s--) = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *co * *(s++);
*(s--) += pred >> shift;
}
break;
case 3:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*co * *(s++);
*s += pred >> shift;
s -= 2;
}
break;
case 4:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *co * *(s++);
*s += pred >> shift;
s -= 3;
}
break;
case 5:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co) * *(s++);
*s += pred >> shift;
s -= 4;
}
break;
case 6:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++);
*s += pred >> shift;
s -= 5;
}
break;
case 7:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++);
*s += pred >> shift;
s -= 6;
}
break;
case 8:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++);
*s += pred >> shift;
s -= 7;
}
break;
case 9:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
s -= 8;
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++);
*s += pred >> shift;
s -= 8;
}
break;
case 10:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
s -= 9;
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++);
*s += pred >> shift;
s -= 9;
}
break;
case 11:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
s -= 10;
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++);
*s += pred >> shift;
s -= 10;
}
break;
case 12:
for (int i = n - order; i > 0; i--)
{
int* co = coefs + order - 1;
int pred =
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
*(co--) * *(s++) + *(co--) * *(s++) +
c1 * *(s++) + c0 * *(s++);
*s = *(r++) + (pred >> shift);
s -= 11;
int* co = cc;
int pred =
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++) +
*(co++) * *(s++) + *(co++) * *(s++);
// cc[00] * s[00] + cc[01] * s[01]
//+ cc[02] * s[02] + cc[03] * s[03]
//+ cc[04] * s[04] + cc[05] * s[05]
//+ cc[06] * s[06] + cc[07] * s[07]
//+ cc[08] * s[08] + cc[09] * s[09]
//+ cc[10] * s[10] + cc[11] * s[11];
*s += pred >> shift;
s -= 11;
}
break;
default:
@@ -926,10 +936,10 @@ namespace CUETools.Codecs
pred += coefs[4] * *(s++);
pred += coefs[3] * *(s++);
pred += coefs[2] * *(s++);
pred += c1 * *(s++);
pred += c0 * *(s++);
*s = *(r++) + (pred >> shift);
}
pred += coefs[1] * *(s++);
pred += coefs[0] * *(s++);
*s += pred >> shift;
}
break;
}
}