From 1440ebd702eaf7159f3014b638ff2f383176c44d Mon Sep 17 00:00:00 2001 From: GDBWNV <93523315+GDBWNV@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:34:14 +0100 Subject: [PATCH] single data transfer & load literal --- src/twopassassembly.c | 53 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/twopassassembly.c b/src/twopassassembly.c index 97944ab..7643223 100644 --- a/src/twopassassembly.c +++ b/src/twopassassembly.c @@ -128,6 +128,53 @@ word dpr(a64inst_instruction cI) { return out; } +word sts(a64inst_instruction cI) { + a64inst_SingleTransferData data = cI.data.SingleTransferData; + word out = 0; + a64inst_SingleDataTransferData data2 = data.processOpData.singleDataTransferData; + // this deals with every bit in the 31-23 range apart from sf and U + out += (512+128+64+32)*(2^23); + int sf = data.regType; + int u = 0; + int l = data2.transferType; + int offset = 0; + int xn = data2.base; + int rt = data.target; + switch (data2.addressingMode) { + // register offset + case 2: + offset += 2074 + 64*data2.a64inst_addressingModeData.offsetReg; + break; + // unsigned offset + case 3: + offset += data2.a64inst_addressingModeData.unsignedOffset; + u = 1; + break; + // pre/post indexed + default: + offset = 1 + data2.addressingMode*2 + data2.a64inst_addressingModeData.indexedOffset*4; + break; + } + out += sf*(2^30); + out += u*(2^22); + out += offset*1024; + out += xn * 32; + out += rt; + return out; +} + +word ldl(a64inst_instruction cI) { + word out = 3*(2^27); + a64inst_SingleTransferData data = cI.data.SingleTransferData; + int sf = data.regType; + int simm19 = data.processOpData.loadLiteralData.offset; + int rt = data.target; + out += sf * (2^30); + out += simm19*32; + out += rt; + return out; +} + void secondPass(a64inst_instruction instrs[], int numInstrs, st* table){ //TODO: // iterate over instructions again, this time replacing labels @@ -142,6 +189,12 @@ void secondPass(a64inst_instruction instrs[], int numInstrs, st* table){ case a64inst_DPREGISTER: dpr(cI); break; + case a64inst_SINGLETRANSFER: + sts(cI); + break; + case a64inst_LOADLITERAL: + ldl(cI); + break; default: break; }