Switch iteration over channels to the do{}while(); construct in order to inform the compiler that the these loops execute at least once. (This results in more intelligent output from the clang static analysis tool and should also produce faster code on at least some architectures.)
This commit is contained in:
parent
60c316b419
commit
9743bf38ca
3 changed files with 56 additions and 68 deletions
|
@ -70,8 +70,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank
|
|||
const celt_int16 *eBands = m->eBands;
|
||||
const int C = CHANNELS(_C);
|
||||
N = M*m->shortMdctSize;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=0;i<end;i++)
|
||||
{
|
||||
int j;
|
||||
|
@ -98,7 +97,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank
|
|||
}
|
||||
/*printf ("%f ", bank[i+c*m->nbEBands]);*/
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
/*printf ("\n");*/
|
||||
}
|
||||
|
||||
|
@ -109,8 +108,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_nor
|
|||
const celt_int16 *eBands = m->eBands;
|
||||
const int C = CHANNELS(_C);
|
||||
N = M*m->shortMdctSize;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
i=0; do {
|
||||
celt_word16 g;
|
||||
int j,shift;
|
||||
|
@ -122,7 +120,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_nor
|
|||
X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
|
||||
} while (++j<M*eBands[i+1]);
|
||||
} while (++i<end);
|
||||
}
|
||||
} while (++c<C);
|
||||
}
|
||||
|
||||
#else /* FIXED_POINT */
|
||||
|
@ -133,8 +131,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank
|
|||
const celt_int16 *eBands = m->eBands;
|
||||
const int C = CHANNELS(_C);
|
||||
N = M*m->shortMdctSize;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=0;i<end;i++)
|
||||
{
|
||||
int j;
|
||||
|
@ -144,7 +141,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bank
|
|||
bank[i+c*m->nbEBands] = celt_sqrt(sum);
|
||||
/*printf ("%f ", bank[i+c*m->nbEBands]);*/
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
/*printf ("\n");*/
|
||||
}
|
||||
|
||||
|
@ -155,8 +152,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_nor
|
|||
const celt_int16 *eBands = m->eBands;
|
||||
const int C = CHANNELS(_C);
|
||||
N = M*m->shortMdctSize;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=0;i<end;i++)
|
||||
{
|
||||
int j;
|
||||
|
@ -164,7 +160,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * restrict freq, celt_nor
|
|||
for (j=M*eBands[i];j<M*eBands[i+1];j++)
|
||||
X[j+c*N] = freq[j+c*N]*g;
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
}
|
||||
|
||||
#endif /* FIXED_POINT */
|
||||
|
@ -177,8 +173,7 @@ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig
|
|||
const int C = CHANNELS(_C);
|
||||
N = M*m->shortMdctSize;
|
||||
celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels");
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
celt_sig * restrict f;
|
||||
const celt_norm * restrict x;
|
||||
f = freq+c*N;
|
||||
|
@ -196,7 +191,7 @@ void denormalise_bands(const CELTMode *m, const celt_norm * restrict X, celt_sig
|
|||
}
|
||||
for (i=M*eBands[m->nbEBands];i<N;i++)
|
||||
*f++ = 0;
|
||||
}
|
||||
} while (++c<C);
|
||||
}
|
||||
|
||||
static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bank, int bandID, int N)
|
||||
|
@ -299,8 +294,7 @@ int folding_decision(const CELTMode *m, celt_norm *X, int *average, int *last_de
|
|||
|
||||
if (M*(eBands[end]-eBands[end-1]) <= 8)
|
||||
return 0;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=0;i<end;i++)
|
||||
{
|
||||
int j, N, tmp=0;
|
||||
|
@ -327,7 +321,7 @@ int folding_decision(const CELTMode *m, celt_norm *X, int *average, int *last_de
|
|||
sum += tmp*256;
|
||||
nbBands++;
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
sum /= nbBands;
|
||||
/* Recursive averaging */
|
||||
sum = (sum+*average)>>1;
|
||||
|
@ -386,12 +380,11 @@ void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, floa
|
|||
float g;
|
||||
if (bandE0[i]<10 || (C==2 && bandE0[i+m->nbEBands]<1))
|
||||
continue;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
g = bandE[i+c*m->nbEBands]/(1e-15+bandE0[i+c*m->nbEBands]);
|
||||
for (j=M*m->eBands[i];j<M*m->eBands[i+1];j++)
|
||||
MSE[i] += (g*X[j+c*N]-X0[j+c*N])*(g*X[j+c*N]-X0[j+c*N]);
|
||||
}
|
||||
} while (++c<C);
|
||||
MSECount[i]+=C;
|
||||
}
|
||||
nbMSEBands = m->nbEBands;
|
||||
|
@ -509,8 +502,7 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
|
|||
{
|
||||
int c;
|
||||
celt_norm *x = X;
|
||||
for (c=0;c<1+stereo;c++)
|
||||
{
|
||||
c=0; do {
|
||||
int sign=0;
|
||||
if (*remaining_bits>=1<<BITRES)
|
||||
{
|
||||
|
@ -527,7 +519,7 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
|
|||
if (resynth)
|
||||
x[0] = sign ? -NORM_SCALING : NORM_SCALING;
|
||||
x = Y;
|
||||
}
|
||||
} while (++c<1+stereo);
|
||||
if (lowband_out)
|
||||
lowband_out[0] = SHR16(X[0],4);
|
||||
return;
|
||||
|
|
|
@ -274,8 +274,7 @@ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * rest
|
|||
B = shortBlocks;
|
||||
}
|
||||
ALLOC(tmp, N, celt_word32);
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (b=0;b<B;b++)
|
||||
{
|
||||
int j;
|
||||
|
@ -284,7 +283,7 @@ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * rest
|
|||
for (j=0;j<N;j++)
|
||||
out[(j*B+b)+c*N*B] = tmp[j];
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
RESTORE_STACK;
|
||||
}
|
||||
}
|
||||
|
@ -299,8 +298,7 @@ static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X
|
|||
const int C = CHANNELS(_C);
|
||||
const int N = mode->shortMdctSize<<LM;
|
||||
const int overlap = OVERLAP(mode);
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
int j;
|
||||
VARDECL(celt_word32, x);
|
||||
VARDECL(celt_word32, tmp);
|
||||
|
@ -335,15 +333,14 @@ static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X
|
|||
for (j=0;j<overlap;j++)
|
||||
overlap_mem[c][j] = x[N+j];
|
||||
RESTORE_STACK;
|
||||
}
|
||||
} while (++c<C);
|
||||
}
|
||||
|
||||
static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, const celt_word16 *coef, celt_sig *mem)
|
||||
{
|
||||
const int C = CHANNELS(_C);
|
||||
int c;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
int j;
|
||||
celt_sig * restrict x;
|
||||
celt_word16 * restrict y;
|
||||
|
@ -361,7 +358,7 @@ static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, const ce
|
|||
y+=C;
|
||||
}
|
||||
mem[c] = m;
|
||||
}
|
||||
} while (++c<C);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_POSTFILTER
|
||||
|
@ -629,13 +626,12 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
|
|||
#if 0
|
||||
float diff=0;
|
||||
int c;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=0;i<nbEBands-1;i++)
|
||||
{
|
||||
diff += bandLogE[i+c*nbEBands]*(i-.5*nbEBands);
|
||||
}
|
||||
}
|
||||
} while (++c<0);
|
||||
diff /= C*(nbEBands-1);
|
||||
/*printf("%f\n", diff);*/
|
||||
if (diff > 4)
|
||||
|
@ -737,8 +733,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
pre[0] = _pre;
|
||||
pre[1] = _pre + (N+COMBFILTER_MAXPERIOD);
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
const celt_word16 * restrict pcmp = pcm+c;
|
||||
celt_sig * restrict inp = in+c*(N+st->overlap)+st->overlap;
|
||||
|
||||
|
@ -754,7 +749,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
}
|
||||
CELT_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
|
||||
CELT_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
|
||||
}
|
||||
} while (++c<C);
|
||||
|
||||
#ifdef ENABLE_POSTFILTER
|
||||
{
|
||||
|
@ -804,8 +799,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
ec_enc_bit_prob(enc, 0, 32768);
|
||||
#endif /* ENABLE_POSTFILTER */
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
CELT_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap);
|
||||
#ifdef ENABLE_POSTFILTER
|
||||
comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD,
|
||||
|
@ -822,7 +816,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
CELT_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
|
||||
}
|
||||
#endif /* ENABLE_POSTFILTER */
|
||||
}
|
||||
} while (++c<C);
|
||||
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
@ -1018,9 +1012,10 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
#ifdef MEASURE_NORM_MSE
|
||||
float X0[3000];
|
||||
float bandE0[60];
|
||||
for (c=0;c<C;c++)
|
||||
c=0; do
|
||||
for (i=0;i<N;i++)
|
||||
X0[i+c*N] = X[i+c*N];
|
||||
while (++c<C);
|
||||
for (i=0;i<C*st->mode->nbEBands;i++)
|
||||
bandE0[i] = bandE[i];
|
||||
#endif
|
||||
|
@ -1050,30 +1045,32 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
|
|||
if (C==2)
|
||||
CELT_MOVE(st->syn_mem[1], st->syn_mem[1]+N, MAX_PERIOD);
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
c=0; do
|
||||
for (i=0;i<M*st->mode->eBands[st->start];i++)
|
||||
freq[c*N+i] = 0;
|
||||
for (c=0;c<C;c++)
|
||||
while (++c<C);
|
||||
c=0; do
|
||||
for (i=M*st->mode->eBands[st->end];i<N;i++)
|
||||
freq[c*N+i] = 0;
|
||||
while (++c<C);
|
||||
|
||||
out_mem[0] = st->syn_mem[0]+MAX_PERIOD;
|
||||
if (C==2)
|
||||
out_mem[1] = st->syn_mem[1]+MAX_PERIOD;
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
c=0; do
|
||||
overlap_mem[c] = _overlap_mem + c*st->overlap;
|
||||
while (++c<C);
|
||||
|
||||
compute_inv_mdcts(st->mode, shortBlocks, freq, out_mem, overlap_mem, C, LM);
|
||||
|
||||
#ifdef ENABLE_POSTFILTER
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
comb_filter(out_mem[c], out_mem[c], st->prefilter_period, st->prefilter_period, st->overlap, C,
|
||||
st->prefilter_gain, st->prefilter_gain, NULL, 0);
|
||||
comb_filter(out_mem[c]+st->overlap, out_mem[c]+st->overlap, st->prefilter_period, pitch_index, N-st->overlap, C,
|
||||
st->prefilter_gain, gain1, st->mode->window, st->mode->overlap);
|
||||
}
|
||||
} while (++c<C);
|
||||
#endif /* ENABLE_POSTFILTER */
|
||||
|
||||
deemphasis(out_mem, (celt_word16*)pcm, N, C, st->mode->preemph, st->preemph_memD);
|
||||
|
@ -1368,12 +1365,11 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
|
|||
celt_word16 *lpc;
|
||||
SAVE_STACK;
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap);
|
||||
out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD;
|
||||
overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE;
|
||||
}
|
||||
} while (++c<C);
|
||||
lpc = (celt_word16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C);
|
||||
|
||||
len = N+st->mode->overlap;
|
||||
|
@ -1402,8 +1398,7 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
|
|||
fade = 0;
|
||||
}
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
/* FIXME: This is more memory than necessary */
|
||||
celt_word32 e[2*MAX_PERIOD];
|
||||
celt_word16 exc[2*MAX_PERIOD];
|
||||
|
@ -1532,7 +1527,7 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
|
|||
#endif /* ENABLE_POSTFILTER */
|
||||
for (i=0;i<overlap;i++)
|
||||
out_mem[c][MAX_PERIOD+i] = e[i];
|
||||
}
|
||||
} while (++c<C);
|
||||
|
||||
{
|
||||
celt_word32 *out_syn[2];
|
||||
|
@ -1597,12 +1592,11 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
|
|||
return CELT_BAD_ARG;
|
||||
M=1<<LM;
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap);
|
||||
out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD;
|
||||
overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE;
|
||||
}
|
||||
} while (++c<C);
|
||||
lpc = (celt_word16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C);
|
||||
oldBandE = lpc+C*LPC_ORDER;
|
||||
|
||||
|
@ -1615,12 +1609,14 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
|
|||
ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
|
||||
ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
|
||||
ALLOC(bandE, st->mode->nbEBands*C, celt_ener);
|
||||
for (c=0;c<C;c++)
|
||||
c=0; do
|
||||
for (i=0;i<M*st->mode->eBands[st->start];i++)
|
||||
X[c*N+i] = 0;
|
||||
for (c=0;c<C;c++)
|
||||
while (++c<C);
|
||||
c=0; do
|
||||
for (i=M*st->mode->eBands[effEnd];i<N;i++)
|
||||
X[c*N+i] = 0;
|
||||
while (++c<C);
|
||||
|
||||
if (data == NULL)
|
||||
{
|
||||
|
@ -1731,12 +1727,14 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
|
|||
if (C==2)
|
||||
CELT_MOVE(decode_mem[1], decode_mem[1]+N, DECODE_BUFFER_SIZE-N);
|
||||
|
||||
for (c=0;c<C;c++)
|
||||
c=0; do
|
||||
for (i=0;i<M*st->mode->eBands[st->start];i++)
|
||||
freq[c*N+i] = 0;
|
||||
for (c=0;c<C;c++)
|
||||
while (++c<C);
|
||||
c=0; do
|
||||
for (i=M*st->mode->eBands[effEnd];i<N;i++)
|
||||
freq[c*N+i] = 0;
|
||||
while (++c<C);
|
||||
|
||||
out_syn[0] = out_mem[0]+MAX_PERIOD-N;
|
||||
if (C==2)
|
||||
|
@ -1746,13 +1744,12 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
|
|||
compute_inv_mdcts(st->mode, shortBlocks, freq, out_syn, overlap_mem, C, LM);
|
||||
|
||||
#ifdef ENABLE_POSTFILTER
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
comb_filter(out_syn[c], out_syn[c], st->postfilter_period, st->postfilter_period, st->overlap, C,
|
||||
st->postfilter_gain, st->postfilter_gain, NULL, 0);
|
||||
comb_filter(out_syn[c]+st->overlap, out_syn[c]+st->overlap, st->postfilter_period, postfilter_pitch, N-st->overlap, C,
|
||||
st->postfilter_gain, postfilter_gain, st->mode->window, st->mode->overlap);
|
||||
}
|
||||
} while (++c<C);
|
||||
st->postfilter_period = postfilter_pitch;
|
||||
st->postfilter_gain = postfilter_gain;
|
||||
#endif /* ENABLE_POSTFILTER */
|
||||
|
|
|
@ -74,14 +74,13 @@ static int intra_decision(const celt_word16 *eBands, celt_word16 *oldEBands, int
|
|||
{
|
||||
int c, i;
|
||||
celt_word32 dist = 0;
|
||||
for (c=0;c<C;c++)
|
||||
{
|
||||
c=0; do {
|
||||
for (i=start;i<end;i++)
|
||||
{
|
||||
celt_word16 d = SHR16(SUB16(eBands[i+c*len], oldEBands[i+c*len]),2);
|
||||
dist = MAC16_16(dist, d,d);
|
||||
}
|
||||
}
|
||||
} while (++c<C);
|
||||
return SHR32(dist,2*DB_SHIFT-4) > 2*C*(end-start);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue