arm64: dynarec fixes
This commit is contained in:
parent
a2cd9d7af1
commit
523b110412
|
@ -72,9 +72,4 @@ struct Arm64RegAlloc : RegAlloc<eReg, eFReg, false> // TODO explode_spans=true
|
||||||
Arm64Assembler *assembler;
|
Arm64Assembler *assembler;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Arm64RegAlloc reg;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* CORE_REC_ARM64_ARM64_REGALLOC_H_ */
|
#endif /* CORE_REC_ARM64_ARM64_REGALLOC_H_ */
|
||||||
|
|
|
@ -556,25 +556,25 @@ public:
|
||||||
case shop_shl:
|
case shop_shl:
|
||||||
if (op.rs2.is_imm())
|
if (op.rs2.is_imm())
|
||||||
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
||||||
else if (op.rs3.is_reg())
|
else if (op.rs2.is_reg())
|
||||||
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
||||||
break;
|
break;
|
||||||
case shop_shr:
|
case shop_shr:
|
||||||
if (op.rs2.is_imm())
|
if (op.rs2.is_imm())
|
||||||
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
||||||
else if (op.rs3.is_reg())
|
else if (op.rs2.is_reg())
|
||||||
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
||||||
break;
|
break;
|
||||||
case shop_sar:
|
case shop_sar:
|
||||||
if (op.rs2.is_imm())
|
if (op.rs2.is_imm())
|
||||||
Asr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
Asr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
||||||
else if (op.rs3.is_reg())
|
else if (op.rs2.is_reg())
|
||||||
Asr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
Asr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
||||||
break;
|
break;
|
||||||
case shop_ror:
|
case shop_ror:
|
||||||
if (op.rs2.is_imm())
|
if (op.rs2.is_imm())
|
||||||
Ror(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
Ror(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), op.rs2._imm);
|
||||||
else if (op.rs3.is_reg())
|
else if (op.rs2.is_reg())
|
||||||
Ror(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
Ror(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), regalloc.MapRegister(op.rs2));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -605,11 +605,13 @@ public:
|
||||||
case shop_shad:
|
case shop_shad:
|
||||||
// TODO optimize
|
// TODO optimize
|
||||||
Cmp(regalloc.MapRegister(op.rs2), 0);
|
Cmp(regalloc.MapRegister(op.rs2), 0);
|
||||||
Csel(w1, regalloc.MapRegister(op.rs2), wzr, ge);
|
Csel(w1, regalloc.MapRegister(op.rs2), wzr, ge); // if shift >= 0 then w1 = shift else w1 = 0
|
||||||
Mov(w0, wzr); // wzr not supported by csneg
|
Mov(w0, wzr); // wzr not supported by csneg
|
||||||
Csneg(w2, w0, regalloc.MapRegister(op.rs2), ge);
|
Csneg(w2, w0, regalloc.MapRegister(op.rs2), ge); // if shift < 0 then w2 = -shift else w2 = 0
|
||||||
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), w1);
|
Cmp(w2, 32);
|
||||||
if (op.op == shop_shld)
|
Csel(w2, 31, w2, eq); // if shift == -32 then w2 = 31
|
||||||
|
Lsl(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rs1), w1); // Left shift by w1
|
||||||
|
if (op.op == shop_shld) // Right shift by w2
|
||||||
// Logical shift
|
// Logical shift
|
||||||
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rd), w2);
|
Lsr(regalloc.MapRegister(op.rd), regalloc.MapRegister(op.rd), w2);
|
||||||
else
|
else
|
||||||
|
@ -776,10 +778,8 @@ public:
|
||||||
//Ldr(regalloc.MapVRegister(op.rd, 0), MemOperand(x1, 4, PostIndex));
|
//Ldr(regalloc.MapVRegister(op.rd, 0), MemOperand(x1, 4, PostIndex));
|
||||||
//Ldr(regalloc.MapVRegister(op.rd, 1), MemOperand(x1));
|
//Ldr(regalloc.MapVRegister(op.rd, 1), MemOperand(x1));
|
||||||
regalloc.writeback_fpu += 2;
|
regalloc.writeback_fpu += 2;
|
||||||
Ldr(w2, MemOperand(x1, 4, PostIndex));
|
Ldr(x2, MemOperand(x1));
|
||||||
Str(w2, sh4_context_mem_operand(op.rd.reg_ptr()));
|
Str(x2, sh4_context_mem_operand(op.rd.reg_ptr()));
|
||||||
Ldr(w2, MemOperand(x1));
|
|
||||||
Str(w2, sh4_context_mem_operand(GetRegPtr(op.rd._reg + 1)));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case shop_fipr:
|
case shop_fipr:
|
||||||
|
|
Loading…
Reference in New Issue