mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-08 23:07:31 +00:00
More ARM64 disasm, warning fixes
This commit is contained in:
parent
80a813bcbd
commit
73dd26fb75
@ -315,8 +315,6 @@ void ARM64XEmitter::FlushIcacheSection(u8* start, u8* end)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Exception generation
|
||||
static const u32 ExcEnc[][3] = {
|
||||
{0, 0, 1}, // SVC
|
||||
@ -2311,7 +2309,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
|
||||
if (size == 8)
|
||||
{
|
||||
S = index & 4;
|
||||
S = (index & 4) != 0;
|
||||
opcode = 0;
|
||||
encoded_size = index & 3;
|
||||
if (index & 8)
|
||||
@ -2322,7 +2320,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
}
|
||||
else if (size == 16)
|
||||
{
|
||||
S = index & 2;
|
||||
S = (index & 2) != 0;
|
||||
opcode = 2;
|
||||
encoded_size = (index & 1) << 1;
|
||||
if (index & 4)
|
||||
@ -2333,7 +2331,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
}
|
||||
else if (size == 32)
|
||||
{
|
||||
S = index & 1;
|
||||
S = (index & 1) != 0;
|
||||
opcode = 4;
|
||||
encoded_size = 0;
|
||||
if (index & 2)
|
||||
@ -2364,7 +2362,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
|
||||
if (size == 8)
|
||||
{
|
||||
S = index & 4;
|
||||
S = (index & 4) != 0;
|
||||
opcode = 0;
|
||||
encoded_size = index & 3;
|
||||
if (index & 8)
|
||||
@ -2375,7 +2373,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
}
|
||||
else if (size == 16)
|
||||
{
|
||||
S = index & 2;
|
||||
S = (index & 2) != 0;
|
||||
opcode = 2;
|
||||
encoded_size = (index & 1) << 1;
|
||||
if (index & 4)
|
||||
@ -2386,7 +2384,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
}
|
||||
else if (size == 32)
|
||||
{
|
||||
S = index & 1;
|
||||
S = (index & 1) != 0;
|
||||
opcode = 4;
|
||||
encoded_size = 0;
|
||||
if (index & 2)
|
||||
@ -2422,7 +2420,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
|
||||
if (size == 8)
|
||||
{
|
||||
S = index & 4;
|
||||
S = (index & 4) != 0;
|
||||
opcode = 0;
|
||||
encoded_size = index & 3;
|
||||
if (index & 8)
|
||||
@ -2433,7 +2431,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
}
|
||||
else if (size == 16)
|
||||
{
|
||||
S = index & 2;
|
||||
S = (index & 2) != 0;
|
||||
opcode = 2;
|
||||
encoded_size = (index & 1) << 1;
|
||||
if (index & 4)
|
||||
@ -2444,7 +2442,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn)
|
||||
}
|
||||
else if (size == 32)
|
||||
{
|
||||
S = index & 1;
|
||||
S = (index & 1) != 0;
|
||||
opcode = 4;
|
||||
encoded_size = 0;
|
||||
if (index & 2)
|
||||
@ -2475,7 +2473,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
|
||||
if (size == 8)
|
||||
{
|
||||
S = index & 4;
|
||||
S = (index & 4) != 0;
|
||||
opcode = 0;
|
||||
encoded_size = index & 3;
|
||||
if (index & 8)
|
||||
@ -2486,7 +2484,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
}
|
||||
else if (size == 16)
|
||||
{
|
||||
S = index & 2;
|
||||
S = (index & 2) != 0;
|
||||
opcode = 2;
|
||||
encoded_size = (index & 1) << 1;
|
||||
if (index & 4)
|
||||
@ -2497,7 +2495,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re
|
||||
}
|
||||
else if (size == 32)
|
||||
{
|
||||
S = index & 1;
|
||||
S = (index & 1) != 0;
|
||||
opcode = 4;
|
||||
encoded_size = 0;
|
||||
if (index & 2)
|
||||
|
@ -854,7 +854,7 @@ public:
|
||||
|
||||
// Load pointers without casting
|
||||
template <class T> void MOVP2R(ARMReg reg, T *val) {
|
||||
MOVI2R(reg, (uintptr_t)(void *)val);
|
||||
MOVI2R(reg, (u32)(uintptr_t)(void *)val);
|
||||
}
|
||||
|
||||
void MOVIU2F(ARMReg dest, u32 val, ARMReg tempReg, bool negate = false) {
|
||||
|
@ -36,8 +36,34 @@ int SignExtend26(int x) {
|
||||
return (x & 0x02000000) ? (0xFC000000 | x) : x;
|
||||
}
|
||||
|
||||
int SignExtend19(int x) {
|
||||
return (x & 0x00040000) ? (0xFFF80000 | x) : x;
|
||||
}
|
||||
|
||||
static void DataProcessingImmediate(uint32_t w, uint64_t addr, Instruction *instr) {
|
||||
snprintf(instr->text, sizeof(instr->text), "(DPI %08x)", w);
|
||||
int Rd = w & 0x1f;
|
||||
int Rn = (w >> 5) & 0x1f;
|
||||
char r = ((w >> 31) & 1) ? 'x' : 'w';
|
||||
if (((w >> 23) & 0x3f) == 0x25) {
|
||||
int imm16 = (w >> 5) & 0xFFFF;
|
||||
int opc = (w >> 29) & 3;
|
||||
int shift = ((w >> 22) & 0x3) << 16;
|
||||
const char *opnames[4] = { "movn", "(undef)", "movz", "movk" };
|
||||
snprintf(instr->text, sizeof(instr->text), "%s %c%d, 0x%04x << %d", opnames[opc], r, Rd, imm16, shift);
|
||||
} else if (((w >> 24) & 0x1F) == 0x10) {
|
||||
int op = w >> 31;
|
||||
int imm = SignExtend19((w >> 5) & 0x7FFFF);
|
||||
if (op & 1) imm <<= 12;
|
||||
u64 daddr = addr + imm;
|
||||
snprintf(instr->text, sizeof(instr->text), "%s x%d, 0x%04x%08x", op ? "adrp" : "adr", w, daddr >> 32, daddr & 0xFFFFFFFF);
|
||||
} else if (((w >> 24) & 0x1F) == 0x11) {
|
||||
int imm = ((w >> 10) & 0xFFF);
|
||||
int shift = ((w >> 22) & 0x3) << 16;
|
||||
imm <<= shift;
|
||||
snprintf(instr->text, sizeof(instr->text), "add/sub %c%d, %c%d, %d", r, Rd, r, Rn, imm);
|
||||
} else {
|
||||
snprintf(instr->text, sizeof(instr->text), "(DPI %08x)", w);
|
||||
}
|
||||
}
|
||||
|
||||
static void BranchExceptionAndSystem(uint32_t w, uint64_t addr, Instruction *instr) {
|
||||
@ -82,9 +108,6 @@ static void DataProcessingRegister(uint32_t w, uint64_t addr, Instruction *instr
|
||||
} else {
|
||||
snprintf(instr->text, sizeof(instr->text), "%s%s %c%d, %c%d, %c%d", sub ? "sub" : "add", S ? "s" : "", r, rd, r, rn, r, rm);
|
||||
}
|
||||
} else if (((w >> 23) & 0x3f) == 0x25) {
|
||||
int imm16 = (w >> 5) & 0xFFFF;
|
||||
snprintf(instr->text, sizeof(instr->text), "%s %c%d, 0x%04x", "movew", r, rd, imm16);
|
||||
} else {
|
||||
snprintf(instr->text, sizeof(instr->text), "(DPR %08x)", w);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user