Fixed type confusion of ldst offset

This commit is contained in:
rkx1209 2018-03-07 20:58:59 +09:00
parent adde42797b
commit 4f66ecc9ef
2 changed files with 9 additions and 5 deletions

View file

@ -800,7 +800,7 @@ static void DisasLdstRegImm9(uint32_t insn, DisasCallback *cb,
unsigned int rt,
bool is_vector) {
unsigned int rn = extract32(insn, 5, 5);
unsigned int imm9 = sextract32(insn, 12, 9);
uint64_t imm9 = sextract32(insn, 12, 9);
unsigned int idx = extract32(insn, 10, 2);
bool is_signed = false;
bool is_store = false;
@ -810,6 +810,8 @@ static void DisasLdstRegImm9(uint32_t insn, DisasCallback *cb,
bool post_index;
bool writeback;
debug_print ("ldst uimm9\n");
if (is_vector) {
UnsupportedOp ("LDR/STR [base, #imm9] (SIMD&FP)");
} else {
@ -860,15 +862,15 @@ static void DisasLdstRegUnsignedImm(uint32_t insn, DisasCallback *cb,
unsigned int rt,
bool is_vector) {
unsigned int rn = extract32(insn, 5, 5);
unsigned int imm12 = extract32(insn, 10, 12);
unsigned int offset;
uint64_t imm12 = extract32(insn, 10, 12);
uint64_t offset;
bool is_store;
bool is_signed = false;
bool is_extended = false;
debug_print ("ldst unsigned imm\n");
if (is_vector) {
/* LDR/STR [base, #simm12] (SIMD&FP) */
/* LDR/STR [base, #uimm12] (SIMD&FP) */
size |= (opc & 2) << 1;
if (size > 4) {
UnallocatedOp (insn);

View file

@ -347,6 +347,7 @@ void IntprCallback::ExtendReg(unsigned int rd_idx, unsigned int rn_idx, unsigned
/* Load/Store */
static void _LoadReg(unsigned int rd_idx, uint64_t addr, int size, bool extend) {
debug_print ("Read from addr:0x%lx(%d)\n", addr, size);
if (size < 4) {
X(rd_idx) = ARMv8::ReadU64 (addr);
} else {
@ -360,6 +361,7 @@ static void _LoadReg(unsigned int rd_idx, uint64_t addr, int size, bool extend)
}
static void _StoreReg(unsigned int rd_idx, uint64_t addr, int size, bool extend) {
debug_print ("Write to addr:0x%lx(%d)\n", addr, size);
if (size < 4) {
ARMv8::WriteU64 (addr, X(rd_idx));
} else {