generate branch struct from operands (INCOMPLETE)
This commit is contained in:
parent
6177b2f748
commit
b93ab76b82
34
src/parser.c
34
src/parser.c
@ -14,6 +14,39 @@
|
|||||||
// - count operands and match type/values
|
// - count operands and match type/values
|
||||||
// - generate final a64inst and return
|
// - generate final a64inst and return
|
||||||
|
|
||||||
|
void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){
|
||||||
|
switch(instr->data.BranchType){
|
||||||
|
case a64inst_UNCONDITIONAL:
|
||||||
|
//define and sign extend immediate offset
|
||||||
|
//use symbol table
|
||||||
|
break;
|
||||||
|
case a64inst_REGISTER:
|
||||||
|
char *endptr;
|
||||||
|
instr->data.BranchData.processOpData.src = strtol(operandList[0] + 1, endptr, 2)
|
||||||
|
break;
|
||||||
|
case a64inst_CONDITIONAL:
|
||||||
|
char* condition = strtok(strdup(opcode), "b.");
|
||||||
|
condition = strtok(NULL, "");
|
||||||
|
if(strcmp(condition, "eq")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = EQ;
|
||||||
|
} else if (strcmp(condition, "ne")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = NE;
|
||||||
|
} else if (strcmp(condition, "ge")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = GE;
|
||||||
|
} else if (strcmp(condition, "lt")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = LT;
|
||||||
|
} else if (strcmp(condition, "gt")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = GT;
|
||||||
|
} else if (strcmp(condition, "le")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = LE;
|
||||||
|
} else if (srtcmp(condition, "al")==0){
|
||||||
|
instr->data.BranchData.processOpData.cond = AL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//calculate offset from symbol table.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[]){
|
void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[]){
|
||||||
if((int isUnconditional = strcmp(opcode, "b")) == 0 ||
|
if((int isUnconditional = strcmp(opcode, "b")) == 0 ||
|
||||||
(int isRegister = strcmp(opcode, "br")) == 0 ||
|
(int isRegister = strcmp(opcode, "br")) == 0 ||
|
||||||
@ -27,6 +60,7 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
instr->data.BranchData.BranchType = a64inst_CONDITIONAL;
|
instr->data.BranchData.BranchType = a64inst_CONDITIONAL;
|
||||||
//instr->data.branchData.processOpData.cond = {remove first two chars of opcode}
|
//instr->data.branchData.processOpData.cond = {remove first two chars of opcode}
|
||||||
}
|
}
|
||||||
|
generateBranchOperands(instr, opcode, operandList);
|
||||||
} else if((int isLoad = strcmp(opcode, "ldr")) == 0 || (int isStore = strcmp(opcode, "str")) == 0){
|
} else if((int isLoad = strcmp(opcode, "ldr")) == 0 || (int isStore = strcmp(opcode, "str")) == 0){
|
||||||
//loading/storing instruction; classify operands
|
//loading/storing instruction; classify operands
|
||||||
char *address = operandList[1];
|
char *address = operandList[1];
|
||||||
|
|||||||
@ -13,7 +13,7 @@ void generateSymbolTable(a64inst_instruction instrs[], int numInstrs){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
word assembleBranch(a64inst_instruction *instr, int ){
|
word assembleBranch(a64inst_instruction *instr){
|
||||||
word binInstr = 0;
|
word binInstr = 0;
|
||||||
binInstr += (5^28); //101 start of branch instr
|
binInstr += (5^28); //101 start of branch instr
|
||||||
switch (instr->data.BranchData.BranchType)
|
switch (instr->data.BranchData.BranchType)
|
||||||
@ -41,6 +41,7 @@ word assembleBranch(a64inst_instruction *instr, int ){
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return binInstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void firstPass(a64inst_instruction instrs[], int numInstrs){
|
void firstPass(a64inst_instruction instrs[], int numInstrs){
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user