PPU LLVM: Add relocation 5 for ADDIS

+ Add some more for u16 relocations (4, 5, 6), simplify logic.
This commit is contained in:
Eladash 2020-03-26 15:01:38 +02:00 committed by Ivan
parent a5ba4a18df
commit 7ed570dc4a
1 changed files with 27 additions and 33 deletions

View File

@ -1757,7 +1757,7 @@ void PPUTranslator::ADDIC(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -1774,7 +1774,7 @@ void PPUTranslator::ADDI(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -1787,7 +1787,7 @@ void PPUTranslator::ADDIS(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16 << 16);
if (m_rel && m_rel->type == 6)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = m_ir->CreateShl(SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>()), 16);
m_rel = nullptr;
@ -2090,7 +2090,7 @@ void PPUTranslator::ORI(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.uimm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = ZExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -2103,13 +2103,7 @@ void PPUTranslator::ORIS(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.uimm16 << 16);
if (m_rel && m_rel->type == 5)
{
imm = m_ir->CreateShl(ZExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>()), 16);
m_rel = nullptr;
}
if (m_rel && m_rel->type == 6)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = m_ir->CreateShl(ZExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>()), 16);
m_rel = nullptr;
@ -3382,7 +3376,7 @@ void PPUTranslator::LWZ(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3395,7 +3389,7 @@ void PPUTranslator::LWZU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3410,7 +3404,7 @@ void PPUTranslator::LBZ(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3423,7 +3417,7 @@ void PPUTranslator::LBZU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3438,7 +3432,7 @@ void PPUTranslator::STW(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3462,7 +3456,7 @@ void PPUTranslator::STWU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3477,7 +3471,7 @@ void PPUTranslator::STB(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3490,7 +3484,7 @@ void PPUTranslator::STBU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3505,7 +3499,7 @@ void PPUTranslator::LHZ(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3518,7 +3512,7 @@ void PPUTranslator::LHZU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3533,7 +3527,7 @@ void PPUTranslator::LHA(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3546,7 +3540,7 @@ void PPUTranslator::LHAU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3561,7 +3555,7 @@ void PPUTranslator::STH(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3574,7 +3568,7 @@ void PPUTranslator::STHU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3605,7 +3599,7 @@ void PPUTranslator::LFS(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3618,7 +3612,7 @@ void PPUTranslator::LFSU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3633,7 +3627,7 @@ void PPUTranslator::LFD(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3646,7 +3640,7 @@ void PPUTranslator::LFDU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3661,7 +3655,7 @@ void PPUTranslator::STFS(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3674,7 +3668,7 @@ void PPUTranslator::STFSU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3689,7 +3683,7 @@ void PPUTranslator::STFD(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;
@ -3702,7 +3696,7 @@ void PPUTranslator::STFDU(ppu_opcode_t op)
{
Value* imm = m_ir->getInt64(op.simm16);
if (m_rel && m_rel->type == 4)
if (m_rel && (m_rel->type >= 4u && m_rel->type <= 6u))
{
imm = SExt(ReadMemory(GetAddr(+2), GetType<u16>()), GetType<u64>());
m_rel = nullptr;