More ARM64 disasm, warning fixes

This commit is contained in:
Henrik Rydgard 2015-03-08 11:26:45 +01:00
parent 80a813bcbd
commit 73dd26fb75
3 changed files with 40 additions and 19 deletions

View File

@ -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)

View File

@ -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) {

View File

@ -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);
}