Commit d1325d17 authored by Gaurav Kukreja's avatar Gaurav Kukreja

Removed adpcm_decoder function and added comments in cacheSimInstrument.py

Signed-off-by: Gaurav Kukreja's avatarGaurav Kukreja <gaurav@gauravk.in>
parent 3f0257a7
...@@ -2,7 +2,7 @@ include ../Makefile.macros ...@@ -2,7 +2,7 @@ include ../Makefile.macros
include Makefile.macros include Makefile.macros
#EXAMPLES = sieve crc32 adpcm sha basicmath #EXAMPLES = sieve crc32 adpcm sha basicmath
EXAMPLES = crc32 basicmath EXAMPLES = simple
#EXAMPLES = sha sieve #EXAMPLES = sha sieve
#EXAMPLES = sha #EXAMPLES = sha
STARTADR = 0x10000214 STARTADR = 0x10000214
......
...@@ -167,76 +167,3 @@ void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *st ...@@ -167,76 +167,3 @@ void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *st
state->index = index; state->index = index;
} }
void adpcm_decoder(char indata[], short outdata[], int len, struct adpcm_state *state)
{
signed char *inp; /* Input buffer pointer */
short *outp; /* output buffer pointer */
int sign; /* Current adpcm sign bit */
int delta; /* Current adpcm output value */
int step; /* Stepsize */
int valpred; /* Predicted value */
int vpdiff; /* Current change to valpred */
int index; /* Current step change index */
int inputbuffer; /* place to keep next 4-bit value */
int bufferstep; /* toggle between inputbuffer/input */
outp = outdata;
inp = (signed char *)indata;
valpred = state->valprev;
index = state->index;
step = stepsizeTable[index];
bufferstep = 0;
for ( ; len > 0 ; len-- ) {
/* Step 1 - get the delta value */
if ( bufferstep ) {
delta = inputbuffer & 0xf;
} else {
inputbuffer = *inp++;
delta = (inputbuffer >> 4) & 0xf;
}
bufferstep = !bufferstep;
/* Step 2 - Find new index value (for later) */
index += indexTable[delta];
if ( index < 0 ) index = 0;
if ( index > 88 ) index = 88;
/* Step 3 - Separate sign and magnitude */
sign = delta & 8;
delta = delta & 7;
/* Step 4 - Compute difference and new predicted value */
/*
** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
** in adpcm_coder.
*/
vpdiff = step >> 3;
if ( delta & 4 ) vpdiff += step;
if ( delta & 2 ) vpdiff += step>>1;
if ( delta & 1 ) vpdiff += step>>2;
if ( sign )
valpred -= vpdiff;
else
valpred += vpdiff;
/* Step 5 - clamp output value */
if ( valpred > 32767 )
valpred = 32767;
else if ( valpred < -32768 )
valpred = -32768;
/* Step 6 - Update step value */
step = stepsizeTable[index];
/* Step 7 - Output value */
*outp++ = valpred;
}
state->valprev = valpred;
state->index = index;
}
...@@ -82,14 +82,14 @@ static int stepsizeTable[89] = { ...@@ -82,14 +82,14 @@ static int stepsizeTable[89] = {
void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *state) { void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *state) {
int valpred_43; int valpred_41;
int index_42;
int index_40; int index_40;
int delta_39; int index_38;
int step_38; int delta_37;
int step_37; int step_36;
int valpred_36; int step_35;
uintptr_t ivtmp_30; int valpred_34;
uintptr_t ivtmp_28;
int bufferstep; int bufferstep;
int outputbuffer; int outputbuffer;
int index; int index;
...@@ -115,13 +115,13 @@ adpcm_coderbb_2: ...@@ -115,13 +115,13 @@ adpcm_coderbb_2:
adpcm_coderbb_3: adpcm_coderbb_3:
// # PRED: 2 [91.0%] (true,exec) // # PRED: 2 [91.0%] (true,exec)
outp = outdata; outp = outdata;
ivtmp_30 = 0; ivtmp_28 = 0;
bufferstep = 1; bufferstep = 1;
// # SUCC: 4 [100.0%] (fallthru,exec) // # SUCC: 4 [100.0%] (fallthru,exec)
adpcm_coderbb_4: adpcm_coderbb_4:
// # PRED: 18 [91.0%] (true,exec) 3 [100.0%] (fallthru,exec) // # PRED: 18 [91.0%] (true,exec) 3 [100.0%] (fallthru,exec)
diff = (int) *(short int *)((uintptr_t)indata + (uintptr_t)ivtmp_30) - valpred; diff = (int) *(short int *)((uintptr_t)indata + (uintptr_t)ivtmp_28) - valpred;
if (diff < 0) if (diff < 0)
goto adpcm_coderbb_5; goto adpcm_coderbb_5;
else else
...@@ -164,8 +164,8 @@ adpcm_coderbb_7: ...@@ -164,8 +164,8 @@ adpcm_coderbb_7:
adpcm_coderbb_8: adpcm_coderbb_8:
// # PRED: 23 [100.0%] (fallthru) 7 [100.0%] (fallthru,exec) // # PRED: 23 [100.0%] (fallthru) 7 [100.0%] (fallthru,exec)
step_37 = step >> 1; step_35 = step >> 1;
if (diff >= step_37) if (diff >= step_35)
goto adpcm_coderbb_9; goto adpcm_coderbb_9;
else else
goto adpcm_coderbb_10; goto adpcm_coderbb_10;
...@@ -174,14 +174,14 @@ adpcm_coderbb_8: ...@@ -174,14 +174,14 @@ adpcm_coderbb_8:
adpcm_coderbb_9: adpcm_coderbb_9:
// # PRED: 8 [50.0%] (true,exec) // # PRED: 8 [50.0%] (true,exec)
delta = delta | 2; delta = delta | 2;
diff = diff - step_37; diff = diff - step_35;
vpdiff = vpdiff + step_37; vpdiff = vpdiff + step_35;
// # SUCC: 10 [100.0%] (fallthru,exec) // # SUCC: 10 [100.0%] (fallthru,exec)
adpcm_coderbb_10: adpcm_coderbb_10:
// # PRED: 8 [50.0%] (false,exec) 9 [100.0%] (fallthru,exec) // # PRED: 8 [50.0%] (false,exec) 9 [100.0%] (fallthru,exec)
step_38 = step_37 >> 1; step_36 = step_35 >> 1;
if (diff >= step_38) if (diff >= step_36)
goto adpcm_coderbb_11; goto adpcm_coderbb_11;
else else
goto adpcm_coderbb_12; goto adpcm_coderbb_12;
...@@ -190,7 +190,7 @@ adpcm_coderbb_10: ...@@ -190,7 +190,7 @@ adpcm_coderbb_10:
adpcm_coderbb_11: adpcm_coderbb_11:
// # PRED: 10 [50.0%] (true,exec) // # PRED: 10 [50.0%] (true,exec)
delta = delta | 1; delta = delta | 1;
vpdiff = vpdiff + step_38; vpdiff = vpdiff + step_36;
// # SUCC: 12 [100.0%] (fallthru,exec) // # SUCC: 12 [100.0%] (fallthru,exec)
adpcm_coderbb_12: adpcm_coderbb_12:
...@@ -203,23 +203,23 @@ adpcm_coderbb_12: ...@@ -203,23 +203,23 @@ adpcm_coderbb_12:
adpcm_coderbb_13: adpcm_coderbb_13:
// # PRED: 12 [50.0%] (true,exec) // # PRED: 12 [50.0%] (true,exec)
valpred_36 = valpred - vpdiff; valpred_34 = valpred - vpdiff;
goto adpcm_coderbb_15; goto adpcm_coderbb_15;
// # SUCC: 15 [100.0%] (fallthru,exec) // # SUCC: 15 [100.0%] (fallthru,exec)
adpcm_coderbb_14: adpcm_coderbb_14:
// # PRED: 12 [50.0%] (false,exec) // # PRED: 12 [50.0%] (false,exec)
valpred_36 = vpdiff + valpred; valpred_34 = vpdiff + valpred;
// # SUCC: 15 [100.0%] (fallthru,exec) // # SUCC: 15 [100.0%] (fallthru,exec)
adpcm_coderbb_15: adpcm_coderbb_15:
// # PRED: 13 [100.0%] (fallthru,exec) 14 [100.0%] (fallthru,exec) // # PRED: 13 [100.0%] (fallthru,exec) 14 [100.0%] (fallthru,exec)
valpred_43 = (valpred_36>-32768)?valpred_36:-32768; valpred_41 = (valpred_34>-32768)?valpred_34:-32768;
valpred = (valpred_43<32767)?valpred_43:32767; valpred = (valpred_41<32767)?valpred_41:32767;
delta_39 = delta | sign; delta_37 = delta | sign;
index_40 = indexTable[delta_39] + index; index_38 = indexTable[delta_37] + index;
index_42 = (index_40>0)?index_40:0; index_40 = (index_38>0)?index_38:0;
index = (index_42<88)?index_42:88; index = (index_40<88)?index_40:88;
step = stepsizeTable[index]; step = stepsizeTable[index];
if (bufferstep != 0) if (bufferstep != 0)
goto adpcm_coderbb_16; goto adpcm_coderbb_16;
...@@ -229,13 +229,13 @@ adpcm_coderbb_15: ...@@ -229,13 +229,13 @@ adpcm_coderbb_15:
adpcm_coderbb_16: adpcm_coderbb_16:
// # PRED: 15 [50.0%] (true,exec) // # PRED: 15 [50.0%] (true,exec)
outputbuffer = delta_39 << 4 & 255; outputbuffer = delta_37 << 4 & 255;
goto adpcm_coderbb_18; goto adpcm_coderbb_18;
// # SUCC: 18 [100.0%] (fallthru,exec) // # SUCC: 18 [100.0%] (fallthru,exec)
adpcm_coderbb_17: adpcm_coderbb_17:
// # PRED: 15 [50.0%] (false,exec) // # PRED: 15 [50.0%] (false,exec)
*outp = (signed char) delta_39 & 15 | (signed char) outputbuffer; *outp = (signed char) delta_37 & 15 | (signed char) outputbuffer;
outp = (uintptr_t)outp + 1; outp = (uintptr_t)outp + 1;
// # SUCC: 18 [100.0%] (fallthru,exec) // # SUCC: 18 [100.0%] (fallthru,exec)
...@@ -243,7 +243,7 @@ adpcm_coderbb_18: ...@@ -243,7 +243,7 @@ adpcm_coderbb_18:
// # PRED: 16 [100.0%] (fallthru,exec) 17 [100.0%] (fallthru,exec) // # PRED: 16 [100.0%] (fallthru,exec) 17 [100.0%] (fallthru,exec)
bufferstep = bufferstep == 0; bufferstep = bufferstep == 0;
len = len + -1; len = len + -1;
ivtmp_30 = ivtmp_30 + 2; ivtmp_28 = ivtmp_28 + 2;
if (len != 0) if (len != 0)
goto adpcm_coderbb_4; goto adpcm_coderbb_4;
else else
...@@ -273,152 +273,3 @@ adpcm_coderbb_21: ...@@ -273,152 +273,3 @@ adpcm_coderbb_21:
} }
void adpcm_decoder(char indata[], short int outdata[], int len, struct adpcm_state *state) {
int index_86;
int valpred_85;
int delta_83;
int index_82;
int valpred_81;
uintptr_t ivtmp_71;
int bufferstep;
int inputbuffer;
int index;
int vpdiff;
int valpred;
int step;
int delta;
signed char * inp;
adpcm_decoderbb_2:
// # PRED: ENTRY [100.0%] (fallthru,exec)
valpred_81 = state->valprev;
index = state->index;
step = stepsizeTable[index];
if (len > 0)
goto adpcm_decoderbb_3;
else
goto adpcm_decoderbb_18;
// # SUCC: 3 [91.0%] (true,exec) 18 [9.0%] (false,exec)
adpcm_decoderbb_3:
// # PRED: 2 [91.0%] (true,exec)
inp = indata;
ivtmp_71 = 0;
bufferstep = 0;
// # SUCC: 4 [100.0%] (fallthru,exec)
adpcm_decoderbb_4:
// # PRED: 17 [100.0%] (fallthru,dfs_back,exec) 3 [100.0%] (fallthru,exec)
if (bufferstep != 0)
goto adpcm_decoderbb_5;
else
goto adpcm_decoderbb_6;
// # SUCC: 5 [50.0%] (true,exec) 6 [50.0%] (false,exec)
adpcm_decoderbb_5:
// # PRED: 4 [50.0%] (true,exec)
delta = inputbuffer & 15;
goto adpcm_decoderbb_7;
// # SUCC: 7 [100.0%] (fallthru,exec)
adpcm_decoderbb_6:
// # PRED: 4 [50.0%] (false,exec)
inputbuffer = (int) *inp;
inp = (uintptr_t)inp + 1;
delta = inputbuffer >> 4 & 15;
// # SUCC: 7 [100.0%] (fallthru,exec)
adpcm_decoderbb_7:
// # PRED: 5 [100.0%] (fallthru,exec) 6 [100.0%] (fallthru,exec)
index_82 = indexTable[delta] + index;
index_86 = (index_82>0)?index_82:0;
index = (index_86<88)?index_86:88;
delta_83 = delta & 7;
vpdiff = step >> 3;
if (delta_83 & 4 != 0)
goto adpcm_decoderbb_8;
else
goto adpcm_decoderbb_9;
// # SUCC: 8 [50.0%] (true,exec) 9 [50.0%] (false,exec)
adpcm_decoderbb_8:
// # PRED: 7 [50.0%] (true,exec)
vpdiff = vpdiff + step;
// # SUCC: 9 [100.0%] (fallthru,exec)
adpcm_decoderbb_9:
// # PRED: 7 [50.0%] (false,exec) 8 [100.0%] (fallthru,exec)
if (delta_83 & 2 != 0)
goto adpcm_decoderbb_10;
else
goto adpcm_decoderbb_11;
// # SUCC: 10 [50.0%] (true,exec) 11 [50.0%] (false,exec)
adpcm_decoderbb_10:
// # PRED: 9 [50.0%] (true,exec)
vpdiff = vpdiff + (step >> 1);
// # SUCC: 11 [100.0%] (fallthru,exec)
adpcm_decoderbb_11:
// # PRED: 9 [50.0%] (false,exec) 10 [100.0%] (fallthru,exec)
if (delta_83 & 1 != 0)
goto adpcm_decoderbb_12;
else
goto adpcm_decoderbb_13;
// # SUCC: 12 [50.0%] (true,exec) 13 [50.0%] (false,exec)
adpcm_decoderbb_12:
// # PRED: 11 [50.0%] (true,exec)
vpdiff = vpdiff + (step >> 2);
// # SUCC: 13 [100.0%] (fallthru,exec)
adpcm_decoderbb_13:
// # PRED: 11 [50.0%] (false,exec) 12 [100.0%] (fallthru,exec)
if (delta & 8 != 0)
goto adpcm_decoderbb_14;
else
goto adpcm_decoderbb_15;
// # SUCC: 14 [50.0%] (true,exec) 15 [50.0%] (false,exec)
adpcm_decoderbb_14:
// # PRED: 13 [50.0%] (true,exec)
valpred = valpred_81 - vpdiff;
goto adpcm_decoderbb_16;
// # SUCC: 16 [100.0%] (fallthru,exec)
adpcm_decoderbb_15:
// # PRED: 13 [50.0%] (false,exec)
valpred = vpdiff + valpred_81;
// # SUCC: 16 [100.0%] (fallthru,exec)
adpcm_decoderbb_16:
// # PRED: 14 [100.0%] (fallthru,exec) 15 [100.0%] (fallthru,exec)
valpred_85 = (valpred>-32768)?valpred:-32768;
valpred_81 = (valpred_85<32767)?valpred_85:32767;
step = stepsizeTable[index];
*(short int *)((uintptr_t)outdata + (uintptr_t)ivtmp_71) = (short int) (short int) valpred_81;
len = len + -1;
ivtmp_71 = ivtmp_71 + 2;
if (len != 0)
goto adpcm_decoderbb_17;
else
goto adpcm_decoderbb_18;
// # SUCC: 17 [91.0%] (true,exec) 18 [9.0%] (false,exec)
adpcm_decoderbb_17:
// # PRED: 16 [91.0%] (true,exec)
bufferstep = bufferstep == 0;
goto adpcm_decoderbb_4;
// # SUCC: 4 [100.0%] (fallthru,dfs_back,exec)
adpcm_decoderbb_18:
// # PRED: 16 [9.0%] (false,exec) 2 [9.0%] (false,exec)
state->valprev = (short int) (short int) valpred_81;
state->index = (char) (char) index;
return;
// # SUCC: EXIT [100.0%]
}
...@@ -9,7 +9,7 @@ struct test { ...@@ -9,7 +9,7 @@ struct test {
unsigned int k; unsigned int k;
} m = { 1, 1 }; } m = { 1, 1 };
void sieve() void sieve_func()
{ {
unsigned int sieve[N]; unsigned int sieve[N];
...@@ -51,6 +51,6 @@ void sieve() ...@@ -51,6 +51,6 @@ void sieve()
int main(void) int main(void)
{ {
sieve(); sieve_func();
return 0; return 0;
} }
...@@ -21,7 +21,7 @@ struct test { ...@@ -21,7 +21,7 @@ struct test {
} m = { 1, 1 }; } m = { 1, 1 };
void sieve() { void sieve_func() {
int j_76; int j_76;
uintptr_t ivtmp_74; uintptr_t ivtmp_74;
int i_72; int i_72;
...@@ -37,137 +37,137 @@ void sieve() { ...@@ -37,137 +37,137 @@ void sieve() {
int i; int i;
unsigned int sieve[500000]; unsigned int sieve[500000];
sievebb_2: sieve_funcbb_2:
// # PRED: ENTRY [100.0%] (fallthru,exec) // # PRED: ENTRY [100.0%] (fallthru,exec)
ivtmp_68 = 0; ivtmp_68 = 0;
// # SUCC: 3 [100.0%] (fallthru,exec) // # SUCC: 3 [100.0%] (fallthru,exec)
sievebb_3: sieve_funcbb_3:
// # PRED: 3 [99.0%] (true,exec) 2 [100.0%] (fallthru,exec) // # PRED: 3 [99.0%] (true,exec) 2 [100.0%] (fallthru,exec)
*(unsigned int*)((uintptr_t)&results + (uintptr_t)ivtmp_68) = 0; *(unsigned int*)((uintptr_t)&results + (uintptr_t)ivtmp_68) = 0;
*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)ivtmp_68) = 1; *(unsigned int*)((uintptr_t)&sieve + (uintptr_t)ivtmp_68) = 1;
ivtmp_68 = ivtmp_68 + 4; ivtmp_68 = ivtmp_68 + 4;
if (ivtmp_68 != 2000000) if (ivtmp_68 != 2000000)
goto sievebb_3; goto sieve_funcbb_3;
else else
goto sievebb_17; goto sieve_funcbb_17;
// # SUCC: 3 [99.0%] (true,exec) 17 [1.0%] (false,exec) // # SUCC: 3 [99.0%] (true,exec) 17 [1.0%] (false,exec)
sievebb_17: sieve_funcbb_17:
// # PRED: 3 [1.0%] (false,exec) // # PRED: 3 [1.0%] (false,exec)
ivtmp_49 = 6; ivtmp_49 = 6;
ivtmp_58 = 4; ivtmp_58 = 4;
i_72 = 2; i_72 = 2;
// # SUCC: 4 [100.0%] (fallthru) // # SUCC: 4 [100.0%] (fallthru)
sievebb_4: sieve_funcbb_4:
// # PRED: 7 [99.0%] (true,exec) 17 [100.0%] (fallthru) // # PRED: 7 [99.0%] (true,exec) 17 [100.0%] (fallthru)
D_2263 = (unsigned int) i_72; D_2263 = (unsigned int) i_72;
if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2263 * 4) != 0) if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2263 * 4) != 0)
goto sievebb_5; goto sieve_funcbb_5;
else else
goto sievebb_7; goto sieve_funcbb_7;
// # SUCC: 5 [50.0%] (true,exec) 7 [50.0%] (false,exec) // # SUCC: 5 [50.0%] (true,exec) 7 [50.0%] (false,exec)
sievebb_5: sieve_funcbb_5:
// # PRED: 4 [50.0%] (true,exec) // # PRED: 4 [50.0%] (true,exec)
j_76 = (int) ivtmp_58; j_76 = (int) ivtmp_58;
if (j_76 <= 499999) if (j_76 <= 499999)
goto sievebb_18; goto sieve_funcbb_18;
else else
goto sievebb_7; goto sieve_funcbb_7;
// # SUCC: 18 [91.0%] (true,exec) 7 [9.0%] (false,exec) // # SUCC: 18 [91.0%] (true,exec) 7 [9.0%] (false,exec)
sievebb_18: sieve_funcbb_18:
// # PRED: 5 [91.0%] (true,exec) // # PRED: 5 [91.0%] (true,exec)
ivtmp_74 = ivtmp_49; ivtmp_74 = ivtmp_49;
// # SUCC: 6 [100.0%] (fallthru) // # SUCC: 6 [100.0%] (fallthru)
sievebb_6: sieve_funcbb_6:
// # PRED: 6 [91.0%] (true,exec) 18 [100.0%] (fallthru) // # PRED: 6 [91.0%] (true,exec) 18 [100.0%] (fallthru)
sieve[j_76] = 0; sieve[j_76] = 0;
D_2252 = (unsigned int) j_76 + D_2263; D_2252 = (unsigned int) j_76 + D_2263;
j_76 = (int) D_2252; j_76 = (int) D_2252;
ivtmp_74 = D_2263 + ivtmp_74; ivtmp_74 = D_2263 + ivtmp_74;
if ((int) (ivtmp_74 - D_2263) <= 499999) if ((int) (ivtmp_74 - D_2263) <= 499999)
goto sievebb_6; goto sieve_funcbb_6;
else else
goto sievebb_7; goto sieve_funcbb_7;
// # SUCC: 6 [91.0%] (true,exec) 7 [9.0%] (false,exec) // # SUCC: 6 [91.0%] (true,exec) 7 [9.0%] (false,exec)
sievebb_7: sieve_funcbb_7:
// # PRED: 4 [50.0%] (false,exec) 6 [9.0%] (false,exec) 5 [9.0%] (false,exec) // # PRED: 4 [50.0%] (false,exec) 6 [9.0%] (false,exec) 5 [9.0%] (false,exec)
i_72 = i_72 + 1; i_72 = i_72 + 1;
ivtmp_58 = ivtmp_58 + 2; ivtmp_58 = ivtmp_58 + 2;
ivtmp_49 = ivtmp_49 + 3; ivtmp_49 = ivtmp_49 + 3;
if (i_72 * i_72 <= 499999) if (i_72 * i_72 <= 499999)
goto sievebb_4; goto sieve_funcbb_4;
else else
goto sievebb_8; goto sieve_funcbb_8;
// # SUCC: 4 [99.0%] (true,exec) 8 [1.0%] (false,exec) // # SUCC: 4 [99.0%] (true,exec) 8 [1.0%] (false,exec)
sievebb_8: sieve_funcbb_8:
// # PRED: 7 [1.0%] (false,exec) // # PRED: 7 [1.0%] (false,exec)
j = 2; j = 2;
i = 0; i = 0;
// # SUCC: 9 [100.0%] (fallthru,exec) // # SUCC: 9 [100.0%] (fallthru,exec)
sievebb_9: sieve_funcbb_9:
// # PRED: 11 [99.0%] (true,exec) 8 [100.0%] (fallthru,exec) // # PRED: 11 [99.0%] (true,exec) 8 [100.0%] (fallthru,exec)
D_2240 = (unsigned int) j; D_2240 = (unsigned int) j;
if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2240 * 4) != 0) if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2240 * 4) != 0)
goto sievebb_10; goto sieve_funcbb_10;
else else
goto sievebb_11; goto sieve_funcbb_11;
// # SUCC: 10 [50.0%] (true,exec) 11 [50.0%] (false,exec) // # SUCC: 10 [50.0%] (true,exec) 11 [50.0%] (false,exec)
sievebb_10: sieve_funcbb_10:
// # PRED: 9 [50.0%] (true,exec) // # PRED: 9 [50.0%] (true,exec)
results[i] = D_2240; results[i] = D_2240;
i = i + 1; i = i + 1;
// # SUCC: 11 [100.0%] (fallthru,exec) // # SUCC: 11 [100.0%] (fallthru,exec)
sievebb_11: sieve_funcbb_11:
// # PRED: 9 [50.0%] (false,exec) 10 [100.0%] (fallthru,exec) // # PRED: 9 [50.0%] (false,exec) 10 [100.0%] (fallthru,exec)
j = j + 1; j = j + 1;
if (j != 500000) if (j != 500000)
goto sievebb_9; goto sieve_funcbb_9;
else else
goto sievebb_12; goto sieve_funcbb_12;
// # SUCC: 9 [99.0%] (true,exec) 12 [1.0%] (false,exec) // # SUCC: 9 [99.0%] (true,exec) 12 [1.0%] (false,exec)
sievebb_12: sieve_funcbb_12:
// # PRED: 11 [1.0%] (false,exec) // # PRED: 11 [1.0%] (false,exec)
if (results[0] == 0) if (results[0] == 0)
goto sievebb_16; goto sieve_funcbb_16;
else else
goto sievebb_13; goto sieve_funcbb_13;
// # SUCC: 16 [4.5%] (true,exec) 13 [95.5%] (false,exec) // # SUCC: 16 [4.5%] (true,exec) 13 [95.5%] (false,exec)
sievebb_13: sieve_funcbb_13:
// # PRED: 12 [95.5%] (false,exec) // # PRED: 12 [95.5%] (false,exec)
ivtmp_36 = (uintptr_t)&results; ivtmp_36 = (uintptr_t)&results;
D_2230 = ivtmp_36 + 1999996; D_2230 = ivtmp_36 + 1999996;
// # SUCC: 14 [100.0%] (fallthru,exec) // # SUCC: 14 [100.0%] (fallthru,exec)
sievebb_14: sieve_funcbb_14:
// # PRED: 15 [98.9%] (true,exec) 13 [100.0%] (fallthru,exec) // # PRED: 15 [98.9%] (true,exec) 13 [100.0%] (fallthru,exec)
if (*(unsigned int*)((uintptr_t)ivtmp_36 + 4) == 0) if (*(unsigned int*)((uintptr_t)ivtmp_36 + 4) == 0)
goto sievebb_16; goto sieve_funcbb_16;
else else
goto sievebb_15; goto sieve_funcbb_15;
// # SUCC: 16 [4.5%] (true,exec) 15 [95.5%] (false,exec) // # SUCC: 16 [4.5%] (true,exec) 15 [95.5%] (false,exec)
sievebb_15: sieve_funcbb_15:
// # PRED: 14 [95.5%] (false,exec) // # PRED: 14 [95.5%] (false,exec)
ivtmp_36 = ivtmp_36 + 4; ivtmp_36 = ivtmp_36 + 4;
if (ivtmp_36 != D_2230) if (ivtmp_36 != D_2230)
goto sievebb_14; goto sieve_funcbb_14;
else else
goto sievebb_16; goto sieve_funcbb_16;
// # SUCC: 14 [98.9%] (true,exec) 16 [1.1%] (false,exec) // # SUCC: 14 [98.9%] (true,exec) 16 [1.1%] (false,exec)
sievebb_16: sieve_funcbb_16:
// # PRED: 14 [4.5%] (true,exec) 15 [1.1%] (false,exec) 12 [4.5%] (true,exec) // # PRED: 14 [4.5%] (true,exec) 15 [1.1%] (false,exec) 12 [4.5%] (true,exec)
m.v = 0; m.v = 0;
return; return;
...@@ -180,7 +180,7 @@ sievebb_16: ...@@ -180,7 +180,7 @@ sievebb_16:
int main(void) { int main(void) {
mainbb_2: mainbb_2:
// # PRED: ENTRY [100.0%] (fallthru,exec) // # PRED: ENTRY [100.0%] (fallthru,exec)
sieve (); sieve_func ();
return 0; return 0;
// # SUCC: EXIT [100.0%] // # SUCC: EXIT [100.0%]
......
...@@ -64,6 +64,7 @@ class FunctionInitState: ...@@ -64,6 +64,7 @@ class FunctionInitState:
self.name = name self.name = name
self.initRegState = initRegState self.initRegState = initRegState
# TODO: Probably need to change the name of this function
def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames): def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
(listISCFunctions, listObjdumpFunctions) = match_cfg(listISCFileNames, (listISCFunctions, listObjdumpFunctions) = match_cfg(listISCFileNames,
...@@ -104,6 +105,12 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -104,6 +105,12 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
logging.debug("\t %d: Instruction could not be emulated!" % lineNumObj) logging.debug("\t %d: Instruction could not be emulated!" % lineNumObj)
return -1 return -1
'''
Branch Instruction
- If branch is to another function, add the called function to
queue of pending functions.
- Ignore all other branch instructions.
'''
m = re_branchInst.match(instObj) m = re_branchInst.match(instObj)
if m is not None: if m is not None:
branchToFunction = m.group("labelFunction") branchToFunction = m.group("labelFunction")
...@@ -122,8 +129,21 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -122,8 +129,21 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
initRegState)) initRegState))
continue continue
else: else:
logging.error("labelFunction in branch instruction could not be matched!")
continue continue
'''
Store Instruction
- Calculate the address in the store instruction.
- If the address is in Stack,
- Writing to a local variable. Look up the list of local
variables, and find which one.
- Spilling Registers. Keep a dictionary mapping address
(relative to SP) and the content of the spilled register
- If address not in stack, it could be accessing Global
Variable. Look up table of Global Variables, and if no match
found, report error.
'''
m = re_storeInst.match(instObj) m = re_storeInst.match(instObj)
if m is not None: if m is not None:
for baseRegLabel in ["am2_1BaseReg", for baseRegLabel in ["am2_1BaseReg",
...@@ -138,6 +158,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -138,6 +158,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
baseReg = m.group(baseRegLabel) baseReg = m.group(baseRegLabel)
baseRegVal = armEmu.reg[baseReg].value baseRegVal = armEmu.reg[baseReg].value
destReg = m.group("destReg") destReg = m.group("destReg")
# Calculate store address based on addressing mode used.
if m.group("am2_2ImedOff") is not None: if m.group("am2_2ImedOff") is not None:
strAdd = baseRegVal + int(m.group("am2_2ImedOff")) strAdd = baseRegVal + int(m.group("am2_2ImedOff"))
elif m.group("am2_3OffsetReg") is not None: elif m.group("am2_3OffsetReg") is not None:
...@@ -171,6 +192,22 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -171,6 +192,22 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
logging.error(" %d: %s" % (lineNumObj, instObj)) logging.error(" %d: %s" % (lineNumObj, instObj))
continue continue
'''
Load Instruction
- If the base address is PC,
- PC Relative Load instruction is used for Global Variables
or Values more than 32 bit long. Check if the value
loaded matches with address of a global variable.
- If base address is not PC, calculate the address to be
be loaded from. If the address is in stack, it may be
- trying to load a local variable. Match the address to
a local variable.
- reading from a spilled register. Fetch the value of
the spilled register stored at the address.
- If the address is not in stack, it must be trying to load
content of a global variable. Match the address to a global
variable. If matching is not found, report error.
'''
m = re_loadInst.match(instObj) m = re_loadInst.match(instObj)
if m is not None: if m is not None:
for baseRegLabel in ["am2_1BaseReg", for baseRegLabel in ["am2_1BaseReg",
...@@ -184,6 +221,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -184,6 +221,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
break break
baseReg = m.group(baseRegLabel) baseReg = m.group(baseRegLabel)
destReg = m.group("destReg") destReg = m.group("destReg")
# PC Relative Load Instruction
if baseReg == "pc": if baseReg == "pc":
comment = m.group("comment") comment = m.group("comment")
m_comment = re.match("\s*([0-9a-f]*)\s*\<.*\>", comment) m_comment = re.match("\s*([0-9a-f]*)\s*\<.*\>", comment)
...@@ -202,6 +240,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames) ...@@ -202,6 +240,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
continue continue
else: else:
baseRegVal = armEmu.reg[baseReg].value baseRegVal = armEmu.reg[baseReg].value
# Calculate load address based on addressing mode used.
if m.group("am2_2ImedOff") is not None: if m.group("am2_2ImedOff") is not None:
ldrAdd = baseRegVal + int(m.group("am2_2ImedOff")) ldrAdd = baseRegVal + int(m.group("am2_2ImedOff"))
elif m.group("am2_3OffsetReg") is not None: elif m.group("am2_3OffsetReg") is not None:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment