single data transfer & load literal
This commit is contained in:
parent
09956c7b2e
commit
1440ebd702
@ -128,6 +128,53 @@ word dpr(a64inst_instruction cI) {
|
|||||||
return out;
|
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){
|
void secondPass(a64inst_instruction instrs[], int numInstrs, st* table){
|
||||||
//TODO:
|
//TODO:
|
||||||
// iterate over instructions again, this time replacing labels
|
// iterate over instructions again, this time replacing labels
|
||||||
@ -142,6 +189,12 @@ void secondPass(a64inst_instruction instrs[], int numInstrs, st* table){
|
|||||||
case a64inst_DPREGISTER:
|
case a64inst_DPREGISTER:
|
||||||
dpr(cI);
|
dpr(cI);
|
||||||
break;
|
break;
|
||||||
|
case a64inst_SINGLETRANSFER:
|
||||||
|
sts(cI);
|
||||||
|
break;
|
||||||
|
case a64inst_LOADLITERAL:
|
||||||
|
ldl(cI);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user