mirror of https://github.com/RPCS3/rpcs3.git
SPU LLVM: Improve expression matching detection for moved registers
This commit is contained in:
parent
da6434a65a
commit
17e28ae85d
|
@ -7042,7 +7042,7 @@ public:
|
||||||
|
|
||||||
void SHLQBYI(spu_opcode_t op)
|
void SHLQBYI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.i7) return set_vr(op.rt, get_vr(op.ra)); // For expressions matching
|
if (get_reg_raw(op.ra) && !op.i7) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); // For expressions matching
|
||||||
const auto a = get_vr<u8[16]>(op.ra);
|
const auto a = get_vr<u8[16]>(op.ra);
|
||||||
const auto sc = build<u8[16]>(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
const auto sc = build<u8[16]>(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||||
const auto sh = sc - (get_imm<u8[16]>(op.i7, false) & 0x1f);
|
const auto sh = sc - (get_imm<u8[16]>(op.i7, false) & 0x1f);
|
||||||
|
@ -7270,19 +7270,19 @@ public:
|
||||||
|
|
||||||
void ORI(spu_opcode_t op)
|
void ORI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra)); // For expressions matching
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false); // For expressions matching
|
||||||
set_vr(op.rt, get_vr<s32[4]>(op.ra) | get_imm<s32[4]>(op.si10));
|
set_vr(op.rt, get_vr<s32[4]>(op.ra) | get_imm<s32[4]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ORHI(spu_opcode_t op)
|
void ORHI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s16[8]>(op.ra) | get_imm<s16[8]>(op.si10));
|
set_vr(op.rt, get_vr<s16[8]>(op.ra) | get_imm<s16[8]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ORBI(spu_opcode_t op)
|
void ORBI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s8[16]>(op.ra) | get_imm<s8[16]>(op.si10));
|
set_vr(op.rt, get_vr<s8[16]>(op.ra) | get_imm<s8[16]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7298,49 +7298,49 @@ public:
|
||||||
|
|
||||||
void ANDI(spu_opcode_t op)
|
void ANDI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && op.si10 == -1) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && op.si10 == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s32[4]>(op.ra) & get_imm<s32[4]>(op.si10));
|
set_vr(op.rt, get_vr<s32[4]>(op.ra) & get_imm<s32[4]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ANDHI(spu_opcode_t op)
|
void ANDHI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && op.si10 == -1) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && op.si10 == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s16[8]>(op.ra) & get_imm<s16[8]>(op.si10));
|
set_vr(op.rt, get_vr<s16[8]>(op.ra) & get_imm<s16[8]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ANDBI(spu_opcode_t op)
|
void ANDBI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && static_cast<s8>(op.si10) == -1) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && static_cast<s8>(op.si10) == -1) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s8[16]>(op.ra) & get_imm<s8[16]>(op.si10));
|
set_vr(op.rt, get_vr<s8[16]>(op.ra) & get_imm<s8[16]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AI(spu_opcode_t op)
|
void AI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s32[4]>(op.ra) + get_imm<s32[4]>(op.si10));
|
set_vr(op.rt, get_vr<s32[4]>(op.ra) + get_imm<s32[4]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AHI(spu_opcode_t op)
|
void AHI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s16[8]>(op.ra) + get_imm<s16[8]>(op.si10));
|
set_vr(op.rt, get_vr<s16[8]>(op.ra) + get_imm<s16[8]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void XORI(spu_opcode_t op)
|
void XORI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s32[4]>(op.ra) ^ get_imm<s32[4]>(op.si10));
|
set_vr(op.rt, get_vr<s32[4]>(op.ra) ^ get_imm<s32[4]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void XORHI(spu_opcode_t op)
|
void XORHI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s16[8]>(op.ra) ^ get_imm<s16[8]>(op.si10));
|
set_vr(op.rt, get_vr<s16[8]>(op.ra) ^ get_imm<s16[8]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
void XORBI(spu_opcode_t op)
|
void XORBI(spu_opcode_t op)
|
||||||
{
|
{
|
||||||
if (!m_interp_magn && !op.si10) return set_vr(op.rt, get_vr(op.ra));
|
if (get_reg_raw(op.ra) && !op.si10) return set_reg_fixed(op.rt, get_reg_raw(op.ra), false);
|
||||||
set_vr(op.rt, get_vr<s8[16]>(op.ra) ^ get_imm<s8[16]>(op.si10));
|
set_vr(op.rt, get_vr<s8[16]>(op.ra) ^ get_imm<s8[16]>(op.si10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue