fix ldr parsing
This commit is contained in:
parent
19b98a3c51
commit
3838227a09
@ -175,13 +175,15 @@ word encodeSingleDataTransfer(a64inst_instruction inst) {
|
||||
return wrd;
|
||||
}
|
||||
|
||||
word encodeLoadLiteral(a64inst_instruction cI) {
|
||||
word encodeLoadLiteral(a64inst_instruction cI, int arrIndex, symbol_table *st) {
|
||||
word wrd = 0;
|
||||
|
||||
a64inst_SingleTransferData data = cI.data.SingleTransferData;
|
||||
setBits(&wrd, 24, 32, 0x18);
|
||||
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);
|
||||
|
||||
return wrd;
|
||||
@ -206,7 +208,7 @@ word *encode(a64inst_instruction insts[], int instCount, symbol_table* st) {
|
||||
index++;
|
||||
break;
|
||||
case a64inst_LOADLITERAL:
|
||||
arr[index] = encodeLoadLiteral(inst);
|
||||
arr[index] = encodeLoadLiteral(inst, index, st);
|
||||
index++;
|
||||
break;
|
||||
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.a64inst_addressingModeData.offsetReg = getOperandNumber(operands[1]);
|
||||
}
|
||||
} else if(unsplitString[strlen(unsplitString)-1] == ']') {
|
||||
} else if(unsplitString[strlen(unsplitString)-1] == ']' && operandCount == 2) {
|
||||
// POST_INDEXED
|
||||
instr->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode = a64inst_POST_INDEXED;
|
||||
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]);
|
||||
instr->data.SingleTransferData.processOpData.loadLiteralData.offset = offset;
|
||||
} 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
|
||||
}
|
||||
break;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user