fix ldr parsing
This commit is contained in:
parent
19b98a3c51
commit
3838227a09
@ -175,13 +175,15 @@ word encodeSingleDataTransfer(a64inst_instruction inst) {
|
|||||||
return wrd;
|
return wrd;
|
||||||
}
|
}
|
||||||
|
|
||||||
word encodeLoadLiteral(a64inst_instruction cI) {
|
word encodeLoadLiteral(a64inst_instruction cI, int arrIndex, symbol_table *st) {
|
||||||
word wrd = 0;
|
word wrd = 0;
|
||||||
|
|
||||||
a64inst_SingleTransferData data = cI.data.SingleTransferData;
|
a64inst_SingleTransferData data = cI.data.SingleTransferData;
|
||||||
setBits(&wrd, 24, 32, 0x18);
|
setBits(&wrd, 24, 32, 0x18);
|
||||||
setBits(&wrd, 30, 31, data.regType);
|
setBits(&wrd, 30, 31, data.regType);
|
||||||
setBits(&wrd, 5, 24, data.processOpData.loadLiteralData.offset);
|
char *label = data.processOpData.loadLiteralData.label;
|
||||||
|
int offset = getLabelOffset(st, label, arrIndex, 19);
|
||||||
|
setBits(&wrd, 5, 24, offset);
|
||||||
setBits(&wrd, 0, 5, data.target);
|
setBits(&wrd, 0, 5, data.target);
|
||||||
|
|
||||||
return wrd;
|
return wrd;
|
||||||
@ -206,7 +208,7 @@ word *encode(a64inst_instruction insts[], int instCount, symbol_table* st) {
|
|||||||
index++;
|
index++;
|
||||||
break;
|
break;
|
||||||
case a64inst_LOADLITERAL:
|
case a64inst_LOADLITERAL:
|
||||||
arr[index] = encodeLoadLiteral(inst);
|
arr[index] = encodeLoadLiteral(inst, index, st);
|
||||||
index++;
|
index++;
|
||||||
break;
|
break;
|
||||||
case a64inst_DIRECTIVE:
|
case a64inst_DIRECTIVE:
|
||||||
|
|||||||
@ -275,7 +275,7 @@ void calculateAddressFormat(a64inst_instruction *instr, char *tokens[], int tok
|
|||||||
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 = getOperandNumber(operands[1]);
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]);
|
||||||
}
|
}
|
||||||
} else if(unsplitString[strlen(unsplitString)-1] == ']') {
|
} else if(unsplitString[strlen(unsplitString)-1] == ']' && operandCount == 2) {
|
||||||
// POST_INDEXED
|
// POST_INDEXED
|
||||||
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 = getOperandNumber(tokens[3]);
|
instr->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset = getOperandNumber(tokens[3]);
|
||||||
@ -311,7 +311,7 @@ void parseSingleTransfer(a64inst_instruction *instr, char *opcode, char *tokens[
|
|||||||
int offset = getOperandNumber(tokens[1]);
|
int offset = getOperandNumber(tokens[1]);
|
||||||
instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset;
|
instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset;
|
||||||
} else {
|
} else {
|
||||||
instr->data.SingleTransferData.processOpData.loadLiteralData.label = tokens[1];
|
instr->data.SingleTransferData.processOpData.loadLiteralData.label = tokens[2];
|
||||||
//offset is literal, use symbol table and calculate difference
|
//offset is literal, use symbol table and calculate difference
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user