Removed sf from Load/StoreRegImm64

This commit is contained in:
rkx1209 2018-03-07 23:00:27 +09:00
parent 4f66ecc9ef
commit fbc62e9664
4 changed files with 37 additions and 59 deletions

View file

@ -730,7 +730,7 @@ static void DisasLdLit(uint32_t insn, DisasCallback *cb) {
size = 2 + extract32(opc, 0, 1);
is_signed = extract32(opc, 1, 1);
}
cb->LoadRegImm64 (rt, PC_IDX, imm - 4, size, false, false, false, sf);
cb->LoadRegImm64 (rt, PC_IDX, imm - 4, size, false, false, false);
}
static bool DisasLdstCompute64bit(unsigned int size, bool is_signed, unsigned int opc) {
@ -850,9 +850,9 @@ static void DisasLdstRegImm9(uint32_t insn, DisasCallback *cb,
ns_abort ("Unreachable status\n");
}
if (is_store) {
cb->StoreRegImm64 (rt, rn, imm9, size, is_extended, post_index, writeback, sf);
cb->StoreRegImm64 (rt, rn, imm9, size, is_extended, post_index, writeback);
} else {
cb->LoadRegImm64 (rt, rn, imm9, size, is_extended, post_index, writeback, sf);
cb->LoadRegImm64 (rt, rn, imm9, size, is_extended, post_index, writeback);
}
}
@ -897,16 +897,16 @@ static void DisasLdstRegUnsignedImm(uint32_t insn, DisasCallback *cb,
if (is_vector) {
/* size must be 4 (128-bit) */
if (is_store) {
cb->StoreRegImm64 (rt, rn, offset, size, false, false, false, true);
cb->StoreRegImm64 (rt, rn, offset, size, false, false, false);
} else {
cb->LoadRegImm64 (rt, rn, offset, size, false, false, false, true);
cb->LoadRegImm64 (rt, rn, offset, size, false, false, false);
}
} else {
bool sf = DisasLdstCompute64bit (size, is_signed, opc);
if (is_store) {
cb->StoreRegImm64 (rt, rn, offset, size, is_extended, false, false, sf);
cb->StoreRegImm64 (rt, rn, offset, size, is_extended, false, false);
} else {
cb->LoadRegImm64 (rt, rn, offset, size, is_extended, false, false, sf);
cb->LoadRegImm64 (rt, rn, offset, size, is_extended, false, false);
}
}
}
@ -1007,11 +1007,11 @@ static void DisasLdstPair(uint32_t insn, DisasCallback *cb) {
if (is_load) {
/* XXX: Do not modify rt register before recognizing any exception
* from the second load. */
cb->LoadRegImm64 (rt, rn, offset, size, false, post_index, writeback, sf);
cb->LoadRegImm64 (rt2, rn, offset + (1 << size), size, false, post_index, writeback, sf);
cb->LoadRegImm64 (rt, rn, offset, size, false, post_index, writeback);
cb->LoadRegImm64 (rt2, rn, offset + (1 << size), size, false, post_index, writeback);
} else {
cb->StoreRegImm64 (rt, rn, offset, size, false, post_index, writeback, sf);
cb->StoreRegImm64 (rt2, rn, offset + (1 << size), size, false, post_index, writeback, sf);
cb->StoreRegImm64 (rt, rn, offset, size, false, post_index, writeback);
cb->StoreRegImm64 (rt2, rn, offset + (1 << size), size, false, post_index, writeback);
}
}

View file

@ -376,7 +376,7 @@ 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';
char regdc = bit64 && size >= 4 ? 'Q' : regc;
char regdc = size >= 4 ? 'Q' : (size < 3 ? 'W' : 'X');
debug_print ("Load(%d): %c[%u] <= [%c[%u], %c[%u]]\n", size, regdc, rd_idx, regc, base_idx, regc, rm_idx);
uint64_t addr;
if (bit64) {
@ -398,33 +398,22 @@ 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';
char regdc = bit64 && size >= 4 ? 'Q' : regc;
debug_print ("Load(%d): %c[%u] <= [%c[%u], 0x%lx]\n", size, regdc, rd_idx, regc, base_idx, offset);
bool extend, bool post, bool writeback) {
char regdc = size >= 4 ? 'Q' : (size < 3 ? 'W' : 'X');
debug_print ("Load(%d): %c[%u] <= [X[%u], 0x%lx]\n", size, regdc, rd_idx, base_idx, offset);
uint64_t addr;
if (bit64) {
if (post)
addr = X(base_idx);
else
addr = X(base_idx) + offset;
_LoadReg (rd_idx, addr, size, extend);
if (writeback)
X(base_idx) = addr;
} else {
if (post)
addr = W(base_idx);
else
addr = W(base_idx) + offset;
_LoadReg (rd_idx, addr, size, extend);
if (writeback)
W(base_idx) = addr;
}
if (post)
addr = X(base_idx);
else
addr = X(base_idx) + offset;
_LoadReg (rd_idx, addr, size, extend);
if (writeback)
X(base_idx) = addr;
}
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';
char regdc = bit64 && size >= 4 ? 'Q' : regc;
char regdc = size >= 4 ? 'Q' : (size < 3 ? 'W' : 'X');
debug_print ("Store(%d): %c[%u] => [%c[%u], %c[%u]]\n", size, regdc, rd_idx, regc, base_idx, regc, rm_idx);
uint64_t addr;
if (bit64) {
@ -446,28 +435,17 @@ 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';
char regdc = bit64 && size >= 4 ? 'Q' : regc;
debug_print ("Store(%d): %c[%u] => [%c[%u], 0x%lx]\n", size, regdc, rd_idx, regc, base_idx, offset);
bool extend, bool post, bool writeback) {
char regdc = size >= 4 ? 'Q' : (size < 3 ? 'W' : 'X');
debug_print ("Store(%d): %c[%u] => [X[%u], 0x%lx]\n", size, regdc, rd_idx, base_idx, offset);
uint64_t addr;
if (bit64) {
if (post)
addr = X(base_idx);
else
addr = X(base_idx) + offset;
_StoreReg (rd_idx, addr, size, extend);
if (writeback)
X(base_idx) = addr;
} else {
if (post)
addr = W(base_idx);
else
addr = W(base_idx) + offset;
_StoreReg (rd_idx, addr, size, extend);
if (writeback)
W(base_idx) = addr;
}
if (post)
addr = X(base_idx);
else
addr = X(base_idx) + offset;
_StoreReg (rd_idx, addr, size, extend);
if (writeback)
X(base_idx) = addr;
}
/* Bitfield Signed/Unsigned Extract... with Immediate value */

View file

@ -45,9 +45,9 @@ virtual void ExtendReg(unsigned int rd_idx, unsigned int rn_idx, unsigned int ex
/* Load/Store */
virtual void LoadReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size, bool extend, bool post, bool writeback, bool bit64) = 0;
virtual void LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback, bool bit64) = 0;
virtual void LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback) = 0;
virtual void StoreReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size, bool extend, bool post, bool writeback, bool bit64) = 0;
virtual void StoreRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback, bool bit64) = 0;
virtual void StoreRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback) = 0;
/* Bitfield Signed/Unsigned Extract... with Immediate value */
virtual void SExtractI64(unsigned int rd_idx, unsigned int rn_idx, unsigned int pos, unsigned int len, bool bit64) = 0;

View file

@ -45,9 +45,9 @@ void ExtendReg(unsigned int rd_idx, unsigned int rn_idx, unsigned int extend_typ
/* Load/Store */
void LoadReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size, bool extend, bool post, bool writeback, bool bit64);
void LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback, bool bit64);
void LoadRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback);
void StoreReg(unsigned int rd_idx, unsigned int base_idx, unsigned int rm_idx, int size, bool extend, bool post, bool writeback, bool bit64);
void StoreRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback, bool bit64);
void StoreRegImm64(unsigned int rd_idx, unsigned int base_idx, uint64_t offset, int size, bool extend, bool post, bool writeback);
/* Bitfield Signed/Unsigned Extract... with Immediate value */
void SExtractI64(unsigned int rd_idx, unsigned int rn_idx, unsigned int pos, unsigned int len, bool bit64);