build struct for loadstore instructions
This commit is contained in:
parent
344f455be3
commit
c52de918db
57
src/parser.c
57
src/parser.c
@ -34,34 +34,32 @@ int isOperandRegister(char regStartChar){
|
|||||||
|
|
||||||
//calculate offsets from string
|
//calculate offsets from string
|
||||||
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands){
|
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands){
|
||||||
char *endptr;
|
|
||||||
char baseRegParam[strlen(operandList[1])];
|
char baseRegParam[strlen(operandList[1])];
|
||||||
strcpy(baseRegParam, operandList[1]);
|
strcpy(baseRegParam, operandList[1]);
|
||||||
char *startptr = &baseRegParam[1];
|
char *startptr = &baseRegParam[1];
|
||||||
int base = getOperandNumber(startptr);
|
int base = getOperandNumber(startptr);
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = base;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.base = base;
|
||||||
|
|
||||||
if(operandList[2][strlen(operandList[2])-1] == '!'){
|
if(operandList[2][strlen(operandList[2])-2] == '!'){
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_PRE_INDEXED;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(&(operandList[2][1]), &endptr, 10);
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operandList[2]);
|
||||||
} else if(operandList[1][strlen(operandList[1])-1] == ']') {
|
} else if(operandList[1][strlen(operandList[1])-2] == ']') {
|
||||||
//post-indexed
|
//post-indexed
|
||||||
|
char immOffset[strlen(operandList[2])+1];
|
||||||
|
strcpy(immOffset, operandList[2]);
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = strtol(&(operandList[2][1]), &endptr, 10);
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(immOffset);
|
||||||
} else if( (isOperandRegister(operandList[1][0]) == 1)
|
} else if( (isOperandRegister(operandList[1][0]) == 1)
|
||||||
|| (isOperandRegister(operandList[2][0]) == 1)){
|
|| (isOperandRegister(operandList[2][0]) == 1)){
|
||||||
//register
|
//register
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_REGISTER_OFFSET;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = strtol(&(operandList[2][1]), &endptr, 10);
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operandList[2]);
|
||||||
} else {
|
} else {
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
||||||
if(numOperands==3){
|
if(numOperands==3){
|
||||||
int offset = strtol(&(operandList[2][1]), &endptr, 10);
|
int offset = getOperandNumber(operandList[2]);
|
||||||
if(instr->data.SingleTransferData.regType == 1){
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
|
//NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER
|
||||||
} else {
|
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,6 +77,19 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case a64inst_LOADLITERAL:
|
case a64inst_LOADLITERAL:
|
||||||
|
if(operandList[0][0] == 'x') {
|
||||||
|
instr->data.SingleTransferData.regType = 1;
|
||||||
|
} else {
|
||||||
|
instr->data.SingleTransferData.regType = 0;
|
||||||
|
}
|
||||||
|
instr->data.SingleTransferData.target = getOperandNumber(operandList[0]);
|
||||||
|
if(operandList[1][0] =='#'){
|
||||||
|
//offset is immediate
|
||||||
|
int offset = getOperandNumber(operandList[1]);
|
||||||
|
instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset;
|
||||||
|
} else {
|
||||||
|
//offset is literal, use symbol table and calculate difference
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -87,7 +98,6 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
|
|||||||
}
|
}
|
||||||
|
|
||||||
void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){
|
void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){
|
||||||
char *endptr;
|
|
||||||
switch(instr->data.BranchData.BranchType){
|
switch(instr->data.BranchData.BranchType){
|
||||||
case a64inst_UNCONDITIONAL:
|
case a64inst_UNCONDITIONAL:
|
||||||
//define and sign extend immediate offset
|
//define and sign extend immediate offset
|
||||||
@ -95,7 +105,7 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper
|
|||||||
printf("unconditional");
|
printf("unconditional");
|
||||||
break;
|
break;
|
||||||
case a64inst_REGISTER:
|
case a64inst_REGISTER:
|
||||||
instr->data.BranchData.processOpData.registerData.src = strtol(operandList[0] + 1, &endptr, 10);
|
instr->data.BranchData.processOpData.registerData.src = getOperandNumber(operandList[0]);
|
||||||
break;
|
break;
|
||||||
case a64inst_CONDITIONAL:
|
case a64inst_CONDITIONAL:
|
||||||
{
|
{
|
||||||
@ -138,10 +148,10 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
isRegister == 0 ||
|
isRegister == 0 ||
|
||||||
strncmp(opcode, "b.", 2) == 0){
|
strncmp(opcode, "b.", 2) == 0){
|
||||||
instr->type = a64inst_BRANCH;
|
instr->type = a64inst_BRANCH;
|
||||||
if(isUnconditional){
|
if(isRegister == 0){
|
||||||
instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL;
|
|
||||||
} else if (isRegister){
|
|
||||||
instr->data.BranchData.BranchType = a64inst_REGISTER;
|
instr->data.BranchData.BranchType = a64inst_REGISTER;
|
||||||
|
} else if (isUnconditional == 0){
|
||||||
|
instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL;
|
||||||
} else {
|
} else {
|
||||||
instr->data.BranchData.BranchType = a64inst_CONDITIONAL;
|
instr->data.BranchData.BranchType = a64inst_CONDITIONAL;
|
||||||
}
|
}
|
||||||
@ -152,19 +162,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
|||||||
instr->type = a64inst_SINGLETRANSFER;
|
instr->type = a64inst_SINGLETRANSFER;
|
||||||
instr->data.SingleTransferData.SingleTransferOpType = a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER;
|
instr->data.SingleTransferData.SingleTransferOpType = a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER;
|
||||||
if(isLoad == 0){
|
if(isLoad == 0){
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE;
|
|
||||||
} else {
|
|
||||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_LOAD;
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_LOAD;
|
||||||
|
} else {
|
||||||
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
instr->type = a64inst_LOADLITERAL;
|
instr->type = a64inst_LOADLITERAL;
|
||||||
if(operandList[0][0] =='#'){
|
|
||||||
//offset is immediate
|
|
||||||
int offset = getOperandNumber(operandList[0]);
|
|
||||||
instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset;
|
|
||||||
} else {
|
|
||||||
//offset is literal, use symbol table and calculate difference
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -190,7 +193,7 @@ void tokeniseOperands(char* str, int *operandCount, char *operands[], int *numOp
|
|||||||
operand = strtok(NULL, OPERAND_DELIMITER);
|
operand = strtok(NULL, OPERAND_DELIMITER);
|
||||||
operands[*(operandCount)] = operand;
|
operands[*(operandCount)] = operand;
|
||||||
}
|
}
|
||||||
*(numOperands) = *(operandCount)+1;
|
*(numOperands) = *(operandCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
//takes inputted assembly line and returns a
|
//takes inputted assembly line and returns a
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user