build struct for loadstore instructions

This commit is contained in:
EDiasAlberto 2024-06-12 20:22:08 +01:00
parent 344f455be3
commit c52de918db

View File

@ -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