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