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
include Makefile.macros
#EXAMPLES = sieve crc32 adpcm sha basicmath
EXAMPLES = crc32 basicmath
EXAMPLES = simple
#EXAMPLES = sha sieve
#EXAMPLES = sha
STARTADR = 0x10000214
......
......@@ -167,76 +167,3 @@ void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *st
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] = {
void adpcm_coder(short indata[], char outdata[], int len, struct adpcm_state *state) {
int valpred_43;
int index_42;
int valpred_41;
int index_40;
int delta_39;
int step_38;
int step_37;
int valpred_36;
uintptr_t ivtmp_30;
int index_38;
int delta_37;
int step_36;
int step_35;
int valpred_34;
uintptr_t ivtmp_28;
int bufferstep;
int outputbuffer;
int index;
......@@ -115,13 +115,13 @@ adpcm_coderbb_2:
adpcm_coderbb_3:
// # PRED: 2 [91.0%] (true,exec)
outp = outdata;
ivtmp_30 = 0;
ivtmp_28 = 0;
bufferstep = 1;
// # SUCC: 4 [100.0%] (fallthru,exec)
adpcm_coderbb_4:
// # 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)
goto adpcm_coderbb_5;
else
......@@ -164,8 +164,8 @@ adpcm_coderbb_7:
adpcm_coderbb_8:
// # PRED: 23 [100.0%] (fallthru) 7 [100.0%] (fallthru,exec)
step_37 = step >> 1;
if (diff >= step_37)
step_35 = step >> 1;
if (diff >= step_35)
goto adpcm_coderbb_9;
else
goto adpcm_coderbb_10;
......@@ -174,14 +174,14 @@ adpcm_coderbb_8:
adpcm_coderbb_9:
// # PRED: 8 [50.0%] (true,exec)
delta = delta | 2;
diff = diff - step_37;
vpdiff = vpdiff + step_37;
diff = diff - step_35;
vpdiff = vpdiff + step_35;
// # SUCC: 10 [100.0%] (fallthru,exec)
adpcm_coderbb_10:
// # PRED: 8 [50.0%] (false,exec) 9 [100.0%] (fallthru,exec)
step_38 = step_37 >> 1;
if (diff >= step_38)
step_36 = step_35 >> 1;
if (diff >= step_36)
goto adpcm_coderbb_11;
else
goto adpcm_coderbb_12;
......@@ -190,7 +190,7 @@ adpcm_coderbb_10:
adpcm_coderbb_11:
// # PRED: 10 [50.0%] (true,exec)
delta = delta | 1;
vpdiff = vpdiff + step_38;
vpdiff = vpdiff + step_36;
// # SUCC: 12 [100.0%] (fallthru,exec)
adpcm_coderbb_12:
......@@ -203,23 +203,23 @@ adpcm_coderbb_12:
adpcm_coderbb_13:
// # PRED: 12 [50.0%] (true,exec)
valpred_36 = valpred - vpdiff;
valpred_34 = valpred - vpdiff;
goto adpcm_coderbb_15;
// # SUCC: 15 [100.0%] (fallthru,exec)
adpcm_coderbb_14:
// # PRED: 12 [50.0%] (false,exec)
valpred_36 = vpdiff + valpred;
valpred_34 = vpdiff + valpred;
// # SUCC: 15 [100.0%] (fallthru,exec)
adpcm_coderbb_15:
// # PRED: 13 [100.0%] (fallthru,exec) 14 [100.0%] (fallthru,exec)
valpred_43 = (valpred_36>-32768)?valpred_36:-32768;
valpred = (valpred_43<32767)?valpred_43:32767;
delta_39 = delta | sign;
index_40 = indexTable[delta_39] + index;
index_42 = (index_40>0)?index_40:0;
index = (index_42<88)?index_42:88;
valpred_41 = (valpred_34>-32768)?valpred_34:-32768;
valpred = (valpred_41<32767)?valpred_41:32767;
delta_37 = delta | sign;
index_38 = indexTable[delta_37] + index;
index_40 = (index_38>0)?index_38:0;
index = (index_40<88)?index_40:88;
step = stepsizeTable[index];
if (bufferstep != 0)
goto adpcm_coderbb_16;
......@@ -229,13 +229,13 @@ adpcm_coderbb_15:
adpcm_coderbb_16:
// # PRED: 15 [50.0%] (true,exec)
outputbuffer = delta_39 << 4 & 255;
outputbuffer = delta_37 << 4 & 255;
goto adpcm_coderbb_18;
// # SUCC: 18 [100.0%] (fallthru,exec)
adpcm_coderbb_17:
// # 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;
// # SUCC: 18 [100.0%] (fallthru,exec)
......@@ -243,7 +243,7 @@ adpcm_coderbb_18:
// # PRED: 16 [100.0%] (fallthru,exec) 17 [100.0%] (fallthru,exec)
bufferstep = bufferstep == 0;
len = len + -1;
ivtmp_30 = ivtmp_30 + 2;
ivtmp_28 = ivtmp_28 + 2;
if (len != 0)
goto adpcm_coderbb_4;
else
......@@ -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 {
unsigned int k;
} m = { 1, 1 };
void sieve()
void sieve_func()
{
unsigned int sieve[N];
......@@ -51,6 +51,6 @@ void sieve()
int main(void)
{
sieve();
sieve_func();
return 0;
}
......@@ -21,7 +21,7 @@ struct test {
} m = { 1, 1 };
void sieve() {
void sieve_func() {
int j_76;
uintptr_t ivtmp_74;
int i_72;
......@@ -37,137 +37,137 @@ void sieve() {
int i;
unsigned int sieve[500000];
sievebb_2:
sieve_funcbb_2:
// # PRED: ENTRY [100.0%] (fallthru,exec)
ivtmp_68 = 0;
// # SUCC: 3 [100.0%] (fallthru,exec)
sievebb_3:
sieve_funcbb_3:
// # 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)&sieve + (uintptr_t)ivtmp_68) = 1;
ivtmp_68 = ivtmp_68 + 4;
if (ivtmp_68 != 2000000)
goto sievebb_3;
goto sieve_funcbb_3;
else
goto sievebb_17;
goto sieve_funcbb_17;
// # SUCC: 3 [99.0%] (true,exec) 17 [1.0%] (false,exec)
sievebb_17:
sieve_funcbb_17:
// # PRED: 3 [1.0%] (false,exec)
ivtmp_49 = 6;
ivtmp_58 = 4;
i_72 = 2;
// # SUCC: 4 [100.0%] (fallthru)
sievebb_4:
sieve_funcbb_4:
// # PRED: 7 [99.0%] (true,exec) 17 [100.0%] (fallthru)
D_2263 = (unsigned int) i_72;
if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2263 * 4) != 0)
goto sievebb_5;
goto sieve_funcbb_5;
else
goto sievebb_7;
goto sieve_funcbb_7;
// # SUCC: 5 [50.0%] (true,exec) 7 [50.0%] (false,exec)
sievebb_5:
sieve_funcbb_5:
// # PRED: 4 [50.0%] (true,exec)
j_76 = (int) ivtmp_58;
if (j_76 <= 499999)
goto sievebb_18;
goto sieve_funcbb_18;
else
goto sievebb_7;
goto sieve_funcbb_7;
// # SUCC: 18 [91.0%] (true,exec) 7 [9.0%] (false,exec)
sievebb_18:
sieve_funcbb_18:
// # PRED: 5 [91.0%] (true,exec)
ivtmp_74 = ivtmp_49;
// # SUCC: 6 [100.0%] (fallthru)
sievebb_6:
sieve_funcbb_6:
// # PRED: 6 [91.0%] (true,exec) 18 [100.0%] (fallthru)
sieve[j_76] = 0;
D_2252 = (unsigned int) j_76 + D_2263;
j_76 = (int) D_2252;
ivtmp_74 = D_2263 + ivtmp_74;
if ((int) (ivtmp_74 - D_2263) <= 499999)
goto sievebb_6;
goto sieve_funcbb_6;
else
goto sievebb_7;
goto sieve_funcbb_7;
// # 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)
i_72 = i_72 + 1;
ivtmp_58 = ivtmp_58 + 2;
ivtmp_49 = ivtmp_49 + 3;
if (i_72 * i_72 <= 499999)
goto sievebb_4;
goto sieve_funcbb_4;
else
goto sievebb_8;
goto sieve_funcbb_8;
// # SUCC: 4 [99.0%] (true,exec) 8 [1.0%] (false,exec)
sievebb_8:
sieve_funcbb_8:
// # PRED: 7 [1.0%] (false,exec)
j = 2;
i = 0;
// # SUCC: 9 [100.0%] (fallthru,exec)
sievebb_9:
sieve_funcbb_9:
// # PRED: 11 [99.0%] (true,exec) 8 [100.0%] (fallthru,exec)
D_2240 = (unsigned int) j;
if (*(unsigned int*)((uintptr_t)&sieve + (uintptr_t)D_2240 * 4) != 0)
goto sievebb_10;
goto sieve_funcbb_10;
else
goto sievebb_11;
goto sieve_funcbb_11;
// # SUCC: 10 [50.0%] (true,exec) 11 [50.0%] (false,exec)
sievebb_10:
sieve_funcbb_10:
// # PRED: 9 [50.0%] (true,exec)
results[i] = D_2240;
i = i + 1;
// # SUCC: 11 [100.0%] (fallthru,exec)
sievebb_11:
sieve_funcbb_11:
// # PRED: 9 [50.0%] (false,exec) 10 [100.0%] (fallthru,exec)
j = j + 1;
if (j != 500000)
goto sievebb_9;
goto sieve_funcbb_9;
else
goto sievebb_12;
goto sieve_funcbb_12;
// # SUCC: 9 [99.0%] (true,exec) 12 [1.0%] (false,exec)
sievebb_12:
sieve_funcbb_12:
// # PRED: 11 [1.0%] (false,exec)
if (results[0] == 0)
goto sievebb_16;
goto sieve_funcbb_16;
else
goto sievebb_13;
goto sieve_funcbb_13;
// # SUCC: 16 [4.5%] (true,exec) 13 [95.5%] (false,exec)
sievebb_13:
sieve_funcbb_13:
// # PRED: 12 [95.5%] (false,exec)
ivtmp_36 = (uintptr_t)&results;
D_2230 = ivtmp_36 + 1999996;
// # SUCC: 14 [100.0%] (fallthru,exec)
sievebb_14:
sieve_funcbb_14:
// # PRED: 15 [98.9%] (true,exec) 13 [100.0%] (fallthru,exec)
if (*(unsigned int*)((uintptr_t)ivtmp_36 + 4) == 0)
goto sievebb_16;
goto sieve_funcbb_16;
else
goto sievebb_15;
goto sieve_funcbb_15;
// # SUCC: 16 [4.5%] (true,exec) 15 [95.5%] (false,exec)
sievebb_15:
sieve_funcbb_15:
// # PRED: 14 [95.5%] (false,exec)
ivtmp_36 = ivtmp_36 + 4;
if (ivtmp_36 != D_2230)
goto sievebb_14;
goto sieve_funcbb_14;
else
goto sievebb_16;
goto sieve_funcbb_16;
// # 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)
m.v = 0;
return;
......@@ -180,7 +180,7 @@ sievebb_16:
int main(void) {
mainbb_2:
// # PRED: ENTRY [100.0%] (fallthru,exec)
sieve ();
sieve_func ();
return 0;
// # SUCC: EXIT [100.0%]
......
......@@ -64,6 +64,7 @@ class FunctionInitState:
self.name = name
self.initRegState = initRegState
# TODO: Probably need to change the name of this function
def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
(listISCFunctions, listObjdumpFunctions) = match_cfg(listISCFileNames,
......@@ -104,6 +105,12 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
logging.debug("\t %d: Instruction could not be emulated!" % lineNumObj)
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)
if m is not None:
branchToFunction = m.group("labelFunction")
......@@ -122,8 +129,21 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
initRegState))
continue
else:
logging.error("labelFunction in branch instruction could not be matched!")
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)
if m is not None:
for baseRegLabel in ["am2_1BaseReg",
......@@ -138,6 +158,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
baseReg = m.group(baseRegLabel)
baseRegVal = armEmu.reg[baseReg].value
destReg = m.group("destReg")
# Calculate store address based on addressing mode used.
if m.group("am2_2ImedOff") is not None:
strAdd = baseRegVal + int(m.group("am2_2ImedOff"))
elif m.group("am2_3OffsetReg") is not None:
......@@ -171,6 +192,22 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
logging.error(" %d: %s" % (lineNumObj, instObj))
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)
if m is not None:
for baseRegLabel in ["am2_1BaseReg",
......@@ -184,6 +221,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
break
baseReg = m.group(baseRegLabel)
destReg = m.group("destReg")
# PC Relative Load Instruction
if baseReg == "pc":
comment = m.group("comment")
m_comment = re.match("\s*([0-9a-f]*)\s*\<.*\>", comment)
......@@ -202,6 +240,7 @@ def instrumentCache(listISCFileNames, listObjdumpFileNames, listBinaryFileNames)
continue
else:
baseRegVal = armEmu.reg[baseReg].value
# Calculate load address based on addressing mode used.
if m.group("am2_2ImedOff") is not None:
ldrAdd = baseRegVal + int(m.group("am2_2ImedOff"))
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