mirror of
https://github.com/RKX1209/nsemu.git
synced 2024-06-23 14:43:16 -04:00
Fixed 64bit variant detection bug for load/store
This commit is contained in:
parent
d5ff88f6be
commit
a5d8832222
|
@ -753,7 +753,6 @@ static void DisasLdstRegRoffset(uint32_t insn, DisasCallback *cb,
|
|||
bool is_signed = false;
|
||||
bool is_store = false;
|
||||
bool is_extended = false;
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
|
||||
if (extract32(opt, 1, 1) == 0) {
|
||||
UnallocatedOp (insn);
|
||||
|
@ -775,6 +774,7 @@ static void DisasLdstRegRoffset(uint32_t insn, DisasCallback *cb,
|
|||
is_signed = extract32(opc, 1, 1);
|
||||
is_extended = (size < 3) && extract32(opc, 0, 1);
|
||||
}
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
cb->ExtendReg (rm, rm, opt, sf);
|
||||
cb->ShiftReg (rm, rm, ShiftType_LSL, shift ? size : 0, sf);
|
||||
if (is_store) {
|
||||
|
@ -804,7 +804,6 @@ static void DisasLdstRegImm9(uint32_t insn, DisasCallback *cb,
|
|||
bool iss_valid = !is_vector;
|
||||
bool post_index;
|
||||
bool writeback;
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
|
||||
if (is_vector) {
|
||||
UnsupportedOp ("LDR/STR [base, #imm9] (SIMD&FP)");
|
||||
|
@ -825,7 +824,7 @@ static void DisasLdstRegImm9(uint32_t insn, DisasCallback *cb,
|
|||
is_signed = extract32(opc, 1, 1);
|
||||
is_extended = (size < 3) && extract32(opc, 0, 1);
|
||||
}
|
||||
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
switch (idx) {
|
||||
case 0:
|
||||
case 2:
|
||||
|
@ -862,7 +861,6 @@ static void DisasLdstRegUnsignedImm(uint32_t insn, DisasCallback *cb,
|
|||
bool is_store;
|
||||
bool is_signed = false;
|
||||
bool is_extended = false;
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
|
||||
if (is_vector) {
|
||||
UnsupportedOp ("LDR/STR [base, #simm12] (SIMD&FP)");
|
||||
|
@ -879,6 +877,7 @@ static void DisasLdstRegUnsignedImm(uint32_t insn, DisasCallback *cb,
|
|||
is_signed = extract32(opc, 1, 1);
|
||||
is_extended = (size < 3) && extract32(opc, 0, 1);
|
||||
}
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
offset = imm12 << size;
|
||||
if (is_store) {
|
||||
cb->StoreRegImm64 (rt, rn, offset, size, is_extended, false, false, sf);
|
||||
|
@ -936,7 +935,6 @@ static void DisasLdstPair(uint32_t insn, DisasCallback *cb) {
|
|||
bool writeback = false;
|
||||
|
||||
int size;
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
|
||||
if (opc == 3) {
|
||||
UnallocatedOp (insn);
|
||||
|
@ -954,6 +952,8 @@ static void DisasLdstPair(uint32_t insn, DisasCallback *cb) {
|
|||
}
|
||||
}
|
||||
|
||||
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
|
||||
|
||||
switch (index) {
|
||||
case 0:
|
||||
if (is_signed) {
|
||||
|
|
|
@ -334,6 +334,8 @@ void IntprCallback::BicReg(unsigned int rd_idx, unsigned int rn_idx, unsigned in
|
|||
ArithmeticLogic (rd_idx, W(rn_idx), ~W(rm_idx), false, bit64, AL_TYPE_AND);
|
||||
}
|
||||
void IntprCallback::NotReg(unsigned int rd_idx, unsigned int rm_idx, bool bit64) {
|
||||
char regc = bit64? 'X': 'W';
|
||||
debug_print ("NOT: %c[%u] = ~%c[%u]\n", regc, rd_idx, regc, rm_idx);
|
||||
if (bit64)
|
||||
X(rd_idx) = ~X(rm_idx);
|
||||
else
|
||||
|
@ -347,7 +349,7 @@ void IntprCallback::ExtendReg(unsigned int rd_idx, unsigned int rn_idx, unsigned
|
|||
static void _LoadReg(unsigned int rd_idx, uint64_t addr, int size, bool extend, bool bit64) {
|
||||
if (bit64) {
|
||||
if (size == 4)
|
||||
X(rd_idx) = ARMv8::ReadU32 (addr);
|
||||
W(rd_idx) = ARMv8::ReadU32 (addr);
|
||||
if (size == 8)
|
||||
X(rd_idx) = ARMv8::ReadU64 (addr);
|
||||
/* TODO: if (extend)
|
||||
|
@ -378,6 +380,8 @@ static void _StoreReg(unsigned int rd_idx, uint64_t addr, int size, bool extend,
|
|||
|
||||
void IntprCallback::LoadReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size,
|
||||
bool extend, bool post, bool writeback, bool bit64) {
|
||||
char regc = bit64? 'X': 'W';
|
||||
debug_print ("Load(%d): %c[%u] <= [%c[%u], %c[%u]]\n", size, regc, rd_idx, regc, base_idx, regc, rm_idx);
|
||||
uint64_t addr;
|
||||
if (bit64) {
|
||||
if (post)
|
||||
|
@ -399,6 +403,8 @@ void IntprCallback::LoadReg(unsigned int rd_idx, unsigned int base_idx, unsigned
|
|||
}
|
||||
void IntprCallback::LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size,
|
||||
bool extend, bool post, bool writeback, bool bit64) {
|
||||
char regc = bit64? 'X': 'W';
|
||||
debug_print ("Load(%d): %c[%u] <= [%c[%u], 0x%16lx]\n", size, regc, rd_idx, regc, base_idx, offset);
|
||||
uint64_t addr;
|
||||
if (bit64) {
|
||||
if (post)
|
||||
|
@ -420,6 +426,8 @@ void IntprCallback::LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uin
|
|||
}
|
||||
void IntprCallback::StoreReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size,
|
||||
bool extend, bool post, bool writeback, bool bit64) {
|
||||
char regc = bit64? 'X': 'W';
|
||||
debug_print ("Store(%d): %c[%u] => [%c[%u], %c[%u]]\n", size, regc, rd_idx, regc, base_idx, regc, rm_idx);
|
||||
uint64_t addr;
|
||||
if (bit64) {
|
||||
if (post)
|
||||
|
@ -441,6 +449,8 @@ void IntprCallback::StoreReg(unsigned int rd_idx, unsigned int base_idx, unsigne
|
|||
}
|
||||
void IntprCallback::StoreRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size,
|
||||
bool extend, bool post, bool writeback, bool bit64) {
|
||||
char regc = bit64? 'X': 'W';
|
||||
debug_print ("Store(%d): %c[%u] => [%c[%u], 0x%16lx]\n", size, regc, rd_idx, regc, base_idx, offset);
|
||||
uint64_t addr;
|
||||
if (bit64) {
|
||||
if (post)
|
||||
|
|
Loading…
Reference in a new issue