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
|
||||
void calcluateAddressFormat(a64inst_instruction *instr, char *operandList[], int numOperands){
|
||||
char *endptr;
|
||||
char baseRegParam[strlen(operandList[1])];
|
||||
strcpy(baseRegParam, operandList[1]);
|
||||
char *startptr = &baseRegParam[1];
|
||||
int base = getOperandNumber(startptr);
|
||||
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.a64inst_addressingModeData.indexedOffset = strtol(&(operandList[2][1]), &endptr, 10);
|
||||
} else if(operandList[1][strlen(operandList[1])-1] == ']') {
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(operandList[2]);
|
||||
} else if(operandList[1][strlen(operandList[1])-2] == ']') {
|
||||
//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.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)
|
||||
|| (isOperandRegister(operandList[2][0]) == 1)){
|
||||
//register
|
||||
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 {
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_UNSIGNED_OFFSET;
|
||||
if(numOperands==3){
|
||||
int offset = strtol(&(operandList[2][1]), &endptr, 10);
|
||||
if(instr->data.SingleTransferData.regType == 1){
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
|
||||
} else {
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/4;
|
||||
}
|
||||
int offset = getOperandNumber(operandList[2]);
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.unsignedOffset = offset/8;
|
||||
//NEED TO SCALE IMMEDIATE VALUE BASED ON REGISTER TYPE IN ASSEMBLER
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -79,6 +77,19 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
|
||||
break;
|
||||
}
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
@ -87,7 +98,6 @@ void generateLoadStoreOperands(a64inst_instruction *instr, char *opcode, char *o
|
||||
}
|
||||
|
||||
void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *operandList[]){
|
||||
char *endptr;
|
||||
switch(instr->data.BranchData.BranchType){
|
||||
case a64inst_UNCONDITIONAL:
|
||||
//define and sign extend immediate offset
|
||||
@ -95,7 +105,7 @@ void generateBranchOperands(a64inst_instruction *instr, char* opcode, char *oper
|
||||
printf("unconditional");
|
||||
break;
|
||||
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;
|
||||
case a64inst_CONDITIONAL:
|
||||
{
|
||||
@ -138,10 +148,10 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
||||
isRegister == 0 ||
|
||||
strncmp(opcode, "b.", 2) == 0){
|
||||
instr->type = a64inst_BRANCH;
|
||||
if(isUnconditional){
|
||||
instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL;
|
||||
} else if (isRegister){
|
||||
if(isRegister == 0){
|
||||
instr->data.BranchData.BranchType = a64inst_REGISTER;
|
||||
} else if (isUnconditional == 0){
|
||||
instr->data.BranchData.BranchType = a64inst_UNCONDITIONAL;
|
||||
} else {
|
||||
instr->data.BranchData.BranchType = a64inst_CONDITIONAL;
|
||||
}
|
||||
@ -152,19 +162,12 @@ void classifyOpcode(char* opcode, a64inst_instruction *instr, char *operandList[
|
||||
instr->type = a64inst_SINGLETRANSFER;
|
||||
instr->data.SingleTransferData.SingleTransferOpType = a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER;
|
||||
if(isLoad == 0){
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE;
|
||||
} else {
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_LOAD;
|
||||
} else {
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.transferType = a64inst_STORE;
|
||||
}
|
||||
} else {
|
||||
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 {
|
||||
@ -190,7 +193,7 @@ void tokeniseOperands(char* str, int *operandCount, char *operands[], int *numOp
|
||||
operand = strtok(NULL, OPERAND_DELIMITER);
|
||||
operands[*(operandCount)] = operand;
|
||||
}
|
||||
*(numOperands) = *(operandCount)+1;
|
||||
*(numOperands) = *(operandCount);
|
||||
}
|
||||
|
||||
//takes inputted assembly line and returns a
|
||||
|
||||
Loading…
Reference in New Issue
Block a user