diff --git a/rpcs3/Emu/Cell/PPCDecoder.cpp b/rpcs3/Emu/Cell/PPCDecoder.cpp deleted file mode 100644 index 7cbb50565f..0000000000 --- a/rpcs3/Emu/Cell/PPCDecoder.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "stdafx.h" -#include "Emu/Memory/Memory.h" -#include "PPCDecoder.h" - -u32 PPCDecoder::DecodeMemory(const u32 address) -{ - u32 instr = vm::ps3::read32(address); - Decode(instr); - - return sizeof(u32); -} diff --git a/rpcs3/Emu/Cell/PPCDecoder.h b/rpcs3/Emu/Cell/PPCDecoder.h deleted file mode 100644 index 0a602f562a..0000000000 --- a/rpcs3/Emu/Cell/PPCDecoder.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include "Emu/CPU/CPUDecoder.h" -#include "PPCInstrTable.h" - -class PPCDecoder : public CPUDecoder -{ -public: - virtual void Decode(const u32 code) = 0; - - virtual u32 DecodeMemory(const u32 address); - - virtual ~PPCDecoder() = default; -}; - - -template -static InstrList<(1 << (CodeField::size)), TO>* new_list(const CodeField& func, InstrCaller* error_func = nullptr) -{ - return new InstrList<(1 << (CodeField::size)), TO>(func, error_func); -} - -template -static InstrList<(1 << (CodeField::size)), TO>* new_list(InstrList* parent, int opcode, const CodeField& func, InstrCaller* error_func = nullptr) -{ - return connect_list(parent, new InstrList<(1 << (CodeField::size)), TO>(func, error_func), opcode); -} - -template -static InstrList<(1 << (CodeField::size)), TO>* new_list(InstrList* parent, const CodeField& func, InstrCaller* error_func = nullptr) -{ - return connect_list(parent, new InstrList<(1 << (CodeField::size)), TO>(func, error_func)); -} diff --git a/rpcs3/Emu/Cell/PPCInstrTable.h b/rpcs3/Emu/Cell/PPCInstrTable.h deleted file mode 100644 index 2eac8f73a7..0000000000 --- a/rpcs3/Emu/Cell/PPCInstrTable.h +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once -#include "Emu/CPU/CPUInstrTable.h" - -enum CodeFieldType -{ - FIELD_IMM, - FIELD_R_GPR, - FIELD_R_FPR, - FIELD_R_VPR, - FIELD_R_CR, - FIELD_BRANCH, -}; - -template -class CodeField : public CodeFieldBase -{ - static_assert(from <= to, "too big 'from' value"); - static_assert(to <= 31, "too big 'to' value"); - -public: - CodeField(CodeFieldType type = FIELD_IMM) : CodeFieldBase(type) - { - } - - static const u32 size = to - from + 1; - static const u32 shift = 31 - to; - static const u32 mask = ((1ULL << ((to - from) + 1)) - 1) << shift; - - static force_inline void encode(u32& data, u32 value) - { - data &= ~mask; - data |= (value << shift) & mask; - } - - static force_inline u32 decode(u32 data) - { - return (data & mask) >> shift; - } - - virtual u32 operator ()(u32 data) const - { - return decode(data); - } - - virtual void operator()(u32& data, u32 value) const - { - encode(data, value); - } -}; - -static CodeField<0, 31> GetCode; - -template -class DoubleCodeField : public CodeField -{ - static_assert(from2 <= to2, "too big from2 value"); - static_assert(to2 <= 31, "too big to2 value"); - -public: - DoubleCodeField(CodeFieldType type = FIELD_IMM) : CodeField(type) - { - } - - static const u32 shift2 = 31 - to2; - static const u32 mask2 = ((1 << ((to2 - from2) + 1)) - 1) << shift2; - - static force_inline void encode(u32& data, u32 value) - { - data &= ~(CodeField::mask | mask2); - data |= ((value << CodeField::shift) & CodeField::mask) | (((value >> offset) << shift2) & mask2); - } - - static force_inline u32 decode(u32 data) - { - return ((data & CodeField::mask) >> CodeField::shift) | (((data & mask2) >> shift2) << offset); - } - - virtual u32 operator ()(u32 data) const - { - return decode(data); - } - - virtual void operator()(u32& data, u32 value) const - { - encode(data, value); - } -}; - -template -class CodeFieldSigned : public CodeField -{ -public: - CodeFieldSigned(CodeFieldType type = FIELD_IMM) : CodeField(type) - { - } - - static const int size = _size; - - static force_inline u32 decode(u32 data) - { - return sign((data & CodeField::mask) >> CodeField::shift); - } - - virtual u32 operator ()(u32 data) const - { - return decode(data); - } -}; - -template -class CodeFieldOffset : public CodeField -{ - static const int offset = _offset; - -public: - CodeFieldOffset(CodeFieldType type = FIELD_IMM) : CodeField(type) - { - } - - static force_inline u32 decode(u32 data) - { - return ((data & CodeField::mask) >> CodeField::shift) << offset; - } - - static force_inline void encode(u32& data, u32 value) - { - data &= ~CodeField::mask; - data |= ((value >> offset) << CodeField::shift) & CodeField::mask; - } - - virtual u32 operator ()(u32 data) const - { - return decode(data); - } - - virtual void operator ()(u32& data, u32 value) const - { - return encode(data, value); - } -}; - -template -class CodeFieldSignedOffset : public CodeFieldSigned -{ - static const int offset = _offset; - -public: - CodeFieldSignedOffset(CodeFieldType type = FIELD_IMM) : CodeFieldSigned(type) - { - } - - static force_inline u32 decode(u32 data) - { - return sign((data & CodeField::mask) >> CodeField::shift) << offset; - } - - static force_inline void encode(u32& data, u32 value) - { - data &= ~CodeField::mask; - data |= ((value >> offset) << CodeField::shift) & CodeField::mask; - } - - virtual u32 operator ()(u32 data) const - { - return decode(data); - } - - virtual void operator ()(u32& data, u32 value) const - { - return encode(data, value); - } -}; diff --git a/rpcs3/Emu/Cell/PPCThreadManager.cpp b/rpcs3/Emu/Cell/PPCThreadManager.cpp deleted file mode 100644 index b829ef72e5..0000000000 --- a/rpcs3/Emu/Cell/PPCThreadManager.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#if 0 -#include "stdafx.h" -#include "PPCThreadManager.h" -#include "PPUThread.h" -#include "SPUThread.h" -#include "RawSPUThread.h" - -PPCThreadManager::PPCThreadManager() : -m_raw_spu_num(0) -{ -} - -PPCThreadManager::~PPCThreadManager() -{ - Close(); -} - -void PPCThreadManager::Close() -{ - while(m_threads.size()) RemoveThread(m_threads[0]->GetId()); -} - -PPCThread& PPCThreadManager::AddThread(PPCThreadType type) -{ - std::lock_guard lock(m_mtx_thread); - - PPCThread* new_thread; - char* name; - switch(type) - { - case PPC_THREAD_PPU: new_thread = new PPUThread(); name = "PPU"; break; - case PPC_THREAD_SPU: new_thread = new SPUThread(); name = "SPU"; break; - case PPC_THREAD_RAW_SPU: new_thread = new RawSPUThread(m_raw_spu_num++); name = "RawSPU"; break; - default: assert(0); - } - - new_thread->SetId(Emu.GetIdManager().GetNewID(fmt::Format("%s Thread", name), new_thread)); - - m_threads.push_back(new_thread); - wxGetApp().SendDbgCommand(DID_CREATE_THREAD, new_thread); - - return *new_thread; -} - -void PPCThreadManager::RemoveThread(const u32 id) -{ - std::lock_guard lock(m_mtx_thread); - - for(u32 i=0; im_wait_thread_id == id) - { - m_threads[i]->Wait(false); - m_threads[i]->m_wait_thread_id = -1; - } - - if(m_threads[i]->GetId() != id) continue; - - PPCThread* thr = m_threads[i]; - wxGetApp().SendDbgCommand(DID_REMOVE_THREAD, thr); - if(thr->IsAlive()) - { - thr->Close(); - } - else - { - thr->Close(); - delete thr; - } - - - m_threads.erase(m_threads.begin() + i); - i--; - } - - Emu.GetIdManager().RemoveID(id, false); - Emu.CheckStatus(); -} - -s32 PPCThreadManager::GetThreadNumById(PPCThreadType type, u32 id) -{ - s32 num = 0; - - for(u32 i=0; iGetId() == id) return num; - if(m_threads[i]->GetType() == type) num++; - } - - return -1; -} - -PPCThread* PPCThreadManager::GetThread(u32 id) -{ - for(u32 i=0; iGetId() == id) return m_threads[i]; - } - - return nullptr; -} - -void PPCThreadManager::Exec() -{ - for(u32 i=0; iExec(); - } -} -#endif diff --git a/rpcs3/Emu/Cell/PPCThreadManager.h b/rpcs3/Emu/Cell/PPCThreadManager.h deleted file mode 100644 index 9bb650304c..0000000000 --- a/rpcs3/Emu/Cell/PPCThreadManager.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "PPCThread.h" - -enum PPCThreadType -{ - PPC_THREAD_PPU, - PPC_THREAD_SPU, - PPC_THREAD_RAW_SPU -}; - -class PPCThreadManager -{ - //IdManager m_threads_id; - //ArrayF m_ppu_threads; - //ArrayF m_spu_threads; - std::vector m_threads; - std::mutex m_mtx_thread; - wxSemaphore m_sem_task; - u32 m_raw_spu_num; - -public: - PPCThreadManager(); - ~PPCThreadManager(); - - void Close(); - - PPCThread& AddThread(PPCThreadType type); - void RemoveThread(const u32 id); - - std::vector& GetThreads() { return m_threads; } - s32 GetThreadNumById(PPCThreadType type, u32 id); - PPCThread* GetThread(u32 id); - //IdManager& GetIDs() {return m_threads_id;} - - void Exec(); - void Task(); -}; diff --git a/rpcs3/Emu/Cell/PPUDecoder.h b/rpcs3/Emu/Cell/PPUDecoder.h deleted file mode 100644 index 97132b07e9..0000000000 --- a/rpcs3/Emu/Cell/PPUDecoder.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "Emu/Cell/PPUOpcodes.h" -#include "Emu/Cell/PPCDecoder.h" -#include "PPUInstrTable.h" - -class PPUDecoder : public PPCDecoder -{ - PPUOpcodes* m_op; - -public: - PPUDecoder(PPUOpcodes* op) : m_op(op) - { - } - - virtual ~PPUDecoder() - { - delete m_op; - } - - virtual void Decode(const u32 code) - { - (*PPU_instr::main_list)(m_op, code); - } -}; \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUInstrTable.h b/rpcs3/Emu/Cell/PPUInstrTable.h deleted file mode 100644 index fbad298fbb..0000000000 --- a/rpcs3/Emu/Cell/PPUInstrTable.h +++ /dev/null @@ -1,704 +0,0 @@ -#pragma once -#include "PPCInstrTable.h" -#include "PPCDecoder.h" -#include "PPUOpcodes.h" - -namespace PPU_instr -{ - namespace fields - { - //This field is used in rotate instructions to specify the first 1 bit of a 64-bit mask - static DoubleCodeField<21, 25, 26, 26, 5> mb; - - //This field is used in rotate instructions to specify the last 1 bit of a 64-bit mask - static DoubleCodeField<21, 25, 26, 26, 5> me; - - //This field is used to specify a shift amount - static DoubleCodeField<16, 20, 30, 30, 5> sh; - - //This field is used to specify a special-purpose register for the mtspr and mfspr instructions - static CodeField<11, 20> SPR; - - // - static CodeField<6, 10> VS(FIELD_R_VPR); - - // - static CodeField<6, 10> VD(FIELD_R_VPR); - - // - static CodeField<11, 15> VA(FIELD_R_VPR); - - // - static CodeField<16, 20> VB(FIELD_R_VPR); - - // - static CodeField<21, 25> VC(FIELD_R_VPR); - - // - static CodeField<11, 15> VUIMM; - - // - static CodeFieldSigned<11, 15> VSIMM; - - // - static CodeField<22, 25> VSH; - - //This field is used to specify a GPR to be used as a destination - static CodeField<6, 10> RD(FIELD_R_GPR); - - //This field is used to specify a GPR to be used as a source - static CodeField<6, 10> RS(FIELD_R_GPR); - - //This field is used to specify a GPR to be used as a source or destination - static CodeField<11, 15> RA(FIELD_R_GPR); - - //This field is used to specify a GPR to be used as a source - static CodeField<16, 20> RB(FIELD_R_GPR); - - //This field is used to specify the number of bytes to move in an immediate string load or store - static CodeField<16, 20> NB; - - //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a destination - static CodeField<6, 8> CRFD(FIELD_R_CR); - - //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a source - static CodeField<11, 13> CRFS(FIELD_R_CR); - - //This field is used to specify a bit in the CR to be used as a source - static CodeField<11, 15> CRBA(FIELD_R_CR); - - //This field is used to specify a bit in the CR to be used as a source - static CodeField<16, 20> CRBB(FIELD_R_CR); - - //This field is used to specify a bit in the CR, or in the FPSCR, as the destination of the result of an instruction - static CodeField<6, 10> CRBD(FIELD_R_CR); - - //This field is used to specify options for the branch conditional instructions - static CodeField<6, 10> BO; - - //This field is used to specify a bit in the CR to be used as the condition of a branch conditional instruction - static CodeField<11, 15> BI; - - //Immediate field specifying a 14-bit signed two's complement branch displacement that is concatenated on the - //right with '00' and sign-extended to 64 bits. - static CodeFieldSigned<16, 31> BD(FIELD_BRANCH); - - // - static CodeField<19, 20> BH; - - // - static CodeField<11, 13> BFA; - - //Field used by the optional data stream variant of the dcbt instruction. - static CodeField<9, 10> TH; - - //This field is used to specify the conditions on which to trap - static CodeField<6, 10> TO; - - // - static CodeField<21, 25> MB; - - // - static CodeField<26, 30> ME; - - //This field is used to specify a shift amount - static CodeField<16, 20> SH; - - /* - Absolute address bit. - 0 The immediate field represents an address relative to the current instruction address (CIA). (For more - information on the CIA, see Table 8-3.) The effective (logical) address of the branch is either the sum - of the LI field sign-extended to 64 bits and the address of the branch instruction or the sum of the BD - field sign-extended to 64 bits and the address of the branch instruction. - 1 The immediate field represents an absolute address. The effective address (EA) of the branch is the - LI field sign-extended to 64 bits or the BD field sign-extended to 64 bits. - */ - static CodeField<30> AA; - - // - static CodeFieldSignedOffset<6, 29, 2> LL(FIELD_BRANCH); - /* - Link bit. - 0 Does not update the link register (LR). - 1 Updates the LR. If the instruction is a branch instruction, the address of the instruction following the - branch instruction is placed into the LR. - */ - static CodeField<31> LK; - - //This field is used for extended arithmetic to enable setting OV and SO in the XER - static CodeField<21> OE; - - //Field used to specify whether an integer compare instruction is to compare 64-bit numbers or 32-bit numbers - static CodeField<10> L_10; - static CodeField<6> L_6; - static CodeField<9, 10> L_9_10; - static CodeField<11> L_11; - // - static CodeField<16, 19> I; - - // - static CodeField<16, 27> DQ; - - //This field is used to specify an FPR as the destination - static CodeField<6, 10> FRD; - - //This field is used to specify an FPR as a source - static CodeField<6, 10> FRS; - - // - static CodeField<7, 14> FM; - - //This field is used to specify an FPR as a source - static CodeField<11, 15> FRA(FIELD_R_FPR); - - //This field is used to specify an FPR as a source - static CodeField<16, 20> FRB(FIELD_R_FPR); - - //This field is used to specify an FPR as a source - static CodeField<21, 25> FRC(FIELD_R_FPR); - - //This field mask is used to identify the CR fields that are to be updated by the mtcrf instruction. - static CodeField<12, 19> CRM; - - // This field is used to identify the system call level - static CodeField<20, 26> LEV; - - //Immediate field specifying a 16-bit signed two's complement integer that is sign-extended to 64 bits - static CodeFieldSigned<16, 31> D; - - // - static CodeFieldSignedOffset<16, 29, 2> DS; - - //This immediate field is used to specify a 16-bit signed integer - static CodeFieldSigned<16, 31> simm16; - - //This immediate field is used to specify a 16-bit unsigned integer - static CodeField<16, 31> uimm16; - - static CodeField<6, 31> uimm26; - - /* - Record bit. - 0 Does not update the condition register (CR). - 1 Updates the CR to reflect the result of the operation. - For integer instructions, CR bits [0-2] are set to reflect the result as a signed quantity and CR bit [3] - receives a copy of the summary overflow bit, XER[SO]. The result as an unsigned quantity or a bit - string can be deduced from the EQ bit. For floating-point instructions, CR bits [4-7] are set to reflect - floating-point exception, floating-point enabled exception, floating-point invalid operation exception, - and floating-point overflow exception. - */ - static CodeField<31> RC; - - //Primary opcode field - static CodeField<0, 5> OPCD; - - static CodeField<26, 31> GD_04; //0x3f - static CodeField<21, 31> GD_04_0;//0x7ff - static CodeField<21, 30> GD_13; //0x3ff - static CodeField<27, 29> GD_1e; //0x7 - static CodeField<21, 30> GD_1f; //0x3ff - static CodeField<30, 31> GD_3a; //0x3 - static CodeField<26, 30> GD_3b; //0x1f - static CodeField<30, 31> GD_3e; //0x3 - static CodeField<26, 30> GD_3f;//0x1f - static CodeField<21, 30> GD_3f_0; //0x3ff - - static CodeField<9, 10> STRM; - } - - namespace lists - { - using namespace fields; - - //static auto main_list = new_list(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); - static InstrList<1 << CodeField<0, 5>::size, ::PPUOpcodes> main_list_obj(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); - static auto main_list = &main_list_obj; - static auto g04_list = new_list(main_list, PPU_opcodes::G_04, GD_04); - static auto g04_0_list = new_list(g04_list, GD_04_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_04_0)); - static auto g13_list = new_list(main_list, PPU_opcodes::G_13, GD_13, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_13)); - static auto g1e_list = new_list(main_list, PPU_opcodes::G_1e, GD_1e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1e)); - static auto g1f_list = new_list(main_list, PPU_opcodes::G_1f, GD_1f, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1f)); - static auto g3a_list = new_list(main_list, PPU_opcodes::G_3a, GD_3a, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3a)); - static auto g3b_list = new_list(main_list, PPU_opcodes::G_3b, GD_3b, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3b)); - static auto g3e_list = new_list(main_list, PPU_opcodes::G_3e, GD_3e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3e)); - static auto g3f_list = new_list(main_list, PPU_opcodes::G_3f, GD_3f); - static auto g3f_0_list = new_list(g3f_list, GD_3f_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3f_0)); - -#define bind_instr(list, name, ...) \ - static const auto& name = make_instr(list, #name, &PPUOpcodes::name, ##__VA_ARGS__) -#define bind_instr_oe(list, name, ...) \ - bind_instr(list, name, ##__VA_ARGS__); \ - static const auto& name##O = make_instr(list, #name "O", &PPUOpcodes::name, ##__VA_ARGS__) - - bind_instr(main_list, TDI, TO, RA, simm16); - bind_instr(main_list, TWI, TO, RA, simm16); - bind_instr(main_list, MULLI, RD, RA, simm16); - bind_instr(main_list, SUBFIC, RD, RA, simm16); - bind_instr(main_list, CMPLI, CRFD, L_10, RA, uimm16); - bind_instr(main_list, CMPI, CRFD, L_10, RA, simm16); - bind_instr(main_list, ADDIC, RD, RA, simm16); - bind_instr(main_list, ADDIC_, RD, RA, simm16); - bind_instr(main_list, ADDI, RD, RA, simm16); - bind_instr(main_list, ADDIS, RD, RA, simm16); - bind_instr(main_list, BC, BO, BI, BD, AA, LK); - bind_instr(main_list, HACK, uimm26); - bind_instr(main_list, SC, LEV); - bind_instr(main_list, B, LL, AA, LK); - bind_instr(main_list, RLWIMI, RA, RS, SH, MB, ME, RC); - bind_instr(main_list, RLWINM, RA, RS, SH, MB, ME, RC); - bind_instr(main_list, RLWNM, RA, RS, RB, MB, ME, RC); - bind_instr(main_list, ORI, RA, RS, uimm16); - bind_instr(main_list, ORIS, RA, RS, uimm16); - bind_instr(main_list, XORI, RA, RS, uimm16); - bind_instr(main_list, XORIS, RA, RS, uimm16); - bind_instr(main_list, ANDI_, RA, RS, uimm16); - bind_instr(main_list, ANDIS_, RA, RS, uimm16); - bind_instr(main_list, LWZ, RD, RA, D); - bind_instr(main_list, LWZU, RD, RA, D); - bind_instr(main_list, LBZ, RD, RA, D); - bind_instr(main_list, LBZU, RD, RA, D); - bind_instr(main_list, STW, RS, RA, D); - bind_instr(main_list, STWU, RS, RA, D); - bind_instr(main_list, STB, RS, RA, D); - bind_instr(main_list, STBU, RS, RA, D); - bind_instr(main_list, LHZ, RD, RA, D); - bind_instr(main_list, LHZU, RD, RA, D); - bind_instr(main_list, LHA, RD, RA, D); - bind_instr(main_list, LHAU, RD, RA, D); - bind_instr(main_list, STH, RS, RA, D); - bind_instr(main_list, STHU, RS, RA, D); - bind_instr(main_list, LMW, RD, RA, D); - bind_instr(main_list, STMW, RS, RA, D); - bind_instr(main_list, LFS, FRD, RA, D); - bind_instr(main_list, LFSU, FRD, RA, D); - bind_instr(main_list, LFD, FRD, RA, D); - bind_instr(main_list, LFDU, FRD, RA, D); - bind_instr(main_list, STFS, FRS, RA, D); - bind_instr(main_list, STFSU, FRS, RA, D); - bind_instr(main_list, STFD, FRS, RA, D); - bind_instr(main_list, STFDU, FRS, RA, D); - - bind_instr(g04_list, VMADDFP, VD, VA, VC, VB); - bind_instr(g04_list, VMHADDSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMHRADDSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMLADDUHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMMBM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMSHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUBM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUHS, VD, VA, VB, VC); - bind_instr(g04_list, VNMSUBFP, VD, VA, VC, VB); - bind_instr(g04_list, VPERM, VD, VA, VB, VC); - bind_instr(g04_list, VSEL, VD, VA, VB, VC); - bind_instr(g04_list, VSLDOI, VD, VA, VB, VSH); - - bind_instr(g04_0_list, MFVSCR, VD); - bind_instr(g04_0_list, MTVSCR, VB); - bind_instr(g04_0_list, VADDCUW, VD, VA, VB); - bind_instr(g04_0_list, VADDFP, VD, VA, VB); - bind_instr(g04_0_list, VADDSBS, VD, VA, VB); - bind_instr(g04_0_list, VADDSHS, VD, VA, VB); - bind_instr(g04_0_list, VADDSWS, VD, VA, VB); - bind_instr(g04_0_list, VADDUBM, VD, VA, VB); - bind_instr(g04_0_list, VADDUBS, VD, VA, VB); - bind_instr(g04_0_list, VADDUHM, VD, VA, VB); - bind_instr(g04_0_list, VADDUHS, VD, VA, VB); - bind_instr(g04_0_list, VADDUWM, VD, VA, VB); - bind_instr(g04_0_list, VADDUWS, VD, VA, VB); - bind_instr(g04_0_list, VAND, VD, VA, VB); - bind_instr(g04_0_list, VANDC, VD, VA, VB); - bind_instr(g04_0_list, VAVGSB, VD, VA, VB); - bind_instr(g04_0_list, VAVGSH, VD, VA, VB); - bind_instr(g04_0_list, VAVGSW, VD, VA, VB); - bind_instr(g04_0_list, VAVGUB, VD, VA, VB); - bind_instr(g04_0_list, VAVGUH, VD, VA, VB); - bind_instr(g04_0_list, VAVGUW, VD, VA, VB); - bind_instr(g04_0_list, VCFSX, VD, VUIMM, VB); - bind_instr(g04_0_list, VCFUX, VD, VUIMM, VB); - bind_instr(g04_0_list, VCMPBFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPBFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUB, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUH, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUW, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUW_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGEFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPGEFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSB, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSH, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSW, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSW_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUB, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUH, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUW, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUW_, VD, VA, VB); - bind_instr(g04_0_list, VCTSXS, VD, VUIMM, VB); - bind_instr(g04_0_list, VCTUXS, VD, VUIMM, VB); - bind_instr(g04_0_list, VEXPTEFP, VD, VB); - bind_instr(g04_0_list, VLOGEFP, VD, VB); - bind_instr(g04_0_list, VMAXFP, VD, VA, VB); - bind_instr(g04_0_list, VMAXSB, VD, VA, VB); - bind_instr(g04_0_list, VMAXSH, VD, VA, VB); - bind_instr(g04_0_list, VMAXSW, VD, VA, VB); - bind_instr(g04_0_list, VMAXUB, VD, VA, VB); - bind_instr(g04_0_list, VMAXUH, VD, VA, VB); - bind_instr(g04_0_list, VMAXUW, VD, VA, VB); - bind_instr(g04_0_list, VMINFP, VD, VA, VB); - bind_instr(g04_0_list, VMINSB, VD, VA, VB); - bind_instr(g04_0_list, VMINSH, VD, VA, VB); - bind_instr(g04_0_list, VMINSW, VD, VA, VB); - bind_instr(g04_0_list, VMINUB, VD, VA, VB); - bind_instr(g04_0_list, VMINUH, VD, VA, VB); - bind_instr(g04_0_list, VMINUW, VD, VA, VB); - bind_instr(g04_0_list, VMRGHB, VD, VA, VB); - bind_instr(g04_0_list, VMRGHH, VD, VA, VB); - bind_instr(g04_0_list, VMRGHW, VD, VA, VB); - bind_instr(g04_0_list, VMRGLB, VD, VA, VB); - bind_instr(g04_0_list, VMRGLH, VD, VA, VB); - bind_instr(g04_0_list, VMRGLW, VD, VA, VB); - bind_instr(g04_0_list, VMULESB, VD, VA, VB); - bind_instr(g04_0_list, VMULESH, VD, VA, VB); - bind_instr(g04_0_list, VMULEUB, VD, VA, VB); - bind_instr(g04_0_list, VMULEUH, VD, VA, VB); - bind_instr(g04_0_list, VMULOSB, VD, VA, VB); - bind_instr(g04_0_list, VMULOSH, VD, VA, VB); - bind_instr(g04_0_list, VMULOUB, VD, VA, VB); - bind_instr(g04_0_list, VMULOUH, VD, VA, VB); - bind_instr(g04_0_list, VNOR, VD, VA, VB); - bind_instr(g04_0_list, VOR, VD, VA, VB); - bind_instr(g04_0_list, VPKPX, VD, VA, VB); - bind_instr(g04_0_list, VPKSHSS, VD, VA, VB); - bind_instr(g04_0_list, VPKSHUS, VD, VA, VB); - bind_instr(g04_0_list, VPKSWSS, VD, VA, VB); - bind_instr(g04_0_list, VPKSWUS, VD, VA, VB); - bind_instr(g04_0_list, VPKUHUM, VD, VA, VB); - bind_instr(g04_0_list, VPKUHUS, VD, VA, VB); - bind_instr(g04_0_list, VPKUWUM, VD, VA, VB); - bind_instr(g04_0_list, VPKUWUS, VD, VA, VB); - bind_instr(g04_0_list, VREFP, VD, VB); - bind_instr(g04_0_list, VRFIM, VD, VB); - bind_instr(g04_0_list, VRFIN, VD, VB); - bind_instr(g04_0_list, VRFIP, VD, VB); - bind_instr(g04_0_list, VRFIZ, VD, VB); - bind_instr(g04_0_list, VRLB, VD, VA, VB); - bind_instr(g04_0_list, VRLH, VD, VA, VB); - bind_instr(g04_0_list, VRLW, VD, VA, VB); - bind_instr(g04_0_list, VRSQRTEFP, VD, VB); - bind_instr(g04_0_list, VSL, VD, VA, VB); - bind_instr(g04_0_list, VSLB, VD, VA, VB); - bind_instr(g04_0_list, VSLH, VD, VA, VB); - bind_instr(g04_0_list, VSLO, VD, VA, VB); - bind_instr(g04_0_list, VSLW, VD, VA, VB); - bind_instr(g04_0_list, VSPLTB, VD, VUIMM, VB); - bind_instr(g04_0_list, VSPLTH, VD, VUIMM, VB); - bind_instr(g04_0_list, VSPLTISB, VD, VSIMM); - bind_instr(g04_0_list, VSPLTISH, VD, VSIMM); - bind_instr(g04_0_list, VSPLTISW, VD, VSIMM); - bind_instr(g04_0_list, VSPLTW, VD, VUIMM, VB); - bind_instr(g04_0_list, VSR, VD, VA, VB); - bind_instr(g04_0_list, VSRAB, VD, VA, VB); - bind_instr(g04_0_list, VSRAH, VD, VA, VB); - bind_instr(g04_0_list, VSRAW, VD, VA, VB); - bind_instr(g04_0_list, VSRB, VD, VA, VB); - bind_instr(g04_0_list, VSRH, VD, VA, VB); - bind_instr(g04_0_list, VSRO, VD, VA, VB); - bind_instr(g04_0_list, VSRW, VD, VA, VB); - bind_instr(g04_0_list, VSUBCUW, VD, VA, VB); - bind_instr(g04_0_list, VSUBFP, VD, VA, VB); - bind_instr(g04_0_list, VSUBSBS, VD, VA, VB); - bind_instr(g04_0_list, VSUBSHS, VD, VA, VB); - bind_instr(g04_0_list, VSUBSWS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUBM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUBS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUHM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUHS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUWM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUWS, VD, VA, VB); - bind_instr(g04_0_list, VSUMSWS, VD, VA, VB); - bind_instr(g04_0_list, VSUM2SWS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4SBS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4SHS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4UBS, VD, VA, VB); - bind_instr(g04_0_list, VUPKHPX, VD, VB); - bind_instr(g04_0_list, VUPKHSB, VD, VB); - bind_instr(g04_0_list, VUPKHSH, VD, VB); - bind_instr(g04_0_list, VUPKLPX, VD, VB); - bind_instr(g04_0_list, VUPKLSB, VD, VB); - bind_instr(g04_0_list, VUPKLSH, VD, VB); - bind_instr(g04_0_list, VXOR, VD, VA, VB); - - bind_instr(g13_list, MCRF, CRFD, CRFS); - bind_instr(g13_list, BCLR, BO, BI, BH, LK); - bind_instr(g13_list, CRNOR, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRANDC, CRBD, CRBA, CRBB); - bind_instr(g13_list, ISYNC); - bind_instr(g13_list, CRXOR, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRNAND, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRAND, CRBD, CRBA, CRBB); - bind_instr(g13_list, CREQV, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRORC, CRBD, CRBA, CRBB); - bind_instr(g13_list, CROR, CRBD, CRBA, CRBB); - bind_instr(g13_list, BCCTR, BO, BI, BH, LK); - - bind_instr(g1e_list, RLDICL, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDICR, RA, RS, sh, me, RC); - bind_instr(g1e_list, RLDIC, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDIMI, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDC_LR, RA, RS, RB, mb, AA, RC); - - /*0x000*/bind_instr(g1f_list, CMP, CRFD, L_10, RA, RB); - /*0x004*/bind_instr(g1f_list, TW, TO, RA, RB); - /*0x006*/bind_instr(g1f_list, LVSL, VD, RA, RB); - /*0x007*/bind_instr(g1f_list, LVEBX, VD, RA, RB); - /*0x008*/bind_instr_oe(g1f_list, SUBFC, RD, RA, RB, OE, RC); - /*0x009*/bind_instr(g1f_list, MULHDU, RD, RA, RB, RC); - /*0x00a*/bind_instr_oe(g1f_list, ADDC, RD, RA, RB, OE, RC); - /*0x00b*/bind_instr(g1f_list, MULHWU, RD, RA, RB, RC); - /*0x013*/bind_instr(g1f_list, MFOCRF, L_11, RD, CRM); - /*0x014*/bind_instr(g1f_list, LWARX, RD, RA, RB); - /*0x015*/bind_instr(g1f_list, LDX, RD, RA, RB); - /*0x017*/bind_instr(g1f_list, LWZX, RD, RA, RB); - /*0x018*/bind_instr(g1f_list, SLW, RA, RS, RB, RC); - /*0x01a*/bind_instr(g1f_list, CNTLZW, RA, RS, RC); - /*0x01b*/bind_instr(g1f_list, SLD, RA, RS, RB, RC); - /*0x01c*/bind_instr(g1f_list, AND, RA, RS, RB, RC); - /*0x020*/bind_instr(g1f_list, CMPL, CRFD, L_10, RA, RB); - /*0x026*/bind_instr(g1f_list, LVSR, VD, RA, RB); - /*0x027*/bind_instr(g1f_list, LVEHX, VD, RA, RB); - /*0x028*/bind_instr_oe(g1f_list, SUBF, RD, RA, RB, OE, RC); - /*0x035*/bind_instr(g1f_list, LDUX, RD, RA, RB); - /*0x036*/bind_instr(g1f_list, DCBST, RA, RB); - /*0x037*/bind_instr(g1f_list, LWZUX, RD, RA, RB); - /*0x03a*/bind_instr(g1f_list, CNTLZD, RA, RS, RC); - /*0x03c*/bind_instr(g1f_list, ANDC, RA, RS, RB, RC); - /*0x03c*/bind_instr(g1f_list, TD, TO, RA, RB); - /*0x047*/bind_instr(g1f_list, LVEWX, VD, RA, RB); - /*0x049*/bind_instr(g1f_list, MULHD, RD, RA, RB, RC); - /*0x04b*/bind_instr(g1f_list, MULHW, RD, RA, RB, RC); - /*0x054*/bind_instr(g1f_list, LDARX, RD, RA, RB); - /*0x056*/bind_instr(g1f_list, DCBF, RA, RB); - /*0x057*/bind_instr(g1f_list, LBZX, RD, RA, RB); - /*0x067*/bind_instr(g1f_list, LVX, VD, RA, RB); - /*0x068*/bind_instr_oe(g1f_list, NEG, RD, RA, OE, RC); - /*0x077*/bind_instr(g1f_list, LBZUX, RD, RA, RB); - /*0x07c*/bind_instr(g1f_list, NOR, RA, RS, RB, RC); - /*0x087*/bind_instr(g1f_list, STVEBX, VS, RA, RB); - /*0x088*/bind_instr_oe(g1f_list, SUBFE, RD, RA, RB, OE, RC); - /*0x08a*/bind_instr_oe(g1f_list, ADDE, RD, RA, RB, OE, RC); - /*0x090*/bind_instr(g1f_list, MTOCRF, L_11, CRM, RS); - /*0x095*/bind_instr(g1f_list, STDX, RS, RA, RB); - /*0x096*/bind_instr(g1f_list, STWCX_, RS, RA, RB); - /*0x097*/bind_instr(g1f_list, STWX, RS, RA, RB); - /*0x0a7*/bind_instr(g1f_list, STVEHX, VS, RA, RB); - /*0x0b5*/bind_instr(g1f_list, STDUX, RS, RA, RB); - /*0x0b7*/bind_instr(g1f_list, STWUX, RS, RA, RB); - /*0x0c7*/bind_instr(g1f_list, STVEWX, VS, RA, RB); - /*0x0c8*/bind_instr_oe(g1f_list, SUBFZE, RD, RA, OE, RC); - /*0x0ca*/bind_instr_oe(g1f_list, ADDZE, RD, RA, OE, RC); - /*0x0d6*/bind_instr(g1f_list, STDCX_, RS, RA, RB); - /*0x0d7*/bind_instr(g1f_list, STBX, RS, RA, RB); - /*0x0e7*/bind_instr(g1f_list, STVX, VS, RA, RB); - /*0x0e8*/bind_instr_oe(g1f_list, SUBFME, RD, RA, OE, RC); - /*0x0e9*/bind_instr_oe(g1f_list, MULLD, RD, RA, RB, OE, RC); - /*0x0ea*/bind_instr_oe(g1f_list, ADDME, RD, RA, OE, RC); - /*0x0eb*/bind_instr_oe(g1f_list, MULLW, RD, RA, RB, OE, RC); - /*0x0f6*/bind_instr(g1f_list, DCBTST, RA, RB, TH); - /*0x0f7*/bind_instr(g1f_list, STBUX, RS, RA, RB); - /*0x10a*/bind_instr_oe(g1f_list, ADD, RD, RA, RB, OE, RC); - /*0x116*/bind_instr(g1f_list, DCBT, RA, RB, TH); - /*0x117*/bind_instr(g1f_list, LHZX, RD, RA, RB); - /*0x11c*/bind_instr(g1f_list, EQV, RA, RS, RB, RC); - /*0x136*/bind_instr(g1f_list, ECIWX, RD, RA, RB); - /*0x137*/bind_instr(g1f_list, LHZUX, RD, RA, RB); - /*0x13c*/bind_instr(g1f_list, XOR, RA, RS, RB, RC); - /*0x153*/bind_instr(g1f_list, MFSPR, RD, SPR); - /*0x155*/bind_instr(g1f_list, LWAX, RD, RA, RB); - /*0x156*/bind_instr(g1f_list, DST, RA, RB, STRM, L_6); - /*0x157*/bind_instr(g1f_list, LHAX, RD, RA, RB); - /*0x167*/bind_instr(g1f_list, LVXL, VD, RA, RB); - /*0x173*/bind_instr(g1f_list, MFTB, RD, SPR); - /*0x175*/bind_instr(g1f_list, LWAUX, RD, RA, RB); - /*0x176*/bind_instr(g1f_list, DSTST, RA, RB, STRM, L_6); - /*0x177*/bind_instr(g1f_list, LHAUX, RD, RA, RB); - /*0x197*/bind_instr(g1f_list, STHX, RS, RA, RB); - /*0x19c*/bind_instr(g1f_list, ORC, RA, RS, RB, RC); - /*0x1b6*/bind_instr(g1f_list, ECOWX, RS, RA, RB); - /*0x1b7*/bind_instr(g1f_list, STHUX, RS, RA, RB); - /*0x1bc*/bind_instr(g1f_list, OR, RA, RS, RB, RC); - /*0x1c9*/bind_instr_oe(g1f_list, DIVDU, RD, RA, RB, OE, RC); - /*0x1cb*/bind_instr_oe(g1f_list, DIVWU, RD, RA, RB, OE, RC); - /*0x1d3*/bind_instr(g1f_list, MTSPR, SPR, RS); - /*0x1d6*///DCBI - /*0x1dc*/bind_instr(g1f_list, NAND, RA, RS, RB, RC); - /*0x1e7*/bind_instr(g1f_list, STVXL, VS, RA, RB); - /*0x1e9*/bind_instr_oe(g1f_list, DIVD, RD, RA, RB, OE, RC); - /*0x1eb*/bind_instr_oe(g1f_list, DIVW, RD, RA, RB, OE, RC); - /*0x207*/bind_instr(g1f_list, LVLX, VD, RA, RB); - // MULH{D|DU|W|WU} don't use OE, but a real Cell accepts - // opcodes with OE=1 and Rc=0, behaving as if OE was not set. - // OE=1 and Rc=1 causes an invalid instruction exception, but - // we don't worry about that. - static const auto& MULHDUO = make_instr<0x209>(g1f_list, "MULHDUO", &PPUOpcodes::MULHDU, RD, RA, RB, RC); - static const auto& MULHWUO = make_instr<0x20b>(g1f_list, "MULHWUO", &PPUOpcodes::MULHWU, RD, RA, RB, RC); - /*0x214*/bind_instr(g1f_list, LDBRX, RD, RA, RB); - /*0x215*/bind_instr(g1f_list, LSWX, RD, RA, RB); - /*0x216*/bind_instr(g1f_list, LWBRX, RD, RA, RB); - /*0x217*/bind_instr(g1f_list, LFSX, FRD, RA, RB); - /*0x218*/bind_instr(g1f_list, SRW, RA, RS, RB, RC); - /*0x21b*/bind_instr(g1f_list, SRD, RA, RS, RB, RC); - /*0x227*/bind_instr(g1f_list, LVRX, VD, RA, RB); - /*0x237*/bind_instr(g1f_list, LFSUX, FRD, RA, RB); - static const auto& MULHDO = make_instr<0x249>(g1f_list, "MULHDO", &PPUOpcodes::MULHD, RD, RA, RB, RC); - static const auto& MULHWO = make_instr<0x24b>(g1f_list, "MULHWO", &PPUOpcodes::MULHW, RD, RA, RB, RC); - /*0x255*/bind_instr(g1f_list, LSWI, RD, RA, NB); - /*0x256*/bind_instr(g1f_list, SYNC, L_9_10); - /*0x257*/bind_instr(g1f_list, LFDX, FRD, RA, RB); - /*0x277*/bind_instr(g1f_list, LFDUX, FRD, RA, RB); - /*0x287*/bind_instr(g1f_list, STVLX, VS, RA, RB); - /*0x294*/bind_instr(g1f_list, STDBRX, RD, RA, RB); - /*0x296*/bind_instr(g1f_list, STSWX, RS, RA, RB); - /*0x296*/bind_instr(g1f_list, STWBRX, RS, RA, RB); - /*0x297*/bind_instr(g1f_list, STFSX, FRS, RA, RB); - /*0x2a7*/bind_instr(g1f_list, STVRX, VS, RA, RB); - /*0x2b7*/bind_instr(g1f_list, STFSUX, FRS, RA, RB); - /*0x2d5*/bind_instr(g1f_list, STSWI, RS, RA, NB); - /*0x2d7*/bind_instr(g1f_list, STFDX, FRS, RA, RB); - /*0x2d7*/bind_instr(g1f_list, STFDUX, FRS, RA, RB); - /*0x307*/bind_instr(g1f_list, LVLXL, VD, RA, RB); - /*0x316*/bind_instr(g1f_list, LHBRX, RD, RA, RB); - /*0x318*/bind_instr(g1f_list, SRAW, RA, RS, RB, RC); - /*0x31a*/bind_instr(g1f_list, SRAD, RA, RS, RB, RC); - /*0x327*/bind_instr(g1f_list, LVRXL, VD, RA, RB); - /*0x336*/bind_instr(g1f_list, DSS, STRM, L_6); - /*0x338*/bind_instr(g1f_list, SRAWI, RA, RS, SH, RC); - /*0x33a*/bind_instr(g1f_list, SRADI1, RA, RS, sh, RC); - /*0x33b*/bind_instr(g1f_list, SRADI2, RA, RS, sh, RC); - /*0x356*/bind_instr(g1f_list, EIEIO); - /*0x387*/bind_instr(g1f_list, STVLXL, VS, RA, RB); - /*0x396*/bind_instr(g1f_list, STHBRX, RS, RA, RB); - /*0x39a*/bind_instr(g1f_list, EXTSH, RA, RS, RC); - /*0x387*/bind_instr(g1f_list, STVRXL, VS, RA, RB); - /*0x3ba*/bind_instr(g1f_list, EXTSB, RA, RS, RC); - /*0x3d7*/bind_instr(g1f_list, STFIWX, FRS, RA, RB); - /*0x3da*/bind_instr(g1f_list, EXTSW, RA, RS, RC); - /*0x3d6*/bind_instr(g1f_list, ICBI, RA, RB); - /*0x3f6*/bind_instr(g1f_list, DCBZ, RA, RB); - - bind_instr(g3a_list, LD, RD, RA, DS); - bind_instr(g3a_list, LDU, RD, RA, DS); - bind_instr(g3a_list, LWA, RD, RA, DS); - - bind_instr(g3b_list, FDIVS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FSUBS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FADDS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FSQRTS, FRD, FRB, RC); - bind_instr(g3b_list, FRES, FRD, FRB, RC); - bind_instr(g3b_list, FMULS, FRD, FRA, FRC, RC); - bind_instr(g3b_list, FMADDS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FMSUBS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FNMSUBS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FNMADDS, FRD, FRA, FRC, FRB, RC); - - bind_instr(g3e_list, STD, RS, RA, DS); - bind_instr(g3e_list, STDU, RS, RA, DS); - - bind_instr(g3f_list, FSEL, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FMUL, FRD, FRA, FRC, RC); - bind_instr(g3f_list, FMSUB, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FMADD, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FNMSUB, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FNMADD, FRD, FRA, FRC, FRB, RC); - - bind_instr(g3f_0_list, FDIV, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FSUB, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FADD, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FSQRT, FRD, FRB, RC); - bind_instr(g3f_0_list, FRSQRTE, FRD, FRB, RC); - bind_instr(g3f_0_list, FCMPU, CRFD, FRA, FRB); - bind_instr(g3f_0_list, FRSP, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIW, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIWZ, FRD, FRB, RC); - bind_instr(g3f_0_list, FCMPO, CRFD, FRA, FRB); - bind_instr(g3f_0_list, FNEG, FRD, FRB, RC); - bind_instr(g3f_0_list, FMR, FRD, FRB, RC); - bind_instr(g3f_0_list, FNABS, FRD, FRB, RC); - bind_instr(g3f_0_list, FABS, FRD, FRB, RC); - bind_instr(g3f_0_list, FCFID, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTID, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIDZ, FRD, FRB, RC); - - bind_instr(g3f_0_list, MTFSB1, CRBD, RC); - bind_instr(g3f_0_list, MCRFS, CRFD, CRFS); - bind_instr(g3f_0_list, MTFSB0, CRBD, RC); - bind_instr(g3f_0_list, MTFSFI, CRFD, I, RC); - bind_instr(g3f_0_list, MFFS, FRD, RC); - bind_instr(g3f_0_list, MTFSF, FM, FRB, RC); - - enum - { - r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, - r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, - r22, r23, r24, r25, r26, r27, r28, r29, r30, r31 - }; - - enum - { - cr0, cr1, cr2, cr3, cr4, cr5, cr6, cr7 - }; - } - - namespace implicts - { - using namespace lists; - - inline u32 LIS(u32 reg, u32 imm) { return ADDIS(reg, r0, imm); } - inline u32 LI_(u32 reg, u32 imm) { return ADDI(reg, r0, imm); } - inline u32 NOP() { return ORI(r0, r0, 0); } - inline u32 MR(u32 x, u32 y) { return OR(x, y, y, false); } - inline u32 BLR() { return BCLR(0x10 | 0x04, 0, 0, 0); } - inline u32 BCTR() { return BCCTR(0x10 | 0x04, 0, 0, 0); } - inline u32 BCTRL() { return BCCTR(0x10 | 0x04, 0, 0, 1); } - inline u32 MFCTR(u32 reg) { return MFSPR(reg, 9 << 5); } - inline u32 MTCTR(u32 reg) { return MTSPR(9 << 5, reg); } - inline u32 MFLR(u32 reg) { return MFSPR(reg, 8 << 5); } - inline u32 MTLR(u32 reg) { return MTSPR(8 << 5, reg); } - - inline u32 BNE(u32 cr, s32 imm) { return BC(4, 2 | cr << 2, imm, 0, 0); } - inline u32 BEQ(u32 cr, s32 imm) { return BC(12, 2 | cr << 2, imm, 0, 0); } - inline u32 BGT(u32 cr, s32 imm) { return BC(12, 1 | cr << 2, imm, 0, 0); } - - inline u32 BNE(s32 imm) { return BNE(cr0, imm); } - inline u32 BEQ(s32 imm) { return BEQ(cr0, imm); } - inline u32 BGT(s32 imm) { return BGT(cr0, imm); } - - inline u32 CMPDI(u32 cr, u32 reg, u32 imm) { return CMPI(cr, 1, reg, imm); } - inline u32 CMPDI(u32 reg, u32 imm) { return CMPDI(cr0, reg, imm); } - - inline u32 CMPWI(u32 cr, u32 reg, u32 imm) { return CMPI(cr, 0, reg, imm); } - inline u32 CMPWI(u32 reg, u32 imm) { return CMPWI(cr0, reg, imm); } - - inline u32 CMPLDI(u32 cr, u32 reg, u32 imm) { return CMPLI(cr, 1, reg, imm); } - inline u32 CMPLDI(u32 reg, u32 imm) { return CMPLDI(cr0, reg, imm); } - - inline u32 CMPLWI(u32 cr, u32 reg, u32 imm) { return CMPLI(cr, 0, reg, imm); } - inline u32 CMPLWI(u32 reg, u32 imm) { return CMPLWI(cr0, reg, imm); } - - inline u32 EXTRDI(u32 x, u32 y, u32 n, u32 b) { return RLDICL(x, y, b + n, 64 - b, false); } - inline u32 SRDI(u32 x, u32 y, u32 n) { return RLDICL(x, y, 64 - n, n, false); } - inline u32 CLRLDI(u32 x, u32 y, u32 n) { return RLDICL(x, y, 0, n, false); } - } - - using namespace lists; - using namespace implicts; - #undef bind_instr -}; diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp deleted file mode 100644 index d1e621c44d..0000000000 --- a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp +++ /dev/null @@ -1,680 +0,0 @@ -#include "stdafx.h" -#ifdef LLVM_AVAILABLE -#include "Emu/System.h" -#include "Emu/state.h" -#include "Emu/Cell/PPUDisAsm.h" -#include "Emu/Cell/PPULLVMRecompiler.h" -#include "Emu/Memory/Memory.h" -#include "Utilities/VirtualMemory.h" -#ifdef _MSC_VER -#pragma warning(push, 0) -#endif -#include "llvm/Support/TargetSelect.h" -#include "llvm/Support/Host.h" -#include "llvm/Support/ManagedStatic.h" -#include "llvm/ExecutionEngine/GenericValue.h" -#include "llvm/ExecutionEngine/MCJIT.h" -#include "llvm/IR/Intrinsics.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Analysis/Passes.h" -#include "llvm/Analysis/TargetTransformInfo.h" -#include "llvm/Analysis/MemoryDependenceAnalysis.h" -#include "llvm/Analysis/LoopInfo.h" -#include "llvm/Analysis/ScalarEvolution.h" -#include "llvm/IR/Dominators.h" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Vectorize.h" -#include "llvm/MC/MCDisassembler.h" -#include "llvm/IR/Verifier.h" -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -using namespace llvm; -using namespace ppu_recompiler_llvm; - -#ifdef ID_MANAGER_INCLUDED -#error "ID Manager cannot be used in this module" -#endif - -// PS3 can address 32 bits aligned on 4 bytes boundaries : 2^30 pointers -#define VIRTUAL_INSTRUCTION_COUNT 0x40000000 -#define PAGE_SIZE 4096 - -u64 Compiler::s_rotate_mask[64][64]; -bool Compiler::s_rotate_mask_inited = false; - -std::unique_ptr Compiler::create_module(LLVMContext &llvm_context) -{ - const std::vector arg_types = { Type::getInt8PtrTy(llvm_context), Type::getInt64Ty(llvm_context) }; - FunctionType *compiled_function_type = FunctionType::get(Type::getInt32Ty(llvm_context), arg_types, false); - - std::unique_ptr result(new llvm::Module("Module", llvm_context)); - Function *execute_unknown_function = (Function *)result->getOrInsertFunction("execute_unknown_function", compiled_function_type); - execute_unknown_function->setCallingConv(CallingConv::X86_64_Win64); - - Function *execute_unknown_block = (Function *)result->getOrInsertFunction("execute_unknown_block", compiled_function_type); - execute_unknown_block->setCallingConv(CallingConv::X86_64_Win64); - - std::string targetTriple = "x86_64-pc-windows-elf"; - result->setTargetTriple(targetTriple); - - return result; -} - -void Compiler::optimise_module(llvm::Module *module) -{ - llvm::FunctionPassManager fpm(module); - fpm.add(createNoAAPass()); - fpm.add(createBasicAliasAnalysisPass()); - fpm.add(createNoTargetTransformInfoPass()); - fpm.add(createEarlyCSEPass()); - fpm.add(createTailCallEliminationPass()); - fpm.add(createReassociatePass()); - fpm.add(createInstructionCombiningPass()); - fpm.add(new DominatorTreeWrapperPass()); - fpm.add(new MemoryDependenceAnalysis()); - fpm.add(createGVNPass()); - fpm.add(createInstructionCombiningPass()); - fpm.add(new MemoryDependenceAnalysis()); - fpm.add(createDeadStoreEliminationPass()); - fpm.add(new LoopInfo()); - fpm.add(new ScalarEvolution()); - fpm.add(createSLPVectorizerPass()); - fpm.add(createInstructionCombiningPass()); - fpm.add(createCFGSimplificationPass()); - fpm.doInitialization(); - - for (auto I = module->begin(), E = module->end(); I != E; ++I) - fpm.run(*I); -} - - -Compiler::Compiler(LLVMContext *context, llvm::IRBuilder<> *builder, std::unordered_map &function_ptrs) - : m_llvm_context(context), - m_ir_builder(builder), - m_executable_map(function_ptrs) { - - std::vector arg_types; - arg_types.push_back(m_ir_builder->getInt8PtrTy()); - arg_types.push_back(m_ir_builder->getInt64Ty()); - m_compiled_function_type = FunctionType::get(m_ir_builder->getInt32Ty(), arg_types, false); - - if (!s_rotate_mask_inited) { - InitRotateMask(); - s_rotate_mask_inited = true; - } -} - -Compiler::~Compiler() { -} - -void Compiler::initiate_function(const std::string &name) -{ - m_state.function = (Function *)m_module->getOrInsertFunction(name, m_compiled_function_type); - m_state.function->setCallingConv(CallingConv::X86_64_Win64); - auto arg_i = m_state.function->arg_begin(); - arg_i->setName("ppu_state"); - m_state.args[CompileTaskState::Args::State] = arg_i; - (++arg_i)->setName("context"); - m_state.args[CompileTaskState::Args::Context] = arg_i; -} - -void ppu_recompiler_llvm::Compiler::translate_to_llvm_ir(llvm::Module *module, const std::string & name, u32 start_address, u32 instruction_count) -{ - m_module = module; - - m_execute_unknown_function = module->getFunction("execute_unknown_function"); - m_execute_unknown_block = module->getFunction("execute_unknown_block"); - - initiate_function(name); - - // Create the entry block and add code to branch to the first instruction - m_ir_builder->SetInsertPoint(GetBasicBlockFromAddress(0)); - m_ir_builder->CreateBr(GetBasicBlockFromAddress(start_address)); - - // Convert each instruction in the CFG to LLVM IR - std::vector exit_instr_list; - for (u32 instructionAddress = start_address; instructionAddress < start_address + instruction_count * 4; instructionAddress += 4) { - m_state.hit_branch_instruction = false; - m_state.current_instruction_address = instructionAddress; - BasicBlock *instr_bb = GetBasicBlockFromAddress(instructionAddress); - m_ir_builder->SetInsertPoint(instr_bb); - - u32 instr = vm::ps3::read32(instructionAddress); - - Decode(instr); - if (!m_state.hit_branch_instruction) - m_ir_builder->CreateBr(GetBasicBlockFromAddress(instructionAddress + 4)); - } - - // Generate exit logic for all empty blocks - const std::string &default_exit_block_name = GetBasicBlockNameFromAddress(0xFFFFFFFF); - for (BasicBlock &block_i : *m_state.function) { - if (!block_i.getInstList().empty() || block_i.getName() == default_exit_block_name) - continue; - - // Found an empty block - m_state.current_instruction_address = GetAddressFromBasicBlockName(block_i.getName()); - - m_ir_builder->SetInsertPoint(&block_i); - PHINode *exit_instr_i32 = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 0); - exit_instr_list.push_back(exit_instr_i32); - - SetPc(m_ir_builder->getInt32(m_state.current_instruction_address)); - - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusBlockEnded)); - } - - // If the function has a default exit block then generate code for it - BasicBlock *default_exit_bb = GetBasicBlockFromAddress(0xFFFFFFFF, "", false); - if (default_exit_bb) { - m_ir_builder->SetInsertPoint(default_exit_bb); - PHINode *exit_instr_i32 = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 0); - exit_instr_list.push_back(exit_instr_i32); - - m_ir_builder->CreateRet(m_ir_builder->getInt32(0)); - } - - // Add incoming values for all exit instr PHI nodes - for (PHINode *exit_instr_i : exit_instr_list) { - BasicBlock *block = exit_instr_i->getParent(); - for (pred_iterator pred_i = pred_begin(block); pred_i != pred_end(block); pred_i++) { - u32 pred_address = GetAddressFromBasicBlockName((*pred_i)->getName()); - exit_instr_i->addIncoming(m_ir_builder->getInt32(pred_address), *pred_i); - } - } - - std::string verify; - raw_string_ostream verify_ostream(verify); - if (verifyFunction(*m_state.function, &verify_ostream)) { -// m_recompilation_engine.trace() << "Verification failed: " << verify_ostream.str() << "\n"; - } - - m_module = nullptr; - m_state.function = nullptr; -} - -void Compiler::Decode(const u32 code) { - (*PPU_instr::main_list)(this, code); -} - -std::mutex RecompilationEngine::s_mutex; -std::shared_ptr RecompilationEngine::s_the_instance = nullptr; - -RecompilationEngine::RecompilationEngine() - : m_log(nullptr) - , m_currentId(0) - , m_last_cache_clear_time(std::chrono::high_resolution_clock::now()) - , m_llvm_context(getGlobalContext()) - , m_ir_builder(getGlobalContext()) { - InitializeNativeTarget(); - InitializeNativeTargetAsmPrinter(); - InitializeNativeTargetDisassembler(); - - FunctionCache = (ExecutableStorageType *)memory_helper::reserve_memory(VIRTUAL_INSTRUCTION_COUNT * sizeof(ExecutableStorageType)); - // Each char can store 8 page status - FunctionCachePagesCommited = (char *)malloc(VIRTUAL_INSTRUCTION_COUNT / (8 * PAGE_SIZE)); - if (FunctionCachePagesCommited == nullptr) - throw EXCEPTION("Memory error"); - memset(FunctionCachePagesCommited, 0, VIRTUAL_INSTRUCTION_COUNT / (8 * PAGE_SIZE)); -} - -RecompilationEngine::~RecompilationEngine() { - m_executable_storage.clear(); - memory_helper::free_reserved_memory(FunctionCache, VIRTUAL_INSTRUCTION_COUNT * sizeof(ExecutableStorageType)); - free(FunctionCachePagesCommited); -} - -bool RecompilationEngine::isAddressCommited(u32 address) const -{ - size_t offset = address * sizeof(ExecutableStorageType); - size_t page = offset / 4096; - // Since bool is stored in char, the char index is page / 8 (or page >> 3) - // and we shr the value with the remaining bits (page & 7) - return (FunctionCachePagesCommited[page >> 3] >> (page & 7)) & 1; -} - -void RecompilationEngine::commitAddress(u32 address) -{ - size_t offset = address * sizeof(ExecutableStorageType); - size_t page = offset / 4096; - memory_helper::commit_page_memory((u8*)FunctionCache + page * 4096, 4096); - // Reverse of isAddressCommited : we set the (page & 7)th bit of (page / 8) th char - // in the array - FunctionCachePagesCommited[page >> 3] |= (1 << (page & 7)); -} - -const Executable RecompilationEngine::GetCompiledExecutableIfAvailable(u32 address) const -{ - if (!isAddressCommited(address / 4)) - return nullptr; - u32 id = FunctionCache[address / 4].second; - if (rpcs3::state.config.core.llvm.exclusion_range.value() && - (id >= rpcs3::state.config.core.llvm.min_id.value() && id <= rpcs3::state.config.core.llvm.max_id.value())) - return nullptr; - return FunctionCache[address / 4].first; -} - -void RecompilationEngine::NotifyBlockStart(u32 address) { - { - std::lock_guard lock(m_pending_address_start_lock); - if (m_pending_address_start.size() > 10000) - m_pending_address_start.clear(); - m_pending_address_start.push_back(address); - } - - if (!is_started()) { - start(); - } - - cv.notify_one(); - // TODO: Increase the priority of the recompilation engine thread -} - -raw_fd_ostream & RecompilationEngine::Log() { - if (!m_log) { - std::error_code error; - m_log = new raw_fd_ostream("PPULLVMRecompiler.log", error, sys::fs::F_Text); - m_log->SetUnbuffered(); - } - - return *m_log; -} - -void RecompilationEngine::on_task() { - std::chrono::nanoseconds idling_time(0); - std::chrono::nanoseconds recompiling_time(0); - - auto start = std::chrono::high_resolution_clock::now(); - while (!Emu.IsStopped()) { - bool work_done_this_iteration = false; - std::list m_current_execution_traces; - - { - std::lock_guard lock(m_pending_address_start_lock); - m_current_execution_traces.swap(m_pending_address_start); - } - - if (!m_current_execution_traces.empty()) { - for (u32 address : m_current_execution_traces) - work_done_this_iteration |= IncreaseHitCounterAndBuild(address); - } - - if (!work_done_this_iteration) { - // Wait a few ms for something to happen - auto idling_start = std::chrono::high_resolution_clock::now(); - std::unique_lock lock(mutex); - cv.wait_for(lock, std::chrono::milliseconds(10)); - auto idling_end = std::chrono::high_resolution_clock::now(); - idling_time += std::chrono::duration_cast(idling_end - idling_start); - } - } - - s_the_instance = nullptr; // Can cause deadlock if this is the last instance. Need to fix this. -} - -bool RecompilationEngine::IncreaseHitCounterAndBuild(u32 address) { - auto It = m_block_table.find(address); - if (It == m_block_table.end()) - It = m_block_table.emplace(address, BlockEntry(address)).first; - BlockEntry &block = It->second; - if (!block.is_compiled) { - block.num_hits++; - if (block.num_hits >= rpcs3::state.config.core.llvm.threshold.value()) { - CompileBlock(block); - return true; - } - } - return false; -} - -extern void execute_ppu_func_by_index(PPUThread& ppu, u32 id); -extern void execute_syscall_by_index(PPUThread& ppu, u64 code); - -static u32 -wrappedExecutePPUFuncByIndex(PPUThread &CPU, u32 index) noexcept { - try - { - execute_ppu_func_by_index(CPU, index); - return ExecutionStatus::ExecutionStatusBlockEnded; - } - catch (...) - { - CPU.pending_exception = std::current_exception(); - return ExecutionStatus::ExecutionStatusPropagateException; - } -} - -static u32 wrappedDoSyscall(PPUThread &CPU, u64 code) noexcept { - try - { - execute_syscall_by_index(CPU, code); - return ExecutionStatus::ExecutionStatusBlockEnded; - } - catch (...) - { - CPU.pending_exception = std::current_exception(); - return ExecutionStatus::ExecutionStatusPropagateException; - } -} - -static void wrapped_fast_stop(PPUThread &CPU) -{ - CPU.fast_stop(); -} - -static void wrapped_trap(PPUThread &CPU, u32) noexcept { - try - { - throw EXCEPTION("trap"); - } - catch (...) - { - CPU.pending_exception = std::current_exception(); - } -} - -std::pair RecompilationEngine::compile(const std::string & name, u32 start_address, u32 instruction_count) { - std::unique_ptr module = Compiler::create_module(m_llvm_context); - - std::unordered_map function_ptrs; - function_ptrs["execute_unknown_function"] = reinterpret_cast(CPUHybridDecoderRecompiler::ExecuteFunction); - function_ptrs["execute_unknown_block"] = reinterpret_cast(CPUHybridDecoderRecompiler::ExecuteTillReturn); - function_ptrs["PollStatus"] = reinterpret_cast(CPUHybridDecoderRecompiler::PollStatus); - function_ptrs["PPUThread.fast_stop"] = reinterpret_cast(wrapped_fast_stop); - function_ptrs["vm.reservation_acquire"] = reinterpret_cast(vm::reservation_acquire); - function_ptrs["vm.reservation_update"] = reinterpret_cast(vm::reservation_update); - function_ptrs["get_timebased_time"] = reinterpret_cast(get_timebased_time); - function_ptrs["wrappedExecutePPUFuncByIndex"] = reinterpret_cast(wrappedExecutePPUFuncByIndex); - function_ptrs["wrappedDoSyscall"] = reinterpret_cast(wrappedDoSyscall); - function_ptrs["trap"] = reinterpret_cast(wrapped_trap); - -#define REGISTER_FUNCTION_PTR(name) \ - function_ptrs[#name] = reinterpret_cast(PPUInterpreter::name##_impl); - - MACRO_PPU_INST_MAIN_EXPANDERS(REGISTER_FUNCTION_PTR) - MACRO_PPU_INST_G_13_EXPANDERS(REGISTER_FUNCTION_PTR) - MACRO_PPU_INST_G_1E_EXPANDERS(REGISTER_FUNCTION_PTR) - MACRO_PPU_INST_G_1F_EXPANDERS(REGISTER_FUNCTION_PTR) - MACRO_PPU_INST_G_3A_EXPANDERS(REGISTER_FUNCTION_PTR) - MACRO_PPU_INST_G_3E_EXPANDERS(REGISTER_FUNCTION_PTR) - - Compiler(&m_llvm_context, &m_ir_builder, function_ptrs) - .translate_to_llvm_ir(module.get(), name, start_address, instruction_count); - - llvm::Module *module_ptr = module.get(); - - Log() << *module_ptr; - Compiler::optimise_module(module_ptr); - - llvm::ExecutionEngine *execution_engine = - EngineBuilder(std::move(module)) - .setEngineKind(EngineKind::JIT) - .setMCJITMemoryManager(std::unique_ptr(new CustomSectionMemoryManager(function_ptrs))) - .setOptLevel(llvm::CodeGenOpt::Aggressive) - .setMCPU("nehalem") - .create(); - module_ptr->setDataLayout(execution_engine->getDataLayout()); - - // Translate to machine code - execution_engine->finalizeObject(); - - Function *llvm_function = module_ptr->getFunction(name); - void *function = execution_engine->getPointerToFunction(llvm_function); - - /* m_recompilation_engine.trace() << "\nDisassembly:\n"; - auto disassembler = LLVMCreateDisasm(sys::getProcessTriple().c_str(), nullptr, 0, nullptr, nullptr); - for (size_t pc = 0; pc < mci.size();) { - char str[1024]; - - auto size = LLVMDisasmInstruction(disassembler, ((u8 *)mci.address()) + pc, mci.size() - pc, (uint64_t)(((u8 *)mci.address()) + pc), str, sizeof(str)); - m_recompilation_engine.trace() << fmt::format("0x%08X: ", (u64)(((u8 *)mci.address()) + pc)) << str << '\n'; - pc += size; - } - - LLVMDisasmDispose(disassembler);*/ - - assert(function != nullptr); - return std::make_pair((Executable)function, execution_engine); -} - -/** -* This code is inspired from Dolphin PPC Analyst -*/ -inline s32 SignExt16(s16 x) { return (s32)(s16)x; } -inline s32 SignExt26(u32 x) { return x & 0x2000000 ? (s32)(x | 0xFC000000) : (s32)(x); } - -bool RecompilationEngine::AnalyseBlock(BlockEntry &functionData, size_t maxSize) -{ - u32 startAddress = functionData.address; - u32 farthestBranchTarget = startAddress; - functionData.instructionCount = 0; - functionData.calledFunctions.clear(); - functionData.is_analysed = true; - functionData.is_compilable_function = true; - Log() << "Analysing " << (void*)(uint64_t)startAddress << "hit " << functionData.num_hits << "\n"; - // Used to decode instructions - PPUDisAsm dis_asm(CPUDisAsm_DumpMode); - dis_asm.offset = vm::ps3::_ptr(startAddress); - for (u32 instructionAddress = startAddress; instructionAddress < startAddress + maxSize; instructionAddress += 4) - { - u32 instr = vm::ps3::read32((u32)instructionAddress); - - dis_asm.dump_pc = instructionAddress - startAddress; - (*PPU_instr::main_list)(&dis_asm, instr); - Log() << dis_asm.last_opcode; - functionData.instructionCount++; - if (instr == PPU_instr::implicts::BLR() && instructionAddress >= farthestBranchTarget && functionData.is_compilable_function) - { - Log() << "Analysis: Block is compilable into a function \n"; - return true; - } - else if (PPU_instr::fields::GD_13(instr) == PPU_opcodes::G_13Opcodes::BCCTR) - { - if (!PPU_instr::fields::LK(instr)) - { - Log() << "Analysis: indirect branching found \n"; - functionData.is_compilable_function = false; - return true; - } - } - else if (PPU_instr::fields::OPCD(instr) == PPU_opcodes::PPU_MainOpcodes::BC) - { - u32 target = SignExt16(PPU_instr::fields::BD(instr)); - if (!PPU_instr::fields::AA(instr)) // Absolute address - target += (u32)instructionAddress; - if (target > farthestBranchTarget && !PPU_instr::fields::LK(instr)) - farthestBranchTarget = target; - } - else if (PPU_instr::fields::OPCD(instr) == PPU_opcodes::PPU_MainOpcodes::B) - { - u32 target = SignExt26(PPU_instr::fields::LL(instr)); - if (!PPU_instr::fields::AA(instr)) // Absolute address - target += (u32)instructionAddress; - - if (!PPU_instr::fields::LK(instr)) - { - if (target < startAddress) - { - Log() << "Analysis: branch to previous block\n"; - functionData.is_compilable_function = false; - return true; - } - else if (target > farthestBranchTarget) - farthestBranchTarget = target; - } - else - functionData.calledFunctions.insert(target); - } - } - Log() << "Analysis: maxSize reached \n"; - functionData.is_compilable_function = false; - return true; -} - -void RecompilationEngine::CompileBlock(BlockEntry & block_entry) { - if (block_entry.is_analysed) - return; - - if (!AnalyseBlock(block_entry)) - return; - Log() << "Compile: " << block_entry.ToString() << "\n"; - - { - // We create a lock here so that data are properly stored at the end of the function. - /// Lock for accessing compiler - std::mutex local_mutex; - std::unique_lock lock(local_mutex); - - const std::pair &compileResult = - compile(fmt::format("fn_0x%08X", block_entry.address), block_entry.address, block_entry.instructionCount); - - if (!isAddressCommited(block_entry.address / 4)) - commitAddress(block_entry.address / 4); - - m_executable_storage.push_back(std::unique_ptr(compileResult.second)); - Log() << "Associating " << (void*)(uint64_t)block_entry.address << " with ID " << m_currentId << "\n"; - FunctionCache[block_entry.address / 4] = std::make_pair(compileResult.first, m_currentId); - m_currentId++; - block_entry.is_compiled = true; - } -} - -std::shared_ptr RecompilationEngine::GetInstance() { - std::lock_guard lock(s_mutex); - - if (s_the_instance == nullptr) { - s_the_instance = std::shared_ptr(new RecompilationEngine()); - } - - return s_the_instance; -} - -ppu_recompiler_llvm::CPUHybridDecoderRecompiler::CPUHybridDecoderRecompiler(PPUThread & ppu) - : m_ppu(ppu) - , m_interpreter(new PPUInterpreter(ppu)) - , m_decoder(m_interpreter) - , m_recompilation_engine(RecompilationEngine::GetInstance()) { -} - -ppu_recompiler_llvm::CPUHybridDecoderRecompiler::~CPUHybridDecoderRecompiler() { -} - -u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::DecodeMemory(const u32 address) { - ExecuteFunction(&m_ppu, 0); - if (m_ppu.pending_exception != nullptr) { - std::exception_ptr exn = m_ppu.pending_exception; - m_ppu.pending_exception = nullptr; - std::rethrow_exception(exn); - } - return 0; -} - -u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::ExecuteFunction(PPUThread * ppu_state, u64 context) { - auto execution_engine = (CPUHybridDecoderRecompiler *)ppu_state->GetDecoder(); - if (ExecuteTillReturn(ppu_state, 0) == ExecutionStatus::ExecutionStatusPropagateException) - return ExecutionStatus::ExecutionStatusPropagateException; - return ExecutionStatus::ExecutionStatusReturn; -} - -/// Get the branch type from a branch instruction -static BranchType GetBranchTypeFromInstruction(u32 instruction) -{ - u32 instructionOpcode = PPU_instr::fields::OPCD(instruction); - u32 lk = instruction & 1; - - if (instructionOpcode == PPU_opcodes::PPU_MainOpcodes::B || - instructionOpcode == PPU_opcodes::PPU_MainOpcodes::BC) - return lk ? BranchType::FunctionCall : BranchType::LocalBranch; - if (instructionOpcode == PPU_opcodes::PPU_MainOpcodes::G_13) { - u32 G13Opcode = PPU_instr::fields::GD_13(instruction); - if (G13Opcode == PPU_opcodes::G_13Opcodes::BCLR) - return lk ? BranchType::FunctionCall : BranchType::Return; - if (G13Opcode == PPU_opcodes::G_13Opcodes::BCCTR) - return lk ? BranchType::FunctionCall : BranchType::LocalBranch; - return BranchType::NonBranch; - } - if (instructionOpcode == PPU_opcodes::PPU_MainOpcodes::HACK && (instruction & EIF_PERFORM_BLR)) // classify HACK instruction - return instruction & EIF_USE_BRANCH ? BranchType::FunctionCall : BranchType::Return; - if (instructionOpcode == PPU_opcodes::PPU_MainOpcodes::HACK && (instruction & EIF_USE_BRANCH)) - return BranchType::LocalBranch; - return BranchType::NonBranch; -} - -u32 ppu_recompiler_llvm::CPUHybridDecoderRecompiler::ExecuteTillReturn(PPUThread * ppu_state, u64 context) { - CPUHybridDecoderRecompiler *execution_engine = (CPUHybridDecoderRecompiler *)ppu_state->GetDecoder(); - - // A block is a sequence of contiguous address. - bool previousInstContigousAndInterp = false; - - while (PollStatus(ppu_state) == false) { - const Executable executable = execution_engine->m_recompilation_engine->GetCompiledExecutableIfAvailable(ppu_state->PC); - if (executable) - { - auto entry = ppu_state->PC; - u32 exit = (u32)executable(ppu_state, 0); - if (exit == ExecutionStatus::ExecutionStatusReturn) - { - if (Emu.GetCPUThreadStop() == ppu_state->PC) ppu_state->fast_stop(); - return ExecutionStatus::ExecutionStatusReturn; - } - if (exit == ExecutionStatus::ExecutionStatusPropagateException) - return ExecutionStatus::ExecutionStatusPropagateException; - previousInstContigousAndInterp = false; - continue; - } - // if previousInstContigousAndInterp is true, ie previous step was either a compiled block or a branch inst - // that caused a "gap" in instruction flow, we notify a new block. - if (!previousInstContigousAndInterp) - execution_engine->m_recompilation_engine->NotifyBlockStart(ppu_state->PC); - u32 instruction = vm::ps3::read32(ppu_state->PC); - u32 oldPC = ppu_state->PC; - try - { - execution_engine->m_decoder.Decode(instruction); - } - catch (...) - { - ppu_state->pending_exception = std::current_exception(); - return ExecutionStatus::ExecutionStatusPropagateException; - } - previousInstContigousAndInterp = (oldPC == ppu_state->PC); - auto branch_type = ppu_state->PC != oldPC ? GetBranchTypeFromInstruction(instruction) : BranchType::NonBranch; - ppu_state->PC += 4; - - switch (branch_type) { - case BranchType::Return: - if (Emu.GetCPUThreadStop() == ppu_state->PC) ppu_state->fast_stop(); - return 0; - case BranchType::FunctionCall: { - u32 status = ExecuteFunction(ppu_state, 0); - if (status == ExecutionStatus::ExecutionStatusPropagateException) - return ExecutionStatus::ExecutionStatusPropagateException; - break; - } - case BranchType::LocalBranch: - break; - case BranchType::NonBranch: - break; - default: - assert(0); - break; - } - } - - return 0; -} - -bool ppu_recompiler_llvm::CPUHybridDecoderRecompiler::PollStatus(PPUThread * ppu_state) { - try - { - return ppu_state->check_status(); - } - catch (...) - { - ppu_state->pending_exception = std::current_exception(); - return true; - } -} -#endif // LLVM_AVAILABLE diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.h b/rpcs3/Emu/Cell/PPULLVMRecompiler.h deleted file mode 100644 index 1b882f68d5..0000000000 --- a/rpcs3/Emu/Cell/PPULLVMRecompiler.h +++ /dev/null @@ -1,946 +0,0 @@ -#ifndef PPU_LLVM_RECOMPILER_H -#define PPU_LLVM_RECOMPILER_H - -#ifdef LLVM_AVAILABLE -#define PPU_LLVM_RECOMPILER 1 - -#include -#include "Emu/Cell/PPUDecoder.h" -#include "Emu/Cell/PPUThread.h" -#include "Emu/Cell/PPUInterpreter.h" -#ifdef _MSC_VER -#pragma warning(push, 0) -#endif -#include "llvm/ExecutionEngine/ExecutionEngine.h" -#include "llvm/ExecutionEngine/SectionMemoryManager.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/Module.h" -#include "llvm/IR/GlobalVariable.h" -#include "llvm/PassManager.h" -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -namespace ppu_recompiler_llvm { - enum ExecutionStatus - { - ExecutionStatusReturn = 0, ///< Block has hit a return, caller can continue execution - ExecutionStatusBlockEnded, ///< Block has been executed but no return was hit, at least another block must be executed before caller can continue - ExecutionStatusPropagateException, ///< an exception was thrown - }; - - class Compiler; - class RecompilationEngine; - class ExecutionEngine; - struct PPUState; - - enum class BranchType { - NonBranch, - LocalBranch, - FunctionCall, - Return, - }; - - /// Pointer to an executable - typedef u32(*Executable)(PPUThread * ppu_state, u64 context); - - /// Parses PPU opcodes and translate them into llvm ir. - class Compiler : protected PPUOpcodes, protected PPCDecoder { - public: - Compiler(llvm::LLVMContext *context, llvm::IRBuilder<> *builder, std::unordered_map &function_ptrs); - - Compiler(const Compiler&) = delete; // Delete copy/move constructors and copy/move operators - - virtual ~Compiler(); - - /// Create a module setting target triples and some callbacks - static std::unique_ptr create_module(llvm::LLVMContext &llvm_context); - - /// Create a function called name in module and populates it by translating block at start_address with instruction_count length. - void translate_to_llvm_ir(llvm::Module *module, const std::string & name, u32 start_address, u32 instruction_count); - - static void optimise_module(llvm::Module *module); - - protected: - void Decode(const u32 code) override; - - void NULL_OP() override; - void NOP() override; - - void TDI(u32 to, u32 ra, s32 simm16) override; - void TWI(u32 to, u32 ra, s32 simm16) override; - - void MFVSCR(u32 vd) override; - void MTVSCR(u32 vb) override; - void VADDCUW(u32 vd, u32 va, u32 vb) override; - void VADDFP(u32 vd, u32 va, u32 vb) override; - void VADDSBS(u32 vd, u32 va, u32 vb) override; - void VADDSHS(u32 vd, u32 va, u32 vb) override; - void VADDSWS(u32 vd, u32 va, u32 vb) override; - void VADDUBM(u32 vd, u32 va, u32 vb) override; - void VADDUBS(u32 vd, u32 va, u32 vb) override; - void VADDUHM(u32 vd, u32 va, u32 vb) override; - void VADDUHS(u32 vd, u32 va, u32 vb) override; - void VADDUWM(u32 vd, u32 va, u32 vb) override; - void VADDUWS(u32 vd, u32 va, u32 vb) override; - void VAND(u32 vd, u32 va, u32 vb) override; - void VANDC(u32 vd, u32 va, u32 vb) override; - void VAVGSB(u32 vd, u32 va, u32 vb) override; - void VAVGSH(u32 vd, u32 va, u32 vb) override; - void VAVGSW(u32 vd, u32 va, u32 vb) override; - void VAVGUB(u32 vd, u32 va, u32 vb) override; - void VAVGUH(u32 vd, u32 va, u32 vb) override; - void VAVGUW(u32 vd, u32 va, u32 vb) override; - void VCFSX(u32 vd, u32 uimm5, u32 vb) override; - void VCFUX(u32 vd, u32 uimm5, u32 vb) override; - void VCMPBFP(u32 vd, u32 va, u32 vb) override; - void VCMPBFP_(u32 vd, u32 va, u32 vb) override; - void VCMPEQFP(u32 vd, u32 va, u32 vb) override; - void VCMPEQFP_(u32 vd, u32 va, u32 vb) override; - void VCMPEQUB(u32 vd, u32 va, u32 vb) override; - void VCMPEQUB_(u32 vd, u32 va, u32 vb) override; - void VCMPEQUH(u32 vd, u32 va, u32 vb) override; - void VCMPEQUH_(u32 vd, u32 va, u32 vb) override; - void VCMPEQUW(u32 vd, u32 va, u32 vb) override; - void VCMPEQUW_(u32 vd, u32 va, u32 vb) override; - void VCMPGEFP(u32 vd, u32 va, u32 vb) override; - void VCMPGEFP_(u32 vd, u32 va, u32 vb) override; - void VCMPGTFP(u32 vd, u32 va, u32 vb) override; - void VCMPGTFP_(u32 vd, u32 va, u32 vb) override; - void VCMPGTSB(u32 vd, u32 va, u32 vb) override; - void VCMPGTSB_(u32 vd, u32 va, u32 vb) override; - void VCMPGTSH(u32 vd, u32 va, u32 vb) override; - void VCMPGTSH_(u32 vd, u32 va, u32 vb) override; - void VCMPGTSW(u32 vd, u32 va, u32 vb) override; - void VCMPGTSW_(u32 vd, u32 va, u32 vb) override; - void VCMPGTUB(u32 vd, u32 va, u32 vb) override; - void VCMPGTUB_(u32 vd, u32 va, u32 vb) override; - void VCMPGTUH(u32 vd, u32 va, u32 vb) override; - void VCMPGTUH_(u32 vd, u32 va, u32 vb) override; - void VCMPGTUW(u32 vd, u32 va, u32 vb) override; - void VCMPGTUW_(u32 vd, u32 va, u32 vb) override; - void VCTSXS(u32 vd, u32 uimm5, u32 vb) override; - void VCTUXS(u32 vd, u32 uimm5, u32 vb) override; - void VEXPTEFP(u32 vd, u32 vb) override; - void VLOGEFP(u32 vd, u32 vb) override; - void VMADDFP(u32 vd, u32 va, u32 vc, u32 vb) override; - void VMAXFP(u32 vd, u32 va, u32 vb) override; - void VMAXSB(u32 vd, u32 va, u32 vb) override; - void VMAXSH(u32 vd, u32 va, u32 vb) override; - void VMAXSW(u32 vd, u32 va, u32 vb) override; - void VMAXUB(u32 vd, u32 va, u32 vb) override; - void VMAXUH(u32 vd, u32 va, u32 vb) override; - void VMAXUW(u32 vd, u32 va, u32 vb) override; - void VMHADDSHS(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMHRADDSHS(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMINFP(u32 vd, u32 va, u32 vb) override; - void VMINSB(u32 vd, u32 va, u32 vb) override; - void VMINSH(u32 vd, u32 va, u32 vb) override; - void VMINSW(u32 vd, u32 va, u32 vb) override; - void VMINUB(u32 vd, u32 va, u32 vb) override; - void VMINUH(u32 vd, u32 va, u32 vb) override; - void VMINUW(u32 vd, u32 va, u32 vb) override; - void VMLADDUHM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMRGHB(u32 vd, u32 va, u32 vb) override; - void VMRGHH(u32 vd, u32 va, u32 vb) override; - void VMRGHW(u32 vd, u32 va, u32 vb) override; - void VMRGLB(u32 vd, u32 va, u32 vb) override; - void VMRGLH(u32 vd, u32 va, u32 vb) override; - void VMRGLW(u32 vd, u32 va, u32 vb) override; - void VMSUMMBM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMSUMSHM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMSUMSHS(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMSUMUBM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMSUMUHM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMSUMUHS(u32 vd, u32 va, u32 vb, u32 vc) override; - void VMULESB(u32 vd, u32 va, u32 vb) override; - void VMULESH(u32 vd, u32 va, u32 vb) override; - void VMULEUB(u32 vd, u32 va, u32 vb) override; - void VMULEUH(u32 vd, u32 va, u32 vb) override; - void VMULOSB(u32 vd, u32 va, u32 vb) override; - void VMULOSH(u32 vd, u32 va, u32 vb) override; - void VMULOUB(u32 vd, u32 va, u32 vb) override; - void VMULOUH(u32 vd, u32 va, u32 vb) override; - void VNMSUBFP(u32 vd, u32 va, u32 vc, u32 vb) override; - void VNOR(u32 vd, u32 va, u32 vb) override; - void VOR(u32 vd, u32 va, u32 vb) override; - void VPERM(u32 vd, u32 va, u32 vb, u32 vc) override; - void VPKPX(u32 vd, u32 va, u32 vb) override; - void VPKSHSS(u32 vd, u32 va, u32 vb) override; - void VPKSHUS(u32 vd, u32 va, u32 vb) override; - void VPKSWSS(u32 vd, u32 va, u32 vb) override; - void VPKSWUS(u32 vd, u32 va, u32 vb) override; - void VPKUHUM(u32 vd, u32 va, u32 vb) override; - void VPKUHUS(u32 vd, u32 va, u32 vb) override; - void VPKUWUM(u32 vd, u32 va, u32 vb) override; - void VPKUWUS(u32 vd, u32 va, u32 vb) override; - void VREFP(u32 vd, u32 vb) override; - void VRFIM(u32 vd, u32 vb) override; - void VRFIN(u32 vd, u32 vb) override; - void VRFIP(u32 vd, u32 vb) override; - void VRFIZ(u32 vd, u32 vb) override; - void VRLB(u32 vd, u32 va, u32 vb) override; - void VRLH(u32 vd, u32 va, u32 vb) override; - void VRLW(u32 vd, u32 va, u32 vb) override; - void VRSQRTEFP(u32 vd, u32 vb) override; - void VSEL(u32 vd, u32 va, u32 vb, u32 vc) override; - void VSL(u32 vd, u32 va, u32 vb) override; - void VSLB(u32 vd, u32 va, u32 vb) override; - void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) override; - void VSLH(u32 vd, u32 va, u32 vb) override; - void VSLO(u32 vd, u32 va, u32 vb) override; - void VSLW(u32 vd, u32 va, u32 vb) override; - void VSPLTB(u32 vd, u32 uimm5, u32 vb) override; - void VSPLTH(u32 vd, u32 uimm5, u32 vb) override; - void VSPLTISB(u32 vd, s32 simm5) override; - void VSPLTISH(u32 vd, s32 simm5) override; - void VSPLTISW(u32 vd, s32 simm5) override; - void VSPLTW(u32 vd, u32 uimm5, u32 vb) override; - void VSR(u32 vd, u32 va, u32 vb) override; - void VSRAB(u32 vd, u32 va, u32 vb) override; - void VSRAH(u32 vd, u32 va, u32 vb) override; - void VSRAW(u32 vd, u32 va, u32 vb) override; - void VSRB(u32 vd, u32 va, u32 vb) override; - void VSRH(u32 vd, u32 va, u32 vb) override; - void VSRO(u32 vd, u32 va, u32 vb) override; - void VSRW(u32 vd, u32 va, u32 vb) override; - void VSUBCUW(u32 vd, u32 va, u32 vb) override; - void VSUBFP(u32 vd, u32 va, u32 vb) override; - void VSUBSBS(u32 vd, u32 va, u32 vb) override; - void VSUBSHS(u32 vd, u32 va, u32 vb) override; - void VSUBSWS(u32 vd, u32 va, u32 vb) override; - void VSUBUBM(u32 vd, u32 va, u32 vb) override; - void VSUBUBS(u32 vd, u32 va, u32 vb) override; - void VSUBUHM(u32 vd, u32 va, u32 vb) override; - void VSUBUHS(u32 vd, u32 va, u32 vb) override; - void VSUBUWM(u32 vd, u32 va, u32 vb) override; - void VSUBUWS(u32 vd, u32 va, u32 vb) override; - void VSUMSWS(u32 vd, u32 va, u32 vb) override; - void VSUM2SWS(u32 vd, u32 va, u32 vb) override; - void VSUM4SBS(u32 vd, u32 va, u32 vb) override; - void VSUM4SHS(u32 vd, u32 va, u32 vb) override; - void VSUM4UBS(u32 vd, u32 va, u32 vb) override; - void VUPKHPX(u32 vd, u32 vb) override; - void VUPKHSB(u32 vd, u32 vb) override; - void VUPKHSH(u32 vd, u32 vb) override; - void VUPKLPX(u32 vd, u32 vb) override; - void VUPKLSB(u32 vd, u32 vb) override; - void VUPKLSH(u32 vd, u32 vb) override; - void VXOR(u32 vd, u32 va, u32 vb) override; - void MULLI(u32 rd, u32 ra, s32 simm16) override; - void SUBFIC(u32 rd, u32 ra, s32 simm16) override; - void CMPLI(u32 bf, u32 l, u32 ra, u32 uimm16) override; - void CMPI(u32 bf, u32 l, u32 ra, s32 simm16) override; - void ADDIC(u32 rd, u32 ra, s32 simm16) override; - void ADDIC_(u32 rd, u32 ra, s32 simm16) override; - void ADDI(u32 rd, u32 ra, s32 simm16) override; - void ADDIS(u32 rd, u32 ra, s32 simm16) override; - void BC(u32 bo, u32 bi, s32 bd, u32 aa, u32 lk) override; - void HACK(u32 id) override; - void SC(u32 sc_code) override; - void B(s32 ll, u32 aa, u32 lk) override; - void MCRF(u32 crfd, u32 crfs) override; - void BCLR(u32 bo, u32 bi, u32 bh, u32 lk) override; - void CRNOR(u32 bt, u32 ba, u32 bb) override; - void CRANDC(u32 bt, u32 ba, u32 bb) override; - void ISYNC() override; - void CRXOR(u32 bt, u32 ba, u32 bb) override; - void CRNAND(u32 bt, u32 ba, u32 bb) override; - void CRAND(u32 bt, u32 ba, u32 bb) override; - void CREQV(u32 bt, u32 ba, u32 bb) override; - void CRORC(u32 bt, u32 ba, u32 bb) override; - void CROR(u32 bt, u32 ba, u32 bb) override; - void BCCTR(u32 bo, u32 bi, u32 bh, u32 lk) override; - void RLWIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, u32 rc) override; - void RLWINM(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, u32 rc) override; - void RLWNM(u32 ra, u32 rs, u32 rb, u32 MB, u32 ME, u32 rc) override; - void ORI(u32 rs, u32 ra, u32 uimm16) override; - void ORIS(u32 rs, u32 ra, u32 uimm16) override; - void XORI(u32 ra, u32 rs, u32 uimm16) override; - void XORIS(u32 ra, u32 rs, u32 uimm16) override; - void ANDI_(u32 ra, u32 rs, u32 uimm16) override; - void ANDIS_(u32 ra, u32 rs, u32 uimm16) override; - void RLDICL(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) override; - void RLDICR(u32 ra, u32 rs, u32 sh, u32 me, u32 rc) override; - void RLDIC(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) override; - void RLDIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) override; - void RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, u32 is_r, u32 rc) override; - void CMP(u32 crfd, u32 l, u32 ra, u32 rb) override; - void TW(u32 to, u32 ra, u32 rb) override; - void LVSL(u32 vd, u32 ra, u32 rb) override; - void LVEBX(u32 vd, u32 ra, u32 rb) override; - void SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void MULHDU(u32 rd, u32 ra, u32 rb, u32 rc) override; - void ADDC(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void MULHWU(u32 rd, u32 ra, u32 rb, u32 rc) override; - void MFOCRF(u32 a, u32 rd, u32 crm) override; - void LWARX(u32 rd, u32 ra, u32 rb) override; - void LDX(u32 ra, u32 rs, u32 rb) override; - void LWZX(u32 rd, u32 ra, u32 rb) override; - void SLW(u32 ra, u32 rs, u32 rb, u32 rc) override; - void CNTLZW(u32 ra, u32 rs, u32 rc) override; - void SLD(u32 ra, u32 rs, u32 rb, u32 rc) override; - void AND(u32 ra, u32 rs, u32 rb, u32 rc) override; - void CMPL(u32 bf, u32 l, u32 ra, u32 rb) override; - void LVSR(u32 vd, u32 ra, u32 rb) override; - void LVEHX(u32 vd, u32 ra, u32 rb) override; - void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void LDUX(u32 rd, u32 ra, u32 rb) override; - void DCBST(u32 ra, u32 rb) override; - void LWZUX(u32 rd, u32 ra, u32 rb) override; - void CNTLZD(u32 ra, u32 rs, u32 rc) override; - void ANDC(u32 ra, u32 rs, u32 rb, u32 rc) override; - void TD(u32 to, u32 ra, u32 rb) override; - void LVEWX(u32 vd, u32 ra, u32 rb) override; - void MULHD(u32 rd, u32 ra, u32 rb, u32 rc) override; - void MULHW(u32 rd, u32 ra, u32 rb, u32 rc) override; - void LDARX(u32 rd, u32 ra, u32 rb) override; - void DCBF(u32 ra, u32 rb) override; - void LBZX(u32 rd, u32 ra, u32 rb) override; - void LVX(u32 vd, u32 ra, u32 rb) override; - void NEG(u32 rd, u32 ra, u32 oe, u32 rc) override; - void LBZUX(u32 rd, u32 ra, u32 rb) override; - void NOR(u32 ra, u32 rs, u32 rb, u32 rc) override; - void STVEBX(u32 vs, u32 ra, u32 rb) override; - void SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void ADDE(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void MTOCRF(u32 l, u32 crm, u32 rs) override; - void STDX(u32 rs, u32 ra, u32 rb) override; - void STWCX_(u32 rs, u32 ra, u32 rb) override; - void STWX(u32 rs, u32 ra, u32 rb) override; - void STVEHX(u32 vs, u32 ra, u32 rb) override; - void STDUX(u32 rs, u32 ra, u32 rb) override; - void STWUX(u32 rs, u32 ra, u32 rb) override; - void STVEWX(u32 vs, u32 ra, u32 rb) override; - void SUBFZE(u32 rd, u32 ra, u32 oe, u32 rc) override; - void ADDZE(u32 rd, u32 ra, u32 oe, u32 rc) override; - void STDCX_(u32 rs, u32 ra, u32 rb) override; - void STBX(u32 rs, u32 ra, u32 rb) override; - void STVX(u32 vs, u32 ra, u32 rb) override; - void MULLD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void SUBFME(u32 rd, u32 ra, u32 oe, u32 rc) override; - void ADDME(u32 rd, u32 ra, u32 oe, u32 rc) override; - void MULLW(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void DCBTST(u32 ra, u32 rb, u32 th) override; - void STBUX(u32 rs, u32 ra, u32 rb) override; - void ADD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void DCBT(u32 ra, u32 rb, u32 th) override; - void LHZX(u32 rd, u32 ra, u32 rb) override; - void EQV(u32 ra, u32 rs, u32 rb, u32 rc) override; - void ECIWX(u32 rd, u32 ra, u32 rb) override; - void LHZUX(u32 rd, u32 ra, u32 rb) override; - void XOR(u32 rs, u32 ra, u32 rb, u32 rc) override; - void MFSPR(u32 rd, u32 spr) override; - void LWAX(u32 rd, u32 ra, u32 rb) override; - void DST(u32 ra, u32 rb, u32 strm, u32 t) override; - void LHAX(u32 rd, u32 ra, u32 rb) override; - void LVXL(u32 vd, u32 ra, u32 rb) override; - void MFTB(u32 rd, u32 spr) override; - void LWAUX(u32 rd, u32 ra, u32 rb) override; - void DSTST(u32 ra, u32 rb, u32 strm, u32 t) override; - void LHAUX(u32 rd, u32 ra, u32 rb) override; - void STHX(u32 rs, u32 ra, u32 rb) override; - void ORC(u32 rs, u32 ra, u32 rb, u32 rc) override; - void ECOWX(u32 rs, u32 ra, u32 rb) override; - void STHUX(u32 rs, u32 ra, u32 rb) override; - void OR(u32 ra, u32 rs, u32 rb, u32 rc) override; - void DIVDU(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void DIVWU(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void MTSPR(u32 spr, u32 rs) override; - void DCBI(u32 ra, u32 rb) override; - void NAND(u32 ra, u32 rs, u32 rb, u32 rc) override; - void STVXL(u32 vs, u32 ra, u32 rb) override; - void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void DIVW(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) override; - void LVLX(u32 vd, u32 ra, u32 rb) override; - void LDBRX(u32 rd, u32 ra, u32 rb) override; - void LSWX(u32 rd, u32 ra, u32 rb) override; - void LWBRX(u32 rd, u32 ra, u32 rb) override; - void LFSX(u32 frd, u32 ra, u32 rb) override; - void SRW(u32 ra, u32 rs, u32 rb, u32 rc) override; - void SRD(u32 ra, u32 rs, u32 rb, u32 rc) override; - void LVRX(u32 vd, u32 ra, u32 rb) override; - void LSWI(u32 rd, u32 ra, u32 nb) override; - void LFSUX(u32 frd, u32 ra, u32 rb) override; - void SYNC(u32 l) override; - void LFDX(u32 frd, u32 ra, u32 rb) override; - void LFDUX(u32 frd, u32 ra, u32 rb) override; - void STVLX(u32 vs, u32 ra, u32 rb) override; - void STDBRX(u32 rd, u32 ra, u32 rb) override; - void STSWX(u32 rs, u32 ra, u32 rb) override; - void STWBRX(u32 rs, u32 ra, u32 rb) override; - void STFSX(u32 frs, u32 ra, u32 rb) override; - void STVRX(u32 vs, u32 ra, u32 rb) override; - void STFSUX(u32 frs, u32 ra, u32 rb) override; - void STSWI(u32 rd, u32 ra, u32 nb) override; - void STFDX(u32 frs, u32 ra, u32 rb) override; - void STFDUX(u32 frs, u32 ra, u32 rb) override; - void LVLXL(u32 vd, u32 ra, u32 rb) override; - void LHBRX(u32 rd, u32 ra, u32 rb) override; - void SRAW(u32 ra, u32 rs, u32 rb, u32 rc) override; - void SRAD(u32 ra, u32 rs, u32 rb, u32 rc) override; - void LVRXL(u32 vd, u32 ra, u32 rb) override; - void DSS(u32 strm, u32 a) override; - void SRAWI(u32 ra, u32 rs, u32 sh, u32 rc) override; - void SRADI1(u32 ra, u32 rs, u32 sh, u32 rc) override; - void SRADI2(u32 ra, u32 rs, u32 sh, u32 rc) override; - void EIEIO() override; - void STVLXL(u32 vs, u32 ra, u32 rb) override; - void STHBRX(u32 rs, u32 ra, u32 rb) override; - void EXTSH(u32 ra, u32 rs, u32 rc) override; - void STVRXL(u32 sd, u32 ra, u32 rb) override; - void EXTSB(u32 ra, u32 rs, u32 rc) override; - void STFIWX(u32 frs, u32 ra, u32 rb) override; - void EXTSW(u32 ra, u32 rs, u32 rc) override; - void ICBI(u32 ra, u32 rb) override; - void DCBZ(u32 ra, u32 rb) override; - void LWZ(u32 rd, u32 ra, s32 d) override; - void LWZU(u32 rd, u32 ra, s32 d) override; - void LBZ(u32 rd, u32 ra, s32 d) override; - void LBZU(u32 rd, u32 ra, s32 d) override; - void STW(u32 rs, u32 ra, s32 d) override; - void STWU(u32 rs, u32 ra, s32 d) override; - void STB(u32 rs, u32 ra, s32 d) override; - void STBU(u32 rs, u32 ra, s32 d) override; - void LHZ(u32 rd, u32 ra, s32 d) override; - void LHZU(u32 rd, u32 ra, s32 d) override; - void LHA(u32 rs, u32 ra, s32 d) override; - void LHAU(u32 rs, u32 ra, s32 d) override; - void STH(u32 rs, u32 ra, s32 d) override; - void STHU(u32 rs, u32 ra, s32 d) override; - void LMW(u32 rd, u32 ra, s32 d) override; - void STMW(u32 rs, u32 ra, s32 d) override; - void LFS(u32 frd, u32 ra, s32 d) override; - void LFSU(u32 frd, u32 ra, s32 d) override; - void LFD(u32 frd, u32 ra, s32 d) override; - void LFDU(u32 frd, u32 ra, s32 d) override; - void STFS(u32 frs, u32 ra, s32 d) override; - void STFSU(u32 frs, u32 ra, s32 d) override; - void STFD(u32 frs, u32 ra, s32 d) override; - void STFDU(u32 frs, u32 ra, s32 d) override; - void LD(u32 rd, u32 ra, s32 ds) override; - void LDU(u32 rd, u32 ra, s32 ds) override; - void LWA(u32 rd, u32 ra, s32 ds) override; - void FDIVS(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FSUBS(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FADDS(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FSQRTS(u32 frd, u32 frb, u32 rc) override; - void FRES(u32 frd, u32 frb, u32 rc) override; - void FMULS(u32 frd, u32 fra, u32 frc, u32 rc) override; - void FMADDS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FNMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FNMADDS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void STD(u32 rs, u32 ra, s32 ds) override; - void STDU(u32 rs, u32 ra, s32 ds) override; - void MTFSB1(u32 bt, u32 rc) override; - void MCRFS(u32 bf, u32 bfa) override; - void MTFSB0(u32 bt, u32 rc) override; - void MTFSFI(u32 crfd, u32 i, u32 rc) override; - void MFFS(u32 frd, u32 rc) override; - void MTFSF(u32 flm, u32 frb, u32 rc) override; - - void FCMPU(u32 bf, u32 fra, u32 frb) override; - void FRSP(u32 frd, u32 frb, u32 rc) override; - void FCTIW(u32 frd, u32 frb, u32 rc) override; - void FCTIWZ(u32 frd, u32 frb, u32 rc) override; - void FDIV(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FSUB(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FADD(u32 frd, u32 fra, u32 frb, u32 rc) override; - void FSQRT(u32 frd, u32 frb, u32 rc) override; - void FSEL(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FMUL(u32 frd, u32 fra, u32 frc, u32 rc) override; - void FRSQRTE(u32 frd, u32 frb, u32 rc) override; - void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FMADD(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FNMSUB(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FNMADD(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) override; - void FCMPO(u32 crfd, u32 fra, u32 frb) override; - void FNEG(u32 frd, u32 frb, u32 rc) override; - void FMR(u32 frd, u32 frb, u32 rc) override; - void FNABS(u32 frd, u32 frb, u32 rc) override; - void FABS(u32 frd, u32 frb, u32 rc) override; - void FCTID(u32 frd, u32 frb, u32 rc) override; - void FCTIDZ(u32 frd, u32 frb, u32 rc) override; - void FCFID(u32 frd, u32 frb, u32 rc) override; - - void UNK(const u32 code, const u32 opcode, const u32 gcode) override; - - /// Utility function creating a function called name with Executable signature - void initiate_function(const std::string &name); - - protected: - /// State of a compilation task - struct CompileTaskState { - enum Args { - State, - Context, - MaxArgs, - }; - - /// The LLVM function for the compilation task - llvm::Function * function; - - /// Args of the LLVM function - llvm::Value * args[MaxArgs]; - - /// Address of the current instruction being compiled - u32 current_instruction_address; - - /// A flag used to detect branch instructions. - /// This is set to false at the start of compilation of an instruction. - /// If a branch instruction is encountered, this is set to true by the decode function. - bool hit_branch_instruction; - }; - - /// The function that will be called to execute unknown functions - llvm::Function * m_execute_unknown_function; - - /// The executable that will be called to execute unknown blocks - llvm::Function * m_execute_unknown_block; - - /// Maps function name to executable memory pointer - std::unordered_map &m_executable_map; - - /// LLVM context - llvm::LLVMContext * m_llvm_context; - - /// LLVM IR builder - llvm::IRBuilder<> * m_ir_builder; - - /// Module to which all generated code is output to - llvm::Module * m_module; - - /// LLVM type of the functions genreated by the compiler - llvm::FunctionType * m_compiled_function_type; - - /// State of the current compilation task - CompileTaskState m_state; - - /// Get the name of the basic block for the specified address - std::string GetBasicBlockNameFromAddress(u32 address, const std::string & suffix = "") const; - - /// Get the address of a basic block from its name - u32 GetAddressFromBasicBlockName(const std::string & name) const; - - /// Get the basic block in for the specified address. - llvm::BasicBlock * GetBasicBlockFromAddress(u32 address, const std::string & suffix = "", bool create_if_not_exist = true); - - /// Get a bit - llvm::Value * GetBit(llvm::Value * val, u32 n); - - /// Clear a bit - llvm::Value * ClrBit(llvm::Value * val, u32 n); - - /// Set a bit - llvm::Value * SetBit(llvm::Value * val, u32 n, llvm::Value * bit, bool doClear = true); - - /// Get a nibble - llvm::Value * GetNibble(llvm::Value * val, u32 n); - - /// Clear a nibble - llvm::Value * ClrNibble(llvm::Value * val, u32 n); - - /// Set a nibble - llvm::Value * SetNibble(llvm::Value * val, u32 n, llvm::Value * nibble, bool doClear = true); - - /// Set a nibble - llvm::Value * SetNibble(llvm::Value * val, u32 n, llvm::Value * b0, llvm::Value * b1, llvm::Value * b2, llvm::Value * b3, bool doClear = true); - - /// Load PC - llvm::Value * GetPc(); - - /// Set PC - void SetPc(llvm::Value * val_ix); - - /// Load GPR - llvm::Value * GetGpr(u32 r, u32 num_bits = 64); - - /// Set GPR - void SetGpr(u32 r, llvm::Value * val_x64); - - /// Load CR - llvm::Value * GetCr(); - - /// Load CR and get field CRn - llvm::Value * GetCrField(u32 n); - - /// Set CR - void SetCr(llvm::Value * val_x32); - - /// Set CR field - void SetCrField(u32 n, llvm::Value * field); - - /// Set CR field - void SetCrField(u32 n, llvm::Value * b0, llvm::Value * b1, llvm::Value * b2, llvm::Value * b3); - - /// Set CR field based on signed comparison - void SetCrFieldSignedCmp(u32 n, llvm::Value * a, llvm::Value * b); - - /// Set CR field based on unsigned comparison - void SetCrFieldUnsignedCmp(u32 n, llvm::Value * a, llvm::Value * b); - - /// Set CR6 based on the result of the vector compare instruction - void SetCr6AfterVectorCompare(u32 vr); - - /// Get LR - llvm::Value * GetLr(); - - /// Set LR - void SetLr(llvm::Value * val_x64); - - /// Get CTR - llvm::Value * GetCtr(); - - /// Set CTR - void SetCtr(llvm::Value * val_x64); - - /// Load XER and convert it to an i64 - llvm::Value * GetXer(); - - /// Load XER and return the CA bit - llvm::Value * GetXerCa(); - - /// Load XER and return the SO bit - llvm::Value * GetXerSo(); - - /// Set XER - void SetXer(llvm::Value * val_x64); - - /// Set the CA bit of XER - void SetXerCa(llvm::Value * ca); - - /// Set the SO bit of XER - void SetXerSo(llvm::Value * so); - - /// Get VRSAVE - llvm::Value * GetVrsave(); - - /// Set VRSAVE - void SetVrsave(llvm::Value * val_x64); - - /// Load FPSCR - llvm::Value * GetFpscr(); - - /// Set FPSCR - void SetFpscr(llvm::Value * val_x32); - - /// Get FPR - llvm::Value * GetFpr(u32 r, u32 bits = 64, bool as_int = false); - - /// Set FPR - void SetFpr(u32 r, llvm::Value * val); - - /// Load VSCR - llvm::Value * GetVscr(); - - /// Set VSCR - void SetVscr(llvm::Value * val_x32); - - /// Load VR - llvm::Value * GetVr(u32 vr); - - /// Load VR and convert it to an integer vector - llvm::Value * GetVrAsIntVec(u32 vr, u32 vec_elt_num_bits); - - /// Load VR and convert it to a float vector with 4 elements - llvm::Value * GetVrAsFloatVec(u32 vr); - - /// Load VR and convert it to a double vector with 2 elements - llvm::Value * GetVrAsDoubleVec(u32 vr); - - /// Set VR to the specified value - void SetVr(u32 vr, llvm::Value * val_x128); - - /// Check condition for branch instructions - llvm::Value * CheckBranchCondition(u32 bo, u32 bi); - - /// Create IR for a branch instruction - void CreateBranch(llvm::Value * cmp_i1, llvm::Value * target_i32, bool lk, bool target_is_lr = false); - - /// Read from memory - llvm::Value * ReadMemory(llvm::Value * addr_i64, u32 bits, u32 alignment = 0, bool bswap = true, bool could_be_mmio = true); - - /// Write to memory - void WriteMemory(llvm::Value * addr_i64, llvm::Value * val_ix, u32 alignment = 0, bool bswap = true, bool could_be_mmio = true); - - /// Convert a C++ type to an LLVM type - template - llvm::Type * CppToLlvmType() { - if (std::is_void::value) { - return m_ir_builder->getVoidTy(); - } - else if (std::is_same::value || std::is_same::value) { - return m_ir_builder->getInt64Ty(); - } - else if (std::is_same::value || std::is_same::value) { - return m_ir_builder->getInt32Ty(); - } - else if (std::is_same::value || std::is_same::value) { - return m_ir_builder->getInt16Ty(); - } - else if (std::is_same::value || std::is_same::value) { - return m_ir_builder->getInt8Ty(); - } - else if (std::is_same::value) { - return m_ir_builder->getFloatTy(); - } - else if (std::is_same::value) { - return m_ir_builder->getDoubleTy(); - } - else if (std::is_same::value) { - return m_ir_builder->getInt1Ty(); - } - else if (std::is_pointer::value) { - return m_ir_builder->getInt8PtrTy(); - } - else { - assert(0); - } - - return nullptr; - } - - /// Call a function - template - llvm::Value * Call(const char * name, Args... args) { - auto fn = m_module->getFunction(name); - if (!fn) { - std::vector fn_args_type = { args->getType()... }; - auto fn_type = llvm::FunctionType::get(CppToLlvmType(), fn_args_type, false); - fn = llvm::cast(m_module->getOrInsertFunction(name, fn_type)); - fn->setCallingConv(llvm::CallingConv::X86_64_Win64); - // Create an entry in m_executable_map that will be populated outside of compiler - (void)m_executable_map[name]; - } - - std::vector fn_args = { args... }; - return m_ir_builder->CreateCall(fn, fn_args); - } - - /// Handle compilation errors - void CompilationError(const std::string & error); - - /// A mask used in rotate instructions - static u64 s_rotate_mask[64][64]; - - /// A flag indicating whether s_rotate_mask has been initialised or not - static bool s_rotate_mask_inited; - - /// Initialse s_rotate_mask - static void InitRotateMask(); - }; - - /** - * Manages block compilation. - * PPUInterpreter1 execution is traced (using Tracer class) - * Periodically RecompilationEngine process traces result to find blocks - * whose compilation can improve performances. - * It then builds them asynchroneously and update the executable mapping - * using atomic based locks to avoid undefined behavior. - **/ - class RecompilationEngine final : public named_thread_t { - friend class CPUHybridDecoderRecompiler; - public: - virtual ~RecompilationEngine() override; - - /** - * Get the executable for the specified address if a compiled version is - * available, otherwise returns nullptr. - **/ - const Executable GetCompiledExecutableIfAvailable(u32 address) const; - - /// Notify the recompilation engine about a newly detected block start. - void NotifyBlockStart(u32 address); - - /// Log - llvm::raw_fd_ostream & Log(); - - std::string get_name() const override { return "PPU Recompilation Engine"; } - - void on_task() override; - - /// Get a pointer to the instance of this class - static std::shared_ptr GetInstance(); - - private: - /// An entry in the block table - struct BlockEntry { - /// Start address - u32 address; - - /// Number of times this block was hit - u32 num_hits; - - /// Indicates whether this function has been analysed or not - bool is_analysed; - - /// Indicates whether the block has been compiled or not - bool is_compiled; - - /// Indicate wheter the block is a function that can be completly compiled - /// that is, that has a clear "return" semantic and no indirect branch - bool is_compilable_function; - - /// If the analysis was successfull, how long the block is. - u32 instructionCount; - - /// If the analysis was successfull, which function does it call. - std::set calledFunctions; - - BlockEntry(u32 start_address) - : num_hits(0) - , address(start_address) - , is_compiled(false) - , is_analysed(false) - , is_compilable_function(false) - , instructionCount(0) { - } - - std::string ToString() const { - return fmt::format("0x%08X: NumHits=%u, IsCompiled=%c", - address, num_hits, is_compiled ? 'Y' : 'N'); - } - - bool operator == (const BlockEntry & other) const { - return address == other.address; - } - }; - - /// Log - llvm::raw_fd_ostream * m_log; - - /// Lock for accessing m_pending_address_start. TODO: Eliminate this and use a lock-free queue. - std::mutex m_pending_address_start_lock; - - /// Queue of block start address to process - std::list m_pending_address_start; - - /// Block table - std::unordered_map m_block_table; - - int m_currentId; - - /// (function, id). - typedef std::pair ExecutableStorageType; - - /// Virtual memory allocated array. - /// Store pointer to every compiled function/block and a unique Id. - /// We need to map every instruction in PS3 Ram so it's a big table - /// But a lot of it won't be accessed. Fortunatly virtual memory help here... - ExecutableStorageType* FunctionCache; - - // Bitfield recording page status in FunctionCache reserved memory. - char *FunctionCachePagesCommited; - - bool isAddressCommited(u32) const; - void commitAddress(u32); - - /// vector storing all exec engine - std::vector > m_executable_storage; - - - /// LLVM context - llvm::LLVMContext &m_llvm_context; - - /// LLVM IR builder - llvm::IRBuilder<> m_ir_builder; - - /** - * Compile a code fragment described by a cfg and return an executable and the ExecutionEngine storing it - * Pointer to function can be retrieved with getPointerToFunction - */ - std::pair compile(const std::string & name, u32 start_address, u32 instruction_count); - - /// The time at which the m_address_to_ordinal cache was last cleared - std::chrono::high_resolution_clock::time_point m_last_cache_clear_time; - - RecompilationEngine(); - - RecompilationEngine(const RecompilationEngine&) = delete; // Delete copy/move constructors and copy/move operators - - /// Increase usage counter for block starting at addr and compile it if threshold was reached. - /// Returns true if block was compiled - bool IncreaseHitCounterAndBuild(u32 addr); - - /** - * Analyse block to get useful info (function called, has indirect branch...) - * This code is inspired from Dolphin PPC Analyst - * Return true if analysis is successful. - */ - bool AnalyseBlock(BlockEntry &functionData, size_t maxSize = 10000); - - /// Compile a block - void CompileBlock(BlockEntry & block_entry); - - /// Mutex used to prevent multiple creation - static std::mutex s_mutex; - - /// The instance - static std::shared_ptr s_the_instance; - }; - - /** - * PPU execution engine - * Relies on PPUInterpreter1 to execute uncompiled code. - * Traces execution to determine which block to compile. - * Use LLVM to compile block into native code. - */ - class CPUHybridDecoderRecompiler : public CPUDecoder { - friend class RecompilationEngine; - friend class Compiler; - public: - CPUHybridDecoderRecompiler(PPUThread & ppu); - - CPUHybridDecoderRecompiler(const CPUHybridDecoderRecompiler&) = delete; // Delete copy/move constructors and copy/move operators - - virtual ~CPUHybridDecoderRecompiler(); - - u32 DecodeMemory(const u32 address) override; - - private: - /// PPU processor context - PPUThread & m_ppu; - - /// PPU Interpreter - PPUInterpreter * m_interpreter; - - /// PPU instruction Decoder - PPUDecoder m_decoder; - - /// Recompilation engine - std::shared_ptr m_recompilation_engine; - - /// Execute a function - static u32 ExecuteFunction(PPUThread * ppu_state, u64 context); - - /// Execute till the current function returns - static u32 ExecuteTillReturn(PPUThread * ppu_state, u64 context); - - /// Check thread status. Returns true if the thread must exit. - static bool PollStatus(PPUThread * ppu_state); - }; - - class CustomSectionMemoryManager : public llvm::SectionMemoryManager { - private: - std::unordered_map &executableMap; - public: - CustomSectionMemoryManager(std::unordered_map &map) : - executableMap(map) - {} - ~CustomSectionMemoryManager() override {} - - virtual uint64_t getSymbolAddress(const std::string &Name) override - { - std::unordered_map::const_iterator It = executableMap.find(Name); - if (It != executableMap.end()) - return (uint64_t)It->second; - return getSymbolAddressInProcess(Name); - } - }; -} - -#endif // LLVM_AVAILABLE -#endif // PPU_LLVM_RECOMPILER_H diff --git a/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp b/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp deleted file mode 100644 index b9a0c065d2..0000000000 --- a/rpcs3/Emu/Cell/PPULLVMRecompilerCore.cpp +++ /dev/null @@ -1,5527 +0,0 @@ -#include "stdafx.h" -#ifdef LLVM_AVAILABLE -#include "Emu/state.h" -#include "Emu/System.h" -#include "Emu/Cell/PPULLVMRecompiler.h" -#include "Emu/Memory/Memory.h" -#ifdef _MSC_VER -#pragma warning(push, 0) -#endif -#include "llvm/Support/TargetSelect.h" -#include "llvm/Support/Host.h" -#include "llvm/Support/ManagedStatic.h" -#include "llvm/ExecutionEngine/GenericValue.h" -#include "llvm/ExecutionEngine/MCJIT.h" -#include "llvm/ExecutionEngine/SectionMemoryManager.h" -#include "llvm/IR/Intrinsics.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Analysis/Passes.h" -#include "llvm/Analysis/TargetTransformInfo.h" -#include "llvm/Analysis/MemoryDependenceAnalysis.h" -#include "llvm/Analysis/LoopInfo.h" -#include "llvm/Analysis/ScalarEvolution.h" -#include "llvm/IR/Dominators.h" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Vectorize.h" -#include "llvm/MC/MCDisassembler.h" -#include "llvm/IR/Verifier.h" -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#define USE_INTERP_IF_REQUESTED(inst, ...) \ - if (!rpcs3::state.config.core.llvm.enable_##inst.value()) \ - { \ - Call(#inst, m_state.args[CompileTaskState::Args::State], __VA_ARGS__); \ - return; \ - } - -using namespace llvm; -using namespace ppu_recompiler_llvm; - -void Compiler::NULL_OP() { - CompilationError("NULL_OP"); -} - -void Compiler::NOP() { - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::TDI(u32 to, u32 ra, s32 simm16) { - llvm::Value *gpr_a = GetGpr(ra); - llvm::Value *cst_simm16 = m_ir_builder->getInt64(simm16); - llvm::Value *trap_condition = m_ir_builder->getFalse(); - - if (to & 0x10) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSLT(gpr_a, cst_simm16)); - if (to & 0x8) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSGT(gpr_a, cst_simm16)); - if (to & 0x4) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpEQ(gpr_a, cst_simm16)); - if (to & 0x2) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpULT(gpr_a, cst_simm16)); - if (to & 0x1) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpUGT(gpr_a, cst_simm16)); - - llvm::BasicBlock *trap_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "trap_block"); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(trap_condition, trap_block, normal_execution); - - m_ir_builder->SetInsertPoint(trap_block); - Call("trap"); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - - m_ir_builder->SetInsertPoint(normal_execution); -} - -void Compiler::TWI(u32 to, u32 ra, s32 simm16) { - llvm::Value *gpr_a = GetGpr(ra, 32); - llvm::Value *cst_simm16 = m_ir_builder->getInt32(simm16); - llvm::Value *trap_condition = m_ir_builder->getFalse(); - - if (to & 0x10) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSLT(gpr_a, cst_simm16)); - if (to & 0x8) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSGT(gpr_a, cst_simm16)); - if (to & 0x4) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpEQ(gpr_a, cst_simm16)); - if (to & 0x2) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpULT(gpr_a, cst_simm16)); - if (to & 0x1) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpUGT(gpr_a, cst_simm16)); - - llvm::BasicBlock *trap_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "trap_block"); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(trap_condition, trap_block, normal_execution); - - m_ir_builder->SetInsertPoint(trap_block); - Call("trap"); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - - m_ir_builder->SetInsertPoint(normal_execution); -} - -void Compiler::MFVSCR(u32 vd) { - auto vscr_i32 = GetVscr(); - auto vscr_i128 = m_ir_builder->CreateZExt(vscr_i32, m_ir_builder->getIntNTy(128)); - SetVr(vd, vscr_i128); -} - -void Compiler::MTVSCR(u32 vb) { - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto vscr_i32 = m_ir_builder->CreateExtractElement(vb_v4i32, m_ir_builder->getInt32(0)); - vscr_i32 = m_ir_builder->CreateAnd(vscr_i32, 0x00010001); - SetVscr(vscr_i32); -} - -void Compiler::VADDCUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - va_v4i32 = m_ir_builder->CreateNot(va_v4i32); - auto cmpv4i1 = m_ir_builder->CreateICmpULT(va_v4i32, vb_v4i32); - auto cmpv4i32 = m_ir_builder->CreateZExt(cmpv4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmpv4i32); -} - -void Compiler::VADDFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto sum_v4f32 = m_ir_builder->CreateFAdd(va_v4f32, vb_v4f32); - SetVr(vd, sum_v4f32); -} - -void Compiler::VADDSBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sum_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_padds_b), va_v16i8, vb_v16i8); - SetVr(vd, sum_v16i8); - - // TODO: Set VSCR.SAT -} - -void Compiler::VADDSHS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto sum_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_padds_w), va_v8i16, vb_v8i16); - SetVr(vd, sum_v8i16); - - // TODO: Set VSCR.SAT -} - -void Compiler::VADDSWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - // It looks like x86 does not have an instruction to add 32 bit intergers with signed/unsigned saturation. - // To implement add with saturation, we first determine what the result would be if the operation were to cause - // an overflow. If two -ve numbers are being added and cause an overflow, the result would be 0x80000000. - // If two +ve numbers are being added and cause an overflow, the result would be 0x7FFFFFFF. Addition of a -ve - // number and a +ve number cannot cause overflow. So the result in case of an overflow is 0x7FFFFFFF + sign bit - // of any one of the operands. - auto tmp1_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 31); - tmp1_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x7FFFFFFF))); - auto tmp1_v16i8 = m_ir_builder->CreateBitCast(tmp1_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // Next, we find if the addition can actually result in an overflow. Since an overflow can only happen if the operands - // have the same sign, we bitwise XOR both the operands. If the sign bit of the result is 0 then the operands have the - // same sign and so may cause an overflow. We invert the result so that the sign bit is 1 when the operands have the - // same sign. - auto tmp2_v4i32 = m_ir_builder->CreateXor(va_v4i32, vb_v4i32); - tmp2_v4i32 = m_ir_builder->CreateNot(tmp2_v4i32); - - // Perform the sum. - auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); - auto sum_v16i8 = m_ir_builder->CreateBitCast(sum_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // If an overflow occurs, then the sign of the sum will be different from the sign of the operands. So, we xor the - // result with one of the operands. The sign bit of the result will be 1 if the sign bit of the sum and the sign bit of the - // result is different. This result is again ANDed with tmp3 (the sign bit of tmp3 is 1 only if the operands have the same - // sign and so can cause an overflow). - auto tmp3_v4i32 = m_ir_builder->CreateXor(va_v4i32, sum_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, tmp3_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAShr(tmp3_v4i32, 31); - auto tmp3_v16i8 = m_ir_builder->CreateBitCast(tmp3_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // tmp4 is equal to 0xFFFFFFFF if an overflow occured and 0x00000000 otherwise. - auto res_v16i8 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pblendvb), sum_v16i8, tmp1_v16i8, tmp3_v16i8); - SetVr(vd, res_v16i8); - - // TODO: Set SAT -} - -void Compiler::VADDUBM(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sum_v16i8 = m_ir_builder->CreateAdd(va_v16i8, vb_v16i8); - SetVr(vd, sum_v16i8); -} - -void Compiler::VADDUBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sum_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_paddus_b), va_v16i8, vb_v16i8); - SetVr(vd, sum_v16i8); - - // TODO: Set SAT -} - -void Compiler::VADDUHM(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto sum_v8i16 = m_ir_builder->CreateAdd(va_v8i16, vb_v8i16); - SetVr(vd, sum_v8i16); -} - -void Compiler::VADDUHS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto sum_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_paddus_w), va_v8i16, vb_v8i16); - SetVr(vd, sum_v8i16); - - // TODO: Set SAT -} - -void Compiler::VADDUWM(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); - SetVr(vd, sum_v4i32); -} - -void Compiler::VADDUWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); - auto cmp_v4i1 = m_ir_builder->CreateICmpULT(sum_v4i32, va_v4i32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto res_v4i32 = m_ir_builder->CreateOr(sum_v4i32, cmp_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Set SAT -} - -void Compiler::VAND(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VANDC(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - vb_v4i32 = m_ir_builder->CreateNot(vb_v4i32); - auto res_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VAVGSB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto va_v16i16 = m_ir_builder->CreateSExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto vb_v16i16 = m_ir_builder->CreateSExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto sum_v16i16 = m_ir_builder->CreateAdd(va_v16i16, vb_v16i16); - sum_v16i16 = m_ir_builder->CreateAdd(sum_v16i16, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt16(1))); - auto avg_v16i16 = m_ir_builder->CreateAShr(sum_v16i16, 1); - auto avg_v16i8 = m_ir_builder->CreateTrunc(avg_v16i16, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - SetVr(vd, avg_v16i8); -} - -void Compiler::VAVGSH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto va_v8i32 = m_ir_builder->CreateSExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vb_v8i32 = m_ir_builder->CreateSExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto sum_v8i32 = m_ir_builder->CreateAdd(va_v8i32, vb_v8i32); - sum_v8i32 = m_ir_builder->CreateAdd(sum_v8i32, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt32(1))); - auto avg_v8i32 = m_ir_builder->CreateAShr(sum_v8i32, 1); - auto avg_v8i16 = m_ir_builder->CreateTrunc(avg_v8i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, avg_v8i16); -} - -void Compiler::VAVGSW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto va_v4i64 = m_ir_builder->CreateSExt(va_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto vb_v4i64 = m_ir_builder->CreateSExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto sum_v4i64 = m_ir_builder->CreateAdd(va_v4i64, vb_v4i64); - sum_v4i64 = m_ir_builder->CreateAdd(sum_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(1))); - auto avg_v4i64 = m_ir_builder->CreateAShr(sum_v4i64, 1); - auto avg_v4i32 = m_ir_builder->CreateTrunc(avg_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, avg_v4i32); -} - -void Compiler::VAVGUB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto avg_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pavg_b), va_v16i8, vb_v16i8); - SetVr(vd, avg_v16i8); -} - -void Compiler::VAVGUH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto avg_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pavg_w), va_v8i16, vb_v8i16); - SetVr(vd, avg_v8i16); -} - -void Compiler::VAVGUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto va_v4i64 = m_ir_builder->CreateZExt(va_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto vb_v4i64 = m_ir_builder->CreateZExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto sum_v4i64 = m_ir_builder->CreateAdd(va_v4i64, vb_v4i64); - sum_v4i64 = m_ir_builder->CreateAdd(sum_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(1))); - auto avg_v4i64 = m_ir_builder->CreateLShr(sum_v4i64, 1); - auto avg_v4i32 = m_ir_builder->CreateTrunc(avg_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, avg_v4i32); -} - -void Compiler::VCFSX(u32 vd, u32 uimm5, u32 vb) { - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4f32 = m_ir_builder->CreateSIToFP(vb_v4i32, VectorType::get(m_ir_builder->getFloatTy(), 4)); - - if (uimm5) { - float scale = (float)((u64)1 << uimm5); - res_v4f32 = m_ir_builder->CreateFDiv(res_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), scale))); - } - - SetVr(vd, res_v4f32); -} - -void Compiler::VCFUX(u32 vd, u32 uimm5, u32 vb) { - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4f32 = m_ir_builder->CreateUIToFP(vb_v4i32, VectorType::get(m_ir_builder->getFloatTy(), 4)); - - if (uimm5) { - float scale = (float)((u64)1 << uimm5); - res_v4f32 = m_ir_builder->CreateFDiv(res_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), scale))); - } - - SetVr(vd, res_v4f32); -} - -void Compiler::VCMPBFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto cmp_gt_v4i1 = m_ir_builder->CreateFCmpOGT(va_v4f32, vb_v4f32); - vb_v4f32 = m_ir_builder->CreateFNeg(vb_v4f32); - auto cmp_lt_v4i1 = m_ir_builder->CreateFCmpOLT(va_v4f32, vb_v4f32); - auto cmp_gt_v4i32 = m_ir_builder->CreateZExt(cmp_gt_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto cmp_lt_v4i32 = m_ir_builder->CreateZExt(cmp_lt_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - cmp_gt_v4i32 = m_ir_builder->CreateShl(cmp_gt_v4i32, 31); - cmp_lt_v4i32 = m_ir_builder->CreateShl(cmp_lt_v4i32, 30); - auto res_v4i32 = m_ir_builder->CreateOr(cmp_gt_v4i32, cmp_lt_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Implement NJ mode -} - -void Compiler::VCMPBFP_(u32 vd, u32 va, u32 vb) { - VCMPBFP(vd, va, vb); - - auto vd_v16i8 = GetVrAsIntVec(vd, 8); - u32 mask_v16i32[16] = { 3, 7, 11, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - vd_v16i8 = m_ir_builder->CreateShuffleVector(vd_v16i8, UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - auto vd_v4i32 = m_ir_builder->CreateBitCast(vd_v16i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto vd_mask_i32 = m_ir_builder->CreateExtractElement(vd_v4i32, m_ir_builder->getInt32(0)); - auto cmp_i1 = m_ir_builder->CreateICmpEQ(vd_mask_i32, m_ir_builder->getInt32(0)); - SetCrField(6, nullptr, nullptr, cmp_i1, nullptr); -} - -void Compiler::VCMPEQFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto cmp_v4i1 = m_ir_builder->CreateFCmpOEQ(va_v4f32, vb_v4f32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPEQFP_(u32 vd, u32 va, u32 vb) { - VCMPEQFP(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPEQUB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto cmp_v16i1 = m_ir_builder->CreateICmpEQ(va_v16i8, vb_v16i8); - auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - SetVr(vd, cmp_v16i8); -} - -void Compiler::VCMPEQUB_(u32 vd, u32 va, u32 vb) { - VCMPEQUB(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPEQUH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto cmp_v8i1 = m_ir_builder->CreateICmpEQ(va_v8i16, vb_v8i16); - auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, cmp_v8i16); -} - -void Compiler::VCMPEQUH_(u32 vd, u32 va, u32 vb) { - VCMPEQUH(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPEQUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto cmp_v4i1 = m_ir_builder->CreateICmpEQ(va_v4i32, vb_v4i32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPEQUW_(u32 vd, u32 va, u32 vb) { - VCMPEQUW(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGEFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto cmp_v4i1 = m_ir_builder->CreateFCmpOGE(va_v4f32, vb_v4f32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPGEFP_(u32 vd, u32 va, u32 vb) { - VCMPGEFP(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto cmp_v4i1 = m_ir_builder->CreateFCmpOGT(va_v4f32, vb_v4f32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPGTFP_(u32 vd, u32 va, u32 vb) { - VCMPGTFP(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTSB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto cmp_v16i1 = m_ir_builder->CreateICmpSGT(va_v16i8, vb_v16i8); - auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - SetVr(vd, cmp_v16i8); -} - -void Compiler::VCMPGTSB_(u32 vd, u32 va, u32 vb) { - VCMPGTSB(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTSH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto cmp_v8i1 = m_ir_builder->CreateICmpSGT(va_v8i16, vb_v8i16); - auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, cmp_v8i16); -} - -void Compiler::VCMPGTSH_(u32 vd, u32 va, u32 vb) { - VCMPGTSH(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTSW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto cmp_v4i1 = m_ir_builder->CreateICmpSGT(va_v4i32, vb_v4i32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPGTSW_(u32 vd, u32 va, u32 vb) { - VCMPGTSW(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTUB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto cmp_v16i1 = m_ir_builder->CreateICmpUGT(va_v16i8, vb_v16i8); - auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - SetVr(vd, cmp_v16i8); -} - -void Compiler::VCMPGTUB_(u32 vd, u32 va, u32 vb) { - VCMPGTUB(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTUH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto cmp_v8i1 = m_ir_builder->CreateICmpUGT(va_v8i16, vb_v8i16); - auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, cmp_v8i16); -} - -void Compiler::VCMPGTUH_(u32 vd, u32 va, u32 vb) { - VCMPGTUH(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCMPGTUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto cmp_v4i1 = m_ir_builder->CreateICmpUGT(va_v4i32, vb_v4i32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmp_v4i32); -} - -void Compiler::VCMPGTUW_(u32 vd, u32 va, u32 vb) { - VCMPGTUW(vd, va, vb); - SetCr6AfterVectorCompare(vd); -} - -void Compiler::VCTSXS(u32 vd, u32 uimm5, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - if (uimm5) { - u64 power_of_two = UINT64_C(1) << uimm5; - vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), static_cast(power_of_two)))); - } - - auto res_v4i32 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_cvtps2dq), vb_v4f32); - auto cmp_v4i1 = m_ir_builder->CreateFCmpOGE(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 0x7FFFFFFF))); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - res_v4i32 = m_ir_builder->CreateXor(cmp_v4i32, res_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VCTUXS(u32 vd, u32 uimm5, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - if (uimm5) { - u64 power_of_two = UINT64_C(1) << uimm5; - vb_v4f32 = m_ir_builder->CreateFMul(vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), static_cast(power_of_two)))); - } - - auto res_v4f32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_max_ps), vb_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 0))); - auto cmp_v4i1 = m_ir_builder->CreateFCmpOGE(res_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 0xFFFFFFFFu))); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto res_v4i32 = m_ir_builder->CreateFPToUI(res_v4f32, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - res_v4i32 = m_ir_builder->CreateOr(res_v4i32, cmp_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VEXPTEFP(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::pow, VectorType::get(m_ir_builder->getFloatTy(), 4)), - m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), 2.0f)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VLOGEFP(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::log2, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VMADDFP(u32 vd, u32 va, u32 vc, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto vc_v4f32 = GetVrAsFloatVec(vc); - auto res_v4f32 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, VectorType::get(m_ir_builder->getFloatTy(), 4)), va_v4f32, vc_v4f32, vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VMAXFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_max_ps), va_v4f32, vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VMAXSB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxsb), va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VMAXSH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmaxs_w), va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMAXSW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxsd), va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMAXUB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmaxu_b), va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VMAXUH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxuw), va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMAXUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxud), va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMHADDSHS(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto vc_v8i16 = GetVrAsIntVec(vc, 16); - auto va_v8i32 = m_ir_builder->CreateSExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vb_v8i32 = m_ir_builder->CreateSExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vc_v8i32 = m_ir_builder->CreateSExt(vc_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto res_v8i32 = m_ir_builder->CreateMul(va_v8i32, vb_v8i32); - res_v8i32 = m_ir_builder->CreateAShr(res_v8i32, 15); - res_v8i32 = m_ir_builder->CreateAdd(res_v8i32, vc_v8i32); - - u32 mask1_v4i32[4] = { 0, 1, 2, 3 }; - auto res1_v4i32 = m_ir_builder->CreateShuffleVector(res_v8i32, UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - u32 mask2_v4i32[4] = { 4, 5, 6, 7 }; - auto res2_v4i32 = m_ir_builder->CreateShuffleVector(res_v8i32, UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_packssdw_128), res1_v4i32, res2_v4i32); - SetVr(vd, res_v8i16); - - // TODO: Set VSCR.SAT -} - -void Compiler::VMHRADDSHS(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto vc_v8i16 = GetVrAsIntVec(vc, 16); - auto va_v8i32 = m_ir_builder->CreateSExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vb_v8i32 = m_ir_builder->CreateSExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vc_v8i32 = m_ir_builder->CreateSExt(vc_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto res_v8i32 = m_ir_builder->CreateMul(va_v8i32, vb_v8i32); - res_v8i32 = m_ir_builder->CreateAdd(res_v8i32, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt32(0x4000))); - res_v8i32 = m_ir_builder->CreateAShr(res_v8i32, 15); - res_v8i32 = m_ir_builder->CreateAdd(res_v8i32, vc_v8i32); - - u32 mask1_v4i32[4] = { 0, 1, 2, 3 }; - auto res1_v4i32 = m_ir_builder->CreateShuffleVector(res_v8i32, UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - u32 mask2_v4i32[4] = { 4, 5, 6, 7 }; - auto res2_v4i32 = m_ir_builder->CreateShuffleVector(res_v8i32, UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_packssdw_128), res1_v4i32, res2_v4i32); - SetVr(vd, res_v8i16); - - // TODO: Set VSCR.SAT -} - -void Compiler::VMINFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_min_ps), va_v4f32, vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VMINSB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminsb), va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VMINSH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmins_w), va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMINSW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminsd), va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMINUB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pminu_b), va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VMINUH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminuw), va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMINUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminud), va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMLADDUHM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto vc_v8i16 = GetVrAsIntVec(vc, 16); - auto res_v8i16 = m_ir_builder->CreateMul(va_v8i16, vb_v8i16); - res_v8i16 = m_ir_builder->CreateAdd(res_v8i16, vc_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMRGHB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - u32 mask_v16i32[16] = { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 }; - auto vd_v16i8 = m_ir_builder->CreateShuffleVector(va_v16i8, vb_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - SetVr(vd, vd_v16i8); -} - -void Compiler::VMRGHH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v8i32[8] = { 12, 4, 13, 5, 14, 6, 15, 7 }; - auto vd_v8i16 = m_ir_builder->CreateShuffleVector(va_v8i16, vb_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - SetVr(vd, vd_v8i16); -} - -void Compiler::VMRGHW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - u32 mask_v4i32[4] = { 6, 2, 7, 3 }; - auto vd_v4i32 = m_ir_builder->CreateShuffleVector(va_v4i32, vb_v4i32, ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); - SetVr(vd, vd_v4i32); -} - -void Compiler::VMRGLB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - u32 mask_v16i32[16] = { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 }; - auto vd_v16i8 = m_ir_builder->CreateShuffleVector(va_v16i8, vb_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - SetVr(vd, vd_v16i8); -} - -void Compiler::VMRGLH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v8i32[8] = { 8, 0, 9, 1, 10, 2, 11, 3 }; - auto vd_v8i16 = m_ir_builder->CreateShuffleVector(va_v8i16, vb_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - SetVr(vd, vd_v8i16); -} - -void Compiler::VMRGLW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - u32 mask_v4i32[4] = { 4, 0, 5, 1 }; - auto vd_v4i32 = m_ir_builder->CreateShuffleVector(va_v4i32, vb_v4i32, ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); - SetVr(vd, vd_v4i32); -} - -void Compiler::VMSUMMBM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto va_v16i16 = m_ir_builder->CreateSExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto vb_v16i16 = m_ir_builder->CreateZExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto tmp_v16i16 = m_ir_builder->CreateMul(va_v16i16, vb_v16i16); - - auto undef_v16i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 16)); - u32 mask1_v4i32[4] = { 0, 4, 8, 12 }; - auto tmp1_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto tmp1_v4i32 = m_ir_builder->CreateSExt(tmp1_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask2_v4i32[4] = { 1, 5, 9, 13 }; - auto tmp2_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto tmp2_v4i32 = m_ir_builder->CreateSExt(tmp2_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask3_v4i32[4] = { 2, 6, 10, 14 }; - auto tmp3_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); - auto tmp3_v4i32 = m_ir_builder->CreateSExt(tmp3_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask4_v4i32[4] = { 3, 7, 11, 15 }; - auto tmp4_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); - auto tmp4_v4i32 = m_ir_builder->CreateSExt(tmp4_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp3_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp4_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); - - SetVr(vd, res_v4i32); - - // TODO: Try to optimize with horizontal add -} - -void Compiler::VMSUMSHM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto res_v4i32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmadd_wd), va_v8i16, vb_v8i16); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMSUMSHS(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto res_v4i32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmadd_wd), va_v8i16, vb_v8i16); - - auto tmp1_v4i32 = m_ir_builder->CreateLShr(vc_v4i32, 31); - tmp1_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x7FFFFFFF))); - auto tmp1_v16i8 = m_ir_builder->CreateBitCast(tmp1_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - auto tmp2_v4i32 = m_ir_builder->CreateXor(vc_v4i32, res_v4i32); - tmp2_v4i32 = m_ir_builder->CreateNot(tmp2_v4i32); - auto sum_v4i32 = m_ir_builder->CreateAdd(vc_v4i32, res_v4i32); - auto sum_v16i8 = m_ir_builder->CreateBitCast(sum_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - auto tmp3_v4i32 = m_ir_builder->CreateXor(vc_v4i32, sum_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, tmp3_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAShr(tmp3_v4i32, 31); - auto tmp3_v16i8 = m_ir_builder->CreateBitCast(tmp3_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - auto res_v16i8 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pblendvb), sum_v16i8, tmp1_v16i8, tmp3_v16i8); - SetVr(vd, res_v16i8); - - // TODO: Set VSCR.SAT -} - -void Compiler::VMSUMUBM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto va_v16i16 = m_ir_builder->CreateZExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto vb_v16i16 = m_ir_builder->CreateZExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); - auto tmp_v16i16 = m_ir_builder->CreateMul(va_v16i16, vb_v16i16); - - auto undef_v16i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 16)); - u32 mask1_v4i32[4] = { 0, 4, 8, 12 }; - auto tmp1_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto tmp1_v4i32 = m_ir_builder->CreateZExt(tmp1_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask2_v4i32[4] = { 1, 5, 9, 13 }; - auto tmp2_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto tmp2_v4i32 = m_ir_builder->CreateZExt(tmp2_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask3_v4i32[4] = { 2, 6, 10, 14 }; - auto tmp3_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); - auto tmp3_v4i32 = m_ir_builder->CreateZExt(tmp3_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - u32 mask4_v4i32[4] = { 3, 7, 11, 15 }; - auto tmp4_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); - auto tmp4_v4i32 = m_ir_builder->CreateZExt(tmp4_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp3_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp4_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); - - SetVr(vd, res_v4i32); - - // TODO: Try to optimize with horizontal add -} - -void Compiler::VMSUMUHM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto va_v8i32 = m_ir_builder->CreateZExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vb_v8i32 = m_ir_builder->CreateZExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto tmp_v8i32 = m_ir_builder->CreateMul(va_v8i32, vb_v8i32); - - auto undef_v8i32 = UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)); - u32 mask1_v4i32[4] = { 0, 2, 4, 6 }; - auto tmp1_v4i32 = m_ir_builder->CreateShuffleVector(tmp_v8i32, undef_v8i32, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - u32 mask2_v4i32[4] = { 1, 3, 5, 7 }; - auto tmp2_v4i32 = m_ir_builder->CreateShuffleVector(tmp_v8i32, undef_v8i32, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); - - SetVr(vd, res_v4i32); - - // TODO: Try to optimize with horizontal add -} - -void Compiler::VMSUMUHS(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto va_v8i32 = m_ir_builder->CreateZExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto vb_v8i32 = m_ir_builder->CreateZExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); - auto tmp_v8i32 = m_ir_builder->CreateMul(va_v8i32, vb_v8i32); - auto tmp_v8i64 = m_ir_builder->CreateZExt(tmp_v8i32, VectorType::get(m_ir_builder->getInt64Ty(), 8)); - - u32 mask1_v4i32[4] = { 0, 2, 4, 6 }; - u32 mask2_v4i32[4] = { 1, 3, 5, 7 }; - auto tmp1_v4i64 = m_ir_builder->CreateShuffleVector(tmp_v8i64, UndefValue::get(tmp_v8i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto tmp2_v4i64 = m_ir_builder->CreateShuffleVector(tmp_v8i64, UndefValue::get(tmp_v8i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - auto vc_v4i64 = m_ir_builder->CreateZExt(vc_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto res_v4i64 = m_ir_builder->CreateAdd(tmp1_v4i64, tmp2_v4i64); - res_v4i64 = m_ir_builder->CreateAdd(res_v4i64, vc_v4i64); - auto gt_v4i1 = m_ir_builder->CreateICmpUGT(res_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0xFFFFFFFF))); - auto gt_v4i64 = m_ir_builder->CreateSExt(gt_v4i1, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - res_v4i64 = m_ir_builder->CreateOr(res_v4i64, gt_v4i64); - auto res_v4i32 = m_ir_builder->CreateTrunc(res_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VMULESB(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - va_v8i16 = m_ir_builder->CreateAShr(va_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateAShr(vb_v8i16, 8); - auto res_v8i16 = m_ir_builder->CreateMul(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMULESH(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - va_v4i32 = m_ir_builder->CreateAShr(va_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateAShr(vb_v4i32, 16); - auto res_v4i32 = m_ir_builder->CreateMul(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMULEUB(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - va_v8i16 = m_ir_builder->CreateLShr(va_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateLShr(vb_v8i16, 8); - auto res_v8i16 = m_ir_builder->CreateMul(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMULEUH(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - va_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, 16); - auto res_v4i32 = m_ir_builder->CreateMul(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMULOSB(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - va_v8i16 = m_ir_builder->CreateShl(va_v8i16, 8); - va_v8i16 = m_ir_builder->CreateAShr(va_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateShl(vb_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateAShr(vb_v8i16, 8); - auto res_v8i16 = m_ir_builder->CreateMul(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMULOSH(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - va_v4i32 = m_ir_builder->CreateShl(va_v4i32, 16); - va_v4i32 = m_ir_builder->CreateAShr(va_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateShl(vb_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateAShr(vb_v4i32, 16); - auto res_v4i32 = m_ir_builder->CreateMul(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VMULOUB(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - va_v8i16 = m_ir_builder->CreateShl(va_v8i16, 8); - va_v8i16 = m_ir_builder->CreateLShr(va_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateShl(vb_v8i16, 8); - vb_v8i16 = m_ir_builder->CreateLShr(vb_v8i16, 8); - auto res_v8i16 = m_ir_builder->CreateMul(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VMULOUH(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - va_v4i32 = m_ir_builder->CreateShl(va_v4i32, 16); - va_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateShl(vb_v4i32, 16); - vb_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, 16); - auto res_v4i32 = m_ir_builder->CreateMul(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VNMSUBFP(u32 vd, u32 va, u32 vc, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto vc_v4f32 = GetVrAsFloatVec(vc); - vc_v4f32 = m_ir_builder->CreateFNeg(vc_v4f32); - auto res_v4f32 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, VectorType::get(m_ir_builder->getFloatTy(), 4)), va_v4f32, vc_v4f32, vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VNOR(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateOr(va_v8i16, vb_v8i16); - res_v8i16 = m_ir_builder->CreateNot(res_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VOR(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateOr(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VPERM(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto vc_v16i8 = GetVrAsIntVec(vc, 8); - - auto thrity_one_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(31)); - vc_v16i8 = m_ir_builder->CreateAnd(vc_v16i8, thrity_one_v16i8); - - auto fifteen_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(15)); - auto vc_le15_v16i8 = m_ir_builder->CreateSub(fifteen_v16i8, vc_v16i8); - auto res_va_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_ssse3_pshuf_b_128), va_v16i8, vc_le15_v16i8); - - auto vc_gt15_v16i8 = m_ir_builder->CreateSub(thrity_one_v16i8, vc_v16i8); - auto cmp_i1 = m_ir_builder->CreateICmpUGT(vc_gt15_v16i8, fifteen_v16i8); - auto cmp_i8 = m_ir_builder->CreateSExt(cmp_i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - vc_gt15_v16i8 = m_ir_builder->CreateOr(cmp_i8, vc_gt15_v16i8); - auto res_vb_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_ssse3_pshuf_b_128), vb_v16i8, vc_gt15_v16i8); - - auto res_v16i8 = m_ir_builder->CreateOr(res_vb_v16i8, res_va_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VPKPX(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - auto tmpa_v4i32 = m_ir_builder->CreateShl(va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(7))); - tmpa_v4i32 = m_ir_builder->CreateAnd(tmpa_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFC000000))); - va_v4i32 = m_ir_builder->CreateShl(va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(10))); - va_v4i32 = m_ir_builder->CreateAnd(va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(~0xFC000000))); - tmpa_v4i32 = m_ir_builder->CreateOr(tmpa_v4i32, va_v4i32); - tmpa_v4i32 = m_ir_builder->CreateAnd(tmpa_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFFE00000))); - va_v4i32 = m_ir_builder->CreateShl(va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3))); - va_v4i32 = m_ir_builder->CreateAnd(va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(~0xFFE00000))); - tmpa_v4i32 = m_ir_builder->CreateOr(tmpa_v4i32, va_v4i32); - auto tmpa_v8i16 = m_ir_builder->CreateBitCast(tmpa_v4i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - - auto tmpb_v4i32 = m_ir_builder->CreateShl(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(7))); - tmpb_v4i32 = m_ir_builder->CreateAnd(tmpb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFC000000))); - vb_v4i32 = m_ir_builder->CreateShl(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(10))); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(~0xFC000000))); - tmpb_v4i32 = m_ir_builder->CreateOr(tmpb_v4i32, vb_v4i32); - tmpb_v4i32 = m_ir_builder->CreateAnd(tmpb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFFE00000))); - vb_v4i32 = m_ir_builder->CreateShl(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3))); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(~0xFFE00000))); - tmpb_v4i32 = m_ir_builder->CreateOr(tmpb_v4i32, vb_v4i32); - auto tmpb_v8i16 = m_ir_builder->CreateBitCast(tmpb_v4i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - - u32 mask_v8i32[8] = { 1, 3, 5, 7, 9, 11, 13, 15 }; - auto res_v8i16 = m_ir_builder->CreateShuffleVector(tmpb_v8i16, tmpa_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - - SetVr(vd, res_v8i16); - - // TODO: Implement with pext on CPUs with BMI -} - -void Compiler::VPKSHSS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_packsswb_128), vb_v8i16, va_v8i16); - SetVr(vd, res_v16i8); - - // TODO: VSCR.SAT -} - -void Compiler::VPKSHUS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_packuswb_128), vb_v8i16, va_v8i16); - SetVr(vd, res_v16i8); - - // TODO: VSCR.SAT -} - -void Compiler::VPKSWSS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_packssdw_128), vb_v4i32, va_v4i32); - SetVr(vd, res_v8i16); - - // TODO: VSCR.SAT -} - -void Compiler::VPKSWUS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_packusdw), vb_v4i32, va_v4i32); - SetVr(vd, res_v8i16); - - // TODO: VSCR.SAT -} - -void Compiler::VPKUHUM(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - - u32 mask_v16i32[16] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }; - auto res_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, va_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - SetVr(vd, res_v16i8); -} - -void Compiler::VPKUHUS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - va_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminuw), va_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xFF))); - vb_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminuw), vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xFF))); - auto va_v16i8 = m_ir_builder->CreateBitCast(va_v8i16, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - auto vb_v16i8 = m_ir_builder->CreateBitCast(vb_v8i16, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - u32 mask_v16i32[16] = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }; - auto res_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, va_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - SetVr(vd, res_v16i8); - - // TODO: Set VSCR.SAT -} - -void Compiler::VPKUWUM(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - - u32 mask_v8i32[8] = { 0, 2, 4, 6, 8, 10, 12, 14 }; - auto res_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, va_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - SetVr(vd, res_v8i16); -} - -void Compiler::VPKUWUS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - va_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminud), va_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFFFF))); - vb_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminud), vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFFFF))); - auto va_v8i16 = m_ir_builder->CreateBitCast(va_v4i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - auto vb_v8i16 = m_ir_builder->CreateBitCast(vb_v4i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - - u32 mask_v8i32[8] = { 0, 2, 4, 6, 8, 10, 12, 14 }; - auto res_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, va_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - SetVr(vd, res_v8i16); - - // TODO: Set VSCR.SAT -} - -void Compiler::VREFP(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_rcp_ps), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VRFIM(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::floor, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VRFIN(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::nearbyint, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VRFIP(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::ceil, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VRFIZ(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::trunc, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VRLB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(7))); - auto tmp1_v16i8 = m_ir_builder->CreateShl(va_v16i8, vb_v16i8); - vb_v16i8 = m_ir_builder->CreateSub(m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(8)), vb_v16i8); - auto tmp2_v16i8 = m_ir_builder->CreateLShr(va_v16i8, vb_v16i8); - auto res_v16i8 = m_ir_builder->CreateOr(tmp1_v16i8, tmp2_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VRLH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); - auto tmp1_v8i16 = m_ir_builder->CreateShl(va_v8i16, vb_v8i16); - vb_v8i16 = m_ir_builder->CreateSub(m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0x10)), vb_v8i16); - auto tmp2_v8i16 = m_ir_builder->CreateLShr(va_v8i16, vb_v8i16); - auto res_v8i16 = m_ir_builder->CreateOr(tmp1_v8i16, tmp2_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VRLW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); - auto tmp1_v4i32 = m_ir_builder->CreateShl(va_v4i32, vb_v4i32); - vb_v4i32 = m_ir_builder->CreateSub(m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x20)), vb_v4i32); - auto tmp2_v4i32 = m_ir_builder->CreateLShr(va_v4i32, vb_v4i32); - auto res_v4i32 = m_ir_builder->CreateOr(tmp1_v4i32, tmp2_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VRSQRTEFP(u32 vd, u32 vb) { - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, VectorType::get(m_ir_builder->getFloatTy(), 4)), vb_v4f32); - res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_rcp_ps), res_v4f32); - SetVr(vd, res_v4f32); -} - -void Compiler::VSEL(u32 vd, u32 va, u32 vb, u32 vc) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto vc_v4i32 = GetVrAsIntVec(vc, 32); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, vc_v4i32); - vc_v4i32 = m_ir_builder->CreateNot(vc_v4i32); - va_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vc_v4i32); - auto vd_v4i32 = m_ir_builder->CreateOr(va_v4i32, vb_v4i32); - SetVr(vd, vd_v4i32); -} - -void Compiler::VSL(u32 vd, u32 va, u32 vb) { - auto va_i128 = GetVr(va); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); - sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x7); - auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); - va_i128 = m_ir_builder->CreateShl(va_i128, sh_i128); - SetVr(vd, va_i128); -} - -void Compiler::VSLB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); - auto res_v16i8 = m_ir_builder->CreateShl(va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - sh = 16 - sh; - u32 mask_v16i32[16] = { sh, sh + 1, sh + 2, sh + 3, sh + 4, sh + 5, sh + 6, sh + 7, sh + 8, sh + 9, sh + 10, sh + 11, sh + 12, sh + 13, sh + 14, sh + 15 }; - auto vd_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, va_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); - SetVr(vd, vd_v16i8); -} - -void Compiler::VSLH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); - auto res_v8i16 = m_ir_builder->CreateShl(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VSLO(u32 vd, u32 va, u32 vb) { - auto va_i128 = GetVr(va); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); - sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x78); - auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); - va_i128 = m_ir_builder->CreateShl(va_i128, sh_i128); - SetVr(vd, va_i128); -} - -void Compiler::VSLW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); - auto res_v4i32 = m_ir_builder->CreateShl(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VSPLTB(u32 vd, u32 uimm5, u32 vb) { - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto undef_v16i8 = UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)); - auto mask_v16i32 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt32(15 - uimm5)); - auto res_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, undef_v16i8, mask_v16i32); - SetVr(vd, res_v16i8); -} - -void Compiler::VSPLTH(u32 vd, u32 uimm5, u32 vb) { - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto undef_v8i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)); - auto mask_v8i32 = m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt32(7 - uimm5)); - auto res_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, undef_v8i16, mask_v8i32); - SetVr(vd, res_v8i16); -} - -void Compiler::VSPLTISB(u32 vd, s32 simm5) { - auto vd_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8((s8)simm5)); - SetVr(vd, vd_v16i8); -} - -void Compiler::VSPLTISH(u32 vd, s32 simm5) { - auto vd_v8i16 = m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16((s16)simm5)); - SetVr(vd, vd_v8i16); -} - -void Compiler::VSPLTISW(u32 vd, s32 simm5) { - auto vd_v4i32 = m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32((s32)simm5)); - SetVr(vd, vd_v4i32); -} - -void Compiler::VSPLTW(u32 vd, u32 uimm5, u32 vb) { - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto undef_v4i32 = UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto mask_v4i32 = m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3 - uimm5)); - auto res_v4i32 = m_ir_builder->CreateShuffleVector(vb_v4i32, undef_v4i32, mask_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VSR(u32 vd, u32 va, u32 vb) { - auto va_i128 = GetVr(va); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); - sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x7); - auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); - va_i128 = m_ir_builder->CreateLShr(va_i128, sh_i128); - SetVr(vd, va_i128); -} - -void Compiler::VSRAB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); - auto res_v16i8 = m_ir_builder->CreateAShr(va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VSRAH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); - auto res_v8i16 = m_ir_builder->CreateAShr(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VSRAW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); - auto res_v4i32 = m_ir_builder->CreateAShr(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VSRB(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); - auto res_v16i8 = m_ir_builder->CreateLShr(va_v16i8, vb_v16i8); - SetVr(vd, res_v16i8); -} - -void Compiler::VSRH(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); - auto res_v8i16 = m_ir_builder->CreateLShr(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::VSRO(u32 vd, u32 va, u32 vb) { - auto va_i128 = GetVr(va); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); - sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x78); - auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); - va_i128 = m_ir_builder->CreateLShr(va_i128, sh_i128); - SetVr(vd, va_i128); -} - -void Compiler::VSRW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); - auto res_v4i32 = m_ir_builder->CreateLShr(va_v4i32, vb_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VSUBCUW(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - auto cmpv4i1 = m_ir_builder->CreateICmpUGE(va_v4i32, vb_v4i32); - auto cmpv4i32 = m_ir_builder->CreateZExt(cmpv4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, cmpv4i32); -} - -void Compiler::VSUBFP(u32 vd, u32 va, u32 vb) { - auto va_v4f32 = GetVrAsFloatVec(va); - auto vb_v4f32 = GetVrAsFloatVec(vb); - auto diff_v4f32 = m_ir_builder->CreateFSub(va_v4f32, vb_v4f32); - SetVr(vd, diff_v4f32); -} - -void Compiler::VSUBSBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto diff_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubs_b), va_v16i8, vb_v16i8); - SetVr(vd, diff_v16i8); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUBSHS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto diff_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubs_w), va_v8i16, vb_v8i16); - SetVr(vd, diff_v8i16); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUBSWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - // See the comments for VADDSWS for a detailed description of how this works - - // Find the result in case of an overflow - auto tmp1_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 31); - tmp1_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x7FFFFFFF))); - auto tmp1_v16i8 = m_ir_builder->CreateBitCast(tmp1_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // Find the elements that can overflow (elements with opposite sign bits) - auto tmp2_v4i32 = m_ir_builder->CreateXor(va_v4i32, vb_v4i32); - - // Perform the sub - auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); - auto diff_v16i8 = m_ir_builder->CreateBitCast(diff_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // Find the elements that overflowed - auto tmp3_v4i32 = m_ir_builder->CreateXor(va_v4i32, diff_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, tmp3_v4i32); - tmp3_v4i32 = m_ir_builder->CreateAShr(tmp3_v4i32, 31); - auto tmp3_v16i8 = m_ir_builder->CreateBitCast(tmp3_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); - - // tmp4 is equal to 0xFFFFFFFF if an overflow occured and 0x00000000 otherwise. - auto res_v16i8 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pblendvb), diff_v16i8, tmp1_v16i8, tmp3_v16i8); - SetVr(vd, res_v16i8); - - // TODO: Set SAT -} - -void Compiler::VSUBUBM(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto diff_v16i8 = m_ir_builder->CreateSub(va_v16i8, vb_v16i8); - SetVr(vd, diff_v16i8); -} - -void Compiler::VSUBUBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - auto diff_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubus_b), va_v16i8, vb_v16i8); - SetVr(vd, diff_v16i8); - - // TODO: Set SAT -} - -void Compiler::VSUBUHM(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto diff_v8i16 = m_ir_builder->CreateSub(va_v8i16, vb_v8i16); - SetVr(vd, diff_v8i16); -} - -void Compiler::VSUBUHS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto diff_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubus_w), va_v8i16, vb_v8i16); - SetVr(vd, diff_v8i16); - - // TODO: Set SAT -} - -void Compiler::VSUBUWM(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); - SetVr(vd, diff_v4i32); -} - -void Compiler::VSUBUWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); - auto cmp_v4i1 = m_ir_builder->CreateICmpULE(diff_v4i32, va_v4i32); - auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto res_v4i32 = m_ir_builder->CreateAnd(diff_v4i32, cmp_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Set SAT -} - -void Compiler::VSUMSWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - auto res_i32 = m_ir_builder->CreateExtractElement(vb_v4i32, m_ir_builder->getInt32(3)); - auto res_i64 = m_ir_builder->CreateSExt(res_i32, m_ir_builder->getInt64Ty()); - for (auto i = 0; i < 4; i++) { - auto va_i32 = m_ir_builder->CreateExtractElement(va_v4i32, m_ir_builder->getInt32(i)); - auto va_i64 = m_ir_builder->CreateSExt(va_i32, m_ir_builder->getInt64Ty()); - res_i64 = m_ir_builder->CreateAdd(res_i64, va_i64); - } - - auto gt_i1 = m_ir_builder->CreateICmpSGT(res_i64, m_ir_builder->getInt64(0x7FFFFFFFull)); - auto lt_i1 = m_ir_builder->CreateICmpSLT(res_i64, m_ir_builder->getInt64(0xFFFFFFFF80000000ull)); - res_i64 = m_ir_builder->CreateSelect(gt_i1, m_ir_builder->getInt64(0x7FFFFFFFull), res_i64); - res_i64 = m_ir_builder->CreateSelect(lt_i1, m_ir_builder->getInt64(0xFFFFFFFF80000000ull), res_i64); - auto res_i128 = m_ir_builder->CreateZExt(res_i64, m_ir_builder->getIntNTy(128)); - - SetVr(vd, res_i128); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUM2SWS(u32 vd, u32 va, u32 vb) { - auto va_v4i32 = GetVrAsIntVec(va, 32); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - u32 mask1_v2i32[2] = { 0, 2 }; - u32 mask2_v2i32[2] = { 1, 3 }; - auto va_v4i64 = m_ir_builder->CreateSExt(va_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto va1_v2i64 = m_ir_builder->CreateShuffleVector(va_v4i64, UndefValue::get(va_v4i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v2i32)); - auto va2_v2i64 = m_ir_builder->CreateShuffleVector(va_v4i64, UndefValue::get(va_v4i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v2i32)); - auto vb_v4i64 = m_ir_builder->CreateSExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - auto vb_v2i64 = m_ir_builder->CreateShuffleVector(vb_v4i64, UndefValue::get(vb_v4i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v2i32)); - - auto res_v2i64 = m_ir_builder->CreateAdd(va1_v2i64, va2_v2i64); - res_v2i64 = m_ir_builder->CreateAdd(res_v2i64, vb_v2i64); - auto gt_v2i1 = m_ir_builder->CreateICmpSGT(res_v2i64, m_ir_builder->CreateVectorSplat(2, m_ir_builder->getInt64(0x7FFFFFFFull))); - auto lt_v2i1 = m_ir_builder->CreateICmpSLT(res_v2i64, m_ir_builder->CreateVectorSplat(2, m_ir_builder->getInt64(0xFFFFFFFF80000000ull))); - res_v2i64 = m_ir_builder->CreateSelect(gt_v2i1, m_ir_builder->CreateVectorSplat(2, m_ir_builder->getInt64(0x7FFFFFFFull)), res_v2i64); - res_v2i64 = m_ir_builder->CreateSelect(lt_v2i1, m_ir_builder->CreateVectorSplat(2, m_ir_builder->getInt64(0x80000000ull)), res_v2i64); - SetVr(vd, res_v2i64); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUM4SBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - u32 mask1_v4i32[4] = { 0, 4, 8, 12 }; - u32 mask2_v4i32[4] = { 1, 5, 9, 13 }; - u32 mask3_v4i32[4] = { 2, 6, 10, 14 }; - u32 mask4_v4i32[4] = { 3, 7, 11, 15 }; - auto va_v16i64 = m_ir_builder->CreateSExt(va_v16i8, VectorType::get(m_ir_builder->getInt64Ty(), 16)); - auto va1_v4i64 = m_ir_builder->CreateShuffleVector(va_v16i64, UndefValue::get(va_v16i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto va2_v4i64 = m_ir_builder->CreateShuffleVector(va_v16i64, UndefValue::get(va_v16i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto va3_v4i64 = m_ir_builder->CreateShuffleVector(va_v16i64, UndefValue::get(va_v16i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); - auto va4_v4i64 = m_ir_builder->CreateShuffleVector(va_v16i64, UndefValue::get(va_v16i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); - auto vb_v4i64 = m_ir_builder->CreateSExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - - auto res_v4i64 = m_ir_builder->CreateAdd(va1_v4i64, va2_v4i64); - res_v4i64 = m_ir_builder->CreateAdd(res_v4i64, va3_v4i64); - res_v4i64 = m_ir_builder->CreateAdd(res_v4i64, va4_v4i64); - res_v4i64 = m_ir_builder->CreateAdd(res_v4i64, vb_v4i64); - auto gt_v4i1 = m_ir_builder->CreateICmpSGT(res_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x7FFFFFFFull))); - auto lt_v4i1 = m_ir_builder->CreateICmpSLT(res_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0xFFFFFFFF80000000ull))); - res_v4i64 = m_ir_builder->CreateSelect(gt_v4i1, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x7FFFFFFFull)), res_v4i64); - res_v4i64 = m_ir_builder->CreateSelect(lt_v4i1, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x80000000ull)), res_v4i64); - auto res_v4i32 = m_ir_builder->CreateTrunc(res_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUM4SHS(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - u32 mask1_v4i32[4] = { 0, 2, 4, 6 }; - u32 mask2_v4i32[4] = { 1, 3, 5, 7 }; - auto va_v8i64 = m_ir_builder->CreateSExt(va_v8i16, VectorType::get(m_ir_builder->getInt64Ty(), 8)); - auto va1_v4i64 = m_ir_builder->CreateShuffleVector(va_v8i64, UndefValue::get(va_v8i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto va2_v4i64 = m_ir_builder->CreateShuffleVector(va_v8i64, UndefValue::get(va_v8i64->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto vb_v4i64 = m_ir_builder->CreateSExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); - - auto res_v4i64 = m_ir_builder->CreateAdd(va1_v4i64, va2_v4i64); - res_v4i64 = m_ir_builder->CreateAdd(res_v4i64, vb_v4i64); - auto gt_v4i1 = m_ir_builder->CreateICmpSGT(res_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x7FFFFFFFull))); - auto lt_v4i1 = m_ir_builder->CreateICmpSLT(res_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0xFFFFFFFF80000000ull))); - res_v4i64 = m_ir_builder->CreateSelect(gt_v4i1, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x7FFFFFFFull)), res_v4i64); - res_v4i64 = m_ir_builder->CreateSelect(lt_v4i1, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(0x80000000ull)), res_v4i64); - auto res_v4i32 = m_ir_builder->CreateTrunc(res_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VSUM4UBS(u32 vd, u32 va, u32 vb) { - auto va_v16i8 = GetVrAsIntVec(va, 8); - auto vb_v4i32 = GetVrAsIntVec(vb, 32); - - u32 mask1_v4i32[4] = { 0, 4, 8, 12 }; - u32 mask2_v4i32[4] = { 1, 5, 9, 13 }; - u32 mask3_v4i32[4] = { 2, 6, 10, 14 }; - u32 mask4_v4i32[4] = { 3, 7, 11, 15 }; - auto va1_v4i8 = m_ir_builder->CreateShuffleVector(va_v16i8, UndefValue::get(va_v16i8->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); - auto va1_v4i32 = m_ir_builder->CreateZExt(va1_v4i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto va2_v4i8 = m_ir_builder->CreateShuffleVector(va_v16i8, UndefValue::get(va_v16i8->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); - auto va2_v4i32 = m_ir_builder->CreateZExt(va2_v4i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto va3_v4i8 = m_ir_builder->CreateShuffleVector(va_v16i8, UndefValue::get(va_v16i8->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); - auto va3_v4i32 = m_ir_builder->CreateZExt(va3_v4i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - auto va4_v4i8 = m_ir_builder->CreateShuffleVector(va_v16i8, UndefValue::get(va_v16i8->getType()), ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); - auto va4_v4i32 = m_ir_builder->CreateZExt(va4_v4i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - - auto res_v4i32 = m_ir_builder->CreateAdd(va1_v4i32, va2_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, va3_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, va4_v4i32); - res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vb_v4i32); - auto lt_v4i1 = m_ir_builder->CreateICmpULT(res_v4i32, vb_v4i32); - auto lt_v4i32 = m_ir_builder->CreateSExt(lt_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - res_v4i32 = m_ir_builder->CreateOr(lt_v4i32, res_v4i32); - SetVr(vd, res_v4i32); - - // TODO: Set VSCR.SAT -} - -void Compiler::VUPKHPX(u32 vd, u32 vb) { - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v8i32[8] = { 4, 4, 5, 5, 6, 6, 7, 7 }; - vb_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - - auto vb_v4i32 = m_ir_builder->CreateBitCast(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - vb_v4i32 = m_ir_builder->CreateAShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(10))); - auto tmp1_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3))); - tmp1_v4i32 = m_ir_builder->CreateAnd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x00001F00))); - auto tmp2_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(6))); - tmp2_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x0000001F))); - auto res_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFF1F0000))); - res_v4i32 = m_ir_builder->CreateOr(res_v4i32, tmp1_v4i32); - res_v4i32 = m_ir_builder->CreateOr(res_v4i32, tmp2_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VUPKHSB(u32 vd, u32 vb) { - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - u32 mask_v8i32[8] = { 8, 9, 10, 11, 12, 13, 14, 15 }; - auto vb_v8i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - auto res_v8i16 = m_ir_builder->CreateSExt(vb_v8i8, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, res_v8i16); -} - -void Compiler::VUPKHSH(u32 vd, u32 vb) { - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v4i32[4] = { 4, 5, 6, 7 }; - auto vb_v4i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); - auto res_v4i32 = m_ir_builder->CreateSExt(vb_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, res_v4i32); -} - -void Compiler::VUPKLPX(u32 vd, u32 vb) { - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v8i32[8] = { 0, 0, 1, 1, 2, 2, 3, 3 }; - vb_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - - auto vb_v4i32 = m_ir_builder->CreateBitCast(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - vb_v4i32 = m_ir_builder->CreateAShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(10))); - auto tmp1_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3))); - tmp1_v4i32 = m_ir_builder->CreateAnd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x00001F00))); - auto tmp2_v4i32 = m_ir_builder->CreateLShr(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(6))); - tmp2_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x0000001F))); - auto res_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0xFF1F0000))); - res_v4i32 = m_ir_builder->CreateOr(res_v4i32, tmp1_v4i32); - res_v4i32 = m_ir_builder->CreateOr(res_v4i32, tmp2_v4i32); - SetVr(vd, res_v4i32); -} - -void Compiler::VUPKLSB(u32 vd, u32 vb) { - auto vb_v16i8 = GetVrAsIntVec(vb, 8); - u32 mask_v8i32[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; - auto vb_v8i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); - auto res_v8i16 = m_ir_builder->CreateSExt(vb_v8i8, VectorType::get(m_ir_builder->getInt16Ty(), 8)); - SetVr(vd, res_v8i16); -} - -void Compiler::VUPKLSH(u32 vd, u32 vb) { - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - u32 mask_v4i32[4] = { 0, 1, 2, 3 }; - auto vb_v4i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); - auto res_v4i32 = m_ir_builder->CreateSExt(vb_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); - SetVr(vd, res_v4i32); -} - -void Compiler::VXOR(u32 vd, u32 va, u32 vb) { - auto va_v8i16 = GetVrAsIntVec(va, 16); - auto vb_v8i16 = GetVrAsIntVec(vb, 16); - auto res_v8i16 = m_ir_builder->CreateXor(va_v8i16, vb_v8i16); - SetVr(vd, res_v8i16); -} - -void Compiler::MULLI(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(MULLI, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - auto ra_i64 = GetGpr(ra); - auto res_i64 = m_ir_builder->CreateMul(ra_i64, m_ir_builder->getInt64((s64)simm16)); - SetGpr(rd, res_i64); -} - -void Compiler::SUBFIC(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(SUBFIC, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)) - - auto ra_i64 = GetGpr(ra); - ra_i64 = m_ir_builder->CreateNeg(ra_i64); // simpler way of doing ~ra + 1 - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, m_ir_builder->getInt64((s64)simm16)); - auto diff_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - auto is_zero = m_ir_builder->CreateICmpEQ(ra_i64, m_ir_builder->getInt64(0)); // if ra is zero when ~ra + 1 = 0 sets overflow bit - carry_i1 = m_ir_builder->CreateOr(is_zero, carry_i1); - SetGpr(rd, diff_i64); - SetXerCa(carry_i1); -} - -void Compiler::CMPLI(u32 crfd, u32 l, u32 ra, u32 uimm16) { - USE_INTERP_IF_REQUESTED(CMPLI, m_ir_builder->getInt32(crfd), m_ir_builder->getInt32(l), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(uimm16)); - - Value * ra_i64; - if (l == 0) { - ra_i64 = m_ir_builder->CreateZExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); - } - else { - ra_i64 = GetGpr(ra); - } - - SetCrFieldUnsignedCmp(crfd, ra_i64, m_ir_builder->getInt64(uimm16)); -} - -void Compiler::CMPI(u32 crfd, u32 l, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(CMPI, m_ir_builder->getInt32(crfd), m_ir_builder->getInt32(l), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - Value * ra_i64; - if (l == 0) { - ra_i64 = m_ir_builder->CreateSExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); - } - else { - ra_i64 = GetGpr(ra); - } - - SetCrFieldSignedCmp(crfd, ra_i64, m_ir_builder->getInt64((s64)simm16)); -} - -void Compiler::ADDIC(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(ADDIC, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - auto ra_i64 = GetGpr(ra); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), m_ir_builder->getInt64((s64)simm16), ra_i64); - auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - SetGpr(rd, sum_i64); - SetXerCa(carry_i1); -} - -void Compiler::ADDIC_(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(ADDIC_, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - ADDIC(rd, ra, simm16); - SetCrFieldSignedCmp(0, GetGpr(rd), m_ir_builder->getInt64(0)); -} - -void Compiler::ADDI(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(ADDI, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - if (ra == 0) { - SetGpr(rd, m_ir_builder->getInt64((s64)simm16)); - } - else { - auto ra_i64 = GetGpr(ra); - auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, m_ir_builder->getInt64((s64)simm16)); - SetGpr(rd, sum_i64); - } -} - -void Compiler::ADDIS(u32 rd, u32 ra, s32 simm16) { - USE_INTERP_IF_REQUESTED(ADDIS, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(simm16)); - - if (ra == 0) { - SetGpr(rd, m_ir_builder->getInt64((s64)simm16 << 16)); - } - else { - auto ra_i64 = GetGpr(ra); - auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, m_ir_builder->getInt64((s64)simm16 << 16)); - SetGpr(rd, sum_i64); - } -} - -void Compiler::BC(u32 bo, u32 bi, s32 bd, u32 aa, u32 lk) { - auto target_i64 = m_ir_builder->getInt64(branchTarget(aa ? 0 : m_state.current_instruction_address, bd)); - auto target_i32 = m_ir_builder->CreateTrunc(target_i64, m_ir_builder->getInt32Ty()); - CreateBranch(CheckBranchCondition(bo, bi), target_i32, lk ? true : false); -} - -void Compiler::HACK(u32 index) { - llvm::Value *status = Call("wrappedExecutePPUFuncByIndex", m_state.args[CompileTaskState::Args::State], m_ir_builder->getInt32(index & EIF_USE_BRANCH ? index : index & ~EIF_PERFORM_BLR)); - llvm::BasicBlock *cputhreadexitblock = GetBasicBlockFromAddress(m_state.current_instruction_address, "early_exit"); - llvm::Value *isCPUThreadExit = m_ir_builder->CreateICmpEQ(status, m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(isCPUThreadExit, cputhreadexitblock, normal_execution); - m_ir_builder->SetInsertPoint(cputhreadexitblock); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - - m_ir_builder->SetInsertPoint(normal_execution); - if (index & EIF_PERFORM_BLR || index & EIF_USE_BRANCH) { - auto lr_i32 = index & EIF_USE_BRANCH ? GetPc() : m_ir_builder->CreateTrunc(m_ir_builder->CreateAnd(GetLr(), ~0x3ULL), m_ir_builder->getInt32Ty()); - CreateBranch(nullptr, lr_i32, false, (index & EIF_USE_BRANCH) == 0); - } -} - -void Compiler::SC(u32 lev) { - switch (lev) { - case 0: - { - llvm::Value *status = Call("wrappedDoSyscall", m_state.args[CompileTaskState::Args::State], GetGpr(11)); - llvm::BasicBlock *cputhreadexitblock = GetBasicBlockFromAddress(m_state.current_instruction_address, "early_exit"); - llvm::Value *isCPUThreadExit = m_ir_builder->CreateICmpEQ(status, m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(isCPUThreadExit, cputhreadexitblock, normal_execution); - m_ir_builder->SetInsertPoint(cputhreadexitblock); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - m_ir_builder->SetInsertPoint(normal_execution); - } - break; - case 3: - Call("PPUThread.fast_stop", m_state.args[CompileTaskState::Args::State]); - break; - default: - CompilationError(fmt::format("SC %u", lev)); - break; - } - - auto ret_i1 = Call("PollStatus", m_state.args[CompileTaskState::Args::State]); - auto cmp_i1 = m_ir_builder->CreateICmpEQ(ret_i1, m_ir_builder->getInt1(true)); - auto then_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "then_true"); - auto merge_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "merge_true"); - m_ir_builder->CreateCondBr(cmp_i1, then_bb, merge_bb); - m_ir_builder->SetInsertPoint(then_bb); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusBlockEnded)); - m_ir_builder->SetInsertPoint(merge_bb); -} - -void Compiler::B(s32 ll, u32 aa, u32 lk) { - auto target_i64 = m_ir_builder->getInt64(branchTarget(aa ? 0 : m_state.current_instruction_address, ll)); - auto target_i32 = m_ir_builder->CreateTrunc(target_i64, m_ir_builder->getInt32Ty()); - CreateBranch(nullptr, target_i32, lk ? true : false); -} - -void Compiler::MCRF(u32 crfd, u32 crfs) { - USE_INTERP_IF_REQUESTED(MCRF, m_ir_builder->getInt32(crfd), m_ir_builder->getInt32(crfs)); - - if (crfd != crfs) { - auto cr_i32 = GetCr(); - auto crf_i32 = GetNibble(cr_i32, crfs); - cr_i32 = SetNibble(cr_i32, crfd, crf_i32); - SetCr(cr_i32); - } -} - -void Compiler::BCLR(u32 bo, u32 bi, u32 bh, u32 lk) { - auto lr_i64 = GetLr(); - lr_i64 = m_ir_builder->CreateAnd(lr_i64, ~0x3ULL); - auto lr_i32 = m_ir_builder->CreateTrunc(lr_i64, m_ir_builder->getInt32Ty()); - CreateBranch(CheckBranchCondition(bo, bi), lr_i32, lk ? true : false, true); -} - -void Compiler::CRNOR(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRNOR, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateOr(ba_i32, bb_i32); - res_i32 = m_ir_builder->CreateXor(res_i32, 1); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::CRANDC(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRANDC, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateXor(bb_i32, 1); - res_i32 = m_ir_builder->CreateAnd(ba_i32, res_i32); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::ISYNC() { - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); -} - -void Compiler::CRXOR(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRXOR, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateXor(ba_i32, bb_i32); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::DCBI(u32 ra, u32 rb) { - // TODO: See if this can be translated to cache flush - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::CRNAND(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRNAND, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateAnd(ba_i32, bb_i32); - res_i32 = m_ir_builder->CreateXor(res_i32, 1); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::CRAND(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRAND, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateAnd(ba_i32, bb_i32); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::CREQV(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CREQV, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateXor(ba_i32, bb_i32); - res_i32 = m_ir_builder->CreateXor(res_i32, 1); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::CRORC(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CRORC, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateXor(bb_i32, 1); - res_i32 = m_ir_builder->CreateOr(ba_i32, res_i32); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::CROR(u32 crbd, u32 crba, u32 crbb) { - USE_INTERP_IF_REQUESTED(CROR, m_ir_builder->getInt32(crbd), m_ir_builder->getInt32(crba), m_ir_builder->getInt32(crbb)); - - auto cr_i32 = GetCr(); - auto ba_i32 = GetBit(cr_i32, crba); - auto bb_i32 = GetBit(cr_i32, crbb); - auto res_i32 = m_ir_builder->CreateOr(ba_i32, bb_i32); - cr_i32 = SetBit(cr_i32, crbd, res_i32); - SetCr(cr_i32); -} - -void Compiler::BCCTR(u32 bo, u32 bi, u32 bh, u32 lk) { - auto ctr_i64 = GetCtr(); - ctr_i64 = m_ir_builder->CreateAnd(ctr_i64, ~0x3ULL); - auto ctr_i32 = m_ir_builder->CreateTrunc(ctr_i64, m_ir_builder->getInt32Ty()); - CreateBranch(CheckBranchCondition(bo, bi), ctr_i32, lk ? true : false); -} - -void Compiler::RLWIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, u32 rc) { - USE_INTERP_IF_REQUESTED(RLWIMI, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(me), m_ir_builder->getInt32(rc)); - - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); - rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); - auto ra_i64 = GetGpr(ra); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - u64 mask = s_rotate_mask[32 + mb][32 + me]; - res_i64 = m_ir_builder->CreateAnd(res_i64, mask); - ra_i64 = m_ir_builder->CreateAnd(ra_i64, ~mask); - res_i64 = m_ir_builder->CreateOr(res_i64, ra_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLWINM(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, u32 rc) { - USE_INTERP_IF_REQUESTED(RLWINM, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(me), m_ir_builder->getInt32(rc)); - - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); - rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[32 + mb][32 + me]); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLWNM(u32 ra, u32 rs, u32 rb, u32 mb, u32 me, u32 rc) { - USE_INTERP_IF_REQUESTED(RLWNM, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(me), m_ir_builder->getInt32(rc)); - - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); - rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); - auto rb_i64 = GetGpr(rb); - auto shl_i64 = m_ir_builder->CreateAnd(rb_i64, 0x1F); - auto shr_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(32), shl_i64); - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, shr_i64); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, shl_i64); - auto res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[32 + mb][32 + me]); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::ORI(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(ORI, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateOr(rs_i64, uimm16); - SetGpr(ra, res_i64); -} - -void Compiler::ORIS(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(ORIS, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateOr(rs_i64, (u64)uimm16 << 16); - SetGpr(ra, res_i64); -} - -void Compiler::XORI(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(XORI, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateXor(rs_i64, uimm16); - SetGpr(ra, res_i64); -} - -void Compiler::XORIS(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(XORIS, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateXor(rs_i64, (u64)uimm16 << 16); - SetGpr(ra, res_i64); -} - -void Compiler::ANDI_(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(ANDI_, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateAnd(rs_i64, uimm16); - SetGpr(ra, res_i64); - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); -} - -void Compiler::ANDIS_(u32 ra, u32 rs, u32 uimm16) { - USE_INTERP_IF_REQUESTED(ANDIS_, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(uimm16)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateAnd(rs_i64, (u64)uimm16 << 16); - SetGpr(ra, res_i64); - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); -} - -void Compiler::RLDICL(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) { - USE_INTERP_IF_REQUESTED(RLDICL, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[mb][63]); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLDICR(u32 ra, u32 rs, u32 sh, u32 me, u32 rc) { - USE_INTERP_IF_REQUESTED(RLDICR, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(me), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[0][me]); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLDIC(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) { - USE_INTERP_IF_REQUESTED(RLDIC, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[mb][63 - sh]); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLDIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 rc) { - USE_INTERP_IF_REQUESTED(RLDIMI, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(mb), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto ra_i64 = GetGpr(ra); - auto res_i64 = rs_i64; - if (sh) { - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); - res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - } - - u64 mask = s_rotate_mask[mb][63 - sh]; - res_i64 = m_ir_builder->CreateAnd(res_i64, mask); - ra_i64 = m_ir_builder->CreateAnd(ra_i64, ~mask); - res_i64 = m_ir_builder->CreateOr(res_i64, ra_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, u32 is_r, u32 rc) { - USE_INTERP_IF_REQUESTED(RLDC_LR, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(m_eb), m_ir_builder->getInt32(is_r), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto shl_i64 = m_ir_builder->CreateAnd(rb_i64, 0x3F); - auto shr_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(64), shl_i64); - auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, shr_i64); - auto resh_i64 = m_ir_builder->CreateShl(rs_i64, shl_i64); - auto res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); - - if (is_r) { - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[0][m_eb]); - } - else { - res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[m_eb][63]); - } - - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::CMP(u32 crfd, u32 l, u32 ra, u32 rb) { - USE_INTERP_IF_REQUESTED(CMP, m_ir_builder->getInt32(crfd), m_ir_builder->getInt32(l), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb)); - - Value * ra_i64; - Value * rb_i64; - if (l == 0) { - ra_i64 = m_ir_builder->CreateSExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); - rb_i64 = m_ir_builder->CreateSExt(GetGpr(rb, 32), m_ir_builder->getInt64Ty()); - } - else { - ra_i64 = GetGpr(ra); - rb_i64 = GetGpr(rb); - } - - SetCrFieldSignedCmp(crfd, ra_i64, rb_i64); -} - -void Compiler::TW(u32 to, u32 ra, u32 rb) { - llvm::Value *gpr_a = GetGpr(ra, 32); - llvm::Value *gpr_b = GetGpr(rb, 32); - llvm::Value *trap_condition = m_ir_builder->getFalse(); - - if (to & 0x10) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSLT(gpr_a, gpr_b)); - if (to & 0x8) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpSGT(gpr_a, gpr_b)); - if (to & 0x4) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpEQ(gpr_a, gpr_b)); - if (to & 0x2) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpULT(gpr_a, gpr_b)); - if (to & 0x1) - trap_condition = m_ir_builder->CreateOr(trap_condition, - m_ir_builder->CreateICmpUGT(gpr_a, gpr_b)); - - llvm::BasicBlock *trap_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "trap_block"); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(trap_condition, trap_block, normal_execution); - - m_ir_builder->SetInsertPoint(trap_block); - Call("trap"); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - - m_ir_builder->SetInsertPoint(normal_execution); -} - -void Compiler::LVSL(u32 vd, u32 ra, u32 rb) { - static const u64 s_lvsl_values[0x10][2] = { - { 0x08090A0B0C0D0E0F, 0x0001020304050607 }, - { 0x090A0B0C0D0E0F10, 0x0102030405060708 }, - { 0x0A0B0C0D0E0F1011, 0x0203040506070809 }, - { 0x0B0C0D0E0F101112, 0x030405060708090A }, - { 0x0C0D0E0F10111213, 0x0405060708090A0B }, - { 0x0D0E0F1011121314, 0x05060708090A0B0C }, - { 0x0E0F101112131415, 0x060708090A0B0C0D }, - { 0x0F10111213141516, 0x0708090A0B0C0D0E }, - { 0x1011121314151617, 0x08090A0B0C0D0E0F }, - { 0x1112131415161718, 0x090A0B0C0D0E0F10 }, - { 0x1213141516171819, 0x0A0B0C0D0E0F1011 }, - { 0x131415161718191A, 0x0B0C0D0E0F101112 }, - { 0x1415161718191A1B, 0x0C0D0E0F10111213 }, - { 0x15161718191A1B1C, 0x0D0E0F1011121314 }, - { 0x161718191A1B1C1D, 0x0E0F101112131415 }, - { 0x1718191A1B1C1D1E, 0x0F10111213141516 }, - }; - - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); - auto lvsl_values_v16i8_ptr = m_ir_builder->CreateIntToPtr(m_ir_builder->getInt64((u64)s_lvsl_values), VectorType::get(m_ir_builder->getInt8Ty(), 16)->getPointerTo()); - lvsl_values_v16i8_ptr = m_ir_builder->CreateGEP(lvsl_values_v16i8_ptr, index_i64); - auto val_v16i8 = m_ir_builder->CreateAlignedLoad(lvsl_values_v16i8_ptr, 16); - SetVr(vd, val_v16i8); -} - -void Compiler::LVEBX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto val_i8 = ReadMemory(addr_i64, 8); - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(15), index_i64); - auto vd_v16i8 = GetVrAsIntVec(vd, 8); - vd_v16i8 = m_ir_builder->CreateInsertElement(vd_v16i8, val_i8, index_i64); - SetVr(vd, vd_v16i8); -} - -void Compiler::SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - ra_i64 = m_ir_builder->CreateNeg(ra_i64); - auto rb_i64 = GetGpr(rb); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, rb_i64); - auto diff_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - SetGpr(rd, diff_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("SUBFCO"); - } -} - -void Compiler::ADDC(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, rb_i64); - auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - SetGpr(rd, sum_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - } -} - -void Compiler::MULHDU(u32 rd, u32 ra, u32 rb, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto ra_i128 = m_ir_builder->CreateZExt(ra_i64, m_ir_builder->getIntNTy(128)); - auto rb_i128 = m_ir_builder->CreateZExt(rb_i64, m_ir_builder->getIntNTy(128)); - auto prod_i128 = m_ir_builder->CreateMul(ra_i128, rb_i128); - prod_i128 = m_ir_builder->CreateLShr(prod_i128, 64); - auto prod_i64 = m_ir_builder->CreateTrunc(prod_i128, m_ir_builder->getInt64Ty()); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::MULHWU(u32 rd, u32 ra, u32 rb, u32 rc) { - auto ra_i32 = GetGpr(ra, 32); - auto rb_i32 = GetGpr(rb, 32); - auto ra_i64 = m_ir_builder->CreateZExt(ra_i32, m_ir_builder->getInt64Ty()); - auto rb_i64 = m_ir_builder->CreateZExt(rb_i32, m_ir_builder->getInt64Ty()); - auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); - prod_i64 = m_ir_builder->CreateLShr(prod_i64, 32); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::MFOCRF(u32 a, u32 rd, u32 crm) { - USE_INTERP_IF_REQUESTED(MFOCRF, m_ir_builder->getInt32(a), m_ir_builder->getInt32(rd), m_ir_builder->getInt32(crm)); - - auto cr_i32 = GetCr(); - auto cr_i64 = m_ir_builder->CreateZExt(cr_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, cr_i64); -} - -void Compiler::LWARX(u32 rd, u32 ra, u32 rb) { - USE_INTERP_IF_REQUESTED(LWARX, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb)); - - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto addr_i32 = m_ir_builder->CreateTrunc(addr_i64, m_ir_builder->getInt32Ty()); - auto val_i32_ptr = m_ir_builder->CreateAlloca(m_ir_builder->getInt32Ty()); - val_i32_ptr->setAlignment(4); - Call("vm.reservation_acquire", m_ir_builder->CreateBitCast(val_i32_ptr, m_ir_builder->getInt8PtrTy()), addr_i32, m_ir_builder->getInt32(4)); - auto val_i32 = (Value *)m_ir_builder->CreateLoad(val_i32_ptr); - val_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), val_i32); - auto val_i64 = m_ir_builder->CreateZExt(val_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, val_i64); -} - -void Compiler::LDX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetGpr(rd, mem_i64); -} - -void Compiler::LWZX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::SLW(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); - auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); - auto res_i64 = m_ir_builder->CreateShl(rs_i64, rb_i64); - auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); - res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::CNTLZW(u32 ra, u32 rs, u32 rc) { - auto rs_i32 = GetGpr(rs, 32); - auto res_i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::ctlz, m_ir_builder->getInt32Ty()), rs_i32, m_ir_builder->getInt1(false)); - auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::SLD(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); - auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); - auto res_i128 = m_ir_builder->CreateShl(rs_i128, rb_i128); - auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::AND(u32 ra, u32 rs, u32 rb, u32 rc) { - USE_INTERP_IF_REQUESTED(AND, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateAnd(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::CMPL(u32 crfd, u32 l, u32 ra, u32 rb) { - USE_INTERP_IF_REQUESTED(CMPL, m_ir_builder->getInt32(crfd), m_ir_builder->getInt32(l), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb)); - - Value * ra_i64; - Value * rb_i64; - if (l == 0) { - ra_i64 = m_ir_builder->CreateZExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); - rb_i64 = m_ir_builder->CreateZExt(GetGpr(rb, 32), m_ir_builder->getInt64Ty()); - } - else { - ra_i64 = GetGpr(ra); - rb_i64 = GetGpr(rb); - } - - SetCrFieldUnsignedCmp(crfd, ra_i64, rb_i64); -} - -void Compiler::LVSR(u32 vd, u32 ra, u32 rb) { - static const u64 s_lvsr_values[0x10][2] = { - { 0x18191A1B1C1D1E1F, 0x1011121314151617 }, - { 0x1718191A1B1C1D1E, 0x0F10111213141516 }, - { 0x161718191A1B1C1D, 0x0E0F101112131415 }, - { 0x15161718191A1B1C, 0x0D0E0F1011121314 }, - { 0x1415161718191A1B, 0x0C0D0E0F10111213 }, - { 0x131415161718191A, 0x0B0C0D0E0F101112 }, - { 0x1213141516171819, 0x0A0B0C0D0E0F1011 }, - { 0x1112131415161718, 0x090A0B0C0D0E0F10 }, - { 0x1011121314151617, 0x08090A0B0C0D0E0F }, - { 0x0F10111213141516, 0x0708090A0B0C0D0E }, - { 0x0E0F101112131415, 0x060708090A0B0C0D }, - { 0x0D0E0F1011121314, 0x05060708090A0B0C }, - { 0x0C0D0E0F10111213, 0x0405060708090A0B }, - { 0x0B0C0D0E0F101112, 0x030405060708090A }, - { 0x0A0B0C0D0E0F1011, 0x0203040506070809 }, - { 0x090A0B0C0D0E0F10, 0x0102030405060708 }, - }; - - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); - auto lvsr_values_v16i8_ptr = m_ir_builder->CreateIntToPtr(m_ir_builder->getInt64((u64)s_lvsr_values), VectorType::get(m_ir_builder->getInt8Ty(), 16)->getPointerTo()); - lvsr_values_v16i8_ptr = m_ir_builder->CreateGEP(lvsr_values_v16i8_ptr, index_i64); - auto val_v16i8 = m_ir_builder->CreateAlignedLoad(lvsr_values_v16i8_ptr, 16); - SetVr(vd, val_v16i8); -} - -void Compiler::LVEHX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFEULL); - auto val_i16 = ReadMemory(addr_i64, 16, 2); - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateLShr(index_i64, 1); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(7), index_i64); - auto vd_v8i16 = GetVrAsIntVec(vd, 16); - vd_v8i16 = m_ir_builder->CreateInsertElement(vd_v8i16, val_i16, index_i64); - SetVr(vd, vd_v8i16); -} - -void Compiler::SUBF(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(SUBF, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto diff_i64 = m_ir_builder->CreateSub(rb_i64, ra_i64); - SetGpr(rd, diff_i64); - - if (rc) { - SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("SUBFO"); - } -} - -void Compiler::LDUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::DCBST(u32 ra, u32 rb) { - // TODO: Implement this - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::LWZUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::CNTLZD(u32 ra, u32 rs, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto res_i64 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::ctlz, m_ir_builder->getInt64Ty()), rs_i64, m_ir_builder->getInt1(false)); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::ANDC(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - rb_i64 = m_ir_builder->CreateNot(rb_i64); - auto res_i64 = m_ir_builder->CreateAnd(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::TD(u32 to, u32 ra, u32 rb) { - Call("trap"); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); -} - -void Compiler::LVEWX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFCULL); - auto val_i32 = ReadMemory(addr_i64, 32, 4); - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateLShr(index_i64, 2); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(3), index_i64); - auto vd_v4i32 = GetVrAsIntVec(vd, 32); - vd_v4i32 = m_ir_builder->CreateInsertElement(vd_v4i32, val_i32, index_i64); - SetVr(vd, vd_v4i32); -} - -void Compiler::MULHD(u32 rd, u32 ra, u32 rb, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto ra_i128 = m_ir_builder->CreateSExt(ra_i64, m_ir_builder->getIntNTy(128)); - auto rb_i128 = m_ir_builder->CreateSExt(rb_i64, m_ir_builder->getIntNTy(128)); - auto prod_i128 = m_ir_builder->CreateMul(ra_i128, rb_i128); - prod_i128 = m_ir_builder->CreateLShr(prod_i128, 64); - auto prod_i64 = m_ir_builder->CreateTrunc(prod_i128, m_ir_builder->getInt64Ty()); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::MULHW(u32 rd, u32 ra, u32 rb, u32 rc) { - auto ra_i32 = GetGpr(ra, 32); - auto rb_i32 = GetGpr(rb, 32); - auto ra_i64 = m_ir_builder->CreateSExt(ra_i32, m_ir_builder->getInt64Ty()); - auto rb_i64 = m_ir_builder->CreateSExt(rb_i32, m_ir_builder->getInt64Ty()); - auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); - prod_i64 = m_ir_builder->CreateAShr(prod_i64, 32); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::LDARX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto addr_i32 = m_ir_builder->CreateTrunc(addr_i64, m_ir_builder->getInt32Ty()); - auto val_i64_ptr = m_ir_builder->CreateAlloca(m_ir_builder->getInt64Ty()); - val_i64_ptr->setAlignment(8); - Call("vm.reservation_acquire", m_ir_builder->CreateBitCast(val_i64_ptr, m_ir_builder->getInt8PtrTy()), addr_i32, m_ir_builder->getInt32(8)); - auto val_i64 = (Value *)m_ir_builder->CreateLoad(val_i64_ptr); - val_i64 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt64Ty()), val_i64); - SetGpr(rd, val_i64); -} - -void Compiler::DCBF(u32 ra, u32 rb) { - // TODO: Implement this - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::LBZX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i8 = ReadMemory(addr_i64, 8); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LVX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); - auto mem_i128 = ReadMemory(addr_i64, 128, 16); - SetVr(vd, mem_i128); -} - -void Compiler::NEG(u32 rd, u32 ra, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(NEG, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i64 = GetGpr(ra); - auto diff_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(0), ra_i64); - SetGpr(rd, diff_i64); - - if (rc) { - SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("NEGO"); - } -} - -void Compiler::LBZUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i8 = ReadMemory(addr_i64, 8); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::NOR(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateOr(rs_i64, rb_i64); - res_i64 = m_ir_builder->CreateXor(res_i64, (s64)-1); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::STVEBX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(15), index_i64); - auto vs_v16i8 = GetVrAsIntVec(vs, 8); - auto val_i8 = m_ir_builder->CreateExtractElement(vs_v16i8, index_i64); - WriteMemory(addr_i64, val_i8); -} - -void Compiler::SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ca_i64 = GetXerCa(); - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - ra_i64 = m_ir_builder->CreateNot(ra_i64); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry1_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), res_i64, rb_i64); - res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry2_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - auto carry_i1 = m_ir_builder->CreateOr(carry1_i1, carry2_i1); - SetGpr(rd, res_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("SUBFEO"); - } -} - -void Compiler::ADDE(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ca_i64 = GetXerCa(); - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry1_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), res_i64, rb_i64); - res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry2_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - auto carry_i1 = m_ir_builder->CreateOr(carry1_i1, carry2_i1); - SetGpr(rd, res_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("ADDEO"); - } -} - -void Compiler::MTOCRF(u32 l, u32 crm, u32 rs) { - USE_INTERP_IF_REQUESTED(MTOCRF, m_ir_builder->getInt32(l), m_ir_builder->getInt32(crm), m_ir_builder->getInt32(rs)); - - auto rs_i32 = GetGpr(rs, 32); - auto cr_i32 = GetCr(); - u64 mask = 0; - - for (u32 i = 0; i < 8; i++) { - if (crm & (1 << i)) { - mask |= UINT64_C(0xF) << (i * 4); // move 0xF to the left i positions (in hex form) - if (l) { - break; - } - } - } - - cr_i32 = m_ir_builder->CreateAnd(cr_i32, ~mask); // null ith nibble - rs_i32 = m_ir_builder->CreateAnd(rs_i32, mask); // null everything except ith nibble - cr_i32 = m_ir_builder->CreateOr(cr_i32, rs_i32); // now ith cr nibble == ith rs nibble - SetCr(cr_i32); -} - -void Compiler::STDX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 64)); -} - -void Compiler::STWCX_(u32 rs, u32 ra, u32 rb) { - USE_INTERP_IF_REQUESTED(STWCX_, m_ir_builder->getInt32(rs), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb)); - - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto addr_i32 = m_ir_builder->CreateTrunc(addr_i64, m_ir_builder->getInt32Ty()); - auto rs_i32 = GetGpr(rs, 32); - rs_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), rs_i32); - auto rs_i32_ptr = m_ir_builder->CreateAlloca(m_ir_builder->getInt32Ty()); - rs_i32_ptr->setAlignment(4); - m_ir_builder->CreateStore(rs_i32, rs_i32_ptr); - auto success_i1 = Call("vm.reservation_update", addr_i32, m_ir_builder->CreateBitCast(rs_i32_ptr, m_ir_builder->getInt8PtrTy()), m_ir_builder->getInt32(4)); - - auto cr_i32 = GetCr(); - cr_i32 = SetBit(cr_i32, 2, success_i1); - SetCr(cr_i32); -} - -void Compiler::STWX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 32)); -} - -void Compiler::STVEHX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFEULL); - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateLShr(index_i64, 1); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(7), index_i64); - auto vs_v8i16 = GetVrAsIntVec(vs, 16); - auto val_i16 = m_ir_builder->CreateExtractElement(vs_v8i16, index_i64); - WriteMemory(addr_i64, val_i16, 2); -} - -void Compiler::STDUX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 64)); - SetGpr(ra, addr_i64); -} - -void Compiler::STWUX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 32)); - SetGpr(ra, addr_i64); -} - -void Compiler::STVEWX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFCULL); - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - index_i64 = m_ir_builder->CreateLShr(index_i64, 2); - index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(3), index_i64); - auto vs_v4i32 = GetVrAsIntVec(vs, 32); - auto val_i32 = m_ir_builder->CreateExtractElement(vs_v4i32, index_i64); - WriteMemory(addr_i64, val_i32, 4); -} - -void Compiler::ADDZE(u32 rd, u32 ra, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto ca_i64 = GetXerCa(); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - SetGpr(rd, sum_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("ADDZEO"); - } -} - -void Compiler::SUBFZE(u32 rd, u32 ra, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - ra_i64 = m_ir_builder->CreateNot(ra_i64); - auto ca_i64 = GetXerCa(); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - SetGpr(rd, res_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("SUBFZEO"); - } -} - -void Compiler::STDCX_(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto addr_i32 = m_ir_builder->CreateTrunc(addr_i64, m_ir_builder->getInt32Ty()); - auto rs_i64 = GetGpr(rs); - rs_i64 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt64Ty()), rs_i64); - auto rs_i64_ptr = m_ir_builder->CreateAlloca(m_ir_builder->getInt64Ty()); - rs_i64_ptr->setAlignment(8); - m_ir_builder->CreateStore(rs_i64, rs_i64_ptr); - auto success_i1 = Call("vm.reservation_update", addr_i32, m_ir_builder->CreateBitCast(rs_i64_ptr, m_ir_builder->getInt8PtrTy()), m_ir_builder->getInt32(8)); - - auto cr_i32 = GetCr(); - cr_i32 = SetBit(cr_i32, 2, success_i1); - SetCr(cr_i32); -} - -void Compiler::STBX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 8)); -} - -void Compiler::STVX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); - WriteMemory(addr_i64, GetVr(vs), 16); -} - -void Compiler::SUBFME(u32 rd, u32 ra, u32 oe, u32 rc) { - auto ca_i64 = GetXerCa(); - auto ra_i64 = GetGpr(ra); - ra_i64 = m_ir_builder->CreateNot(ra_i64); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry1_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), res_i64, m_ir_builder->getInt64((s64)-1)); - res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry2_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - auto carry_i1 = m_ir_builder->CreateOr(carry1_i1, carry2_i1); - SetGpr(rd, res_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("SUBFMEO"); - } -} - -void Compiler::MULLD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("MULLDO"); - } -} - -void Compiler::ADDME(u32 rd, u32 ra, u32 oe, u32 rc) { - auto ca_i64 = GetXerCa(); - auto ra_i64 = GetGpr(ra); - auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); - auto res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry1_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), res_i64, m_ir_builder->getInt64((s64)-1)); - res_i64 = m_ir_builder->CreateExtractValue(res_s, { 0 }); - auto carry2_i1 = m_ir_builder->CreateExtractValue(res_s, { 1 }); - auto carry_i1 = m_ir_builder->CreateOr(carry1_i1, carry2_i1); - SetGpr(rd, res_i64); - SetXerCa(carry_i1); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("ADDMEO"); - } -} - -void Compiler::MULLW(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(MULLW, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i32 = GetGpr(ra, 32); - auto rb_i32 = GetGpr(rb, 32); - auto ra_i64 = m_ir_builder->CreateSExt(ra_i32, m_ir_builder->getInt64Ty()); - auto rb_i64 = m_ir_builder->CreateSExt(rb_i32, m_ir_builder->getInt64Ty()); - auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); - SetGpr(rd, prod_i64); - - if (rc) { - SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("MULLWO"); - } -} - -void Compiler::DCBTST(u32 ra, u32 rb, u32 th) { - // TODO: Implement this - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::STBUX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 8)); - SetGpr(ra, addr_i64); -} - -void Compiler::ADD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(ADD, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, rb_i64); - SetGpr(rd, sum_i64); - - if (rc) { - SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO: Implement this - CompilationError("ADDO"); - } -} - -void Compiler::DCBT(u32 ra, u32 rb, u32 th) { - // TODO: Implement this using prefetch - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::LHZX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::EQV(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateXor(rs_i64, rb_i64); - res_i64 = m_ir_builder->CreateNot(res_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::ECIWX(u32 rd, u32 ra, u32 rb) { - CompilationError("ECIWX"); - //auto addr_i64 = GetGpr(rb); - //if (ra) { - // auto ra_i64 = GetGpr(ra); - // addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - //} - - //auto mem_i32 = ReadMemory(addr_i64, 32); - //auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - //SetGpr(rd, mem_i64); -} - -void Compiler::LHZUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::XOR(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateXor(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::MFSPR(u32 rd, u32 spr) { - Value * rd_i64; - auto n = (spr >> 5) | ((spr & 0x1f) << 5); - - switch (n) { - case 0x001: - rd_i64 = GetXer(); - break; - case 0x008: - rd_i64 = GetLr(); - break; - case 0x009: - rd_i64 = GetCtr(); - break; - case 0x100: - rd_i64 = GetVrsave(); - break; - case 0x10C: - rd_i64 = Call("get_timebased_time"); - break; - case 0x10D: - rd_i64 = Call("get_timebased_time"); - rd_i64 = m_ir_builder->CreateLShr(rd_i64, 32); - break; - default: - assert(0); - break; - } - - SetGpr(rd, rd_i64); -} - -void Compiler::LWAX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::DST(u32 ra, u32 rb, u32 strm, u32 t) { - // TODO: Revisit - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::LHAX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LVXL(u32 vd, u32 ra, u32 rb) { - LVX(vd, ra, rb); -} - -void Compiler::MFTB(u32 rd, u32 spr) { - auto tb_i64 = Call("get_timebased_time"); - - u32 n = (spr >> 5) | ((spr & 0x1f) << 5); - if (n == 0x10D) { - tb_i64 = m_ir_builder->CreateLShr(tb_i64, 32); - } - - SetGpr(rd, tb_i64); -} - -void Compiler::LWAUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::DSTST(u32 ra, u32 rb, u32 strm, u32 t) { - // TODO: Revisit - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::LHAUX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::STHX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 16)); -} - -void Compiler::ORC(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - rb_i64 = m_ir_builder->CreateNot(rb_i64); - auto res_i64 = m_ir_builder->CreateOr(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::ECOWX(u32 rs, u32 ra, u32 rb) { - CompilationError("ECOWX"); - //auto addr_i64 = GetGpr(rb); - //if (ra) { - // auto ra_i64 = GetGpr(ra); - // addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - //} - - //WriteMemory(addr_i64, GetGpr(rs, 32)); -} - -void Compiler::STHUX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 16)); - SetGpr(ra, addr_i64); -} - -void Compiler::OR(u32 ra, u32 rs, u32 rb, u32 rc) { - USE_INTERP_IF_REQUESTED(OR, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(rc)); - - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateOr(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::DIVDU(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateUDiv(ra_i64, rb_i64); - SetGpr(rd, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("DIVDUO"); - } - - // TODO make sure an exception does not occur on divide by 0 and overflow -} - -void Compiler::DIVWU(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(DIVWU, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i32 = GetGpr(ra, 32); - auto rb_i32 = GetGpr(rb, 32); - auto res_i32 = m_ir_builder->CreateUDiv(ra_i32, rb_i32); - auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("DIVWUO"); - } - - // TODO make sure an exception does not occur on divide by 0 and overflow -} - -void Compiler::MTSPR(u32 spr, u32 rs) { - auto rs_i64 = GetGpr(rs); - auto n = (spr >> 5) | ((spr & 0x1f) << 5); - - switch (n) { - case 0x001: - SetXer(rs_i64); - break; - case 0x008: - SetLr(rs_i64); - break; - case 0x009: - SetCtr(rs_i64); - break; - case 0x100: - SetVrsave(rs_i64); - break; - default: - assert(0); - break; - } -} - -void Compiler::NAND(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateAnd(rs_i64, rb_i64); - res_i64 = m_ir_builder->CreateNot(res_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::STVXL(u32 vs, u32 ra, u32 rb) { - STVX(vs, ra, rb); -} - -void Compiler::DIVD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - auto ra_i64 = GetGpr(ra); - auto rb_i64 = GetGpr(rb); - auto res_i64 = m_ir_builder->CreateSDiv(ra_i64, rb_i64); - SetGpr(rd, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("DIVDO"); - } - - // TODO make sure an exception does not occur on divide by 0 and overflow -} - -void Compiler::DIVW(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) { - USE_INTERP_IF_REQUESTED(DIVW, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rb), m_ir_builder->getInt32(oe), m_ir_builder->getInt32(rc)); - - auto ra_i32 = GetGpr(ra, 32); - auto rb_i32 = GetGpr(rb, 32); - auto res_i32 = m_ir_builder->CreateSDiv(ra_i32, rb_i32); - auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } - - if (oe) { - // TODO implement oe - CompilationError("DIVWO"); - } - - // TODO make sure an exception does not occur on divide by 0 and overflow -} - -void Compiler::LVLX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto eb_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); - eb_i64 = m_ir_builder->CreateShl(eb_i64, 3); - auto eb_i128 = m_ir_builder->CreateZExt(eb_i64, m_ir_builder->getIntNTy(128)); - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); - auto mem_i128 = ReadMemory(addr_i64, 128, 16); - mem_i128 = m_ir_builder->CreateShl(mem_i128, eb_i128); - SetVr(vd, mem_i128); -} - -void Compiler::LDBRX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i64 = ReadMemory(addr_i64, 64, 0, false); - SetGpr(rd, mem_i64); -} - -void Compiler::LSWX(u32 rd, u32 ra, u32 rb) { - CompilationError("LSWX"); -} - -void Compiler::LWBRX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32, 0, false); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LFSX(u32 frd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - SetFpr(frd, mem_i32); -} - -void Compiler::SRW(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); - auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); - auto res_i64 = m_ir_builder->CreateLShr(rs_i64, rb_i64); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::SRD(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); - auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); - auto res_i128 = m_ir_builder->CreateLShr(rs_i128, rb_i128); - auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); - SetGpr(ra, res_i64); - - if (rc) { - SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::LVRX(u32 vd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto eb_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(16), addr_i64); - eb_i64 = m_ir_builder->CreateAnd(eb_i64, 0xF); - eb_i64 = m_ir_builder->CreateShl(eb_i64, 3); - auto eb_i128 = m_ir_builder->CreateZExt(eb_i64, m_ir_builder->getIntNTy(128)); - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); - auto mem_i128 = ReadMemory(addr_i64, 128, 16); - mem_i128 = m_ir_builder->CreateLShr(mem_i128, eb_i128); - auto cmp_i1 = m_ir_builder->CreateICmpNE(eb_i64, m_ir_builder->getInt64(0)); - auto cmp_i128 = m_ir_builder->CreateSExt(cmp_i1, m_ir_builder->getIntNTy(128)); - mem_i128 = m_ir_builder->CreateAnd(mem_i128, cmp_i128); - SetVr(vd, mem_i128); -} - -void Compiler::LSWI(u32 rd, u32 ra, u32 nb) { - auto addr_i64 = ra ? GetGpr(ra) : m_ir_builder->getInt64(0); - - nb = nb ? nb : 32; - for (u32 i = 0; i < nb; i += 4) { - auto val_i32 = ReadMemory(addr_i64, 32, 0, true, false); - - if (i + 4 <= nb) { - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); - } - else { - u32 mask = 0xFFFFFFFF << ((4 - (nb - i)) * 8); - val_i32 = m_ir_builder->CreateAnd(val_i32, mask); - } - - auto val_i64 = m_ir_builder->CreateZExt(val_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, val_i64); - rd = (rd + 1) % 32; - } -} - -void Compiler::LFSUX(u32 frd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - auto mem_i32 = ReadMemory(addr_i64, 32); - SetFpr(frd, mem_i32); - SetGpr(ra, addr_i64); -} - -void Compiler::SYNC(u32 l) { - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); -} - -void Compiler::LFDX(u32 frd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetFpr(frd, mem_i64); -} - -void Compiler::LFDUX(u32 frd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - auto mem_i64 = ReadMemory(addr_i64, 64); - SetFpr(frd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::STVLX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - auto size_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(16), index_i64); - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFF); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); - auto addr_i8_ptr = m_ir_builder->CreateIntToPtr(addr_i64, m_ir_builder->getInt8PtrTy()); - - auto vs_i128 = GetVr(vs); - vs_i128 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, vs_i128->getType()), vs_i128); - auto vs_i128_ptr = m_ir_builder->CreateAlloca(vs_i128->getType()); - vs_i128_ptr->setAlignment(16); - m_ir_builder->CreateAlignedStore(vs_i128, vs_i128_ptr, 16); - auto vs_i8_ptr = m_ir_builder->CreateBitCast(vs_i128_ptr, m_ir_builder->getInt8PtrTy()); - - Type * types[3] = { m_ir_builder->getInt8PtrTy(), m_ir_builder->getInt8PtrTy(), m_ir_builder->getInt64Ty() }; - m_ir_builder->CreateCall5(Intrinsic::getDeclaration(m_module, Intrinsic::memcpy, types), - addr_i8_ptr, vs_i8_ptr, size_i64, m_ir_builder->getInt32(1), m_ir_builder->getInt1(false)); -} - -void Compiler::STDBRX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs), 0, false); -} - -void Compiler::STSWX(u32 rs, u32 ra, u32 rb) { - CompilationError("STSWX"); -} - -void Compiler::STWBRX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 32), 0, false); -} - -void Compiler::STFSX(u32 frs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); - WriteMemory(addr_i64, frs_i32); -} - -void Compiler::STVRX(u32 vs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto size_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); - auto index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(16), size_i64); - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFF0); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); - auto addr_i8_ptr = m_ir_builder->CreateIntToPtr(addr_i64, m_ir_builder->getInt8PtrTy()); - - auto vs_i128 = GetVr(vs); - vs_i128 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, vs_i128->getType()), vs_i128); - auto vs_i128_ptr = m_ir_builder->CreateAlloca(vs_i128->getType()); - vs_i128_ptr->setAlignment(16); - m_ir_builder->CreateAlignedStore(vs_i128, vs_i128_ptr, 16); - auto vs_i8_ptr = m_ir_builder->CreateBitCast(vs_i128_ptr, m_ir_builder->getInt8PtrTy()); - vs_i8_ptr = m_ir_builder->CreateGEP(vs_i8_ptr, index_i64); - - Type * types[3] = { m_ir_builder->getInt8PtrTy(), m_ir_builder->getInt8PtrTy(), m_ir_builder->getInt64Ty() }; - m_ir_builder->CreateCall5(Intrinsic::getDeclaration(m_module, Intrinsic::memcpy, types), - addr_i8_ptr, vs_i8_ptr, size_i64, m_ir_builder->getInt32(1), m_ir_builder->getInt1(false)); -} - -void Compiler::STFSUX(u32 frs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); - WriteMemory(addr_i64, frs_i32); - SetGpr(ra, addr_i64); -} - -void Compiler::STSWI(u32 rd, u32 ra, u32 nb) { - auto addr_i64 = ra ? GetGpr(ra) : m_ir_builder->getInt64(0); - - nb = nb ? nb : 32; - for (u32 i = 0; i < nb; i += 4) { - auto val_i32 = GetGpr(rd, 32); - - if (i + 4 <= nb) { - WriteMemory(addr_i64, val_i32, 0, true, false); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); - rd = (rd + 1) % 32; - } - else { - u32 n = nb - i; - if (n >= 2) { - auto val_i16 = m_ir_builder->CreateLShr(val_i32, 16); - val_i16 = m_ir_builder->CreateTrunc(val_i16, m_ir_builder->getInt16Ty()); - WriteMemory(addr_i64, val_i16); - - if (n == 3) { - auto val_i8 = m_ir_builder->CreateLShr(val_i32, 8); - val_i8 = m_ir_builder->CreateTrunc(val_i8, m_ir_builder->getInt8Ty()); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(2)); - WriteMemory(addr_i64, val_i8); - } - } - else { - auto val_i8 = m_ir_builder->CreateLShr(val_i32, 24); - val_i8 = m_ir_builder->CreateTrunc(val_i8, m_ir_builder->getInt8Ty()); - WriteMemory(addr_i64, val_i8); - } - } - } -} - -void Compiler::STFDX(u32 frs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); - WriteMemory(addr_i64, frs_i64); -} - -void Compiler::STFDUX(u32 frs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); - WriteMemory(addr_i64, frs_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::LVLXL(u32 vd, u32 ra, u32 rb) { - LVLX(vd, ra, rb); -} - -void Compiler::LHBRX(u32 rd, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i16 = ReadMemory(addr_i64, 16, 0, false); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::SRAW(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - rs_i64 = m_ir_builder->CreateShl(rs_i64, 32); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); - auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); - auto res_i64 = m_ir_builder->CreateAShr(rs_i64, rb_i64); - auto ra_i64 = m_ir_builder->CreateAShr(res_i64, 32); - SetGpr(ra, ra_i64); - - auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); - auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); - auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i32, m_ir_builder->getInt32(0)); - auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); - SetXerCa(ca_i1); - - if (rc) { - SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::SRAD(u32 ra, u32 rs, u32 rb, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); - rs_i128 = m_ir_builder->CreateShl(rs_i128, 64); - auto rb_i8 = GetGpr(rb, 8); - rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); - auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); - auto res_i128 = m_ir_builder->CreateAShr(rs_i128, rb_i128); - auto ra_i128 = m_ir_builder->CreateAShr(res_i128, 64); - auto ra_i64 = m_ir_builder->CreateTrunc(ra_i128, m_ir_builder->getInt64Ty()); - SetGpr(ra, ra_i64); - - auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); - auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); - auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i64, m_ir_builder->getInt64(0)); - auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); - SetXerCa(ca_i1); - - if (rc) { - SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::LVRXL(u32 vd, u32 ra, u32 rb) { - LVRX(vd, ra, rb); -} - -void Compiler::DSS(u32 strm, u32 a) { - // TODO: Revisit - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::SRAWI(u32 ra, u32 rs, u32 sh, u32 rc) { - USE_INTERP_IF_REQUESTED(SRAWI, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(sh), m_ir_builder->getInt32(rc)); - - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); - rs_i64 = m_ir_builder->CreateShl(rs_i64, 32); - auto res_i64 = m_ir_builder->CreateAShr(rs_i64, sh); - auto ra_i64 = m_ir_builder->CreateAShr(res_i64, 32); - SetGpr(ra, ra_i64); - - auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); - auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); - auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i32, m_ir_builder->getInt32(0)); - auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); - SetXerCa(ca_i1); - - if (rc) { - SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::SRADI1(u32 ra, u32 rs, u32 sh, u32 rc) { - auto rs_i64 = GetGpr(rs); - auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); - rs_i128 = m_ir_builder->CreateShl(rs_i128, 64); - auto res_i128 = m_ir_builder->CreateAShr(rs_i128, sh); - auto ra_i128 = m_ir_builder->CreateAShr(res_i128, 64); - auto ra_i64 = m_ir_builder->CreateTrunc(ra_i128, m_ir_builder->getInt64Ty()); - SetGpr(ra, ra_i64); - - auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); - auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); - auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i64, m_ir_builder->getInt64(0)); - auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); - SetXerCa(ca_i1); - - if (rc) { - SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::SRADI2(u32 ra, u32 rs, u32 sh, u32 rc) { - SRADI1(ra, rs, sh, rc); -} - -void Compiler::EIEIO() { - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); -} - -void Compiler::STVLXL(u32 vs, u32 ra, u32 rb) { - STVLX(vs, ra, rb); -} - -void Compiler::STHBRX(u32 rs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 16), 0, false); -} - -void Compiler::EXTSH(u32 ra, u32 rs, u32 rc) { - auto rs_i16 = GetGpr(rs, 16); - auto rs_i64 = m_ir_builder->CreateSExt(rs_i16, m_ir_builder->getInt64Ty()); - SetGpr(ra, rs_i64); - - if (rc) { - SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::STVRXL(u32 vs, u32 ra, u32 rb) { - STVRX(vs, ra, rb); -} - -void Compiler::EXTSB(u32 ra, u32 rs, u32 rc) { - USE_INTERP_IF_REQUESTED(EXTSB, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rc)); - - auto rs_i8 = GetGpr(rs, 8); - auto rs_i64 = m_ir_builder->CreateSExt(rs_i8, m_ir_builder->getInt64Ty()); - SetGpr(ra, rs_i64); - - if (rc) { - SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::STFIWX(u32 frs, u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); - auto frs_i32 = m_ir_builder->CreateTrunc(frs_i64, m_ir_builder->getInt32Ty()); - WriteMemory(addr_i64, frs_i32); -} - -void Compiler::EXTSW(u32 ra, u32 rs, u32 rc) { - USE_INTERP_IF_REQUESTED(EXTSW, m_ir_builder->getInt32(ra), m_ir_builder->getInt32(rs), m_ir_builder->getInt32(rc)); - - auto rs_i32 = GetGpr(rs, 32); - auto rs_i64 = m_ir_builder->CreateSExt(rs_i32, m_ir_builder->getInt64Ty()); - SetGpr(ra, rs_i64); - - if (rc) { - SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); - } -} - -void Compiler::ICBI(u32 ra, u32 rs) { - // TODO: Revisit - m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); -} - -void Compiler::DCBZ(u32 ra, u32 rb) { - auto addr_i64 = GetGpr(rb); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, ~(127ULL)); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); - auto addr_i8_ptr = m_ir_builder->CreateIntToPtr(addr_i64, m_ir_builder->getInt8PtrTy()); - - std::vector types = { (Type *)m_ir_builder->getInt8PtrTy(), (Type *)m_ir_builder->getInt32Ty() }; - m_ir_builder->CreateCall5(Intrinsic::getDeclaration(m_module, Intrinsic::memset, types), - addr_i8_ptr, m_ir_builder->getInt8(0), m_ir_builder->getInt32(128), m_ir_builder->getInt32(128), m_ir_builder->getInt1(true)); -} - -void Compiler::LWZ(u32 rd, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(LWZ, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LWZU(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::LBZ(u32 rd, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(LBZ, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i8 = ReadMemory(addr_i64, 8); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LBZU(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i8 = ReadMemory(addr_i64, 8); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::STW(u32 rs, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(STW, m_ir_builder->getInt32(rs), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 32)); -} - -void Compiler::STWU(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 32)); - SetGpr(ra, addr_i64); -} - -void Compiler::STB(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 8)); -} - -void Compiler::STBU(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 8)); - SetGpr(ra, addr_i64); -} - -void Compiler::LHZ(u32 rd, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(LHZ, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LHZU(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::LHA(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::LHAU(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i16 = ReadMemory(addr_i64, 16); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::STH(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 16)); -} - -void Compiler::STHU(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 16)); - SetGpr(ra, addr_i64); -} - -void Compiler::LMW(u32 rd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - addr_i64 = m_ir_builder->CreateAdd(addr_i64, GetGpr(ra)); - } - - for (u32 i = rd; i < 32; i++) { - auto val_i32 = ReadMemory(addr_i64, 32); - auto val_i64 = m_ir_builder->CreateZExt(val_i32, m_ir_builder->getInt64Ty()); - SetGpr(i, val_i64); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); - } -} - -void Compiler::STMW(u32 rs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - addr_i64 = m_ir_builder->CreateAdd(addr_i64, GetGpr(ra)); - } - - for (u32 i = rs; i < 32; i++) { - auto val_i32 = GetGpr(i, 32); - WriteMemory(addr_i64, val_i32); - addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); - } -} - -void Compiler::LFS(u32 frd, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(LFS, m_ir_builder->getInt32(frd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - SetFpr(frd, mem_i32); -} - -void Compiler::LFSU(u32 frd, u32 ra, s32 ds) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - auto mem_i32 = ReadMemory(addr_i64, 32); - SetFpr(frd, mem_i32); - SetGpr(ra, addr_i64); -} - -void Compiler::LFD(u32 frd, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetFpr(frd, mem_i64); -} - -void Compiler::LFDU(u32 frd, u32 ra, s32 ds) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetFpr(frd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::STFS(u32 frs, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(STFS, m_ir_builder->getInt32(frs), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); - WriteMemory(addr_i64, frs_i32); -} - -void Compiler::STFSU(u32 frs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); - WriteMemory(addr_i64, frs_i32); - SetGpr(ra, addr_i64); -} - -void Compiler::STFD(u32 frs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); - WriteMemory(addr_i64, frs_i64); -} - -void Compiler::STFDU(u32 frs, u32 ra, s32 d) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); - WriteMemory(addr_i64, frs_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::LD(u32 rd, u32 ra, s32 ds) { - USE_INTERP_IF_REQUESTED(LD, m_ir_builder->getInt32(rd), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(ds)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetGpr(rd, mem_i64); -} - -void Compiler::LDU(u32 rd, u32 ra, s32 ds) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - auto mem_i64 = ReadMemory(addr_i64, 64); - SetGpr(rd, mem_i64); - SetGpr(ra, addr_i64); -} - -void Compiler::LWA(u32 rd, u32 ra, s32 ds) { - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - auto mem_i32 = ReadMemory(addr_i64, 32); - auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); - SetGpr(rd, mem_i64); -} - -void Compiler::FDIVS(u32 frd, u32 fra, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFDiv(ra_f64, rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FDIVS."); - } - - // TODO: Set flags -} - -void Compiler::FSUBS(u32 frd, u32 fra, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFSub(ra_f64, rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FSUBS."); - } - - // TODO: Set flags -} - -void Compiler::FADDS(u32 frd, u32 fra, u32 frb, u32 rc) { - - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFAdd(ra_f64, rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FADDS."); - } - - // TODO: Set flags -} - -void Compiler::FSQRTS(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, m_ir_builder->getDoubleTy()), rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FSQRTS."); - } - - // TODO: Set flags -} - -void Compiler::FRES(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFDiv(ConstantFP::get(m_ir_builder->getDoubleTy(), 1.0), rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FRES."); - } - - // TODO: Set flags -} - -void Compiler::FMULS(u32 frd, u32 fra, u32 frc, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rc_f64 = GetFpr(frc); - auto res_f64 = m_ir_builder->CreateFMul(ra_f64, rc_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FMULS."); - } - - // TODO: Set flags -} - -void Compiler::FMADDS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FMADDS."); - } - - // TODO: Set flags -} - -void Compiler::FMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - rb_f64 = m_ir_builder->CreateFNeg(rb_f64); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FMSUBS."); - } - - // TODO: Set flags -} - -void Compiler::FNMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - rb_f64 = m_ir_builder->CreateFNeg(rb_f64); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - res_f64 = m_ir_builder->CreateFNeg(res_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FNMSUBS."); - } - - // TODO: Set flags -} - -void Compiler::FNMADDS(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - res_f64 = m_ir_builder->CreateFNeg(res_f64); - auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); - SetFpr(frd, res_f32); - - if (rc) { - // TODO: Implement this - CompilationError("FNMADDS."); - } - - // TODO: Set flags -} - -void Compiler::STD(u32 rs, u32 ra, s32 d) { - USE_INTERP_IF_REQUESTED(STD, m_ir_builder->getInt32(rs), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(d)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); - if (ra) { - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - } - - WriteMemory(addr_i64, GetGpr(rs, 64)); -} - -void Compiler::STDU(u32 rs, u32 ra, s32 ds) { - USE_INTERP_IF_REQUESTED(STDU, m_ir_builder->getInt32(rs), m_ir_builder->getInt32(ra), m_ir_builder->getInt32(ds)); - - auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); - auto ra_i64 = GetGpr(ra); - addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); - - WriteMemory(addr_i64, GetGpr(rs, 64)); - SetGpr(ra, addr_i64); -} - -void Compiler::MTFSB1(u32 crbd, u32 rc) { - auto fpscr_i32 = GetFpscr(); - fpscr_i32 = SetBit(fpscr_i32, crbd, m_ir_builder->getInt32(1), false); - SetFpscr(fpscr_i32); - - if (rc) { - // TODO: Implement this - CompilationError("MTFSB1."); - } -} - -void Compiler::MCRFS(u32 crbd, u32 crbs) { - auto fpscr_i32 = GetFpscr(); - auto val_i32 = GetNibble(fpscr_i32, crbs); - SetCrField(crbd, val_i32); - - switch (crbs) { - case 0: - fpscr_i32 = ClrBit(fpscr_i32, 0); - fpscr_i32 = ClrBit(fpscr_i32, 3); - break; - case 1: - fpscr_i32 = ClrNibble(fpscr_i32, 1); - break; - case 2: - fpscr_i32 = ClrNibble(fpscr_i32, 2); - break; - case 3: - fpscr_i32 = ClrBit(fpscr_i32, 12); - break; - case 5: - fpscr_i32 = ClrBit(fpscr_i32, 21); - fpscr_i32 = ClrBit(fpscr_i32, 22); - fpscr_i32 = ClrBit(fpscr_i32, 23); - break; - default: - break; - } - - SetFpscr(fpscr_i32); -} - -void Compiler::MTFSB0(u32 crbd, u32 rc) { - auto fpscr_i32 = GetFpscr(); - fpscr_i32 = ClrBit(fpscr_i32, crbd); - SetFpscr(fpscr_i32); - - if (rc) { - // TODO: Implement this - CompilationError("MTFSB0."); - } -} - -void Compiler::MTFSFI(u32 crfd, u32 i, u32 rc) { - auto fpscr_i32 = GetFpscr(); - fpscr_i32 = SetNibble(fpscr_i32, crfd, m_ir_builder->getInt32(i & 0xF)); - SetFpscr(fpscr_i32); - - if (rc) { - // TODO: Implement this - CompilationError("MTFSFI."); - } -} - -void Compiler::MFFS(u32 frd, u32 rc) { - auto fpscr_i32 = GetFpscr(); - auto fpscr_i64 = m_ir_builder->CreateZExt(fpscr_i32, m_ir_builder->getInt64Ty()); - SetFpr(frd, fpscr_i64); - - if (rc) { - // TODO: Implement this - CompilationError("MFFS."); - } -} - -void Compiler::MTFSF(u32 flm, u32 frb, u32 rc) { - u64 mask = 0; - for (u32 i = 0; i < 8; i++) { - if (flm & (1 << i)) { - mask |= UINT64_C(0xF) << (i * 4); - } - } - - auto rb_i32 = GetFpr(frb, 32, true); - auto fpscr_i32 = GetFpscr(); - fpscr_i32 = m_ir_builder->CreateAnd(fpscr_i32, ~mask); - rb_i32 = m_ir_builder->CreateAnd(rb_i32, mask); - fpscr_i32 = m_ir_builder->CreateOr(fpscr_i32, rb_i32); - SetFpscr(fpscr_i32); - - if (rc) { - // TODO: Implement this - CompilationError("MTFSF."); - } -} - -void Compiler::FCMPU(u32 crfd, u32 fra, u32 frb) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto lt_i1 = m_ir_builder->CreateFCmpOLT(ra_f64, rb_f64); - auto gt_i1 = m_ir_builder->CreateFCmpOGT(ra_f64, rb_f64); - auto eq_i1 = m_ir_builder->CreateFCmpOEQ(ra_f64, rb_f64); - auto cr_i32 = GetCr(); - cr_i32 = SetNibble(cr_i32, crfd, lt_i1, gt_i1, eq_i1, m_ir_builder->getInt1(false)); - SetCr(cr_i32); - - // TODO: Set flags / Handle NaN -} - -void Compiler::FRSP(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f32 = m_ir_builder->CreateFPTrunc(rb_f64, m_ir_builder->getFloatTy()); - auto res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FRSP."); - } - - // TODO: Revisit this - // TODO: Set flags -} - -void Compiler::FCTIW(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto max_i1 = m_ir_builder->CreateFCmpOGT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), 2147483647.0)); - auto min_i1 = m_ir_builder->CreateFCmpULT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), -2147483648.0)); - auto res_i32 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt32Ty()); - auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - res_i64 = m_ir_builder->CreateSelect(max_i1, m_ir_builder->getInt64(0x7FFFFFFF), res_i64); - res_i64 = m_ir_builder->CreateSelect(min_i1, m_ir_builder->getInt64(0x80000000), res_i64); - SetFpr(frd, res_i64); - - if (rc) { - // TODO: Implement this - CompilationError("FCTIW."); - } - - // TODO: Set flags / Implement rounding modes -} - -void Compiler::FCTIWZ(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto max_i1 = m_ir_builder->CreateFCmpOGT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), 2147483647.0)); - auto min_i1 = m_ir_builder->CreateFCmpULT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), -2147483648.0)); - auto res_i32 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt32Ty()); - auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); - res_i64 = m_ir_builder->CreateSelect(max_i1, m_ir_builder->getInt64(0x7FFFFFFF), res_i64); - res_i64 = m_ir_builder->CreateSelect(min_i1, m_ir_builder->getInt64(0x80000000), res_i64); - SetFpr(frd, res_i64); - - if (rc) { - // TODO: Implement this - CompilationError("FCTIWZ."); - } - - // TODO: Set flags -} - -void Compiler::FDIV(u32 frd, u32 fra, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFDiv(ra_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FDIV."); - } - - // TODO: Set flags -} - -void Compiler::FSUB(u32 frd, u32 fra, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFSub(ra_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FSUB."); - } - - // TODO: Set flags -} - -void Compiler::FADD(u32 frd, u32 fra, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto res_f64 = m_ir_builder->CreateFAdd(ra_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FADD."); - } - - // TODO: Set flags -} - -void Compiler::FSQRT(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, m_ir_builder->getDoubleTy()), rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FSQRT."); - } - - // TODO: Set flags -} - -void Compiler::FSEL(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - auto cmp_i1 = m_ir_builder->CreateFCmpOGE(ra_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), 0.0)); - auto res_f64 = m_ir_builder->CreateSelect(cmp_i1, rc_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FSEL."); - } - - // TODO: Set flags -} - -void Compiler::FMUL(u32 frd, u32 fra, u32 frc, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rc_f64 = GetFpr(frc); - auto res_f64 = m_ir_builder->CreateFMul(ra_f64, rc_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FMUL."); - } - - // TODO: Set flags -} - -void Compiler::FRSQRTE(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, m_ir_builder->getDoubleTy()), rb_f64); - res_f64 = m_ir_builder->CreateFDiv(ConstantFP::get(m_ir_builder->getDoubleTy(), 1.0), res_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FRSQRTE."); - } -} - -void Compiler::FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - rb_f64 = m_ir_builder->CreateFNeg(rb_f64); - auto res_f64 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FMSUB."); - } - - // TODO: Set flags -} - -void Compiler::FMADD(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - auto res_f64 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FMADD."); - } - - // TODO: Set flags -} - -void Compiler::FNMSUB(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - rc_f64 = m_ir_builder->CreateFNeg(rc_f64); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FNMSUB."); - } - - // TODO: Set flags -} - -void Compiler::FNMADD(u32 frd, u32 fra, u32 frc, u32 frb, u32 rc) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto rc_f64 = GetFpr(frc); - rb_f64 = m_ir_builder->CreateFNeg(rb_f64); - rc_f64 = m_ir_builder->CreateFNeg(rc_f64); - auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FNMADD."); - } - - // TODO: Set flags -} - -void Compiler::FCMPO(u32 crfd, u32 fra, u32 frb) { - auto ra_f64 = GetFpr(fra); - auto rb_f64 = GetFpr(frb); - auto lt_i1 = m_ir_builder->CreateFCmpOLT(ra_f64, rb_f64); - auto gt_i1 = m_ir_builder->CreateFCmpOGT(ra_f64, rb_f64); - auto eq_i1 = m_ir_builder->CreateFCmpOEQ(ra_f64, rb_f64); - auto cr_i32 = GetCr(); - cr_i32 = SetNibble(cr_i32, crfd, lt_i1, gt_i1, eq_i1, m_ir_builder->getInt1(false)); - SetCr(cr_i32); - - // TODO: Set flags / Handle NaN -} - -void Compiler::FNEG(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - rb_f64 = m_ir_builder->CreateFNeg(rb_f64); - SetFpr(frd, rb_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FNEG."); - } - - // TODO: Set flags -} - -void Compiler::FMR(u32 frd, u32 frb, u32 rc) { - SetFpr(frd, GetFpr(frb)); - - if (rc) { - // TODO: Implement this - CompilationError("FMR."); - } - - // TODO: Set flags -} - -void Compiler::FNABS(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::fabs, m_ir_builder->getDoubleTy()), rb_f64); - res_f64 = m_ir_builder->CreateFNeg(res_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FNABS."); - } - - // TODO: Set flags -} - -void Compiler::FABS(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::fabs, m_ir_builder->getDoubleTy()), rb_f64); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FABS."); - } - - // TODO: Set flags -} - -void Compiler::FCTID(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto max_i1 = m_ir_builder->CreateFCmpOGT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), 9223372036854775807.0)); - auto min_i1 = m_ir_builder->CreateFCmpULT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), -9223372036854775808.0)); - auto res_i64 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt64Ty()); - res_i64 = m_ir_builder->CreateSelect(max_i1, m_ir_builder->getInt64(0x7FFFFFFFFFFFFFFF), res_i64); - res_i64 = m_ir_builder->CreateSelect(min_i1, m_ir_builder->getInt64(0x8000000000000000), res_i64); - SetFpr(frd, res_i64); - - if (rc) { - // TODO: Implement this - CompilationError("FCTID."); - } - - // TODO: Set flags / Implement rounding modes -} - -void Compiler::FCTIDZ(u32 frd, u32 frb, u32 rc) { - auto rb_f64 = GetFpr(frb); - auto max_i1 = m_ir_builder->CreateFCmpOGT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), 9223372036854775807.0)); - auto min_i1 = m_ir_builder->CreateFCmpULT(rb_f64, ConstantFP::get(m_ir_builder->getDoubleTy(), -9223372036854775808.0)); - auto res_i64 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt64Ty()); - res_i64 = m_ir_builder->CreateSelect(max_i1, m_ir_builder->getInt64(0x7FFFFFFFFFFFFFFF), res_i64); - res_i64 = m_ir_builder->CreateSelect(min_i1, m_ir_builder->getInt64(0x8000000000000000), res_i64); - SetFpr(frd, res_i64); - - if (rc) { - // TODO: Implement this - CompilationError("FCTIDZ."); - } - - // TODO: Set flags -} - -void Compiler::FCFID(u32 frd, u32 frb, u32 rc) { - auto rb_i64 = GetFpr(frb, 64, true); - auto res_f64 = m_ir_builder->CreateSIToFP(rb_i64, m_ir_builder->getDoubleTy()); - SetFpr(frd, res_f64); - - if (rc) { - // TODO: Implement this - CompilationError("FCFID."); - } - - // TODO: Set flags -} - -void Compiler::UNK(const u32 code, const u32 opcode, const u32 gcode) { - CompilationError(fmt::format("Unknown/Illegal opcode! (0x%08x : 0x%x : 0x%x)", code, opcode, gcode)); -} - -std::string Compiler::GetBasicBlockNameFromAddress(u32 address, const std::string & suffix) const { - std::string name; - - if (address == 0) { - name = "entry"; - } - else if (address == 0xFFFFFFFF) { - name = "default_exit"; - } - else { - name = fmt::format("instr_0x%08X", address); - } - - if (suffix != "") { - name += "_" + suffix; - } - - return name; -} - -u32 Compiler::GetAddressFromBasicBlockName(const std::string & name) const { - if (name.compare(0, 6, "instr_") == 0) { - return strtoul(name.c_str() + 6, nullptr, 0); - } - else if (name == GetBasicBlockNameFromAddress(0)) { - return 0; - } - else if (name == GetBasicBlockNameFromAddress(0xFFFFFFFF)) { - return 0xFFFFFFFF; - } - - return 0; -} - -BasicBlock * Compiler::GetBasicBlockFromAddress(u32 address, const std::string & suffix, bool create_if_not_exist) { - auto block_name = GetBasicBlockNameFromAddress(address, suffix); - BasicBlock * block = nullptr; - BasicBlock * next_block = nullptr; - for (auto i = m_state.function->begin(); i != m_state.function->end(); i++) { - if (i->getName() == block_name) { - block = &(*i); - break; - } - - auto block_address = GetAddressFromBasicBlockName(i->getName()); - if (block_address > address) { - next_block = &(*i); - break; - } - } - - if (!block && create_if_not_exist) { - block = BasicBlock::Create(m_ir_builder->getContext(), block_name, m_state.function, next_block); - } - - return block; -} - -Value * Compiler::GetBit(Value * val, u32 n) { - Value * bit = val; - -#ifdef PPU_LLVM_RECOMPILER_USE_BMI - if (val->getType()->isIntegerTy(32)) { - bit = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_32), val, m_ir_builder->getInt32(1 << (31 - n))); - } - else if (val->getType()->isIntegerTy(64)) { - bit = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_64), val, m_ir_builder->getInt64((u64)1 << (63 - n))); - } - else { -#endif - if (val->getType()->getIntegerBitWidth() != (n + 1)) { - bit = m_ir_builder->CreateLShr(val, val->getType()->getIntegerBitWidth() - n - 1); - } - - bit = m_ir_builder->CreateAnd(bit, 1); -#ifdef PPU_LLVM_RECOMPILER_USE_BMI - } -#endif - - return bit; -} - -Value * Compiler::ClrBit(Value * val, u32 n) { - return m_ir_builder->CreateAnd(val, ~((u64)1 << (val->getType()->getIntegerBitWidth() - n - 1))); -} - -Value * Compiler::SetBit(Value * val, u32 n, Value * bit, bool doClear) { - if (doClear) { - val = ClrBit(val, n); - } - - if (bit->getType()->getIntegerBitWidth() < val->getType()->getIntegerBitWidth()) { - bit = m_ir_builder->CreateZExt(bit, val->getType()); - } - else if (bit->getType()->getIntegerBitWidth() > val->getType()->getIntegerBitWidth()) { - bit = m_ir_builder->CreateTrunc(bit, val->getType()); - } - - if (val->getType()->getIntegerBitWidth() != (n + 1)) { - bit = m_ir_builder->CreateShl(bit, bit->getType()->getIntegerBitWidth() - n - 1); - } - - return m_ir_builder->CreateOr(val, bit); -} - -Value * Compiler::GetNibble(Value * val, u32 n) { - Value * nibble; - -#ifdef PPU_LLVM_RECOMPILER_USE_BMI - if (val->getType()->isIntegerTy(32)) { - nibble = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_32), val, m_ir_builder->getInt32((u64)0xF << ((7 - n) * 4))); - } - else if (val->getType()->isIntegerTy(64)) { - nibble = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_64), val, m_ir_builder->getInt64((u64)0xF << ((15 - n) * 4))); - } - else { -#endif - if ((val->getType()->getIntegerBitWidth() >> 2) != (n + 1)) { - val = m_ir_builder->CreateLShr(val, (((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4); - } - - nibble = m_ir_builder->CreateAnd(val, 0xF); -#ifdef PPU_LLVM_RECOMPILER_USE_BMI - } -#endif - - return nibble; -} - -Value * Compiler::ClrNibble(Value * val, u32 n) { - return m_ir_builder->CreateAnd(val, ~((u64)0xF << ((((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4))); -} - -Value * Compiler::SetNibble(Value * val, u32 n, Value * nibble, bool doClear) { - if (doClear) { - val = ClrNibble(val, n); - } - - if (nibble->getType()->getIntegerBitWidth() < val->getType()->getIntegerBitWidth()) { - nibble = m_ir_builder->CreateZExt(nibble, val->getType()); - } - else if (nibble->getType()->getIntegerBitWidth() > val->getType()->getIntegerBitWidth()) { - nibble = m_ir_builder->CreateTrunc(nibble, val->getType()); - } - - if ((val->getType()->getIntegerBitWidth() >> 2) != (n + 1)) { - nibble = m_ir_builder->CreateShl(nibble, (((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4); - } - - return m_ir_builder->CreateOr(val, nibble); -} - -Value * Compiler::SetNibble(Value * val, u32 n, Value * b0, Value * b1, Value * b2, Value * b3, bool doClear) { - if (doClear) { - val = ClrNibble(val, n); - } - - if (b0) { - val = SetBit(val, n * 4, b0, false); - } - - if (b1) { - val = SetBit(val, (n * 4) + 1, b1, false); - } - - if (b2) { - val = SetBit(val, (n * 4) + 2, b2, false); - } - - if (b3) { - val = SetBit(val, (n * 4) + 3, b3, false); - } - - return val; -} - -Value * Compiler::GetPc() { - auto pc_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, PC)); - auto pc_i32_ptr = m_ir_builder->CreateBitCast(pc_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(pc_i32_ptr, 4); -} - -void Compiler::SetPc(Value * val_ix) { - auto pc_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, PC)); - auto pc_i32_ptr = m_ir_builder->CreateBitCast(pc_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - auto val_i32 = m_ir_builder->CreateZExtOrTrunc(val_ix, m_ir_builder->getInt32Ty()); - m_ir_builder->CreateAlignedStore(val_i32, pc_i32_ptr, 4); -} - -Value * Compiler::GetGpr(u32 r, u32 num_bits) { - auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, GPR[r])); - auto r_ix_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getIntNTy(num_bits)->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(r_ix_ptr, 8); -} - -void Compiler::SetGpr(u32 r, Value * val_x64) { - auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, GPR[r])); - auto r_i64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); - m_ir_builder->CreateAlignedStore(val_i64, r_i64_ptr, 8); -} - -Value * Compiler::GetCr() { - auto cr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, CR)); - auto cr_i32_ptr = m_ir_builder->CreateBitCast(cr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(cr_i32_ptr, 4); -} - -Value * Compiler::GetCrField(u32 n) { - return GetNibble(GetCr(), n); -} - -void Compiler::SetCr(Value * val_x32) { - auto val_i32 = m_ir_builder->CreateBitCast(val_x32, m_ir_builder->getInt32Ty()); - auto cr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, CR)); - auto cr_i32_ptr = m_ir_builder->CreateBitCast(cr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i32, cr_i32_ptr, 4); -} - -void Compiler::SetCrField(u32 n, Value * field) { - SetCr(SetNibble(GetCr(), n, field)); -} - -void Compiler::SetCrField(u32 n, Value * b0, Value * b1, Value * b2, Value * b3) { - SetCr(SetNibble(GetCr(), n, b0, b1, b2, b3)); -} - -void Compiler::SetCrFieldSignedCmp(u32 n, Value * a, Value * b) { - auto lt_i1 = m_ir_builder->CreateICmpSLT(a, b); - auto gt_i1 = m_ir_builder->CreateICmpSGT(a, b); - auto eq_i1 = m_ir_builder->CreateICmpEQ(a, b); - auto cr_i32 = GetCr(); - cr_i32 = SetNibble(cr_i32, n, lt_i1, gt_i1, eq_i1, GetXerSo()); - SetCr(cr_i32); -} - -void Compiler::SetCrFieldUnsignedCmp(u32 n, Value * a, Value * b) { - auto lt_i1 = m_ir_builder->CreateICmpULT(a, b); - auto gt_i1 = m_ir_builder->CreateICmpUGT(a, b); - auto eq_i1 = m_ir_builder->CreateICmpEQ(a, b); - auto cr_i32 = GetCr(); - cr_i32 = SetNibble(cr_i32, n, lt_i1, gt_i1, eq_i1, GetXerSo()); - SetCr(cr_i32); -} - -void Compiler::SetCr6AfterVectorCompare(u32 vr) { - auto vr_v16i8 = GetVrAsIntVec(vr, 8); - auto vr_mask_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmovmskb_128), vr_v16i8); - auto cmp0_i1 = m_ir_builder->CreateICmpEQ(vr_mask_i32, m_ir_builder->getInt32(0)); - auto cmp1_i1 = m_ir_builder->CreateICmpEQ(vr_mask_i32, m_ir_builder->getInt32(0xFFFF)); - auto cr_i32 = GetCr(); - cr_i32 = SetNibble(cr_i32, 6, cmp1_i1, nullptr, cmp0_i1, nullptr); - SetCr(cr_i32); -} - -Value * Compiler::GetLr() { - auto lr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, LR)); - auto lr_i64_ptr = m_ir_builder->CreateBitCast(lr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(lr_i64_ptr, 8); -} - -void Compiler::SetLr(Value * val_x64) { - auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); - auto lr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, LR)); - auto lr_i64_ptr = m_ir_builder->CreateBitCast(lr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i64, lr_i64_ptr, 8); -} - -Value * Compiler::GetCtr() { - auto ctr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, CTR)); - auto ctr_i64_ptr = m_ir_builder->CreateBitCast(ctr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(ctr_i64_ptr, 8); -} - -void Compiler::SetCtr(Value * val_x64) { - auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); - auto ctr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, CTR)); - auto ctr_i64_ptr = m_ir_builder->CreateBitCast(ctr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i64, ctr_i64_ptr, 8); -} - -Value * Compiler::GetXer() { - auto xer_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, XER)); - auto xer_i64_ptr = m_ir_builder->CreateBitCast(xer_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(xer_i64_ptr, 8); -} - -Value * Compiler::GetXerCa() { - return GetBit(GetXer(), 34); -} - -Value * Compiler::GetXerSo() { - return GetBit(GetXer(), 32); -} - -void Compiler::SetXer(Value * val_x64) { - auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); - auto xer_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, XER)); - auto xer_i64_ptr = m_ir_builder->CreateBitCast(xer_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i64, xer_i64_ptr, 8); -} - -void Compiler::SetXerCa(Value * ca) { - auto xer_i64 = GetXer(); - xer_i64 = SetBit(xer_i64, 34, ca); - SetXer(xer_i64); -} - -void Compiler::SetXerSo(Value * so) { - auto xer_i64 = GetXer(); - xer_i64 = SetBit(xer_i64, 32, so); - SetXer(xer_i64); -} - -Value * Compiler::GetVrsave() { - auto vrsave_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VRSAVE)); - auto vrsave_i32_ptr = m_ir_builder->CreateBitCast(vrsave_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - auto val_i32 = m_ir_builder->CreateAlignedLoad(vrsave_i32_ptr, 4); - return m_ir_builder->CreateZExtOrTrunc(val_i32, m_ir_builder->getInt64Ty()); -} - -void Compiler::SetVrsave(Value * val_x64) { - auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); - auto val_i32 = m_ir_builder->CreateZExtOrTrunc(val_i64, m_ir_builder->getInt32Ty()); - auto vrsave_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VRSAVE)); - auto vrsave_i32_ptr = m_ir_builder->CreateBitCast(vrsave_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i32, vrsave_i32_ptr, 8); -} - -Value * Compiler::GetFpscr() { - auto fpscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, FPSCR)); - auto fpscr_i32_ptr = m_ir_builder->CreateBitCast(fpscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(fpscr_i32_ptr, 4); -} - -void Compiler::SetFpscr(Value * val_x32) { - auto val_i32 = m_ir_builder->CreateBitCast(val_x32, m_ir_builder->getInt32Ty()); - auto fpscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, FPSCR)); - auto fpscr_i32_ptr = m_ir_builder->CreateBitCast(fpscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i32, fpscr_i32_ptr, 4); -} - -Value * Compiler::GetFpr(u32 r, u32 bits, bool as_int) { - auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, FPR[r])); - if (!as_int) { - auto r_f64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getDoubleTy()->getPointerTo()); - auto r_f64 = m_ir_builder->CreateAlignedLoad(r_f64_ptr, 8); - if (bits == 32) { - return m_ir_builder->CreateFPTrunc(r_f64, m_ir_builder->getFloatTy()); - } - else { - return r_f64; - } - } - else { - auto r_i64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); - auto r_i64 = m_ir_builder->CreateAlignedLoad(r_i64_ptr, 8); - if (bits == 32) { - return m_ir_builder->CreateTrunc(r_i64, m_ir_builder->getInt32Ty()); - } - else { - return r_i64; - } - } -} - -void Compiler::SetFpr(u32 r, Value * val) { - auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, FPR[r])); - auto r_f64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getDoubleTy()->getPointerTo()); - - Value* val_f64; - if (val->getType()->isDoubleTy() || val->getType()->isIntegerTy(64)) { - val_f64 = m_ir_builder->CreateBitCast(val, m_ir_builder->getDoubleTy()); - } - else if (val->getType()->isFloatTy() || val->getType()->isIntegerTy(32)) { - auto val_f32 = m_ir_builder->CreateBitCast(val, m_ir_builder->getFloatTy()); - val_f64 = m_ir_builder->CreateFPExt(val_f32, m_ir_builder->getDoubleTy()); - } - else { - assert(0); - } - - m_ir_builder->CreateAlignedStore(val_f64, r_f64_ptr, 8); -} - -Value * Compiler::GetVscr() { - auto vscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VSCR)); - auto vscr_i32_ptr = m_ir_builder->CreateBitCast(vscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(vscr_i32_ptr, 4); -} - -void Compiler::SetVscr(Value * val_x32) { - auto val_i32 = m_ir_builder->CreateBitCast(val_x32, m_ir_builder->getInt32Ty()); - auto vscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VSCR)); - auto vscr_i32_ptr = m_ir_builder->CreateBitCast(vscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_i32, vscr_i32_ptr, 4); -} - -Value * Compiler::GetVr(u32 vr) { - auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VPR[vr])); - auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(vr_i128_ptr, 16); -} - -Value * Compiler::GetVrAsIntVec(u32 vr, u32 vec_elt_num_bits) { - auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VPR[vr])); - auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); - auto vr_vec_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getIntNTy(vec_elt_num_bits), 128 / vec_elt_num_bits)->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(vr_vec_ptr, 16); -} - -Value * Compiler::GetVrAsFloatVec(u32 vr) { - auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VPR[vr])); - auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); - auto vr_v4f32_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getFloatTy(), 4)->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(vr_v4f32_ptr, 16); -} - -Value * Compiler::GetVrAsDoubleVec(u32 vr) { - auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VPR[vr])); - auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); - auto vr_v2f64_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getDoubleTy(), 2)->getPointerTo()); - return m_ir_builder->CreateAlignedLoad(vr_v2f64_ptr, 16); -} - -void Compiler::SetVr(u32 vr, Value * val_x128) { - auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], OFFSET_32(PPUThread, VPR[vr])); - auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); - auto val_i128 = m_ir_builder->CreateBitCast(val_x128, m_ir_builder->getIntNTy(128)); - m_ir_builder->CreateAlignedStore(val_i128, vr_i128_ptr, 16); -} - -Value * Compiler::CheckBranchCondition(u32 bo, u32 bi) { - bool bo0 = bo & 0x10 ? true : false; - bool bo1 = bo & 0x08 ? true : false; - bool bo2 = bo & 0x04 ? true : false; - bool bo3 = bo & 0x02 ? true : false; - - auto ctr_i64 = GetCtr(); - if (!bo2) { - ctr_i64 = m_ir_builder->CreateSub(ctr_i64, m_ir_builder->getInt64(1)); - SetCtr(ctr_i64); - } - - Value * ctr_ok_i1 = nullptr; - if (!bo2) { - // TODO: Check if we should compare all bits or just the lower 32 bits. This depends on MSR[SF]. Not sure what it is for PS3. - ctr_ok_i1 = m_ir_builder->CreateICmpNE(ctr_i64, m_ir_builder->getInt64(0)); - if (bo3) { - ctr_ok_i1 = m_ir_builder->CreateXor(ctr_ok_i1, m_ir_builder->getInt1(bo3)); - } - } - - Value * cond_ok_i1 = nullptr; - if (!bo0) { - auto cr_bi_i32 = GetBit(GetCr(), bi); - cond_ok_i1 = m_ir_builder->CreateTrunc(cr_bi_i32, m_ir_builder->getInt1Ty()); - if (!bo1) { - cond_ok_i1 = m_ir_builder->CreateXor(cond_ok_i1, m_ir_builder->getInt1(!bo1)); - } - } - - Value * cmp_i1 = nullptr; - if (ctr_ok_i1 && cond_ok_i1) { - cmp_i1 = m_ir_builder->CreateAnd(ctr_ok_i1, cond_ok_i1); - } - else if (ctr_ok_i1) { - cmp_i1 = ctr_ok_i1; - } - else if (cond_ok_i1) { - cmp_i1 = cond_ok_i1; - } - - return cmp_i1; -} - -void Compiler::CreateBranch(llvm::Value * cmp_i1, llvm::Value * target_i32, bool lk, bool target_is_lr) { - if (lk) - SetLr(m_ir_builder->getInt64(m_state.current_instruction_address + 4)); - - BasicBlock *current_block = m_ir_builder->GetInsertBlock(); - - BasicBlock * target_block = nullptr; - if (dyn_cast(target_i32)) { - // Target address is an immediate value. - u32 target_address = (u32)(dyn_cast(target_i32)->getLimitedValue()); - if (lk) { - // Function call - if (cmp_i1) { // There is no need to create a new block for an unconditional jump - target_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "target"); - m_ir_builder->SetInsertPoint(target_block); - } - - SetPc(target_i32); -// Function *fn = m_module->getFunction(fmt::format("function_0x%08X", target_address)); - llvm::Value *execStatus; -// if (fn) -// execStatus = m_ir_builder->CreateCall2(fn, m_state.args[CompileTaskState::Args::State], m_ir_builder->getInt64(0)); -// else - execStatus = Call("execute_unknown_function", m_state.args[CompileTaskState::Args::State], m_ir_builder->getInt64(0)); - - llvm::BasicBlock *cputhreadexitblock = GetBasicBlockFromAddress(m_state.current_instruction_address, "early_exit"); - llvm::Value *isCPUThreadExit = m_ir_builder->CreateICmpEQ(execStatus, m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(isCPUThreadExit, cputhreadexitblock, normal_execution); - m_ir_builder->SetInsertPoint(cputhreadexitblock); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - m_ir_builder->SetInsertPoint(normal_execution); - - m_ir_builder->CreateBr(GetBasicBlockFromAddress(m_state.current_instruction_address + 4)); - } - else { - // Local branch - target_block = GetBasicBlockFromAddress(target_address); - } - } - else { - // Target address is in a register - if (cmp_i1) { // There is no need to create a new block for an unconditional jump - target_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "target"); - m_ir_builder->SetInsertPoint(target_block); - } - - SetPc(target_i32); - if (target_is_lr && !lk) { - // Return from this function - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusReturn)); - } - else if (lk) { - BasicBlock *next_block = GetBasicBlockFromAddress(m_state.current_instruction_address + 4); - - llvm::Value *execStatus = m_ir_builder->CreateCall2(m_execute_unknown_function, m_state.args[CompileTaskState::Args::State], m_ir_builder->getInt64(0)); - - llvm::BasicBlock *cputhreadexitblock = GetBasicBlockFromAddress(m_state.current_instruction_address, "early_exit"); - llvm::Value *isCPUThreadExit = m_ir_builder->CreateICmpEQ(execStatus, m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - llvm::BasicBlock *normal_execution = GetBasicBlockFromAddress(m_state.current_instruction_address, "normal_execution"); - m_ir_builder->CreateCondBr(isCPUThreadExit, cputhreadexitblock, normal_execution); - m_ir_builder->SetInsertPoint(cputhreadexitblock); - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusPropagateException)); - m_ir_builder->SetInsertPoint(normal_execution); - - m_ir_builder->CreateBr(next_block); - } - else { - m_ir_builder->CreateRet(m_ir_builder->getInt32(ExecutionStatus::ExecutionStatusBlockEnded)); - } - } - - if (cmp_i1) { - // Conditional branch - auto next_block = GetBasicBlockFromAddress(m_state.current_instruction_address + 4); - m_ir_builder->SetInsertPoint(current_block); - m_ir_builder->CreateCondBr(cmp_i1, target_block, next_block); - } - else { - // Unconditional branch - if (target_block) { - m_ir_builder->SetInsertPoint(current_block); - m_ir_builder->CreateBr(target_block); - } - } - - m_state.hit_branch_instruction = true; -} - -// FIXME: Find out why alignement is needed -Value * Compiler::ReadMemory(Value * addr_i64, u32 bits, u32 alignment, bool bswap, bool could_be_mmio) { - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFF); - auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); - auto eaddr_ix_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, m_ir_builder->getIntNTy(bits)->getPointerTo()); - auto val_ix = (Value *)m_ir_builder->CreateLoad(eaddr_ix_ptr); - if (bits > 8 && bswap) { - val_ix = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getIntNTy(bits)), val_ix); - } - - return val_ix; -} - -void Compiler::WriteMemory(Value * addr_i64, Value * val_ix, u32 alignment, bool bswap, bool could_be_mmio) { - if (val_ix->getType()->getIntegerBitWidth() > 8 && bswap) { - val_ix = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, val_ix->getType()), val_ix); - } - - addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFF); - auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::base(0))); - auto eaddr_ix_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, val_ix->getType()->getPointerTo()); - m_ir_builder->CreateAlignedStore(val_ix, eaddr_ix_ptr, alignment); -} - -void Compiler::CompilationError(const std::string & error) { - LOG_ERROR(PPU, "[0x%08X] %s", m_state.current_instruction_address, error.c_str()); - Emu.Pause(); -} - -void Compiler::InitRotateMask() { - for (u32 mb = 0; mb < 64; mb++) { - for (u32 me = 0; me < 64; me++) { - u64 mask = ((u64)-1 >> mb) ^ ((me >= 63) ? 0 : (u64)-1 >> (me + 1)); - s_rotate_mask[mb][me] = mb > me ? ~mask : mask; - } - } -} -#endif diff --git a/rpcs3/Emu/Cell/PPUProgramCompiler.cpp b/rpcs3/Emu/Cell/PPUProgramCompiler.cpp deleted file mode 100644 index 26480c2cdb..0000000000 --- a/rpcs3/Emu/Cell/PPUProgramCompiler.cpp +++ /dev/null @@ -1,1735 +0,0 @@ -#include "stdafx.h" -#include "stdafx_gui.h" -#include "PPUProgramCompiler.h" -/* -using namespace PPU_instr; - -template -InstrBase* GetInstruction(T* list, const std::string& str) -{ - for(int i=0; icount; ++i) - { - auto instr = list->get_instr_info(i); - - if(instr) - { - if(instr->GetName() == str) - { - return instr; - } - } - } - - return nullptr; -} - -template -InstrBase* GetInstruction(const std::string& str) -{ - if(auto res = GetInstruction(main_list, str)) return res; - if(auto res = GetInstruction(g04_list, str)) return res; - if(auto res = GetInstruction(g04_0_list, str)) return res; - if(auto res = GetInstruction(g13_list, str)) return res; - if(auto res = GetInstruction(g1e_list, str)) return res; - if(auto res = GetInstruction(g1f_list, str)) return res; - if(auto res = GetInstruction(g3a_list, str)) return res; - if(auto res = GetInstruction(g3b_list, str)) return res; - if(auto res = GetInstruction(g3e_list, str)) return res; - if(auto res = GetInstruction(g3f_list, str)) return res; - if(auto res = GetInstruction(g3f_0_list, str)) return res; - - return nullptr; -} - -s64 FindOp(const std::string& text, const std::string& op, s64 from) -{ - if (text.length() < op.length()) return -1; - - for (s64 i = from; i < (s64)text.length(); ++i) - { - if(i - 1 < 0 || text[(size_t)i - 1] == '\n' || CompilePPUProgram::IsSkip(text[(size_t)i - 1])) - { - if (text.length() - i < op.length()) return -1; - - if (text.substr(i, op.length()).compare(op) != 0) continue; - if (i + op.length() >= text.length() || text[(size_t) i + op.length()] == '\n' || - CompilePPUProgram::IsSkip(text[(size_t) i + op.length()])) return i; - } - } - - return -1; -} - -std::vector sections_list; -u32 section_name_offs = 0; -u32 section_offs = 0; - -SectionInfo::SectionInfo(const std::string& _name) -{ - name = _name; - memset(&shdr, 0, sizeof(Elf64_Shdr)); - - sections_list.push_back(this); - section_num = sections_list.size() - 1; - - shdr.sh_offset = section_offs; - shdr.sh_name = section_name_offs; - - section_name_offs += name.length() + 1; -} - -void SectionInfo::SetDataSize(u32 size, u32 addralign) -{ - if (addralign) shdr.sh_addralign = addralign; - if (shdr.sh_addralign) size = align(size, shdr.sh_addralign); - - if(!code.empty()) - { - for(u32 i=section_num + 1; ishdr.sh_offset -= code.size(); - } - - section_offs -= code.size(); - } - - code.resize(size); - - section_offs += size; - - for(u32 i=section_num + 1; ishdr.sh_offset += size; - } -} - -SectionInfo::~SectionInfo() -{ - sections_list.erase(sections_list.begin() + section_num); - - for(u32 i=section_num + 1; ishdr.sh_offset -= code.size(); - sections_list[i]->shdr.sh_name -= name.length(); - } - - section_offs -= code.size(); - section_name_offs -= name.length(); -} - -CompilePPUProgram::CompilePPUProgram( - const std::string& asm_, - const std::string& file_path, - wxTextCtrl* asm_list, - wxTextCtrl* hex_list, - wxTextCtrl* err_list, - bool analyze) - : m_asm(asm_) - , m_file_path(file_path) - , m_asm_list(asm_list) - , m_hex_list(hex_list) - , m_err_list(err_list) - , m_analyze(analyze) - , p(0) - , m_error(false) - , m_line(1) - , m_end_args(false) - , m_branch_pos(0) - , m_text_addr(0) -{ -} - -void CompilePPUProgram::WriteHex(const std::string& text) -{ - if(m_hex_list) - { - m_hex_list->WriteText(fmt::FromUTF8(text)); - } -} - -void CompilePPUProgram::WriteError(const std::string& error) -{ - if(m_err_list) - { - m_err_list->WriteText(fmt::FromUTF8(fmt::format("line %lld: %s\n", m_line, error.c_str()))); - } -} - -bool CompilePPUProgram::IsSkip(const char c) { return c == ' ' || c == '\t'; } -bool CompilePPUProgram::IsCommit(const char c) { return c == '#'; } -bool CompilePPUProgram::IsEnd() const { return p >= (s64)m_asm.length(); } -bool CompilePPUProgram::IsEndLn(const char c) const { return c == '\n' || p - 1 >= (s64)m_asm.length(); } - -char CompilePPUProgram::NextChar() { return *m_asm.substr(p++, 1).c_str(); } -void CompilePPUProgram::NextLn() { while( !IsEndLn(NextChar()) ) continue; if(!IsEnd()) m_line++; } -void CompilePPUProgram::EndLn() -{ - NextLn(); - p--; - m_line--; -} - -void CompilePPUProgram::FirstChar() -{ - p = 0; - m_line = 1; - m_branch_pos = 0; -} - -void CompilePPUProgram::PrevArg() -{ - while( --p >= 0 && (IsSkip(m_asm[(size_t)p]) || m_asm[(size_t)p] == ',')); - while( --p >= 0 && !IsSkip(m_asm[(size_t)p]) && !IsEndLn(m_asm[(size_t)p]) ); - if(IsEndLn(m_asm[(size_t)p])) p++; -} - -bool CompilePPUProgram::GetOp(std::string& result) -{ - s64 from = -1; - - for(;;) - { - const char cur_char = NextChar(); - - const bool skip = IsSkip(cur_char); - const bool commit = IsCommit(cur_char); - const bool endln = IsEndLn(cur_char); - - if(endln) p--; - - if(from == -1) - { - if(endln || commit) return false; - if(!skip) from = p - 1; - continue; - } - - if(skip || endln || commit) - { - const s64 to = (endln ? p : p - 1) - from; - result = m_asm.substr(from, to); - - return true; - } - } - - return false; -} - -int CompilePPUProgram::GetArg(std::string& result, bool func) -{ - s64 from = -1; - - for(char cur_char = NextChar(); !m_error; cur_char = NextChar()) - { - const bool skip = IsSkip(cur_char); - const bool commit = IsCommit(cur_char); - const bool endln = IsEndLn(cur_char); - const bool end = cur_char == ',' || (func && cur_char == ']'); - - if(endln) p--; - - if(from == -1) - { - if(endln || commit || end) return 0; - if(!skip) from = p - 1; - continue; - } - - const bool text = m_asm[(size_t)from] == '"'; - const bool end_text = cur_char == '"'; - - if((text ? end_text : (skip || commit || end)) || endln) - { - if(text && p > 2 && m_asm[(size_t)p - 2] == '\\' && (p <= 3 || m_asm[(size_t)p - 3] != '\\')) - { - continue; - } - - if(text && !end_text) - { - WriteError("'\"' not found."); - m_error = true; - } - - const s64 to = ((endln || text) ? p : p - 1) - from; - int ret = 1; - - if(skip || text) - { - for(char cur_char = NextChar(); !m_error; cur_char = NextChar()) - { - const bool skip = IsSkip(cur_char); - const bool commit = IsCommit(cur_char); - const bool endln = IsEndLn(cur_char); - const bool end = cur_char == ',' || (func && cur_char == ']'); - - if(skip) continue; - if(end) break; - - if(commit) - { - EndLn(); - ret = -1; - break; - } - - if(endln) - { - p--; - break; - } - - WriteError(fmt::format("Bad symbol '%c'", cur_char)); - m_error = true; - break; - } - } - - result = m_asm.substr(from, to); - - if(text) - { - for(u32 pos = 0; (s32)(pos = result.find('\\', pos)) != std::string::npos;) - { - if(pos + 1 < result.length() && result[pos + 1] == '\\') - { - pos += 2; - continue; - } - - const char v = result[pos + 1]; - switch(v) - { - case 'n': result = result.substr(0, pos) + '\n' + result.substr(pos + 2, result.length() - (pos + 2)); break; - case 'r': result = result.substr(0, pos) + '\r' + result.substr(pos + 2, result.length() - (pos + 2)); break; - case 't': result = result.substr(0, pos) + '\t' + result.substr(pos + 2, result.length() - (pos + 2)); break; - } - - pos++; - } - } - - return ret; - } - } - - return 0; -} - -bool CompilePPUProgram::CheckEnd(bool show_err) -{ - if(m_error) - { - NextLn(); - return false; - } - - while(true) - { - const char cur_char = NextChar(); - const bool skip = IsSkip(cur_char); - const bool commit = IsCommit(cur_char); - const bool endln = IsEndLn(cur_char); - - if(skip) continue; - - if(commit) - { - NextLn(); - return true; - } - - if(endln) - { - p--; - NextLn(); - return true; - } - - WriteError(fmt::format("Bad symbol '%c'", cur_char)); - NextLn(); - return false; - } - - return false; -} - -void CompilePPUProgram::DetectArgInfo(Arg& arg) -{ - const std::string str = arg.string; - - if(str.empty()) - { - arg.type = ARG_ERR; - return; - } - - if(GetInstruction(str)) - { - arg.type = ARG_INSTR; - return; - } - - if(str.length() > 1) - { - for(const Branch& branch : m_branches) - { - if(str != branch.m_name) - continue; - - arg.type = ARG_BRANCH; - arg.value = GetBranchValue(str); - return; - } - } - - switch((char)str[0]) - { - case 'r': case 'f': case 'v': - { - if(str.length() < 2) - { - arg.type = ARG_ERR; - return; - } - - if(str == "rtoc") - { - arg.type = ARG_REG_R; - arg.value = 2; - return; - } - - for(u32 i=1; i '9') - { - arg.type = ARG_ERR; - return; - } - } - - u32 reg = std::stoul(str.substr(1, str.length() - 1)); - - if(reg >= 32) - { - arg.type = ARG_ERR; - return; - } - - switch(str[0]) - { - case 'r': arg.type = ARG_REG_R; break; - case 'f': arg.type = ARG_REG_F; break; - case 'v': arg.type = ARG_REG_V; break; - default: arg.type = ARG_ERR; break; - } - - arg.value = reg; - } - return; - - case 'c': - if(str.length() > 2 && str[1] == 'r') - { - for(u32 i=2; i '9') - { - arg.type = ARG_ERR; - return; - } - } - - u32 reg; - sscanf(str.c_str(), "cr%d", ®); - - if(reg < 8) - { - arg.type = ARG_REG_CR; - arg.value = reg; - } - else - { - arg.type = ARG_ERR; - } - - return; - } - break; - - case '"': - if(str.length() < 2) - { - arg.type = ARG_ERR; - return; - } - - if(str[str.length() - 1] != '"') - { - arg.type = ARG_ERR; - return; - } - - arg.string = str.substr(1, str.length() - 2); - arg.type = ARG_TXT; - return; - } - - // Hex numbers - if(str.length() > 2 && str.substr(0, 2) == "0x") - { - for(u32 i=2; i= '0' && str[i] <= '9') || - (str[i] >= 'a' && str[i] <= 'f') || - (str[i] >= 'A' && str[i] <= 'F') - ) continue; - - arg.type = ARG_ERR; - return; - } - - arg.type = ARG_NUM16; - arg.value = std::stoul(str, nullptr, 16); - return; - } - - for(u32 i= str[0] == '-' ? 1 : 0; i '9') - { - arg.type = ARG_ERR; - return; - } - } - - arg.type = ARG_NUM; - arg.value = std::stoul(str); -} - -void CompilePPUProgram::LoadArgs() -{ - m_args.clear(); - m_cur_arg = 0; - - std::string str; - while(int r = GetArg(str)) - { - m_args.emplace_back(str); - DetectArgInfo(m_args[m_args.size() -1]); - - if(r == -1) - break; - } - - m_end_args = m_args.size() > 0; -} - -u32 CompilePPUProgram::GetBranchValue(const std::string& branch_name) const -{ - for(const Branch& branch : m_branches) - { - if(branch_name != branch.m_name) - continue; - - if(branch.m_pos >= 0) - return m_text_addr + branch.m_pos * 4; - - return branch.m_addr; - } - - return 0; -} - -bool CompilePPUProgram::SetNextArgType(u32 types, bool show_err) -{ - if(m_error) return false; - - if(m_cur_arg >= m_args.size()) - { - if(show_err) - { - WriteError(fmt::format("%d arg not found", m_cur_arg + 1)); - m_error = true; - } - - return false; - } - - const Arg& arg = m_args[m_cur_arg]; - - if(arg.type & types) - { - m_cur_arg++; - return true; - } - - if(show_err) - { - WriteError(fmt::format("Bad arg '%s'", arg.string.c_str())); - m_error = true; - } - - return false; -} - -bool CompilePPUProgram::SetNextArgBranch(u8 aa, bool show_err) -{ - const u32 pos = m_cur_arg; - const bool ret = SetNextArgType(ARG_BRANCH | ARG_IMM, show_err); - - if(!aa && pos < m_args.size()) - { - switch(m_args[pos].type) - { - case ARG_NUM: - m_args[pos].value += m_text_addr + m_branch_pos * 4; - break; - - case ARG_BRANCH: - m_args[pos].value -= m_text_addr + m_branch_pos * 4; - break; - } - } - - return ret; -} - -bool CompilePPUProgram::IsBranchOp(const std::string& op) -{ - return op.length() > 1 && op[op.length() - 1] == ':'; -} - -bool CompilePPUProgram::IsFuncOp(const std::string& op) -{ - return op.length() >= 1 && op[0] == '['; -} - -CompilePPUProgram::SP_TYPE CompilePPUProgram::GetSpType(const std::string& op) -{ - if (op.compare(".int") == 0) return SP_INT; - if (op.compare(".string") == 0) return SP_STRING; - if (op.compare(".strlen") == 0) return SP_STRLEN; - if (op.compare(".buf") == 0) return SP_BUF; - if (op.compare(".srl") == 0) return SP_SRL; - if (op.compare(".srr") == 0) return SP_SRR; - if (op.compare(".mul") == 0) return SP_MUL; - if (op.compare(".div") == 0) return SP_DIV; - if (op.compare(".add") == 0) return SP_ADD; - if (op.compare(".sub") == 0) return SP_SUB; - if (op.compare(".and") == 0) return SP_AND; - if (op.compare(".or") == 0) return SP_OR; - if (op.compare(".xor") == 0) return SP_XOR; - if (op.compare(".not") == 0) return SP_NOT; - if (op.compare(".nor") == 0) return SP_NOR; - - return SP_ERR; -} - -std::string CompilePPUProgram::GetSpStyle(const SP_TYPE sp) -{ - switch(sp) - { - case SP_INT: - case SP_STRING: - case SP_STRLEN: - case SP_NOT: - return "[dst, src]"; - - case SP_BUF: - return "[dst, size]"; - - case SP_SRL: - case SP_SRR: - case SP_MUL: - case SP_DIV: - case SP_ADD: - case SP_SUB: - case SP_AND: - case SP_OR: - case SP_XOR: - case SP_NOR: - return "[dst, src1, src2]"; - } - - return "error"; -} - -bool CompilePPUProgram::IsSpOp(const std::string& op) -{ - return GetSpType(op) != SP_ERR; -} - -CompilePPUProgram::Branch& CompilePPUProgram::GetBranch(const std::string& name) -{ - for(Branch& branch : m_branches) - { - if(name != branch.m_name) - continue; - - return branch; - } - - return m_branches[0]; -} - -void CompilePPUProgram::SetSp(const std::string& name, u32 addr, bool create) -{ - if(create) - { - m_branches.emplace_back(name, -1, addr); - return; - } - - GetBranch(name); - - for(Branch& branch : m_branches) - { - if(name != branch.m_name) - continue; - - branch.m_addr = addr; - } -} - -void CompilePPUProgram::LoadSp(const std::string& op, Elf64_Shdr& s_opd) -{ - SP_TYPE sp = GetSpType(op); - - std::string test; - if(!GetArg(test) || test[0] != '[') - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("data not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - while(p > 0 && m_asm[(size_t)p] != '[') p--; - p++; - - std::string dst; - if(!GetArg(dst)) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("dst not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - Arg a_dst(dst); - DetectArgInfo(a_dst); - - Branch* dst_branch = NULL; - - switch(a_dst.type) - { - case ARG_BRANCH: - { - Branch& b = GetBranch(dst); - if(b.m_addr >= 0 && b.m_id < 0 && b.m_pos < 0) dst_branch = &b; - } - break; - - case ARG_ERR: - { - m_branches.emplace_back("", -1, 0); - dst_branch = &m_branches[m_branches.size() - 1]; - } - break; - } - - if(!dst_branch) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("bad dst type. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - switch(sp) - { - case SP_INT: - case SP_STRING: - case SP_STRLEN: - case SP_BUF: - case SP_NOT: - { - std::string src1; - if(!GetArg(src1, true)) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("src not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - Arg a_src1(src1); - DetectArgInfo(a_src1); - - if(sp == SP_STRLEN - ? ~(ARG_TXT | ARG_BRANCH) & a_src1.type - : sp == SP_STRING - ? ~ARG_TXT & a_src1.type - : ~(ARG_IMM | ARG_BRANCH) & a_src1.type) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("bad src type. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - if(m_asm[(size_t)p - 1] != ']') - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("']' not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - if(!CheckEnd()) - { - if(m_analyze) WriteHex("error\n"); - return; - } - - if(sp == SP_STRING) - { - src1 = src1.substr(1, src1.length()-2); - bool founded = false; - - for(const SpData& sp_str : m_sp_string) - { - if(src1 != sp_str.m_data) - continue; - - *dst_branch = Branch(dst, -1, sp_str.m_addr); - founded = true; - } - - if(!founded) - { - const u32 addr = s_opd.sh_addr + s_opd.sh_size; - m_sp_string.emplace_back(src1, addr); - s_opd.sh_size += src1.length() + 1; - *dst_branch = Branch(dst, -1, addr); - } - } - else if(sp == SP_STRLEN) - { - switch(a_src1.type) - { - case ARG_TXT: *dst_branch = Branch(dst, -1, src1.length() - 2); break; - case ARG_BRANCH: - { - for(const SpData& sp_str : m_sp_string) - { - if(sp_str.m_addr == a_src1.value) - { - *dst_branch = Branch(dst, -1, sp_str.m_data.length()); - break; - } - } - } - break; - } - } - else - { - switch(sp) - { - case SP_INT: *dst_branch = Branch(dst, -1, a_src1.value); break; - case SP_BUF: - *dst_branch = Branch(dst, -1, s_opd.sh_addr + s_opd.sh_size); - s_opd.sh_size += a_src1.value; - break; - case SP_NOT: *dst_branch = Branch(dst, -1, ~a_src1.value); break; - } - } - } - break; - - case SP_SRL: - case SP_SRR: - case SP_MUL: - case SP_DIV: - case SP_ADD: - case SP_SUB: - case SP_AND: - case SP_OR: - case SP_XOR: - case SP_NOR: - { - std::string src1; - if(!GetArg(src1)) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("src1 not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - Arg a_src1(src1); - DetectArgInfo(a_src1); - - if(~(ARG_IMM | ARG_BRANCH) & a_src1.type) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("bad src1 type. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - std::string src2; - if(!GetArg(src2, true)) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("src2 not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - return; - } - - Arg a_src2(src2); - DetectArgInfo(a_src2); - - if(~(ARG_IMM | ARG_BRANCH) & a_src2.type) - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("bad src2 type. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - if(m_asm[(size_t)p - 1] != ']') - { - if(m_analyze) WriteHex("error\n"); - WriteError(fmt::format("']' not found. style: %s", GetSpStyle(sp).c_str())); - m_error = true; - NextLn(); - return; - } - - if(!CheckEnd()) - { - if(m_analyze) WriteHex("error\n"); - return; - } - - switch(sp) - { - case SP_SRL: *dst_branch = Branch(dst, -1, a_src1.value << a_src2.value); break; - case SP_SRR: *dst_branch = Branch(dst, -1, a_src1.value >> a_src2.value); break; - case SP_MUL: *dst_branch = Branch(dst, -1, a_src1.value * a_src2.value); break; - case SP_DIV: *dst_branch = Branch(dst, -1, a_src1.value / a_src2.value); break; - case SP_ADD: *dst_branch = Branch(dst, -1, a_src1.value + a_src2.value); break; - case SP_SUB: *dst_branch = Branch(dst, -1, a_src1.value - a_src2.value); break; - case SP_AND: *dst_branch = Branch(dst, -1, a_src1.value & a_src2.value); break; - case SP_OR: *dst_branch = Branch(dst, -1, a_src1.value | a_src2.value); break; - case SP_XOR: *dst_branch = Branch(dst, -1, a_src1.value ^ a_src2.value); break; - case SP_NOR: *dst_branch = Branch(dst, -1, ~(a_src1.value | a_src2.value)); break; - } - } - break; - } - - if(m_analyze) WriteHex("\n"); -} - -void CompilePPUProgram::Compile() -{ - if(m_err_list) - { - m_err_list->Freeze(); - m_err_list->Clear(); - } - - if(m_analyze && m_hex_list) - { - m_hex_list->Freeze(); - m_hex_list->Clear(); - } - - m_code.clear(); - m_branches.clear(); - - u32 text_size = 0; - while(!IsEnd()) - { - std::string op; - if(GetOp(op) && !IsFuncOp(op) && !IsBranchOp(op) && !IsSpOp(op)) - { - text_size += 4; - } - - NextLn(); - } - - Elf64_Ehdr elf_info; - memset(&elf_info, 0, sizeof(Elf64_Ehdr)); - elf_info.e_phentsize = sizeof(Elf64_Phdr); - elf_info.e_shentsize = sizeof(Elf64_Shdr); - elf_info.e_ehsize = sizeof(Elf64_Ehdr); - elf_info.e_phnum = 5; - elf_info.e_shnum = 15; - elf_info.e_shstrndx = elf_info.e_shnum - 1; - elf_info.e_phoff = elf_info.e_ehsize; - u32 section_offset = align(elf_info.e_phoff + elf_info.e_phnum * elf_info.e_phentsize, 0x100); - - static const u32 sceStub_text_block = 8 * 4; - - Elf64_Shdr s_null; - memset(&s_null, 0, sizeof(Elf64_Shdr)); - - std::vector sections_names; - u32 section_name_offset = 1; - - Elf64_Shdr s_text; - memset(&s_text, 0, sizeof(Elf64_Shdr)); - s_text.sh_type = 1; - s_text.sh_offset = section_offset; - s_text.sh_addr = section_offset + 0x10000; - s_text.sh_size = text_size; - s_text.sh_addralign = 4; - s_text.sh_flags = 6; - s_text.sh_name = section_name_offset; - sections_names.push_back(".text"); - section_name_offset += std::string(".text").length() + 1; - section_offset += s_text.sh_size; - - m_text_addr = s_text.sh_addr; - - struct Module - { - std::string m_name; - std::vector m_imports; - - Module(const std::string& name, u32 import) : m_name(name) - { - Add(import); - } - - void Add(u32 import) - { - m_imports.push_back(import); - } - - void Clear() - { - m_name.clear(); - m_imports.clear(); - } - }; - - std::vector modules; - - FirstChar(); - while(!IsEnd()) - { - std::string op; - if(!GetOp(op) || !IsFuncOp(op)) - { - NextLn(); - continue; - } - - while(p > 0 && m_asm[(size_t)p] != '[') p--; - p++; - - std::string module_name, name, id; - - if(!GetArg(module_name)) - { - WriteError("module not found. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - Arg a_module(module_name); - DetectArgInfo(a_module); - - if(~ARG_ERR & a_module.type) - { - WriteError("bad module type. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - if(!GetArg(name)) - { - WriteError("name not found. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - Arg a_name(name); - DetectArgInfo(a_name); - - if(~ARG_ERR & a_name.type) - { - WriteError("bad name type. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - if(!GetArg(id, true)) - { - WriteError("id not found. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - Arg a_id(id); - DetectArgInfo(a_id); - - if(~ARG_IMM & a_id.type) - { - WriteError("bad id type. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - if(m_asm[(size_t)p - 1] != ']') - { - WriteError("']' not found. style: [module, name, id]"); - m_error = true; - NextLn(); - continue; - } - - if(!CheckEnd()) continue; - - m_branches.emplace_back(name, a_id.value, 0); - const u32 import = m_branches.size() - 1; - - bool founded = false; - for(Module& module : modules) - { - if(module.m_name != module_name) - continue; - - founded = true; - module.Add(import); - break; - } - - if(!founded) modules.emplace_back(module_name, import); - } - - u32 imports_count = 0; - - for(const Module& module : modules) - { - imports_count += module.m_imports.size(); - } - - Elf64_Shdr s_sceStub_text; - memset(&s_sceStub_text, 0, sizeof(Elf64_Shdr)); - s_sceStub_text.sh_addralign = 4; - section_offset = align(section_offset, s_sceStub_text.sh_addralign); - s_sceStub_text.sh_type = 1; - s_sceStub_text.sh_offset = section_offset; - s_sceStub_text.sh_addr = section_offset + 0x10000; - s_sceStub_text.sh_name = section_name_offset; - s_sceStub_text.sh_flags = 6; - s_sceStub_text.sh_size = imports_count * sceStub_text_block; - sections_names.push_back(".sceStub.text"); - section_name_offset += std::string(".sceStub.text").length() + 1; - section_offset += s_sceStub_text.sh_size; - - for(const Module& module : modules) - { - u32 pos = 0; - for(const u32& import : module.m_imports) - { - m_branches[import].m_addr = s_sceStub_text.sh_addr + sceStub_text_block * pos; - ++pos; - } - } - - Elf64_Shdr s_lib_stub_top; - memset(&s_lib_stub_top, 0, sizeof(Elf64_Shdr)); - s_lib_stub_top.sh_addralign = 4; - section_offset = align(section_offset, s_lib_stub_top.sh_addralign); - s_lib_stub_top.sh_type = 1; - s_lib_stub_top.sh_name = section_name_offset; - s_lib_stub_top.sh_offset = section_offset; - s_lib_stub_top.sh_addr = section_offset + 0x10000; - s_lib_stub_top.sh_flags = 2; - s_lib_stub_top.sh_size = 4; - sections_names.push_back(".lib.stub.top"); - section_name_offset += std::string(".lib.stub.top").length() + 1; - section_offset += s_lib_stub_top.sh_size; - - Elf64_Shdr s_lib_stub; - memset(&s_lib_stub, 0, sizeof(Elf64_Shdr)); - s_lib_stub.sh_addralign = 4; - s_lib_stub.sh_type = 1; - s_lib_stub.sh_name = section_name_offset; - s_lib_stub.sh_offset = section_offset; - s_lib_stub.sh_addr = section_offset + 0x10000; - s_lib_stub.sh_flags = 2; - s_lib_stub.sh_size = sizeof(sys_stub) * modules.size(); - sections_names.push_back(".lib.stub"); - section_name_offset += std::string(".lib.stub").length() + 1; - section_offset += s_lib_stub.sh_size; - - Elf64_Shdr s_lib_stub_btm; - memset(&s_lib_stub_btm, 0, sizeof(Elf64_Shdr)); - s_lib_stub_btm.sh_addralign = 4; - s_lib_stub_btm.sh_type = 1; - s_lib_stub_btm.sh_name = section_name_offset; - s_lib_stub_btm.sh_offset = section_offset; - s_lib_stub_btm.sh_addr = section_offset + 0x10000; - s_lib_stub_btm.sh_flags = 2; - s_lib_stub_btm.sh_size = 4; - sections_names.push_back(".lib.stub.btm"); - section_name_offset += std::string(".lib.stub.btm").length() + 1; - section_offset += s_lib_stub_btm.sh_size; - - Elf64_Shdr s_rodata_sceFNID; - memset(&s_rodata_sceFNID, 0, sizeof(Elf64_Shdr)); - s_rodata_sceFNID.sh_addralign = 4; - section_offset = align(section_offset, s_rodata_sceFNID.sh_addralign); - s_rodata_sceFNID.sh_type = 1; - s_rodata_sceFNID.sh_name = section_name_offset; - s_rodata_sceFNID.sh_offset = section_offset; - s_rodata_sceFNID.sh_addr = section_offset + 0x10000; - s_rodata_sceFNID.sh_flags = 2; - s_rodata_sceFNID.sh_size = imports_count * 4; - sections_names.push_back(".rodata.sceFNID"); - section_name_offset += std::string(".rodata.sceFNID").length() + 1; - section_offset += s_rodata_sceFNID.sh_size; - - Elf64_Shdr s_rodata_sceResident; - memset(&s_rodata_sceResident, 0, sizeof(Elf64_Shdr)); - s_rodata_sceResident.sh_addralign = 4; - section_offset = align(section_offset, s_rodata_sceResident.sh_addralign); - s_rodata_sceResident.sh_type = 1; - s_rodata_sceResident.sh_name = section_name_offset; - s_rodata_sceResident.sh_offset = section_offset; - s_rodata_sceResident.sh_addr = section_offset + 0x10000; - s_rodata_sceResident.sh_flags = 2; - s_rodata_sceResident.sh_size = 4; - for(const Module& module : modules) - { - s_rodata_sceResident.sh_size += module.m_name.length() + 1; - } - s_rodata_sceResident.sh_size = align(s_rodata_sceResident.sh_size, s_rodata_sceResident.sh_addralign); - sections_names.push_back(".rodata.sceResident"); - section_name_offset += std::string(".rodata.sceResident").length() + 1; - section_offset += s_rodata_sceResident.sh_size; - - Elf64_Shdr s_lib_ent_top; - memset(&s_lib_ent_top, 0, sizeof(Elf64_Shdr)); - s_lib_ent_top.sh_addralign = 4; - section_offset = align(section_offset, s_lib_ent_top.sh_addralign); - s_lib_ent_top.sh_size = 4; - s_lib_ent_top.sh_flags = 2; - s_lib_ent_top.sh_type = 1; - s_lib_ent_top.sh_name = section_name_offset; - s_lib_ent_top.sh_offset = section_offset; - s_lib_ent_top.sh_addr = section_offset + 0x10000; - sections_names.push_back(".lib.ent.top"); - section_name_offset += std::string(".lib.ent.top").length() + 1; - section_offset += s_lib_ent_top.sh_size; - - Elf64_Shdr s_lib_ent_btm; - memset(&s_lib_ent_btm, 0, sizeof(Elf64_Shdr)); - s_lib_ent_btm.sh_addralign = 4; - s_lib_ent_btm.sh_size = 4; - s_lib_ent_btm.sh_flags = 2; - s_lib_ent_btm.sh_type = 1; - s_lib_ent_btm.sh_name = section_name_offset; - s_lib_ent_btm.sh_offset = section_offset; - s_lib_ent_btm.sh_addr = section_offset + 0x10000; - sections_names.push_back(".lib.ent.btm"); - section_name_offset += std::string(".lib.ent.btm").length() + 1; - section_offset += s_lib_ent_btm.sh_size; - - Elf64_Shdr s_sys_proc_prx_param; - memset(&s_sys_proc_prx_param, 0, sizeof(Elf64_Shdr)); - s_sys_proc_prx_param.sh_addralign = 4; - section_offset = align(section_offset, s_sys_proc_prx_param.sh_addralign); - s_sys_proc_prx_param.sh_type = 1; - s_sys_proc_prx_param.sh_size = sizeof(sys_proc_prx_param); - s_sys_proc_prx_param.sh_name = section_name_offset; - s_sys_proc_prx_param.sh_offset = section_offset; - s_sys_proc_prx_param.sh_addr = section_offset + 0x10000; - s_sys_proc_prx_param.sh_flags = 2; - sections_names.push_back(".sys_proc_prx_param"); - section_name_offset += std::string(".sys_proc_prx_param").length() + 1; - section_offset += s_sys_proc_prx_param.sh_size; - - const u32 prog_load_0_end = section_offset; - - section_offset = align(section_offset + 0x10000, 0x10000); - const u32 prog_load_1_start = section_offset; - - Elf64_Shdr s_data_sceFStub; - memset(&s_data_sceFStub, 0, sizeof(Elf64_Shdr)); - s_data_sceFStub.sh_name = section_name_offset; - s_data_sceFStub.sh_addralign = 4; - section_offset = align(section_offset, s_data_sceFStub.sh_addralign); - s_data_sceFStub.sh_flags = 3; - s_data_sceFStub.sh_type = 1; - s_data_sceFStub.sh_offset = section_offset; - s_data_sceFStub.sh_addr = section_offset + 0x10000; - s_data_sceFStub.sh_size = imports_count * 4; - sections_names.push_back(".data.sceFStub"); - section_name_offset += std::string(".data.sceFStub").length() + 1; - section_offset += s_data_sceFStub.sh_size; - - Elf64_Shdr s_tbss; - memset(&s_tbss, 0, sizeof(Elf64_Shdr)); - s_tbss.sh_addralign = 4; - section_offset = align(section_offset, s_tbss.sh_addralign); - s_tbss.sh_size = 4; - s_tbss.sh_flags = 0x403; - s_tbss.sh_type = 8; - s_tbss.sh_name = section_name_offset; - s_tbss.sh_offset = section_offset; - s_tbss.sh_addr = section_offset + 0x10000; - sections_names.push_back(".tbss"); - section_name_offset += std::string(".tbss").length() + 1; - section_offset += s_tbss.sh_size; - - Elf64_Shdr s_opd; - memset(&s_opd, 0, sizeof(Elf64_Shdr)); - s_opd.sh_addralign = 8; - section_offset = align(section_offset, s_opd.sh_addralign); - s_opd.sh_size = 2*4; - s_opd.sh_type = 1; - s_opd.sh_offset = section_offset; - s_opd.sh_addr = section_offset + 0x10000; - s_opd.sh_name = section_name_offset; - s_opd.sh_flags = 3; - sections_names.push_back(".opd"); - section_name_offset += std::string(".opd").length() + 1; - - FirstChar(); - - while(!IsEnd()) - { - std::string op; - if(!GetOp(op) || IsFuncOp(op) || IsSpOp(op)) - { - NextLn(); - continue; - } - - if(IsBranchOp(op)) - { - const std::string& name = op.substr(0, op.length() - 1); - - for(const Branch& branch : m_branches) - { - if(name != branch.m_name) - continue; - - WriteError(fmt::format("'%s' already declared", name.c_str())); - m_error = true; - break; - } - - Arg a_name(name); - DetectArgInfo(a_name); - - if(a_name.type != ARG_ERR) - { - WriteError(fmt::format("bad name '%s'", name.c_str())); - m_error = true; - } - - if(m_error) break; - - m_branches.emplace_back(name, m_branch_pos); - - CheckEnd(); - continue; - } - - m_branch_pos++; - NextLn(); - } - - bool has_entry = false; - for(const Branch& branch : m_branches) - { - if(branch.m_name != "entry") - continue; - - has_entry = true; - break; - } - - if(!has_entry) m_branches.emplace_back("entry", 0); - - if(m_analyze) m_error = false; - FirstChar(); - - while(!IsEnd()) - { - m_args.clear(); - m_end_args = false; - - std::string op; - if(!GetOp(op) || IsBranchOp(op) || IsFuncOp(op)) - { - if(m_analyze) WriteHex("\n"); - NextLn(); - continue; - } - - if(IsSpOp(op)) - { - LoadSp(op, s_opd); - continue; - } - - LoadArgs(); - - auto instr = GetInstruction(op); - if(instr) - { - uint type[] = - { - ARG_IMM, - ARG_REG_R, - ARG_REG_F, - ARG_REG_V, - ARG_REG_CR, - }; - - for(uint i=0; iGetArgCount(); ++i) - { - switch(instr->GetArg(i).m_type) - { - case FIELD_BRANCH: - SetNextArgBranch(0); //TODO - break; - - default: - SetNextArgType(type[instr->GetArg(i).m_type]); - break; - } - } - } - else - { - WriteError(fmt::format("unknown instruction '%s'", op.c_str())); - EndLn(); - m_error = true; - } - - CheckEnd(); - - if(m_error) - { - if(m_analyze) - { - WriteHex("error\n"); - m_error = false; - continue; - } - - break; - } - - u32 code; - - { - std::vector args; - args.resize(m_args.size()); - for(uint i=0; i::make(s_lib_stub_top.sh_addr + s_lib_stub_top.sh_size); - prx_param.libstubend = vm::bptr::make(s_lib_stub_btm.sh_addr); - prx_param.ver = 0x101; - - elf_info.e_entry = s_opd.sh_addr; - - f.Seek(0); - WriteEhdr(f, elf_info); - - f.Seek(elf_info.e_shoff); - WriteShdr(f, s_null); - WriteShdr(f, s_text); - WriteShdr(f, s_opd); - WriteShdr(f, s_sceStub_text); - WriteShdr(f, s_lib_stub_top); - WriteShdr(f, s_lib_stub); - WriteShdr(f, s_lib_stub_btm); - WriteShdr(f, s_data_sceFStub); - WriteShdr(f, s_rodata_sceFNID); - WriteShdr(f, s_rodata_sceResident); - WriteShdr(f, s_sys_proc_prx_param); - WriteShdr(f, s_lib_ent_top); - WriteShdr(f, s_lib_ent_btm); - WriteShdr(f, s_tbss); - WriteShdr(f, s_shstrtab); - - f.Seek(s_text.sh_offset); - for(const u32& code : m_code) - { - Write32(f, code); - } - - f.Seek(s_opd.sh_offset); - f.Write(opd_data, 8); - for(u32 i=0; i> 16)); - Write32(f, LWZ(12, 12, addr)); - Write32(f, STD(2, 1, 40)); - Write32(f, LWZ(0, 12, 0)); - Write32(f, LWZ(2, 12, 4)); - Write32(f, MTSPR(0x009, 0)); - Write32(f, BCCTR(20, 0, 0, 0)); - } - - f.Seek(s_lib_stub_top.sh_offset); - f.Seek(s_lib_stub_top.sh_size, rFromCurrent); - - f.Seek(s_lib_stub.sh_offset); - for(u32 i=0, nameoffs=4, dataoffs=0; i::make(s_rodata_sceResident.sh_addr + nameoffs); - stub.s_nid = vm::bptr::make(s_rodata_sceFNID.sh_addr + dataoffs); - stub.s_text = vm::bptr::make(s_data_sceFStub.sh_addr + dataoffs); - stub.s_imports = modules[i].m_imports.size(); - - dataoffs += modules[i].m_imports.size() * 4; - - f.Write(&stub, sizeof(sys_stub)); - nameoffs += modules[i].m_name.length() + 1; - } - - f.Seek(s_lib_stub_btm.sh_offset); - f.Seek(s_lib_stub_btm.sh_size, rFromCurrent); - - f.Seek(s_data_sceFStub.sh_offset); - for(const Module& module : modules) - { - for(const u32& import : module.m_imports) - { - Write32(f, m_branches[import].m_addr); - } - } - - f.Seek(s_rodata_sceFNID.sh_offset); - for(const Module& module : modules) - { - for(const u32& import : module.m_imports) - { - Write32(f, m_branches[import].m_id); - } - } - - f.Seek(s_rodata_sceResident.sh_offset + 4); - for(u32 i=0; iThaw(); - - if(m_analyze) - { - if(m_hex_list) - { - m_hex_list->Thaw(); - } - } - else - { - //TODO: doesn't look portable - system("make_fself.cmd"); - } -} -*/ \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUProgramCompiler.h b/rpcs3/Emu/Cell/PPUProgramCompiler.h deleted file mode 100644 index f7d5a00559..0000000000 --- a/rpcs3/Emu/Cell/PPUProgramCompiler.h +++ /dev/null @@ -1,192 +0,0 @@ -#pragma once -/*#include "PPUInstrTable.h" -#include "Loader/ELF64.h" - -enum ArgType -{ - ARG_ERR = 0, - ARG_NUM = 1 << 0, - ARG_NUM16 = 1 << 1, - ARG_TXT = 1 << 2, - ARG_REG_R = 1 << 3, - ARG_REG_F = 1 << 4, - ARG_REG_V = 1 << 5, - ARG_REG_CR = 1 << 6, - ARG_BRANCH = 1 << 7, - ARG_INSTR = 1 << 8, - ARG_IMM = ARG_NUM | ARG_NUM16 | ARG_BRANCH, -}; - -struct Arg -{ - std::string string; - u32 value; - ArgType type; - - Arg(const std::string& _string, const u32 _value = 0, const ArgType _type = ARG_ERR) - : string(_string) - , value(_value) - , type(_type) - { - } -}; - -struct SectionInfo -{ - Elf64_Shdr shdr; - std::string name; - std::vector code; - u32 section_num; - - SectionInfo(const std::string& name); - ~SectionInfo(); - - void SetDataSize(u32 size, u32 align = 0); -}; - -struct ProgramInfo -{ - std::vector code; - Elf64_Phdr phdr; - bool is_preload; - - ProgramInfo() - { - is_preload = false; - memset(&phdr, 0, sizeof(Elf64_Phdr)); - } -}; - -class CompilePPUProgram -{ - struct Branch - { - std::string m_name; - s32 m_pos; - s32 m_id; - s32 m_addr; - - Branch(const std::string& name, s32 pos) - : m_name(name) - , m_pos(pos) - , m_id(-1) - , m_addr(-1) - { - } - - Branch(const std::string& name, u32 id, u32 addr) - : m_name(name) - , m_pos(-1) - , m_id(id) - , m_addr(addr) - { - } - }; - - bool m_analyze; - s64 p; - u64 m_line; - const std::string& m_asm; - wxTextCtrl* m_asm_list; - wxTextCtrl* m_hex_list; - wxTextCtrl* m_err_list; - bool m_error; - std::vector m_code; - bool m_end_args; - std::vector m_branches; - s32 m_branch_pos; - u32 m_text_addr; - std::string m_file_path; - - struct SpData - { - std::string m_data; - u32 m_addr; - - SpData(const std::string& data, u32 addr) - : m_data(data) - , m_addr(addr) - { - } - }; - - std::vector m_sp_string; - std::vector m_args; - u32 m_cur_arg; - -public: - CompilePPUProgram( - const std::string& asm_, - const std::string& file_path = "", - wxTextCtrl* asm_list = nullptr, - wxTextCtrl* hex_list = nullptr, - wxTextCtrl* err_list = nullptr, - bool analyze = false); - - static bool IsSkip(const char c); - static bool IsCommit(const char c); - -protected: - bool IsEnd() const; - bool IsEndLn(const char c) const; - - void WriteHex(const std::string& text); - void WriteError(const std::string& error); - - char NextChar(); - void NextLn(); - void EndLn(); - - void FirstChar(); - void PrevArg(); - - bool GetOp(std::string& result); - int GetArg(std::string& result, bool func = false); - - bool CheckEnd(bool show_err = true); - - void DetectArgInfo(Arg& arg); - void LoadArgs(); - u32 GetBranchValue(const std::string& branch) const; - - bool SetNextArgType(u32 types, bool show_err = true); - bool SetNextArgBranch(u8 aa, bool show_err = true); - -public: - static bool IsBranchOp(const std::string& op); - static bool IsFuncOp(const std::string& op); - - enum SP_TYPE - { - SP_ERR, - SP_INT, - SP_STRING, - SP_STRLEN, - SP_BUF, - SP_SRL, - SP_SRR, - SP_MUL, - SP_DIV, - SP_ADD, - SP_SUB, - SP_AND, - SP_OR, - SP_XOR, - SP_NOT, - SP_NOR, - }; - - static SP_TYPE GetSpType(const std::string& op); - static std::string GetSpStyle(const SP_TYPE sp); - - static bool IsSpOp(const std::string& op); - -protected: - Branch& GetBranch(const std::string& name); - void SetSp(const std::string& name, u32 addr, bool create); - void LoadSp(const std::string& op, Elf64_Shdr& s_opd); - -public: - void Compile(); -}; -*/ \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Callback.h b/rpcs3/Emu/SysCalls/Callback.h deleted file mode 100644 index cd32f7b21b..0000000000 --- a/rpcs3/Emu/SysCalls/Callback.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -class PPUThread; - -class CallbackManager -{ - using check_cb_t = std::function; - using async_cb_t = std::function; - - std::mutex m_mutex; - - std::queue m_check_cb; - std::queue m_async_cb; - - std::shared_ptr m_cb_thread; - -public: - // Register checked callback - void Register(check_cb_t func); - - // Register async callback, called in callback thread - void Async(async_cb_t func); - - // Get one registered callback - check_cb_t Check(); - - void Init(); - - void Clear(); -}; diff --git a/rpcs3/Emu/SysCalls/FuncList.cpp b/rpcs3/Emu/SysCalls/FuncList.cpp deleted file mode 100644 index 95705cb01e..0000000000 --- a/rpcs3/Emu/SysCalls/FuncList.cpp +++ /dev/null @@ -1,4418 +0,0 @@ -#include "stdafx.h" -#include "Modules.h" -#include "SysCalls.h" - -std::string get_ps3_function_name(u64 fid) -{ - // check syscalls - switch (~fid) - { - case 1: return "sys_process_getpid"; - case 2: return "sys_process_wait_for_child"; - case 3: return "sys_process_exit"; - case 4: return "sys_process_get_status"; - case 5: return "sys_process_detach_child"; - case 12: return "sys_process_get_number_of_object"; - case 13: return "sys_process_get_id"; - case 14: return "sys_process_is_spu_lock_line_reservation_address"; - case 18: return "sys_process_getppid"; - case 19: return "sys_process_kill"; - case 21: return "_sys_process_spawn"; - case 22: return "sys_process_exit"; - case 23: return "sys_process_wait_for_child2"; - case 25: return "sys_process_get_sdk_version"; - case 26: return "_sys_process_exit"; - case 28: return "_sys_process_get_number_of_object"; - case 29: return "sys_process_get_id"; - case 30: return "_sys_process_get_paramsfo"; - case 31: return "sys_process_get_ppu_guid"; - case 41: return "_sys_ppu_thread_exit"; - case 43: return "sys_ppu_thread_yield"; - case 44: return "sys_ppu_thread_join"; - case 45: return "sys_ppu_thread_detach"; - case 46: return "sys_ppu_thread_get_join_state"; - case 47: return "sys_ppu_thread_set_priority"; - case 48: return "sys_ppu_thread_get_priority"; - case 49: return "sys_ppu_thread_get_stack_information"; - case 50: return "sys_ppu_thread_stop"; - case 51: return "sys_ppu_thread_restart"; - case 52: return "_sys_ppu_thread_create"; - case 53: return "sys_ppu_thread_start"; - case 56: return "sys_ppu_thread_rename"; - case 57: return "sys_ppu_thread_recover_page_fault"; - case 58: return "sys_ppu_thread_get_page_fault_context"; - case 60: return "sys_trace_create"; - case 61: return "sys_trace_start"; - case 62: return "sys_trace_stop"; - case 63: return "sys_trace_update_top_index"; - case 64: return "sys_trace_destroy"; - case 65: return "sys_trace_drain"; - case 66: return "sys_trace_attach_process"; - case 67: return "sys_trace_allocate_buffer"; - case 68: return "sys_trace_free_buffer"; - case 69: return "sys_trace_create2"; - case 70: return "sys_timer_create"; - case 71: return "sys_timer_destroy"; - case 72: return "sys_timer_get_information"; - case 73: return "_sys_timer_start"; - case 74: return "sys_timer_stop"; - case 75: return "sys_timer_connect_event_queue"; - case 76: return "sys_timer_disconnect_event_queue"; - case 77: return "sys_trace_create2_in_cbepm"; - case 80: return "sys_interrupt_tag_create"; - case 81: return "sys_interrupt_tag_destroy"; - case 82: return "sys_event_flag_create"; - case 83: return "sys_event_flag_destroy"; - case 84: return "_sys_interrupt_thread_establish"; - case 85: return "sys_event_flag_wait"; - case 86: return "sys_event_flag_trywait"; - case 87: return "sys_event_flag_set"; - case 88: return "sys_interrupt_thread_eoi"; - case 89: return "_sys_interrupt_thread_disestablish"; - case 90: return "sys_semaphore_create"; - case 91: return "sys_semaphore_destroy"; - case 92: return "sys_semaphore_wait"; - case 93: return "sys_semaphore_trywait"; - case 94: return "sys_semaphore_post"; - case 95: return "_sys_lwmutex_create"; - case 96: return "_sys_lwmutex_destroy"; - case 97: return "_sys_lwmutex_lock"; - case 98: return "_sys_lwmutex_unlock"; - case 99: return "_sys_lwmutex_trylock"; - case 100: return "sys_mutex_create"; - case 101: return "sys_mutex_destroy"; - case 102: return "sys_mutex_lock"; - case 103: return "sys_mutex_trylock"; - case 104: return "sys_mutex_unlock"; - case 105: return "sys_cond_create"; - case 106: return "sys_cond_destroy"; - case 107: return "sys_cond_wait"; - case 108: return "sys_cond_signal"; - case 109: return "sys_cond_signal_all"; - case 110: return "sys_cond_signal_to"; - case 111: return "_sys_lwcond_create"; - case 112: return "_sys_lwcond_destroy"; - case 113: return "_sys_lwcond_queue_wait"; - case 114: return "sys_semaphore_get_value"; - case 115: return "_sys_lwcond_signal"; - case 116: return "_sys_lwcond_signal_all"; - case 118: return "sys_event_flag_clear"; - case 120: return "sys_rwlock_create"; - case 121: return "sys_rwlock_destroy"; - case 122: return "sys_rwlock_rlock"; - case 123: return "sys_rwlock_tryrlock"; - case 124: return "sys_rwlock_runlock"; - case 125: return "sys_rwlock_wlock"; - case 126: return "sys_rwlock_trywlock"; - case 127: return "sys_rwlock_wunlock"; - case 128: return "sys_event_queue_create"; - case 129: return "sys_event_queue_destroy"; - case 130: return "sys_event_queue_receive"; - case 131: return "sys_event_queue_tryreceive"; - case 132: return "sys_event_flag_cancel"; - case 133: return "sys_event_queue_drain"; - case 134: return "sys_event_port_create"; - case 135: return "sys_event_port_destroy"; - case 136: return "sys_event_port_connect_local"; - case 137: return "sys_event_port_disconnect"; - case 138: return "sys_event_port_send"; - case 139: return "sys_event_flag_get"; - case 140: return "sys_event_port_connect_ipc"; - case 141: return "sys_timer_usleep"; - case 142: return "sys_timer_sleep"; - case 143: return "sys_time_set_timezone"; - case 144: return "sys_time_get_timezone"; - case 145: return "sys_time_get_current_time"; - case 146: return "sys_time_get_system_time"; - case 147: return "sys_time_get_timebase_frequency"; - case 148: return "_sys_rwlock_trywlock"; - case 150: return "sys_raw_spu_create_interrupt_tag"; - case 151: return "sys_raw_spu_set_int_mask"; - case 152: return "sys_raw_spu_get_int_mask"; - case 153: return "sys_raw_spu_set_int_stat"; - case 154: return "sys_raw_spu_get_int_stat"; - case 155: return "sys_spu_image_get_information?"; - case 156: return "sys_spu_image_open"; - case 157: return "sys_spu_image_import"; - case 158: return "sys_spu_image_close"; - case 159: return "sys_raw_spu_load"; - case 160: return "sys_raw_spu_create"; - case 161: return "sys_raw_spu_destroy"; - case 163: return "sys_raw_spu_read_puint_mb"; - case 165: return "sys_spu_thread_get_exit_status"; - case 166: return "sys_spu_thread_set_argument"; - case 167: return "sys_spu_thread_group_start_on_exit"; - case 169: return "sys_spu_initialize"; - case 170: return "sys_spu_thread_group_create"; - case 171: return "sys_spu_thread_group_destroy"; - case 172: return "sys_spu_thread_initialize"; - case 173: return "sys_spu_thread_group_start"; - case 174: return "sys_spu_thread_group_suspend"; - case 175: return "sys_spu_thread_group_resume"; - case 176: return "sys_spu_thread_group_yield"; - case 177: return "sys_spu_thread_group_terminate"; - case 178: return "sys_spu_thread_group_join"; - case 179: return "sys_spu_thread_group_set_priority"; - case 180: return "sys_spu_thread_group_get_priority"; - case 181: return "sys_spu_thread_write_ls"; - case 182: return "sys_spu_thread_read_ls"; - case 184: return "sys_spu_thread_write_snr"; - case 185: return "sys_spu_thread_group_connect_event"; - case 186: return "sys_spu_thread_group_disconnect_event"; - case 187: return "sys_spu_thread_set_spu_cfg"; - case 188: return "sys_spu_thread_get_spu_cfg"; - case 190: return "sys_spu_thread_write_spu_mb"; - case 191: return "sys_spu_thread_connect_event"; - case 192: return "sys_spu_thread_disconnect_event"; - case 193: return "sys_spu_thread_bind_queue"; - case 194: return "sys_spu_thread_unbind_queue"; - case 196: return "sys_raw_spu_set_spu_cfg"; - case 197: return "sys_raw_spu_get_spu_cfg"; - case 198: return "sys_spu_thread_recover_page_fault"; - case 199: return "sys_raw_spu_recover_page_fault"; - case 215: return "sys_dbg_mat_set_condition"; - case 216: return "sys_dbg_mat_get_condition"; - case 230: return "sys_isolated_spu_create"; - case 231: return "sys_isolated_spu_destroy"; - case 232: return "sys_isolated_spu_start"; - case 233: return "sys_isolated_spu_create_interrupt_tag"; - case 234: return "sys_isolated_spu_set_int_mask"; - case 235: return "sys_isolated_spu_get_int_mask"; - case 236: return "sys_isolated_spu_set_int_stat"; - case 237: return "sys_isolated_spu_get_int_stat"; - case 238: return "sys_isolated_spu_set_spu_cfg"; - case 239: return "sys_isolated_spu_get_spu_cfg"; - case 240: return "sys_isolated_spu_read_puint_mb"; - case 244: return "sys_spu_thread_group_system_set_next_group"; - case 245: return "sys_spu_thread_group_system_unset_next_group"; - case 246: return "sys_spu_thread_group_system_set_switch_group"; - case 247: return "sys_spu_thread_group_system_unset_switch_group"; - case 250: return "sys_spu_thread_group_set_cooperative_victims"; - case 251: return "sys_spu_thread_group_connect_event_all_threads"; - case 252: return "sys_spu_thread_group_disconnect_event_all_threads"; - case 254: return "sys_spu_thread_group_log"; - case 260: return "sys_spu_image_open_by_fd"; - case 300: return "sys_vm_memory_map"; - case 301: return "sys_vm_unmap"; - case 302: return "sys_vm_append_memory"; - case 303: return "sys_vm_return_memory"; - case 304: return "sys_vm_lock"; - case 305: return "sys_vm_unlock"; - case 306: return "sys_vm_touch"; - case 307: return "sys_vm_flush"; - case 308: return "sys_vm_invalidate"; - case 309: return "sys_vm_store"; - case 310: return "sys_vm_sync"; - case 311: return "sys_vm_test"; - case 312: return "sys_vm_get_statistics"; - case 324: return "sys_memory_container_create"; - case 325: return "sys_memory_container_destroy"; - case 326: return "sys_mmapper_allocate_fixed_address"; - case 327: return "sys_mmapper_enable_page_fault_notification"; - case 329: return "sys_mmapper_free_shared_memory"; - case 330: return "sys_mmapper_allocate_address"; - case 331: return "sys_mmapper_free_address"; - case 332: return "sys_mmapper_allocate_shared_memory"; - case 333: return "sys_mmapper_set_shared_memory_flag"; - case 334: return "sys_mmapper_map_shared_memory"; - case 335: return "sys_mmapper_unmap_shared_memory"; - case 336: return "sys_mmapper_change_address_access_right"; - case 337: return "sys_mmapper_search_and_map"; - case 338: return "sys_mmapper_get_shared_memory_attribute"; - case 341: return "sys_memory_container_create"; - case 342: return "sys_memory_container_destroy"; - case 343: return "sys_memory_container_get_size"; - case 344: return "sys_memory_budget_set"; - case 348: return "sys_memory_allocate"; - case 349: return "sys_memory_free"; - case 350: return "sys_memory_allocate_from_container"; - case 351: return "sys_memory_get_page_attribute"; - case 352: return "sys_memory_get_user_memory_size"; - case 353: return "sys_memory_get_user_memory_stat"; - case 356: return "sys_memory_allocate_colored"; - case 361: return "sys_memory_allocate_from_container_colored"; - case 362: return "sys_mmapper_allocate_memory_from_container"; - case 367: return "sys_uart_initialize"; - case 368: return "sys_uart_receive"; - case 369: return "sys_uart_send"; - case 370: return "sys_uart_get_params"; - case 372: return "sys_game_watchdog_start"; - case 373: return "sys_game_watchdog_stop"; - case 374: return "sys_game_watchdog_clear"; - case 375: return "sys_game_set_system_sw_version"; - case 376: return "sys_game_get_system_sw_version"; - case 377: return "sys_sm_set_shop_mode"; - case 378: return "sys_sm_get_ext_event2"; - case 379: return "sys_sm_shutdown"; - case 380: return "sys_sm_get_params"; - case 381: return "sys_sm_get_inter_lpar_parameter"; - case 383: return "sys_game_get_temperature"; - case 384: return "sys_sm_get_tzpb"; - case 385: return "sys_sm_request_led"; - case 386: return "sys_sm_control_led"; - case 387: return "sys_sm_get_platform_info"; - case 388: return "sys_sm_ring_buzzer"; - case 389: return "sys_sm_set_fan_policy"; - case 390: return "sys_sm_request_error_log"; - case 391: return "sys_sm_request_be_count"; - case 392: return "sys_sm_ring_buzzer"; - case 393: return "sys_sm_get_hw_config"; - case 394: return "sys_sm_request_scversion"; - case 395: return "sys_sm_request_system_event_log"; - case 396: return "sys_sm_set_rtc_alarm"; - case 397: return "sys_sm_get_rtc_alarm"; - case 398: return "sys_console_write"; - case 402: return "sys_tty_read"; - case 403: return "sys_tty_write"; - case 408: return "sys_sm_get_tzpb"; - case 409: return "sys_sm_get_fan_policy"; - case 410: return "sys_game_board_storage_read"; - case 411: return "sys_game_board_storage_write"; - case 412: return "sys_game_get_rtc_status"; - case 450: return "sys_overlay_load_module"; - case 451: return "sys_overlay_unload_module"; - case 452: return "sys_overlay_get_module_list"; - case 453: return "sys_overlay_get_module_info"; - case 454: return "sys_overlay_load_module_by_fd"; - case 455: return "sys_overlay_get_module_info2"; - case 456: return "sys_overlay_get_sdk_version"; - case 457: return "sys_overlay_get_module_dbg_info"; - case 458: return "sys_overlay_get_module_dbg_info"; - case 460: return "sys_prx_dbg_get_module_id_list"; - case 461: return "sys_prx_get_module_id_by_address"; - case 463: return "sys_prx_load_module_by_fd"; - case 464: return "sys_prx_load_module_on_memcontainer_by_fd"; - case 465: return "sys_prx_load_module_list"; - case 466: return "sys_prx_load_module_list_on_memcontainer"; - case 467: return "sys_prx_get_ppu_guid"; - case 480: return "sys_prx_load_module"; - case 481: return "sys_prx_start_module"; - case 482: return "sys_prx_stop_module"; - case 483: return "sys_prx_unload_module"; - case 484: return "sys_prx_register_module"; - case 485: return "sys_prx_query_module"; - case 486: return "sys_prx_register_library"; - case 487: return "sys_prx_unregister_library"; - case 488: return "sys_prx_link_library"; - case 489: return "sys_prx_unlink_library"; - case 490: return "sys_prx_query_library"; - case 493: return "sys_prx_dbg_get_module_info"; - case 494: return "sys_prx_get_module_list"; - case 495: return "sys_prx_get_module_info"; - case 496: return "sys_prx_get_module_id_by_name"; - case 497: return "sys_prx_load_module_on_memcontainer"; - case 498: return "sys_prx_start"; - case 499: return "sys_prx_stop"; - case 500: return "sys_hid_manager_open"; - case 501: return "sys_hid_manager_close"; - case 502: return "sys_hid_manager_read"; - case 503: return "sys_hid_manager_ioctl"; - case 504: return "sys_hid_manager_map_logical_id_to_port_id"; - case 505: return "sys_hid_manager_unmap_logical_id_to_port_id"; - case 506: return "sys_hid_manager_add_hot_key_observer"; - case 507: return "sys_hid_manager_remove_hot_key_observer"; - case 508: return "sys_hid_manager_grab_focus"; - case 509: return "sys_hid_manager_release_focus"; - case 516: return "sys_config_open"; - case 517: return "sys_config_close"; - case 518: return "sys_config_get_service_event"; - case 519: return "sys_config_add_service_listener"; - case 520: return "sys_config_remove_service_listener"; - case 521: return "sys_config_register_service"; - case 522: return "sys_config_unregister_service"; - case 523: return "sys_config_io_event"; - case 530: return "sys_usbd_initialize"; - case 531: return "sys_usbd_finalize"; - case 532: return "sys_usbd_get_device_list"; - case 533: return "sys_usbd_get_descriptor_size"; - case 534: return "sys_usbd_get_descriptor"; - case 535: return "sys_usbd_register_ldd"; - case 536: return "sys_usbd_unregister_ldd"; - case 537: return "sys_usbd_open_pipe"; - case 538: return "sys_usbd_open_default_pipe"; - case 539: return "sys_usbd_close_pipe"; - case 540: return "sys_usbd_receive_event"; - case 541: return "sys_usbd_detect_event"; - case 542: return "sys_usbd_attach"; - case 543: return "sys_usbd_transfer_data"; - case 544: return "sys_usbd_isochronous_transfer_data"; - case 545: return "sys_usbd_get_transfer_status"; - case 546: return "sys_usbd_get_isochronous_transfer_status"; - case 547: return "sys_usbd_get_device_location"; - case 548: return "sys_usbd_send_event"; - case 550: return "sys_usbd_allocate_memory"; - case 551: return "sys_usbd_free_memory"; - case 556: return "sys_usbd_get_device_speed"; - case 559: return "sys_usbd_register_extra_ldd"; - case 571: return "sys_pad_ldd_unregister_controller"; - case 572: return "sys_pad_ldd_data_insert"; - case 573: return "sys_pad_dbg_ldd_set_data_insert_mode"; - case 574: return "sys_pad_ldd_register_controller"; - case 575: return "sys_pad_ldd_get_port_no"; - case 577: return "sys_pad_manager_..."; - case 600: return "sys_storage_open"; - case 601: return "sys_storage_close"; - case 602: return "sys_storage_read"; - case 603: return "sys_storage_write"; - case 604: return "sys_storage_send_device_command"; - case 605: return "sys_storage_async_configure"; - case 606: return "sys_storage_async_read"; - case 607: return "sys_storage_async_write"; - case 608: return "sys_storage_async_cancel"; - case 609: return "sys_storage_get_device_info"; - case 610: return "sys_storage_get_device_config"; - case 611: return "sys_storage_report_devices"; - case 612: return "sys_storage_configure_medium_event"; - case 613: return "sys_storage_set_medium_polling_interval"; - case 614: return "sys_storage_create_region"; - case 615: return "sys_storage_delete_region"; - case 616: return "sys_storage_execute_device_command"; - case 617: return "sys_storage_check_region_acl"; - case 618: return "sys_storage_set_region_acl"; - case 619: return "sys_storage_async_send_device_command"; - case 621: return "sys_gamepad_ycon_if"; - case 622: return "sys_storage_get_region_offset"; - case 623: return "sys_storage_set_emulated_speed"; - case 624: return "sys_io_buffer_create"; - case 625: return "sys_io_buffer_destroy"; - case 626: return "sys_io_buffer_allocate"; - case 627: return "sys_io_buffer_free"; - case 630: return "sys_gpio_set"; - case 631: return "sys_gpio_get"; - case 633: return "sys_fsw_connect_event"; - case 634: return "sys_fsw_disconnect_event"; - case 635: return "sys_btsetting_if"; - case 650: return "sys_rsxaudio_initialize"; - case 651: return "sys_rsxaudio_finalize"; - case 652: return "sys_rsxaudio_import_shared_memory"; - case 653: return "sys_rsxaudio_unimport_shared_memory"; - case 654: return "sys_rsxaudio_create_connection"; - case 655: return "sys_rsxaudio_close_connection"; - case 656: return "sys_rsxaudio_prepare_process"; - case 657: return "sys_rsxaudio_start_process"; - case 666: return "sys_rsx_device_open"; - case 667: return "sys_rsx_device_close"; - case 668: return "sys_rsx_memory_allocate"; - case 669: return "sys_rsx_memory_free"; - case 670: return "sys_rsx_context_allocate"; - case 671: return "sys_rsx_context_free"; - case 672: return "sys_rsx_context_iomap"; - case 673: return "sys_rsx_context_iounmap"; - case 674: return "sys_rsx_context_attribute"; - case 675: return "sys_rsx_device_map"; - case 676: return "sys_rsx_device_unmap"; - case 677: return "sys_rsx_attribute"; - case 699: return "sys_bdemu_send_command"; - case 700: return "sys_net_bnet_accept"; - case 701: return "sys_net_bnet_bind"; - case 702: return "sys_net_bnet_connect"; - case 703: return "sys_net_bnet_getpeername"; - case 704: return "sys_net_bnet_getsockname"; - case 705: return "sys_net_bnet_getsockopt"; - case 706: return "sys_net_bnet_listen"; - case 707: return "sys_net_bnet_recvfrom"; - case 708: return "sys_net_bnet_recvmsg"; - case 709: return "sys_net_bnet_sendmsg"; - case 710: return "sys_net_bnet_sendto"; - case 711: return "sys_net_bnet_setsockop"; - case 712: return "sys_net_bnet_shutdown"; - case 713: return "sys_net_bnet_socket"; - case 714: return "sys_net_bnet_close"; - case 715: return "sys_net_bnet_poll"; - case 716: return "sys_net_bnet_select"; - case 717: return "sys_net_open_dump"; - case 718: return "sys_net_read_dump"; - case 719: return "sys_net_close_dump"; - case 720: return "sys_net_write_dump"; - case 721: return "sys_net_abort"; - case 722: return "sys_net_infoctl"; - case 723: return "sys_net_control"; - case 724: return "sys_net_bnet_ioctl"; - case 725: return "sys_net_bnet_sysctl"; - case 726: return "sys_net_eurus_post_command"; - case 800: return "sys_fs_test"; - case 801: return "sys_fs_open"; - case 802: return "sys_fs_read"; - case 803: return "sys_fs_write"; - case 804: return "sys_fs_close"; - case 805: return "sys_fs_opendir"; - case 806: return "sys_fs_readdir"; - case 807: return "sys_fs_closedir"; - case 808: return "sys_fs_stat"; - case 809: return "sys_fs_fstat"; - case 810: return "sys_fs_link"; - case 811: return "sys_fs_mkdir"; - case 812: return "sys_fs_rename"; - case 813: return "sys_fs_rmdir"; - case 814: return "sys_fs_unlink"; - case 815: return "sys_fs_utime"; - case 816: return "sys_fs_access"; - case 817: return "sys_fs_fcntl"; - case 818: return "sys_fs_lseek"; - case 819: return "sys_fs_fdatasync"; - case 820: return "sys_fs_fsync"; - case 821: return "sys_fs_fget_block_size"; - case 822: return "sys_fs_get_block_size"; - case 823: return "sys_fs_acl_read"; - case 824: return "sys_fs_acl_write"; - case 825: return "sys_fs_lsn_get_cda_size"; - case 826: return "sys_fs_lsn_get_cda"; - case 827: return "sys_fs_lsn_lock"; - case 828: return "sys_fs_lsn_unlock"; - case 829: return "sys_fs_lsn_read"; - case 830: return "sys_fs_lsn_write"; - case 831: return "sys_fs_truncate"; - case 832: return "sys_fs_ftruncate"; - case 833: return "sys_fs_symbolic_link"; - case 834: return "sys_fs_chmod"; - case 835: return "sys_fs_chown"; - case 836: return "sys_fs_newfs"; - case 837: return "sys_fs_mount"; - case 838: return "sys_fs_unmount"; - case 839: return "sys_fs_sync"; - case 840: return "sys_fs_disk_free"; - case 841: return "sys_fs_get_mount_info_size"; - case 842: return "sys_fs_get_mount_info"; - case 843: return "sys_fs_get_fs_info_size"; - case 844: return "sys_fs_get_fs_info"; - case 845: return "sys_fs_mapped_allocate"; - case 846: return "sys_fs_mapped_free"; - case 847: return "sys_fs_truncate2"; - case 860: return "sys_ss_get_cache_of_analog_sunset_flag"; - case 865: return "sys_ss_random_number_generator"; - case 870: return "sys_ss_get_console_id"; - case 871: return "sys_ss_access_control_engine"; - case 872: return "sys_ss_get_open_psid"; - case 873: return "sys_ss_get_cache_of_product_mode"; - case 874: return "sys_ss_get_cache_of_flash_ext_flag"; - case 875: return "sys_ss_get_boot_device"; - case 876: return "sys_ss_disc_access_control"; - case 877: return "sys_ss_~utoken_if"; - case 878: return "sys_ss_ad_sign"; - case 879: return "sys_ss_media_id"; - case 880: return "sys_deci3_open"; - case 881: return "sys_deci3_create_event_path"; - case 882: return "sys_deci3_close"; - case 883: return "sys_deci3_send"; - case 884: return "sys_deci3_receive"; - case 885: return "sys_deci3_open2"; - case 890: return "sys_deci3_initialize"; - case 891: return "sys_deci3_terminate"; - case 892: return "sys_deci3_debug_mode"; - case 893: return "sys_deci3_show_status"; - case 894: return "sys_deci3_echo_test"; - case 895: return "sys_deci3_send_dcmp_packet"; - case 896: return "sys_deci3_dump_cp_register"; - case 897: return "sys_deci3_dump_cp_buffer"; - case 899: return "sys_deci3_test"; - case 900: return "sys_dbg_stop_processes"; - case 901: return "sys_dbg_continue_processes"; - case 902: return "sys_dbg_stop_threads"; - case 903: return "sys_dbg_continue_threads"; - case 904: return "sys_dbg_read_process_memory"; - case 905: return "sys_dbg_write_process_memory"; - case 906: return "sys_dbg_read_thread_register"; - case 907: return "sys_dbg_write_thread_register"; - case 908: return "sys_dbg_get_process_list"; - case 909: return "sys_dbg_get_thread_list"; - case 910: return "sys_dbg_get_thread_info"; - case 911: return "sys_dbg_spu_thread_read_from_ls"; - case 912: return "sys_dbg_spu_thread_write_to_ls"; - case 913: return "sys_dbg_kill_process"; - case 914: return "sys_dbg_get_process_info"; - case 915: return "sys_dbg_set_run_control_bit_to_spu"; - case 916: return "sys_dbg_spu_thread_get_exception_cause"; - case 917: return "sys_dbg_create_kernel_event_queue"; - case 918: return "sys_dbg_read_kernel_event_queue"; - case 919: return "sys_dbg_destroy_kernel_event_queue"; - case 920: return "sys_dbg_get_process_event_ctrl_flag"; - case 921: return "sys_dbg_set_process_event_cntl_flag"; - case 922: return "sys_dbg_get_spu_thread_group_event_cntl_flag"; - case 923: return "sys_dbg_set_spu_thread_group_event_cntl_flag"; - case 925: return "sys_dbg_get_raw_spu_list"; - case 932: return "sys_dbg_get_mutex_list"; - case 933: return "sys_dbg_get_mutex_information"; - case 934: return "sys_dbg_get_cond_list"; - case 935: return "sys_dbg_get_cond_information"; - case 936: return "sys_dbg_get_rwlock_list"; - case 937: return "sys_dbg_get_rwlock_information"; - case 938: return "sys_dbg_get_lwmutex_list"; - case 939: return "sys_dbg_get_address_from_dabr"; - case 940: return "sys_dbg_set_address_to_dabr"; - case 941: return "sys_dbg_get_lwmutex_information"; - case 942: return "sys_dbg_get_event_queue_list"; - case 943: return "sys_dbg_get_event_queue_information"; - case 944: return "sys_dbg_initialize_ppu_exception_handler"; - case 945: return "sys_dbg_finalize_ppu_exception_handler"; - case 946: return "sys_dbg_get_semaphore_list"; - case 947: return "sys_dbg_get_semaphore_information"; - case 948: return "sys_dbg_get_kernel_thread_list"; - case 949: return "sys_dbg_get_kernel_thread_info"; - case 950: return "sys_dbg_get_lwcond_list"; - case 951: return "sys_dbg_get_lwcond_information"; - case 952: return "sys_dbg_create_scratch_data_area_ext"; - case 953: return "sys_dbg_vm_get_page_information"; - case 954: return "sys_dbg_vm_get_info"; - case 955: return "sys_dbg_enable_floating_point_enabled_exception"; - case 956: return "sys_dbg_disable_floating_point_enabled_exception"; - case 960: return "sys_dbg_perfomance_monitor"; - case 970: return "sys_dbg_get_event_flag_list"; - case 971: return "sys_dbg_get_event_flag_information"; - case 975: return "sys_dbg_read_spu_thread_context2"; - case 985: return "sys_dbg_get_console_type"; - } - - // check HLE functions - switch (fid) - { - case 0x1529e506: return "cellAdecDecodeAu"; - case 0x487b613e: return "cellAdecStartSeq"; - case 0x7e4a4a49: return "cellAdecQueryAttr"; - case 0x847d2380: return "cellAdecClose"; - case 0x8b5551a4: return "cellAdecOpenEx"; - case 0x97ff2af1: return "cellAdecGetPcm"; - case 0xbd75f78b: return "cellAdecGetPcmItem"; - case 0xd00a6988: return "cellAdecOpen"; - case 0xe2ea549b: return "cellAdecEndSeq"; - case 0x006016da: return "cellAtracGetBitrate"; - case 0x06ddb53e: return "cellAtracSetSecondBuffer"; - case 0x0f9667b6: return "cellAtracGetChannel"; - case 0x2642d4cc: return "cellAtracCreateDecoderExt"; - case 0x2bfff084: return "cellAtracGetStreamDataInfo"; - case 0x46cfc013: return "cellAtracAddStreamData"; - case 0x4797d1ff: return "cellAtracGetNextSample"; - case 0x5f62d546: return "cellAtracGetMaxSample"; - case 0x66afc68e: return "cellAtracSetDataAndGetMemSize"; - case 0x761cb9be: return "cellAtracDeleteDecoder"; - case 0x7772eb2b: return "cellAtracResetPlayPosition"; - case 0x78ba5c41: return "cellAtracSetLoopNum"; - case 0x7b22e672: return "cellAtracGetNextDecodePosition"; - case 0x8eb0e65f: return "cellAtracDecode"; - case 0x99efe171: return "cellAtracIsSecondBufferNeeded"; - case 0x99fb73d1: return "cellAtracGetBufferInfoForResetting"; - case 0xab6b6dbf: return "cellAtracGetLoopInfo"; - case 0xb5c11938: return "cellAtracGetInternalErrorInfo"; - case 0xbe07f05e: return "cellAtracGetSecondBufferInfo"; - case 0xc9a95fcb: return "cellAtracGetVacantSize"; - case 0xcf01d5d4: return "cellAtracGetSoundInfo"; - case 0xdfab73aa: return "cellAtracGetRemainFrame"; - case 0xfa293e88: return "cellAtracCreateDecoder"; - case 0x04af134e: return "cellAudioCreateNotifyEventQueue"; - case 0x0b168f92: return "cellAudioInit"; - case 0x17d1213b: return "cellAudioSendAck"; - case 0x28bc1409: return "cellAudioUnsetPersonalDevice"; - case 0x2b9bd9ad: return "cellAudioRemoveNotifyEventQueueEx"; - case 0x31211f6b: return "cellAudioMiscSetAccessoryVolume"; - case 0x377e0cd9: return "cellAudioSetNotifyEventQueue"; - case 0x4109d08c: return "cellAudioGetPortTimestamp"; - case 0x4129fe2d: return "cellAudioPortClose"; - case 0x5676f81c: return "cellAudioSetPersonalDevice"; - case 0x56dfe179: return "cellAudioSetPortLevel"; - case 0x5b1e2c73: return "cellAudioPortStop"; - case 0x74a66af0: return "cellAudioGetPortConfig"; - case 0x832df17e: return "cellAudioAdd6chData"; - case 0x89be28f2: return "cellAudioPortStart"; - case 0x9e4b1db8: return "cellAudioAdd2chData"; - case 0xa4c9ba65: return "cellAudioCreateNotifyEventQueueEx"; - case 0xb56ef5a1: return "cellAudioSetNotifyEventQueueEx"; - case 0xca5ac370: return "cellAudioQuit"; - case 0xcd7bc431: return "cellAudioPortOpen"; - case 0xdab029aa: return "cellAudioAddData"; - case 0xe4046afe: return "cellAudioGetPortBlockTag"; - case 0xff3626fd: return "cellAudioRemoveNotifyEventQueue"; - case 0x2ab0d183: return "cellBGDLGetInfo2"; - case 0x4e9bb95b: return "cellBGDLGetInfo"; - case 0x74e57bdf: return "cellBGDLGetMode"; - case 0x7e134a90: return "cellBGDLSetMode"; - case 0x02f5ced0: return "cellCameraStop"; - case 0x0e63c444: return "cellCameraGetBufferInfoEx"; - case 0x10697d7f: return "cellCameraGetBufferInfo"; - case 0x21fc151f: return "cellCameraReadEx"; - case 0x2dea3e9b: return "cellCameraSetExtensionUnit"; - case 0x379c5dd6: return "cellCameraClose"; - case 0x3845d39b: return "cellCameraRead"; - case 0x44673f07: return "cellCameraRemoveNotifyEventQueue2"; - case 0x456dc4aa: return "cellCameraStart"; - case 0x532b8aaa: return "cellCameraGetAttribute"; - case 0x58bc5870: return "cellCameraGetType"; - case 0x5ad46570: return "cellCameraEnd"; - case 0x5d25f866: return "cellCameraOpenEx"; - case 0x5eebf24e: return "cellCameraIsStarted"; - case 0x602e2052: return "cellCameraGetDeviceGUID"; - case 0x61dfbe83: return "cellCameraPrepExtensionUnit"; - case 0x7dac520c: return "cellCameraGetBufferSize"; - case 0x7e063bbc: return "cellCameraIsAttached"; - case 0x81f83db9: return "cellCameraReset"; - case 0x85e1b8da: return "cellCameraOpen"; - case 0x8ca53dde: return "cellCameraIsAvailable"; - case 0x8cd56eee: return "cellCameraSetAttribute"; - case 0x9b98d258: return "cellCameraRemoveNotifyEventQueue"; - case 0xa7fd2f5b: return "cellCameraSetNotifyEventQueue2"; - case 0xb0647e5a: return "cellCameraSetNotifyEventQueue"; - case 0xb602e328: return "cellCameraGetExtensionUnit"; - case 0xbf47c5dd: return "cellCameraInit"; - case 0xe28b206b: return "cellCameraReadComplete"; - case 0xeb6f95fb: return "cellCameraCtrlExtensionUnit"; - case 0xfa160f24: return "cellCameraIsOpen"; - case 0x0f6ab57b: return "cellCelp8EncStart"; - case 0x2099f86e: return "cellCelp8EncEncodeFrame"; - case 0x29da1ea6: return "cellCelp8EncWaitForOutput"; - case 0x2d677e0c: return "cellCelp8EncQueryAttr"; - case 0x2eb6efee: return "cellCelp8EncOpen"; - case 0x48c5020d: return "cellCelp8EncGetAu"; - case 0xbbbc2c1c: return "cellCelp8EncEnd"; - case 0xcd48ad62: return "cellCelp8EncOpenEx"; - case 0xfd2566b4: return "cellCelp8EncClose"; - case 0x15ec0cca: return "cellCelpEncClose"; - case 0x3773692f: return "cellCelpEncGetAu"; - case 0x55dc23de: return "cellCelpEncStart"; - case 0x6b148570: return "cellCelpEncQueryAttr"; - case 0x77b3b29a: return "cellCelpEncOpen"; - case 0x81fe030c: return "cellCelpEncEncodeFrame"; - case 0x9b244272: return "cellCelpEncWaitForOutput"; - case 0x9eb084db: return "cellCelpEncOpenEx"; - case 0xf2b85dff: return "cellCelpEncEnd"; - case 0x002e8da2: return "cellDmuxPeekAuEx"; - case 0x02170d1a: return "cellDmuxQueryEsAttr"; - case 0x04e7499f: return "cellDmuxSetStream"; - case 0x05371c8d: return "cellDmuxDisableEs"; - case 0x11bc3a6c: return "cellDmuxOpen2"; - case 0x21d424f0: return "cellDmuxResetEs"; - case 0x24ea6474: return "cellDmuxReleaseAu"; - case 0x2750c5e0: return "cellDmuxPeekAu"; - case 0x2c9a5857: return "cellDmuxGetAuEx"; - case 0x3f76e3cd: return "cellDmuxQueryAttr2"; - case 0x42c716b5: return "cellDmuxGetAu"; - case 0x52911bcf: return "cellDmuxQueryEsAttr2"; - case 0x5d345de9: return "cellDmuxResetStream"; - case 0x68492de9: return "cellDmuxOpen"; - case 0x7b56dc3f: return "cellDmuxEnableEs"; - case 0x8c692521: return "cellDmuxClose"; - case 0xa2d4189b: return "cellDmuxQueryAttr"; - case 0xccff1284: return "cellDmuxResetStreamAndWaitDone"; - case 0xebb3b2bd: return "cellDmuxFlushEs"; - case 0xf6c23560: return "cellDmuxOpenEx"; - case 0x01036193: return "cellFiberPpuContextReturnToThread"; - case 0x081c98be: return "cellFiberPpuContextRunScheduler"; - case 0x0a25b6c8: return "cellFiberPpuContextEnterScheduler"; - case 0x0c44f441: return "cellFiberPpuYield"; - case 0x12b1acf0: return "cellFiberPpuRunFibers"; - case 0x1e7a247a: return "cellFiberPpuUtilWorkerControlRunFibers"; - case 0x31252ec3: return "_cellFiberPpuContextAttributeInitialize"; - case 0x3204b146: return "cellFiberPpuUtilWorkerControlInitialize"; - case 0x34a81091: return "cellFiberPpuContextSelf"; - case 0x3860a12a: return "cellFiberPpuSchedulerTraceFinalize"; - case 0x392c5aa5: return "cellFiberPpuUtilWorkerControlSetPollingMode"; - case 0x3b417f82: return "cellFiberPpuUtilWorkerControlJoinFiber"; - case 0x4fc86b2c: return "cellFiberPpuUtilWorkerControlDisconnectEventQueue"; - case 0x55870804: return "_cellFiberPpuInitialize"; - case 0x5d3992dd: return "cellFiberPpuUtilWorkerControlSendSignal"; - case 0x5d9a7034: return "cellFiberPpuSelf"; - case 0x62a20f0d: return "cellFiberPpuUtilWorkerControlConnectEventQueueToSpurs"; - case 0x68ba4568: return "_cellFiberPpuUtilWorkerControlAttributeInitialize"; - case 0x6c164b3b: return "cellFiberPpuWaitSignal"; - case 0x72086315: return "cellFiberPpuContextInitialize"; - case 0x7c2f4034: return "cellFiberPpuCreateFiber"; - case 0x8afb8356: return "cellFiberPpuSendSignal"; - case 0x8b6baa01: return "cellFiberPpuFinalizeScheduler"; - case 0x9e25c72d: return "_cellFiberPpuSchedulerAttributeInitialize"; - case 0xa27c95ca: return "cellFiberPpuUtilWorkerControlFinalize"; - case 0xa4599cf3: return "cellFiberPpuWaitFlag"; - case 0xa6004249: return "cellFiberPpuJoinFiber"; - case 0xaba1c563: return "cellFiberPpuContextRun"; - case 0xadedbebf: return "cellFiberPpuSchedulerTraceStart"; - case 0xb0594b2d: return "cellFiberPpuGetScheduler"; - case 0xb3a48079: return "cellFiberPpuContextFinalize"; - case 0xb90c871b: return "cellFiberPpuContextCheckStackLimit"; - case 0xbabf714b: return "cellFiberPpuUtilWorkerControlWakeup"; - case 0xbf9cd933: return "cellFiberPpuSchedulerTraceInitialize"; - case 0xbfca88d3: return "cellFiberPpuUtilWorkerControlCreateFiber"; - case 0xc04e2438: return "cellFiberPpuUtilWorkerControlShutdown"; - case 0xc11f8056: return "_cellFiberPpuAttributeInitialize"; - case 0xd0066b17: return "cellFiberPpuContextSwitch"; - case 0xe492a675: return "cellFiberPpuHasRunnableFiber"; - case 0xe665f9a9: return "cellFiberPpuSchedulerTraceStop"; - case 0xea6dc1ad: return "cellFiberPpuUtilWorkerControlCheckFlags"; - case 0xee3b604d: return "cellFiberPpuInitializeScheduler"; - case 0xf2ccad4f: return "cellFiberPpuUtilWorkerControlInitializeWithAttribute"; - case 0xf3e81219: return "cellFiberPpuCheckStackLimit"; - case 0xf6c6900c: return "cellFiberPpuCheckFlags"; - case 0xfa8d5f95: return "cellFiberPpuExit"; - case 0xfbf5fe40: return "cellFiberPpuSetPriority"; - case 0x0109f3d3: return "cellFontGetRenderEffectWeight"; - case 0x03a142b9: return "cellFontGraphicsGetDrawType"; - case 0x042e74e3: return "cellFontCreateRenderer"; - case 0x061049ad: return "cellFontGraphicsSetFontRGBA"; - case 0x06be743d: return "cellFontGetKerning"; - case 0x073fa321: return "cellFontOpenFontsetOnMemory"; - case 0x0a7306a4: return "cellFontOpenFontFile"; - case 0x0baf90fe: return "cellFontGetRenderScaledKerning"; - case 0x0d106a11: return "cellFontGetRenderScalePixel"; - case 0x1387c45c: return "cellFontGetHorizontalLayout"; - case 0x16322df1: return "cellFontGraphicsSetScalePixel"; - case 0x1a218fe4: return "cellFontRenderCharGlyphImageHorizontal"; - case 0x21ebb248: return "cellFontDestroyRenderer"; - case 0x227e1e3c: return "cellFontSetupRenderScalePixel"; - case 0x22e24707: return "cellFontGlyphGetScalePixel"; - case 0x231d5941: return "cellFontGlyphGetHorizontalShift"; - case 0x2388186c: return "cellFontGraphicsGetScalePixel"; - case 0x25253fe4: return "cellFontSetEffectWeight"; - case 0x25dbeff9: return "cellFontGetEffectWeight"; - case 0x285d30d6: return "cellFontGetScalePixel"; - case 0x29329541: return "cellFontOpenFontInstance"; - case 0x297f0e93: return "cellFontSetScalePixel"; - case 0x2da9fd9d: return "cellFontGetRenderCharGlyphMetrics"; - case 0x3da90559: return "cellFontClearFileCache"; - case 0x40d40544: return "cellFontEndLibrary"; - case 0x47ca71ef: return "cellFontAdjustFontScaling"; - case 0x4d19c631: return "cellFontSetupRenderScalePoint"; - case 0x534e785f: return "cellFontGlyphGetVerticalShift"; - case 0x53f529fe: return "cellFontGlyphSetupVertexesGlyph"; - case 0x59ef0073: return "cellFontGetGlyphExpandBufferInfo"; - case 0x5abd8b1e: return "cellFontGetLibrary"; - case 0x66a23100: return "cellFontBindRenderer"; - case 0x698897f8: return "cellFontGetVerticalLayout"; - case 0x6bad7a69: return "cellFontVertexesGlyphRelocate"; - case 0x6bf6f832: return "cellFontSetFontsetOpenMode"; - case 0x6cfada83: return "cellFontSetFontOpenMode"; - case 0x700e6223: return "cellFontGetRenderCharGlyphMetricsVertical"; - case 0x70f3e728: return "cellFontSetScalePoint"; - case 0x78d05e08: return "cellFontSetupRenderEffectSlant"; - case 0x7ab47f7e: return "cellFontEnd"; - case 0x7c5df0d8: return "cellFontGetInitializedRevisionFlags"; - case 0x7c83bc15: return "cellFontGraphicsSetLineRGBA"; - case 0x8657c8f5: return "cellFontSetEffectSlant"; - case 0x87bd650f: return "cellFontGraphicsSetDrawType"; - case 0x88be4799: return "cellFontRenderCharGlyphImage"; - case 0x8a35c887: return "cellFontEndGraphics"; - case 0x8a632038: return "cellFontGetResolutionDpi"; - case 0x8e3f2c40: return "cellFontGlyphRenderImageVertical"; - case 0x90b9465e: return "cellFontRenderSurfaceInit"; - case 0x970d4c22: return "cellFontGraphicsSetupDrawContext"; - case 0x97b95244: return "cellFontGlyphRenderImageHorizontal"; - case 0x98ac5524: return "cellFontGetFontIdCode"; - case 0x9c8d3ff7: return "cellFontGlyphGetOutlineVertexes"; - case 0x9e19072b: return "cellFontOpenFontMemory"; - case 0x9e3b1e16: return "cellFontAdjustGlyphExpandBuffer"; - case 0xa165daae: return "cellFontGetRenderScalePoint"; - case 0xa41342dc: return "cellFontGraphicsGetFontRGBA"; - case 0xa6dc25d1: return "cellFontSetupRenderEffectWeight"; - case 0xa7b2103a: return "cellFontDelete"; - case 0xa885cc9b: return "cellFontOpenFontset"; - case 0xa8fae920: return "cellFontGlyphGetOutlineControlDistance"; - case 0xb015a84e: return "cellFontGetRevisionFlags"; - case 0xb276f1f6: return "cellFontCloseFont"; - case 0xb3d304b2: return "cellFontPatchWorks"; - case 0xb422b005: return "cellFontRenderSurfaceSetScissor"; - case 0xb4d112af: return "cellFontGlyphGetVertexesGlyphSize"; - case 0xc17259de: return "cellFontGenerateCharGlyph"; - case 0xc91c8ece: return "cellFontGetBindingRenderer"; - case 0xcaed32c1: return "cellFontGenerateCharGlyphVertical"; - case 0xced4dda9: return "cellFontGetRenderEffectSlant"; - case 0xd62f5d76: return "cellFontDeleteGlyph"; - case 0xd8eaee9f: return "cellFontGetCharGlyphMetrics"; - case 0xdee0836c: return "cellFontExtend"; - case 0xe01b199e: return "cellFontGlyphRenderImage"; - case 0xe16e679a: return "cellFontGetEffectSlant"; - case 0xe857a0ca: return "cellFontRenderCharGlyphImageVertical"; - case 0xf03dcc29: return "cellFontInitializeWithRevision"; - case 0xf16379fa: return "cellFontUnbindRenderer"; - case 0xf7a19060: return "cellFontGetScalePoint"; - case 0xf7aaa8e2: return "cellFontGraphicsGetLineRGBA"; - case 0xfb3341ba: return "cellFontSetResolutionDpi"; - case 0xfe9a6dd7: return "cellFontGetCharGlyphMetricsVertical"; - case 0x7a0a83c4: return "cellFontInitLibraryFreeTypeWithRevision"; - case 0xec89a187: return "cellFontFTGetRevisionFlags"; - case 0xfa0c2de0: return "cellFontFTGetInitializedRevisionFlags"; - case 0x2a8e6b92: return "cellGameGetDiscContentInfoUpdatePath"; - case 0x3a5d726a: return "cellGameGetParamString"; - case 0x42a2e133: return "cellGameCreateGameData"; - case 0x70acec67: return "cellGameContentPermit"; - case 0x87406734: return "cellGameThemeInstallFromBuffer"; - case 0xa80bf223: return "cellGameGetLocalWebContentPath"; - case 0xb0a1f8c6: return "cellGameContentErrorDialog"; - case 0xb367c6e3: return "cellGameDeleteGameData"; - case 0xb7a45caf: return "cellGameGetParamInt"; - case 0xce4374f6: return "cellGamePatchCheck"; - case 0xd24e3928: return "cellGameThemeInstall"; - case 0xdaa5cd20: return "cellGameSetParamString"; - case 0xdb9819f3: return "cellGameDataCheck"; - case 0xef9d42d5: return "cellGameGetSizeKB"; - case 0xf52639ea: return "cellGameBootCheck"; - case 0x38579ec9: return "cellGameSetExitParam"; - case 0x59b1ede1: return "cellGameGetHomeDataExportPath"; - case 0x59bbebd4: return "cellGameGetHomePath"; - case 0x72cc6cf7: return "cellGameGetHomeDataImportPath"; - case 0x94e9f81d: return "cellGameGetHomeLaunchOptionPath"; - case 0xf6acd0bc: return "cellGameGetBootGameInfo"; - case 0x055bd74d: return "cellGcmGetTiledPitchSize"; - case 0x06edea9e: return "cellGcmSetUserHandler"; - case 0x0a862772: return "cellGcmSetQueueHandler"; - case 0x0b4b62d5: return "cellGcmSetPrepareFlip"; - case 0x0e6b0dae: return "cellGcmGetDisplayInfo"; - case 0x107bf3a1: return "cellGcmInitCursor"; - case 0x15bae46b: return "_cellGcmInitBody"; - case 0x172c3197: return "cellGcmSetDefaultCommandBufferAndSegmentWordSize"; - case 0x1a0de550: return "cellGcmSetCursorPosition"; - case 0x1bd633f8: return "_cellGcmFunc3"; - case 0x1f61b3ff: return "cellGcmDumpGraphicsError"; - case 0x21397818: return "_cellGcmSetFlipCommand"; - case 0x21ac3697: return "cellGcmAddressToOffset"; - case 0x21cee035: return "cellGcmGetNotifyDataAddress"; - case 0x23ae55a3: return "cellGcmGetLastSecondVTime"; - case 0x25b40ab4: return "cellGcmSortRemapEaIoAddress"; - case 0x2922aed0: return "cellGcmGetOffsetTable"; - case 0x2a6fba9c: return "cellGcmIoOffsetToAddress"; - case 0x2ad4951b: return "cellGcmGetTimeStampLocation"; - case 0x371674cf: return "cellGcmGetDisplayBufferByFlipIndex"; - case 0x3a33c1fd: return "_cellGcmFunc15"; - case 0x3b9bd5bd: return "cellGcmUnreserveIoMapSize"; - case 0x4524cccd: return "cellGcmBindTile"; - case 0x4ae8d215: return "cellGcmSetFlipMode"; - case 0x4d7ce993: return "cellGcmSetSecondVFrequency"; - case 0x51c9d62b: return "cellGcmSetDebugOutputLevel"; - case 0x527c6439: return "cellGcmTerminate"; - case 0x5a41c10f: return "cellGcmGetTimeStamp"; - case 0x5e2ee0f0: return "cellGcmGetDefaultCommandWordSize"; - case 0x5f909b17: return "_cellGcmFunc1"; - case 0x626e8518: return "cellGcmMapEaIoAddressWithFlags"; - case 0x63387071: return "cellGcmGetLastFlipTime"; - case 0x63441cb4: return "cellGcmMapEaIoAddress"; - case 0x657571f7: return "cellGcmGetTileInfo"; - case 0x661fe266: return "_cellGcmFunc12"; - case 0x688b8ac9: return "_cellGcmFunc38"; - case 0x69c6cc82: return "cellGcmSetCursorDisable"; - case 0x723bbc7e: return "cellGcmGetVBlankCount"; - case 0x72a577ce: return "cellGcmGetFlipStatus"; - case 0x7fc034bc: return "_cellGcmFunc4"; - case 0x8572bce2: return "cellGcmGetReportDataAddressLocation"; - case 0x8bde5ebf: return "cellGcmSetUserCommand"; - case 0x8cdf8c70: return "cellGcmGetDefaultSegmentWordSize"; - case 0x8effb7fd: return "_cellGcmFunc2"; - case 0x93806525: return "cellGcmGetCurrentDisplayBufferId"; - case 0x983fb9aa: return "cellGcmSetWaitFlip"; - case 0x99d397ac: return "cellGcmGetReport"; - case 0x9a0159af: return "cellGcmGetReportDataAddress"; - case 0x9ba451e4: return "cellGcmSetDefaultFifoSize"; - case 0x9dc04436: return "cellGcmBindZcull"; - case 0xa114ec67: return "cellGcmMapMainMemory"; - case 0xa41ef7e8: return "cellGcmSetFlipHandler"; - case 0xa47c09ff: return "cellGcmSetFlipStatus"; - case 0xa53d12ae: return "cellGcmSetDisplayBuffer"; - case 0xa547adde: return "cellGcmGetControlRegister"; - case 0xa6b180ac: return "cellGcmGetReportDataLocation"; - case 0xa75640e8: return "cellGcmUnbindZcull"; - case 0xa7ede268: return "cellGcmReserveIoMapSize"; - case 0xa91b0402: return "cellGcmSetVBlankHandler"; - case 0xacee8542: return "cellGcmSetFlipImmediate"; - case 0xb2e761d4: return "cellGcmResetFlipStatus"; - case 0xbb42a9dd: return "_cellGcmFunc13"; - case 0xbc982946: return "cellGcmSetDefaultCommandBuffer"; - case 0xbd100dbc: return "cellGcmSetTileInfo"; - case 0xbd2fa0a7: return "cellGcmUpdateCursor"; - case 0xbd6d60d9: return "cellGcmSetInvalidateTile"; - case 0xc47d0812: return "cellGcmSetCursorEnable"; - case 0xc8f3bd09: return "cellGcmGetCurrentField"; - case 0xcaabd992: return "cellGcmInitDefaultFifoMode"; - case 0xd01b570d: return "cellGcmSetGraphicsHandler"; - case 0xd0b1d189: return "cellGcmSetTile"; - case 0xd34a420d: return "cellGcmSetZcull"; - case 0xd8f88e1a: return "_cellGcmSetFlipCommandWithWaitLabel"; - case 0xd9a0a879: return "cellGcmGetZcullInfo"; - case 0xd9b7653e: return "cellGcmUnbindTile"; - case 0xdb23e867: return "cellGcmUnmapIoAddress"; - case 0xdb769b32: return "cellGcmMapLocalMemory"; - case 0xdc09357e: return "cellGcmSetFlip"; - case 0xdc494430: return "cellGcmSetSecondVHandler"; - case 0xdf6476bd: return "cellGcmSetWaitFlipUnsafe"; - case 0xe315a0b2: return "cellGcmGetConfiguration"; - case 0xe44874f3: return "cellGcmSysGetLastVBlankTime"; - case 0xefd00f54: return "cellGcmUnmapEaIoAddress"; - case 0xf80196c1: return "cellGcmGetLabelAddress"; - case 0xf9bfdc72: return "cellGcmSetCursorImageOffset"; - case 0xfb81c03e: return "cellGcmGetMaxIoMapSize"; - case 0xfce9e764: return "cellGcmInitSystemMode"; - case 0xffe0160e: return "cellGcmSetVBlankFrequency"; - case 0x02e7e03e: return "cellGifDecExtDecodeData"; - case 0x116a7da9: return "cellGifDecClose"; - case 0x17fb83c1: return "cellGifDecExtOpen"; - case 0x41a90dc4: return "cellGifDecSetParameter"; - case 0x44b1bc61: return "cellGifDecDecodeData"; - case 0x4711cb7f: return "cellGifDecExtCreate"; - case 0x75745079: return "cellGifDecOpen"; - case 0x95cae771: return "cellGifDecExtSetParameter"; - case 0xb60d42a5: return "cellGifDecCreate"; - case 0xe53f91f2: return "cellGifDecExtReadHeader"; - case 0xe74b2cb1: return "cellGifDecDestroy"; - case 0xf0da95de: return "cellGifDecReadHeader"; - case 0x052a80d9: return "cellHttpCreateTransaction"; - case 0x070f1020: return "cellHttpClientGetTotalPoolSize"; - case 0x0b9fea5f: return "cellHttpRequestGetHeader"; - case 0x0d846d63: return "cellHttpCookieImportWithClientId"; - case 0x0d896b97: return "cellHttpSetProxy"; - case 0x0d9c65be: return "cellHttpClientGetAllHeaders"; - case 0x0ef17399: return "cellHttpTransactionGetUri"; - case 0x10d0d7fc: return "cellHttpResponseGetStatusCode"; - case 0x130150ea: return "cellHttpClientGetRecvBufferSize"; - case 0x1395d8d1: return "cellHttpClientSetSslCallback"; - case 0x13fe767b: return "cellHttpClientSetCookieRecvCallback"; - case 0x14bfc765: return "cellHttpClientGetConnTimeout"; - case 0x16214411: return "cellHttpRequestDeleteHeader"; - case 0x1b5bdcc6: return "cellHttpAddCookieWithClientId"; - case 0x2033b878: return "cellHttpClientCloseAllConnections"; - case 0x211d8ba3: return "cellHttpClientSetAutoRedirect"; - case 0x224e1610: return "cellHttpClientSetRecvTimeout"; - case 0x250c386c: return "cellHttpInit"; - case 0x271a0b06: return "cellHttpClientGetSendTimeout"; - case 0x27f86d70: return "cellHttpClientCloseConnections"; - case 0x2960e309: return "cellHttpClientGetAutoRedirect"; - case 0x296a46cf: return "cellHttpClientSetPipeline"; - case 0x2a1f28f6: return "cellHttpClientGetPipeline"; - case 0x2a78ff04: return "cellHttpTransactionGetSslId"; - case 0x2a87603a: return "cellHttpGetProxy"; - case 0x2d52848b: return "cellHttpTransactionAbortConnection"; - case 0x32f5cae2: return "cellHttpDestroyTransaction"; - case 0x34061e49: return "cellHttpTransactionGetSslCipherId"; - case 0x38954133: return "cellHttpTransactionGetSslCipherBits"; - case 0x40547d8b: return "cellHttpClientSetVersion"; - case 0x4137a1f6: return "cellHttpRequestGetChunkedTransferStatus"; - case 0x42205fe0: return "cellHttpRequestGetAllHeaders"; - case 0x434419c8: return "cellHttpClientSetCookieStatus"; - case 0x464ff889: return "cellHttpResponseGetContentLength"; - case 0x46bcc9ff: return "cellHttpClientGetPerHostKeepAliveMax"; - case 0x473cd9f1: return "cellHttpClientSetRedirectCallback"; - case 0x4b33942a: return "cellHttpClientAddHeader"; - case 0x4d40cf98: return "cellHttpClientGetProxy"; - case 0x4d915204: return "cellHttpClientSetCookieSendCallback"; - case 0x4e4ee53a: return "cellHttpCreateClient"; - case 0x4f5d8d20: return "cellHttpResponseGetHeader"; - case 0x522180bc: return "cellHttpsInit"; - case 0x54f2a4de: return "cellHttpRequestSetHeader"; - case 0x591c21a8: return "cellHttpClientGetKeepAlive"; - case 0x595adee9: return "cellHttpClientSetPerHostKeepAliveMax"; - case 0x5980a293: return "cellHttpClientGetAutoAuthentication"; - case 0x5d473170: return "cellHttpClientSetKeepAlive"; - case 0x617eec02: return "cellHttpClientDeleteHeader"; - case 0x61b2bade: return "cellHttpEndCookie"; - case 0x61c90691: return "cellHttpRecvResponse"; - case 0x65691795: return "cellHttpClientSetSslVersion"; - case 0x660d42a9: return "cellHttpClientSetAuthenticationCallback"; - case 0x6884cdb7: return "cellHttpClientGetResponseBufferMax"; - case 0x6a81b5e4: return "cellHttpResponseGetStatusLine"; - case 0x6eed4999: return "cellHttpClientSetAuthenticationCacheStatus"; - case 0x71714cdc: return "cellHttpClientSetSendTimeout"; - case 0x7313c78d: return "cellHttpClientSetSslIdDestroyCallback"; - case 0x895c604c: return "cellHttpTransactionGetSslCipherName"; - case 0x8aa5fcd3: return "cellHttpClientSetTotalPoolSize"; - case 0x8e3f7ee1: return "cellHttpRequestSetChunkedTransferStatus"; - case 0x8eaf47a3: return "cellHttpClientSetAutoAuthentication"; - case 0x93e938e5: return "cellHttpTransactionGetSslCipherVersion"; - case 0x958323cf: return "cellHttpRequestGetContentLength"; - case 0x9638f766: return "cellHttpInitCookie"; - case 0x980855ac: return "cellHttpDestroyClient"; - case 0xa0d9223c: return "cellHttpTransactionCloseConnection"; - case 0xa34c4b6f: return "cellHttpClientSetHeader"; - case 0xa755b005: return "cellHttpSendRequest"; - case 0xab1c55ab: return "cellHttpClientSetPerHostPoolSize"; - case 0xad1c6f02: return "cellHttpTransactionGetSslVersion"; - case 0xad6a2e5b: return "cellHttpSessionCookieFlush"; - case 0xadc0a4b2: return "cellHttpClientPollConnections"; - case 0xadd66b5c: return "cellHttpClientSetResponseBufferMax"; - case 0xaf73a64e: return "cellHttpRequestSetContentLength"; - case 0xb6feb84b: return "cellHttpClientSetTransactionStateCallback"; - case 0xba78e51f: return "cellHttpClientGetRecvTimeout"; - case 0xbea17389: return "cellHttpResponseGetAllHeaders"; - case 0xbf6e3659: return "cellHttpClientSetRecvBufferSize"; - case 0xcac9fc34: return "cellHttpClientSetUserAgent"; - case 0xccf57336: return "cellHttpClientGetSslVersion"; - case 0xd06c90a4: return "cellHttpClientGetPerPipelineMax"; - case 0xd1ec0b25: return "cellHttpClientGetHeader"; - case 0xd276ff1f: return "cellHttpEnd"; - case 0xd47cc666: return "cellHttpTransactionReleaseConnection"; - case 0xd7471088: return "cellHttpClientSetConnTimeout"; - case 0xd7d3cd5d: return "cellHttpClientSetProxy"; - case 0xd8352a40: return "cellHttpClientSetSslClientCertificate"; - case 0xdc405507: return "cellHttpClientGetVersion"; - case 0xdc7ed599: return "cellHttpClientSetPerPipelineMax"; - case 0xe3c424b3: return "cellHttpTransactionGetSslCipherString"; - case 0xe6d4202f: return "cellHttpsEnd"; - case 0xeb9c1e5e: return "cellHttpClientGetCookieStatus"; - case 0xed993147: return "cellHttpRequestAddHeader"; - case 0xee05b0c1: return "cellHttpClientGetUserAgent"; - case 0xf972c733: return "cellHttpCookieExportWithClientId"; - case 0xfce39343: return "cellHttpClientGetAuthenticationCacheStatus"; - case 0xffc74003: return "cellHttpClientGetPerHostPoolSize"; - case 0x04accebf: return "cellHttpUtilBuildHeader"; - case 0x1c6e4dbb: return "cellHttpUtilBuildRequestLine"; - case 0x2763fd66: return "cellHttpUtilUnescapeUri"; - case 0x2bcbced4: return "cellHttpUtilParseStatusLine"; - case 0x32faaf58: return "cellHttpUtilParseUri"; - case 0x37bb53a2: return "cellHttpUtilAppendHeaderValue"; - case 0x44d756d6: return "cellHttpUtilFormUrlEncode"; - case 0x50ea75bc: return "cellHttpUtilCopyStatusLine"; - case 0x6f0f7667: return "cellHttpUtilBuildUri"; - case 0x83faa354: return "cellHttpUtilBase64Encoder"; - case 0x8bb608e4: return "cellHttpUtilParseUriPath"; - case 0x8e52ee08: return "cellHttpUtilBase64Decoder"; - case 0x8e6c5bb9: return "cellHttpUtilFormUrlDecode"; - case 0x8ea23deb: return "cellHttpUtilMergeUriPath"; - case 0x9003b1f2: return "cellHttpUtilEscapeUri"; - case 0x97f9fbe5: return "cellHttpUtilCopyHeader"; - case 0xa3457869: return "cellHttpUtilParseProxy"; - case 0xaabeb869: return "cellHttpUtilSweepPath"; - case 0xe1fb0ebd: return "cellHttpUtilParseHeader"; - case 0xf05df789: return "cellHttpUtilCopyUri"; - case 0x0e363ae7: return "cellImeJpGetFocusTop"; - case 0x177bd218: return "cellImeJpGetCandidateSelect"; - case 0x1986f2cd: return "cellImeJpGetPredictList"; - case 0x1b119958: return "cellImeJpOpen3"; - case 0x1e29103b: return "cellImeJpConvertForward"; - case 0x1e411261: return "cellImeJpMoveFocusClause"; - case 0x24e9d8fc: return "cellImeJpSetKanaInputMode"; - case 0x36d38701: return "cellImeJpReset"; - case 0x37961cc1: return "cellImeJpExtendConvertArea"; - case 0x441a1c2b: return "cellImeJpEnterString"; - case 0x44608862: return "cellImeJpOpen"; - case 0x46d1234a: return "cellImeJpClose"; - case 0x47b43dd4: return "cellImeJpOpen2"; - case 0x5b6ada55: return "cellImeJpEnterCharExt"; - case 0x5f5b3227: return "cellImeJpGetFocusLength"; - case 0x6298b55a: return "cellImeJpEnterStringExt"; - case 0x6319eda3: return "cellImeJpAllDeleteConvertString"; - case 0x66c6cc78: return "cellImeJpGetStatus"; - case 0x6ccbe3d6: return "cellImeJpEnterChar"; - case 0x7189430b: return "cellImeJpAllConfirm"; - case 0x72257652: return "cellImeJpDeleteWord"; - case 0x7a18c2b9: return "cellImeJpCurrentPartConfirm"; - case 0x89f8a567: return "cellImeJpGetConfirmYomiString"; - case 0x8bb41f47: return "cellImeJpPostConvert"; - case 0xaa1d1f57: return "cellImeJpBackspaceWord"; - case 0xaa2a3287: return "cellImeJpShortenConvertArea"; - case 0xac6693d8: return "cellImeJpModeCaretRight"; - case 0xbd679cc1: return "cellImeJpTemporalConfirm"; - case 0xc1786c81: return "cellImeJpSetFixInputMode"; - case 0xc2bb48bc: return "cellImeJpConvertBackward"; - case 0xc4796a45: return "cellImeJpGetCandidateListSize"; - case 0xcbbc20b7: return "cellImeJpAllConvertCancel"; - case 0xd3fc3606: return "cellImeJpGetConfirmString"; - case 0xe4cc15ba: return "cellImeJpGetCandidateList"; - case 0xe76c9700: return "cellImeJpModeCaretLeft"; - case 0xea2d4881: return "cellImeJpGetConvertYomiString"; - case 0xeae879dc: return "cellImeJpConvertCancel"; - case 0xeede898c: return "cellImeJpConfirmPrediction"; - case 0xf5992ec8: return "cellImeJpSetInputCharType"; - case 0xf91abda3: return "cellImeJpGetConvertString"; - case 0x65cbbb16: return "cellJpgDecExtSetParameter"; - case 0x6d9ebccf: return "cellJpgDecReadHeader"; - case 0x716f8792: return "cellJpgDecExtDecodeData"; - case 0x8b300f66: return "cellJpgDecExtCreate"; - case 0x9338a07a: return "cellJpgDecClose"; - case 0x976ca5c2: return "cellJpgDecOpen"; - case 0xa7978f59: return "cellJpgDecCreate"; - case 0xa9f703e3: return "cellJpgDecExtOpen"; - case 0xaf8bb012: return "cellJpgDecDecodeData"; - case 0xb91eb3d2: return "cellJpgDecExtReadHeader"; - case 0xd8ea91f8: return "cellJpgDecDestroy"; - case 0xe08f3910: return "cellJpgDecSetParameter"; - case 0x0cf2b78b: return "cellJpgEncReset"; - case 0x12d9b6c5: return "cellJpgEncQueryAttr"; - case 0x2ae79be8: return "cellJpgEncWaitForInput"; - case 0x4262e880: return "cellJpgEncGetStreamInfo"; - case 0x636dc89e: return "cellJpgEncEncodePicture2"; - case 0x6f2d371c: return "cellJpgEncOpenEx"; - case 0x969fc5f7: return "cellJpgEncClose"; - case 0x9b4e3a74: return "cellJpgEncWaitForOutput"; - case 0xa4bfae51: return "cellJpgEncOpen"; - case 0xa9e81214: return "cellJpgEncEncodePicture"; - case 0x0dfbadfa: return "cellKey2CharSetArrangement"; - case 0x14bf2dc1: return "cellKey2CharClose"; - case 0x56776c0d: return "cellKey2CharGetChar"; - case 0xabf629c1: return "cellKey2CharOpen"; - case 0xbfc03768: return "cellKey2CharSetMode"; - case 0x005200e6: return "UCS2toEUCJP"; - case 0x01b0cbf4: return "l10n_convert"; - case 0x0356038c: return "UCS2toUTF32"; - case 0x05028763: return "jis2kuten"; - case 0x058addc8: return "UTF8toGB18030"; - case 0x060ee3b2: return "JISstoUTF8s"; - case 0x07168a83: return "SjisZen2Han"; - case 0x0bc386c8: return "ToSjisLower"; - case 0x0bedf77d: return "UCS2toGB18030"; - case 0x0bf867e2: return "HZstoUCS2s"; - case 0x0ce278fd: return "UCS2stoHZs"; - case 0x0d90a48d: return "UCS2stoSJISs"; - case 0x0f624540: return "kuten2eucjp"; - case 0x14ee3649: return "sjis2jis"; - case 0x14f504b8: return "EUCKRstoUCS2s"; - case 0x16eaf5f1: return "UHCstoEUCKRs"; - case 0x1758053c: return "jis2sjis"; - case 0x1906ce6b: return "jstrnchk"; - case 0x1ac0d23d: return "L10nConvert"; - case 0x1ae2acee: return "EUCCNstoUTF8s"; - case 0x1cb1138f: return "GBKstoUCS2s"; - case 0x1da42d70: return "eucjphan2zen"; - case 0x1ec712e0: return "ToSjisHira"; - case 0x1fb50183: return "GBKtoUCS2"; - case 0x21948c03: return "eucjp2jis"; - case 0x21aa3045: return "UTF32stoUTF8s"; - case 0x24fd32a9: return "sjishan2zen"; - case 0x256b6861: return "UCS2toSBCS"; - case 0x262a5ae2: return "UTF8stoGBKs"; - case 0x28724522: return "UTF8toUCS2"; - case 0x2ad091c6: return "UCS2stoUTF8s"; - case 0x2b84030c: return "EUCKRstoUTF8s"; - case 0x2efa7294: return "UTF16stoUTF32s"; - case 0x2f9eb543: return "UTF8toEUCKR"; - case 0x317ab7c2: return "UTF16toUTF8"; - case 0x32689828: return "ARIBstoUTF8s"; - case 0x33435818: return "SJISstoUTF8s"; - case 0x33f8b35c: return "sjiszen2han"; - case 0x3968f176: return "ToEucJpLower"; - case 0x398a3dee: return "MSJIStoUTF8"; - case 0x3a20bc34: return "UCS2stoMSJISs"; - case 0x3dabd5a7: return "EUCJPtoUTF8"; - case 0x3df65b64: return "eucjp2sjis"; - case 0x408a622b: return "ToEucJpHira"; - case 0x41b4a5ae: return "UHCstoUCS2s"; - case 0x41ccf033: return "ToEucJpKata"; - case 0x42838145: return "HZstoUTF8s"; - case 0x4931b44e: return "UTF8toMSJIS"; - case 0x4b3bbacb: return "BIG5toUTF8"; - case 0x511d386b: return "EUCJPstoSJISs"; - case 0x52b7883f: return "UTF8stoBIG5s"; - case 0x53558b6b: return "UTF16stoUCS2s"; - case 0x53764725: return "UCS2stoGB18030s"; - case 0x53c71ac2: return "EUCJPtoSJIS"; - case 0x54f59807: return "EUCJPtoUCS2"; - case 0x55f6921c: return "UCS2stoGBKs"; - case 0x58246762: return "EUCKRtoUHC"; - case 0x596df41c: return "UCS2toSJIS"; - case 0x5a4ab223: return "MSJISstoUTF8s"; - case 0x5ac783dc: return "EUCJPstoUTF8s"; - case 0x5b684dfb: return "UCS2toBIG5"; - case 0x5cd29270: return "UTF8stoEUCKRs"; - case 0x5e1d9330: return "UHCstoUTF8s"; - case 0x60ffa0ec: return "GB18030stoUCS2s"; - case 0x6122e000: return "SJIStoUTF8"; - case 0x6169f205: return "JISstoSJISs"; - case 0x61fb9442: return "UTF8toUTF16"; - case 0x62b36bcf: return "UTF8stoMSJISs"; - case 0x63219199: return "EUCKRtoUTF8"; - case 0x638c2fc1: return "SjisHan2Zen"; - case 0x64a10ec8: return "UCS2toUTF16"; - case 0x65444204: return "UCS2toMSJIS"; - case 0x6621a82c: return "sjis2kuten"; - case 0x6a6f25d1: return "UCS2toUHC"; - case 0x6c62d879: return "UTF32toUCS2"; - case 0x6de4b508: return "ToSjisUpper"; - case 0x6e0705c4: return "UTF8toEUCJP"; - case 0x6e5906fd: return "UCS2stoEUCJPs"; - case 0x6fc530b3: return "UTF16toUCS2"; - case 0x714a9b4a: return "UCS2stoUTF16s"; - case 0x71804d64: return "UCS2stoEUCCNs"; - case 0x72632e53: return "SBCSstoUTF8s"; - case 0x73f2cd21: return "SJISstoJISs"; - case 0x74496718: return "SBCStoUTF8"; - case 0x74871fe0: return "UTF8toUTF32"; - case 0x750c363d: return "jstrchk"; - case 0x7c5bde1c: return "UHCtoEUCKR"; - case 0x7c912bda: return "kuten2jis"; - case 0x7d07a1c2: return "UTF8toEUCCN"; - case 0x8171c1cc: return "EUCCNtoUTF8"; - case 0x82d5ecdf: return "EucJpZen2Han"; - case 0x8555fe15: return "UTF32stoUTF16s"; - case 0x860fc741: return "GBKtoUTF8"; - case 0x867f7b8b: return "ToEucJpUpper"; - case 0x88f8340b: return "UCS2stoJISs"; - case 0x89236c86: return "UTF8stoGB18030s"; - case 0x8a56f148: return "EUCKRstoUHCs"; - case 0x8ccdba38: return "UTF8stoUTF32s"; - case 0x8f472054: return "UTF8stoEUCCNs"; - case 0x90e9b5d2: return "EUCJPstoUCS2s"; - case 0x91a99765: return "UHCtoUCS2"; - case 0x931ff25a: return "L10nConvertStr"; - case 0x949bb14c: return "GBKstoUTF8s"; - case 0x9557ac9b: return "UTF8toUHC"; - case 0x9768b6d3: return "UTF32toUTF8"; - case 0x9874020d: return "sjis2eucjp"; - case 0x9a0e7d23: return "UCS2toEUCCN"; - case 0x9a13d6b8: return "UTF8stoUHCs"; - case 0x9a72059d: return "EUCKRtoUCS2"; - case 0x9b1210c6: return "UTF32toUTF16"; - case 0x9cd8135b: return "EUCCNstoUCS2s"; - case 0x9ce52809: return "SBCSstoUCS2s"; - case 0x9cf1ab77: return "UTF8stoJISs"; - case 0x9d14dc46: return "ToSjisKata"; - case 0x9dcde367: return "jis2eucjp"; - case 0x9ec52258: return "BIG5toUCS2"; - case 0xa0d463c0: return "UCS2toGBK"; - case 0xa19fb9de: return "UTF16toUTF32"; - case 0xa298cad2: return "l10n_convert_str"; - case 0xa34fa0eb: return "EUCJPstoJISs"; - case 0xa5146299: return "UTF8stoARIBs"; - case 0xa609f3e9: return "JISstoEUCJPs"; - case 0xa60ff5c9: return "EucJpHan2Zen"; - case 0xa963619c: return "isEucJpKigou"; - case 0xa9a76fb8: return "UCS2toUTF8"; - case 0xaf18d499: return "GB18030toUCS2"; - case 0xb3361be6: return "UHCtoUTF8"; - case 0xb6e45343: return "MSJIStoUCS2"; - case 0xb7cef4a6: return "UTF8toGBK"; - case 0xb7e08f7a: return "kuten2sjis"; - case 0xb9cf473d: return "UTF8toSBCS"; - case 0xbdd44ee3: return "SJIStoUCS2"; - case 0xbe42e661: return "eucjpzen2han"; - case 0xbe8d5485: return "UCS2stoARIBs"; - case 0xbefe3869: return "isSjisKigou"; - case 0xc62b758d: return "UTF8stoEUCJPs"; - case 0xc7bdcb4c: return "UCS2toEUCKR"; - case 0xc944fa56: return "SBCStoUCS2"; - case 0xc9b78f58: return "MSJISstoUCS2s"; - case 0xcc1633cc: return "l10n_get_converter"; - case 0xd02ef83d: return "GB18030stoUTF8s"; - case 0xd8721e2c: return "SJISstoEUCJPs"; - case 0xd8cb24cb: return "UTF32stoUCS2s"; - case 0xd990858b: return "BIG5stoUTF8s"; - case 0xd9fb1224: return "EUCCNtoUCS2"; - case 0xda67b37f: return "UTF8stoSBCSs"; - case 0xdc54886c: return "UCS2stoEUCKRs"; - case 0xdd5ebdeb: return "UTF8stoSJISs"; - case 0xdefa1c17: return "UTF8stoHZs"; - case 0xe2eabb32: return "eucjp2kuten"; - case 0xe6d9e234: return "UTF8toBIG5"; - case 0xe6f5711b: return "UTF16stoUTF8s"; - case 0xe956dc64: return "JISstoUCS2s"; - case 0xeabc3d00: return "GB18030toUTF8"; - case 0xeb3dc670: return "UTF8toSJIS"; - case 0xeb41cc68: return "ARIBstoUCS2s"; - case 0xeb685b83: return "UCS2stoUTF32s"; - case 0xebae29c0: return "UCS2stoSBCSs"; - case 0xee6c6a39: return "UCS2stoBIG5s"; - case 0xf1dcfa71: return "UCS2stoUHCs"; - case 0xf439728e: return "SJIStoEUCJP"; - case 0xf7681b9a: return "UTF8stoUTF16s"; - case 0xf9b1896d: return "SJISstoUCS2s"; - case 0xfa4a675a: return "BIG5stoUCS2s"; - case 0xfdbf6ac5: return "UTF8stoUCS2s"; - case 0x0252efcc: return "cellUserTraceInit"; - case 0x05893e7c: return "cellUserTraceRegister"; - case 0x6d045c2e: return "cellUserTraceUnregister"; - case 0x898c77bf: return "cellUserTraceTerminate"; - case 0x017024a8: return "cellMicGetDeviceGUID"; - case 0x05709bbf: return "cellMicOpenEx"; - case 0x07e1b12c: return "cellMicRead"; - case 0x186cb1fb: return "cellMicIsOpen"; - case 0x1b42101b: return "cellMicIsAttached"; - case 0x25c5723f: return "cellMicGetStatus"; - case 0x323deb41: return "cellMicSetSignalAttr"; - case 0x3acc118e: return "cellMicReadAux"; - case 0x3ace58f3: return "cellMicSysShareClose"; - case 0x48108a23: return "cellMicGetFormat"; - case 0x4e0b69ee: return "cellMicGetFormatRaw"; - case 0x65336418: return "cellMicRemoveNotifyEventQueue"; - case 0x6a024aa0: return "cellMicGetDeviceAttr"; - case 0x6bc46aab: return "cellMicReset"; - case 0x6cc7ae00: return "cellMicSetNotifyEventQueue2"; - case 0x72165a7f: return "cellMicReadRaw"; - case 0x7903400e: return "cellMicSetNotifyEventQueue"; - case 0x8325e02d: return "cellMicInit"; - case 0x87a08d29: return "cellMicGetFormatDsp"; - case 0x891c6291: return "cellMicSetMultiMicNotifyEventQueue"; - case 0x8d229f8e: return "cellMicClose"; - case 0xa42ac07a: return "cellMicOpenRaw"; - case 0xa52d2ae4: return "cellMicGetType"; - case 0xac5ba03a: return "cellMicGetSignalAttr"; - case 0xad049ecf: return "cellMicGetFormatEx"; - case 0xb2c16321: return "cellMicSetDeviceAttr"; - case 0xb30780eb: return "cellMicGetSignalState"; - case 0xbdfd51e2: return "cellMicSysShareStop"; - case 0xc3610dbd: return "cellMicSysShareOpen"; - case 0xc414faa5: return "cellMicReadDsp"; - case 0xc461563c: return "cellMicCommand"; - case 0xc6328caa: return "cellMicEnd"; - case 0xcac7e7d7: return "cellMicSysShareStart"; - case 0xd127cd3e: return "cellMicSysShareInit"; - case 0xdd1b59f0: return "cellMicOpen"; - case 0xdd724314: return "cellMicStart"; - case 0xddd19a89: return "cellMicStartEx"; - case 0xe839380f: return "cellMicStopEx"; - case 0xf82bbf7c: return "cellMicSysShareEnd"; - case 0xfcfaf246: return "cellMicStop"; - case 0xfda12276: return "cellMicGetFormatAux"; - case 0xfdbbe469: return "cellMicGetDeviceIdentifier"; - case 0x066bb1cf: return "cellMusicDecodeSetDecodeCommand"; - case 0x1576e4f2: return "cellMusicDecodeGetDecodeStatus2"; - case 0x25ea7ac0: return "cellMusicDecodeGetContentsId2"; - case 0x2ef701ec: return "cellMusicDecodeSetDecodeCommand2"; - case 0x491d6ba5: return "cellMusicDecodeSetSelectionContext2"; - case 0x4aef2877: return "cellMusicDecodeFinalize2"; - case 0x58ab1999: return "cellMusicDecodeGetContentsId"; - case 0x5af74c50: return "cellMusicDecodeGetDecodeStatus"; - case 0x84f154b2: return "cellMusicDecodeInitializeSystemWorkload"; - case 0xa8615dc8: return "cellMusicDecodeFinalize"; - case 0xa881b744: return "cellMusicDecodeRead"; - case 0xb2d054df: return "cellMusicDecodeRead2"; - case 0xb641168e: return "cellMusicDecodeInitialize2SystemWorkload"; - case 0xb84f5c81: return "cellMusicDecodeSetSelectionContext"; - case 0xc22563c4: return "cellMusicDecodeSelectContents2"; - case 0xd55dbc11: return "cellMusicDecodeInitialize"; - case 0xdbf70550: return "cellMusicDecodeGetSelectionContext"; - case 0xf24cb963: return "cellMusicDecodeSelectContents"; - case 0xf80e31e5: return "cellMusicDecodeInitialize2"; - case 0xf91639f9: return "cellMusicDecodeGetSelectionContext2"; - case 0x92b50ebc: return "cellMusicExportProgress"; - case 0xb202f0e8: return "cellMusicExportFromFile"; - case 0xb4c9b4f9: return "cellMusicExportInitialize"; - case 0xe0443a44: return "cellMusicExportInitialize2"; - case 0xe90effea: return "cellMusicExportFinalize"; - case 0x0b461648: return "cellMusicGetSelectionContext"; - case 0x2bdc5d6b: return "cellMusicSetSelectionContext2"; - case 0x4014c246: return "cellMusicSetVolume2"; - case 0x4c188caa: return "cellMusicGetContentsId"; - case 0x5bff31bf: return "cellMusicSetSelectionContext"; - case 0x61865281: return "cellMusicInitialize2SystemWorkload"; - case 0x648b7611: return "cellMusicGetPlaybackStatus2"; - case 0x6674de2d: return "cellMusicGetContentsId2"; - case 0x6f2104f3: return "cellMusicFinalize"; - case 0x72876546: return "cellMusicInitializeSystemWorkload"; - case 0x72ec14b5: return "cellMusicInitialize"; - case 0x7be4dc31: return "cellMusicFinalize2"; - case 0x8793ef97: return "cellMusicGetSelectionContext2"; - case 0x8aa188e3: return "cellMusicGetVolume"; - case 0x95f7d9d9: return "cellMusicGetPlaybackStatus"; - case 0x98947a6e: return "cellMusicSetPlaybackCommand2"; - case 0xa0661626: return "cellMusicSetPlaybackCommand"; - case 0xad04cddd: return "cellMusicSelectContents2"; - case 0xb2336ba7: return "cellMusicSelectContents"; - case 0xbe50b11e: return "cellMusicInitialize2"; - case 0xe74ce7bd: return "cellMusicSetVolume"; - case 0xf9073a24: return "cellMusicGetVolume2"; - case 0x04459230: return "cellNetCtlNetStartDialogLoadAsync"; - case 0x0791015f: return "cellGameUpdateCheckStartAsyncEx"; - case 0x0ce13c6b: return "cellNetCtlAddHandler"; - case 0x0f1f13d3: return "cellNetCtlNetStartDialogUnloadAsync"; - case 0x105ee2cb: return "cellNetCtlTerm"; - case 0x10dae56d: return "cellGameUpdateTerm"; - case 0x1e585b5d: return "cellNetCtlGetInfo"; - case 0x3a12865f: return "cellNetCtlGetNatInfo"; - case 0x3e359ab6: return "cellGameUpdateCheckAbort"; - case 0x558700f6: return "cellGameUpdateCheckStartWithoutDialogAsyncEx"; - case 0x71d53210: return "cellNetCtlNetStartDialogAbortAsync"; - case 0x8b3eba69: return "cellNetCtlGetState"; - case 0x901815c3: return "cellNetCtlDelHandler"; - case 0x99ab1a26: return "cellGameUpdateInit"; - case 0xa5e1fa60: return "cellGameUpdateCheckStartWithoutDialogAsync"; - case 0xbd5a59fc: return "cellNetCtlInit"; - case 0xd0a5d727: return "cellGameUpdateCheckStartAsync"; - case 0xf463981c: return "cellGameUpdateCheckFinishAsyncEx"; - case 0xffa3d791: return "cellGameUpdateCheckFinishAsync"; - case 0x09565b21: return "cellOskDialogExtInputDeviceUnlock"; - case 0x1e1b4c97: return "cellOskDialogExtRegisterKeyboardEventHookCallback"; - case 0x23a2ede6: return "cellOskDialogExtAddJapaneseOptionDictionary"; - case 0x42439db5: return "cellOskDialogExtSendFinishMessage"; - case 0x4fe14d09: return "cellOskDialogExtAddOptionDictionary"; - case 0x75370397: return "cellOskDialogExtSetInitialScale"; - case 0x7c95feb8: return "cellOskDialogExtInputDeviceLock"; - case 0x7eb292cd: return "cellOskDialogExtSetBaseColor"; - case 0x8692fcd2: return "cellOskDialogExtRegisterConfirmWordFilterCallback"; - case 0x8b60c469: return "cellOskDialogExtUpdateInputText"; - case 0xe6c43c58: return "cellOskDialogExtEnableHalfByteKana"; - case 0xe800f586: return "cellOskDialogExtRegisterForceFinishCallback"; - case 0x629ba0c0: return "cellOvisInvalidateOverlappedSegments"; - case 0x82f294b2: return "cellOvisGetOverlayTableSize"; - case 0xa876c911: return "cellOvisInitializeOverlayTable"; - case 0xce6cb776: return "cellOvisFixSpuSegments"; - case 0x01067e22: return "cellPamfStreamTypeToEsFilterId"; - case 0x03fd2caa: return "cellPamfReaderSetStreamWithTypeAndChannel"; - case 0x041cc708: return "cellPamfReaderGetStreamIndex"; - case 0x1abeb9d6: return "cellPamfEpIteratorGetEp"; - case 0x28b4e2c1: return "cellPamfReaderSetStreamWithTypeAndIndex"; - case 0x37f723f7: return "cellPamfReaderGetNumberOfStreams"; - case 0x439fba17: return "cellPamfReaderGetEpIteratorWithTimeStamp"; - case 0x44f5c9e3: return "cellPamfGetStreamOffsetAndSize"; - case 0x461534b4: return "cellPamfReaderSetStreamWithIndex"; - case 0x4de501b1: return "cellPamfReaderGetPresentationStartTime"; - case 0x50b83205: return "cellPamfEpIteratorMove"; - case 0x67fd273b: return "cellPamfReaderGetStreamInfo"; - case 0x71df326a: return "cellPamfReaderGetEsFilterId"; - case 0x90fc9a59: return "cellPamfGetHeaderSize2"; - case 0x9ab20793: return "cellPamfReaderGetStreamTypeAndChannel"; - case 0xb8436ee5: return "cellPamfReaderInitialize"; - case 0xca8181c1: return "cellPamfGetHeaderSize"; - case 0xd0230671: return "cellPamfReaderGetNumberOfSpecificStreams"; - case 0xd1a40ef4: return "cellPamfVerify"; - case 0xd9ea3457: return "cellPamfReaderGetNumberOfEp"; - case 0xdb70296c: return "cellPamfReaderGetMuxRateBound"; - case 0xe8586ec6: return "cellPamfReaderGetEpIteratorWithIndex"; - case 0xf61609d6: return "cellPamfReaderGetPresentationEndTime"; - case 0x0f424ecb: return "cellPhotoDecodeInitialize2"; - case 0x28b22e44: return "cellPhotoDecodeFromFile"; - case 0x596f0a56: return "cellPhotoDecodeInitialize"; - case 0xad7d8f38: return "cellPhotoDecodeFinalize"; - case 0x0783bce0: return "cellPhotoImport"; - case 0x1ab8df55: return "cellPhotoImport2"; - case 0x08cbd8e1: return "cellPhotoExportInitialize2"; - case 0x09ce84ac: return "cellPhotoExportFromFile"; - case 0x3f7fc0af: return "cellPhotoFinalize"; - case 0x42a32983: return "cellPhotoRegistFromFile"; - case 0x4357c77f: return "cellPhotoExportInitialize"; - case 0x55c70783: return "cellPhotoInitialize"; - case 0xde509ead: return "cellPhotoExportProgress"; - case 0xed4a0148: return "cellPhotoExportFinalize"; - case 0x0c515302: return "cellPngDecExtOpen"; - case 0x157d30c5: return "cellPngDecCreate"; - case 0x2310f155: return "cellPngDecDecodeData"; - case 0x27c921b5: return "cellPngDecGetoFFs"; - case 0x30cb334a: return "cellPngDecGetsBIT"; - case 0x35a6846c: return "cellPngDecGettIME"; - case 0x3d50016a: return "cellPngDecGetpHYs"; - case 0x48436b2d: return "cellPngDecExtCreate"; - case 0x5b3d1ff1: return "cellPngDecClose"; - case 0x609ec7d5: return "cellPngDecGetUnknownChunks"; - case 0x726fc1d0: return "cellPngDecExtDecodeData"; - case 0x7585a275: return "cellPngDecGetbKGD"; - case 0x7a062d26: return "cellPngDecGetcHRM"; - case 0x820dae1a: return "cellPngDecDestroy"; - case 0x8b33f863: return "cellPngDecExtReadHeader"; - case 0x9ccdcc95: return "cellPngDecReadHeader"; - case 0x9e9d7d42: return "cellPngDecExtSetParameter"; - case 0xa5cdf57e: return "cellPngDecGetsPLT"; - case 0xb153629c: return "cellPngDecGetgAMA"; - case 0xb40ca175: return "cellPngDecGetTextChunk"; - case 0xb4fe75e1: return "cellPngDecGetpCAL"; - case 0xb905ebb7: return "cellPngDecGethIST"; - case 0xb96fb26e: return "cellPngDecGettRNS"; - case 0xc41e1198: return "cellPngDecGetsCAL"; - case 0xd2bc5bfd: return "cellPngDecOpen"; - case 0xe163977f: return "cellPngDecGetPLTE"; - case 0xe4416e82: return "cellPngDecGetsRGB"; - case 0xe97c9bd4: return "cellPngDecSetParameter"; - case 0xf44b6c30: return "cellPngDecGetiCCP"; - case 0x117cd726: return "cellPngEncClose"; - case 0x19256dc5: return "cellPngEncOpen"; - case 0x496cfcd0: return "cellPngEncQueryAttr"; - case 0x585269bc: return "cellPngEncGetStreamInfo"; - case 0x5b546ca4: return "cellPngEncEncodePicture"; - case 0x662bd637: return "cellPngEncWaitForInput"; - case 0x6ac91de3: return "cellPngEncReset"; - case 0x90ef2963: return "cellPngEncWaitForOutput"; - case 0xc82558ce: return "cellPngEncOpenEx"; - case 0x0a373522: return "cellPrintSendBand"; - case 0x0d44f661: return "cellPrintEndPage"; - case 0x293d9e9c: return "cellPrintCancelJob"; - case 0x6802dfb5: return "cellPrintGetStatus"; - case 0x6d996018: return "cellSysutilPrintShutdown"; - case 0x6e952645: return "cellPrintGetPrintableArea"; - case 0x795b12b3: return "cellPrintStartJob"; - case 0x865acf74: return "cellPrintStartPage"; - case 0xc04a7d42: return "cellPrintEndJob"; - case 0xc9c3ef14: return "cellPrintLoadAsync"; - case 0xcf1aaefa: return "cellSysutilPrintInit"; - case 0xeb51aa38: return "cellPrintUnloadAsync"; - case 0xf0865182: return "cellPrintLoadAsync2"; - case 0xf9a53f35: return "cellPrintOpenConfig"; - case 0x39651e01: return "cellRecOpen"; - case 0x4ac76585: return "cellRecClose"; - case 0x5a8a8b0f: return "cellRecGetInfo"; - case 0x5b45439d: return "cellRecStop"; - case 0x964cd1b8: return "cellRecStart"; - case 0xdbf22bd1: return "cellRecQueryMemSize"; - case 0xf0958f73: return "cellRecSetInfo"; - case 0x533f41df: return "cellRemotePlayGetStatus"; - case 0x743918bd: return "cellRemotePlaySetComparativeVolume"; - case 0xa445cd55: return "cellRemotePlayGetPeerInfo"; - case 0xc267987b: return "cellRemotePlayGetSharedMemory"; - case 0xd29fe5e3: return "cellRemotePlayEncryptAllData"; - case 0xd6f3fc82: return "cellRemotePlayStopPeerVideoOut"; - case 0xe12c8c19: return "cellRemotePlayGetComparativeVolume"; - case 0xfb793f27: return "cellRemotePlayBreak"; - case 0x01220224: return "cellRescGcmSurface2RescSrc"; - case 0x0a2069c7: return "cellRescGetNumColorBuffers"; - case 0x0d3c22ce: return "cellRescSetWaitFlip"; - case 0x10db5b1a: return "cellRescSetDsts"; - case 0x129922a0: return "cellRescResetFlipStatus"; - case 0x19a2a967: return "cellRescSetPalInterpolateDropFlexRatio"; - case 0x1dd3c4cd: return "cellRescGetRegisterCount"; - case 0x22ae06d8: return "cellRescAdjustAspectRatio"; - case 0x23134710: return "cellRescSetDisplayMode"; - case 0x25c107e6: return "cellRescSetConvertAndFlip"; - case 0x2ea3061e: return "cellRescExit"; - case 0x2ea94661: return "cellRescSetFlipHandler"; - case 0x516ee89e: return "cellRescInit"; - case 0x5a338cdb: return "cellRescGetBufferSize"; - case 0x66f5e388: return "cellRescGetLastFlipTime"; - case 0x6cd0f95f: return "cellRescSetSrc"; - case 0x7af8a37f: return "cellRescSetRegisterCount"; - case 0x8107277c: return "cellRescSetBufferAddress"; - case 0xc47c5c22: return "cellRescGetFlipStatus"; - case 0xd1ca0503: return "cellRescVideoOutResolutionId2RescBufferMode"; - case 0xd3758645: return "cellRescSetVBlankHandler"; - case 0xe0cef79e: return "cellRescCreateInterlaceTable"; - case 0x1324948a: return "cellRtcFormatRfc3339LocalTime"; - case 0x269a1882: return "cellRtcTickAddTicks"; - case 0x2cce9cf5: return "cellRtcGetCurrentClockLocalTime"; - case 0x2f010bfa: return "cellRtcTickAddMinutes"; - case 0x32c941cf: return "cellRtcGetCurrentClock"; - case 0x332a74dd: return "cellRtcTickAddYears"; - case 0x46ca7fe0: return "cellRtcConvertLocalTimeToUtc"; - case 0x5316b4a8: return "cellRtcIsLeapYear"; - case 0x5491b9d5: return "cellRtcFormatRfc2822"; - case 0x5b6a0a1d: return "cellRtcGetDaysInMonth"; - case 0x5f68c268: return "cellRtcSetWin32FileTime"; - case 0x64c63fd5: return "cellRtcTickAddWeeks"; - case 0x75744e2a: return "cellRtcTickAddDays"; - case 0x7f1086e6: return "cellRtcCheckValid"; - case 0x9598d4b3: return "cellRtcSetDosTime"; - case 0x99b13034: return "cellRtcSetTick"; - case 0x9dafc0d9: return "cellRtcGetCurrentTick"; - case 0xa07c3d2f: return "cellRtcFormatRfc2822LocalTime"; - case 0xbb543189: return "cellRtcSetTime_t"; - case 0xc2d8cf95: return "cellRtcGetDayOfWeek"; - case 0xc48d5002: return "cellRtcConvertUtcToLocalTime"; - case 0xc5bc0fac: return "cellRtcParseDateTime"; - case 0xc7bdb7eb: return "cellRtcGetTick"; - case 0xcb90c761: return "cellRtcGetTime_t"; - case 0xccce71bd: return "cellRtcTickAddSeconds"; - case 0xcf11c3d6: return "cellRtcParseRfc3339"; - case 0xd41d3bd2: return "cellRtcTickAddHours"; - case 0xd9c0b463: return "cellRtcFormatRfc3339"; - case 0xdfff32cf: return "cellRtcGetDosTime"; - case 0xe0ecbb45: return "cellRtcTickAddMonths"; - case 0xe7086f05: return "cellRtcGetWin32FileTime"; - case 0xf8509925: return "cellRtcTickAddMicroseconds"; - case 0xfb51fc61: return "cellRtcCompareTick"; - case 0x2cde989f: return "cellRudpGetSizeReadable"; - case 0x384ba777: return "cellRudpSetOption"; - case 0x48c001b0: return "cellRudpWrite"; - case 0x48d3eeac: return "cellRudpTerminate"; - case 0x54f81789: return "cellRudpSetMaxSegmentSize"; - case 0x576831ae: return "cellRudpGetRemoteInfo"; - case 0x63f63545: return "cellRudpInit"; - case 0x6bc587e9: return "cellRudpPollCreate"; - case 0x6c0cff03: return "cellRudpEnableInternalIOThread"; - case 0x6ee04954: return "cellRudpNetReceived"; - case 0x74bfad12: return "cellRudpGetContextStatus"; - case 0x7dadc739: return "cellRudpCreateContext"; - case 0x7ed95e60: return "cellRudpSetEventHandler"; - case 0x8ac398f1: return "cellRudpPollDestroy"; - case 0x92e4d899: return "cellRudpRead"; - case 0xa3db855c: return "cellRudpPollControl"; - case 0xa70737da: return "cellRudpFlush"; - case 0xa86b28e3: return "cellRudpGetSizeWritable"; - case 0xb6bcb4a1: return "cellRudpEnd"; - case 0xc1ad7ced: return "cellRudpActivate"; - case 0xc407844f: return "cellRudpInitiate"; - case 0xcd1a3f23: return "cellRudpGetStatus"; - case 0xd666931f: return "cellRudpGetLocalInfo"; - case 0xd8310700: return "cellRudpPollWait"; - case 0xee41e16a: return "cellRudpBind"; - case 0xfade48b2: return "cellRudpProcessEvents"; - case 0xfbf7e9e4: return "cellRudpGetMaxSegmentSize"; - case 0xff9d259c: return "cellRudpGetOption"; - case 0x018281a8: return "cellSailGraphicsAdapterGetFrame2"; - case 0x0247c69e: return "cellSailGraphicsAdapterGetFrame"; - case 0x025b4974: return "cellSailPlayerUnregisterSource"; - case 0x06dd4174: return "cellSailRendererAudioFinalize"; - case 0x07924359: return "cellSailPlayerCloseEsVideo"; - case 0x09de25fd: return "cellSailPlayerIsEsAudioMuted"; - case 0x0abb318b: return "cellSailDescriptorCreateDatabase"; - case 0x0c4cb439: return "cellSailFutureReset"; - case 0x0d0c2f0c: return "cellSailDescriptorSetEs"; - case 0x10298371: return "cellSailAviMovieGetHeader"; - case 0x1139a206: return "cellSailPlayerSetSoundAdapter"; - case 0x145f9b11: return "cellSailPlayerOpenEsAudio"; - case 0x15fd6a2a: return "cellSailDescriptorClose"; - case 0x17932b26: return "cellSailPlayerInitialize"; - case 0x186b98d3: return "cellSailPlayerGetRegisteredProtocols"; - case 0x1872331b: return "cellSailGraphicsAdapterPtsToTimePosition"; - case 0x18b4629d: return "cellSailPlayerFinalize"; - case 0x18bcd21b: return "cellSailPlayerSetGraphicsAdapter"; - case 0x1c983864: return "cellSailGraphicsAdapterInitialize"; - case 0x1c9d5e5a: return "cellSailSoundAdapterSetPreferredFormat"; - case 0x23654375: return "cellSailPlayerInitialize2"; - case 0x26563ddc: return "cellSailPlayerNext"; - case 0x277adf21: return "cellSailDescriptorIsAutoSelection"; - case 0x28336e89: return "cellSailDescriptorDestroyDatabase"; - case 0x2e3ccb5e: return "cellSailGraphicsAdapterSetPreferredFormat"; - case 0x325039b9: return "cellSailRendererAudioNotifyOutputEos"; - case 0x346ebba3: return "cellSailMemAllocatorInitialize"; - case 0x34ecc1b9: return "cellSailPlayerOpenStream"; - case 0x38144ecf: return "cellSailPlayerGetRepeatMode"; - case 0x3a1132ed: return "cellSailAuReceiverGet"; - case 0x3a2d806c: return "cellSailFutureGet"; - case 0x3d0d3b72: return "cellSailSoundAdapterInitialize"; - case 0x3dd9639a: return "cellSailAuReceiverInitialize"; - case 0x3df98d41: return "cellSailSourceNotifyOpenCompleted"; - case 0x3e908c56: return "cellSailAviMovieGetStreamByIndex"; - case 0x44a20e79: return "cellSailGraphicsAdapterUpdateAvSync"; - case 0x47055fea: return "cellSailRendererVideoFinalize"; - case 0x47632810: return "cellSailPlayerReplaceEventHandler"; - case 0x477501f6: return "cellSailPlayerOpenEsVideo"; - case 0x4ae979df: return "cellSailSoundAdapterPtsToTimePosition"; - case 0x4c191088: return "cellSailDescriptorGetUri"; - case 0x4cc54f8e: return "cellSailFutureInitialize"; - case 0x4fa5ad09: return "cellSailPlayerReopenEsAudio"; - case 0x51ecf361: return "cellSailFutureIsDone"; - case 0x54c53688: return "cellSailSourceNotifyInputEos"; - case 0x5783a454: return "cellSailMp4MovieGetMovieInfo"; - case 0x5f44f64f: return "cellSailMp4TrackGetTrackReference"; - case 0x5f77e8df: return "cellSailRendererVideoNotifyFrameDone"; - case 0x5f7c7a6f: return "cellSailPlayerSetParameter"; - case 0x5faf802b: return "cellSailMp4MovieGetTrackByIndex"; - case 0x640c7278: return "cellSailSourceNotifyStartCompleted"; - case 0x67b4d01f: return "cellSailRendererAudioInitialize"; - case 0x69793952: return "cellSailPlayerUnsubscribeEvent"; - case 0x6e83f5c0: return "cellSailAviMovieGetMovieInfo"; - case 0x6f0b1002: return "cellSailPlayerSubscribeEvent"; - case 0x72236ec1: return "cellSailMp4TrackGetTrackReferenceCount"; - case 0x7473970a: return "cellSailSourceNotifyStopCompleted"; - case 0x752f8585: return "cellSailPlayerGetDescriptorCount"; - case 0x75fca288: return "cellSailPlayerGetCurrentDescriptor"; - case 0x76488bb1: return "cellSailGraphicsAdapterFinalize"; - case 0x764ec2d2: return "cellSailSourceNotifyCallCompleted"; - case 0x76b1a425: return "cellSailDescriptorSetAutoSelection"; - case 0x7b6fa92e: return "cellSailPlayerReopenEsUser"; - case 0x7c8dff3b: return "cellSailPlayerAddDescriptor"; - case 0x7eb8d6b5: return "cellSailSoundAdapterGetFrame"; - case 0x85b07126: return "cellSailMp4MovieGetTrackById"; - case 0x85beffcc: return "cellSailPlayerCloseStream"; - case 0x8d1ff475: return "cellSailRendererVideoInitialize"; - case 0x91d287f6: return "cellSailPlayerSetEsAudioMuted"; - case 0x92590d52: return "cellSailDescriptorInquireCapability"; - case 0x92eaf6ca: return "cellSailPlayerSetRendererAudio"; - case 0x946ecca0: return "cellSailSourceNotifyReadCompleted"; - case 0x950d53c1: return "cellSailPlayerCancel"; - case 0x952269c9: return "cellSailPlayerGetParameter"; - case 0x954f48f8: return "cellSailRendererVideoNotifyCallCompleted"; - case 0x9553af65: return "cellSailFutureFinalize"; - case 0x95ee1695: return "cellSailSourceNotifyStreamOut"; - case 0x9897fbd1: return "cellSailPlayerRemoveDescriptor"; - case 0x9d30bdce: return "cellSailSourceInitialize"; - case 0xa37fed15: return "cellSailFutureSet"; - case 0xa48be428: return "cellSailMp4TrackGetTrackInfo"; - case 0xa849d0a7: return "cellSailPlayerOpenEsUser"; - case 0xaafa17b8: return "cellSailPlayerIsPaused"; - case 0xac9c3b1f: return "cellSailDescriptorGetCapabilities"; - case 0xaed9d6cd: return "cellSailPlayerCloseEsUser"; - case 0xb7b4ecee: return "cellSailRendererAudioNotifyCallCompleted"; - case 0xb980b76e: return "cellSailMp4MovieGetBrand"; - case 0xbd1635f4: return "cellSailDescriptorGetMediaInfo"; - case 0xbdb2251a: return "cellSailSourceSetDiagHandler"; - case 0xbdf21b0f: return "cellSailPlayerBoot"; - case 0xbedccc74: return "cellSailPlayerRegisterSource"; - case 0xbf9b8d72: return "cellSailPlayerCloseEsAudio"; - case 0xc044fab1: return "cellSailDescriptorOpen"; - case 0xc09e2f23: return "cellSailAviStreamGetMediaType"; - case 0xc2d90ec9: return "cellSailMp4MovieGetTrackByTypeAndIndex"; - case 0xc457b203: return "cellSailSourceNotifyCloseCompleted"; - case 0xcc3cca60: return "cellSailAviStreamGetHeader"; - case 0xcc987ba6: return "cellSailPlayerDumpImage"; - case 0xd1462438: return "cellSailSoundAdapterFinalize"; - case 0xd1d55a90: return "cellSailPlayerSetPaused"; - case 0xd4049de0: return "cellSailMp4MovieIsCompatibleBrand"; - case 0xd5f9a15b: return "cellSailDescriptorGetStreamType"; - case 0xd7938b8d: return "cellSailPlayerCreateDescriptor"; - case 0xdbe32ed4: return "cellSailPlayerIsEsVideoMuted"; - case 0xddebd2a5: return "cellSailAviMovieGetStreamByTypeAndIndex"; - case 0xdf5553ef: return "cellSailDescriptorClearEs"; - case 0xdff1cda2: return "cellSailRendererVideoNotifyOutputEos"; - case 0xe535b0d3: return "cellSailPlayerStart"; - case 0xeba8d4ec: return "cellSailPlayerStop"; - case 0xecf56150: return "cellSailPlayerSetRendererVideo"; - case 0xed58e3ec: return "cellSailAuReceiverFinalize"; - case 0xee724c99: return "cellSailSourceFinalize"; - case 0xee94b99b: return "cellSailDescriptorSetParameter"; - case 0xeec22809: return "cellSailSoundAdapterUpdateAvSync"; - case 0xf1446a40: return "cellSailPlayerSetEsVideoMuted"; - case 0xf25f197d: return "cellSailSoundAdapterGetFormat"; - case 0xf289f0cd: return "cellSailSourceNotifySessionError"; - case 0xf4009a94: return "cellSailSourceNotifyMediaStateChanged"; - case 0xf5747e1f: return "cellSailPlayerSetAuReceiver"; - case 0xf60a8a69: return "cellSailPlayerReopenEsVideo"; - case 0xf841a537: return "cellSailRendererAudioNotifyFrameDone"; - case 0xfc5baf8a: return "cellSailPlayerSetRepeatMode"; - case 0xfc839bd4: return "cellSailPlayerDestroyDescriptor"; - case 0xffd58aa4: return "cellSailGraphicsAdapterGetFormat"; - case 0x0a3ea2a9: return "cellSailRecorderSetParameter"; - case 0x10c81457: return "cellSailRecorderOpenStream"; - case 0x1422a425: return "cellSailProfileSetEsVideoParameter"; - case 0x18ecc741: return "cellSailRecorderStop"; - case 0x376c3926: return "cellSailRecorderDestroyProfile"; - case 0x37aad85f: return "cellSailRecorderDumpImage"; - case 0x3c775cea: return "cellSailFeederAudioNotifyFrameOut"; - case 0x3deae857: return "cellSailRecorderSetFeederAudio"; - case 0x455c4709: return "cellSailRecorderDestroyVideoConverter"; - case 0x4830faf8: return "cellSailRecorderStart"; - case 0x49476a3d: return "cellSailRecorderCreateVideoConverter"; - case 0x4fec43a9: return "cellSailRecorderSetFeederVideo"; - case 0x50affdc1: return "cellSailRecorderCreateProfile"; - case 0x57415dd3: return "cellSailFeederVideoInitialize"; - case 0x7a52bf69: return "cellSailRecorderInitialize"; - case 0x81bfeae8: return "cellSailFeederVideoFinalize"; - case 0x855da8c6: return "cellSailVideoConverterProcess"; - case 0x86cae679: return "cellSailFeederVideoNotifySessionError"; - case 0x899d1587: return "cellSailFeederAudioFinalize"; - case 0x999c0dc5: return "cellSailFeederAudioNotifySessionEnd"; - case 0xaf310ae6: return "cellSailFeederAudioNotifySessionError"; - case 0xb3d30b0d: return "cellSailVideoConverterCanProcess"; - case 0xbd591197: return "cellSailFeederAudioInitialize"; - case 0xbff6e8d3: return "cellSailFeederVideoNotifySessionEnd"; - case 0xc2e2f30d: return "cellSailFeederAudioNotifyCallCompleted"; - case 0xc4617ddc: return "cellSailRecorderBoot"; - case 0xd37fb694: return "cellSailRecorderCancel"; - case 0xd84daeb9: return "cellSailFeederVideoNotifyCallCompleted"; - case 0xe14cae97: return "cellSailProfileSetEsAudioParameter"; - case 0xe15679fe: return "cellSailVideoConverterGetResult"; - case 0xe16de678: return "cellSailVideoConverterCanGetResult"; - case 0xe3f56f62: return "cellSailRecorderCloseStream"; - case 0xe5e0572a: return "cellSailFeederVideoNotifyFrameOut"; - case 0xe8d86c43: return "cellSailProfileSetStreamParameter"; - case 0xf57d74e3: return "cellSailRecorderFinalize"; - case 0xff20157b: return "cellSailRecorderGetParameter"; - case 0x04c06fc2: return "cellSaveDataGetListItem"; - case 0x273d116a: return "cellSaveDataUserListExport"; - case 0x27cb8bc2: return "cellSaveDataListDelete"; - case 0x39d6ee43: return "cellSaveDataUserListImport"; - case 0x46a2d878: return "cellSaveDataFixedExport"; - case 0x491cc554: return "cellSaveDataListExport"; - case 0x52541151: return "cellSaveDataFixedImport"; - case 0x529231b0: return "cellSaveDataUserFixedImport"; - case 0x6b4e0de6: return "cellSaveDataListImport"; - case 0x7048a9ba: return "cellSaveDataUserListDelete"; - case 0x95ae2cde: return "cellSaveDataUserFixedExport"; - case 0xf6482036: return "cellSaveDataUserGetListItem"; - case 0x7a9c2243: return "cellScreenShotSetOverlayImage"; - case 0x9e33ab8f: return "cellScreenShotEnable"; - case 0xd3ad63e4: return "cellScreenShotSetParameter"; - case 0xfc6f4e74: return "cellScreenShotDisable"; - case 0x025ce169: return "cellSearchGetMusicSelectionContext"; - case 0x0591826f: return "cellSearchStartContentSearch"; - case 0x0a4c8295: return "cellSearchStartListSearch"; - case 0x13524faa: return "cellSearchStartSceneSearch"; - case 0x35cda406: return "cellSearchGetContentInfoDeveloperData"; - case 0x37b5ba0c: return "cellSearchGetContentInfoPathMovieThumb"; - case 0x3b210319: return "cellSearchGetContentInfoByOffset"; - case 0x540d9068: return "cellSearchGetOffsetByContentId"; - case 0x64fb0b76: return "cellSearchStartContentSearchInList"; - case 0x774033d6: return "cellSearchEnd"; - case 0x8fe376a6: return "cellSearchCancel"; - case 0x94e21701: return "cellSearchGetContentIdByOffset"; - case 0x9663a44b: return "cellSearchGetContentInfoByContentId"; - case 0xbfab7616: return "cellSearchFinalize"; - case 0xc0ed0522: return "cellSearchStartSceneSearchInVideo"; - case 0xc81ccf8a: return "cellSearchInitialize"; - case 0xd7a7a433: return "cellSearchGetContentInfoGameComment"; - case 0xe73cb0d2: return "cellSearchPrepareFile"; - case 0xed20e079: return "cellSearchGetMusicSelectionContextOfSingleTrack"; - case 0xffb28491: return "cellSearchGetContentInfoPath"; - case 0x2452679f: return "cellKeySheapMutexDelete"; - case 0x3478e1e6: return "cellKeySheapMutexNew"; - case 0x37968718: return "cellSheapQueryMax"; - case 0x4a5b9659: return "cellKeySheapBufferNew"; - case 0x4b1383fb: return "cellSheapAllocate"; - case 0x5c5994bd: return "cellSheapFree"; - case 0x69a5861d: return "cellKeySheapSemaphoreNew"; - case 0x73a45cf8: return "cellKeySheapSemaphoreDelete"; - case 0x79a6abd0: return "cellKeySheapQueueDelete"; - case 0x7fa23275: return "cellSheapQueryFree"; - case 0x987e260e: return "cellKeySheapQueueNew"; - case 0xa1b25841: return "cellKeySheapInitialize"; - case 0xbbb47cd8: return "cellSheapInitialize"; - case 0xe6b37362: return "cellKeySheapBufferDelete"; - case 0xe897c835: return "cellKeySheapBarrierNew"; - case 0xed136702: return "cellKeySheapRwmDelete"; - case 0xf01ac471: return "cellKeySheapRwmNew"; - case 0xf6f5fbca: return "cellKeySheapBarrierDelete"; - case 0x3fbcf1d6: return "cellSpudllHandleConfigSetDefaultValues"; - case 0xcccd3257: return "cellSpudllGetImageSize"; - case 0x00af2519: return "cellSpursJobGuardReset"; - case 0x011ee38b: return "_cellSpursLFQueueInitialize"; - case 0x039d70b7: return "cellSpursQueueDetachLv2EventQueue"; - case 0x07529113: return "cellSpursAttributeSetNamePrefix"; - case 0x082bfb09: return "_cellSpursQueueInitialize"; - case 0x0eb4bc38: return "cellSpursWorkloadAttributeSetShutdownCompletionEventHook"; - case 0x1051d134: return "cellSpursAttributeEnableSpuPrintfIfAvailable"; - case 0x13ae18f3: return "cellSpursTaskExitCodeGet"; - case 0x161da6a7: return "cellSpursJobChainGetError"; - case 0x16394a4e: return "_cellSpursTasksetAttributeInitialize"; - case 0x1656d49f: return "cellSpursLFQueueAttachLv2EventQueue"; - case 0x17001000: return "cellSpursAddUrgentCommand"; - case 0x182d9890: return "cellSpursRequestIdleSpu"; - case 0x1d2bca4b: return "cellSpursSendWorkloadSignal"; - case 0x1d344406: return "cellSpursTaskGetLoadableSegmentPattern"; - case 0x1d46fedf: return "cellSpursCreateTaskWithAttribute"; - case 0x1ebcf459: return "cellSpursDestroyTaskset2"; - case 0x1f402f8f: return "cellSpursGetInfo"; - case 0x2093252b: return "cellSpursQueueGetTasksetAddress"; - case 0x22aab31d: return "cellSpursEventFlagDetachLv2EventQueue"; - case 0x247414d0: return "cellSpursQueueClear"; - case 0x2cfccb99: return "cellSpursJobChainAttributeSetJobTypeMemoryCheck"; - case 0x2ddbcc0a: return "_cellSpursWorkloadFlagReceiver2"; - case 0x2edcff92: return "cellSpursTasksetSetExceptionEventHandler"; - case 0x303c19cd: return "cellSpursCreateJobChainWithAttribute"; - case 0x30aa96c4: return "cellSpursInitializeWithAttribute2"; - case 0x32b94add: return "cellSpursEnableExceptionEventHandler"; - case 0x34552fa6: return "cellSpursTaskExitCodeInitialize"; - case 0x3548f483: return "_cellSpursJobChainAttributeInitialize"; - case 0x35dae22b: return "_cellSpursLFQueuePopBody"; - case 0x35f02287: return "cellSpursQueueDepth"; - case 0x369fe03d: return "cellSpursQueueGetEntrySize"; - case 0x373523d4: return "cellSpursEventFlagWait"; - case 0x39c173fb: return "cellSpursGetSpuThreadGroupId"; - case 0x494613c7: return "cellSpursJobChainGetSpursAddress"; - case 0x49a3426d: return "cellSpursReadyCountSwap"; - case 0x4a5eab63: return "cellSpursWorkloadAttributeSetName"; - case 0x4a6465e3: return "cellSpursCreateTaskset2"; - case 0x4ac7bae4: return "cellSpursEventFlagClear"; - case 0x4c75deb8: return "cellSpursUnsetExceptionEventHandler"; - case 0x4cce88a9: return "cellSpursLookUpTasksetAddress"; - case 0x4ceb9694: return "cellSpursGetJobChainInfo"; - case 0x4d1e9373: return "cellSpursEventFlagGetClearMode"; - case 0x4de203e2: return "cellSpursSetPreemptionVictimHints"; - case 0x4e153e3e: return "cellSpursGetWorkloadInfo"; - case 0x4e66d483: return "cellSpursDetachLv2EventQueue"; - case 0x5202e53b: return "cellSpursJobChainSetExceptionEventHandler"; - case 0x52cc6c82: return "cellSpursCreateTaskset"; - case 0x54876603: return "cellSpursQueueSize"; - case 0x568b2352: return "cellSpursSemaphoreGetTasksetAddress"; - case 0x569674e3: return "cellSpursTraceInitialize"; - case 0x57e4dec3: return "cellSpursRemoveWorkload"; - case 0x58d58fcf: return "cellSpursTasksetGetSpursAddress"; - case 0x5ef96465: return "_cellSpursEventFlagInitialize"; - case 0x5fd43fe4: return "cellSpursWaitForWorkloadShutdown"; - case 0x60eb2dec: return "cellSpursCreateJobChain"; - case 0x652b70e2: return "cellSpursTasksetAttributeSetName"; - case 0x68aaeba9: return "cellSpursJobGuardInitialize"; - case 0x69726aa2: return "cellSpursAddWorkload"; - case 0x6aa76999: return "cellSpursJobChainUnsetExceptionEventHandler"; - case 0x6c960f6d: return "cellSpursGetSpuThreadId"; - case 0x6d2d9339: return "cellSpursEventFlagTryWait"; - case 0x6fcdf6e3: return "cellSpursGetSpuGuid"; - case 0x738e40e6: return "cellSpursShutdownJobChain"; - case 0x73e06f91: return "cellSpursLFQueueDetachLv2EventQueue"; - case 0x7517724a: return "cellSpursSetGlobalExceptionEventHandler"; - case 0x75211196: return "cellSpursReadyCountAdd"; - case 0x77cdac0c: return "_cellSpursSemaphoreInitialize"; - case 0x7b9cbb74: return "cellSpursTraceFinalize"; - case 0x7cb33c2e: return "cellSpursTaskGetReadOnlyAreaPattern"; - case 0x7e4ea023: return "cellSpursWakeUp"; - case 0x7fdf4fef: return "cellSpursBarrierInitialize"; - case 0x80a29e27: return "cellSpursSetPriorities"; - case 0x82275c1c: return "cellSpursAttributeSetMemoryContainerForSpuThread"; - case 0x838fa4f0: return "cellSpursTryJoinTask2"; - case 0x84d2f6d5: return "cellSpursSetMaxContention"; - case 0x861237f8: return "cellSpursUnsetGlobalExceptionEventHandler"; - case 0x86c864a2: return "cellSpursGetJobChainId"; - case 0x87630976: return "cellSpursEventFlagAttachLv2EventQueue"; - case 0x890f9e5a: return "cellSpursEventFlagGetDirection"; - case 0x8a85674d: return "_cellSpursLFQueuePushBody"; - case 0x8adadf65: return "_cellSpursTaskAttribute2Initialize"; - case 0x8f122ef8: return "cellSpursTasksetAttributeSetTasksetSize"; - case 0x8fdf50b2: return "cellSpursAddUrgentCall"; - case 0x9034e538: return "cellSpursTaskGetContextSaveAreaSize"; - case 0x91066667: return "cellSpursQueuePopBody"; - case 0x9197915f: return "cellSpursTaskGenerateLsPattern"; - case 0x92cff6ed: return "cellSpursQueuePushBody"; - case 0x94034c95: return "cellSpursTasksetUnsetExceptionEventHandler"; - case 0x947efb0b: return "cellSpursEventFlagGetTasksetAddress"; - case 0x95180230: return "_cellSpursAttributeInitialize"; - case 0x97a2f6c8: return "cellSpursJobHeaderSetJobbin2Param"; - case 0x98d5b343: return "cellSpursShutdownWorkload"; - case 0x9aeb5432: return "cellSpursBarrierGetTasksetAddress"; - case 0x9dcbcb5d: return "cellSpursAttributeEnableSystemWorkload"; - case 0x9f72add3: return "cellSpursJoinTaskset"; - case 0x9fcb567b: return "cellSpursGetTasksetInfo"; - case 0x9fef70c2: return "cellSpursJobChainAttributeSetName"; - case 0xa121a224: return "cellSpursTaskAttributeSetExitCodeContainer"; - case 0xa73bf47e: return "_cellSpursWorkloadFlagReceiver"; - case 0xa789e631: return "cellSpursShutdownTaskset"; - case 0xa7a94892: return "cellSpursJoinTask2"; - case 0xa7c066de: return "cellSpursJoinJobChain"; - case 0xa7f9e716: return "cellSpursGetWorkloadData"; - case 0xa839a4d9: return "cellSpursAttributeSetSpuThreadGroupType"; - case 0xaa6269a8: return "cellSpursInitializeWithAttribute"; - case 0xacfc8dbc: return "cellSpursInitialize"; - case 0xb792ca1a: return "cellSpursLFQueueGetTasksetAddress"; - case 0xb8474eff: return "_cellSpursTaskAttributeInitialize"; - case 0xb9bc6207: return "cellSpursAttachLv2EventQueue"; - case 0xbb68d76e: return "cellSpursJobChainAttributeSetHaltOnError"; - case 0xbeb600ac: return "cellSpursCreateTask"; - case 0xbfea60fa: return "cellSpursKickJobChain"; - case 0xc0158d8b: return "cellSpursAddWorkloadWithAttribute"; - case 0xc10931cb: return "cellSpursCreateTasksetWithAttribute"; - case 0xc2acdf43: return "_cellSpursTasksetAttribute2Initialize"; - case 0xc56defb5: return "cellSpursGetNumSpuThread"; - case 0xc765b995: return "cellSpursGetWorkloadFlag"; - case 0xca4c4600: return "cellSpursFinalize"; - case 0xce853fbf: return "cellSpursTraceStart"; - case 0xd2e23fa9: return "cellSpursSetExceptionEventHandler"; - case 0xd5d0b256: return "cellSpursJobGuardNotify"; - case 0xd86380d8: return "cellSpursGetJobPipelineInfo"; - case 0xdca13593: return "cellSpursTasksetAttributeEnableClearLS"; - case 0xddc81b5a: return "cellSpursTraceStop"; - case 0xe0a6dbe4: return "_cellSpursSendSignal"; - case 0xe14ca62d: return "cellSpursCreateTask2"; - case 0xe4944a1c: return "cellSpursCreateTask2WithBinInfo"; - case 0xe5443be7: return "cellSpursQueueAttachLv2EventQueue"; - case 0xe717ac73: return "cellSpursTaskExitCodeTryGet"; - case 0xe7b0e69a: return "cellSpursJobSetMaxGrab"; - case 0xe7dd87e1: return "cellSpursGetTasksetId"; - case 0xec68442c: return "cellSpursQueueGetDirection"; - case 0xefeb2679: return "_cellSpursWorkloadAttributeInitialize"; - case 0xf1d3552d: return "cellSpursReadyCountCompareAndSwap"; - case 0xf31731bb: return "cellSpursRunJobChain"; - case 0xf5507729: return "cellSpursEventFlagSet"; - case 0xf843818d: return "cellSpursReadyCountStore"; - case 0x01bbf2e0: return "cellSpursJobQueueGetSpurs"; - case 0x0582338a: return "cellSpursJobQueueAttributeSetDoBusyWaiting"; - case 0x0d69929e: return "_cellSpursJobQueueAllocateJobDescriptorBody"; - case 0x0f03f712: return "cellSpursJobQueueAttributeSetSubmitWithEntryLock"; - case 0x13671514: return "cellSpursJobQueueSetWaitingMode"; - case 0x15934401: return "cellSpursJobQueueGetSuspendedJobSize"; - case 0x1686957e: return "cellSpursJobQueueAttributeSetMaxSizeJobDescriptor"; - case 0x1917359d: return "_cellSpursJobQueuePortCopyPushJobBody"; - case 0x1b6eea7e: return "_cellSpursJobQueuePortPushJobListBody"; - case 0x1da890c7: return "_cellSpursJobQueuePushAndReleaseJobBody"; - case 0x26fa81b4: return "cellSpursJobQueuePortFinalize"; - case 0x29c2acc5: return "cellSpursJobQueueClose"; - case 0x2e775550: return "cellSpursJobQueueGetError"; - case 0x36d0a53c: return "_cellSpursJobQueuePushJob2Body"; - case 0x3d1294fc: return "cellSpursJobQueuePortInitialize"; - case 0x435bff07: return "cellSpursJobQueuePort2GetJobQueue"; - case 0x43ddab4f: return "cellSpursJobQueueAttributeInitialize"; - case 0x46c3fb5a: return "_cellSpursJobQueuePortCopyPushBody"; - case 0x4e1a17a6: return "_cellSpursJobQueuePortPushBody"; - case 0x5659da82: return "cellSpursJobQueueGetMaxSizeJobDescriptor"; - case 0x5fb9b05d: return "cellSpursJobQueueAttributeSetMaxGrab"; - case 0x634b1502: return "cellSpursJobQueuePortSync"; - case 0x677027af: return "cellSpursJobQueueSemaphoreInitialize"; - case 0x6c93ea18: return "cellSpursJobQueueSemaphoreAcquire"; - case 0x701fd8a9: return "_cellSpursJobQueuePushSync"; - case 0x742cec0d: return "cellSpursJobQueueAttributeSetIsJobTypeMemoryCheck"; - case 0x80a0264c: return "cellSpursJobQueuePortTrySync"; - case 0x840c5239: return "cellSpursJobQueueGetHandleCount"; - case 0x85cd04cd: return "_cellSpursJobQueuePortPushJobBody"; - case 0x8c97a96c: return "cellSpursShutdownJobQueue"; - case 0x8ce4cffa: return "cellSpursJoinJobQueue"; - case 0x90c88f84: return "cellSpursJobQueuePortGetJobQueue"; - case 0x90e392cf: return "_cellSpursJobQueuePortPushJobBody2"; - case 0x915455b3: return "cellSpursJobQueueSendSignal"; - case 0x93248b92: return "cellSpursJobQueueUnsetExceptionEventHandler"; - case 0x934abb00: return "cellSpursJobQueuePort2AllocateJobDescriptor"; - case 0x9396be1d: return "_cellSpursJobQueuePortPushSync"; - case 0x97409f67: return "cellSpursJobQueueSemaphoreTryAcquire"; - case 0x98203e3c: return "_cellSpursJobQueuePushJobBody2"; - case 0x983be7fc: return "_cellSpursCreateJobQueueWithJobDescriptorPool"; - case 0x99316997: return "_cellSpursJobQueuePushBody"; - case 0x9c300489: return "cellSpursJobQueueSetExceptionEventHandler"; - case 0xaf1c7a1d: return "_cellSpursJobQueuePushJobListBody"; - case 0xb53436e7: return "_cellSpursJobQueuePort2PushJobListBody"; - case 0xbd1c5d6b: return "_cellSpursJobQueuePortPushFlush"; - case 0xbfea28ab: return "cellSpursJobQueuePort2PushFlush"; - case 0xc343ee10: return "cellSpursGetJobQueueId"; - case 0xc39173a4: return "_cellSpursJobQueuePort2CopyPushJobBody"; - case 0xc4843b74: return "_cellSpursJobQueuePushJobBody"; - case 0xc485d207: return "cellSpursJobQueuePort2Destroy"; - case 0xcf89f218: return "_cellSpursJobQueuePort2PushJobBody"; - case 0xdf0120c2: return "_cellSpursJobQueuePushFlush"; - case 0xe1731df3: return "_cellSpursJobQueuePort2PushAndReleaseJobBody"; - case 0xe70f874e: return "cellSpursJobQueueAttributeSetGrabParameters"; - case 0xef66c4b7: return "_cellSpursJobQueuePortCopyPushJobBody2"; - case 0xf11fe0f1: return "cellSpursJobQueuePort2Create"; - case 0xf244e799: return "_cellSpursCreateJobQueue"; - case 0xf5de6363: return "cellSpursJobQueuePortInitializeWithDescriptorBuffer"; - case 0xfacb3ced: return "cellSpursJobQueuePort2Sync"; - case 0xfc526b72: return "cellSpursJobQueuePort2PushSync"; - case 0xff03cc79: return "cellSpursJobQueueAttributeSetIsHaltOnError"; - case 0xff7a7bd2: return "cellSpursJobQueueOpen"; - case 0x006c4900: return "cellSslCertGetNameEntryInfo"; - case 0x033c4905: return "cellSslCertGetRsaPublicKeyExponent"; - case 0x1650aea4: return "cellSslEnd"; - case 0x218b64da: return "cellSslCertGetNotAfter"; - case 0x31d9ba8d: return "cellSslCertGetNotBefore"; - case 0x32c61bdf: return "cellSslCertGetSubjectName"; - case 0x571afaca: return "cellSslCertificateLoader"; - case 0x5e9253ca: return "cellSslCertGetMd5Fingerprint"; - case 0x766d3ca1: return "cellSslCertGetNameEntryCount"; - case 0x7b689ebc: return "cellSslCertGetSerialNumber"; - case 0x8e505175: return "cellSslCertGetRsaPublicKeyModulus"; - case 0xae6eb491: return "cellSslCertGetIssuerName"; - case 0xf8206492: return "cellSslCertGetPublicKey"; - case 0xfb02c9d2: return "cellSslInit"; - case 0x5468d6b0: return "cellSubDisplayAudioOutNonBlocking"; - case 0x551d80a5: return "cellSubDisplayEnd"; - case 0x6595ce22: return "cellSubDisplayGetRequiredMemory"; - case 0x6d85ddb3: return "cellSubDisplayStop"; - case 0x8a264d71: return "cellSubDisplayGetPeerNum"; - case 0x938ac642: return "cellSubDisplayGetVideoBuffer"; - case 0xa5bccb47: return "cellSubDisplayStart"; - case 0xaee1e0c2: return "cellSubDisplayAudioOutBlocking"; - case 0xe2485f79: return "cellSubDisplayGetPeerList"; - case 0xf9a7e8a5: return "cellSubDisplayInit"; - case 0x07254fda: return "cellSyncBarrierInitialize"; - case 0x0c7cb9f7: return "cellSyncLFQueueGetEntrySize"; - case 0x167ea63e: return "cellSyncLFQueueSize"; - case 0x1bb675c2: return "cellSyncMutexLock"; - case 0x268edd6d: return "cellSyncBarrierTryNotify"; - case 0x2af0c515: return "cellSyncLFQueueClear"; - case 0x35bbdad2: return "_cellSyncLFQueueCompletePushPointer2"; - case 0x35f21355: return "cellSyncBarrierWait"; - case 0x3929948d: return "cellSyncQueueInitialize"; - case 0x46356fe0: return "_cellSyncLFQueueGetPopPointer2"; - case 0x48154c9b: return "cellSyncQueuePeek"; - case 0x4da349b2: return "cellSyncQueueSize"; - case 0x4da6d7e0: return "cellSyncQueuePop"; - case 0x4e88c68d: return "_cellSyncLFQueueCompletePushPointer"; - case 0x54fc2032: return "_cellSyncLFQueueAttachLv2EventQueue"; - case 0x5ae841e5: return "cellSyncQueuePush"; - case 0x68af923c: return "cellSyncQueueTryPeek"; - case 0x6bb4ef9d: return "_cellSyncLFQueueGetPushPointer2"; - case 0x6c272124: return "cellSyncBarrierTryWait"; - case 0x705985cd: return "cellSyncQueueTryPush"; - case 0x74c37666: return "_cellSyncLFQueueGetPopPointer"; - case 0x7a51deee: return "_cellSyncLFQueueCompletePopPointer2"; - case 0x811d148e: return "_cellSyncLFQueueDetachLv2EventQueue"; - case 0x91f2b7b0: return "cellSyncMutexUnlock"; - case 0xa5362e73: return "cellSyncQueueClear"; - case 0xa58df87f: return "cellSyncQueueTryPop"; - case 0xa6669751: return "cellSyncRwmTryRead"; - case 0xa9072dee: return "cellSyncMutexInitialize"; - case 0xaa355278: return "cellSyncLFQueueInitialize"; - case 0xaff7627a: return "_cellSyncLFQueueGetSignalAddress"; - case 0xba5961ca: return "_cellSyncLFQueuePushBody"; - case 0xba5bee48: return "cellSyncRwmTryWrite"; - case 0xcece771f: return "cellSyncRwmRead"; - case 0xd06918c4: return "cellSyncMutexTryLock"; - case 0xd59aa307: return "cellSyncLFQueueGetDirection"; - case 0xe18c273c: return "cellSyncLFQueueDepth"; - case 0xe1bc7add: return "_cellSyncLFQueuePopBody"; - case 0xe9bf2110: return "_cellSyncLFQueueGetPushPointer"; - case 0xed773f5f: return "cellSyncRwmWrite"; - case 0xf06a6415: return "cellSyncBarrierNotify"; - case 0xfc48b03f: return "cellSyncRwmInitialize"; - case 0xfe74e8e7: return "_cellSyncLFQueueCompletePopPointer"; - case 0x0080fe88: return "cellSync2MutexUnlock"; - case 0x0c2983ac: return "cellSync2SemaphoreRelease"; - case 0x0c9a0ea9: return "cellSync2QueueTryPop"; - case 0x12f0a27d: return "cellSync2QueueGetSize"; - case 0x164843a7: return "cellSync2SemaphoreFinalize"; - case 0x27f2d61c: return "cellSync2MutexFinalize"; - case 0x2d77fe17: return "_cellSync2SemaphoreAttributeInitialize"; - case 0x4e2ee031: return "cellSync2SemaphoreGetCount"; - case 0x55836e73: return "_cellSync2MutexAttributeInitialize"; - case 0x58be9a0f: return "cellSync2CondInitialize"; - case 0x5b1e4d7a: return "cellSync2CondEstimateBufferSize"; - case 0x5e00d433: return "_cellSync2QueueAttributeInitialize"; - case 0x5e4b0f87: return "cellSync2SemaphoreTryAcquire"; - case 0x63062249: return "cellSync2CondFinalize"; - case 0x6af85cdf: return "cellSync2QueueFinalize"; - case 0x74c2780f: return "cellSync2SemaphoreEstimateBufferSize"; - case 0x7d967d91: return "cellSync2QueuePush"; - case 0x7fd479fe: return "cellSync2QueueTryPush"; - case 0x871af804: return "cellSync2CondSignal"; - case 0x8aae07c2: return "cellSync2CondSignalAll"; - case 0xa400d82e: return "cellSync2MutexLock"; - case 0xa69c749c: return "cellSync2MutexTryLock"; - case 0xbc96d751: return "cellSync2CondWait"; - case 0xc08cc0f9: return "cellSync2QueueEstimateBufferSize"; - case 0xc5dee254: return "cellSync2SemaphoreInitialize"; - case 0xd1b0d146: return "cellSync2SemaphoreAcquire"; - case 0xd51bfae7: return "cellSync2MutexEstimateBufferSize"; - case 0xd83ab0c9: return "cellSync2QueuePop"; - case 0xdf3c532a: return "_cellSync2CondAttributeInitialize"; - case 0xeb81a467: return "cellSync2MutexInitialize"; - case 0xf0e1471c: return "cellSync2QueueGetDepth"; - case 0xf125e044: return "cellSync2QueueInitialize"; - case 0x08db2adf: return "cellSysconfBtGetDeviceList"; - case 0x112a5ee9: return "cellSysmoduleUnloadModule"; - case 0x1ef115ef: return "cellSysmoduleGetImagesize"; - case 0x32267a31: return "cellSysmoduleLoadModule"; - case 0x3c92be09: return "cellSysmoduleFetchImage"; - case 0x5a59e258: return "cellSysmoduleIsLoaded"; - case 0x63ff6ff9: return "cellSysmoduleInitialize"; - case 0x96c07adf: return "cellSysmoduleFinalize"; - case 0xa193143c: return "cellSysmoduleSetMemcontainer"; - case 0x018a1381: return "cellSysutilAvcSetLayoutMode"; - case 0x01f04d94: return "cellSysutilGamePowerOff_I"; - case 0x02ff3c1b: return "cellSysutilUnregisterCallback"; - case 0x073b89d5: return "cellSysutilAvcGetSpeakerVolumeLevel"; - case 0x08269f37: return "cellSysutilAvcGetShowStatus"; - case 0x0bae8772: return "cellVideoOutConfigure"; - case 0x0c316b87: return "cellWebBrowserConfigGetHeapSize2"; - case 0x0e091c36: return "cellSaveDataUserListAutoSave"; - case 0x0f03cfb0: return "cellSaveDataUserListSave"; - case 0x0f8a3b6b: return "cellWebBrowserConfigSetMimeSet"; - case 0x10cabeff: return "cellWebBrowserGetUsrdataOnGameExit"; - case 0x15b0b0cd: return "cellVideoOutGetConfiguration"; - case 0x15df71ed: return "cellSysutilAvcLoadAsync"; - case 0x17dbe8b3: return "cellSysutilAvcJoinRequest"; - case 0x189a74da: return "cellSysutilCheckCallback"; - case 0x1a91874b: return "cellWebBrowserConfigSetFullScreen2"; - case 0x1d99c3ee: return "cellOskDialogGetInputText"; - case 0x1dfbfdd6: return "cellSaveDataListLoad2"; - case 0x1dfcce99: return "cellSysutilGameDataExit"; - case 0x1e7bff94: return "cellSysCacheMount"; - case 0x1e930eef: return "cellVideoOutGetDeviceInfo"; - case 0x1f6629e4: return "cellWebBrowserConfigSetErrorHook2"; - case 0x20543730: return "cellMsgDialogClose"; - case 0x21425307: return "cellSaveDataListAutoLoad"; - case 0x21fc0c71: return "cellGameUnregisterDiscChangeCallback"; - case 0x220894e3: return "cellSysutilEnableBgmPlayback"; - case 0x24644561: return "cellWebBrowserWakeupWithGameExit"; - case 0x248bd1d8: return "cellSaveDataUserListAutoLoad"; - case 0x27ac51e4: return "cellStorageDataImportMove"; - case 0x2a8eada2: return "cellSaveDataFixedLoad2"; - case 0x2a95d8bc: return "cellSysutilGameExit_I"; - case 0x2aae9ef5: return "cellSaveDataFixedSave2"; - case 0x2beac488: return "cellAudioOutGetSoundAvailability2"; - case 0x2dbc92c7: return "cellSysutilAvcShowPanel"; - case 0x2de0d663: return "cellSaveDataListSave2"; - case 0x30d3d12b: return "cellSysutilGameReboot_I"; - case 0x3261a9c8: return "cellWebBrowserConfigSetDisableTabs"; - case 0x35beade0: return "cellOskDialogGetSize"; - case 0x39dd8425: return "cellSaveDataUserListLoad"; - case 0x3d1e1931: return "cellOskDialogUnloadAsync"; - case 0x3dbd2314: return "cellSaveDataListSave"; - case 0x3e22cb4b: return "cellMsgDialogOpenErrorCode"; - case 0x4056c932: return "cellSysutilAvcSetVoiceMuting"; - case 0x40b34847: return "cellSaveDataUserFixedSave"; - case 0x40e895d3: return "cellSysutilGetSystemParamInt"; - case 0x41bc2ca1: return "cellSaveDataFixedSave"; - case 0x41f20828: return "cellOskDialogDisableDimmer"; - case 0x4692ab35: return "cellAudioOutConfigure"; - case 0x46a0285d: return "cellWebBrowserDeactivate"; - case 0x4b6e8560: return "cellWebBrowserCreateRenderWithRect2"; - case 0x4bdec82a: return "cellHddGameCheck2"; - case 0x4dd03a4e: return "cellSaveDataListAutoSave"; - case 0x50183b44: return "cellSaveDataFixedLoad"; - case 0x523a96c4: return "cellGameDataSetSystemVer"; - case 0x52aac4fa: return "cellSaveDataUserAutoSave"; - case 0x52d9457a: return "cellWebBrowserConfigSetFullVersion2"; - case 0x53e39df3: return "cellOskDialogSetSeparateWindowOption"; - case 0x55e425c3: return "cellVideoOutGetConvertCursorColorInfo"; - case 0x58c89c4a: return "cellWebBrowserEstimate"; - case 0x5e91bc26: return "cellSysutilAvcEnumPlayers"; - case 0x5ee3bc26: return "cellSysutilAvcGetVoiceMuting"; - case 0x60a4daab: return "cellWebBrowserConfigSetVersion"; - case 0x6144f033: return "cellWebComponentCreateAsync"; - case 0x619b1427: return "cellWebBrowserConfigSetTabCount2"; - case 0x62b0f803: return "cellMsgDialogAbort"; - case 0x68bc4ff3: return "cellAudioOutRegisterCallback"; - case 0x6c1082aa: return "cellWebBrowserConfigWithVer"; - case 0x6c673f78: return "cellSysutilAvcUnloadAsync"; - case 0x6cfd856f: return "cellSysutilGetBgmPlaybackStatus2"; - case 0x6d087930: return "cellWebBrowserEstimate2"; - case 0x6d7444e6: return "cellWebBrowserActivate"; - case 0x6dfff31d: return "cellWebBrowserSetSystemCallbackUsrdata"; - case 0x6e7264ed: return "cellSaveDataUserFixedLoad"; - case 0x71acb8d3: return "cellSysutilAvcSetVideoMuting"; - case 0x744c1544: return "cellSysCacheClear"; - case 0x749c9b5f: return "cellWebBrowserInitialize"; - case 0x75bbb672: return "cellVideoOutGetNumberOfDevice"; - case 0x7603d3db: return "cellMsgDialogOpen2"; - case 0x7663e368: return "cellAudioOutGetDeviceInfo"; - case 0x76948bfc: return "cellSysconfAbort"; - case 0x76fc8fb1: return "cellWebBrowserConfigSetHeapSize"; - case 0x7871bed4: return "cellVideoOutUnregisterCallback"; - case 0x7bc2c8a8: return "cellMsgDialogProgressBarReset"; - case 0x7d94ca36: return "cellSysutilAvcGetVideoMuting"; - case 0x7f21c918: return "cellOskDialogAddSupportLanguage"; - case 0x7f881be1: return "cellWebBrowserCreate"; - case 0x7f896a1f: return "cellWebBrowserConfigSetCustomExit"; - case 0x7fb3c6a5: return "cellWebBrowserConfig2"; - case 0x7fcfc915: return "cellOskDialogLoadAsync"; - case 0x83668b8e: return "cellWebBrowserConfig"; - case 0x887572d5: return "cellVideoOutGetState"; - case 0x8a4cb646: return "cellWebBrowserCreateWithConfig"; - case 0x8a5dbb58: return "cellWebComponentCreate"; - case 0x8b7ed64b: return "cellSaveDataAutoSave2"; - case 0x8b8a2f48: return "cellSaveDataUserFixedDelete"; - case 0x8e8bc444: return "cellVideoOutRegisterCallback"; - case 0x9117df20: return "cellHddGameCheck"; - case 0x918288fb: return "cellStorageDataImport"; - case 0x938013a0: return "cellSysutilGetSystemParamString"; - case 0x93c523c6: return "cellWebBrowserConfigSetNotifyHook2"; - case 0x93ced48d: return "cellWebBrowserShutdown"; - case 0x94862702: return "cellMsgDialogProgressBarInc"; - case 0x9949bf82: return "cellGameDataExitBroken"; - case 0x9997e6b6: return "cellSysutilGameDataAssignVmc"; - case 0x9c9fe6a4: return "cellWebBrowserConfigSetFunction"; - case 0x9ca9ffa7: return "cellHddGameSetSystemVer"; - case 0x9d6af72a: return "cellMsgDialogProgressBarSetMsg"; - case 0x9d98afa0: return "cellSysutilRegisterCallback"; - case 0x9dfdad46: return "cellAudioOutUnregisterCallback"; - case 0x9fb97b10: return "cellWebBrowserNavigate2"; - case 0xa11552f6: return "cellSysutilGetBgmPlaybackStatus"; - case 0xa322db75: return "cellVideoOutGetResolutionAvailability"; - case 0xa36335a5: return "cellSysutilDisableBgmPlaybackEx"; - case 0xa4dd11cc: return "cellWebBrowserConfigGetHeapSize"; - case 0xa4ed7dfe: return "cellSaveDataDelete"; - case 0xa58943f8: return "cellWebBrowserCreateWithRect2"; - case 0xa5f12145: return "cellWebBrowserCreate2"; - case 0xa9a439e0: return "cellWebBrowserConfigSetUnknownMIMETypeHook2"; - case 0xa9b0c1d9: return "cellGameDataGetSizeKB"; - case 0xa9b62ac8: return "cellWebBrowserConfigSetViewRect2"; - case 0xabc3cd2c: return "cellStorageDataExport"; - case 0xac16777e: return "cellWebBrowserConfigSetStatusHook2"; - case 0xac58ad2b: return "cellSysutilEnableBgmPlaybackEx"; - case 0xafd605b3: return "cellHddGameExitBroken"; - case 0xaffdadc0: return "cellSysutilAvcSetSpeakerVolumeLevel"; - case 0xb2b6cdd0: return "cellSysconfOpen"; - case 0xb53b3d42: return "cellWebBrowserCreateWithConfigFull"; - case 0xb53c54fa: return "cellOskDialogSetKeyLayoutOption"; - case 0xb6d84526: return "cellOskDialogAbort"; - case 0xb72bc4e6: return "cellDiscGameGetBootDiscInfo"; - case 0xbccd70dd: return "cellSysutilAvcCancelJoinRequest"; - case 0xbed85cb8: return "cellWebBrowserDestroy"; - case 0xc01b4e7c: return "cellAudioOutGetSoundAvailability"; - case 0xc22c79b5: return "cellSaveDataAutoLoad"; - case 0xc427890c: return "cellOskDialogSetInitialKeyLayout"; - case 0xc8971db5: return "cellWebBrowserSetLocalContentsAdditionalTitleID"; - case 0xc9645c41: return "cellGameDataCheckCreate2"; - case 0xc96e89e9: return "cellAudioOutSetCopyControl"; - case 0xcdc6aefd: return "cellSaveDataUserAutoLoad"; - case 0xced17573: return "cellSaveDataFixedDelete"; - case 0xcfdd8e87: return "cellSysutilDisableBgmPlayback"; - case 0xcfdf24bb: return "cellVideoOutDebugSetMonitorType"; - case 0xd3790a86: return "cellOskDialogSetDeviceMask"; - case 0xd7a617f5: return "cellWebBrowserConfigSetViewCondition2"; - case 0xd9ea5709: return "cellSysutilAvcHidePanel"; - case 0xdce51399: return "cellWebComponentDestroy"; - case 0xdfdd302e: return "cellDiscGameRegisterDiscChangeCallback"; - case 0xe22ed55d: return "cellWebBrowserConfigSetFunction2"; - case 0xe558748d: return "cellVideoOutGetResolution"; - case 0xe5e2b09d: return "cellAudioOutGetNumberOfDevice"; - case 0xe7951dee: return "cellGameDataCheckCreate"; - case 0xe7fa820b: return "cellSaveDataEnableOverlay"; - case 0xe8dee79c: return "cellWebBrowserDestroy2"; - case 0xeb9d78d8: return "cellSysutilAvcGetLayoutMode"; - case 0xeca938ca: return "cellSysutilAvcSetAttribute"; - case 0xed5d96af: return "cellAudioOutGetConfiguration"; - case 0xedadd797: return "cellSaveDataDelete2"; - case 0xedc34e1a: return "cellDiscGameUnregisterDiscChangeCallback"; - case 0xee7528f3: return "cellWebBrowserConfigSetRequestHook2"; - case 0xef5a353d: return "cellSaveDataListLoad"; - case 0xf0ec3ccc: return "cellOskDialogSetLayoutMode"; - case 0xf1a443e7: return "cellWebBrowserCreateRender2"; - case 0xf2c4a425: return "cellSysutilAvcByeRequest"; - case 0xf3b4b43e: return "cellOskDialogSetInitialInputDevice"; - case 0xf3dbf5a7: return "cellSysutilSetBgmPlaybackExtraParam"; - case 0xf481967f: return "cellSysutilAvcGetAttribute"; - case 0xf4aa8b27: return "cellSysutilAvcCancelByeRequest"; - case 0xf4e3caa0: return "cellAudioOutGetState"; - case 0xf8115d69: return "cellGameRegisterDiscChangeCallback"; - case 0xf81eca25: return "cellMsgDialogOpen"; - case 0xf82e2ef7: return "cellHddGameGetSizeKB"; - case 0xf8a175ec: return "cellSaveDataAutoSave"; - case 0xfbd5c856: return "cellSaveDataAutoLoad2"; - case 0xfe669845: return "cellWebBrowserConfigSetHeapSize2"; - case 0x3343824c: return "cellSysutilApOn"; - case 0x90c2bb19: return "cellSysutilApOff"; - case 0x9e67e0dd: return "cellSysutilApGetRequiredMemSize"; - case 0x02c5417a: return "cellSysutilAvc2GetPlayerInfo"; - case 0x02dc41ee: return "cellSysutilAvc2JoinChat"; - case 0x04e1e1e4: return "cellSysutilAvc2StopStreaming"; - case 0x07236c83: return "cellSysutilAvc2ChangeVideoResolution"; - case 0x0b45cd84: return "cellSysutilAvc2ShowScreen"; - case 0x0f5a2afb: return "cellSysutilAvc2GetVideoMuting"; - case 0x103d6b46: return "cellSysutilAvc2GetWindowAttribute"; - case 0x11f071cb: return "cellSysutilAvc2StopStreaming2"; - case 0x14937714: return "cellSysutilAvc2SetVoiceMuting"; - case 0x16ff9ba0: return "cellSysutilAvc2StartVoiceDetection"; - case 0x17481336: return "cellSysutilAvc2UnloadAsync"; - case 0x178982d9: return "cellSysutilAvc2StopVoiceDetection"; - case 0x1be2b4e0: return "cellSysutilAvc2GetAttribute"; - case 0x1d73ab8c: return "cellSysutilAvc2LoadAsync"; - case 0x207621a8: return "cellSysutilAvc2SetSpeakerVolumeLevel"; - case 0x225142bd: return "cellSysutilAvc2SetWindowString"; - case 0x2f280883: return "cellSysutilAvc2EstimateMemoryContainerSize"; - case 0x2fc0ab58: return "cellSysutilAvc2SetVideoMuting"; - case 0x31fc8b92: return "cellSysutilAvc2SetPlayerVoiceMuting"; - case 0x3447668a: return "cellSysutilAvc2SetStreamingTarget"; - case 0x38f33624: return "cellSysutilAvc2Unload"; - case 0x3a37e7f1: return "cellSysutilAvc2DestroyWindow"; - case 0x3c8c827c: return "cellSysutilAvc2SetWindowPosition"; - case 0x3ef4f668: return "cellSysutilAvc2GetSpeakerVolumeLevel"; - case 0x4c4b9665: return "cellSysutilAvc2IsCameraAttached"; - case 0x55d7bbfd: return "cellSysutilAvc2MicRead"; - case 0x5f3811f8: return "cellSysutilAvc2GetPlayerVoiceMuting"; - case 0x712d51d6: return "cellSysutilAvc2JoinChatRequest"; - case 0x74d22119: return "cellSysutilAvc2StartStreaming"; - case 0x7a69ecc1: return "cellSysutilAvc2SetWindowAttribute"; - case 0x82ced772: return "cellSysutilAvc2GetWindowShowStatus"; - case 0x89456724: return "cellSysutilAvc2InitParam"; - case 0x8a40a618: return "cellSysutilAvc2GetWindowSize"; - case 0x8c2f5be3: return "cellSysutilAvc2SetStreamPriority"; - case 0x97b2da6a: return "cellSysutilAvc2LeaveChatRequest"; - case 0xa26aa437: return "cellSysutilAvc2IsMicAttached"; - case 0xa8dc0efa: return "cellSysutilAvc2CreateWindow"; - case 0xa9f5b75c: return "cellSysutilAvc2GetSpeakerMuting"; - case 0xac170042: return "cellSysutilAvc2ShowWindow"; - case 0xaee75751: return "cellSysutilAvc2SetWindowSize"; - case 0xb81b9777: return "cellSysutilAvc2EnumPlayers"; - case 0xb856b63f: return "cellSysutilAvc2GetWindowString"; - case 0xbf022284: return "cellSysutilAvc2LeaveChat"; - case 0xc35ed665: return "cellSysutilAvc2SetSpeakerMuting"; - case 0xc6c93d62: return "cellSysutilAvc2Load"; - case 0xccf0aeff: return "cellSysutilAvc2SetAttribute"; - case 0xce6780c9: return "cellSysutilAvc2UnloadAsync2"; - case 0xd42657dd: return "cellSysutilAvc2StartStreaming2"; - case 0xd7d6272f: return "cellSysutilAvc2HideScreen"; - case 0xde6afc37: return "cellSysutilAvc2HideWindow"; - case 0xdf2ed367: return "cellSysutilAvc2GetVoiceMuting"; - case 0xe40e3dfc: return "cellSysutilAvc2GetScreenShowStatus"; - case 0xf3b5ff77: return "cellSysutilAvc2Unload2"; - case 0xfc2873a9: return "cellSysutilAvc2GetWindowPosition"; - case 0x1b6e8cd2: return "cellSysutilAvcExtSetWindowRotation"; - case 0x22a36b23: return "cellSysutilAvcExtGetWindowPosition"; - case 0x22ca0929: return "cellSysutilAvcExtSetHideNamePlate"; - case 0x245ff230: return "cellSysutilAvcExtSetWindowPosition"; - case 0x28f0dc04: return "cellSysutilAvcExtGetWindowSize"; - case 0x2d9a1997: return "cellSysutilAvcExtGetWindowShowStatus"; - case 0x326fab55: return "cellSysutilAvcExtGetNamePlateShowStatus"; - case 0x332ee22c: return "cellSysutilAvcExtSetWindowAlpha"; - case 0x40bc33c8: return "cellSysutilAvcExtSetWindowSize"; - case 0x4466c0e2: return "cellSysutilAvcExtShowPanelEx"; - case 0x51ccbe09: return "cellSysutilAvcExtLoadAsyncEx"; - case 0x5a763d0e: return "cellSysutilAvcExtSetShowNamePlate"; - case 0x5ba98e47: return "cellSysutilAvcExtStopVoiceDetection"; - case 0x61b1cb18: return "cellSysutilAvcExtShowWindow"; - case 0x683fe299: return "cellSysutilAvcExtHidePanelEx"; - case 0x739c2f63: return "cellSysutilAvcExtHideWindow"; - case 0x8ed310e5: return "cellSysutilAvcExtGetWindowRotation"; - case 0xaed82c21: return "cellSysutilAvcExtGetWindowAlpha"; - case 0xc851a4c0: return "cellSysutilAvcExtStartVoiceDetection"; - case 0xcbe0c10a: return "cellSysutilAvcExtGetSurfacePointer"; - case 0xd8685383: return "cellSysutilAvcExtInitOptionParam"; - case 0xe8b1c18d: return "cellSysutilAvcExtSetWindowZorder"; - case 0x0bddef7d: return "cellAudioOutUnregisterDevice"; - case 0x18d0ada6: return "cellAudioOutGetDeviceInfo2"; - case 0x1cfa1a11: return "cellVideoOutSetXVColor"; - case 0x269ffedd: return "cellVideoOutSetupDisplay"; - case 0x3d5730ce: return "cellAudioInGetDeviceInfo"; - case 0x4ec8c141: return "cellVideoOutConvertCursorColor"; - case 0x655a0364: return "cellVideoOutGetGamma"; - case 0x65bf9ea3: return "cellAudioInGetAvailableDeviceInfo"; - case 0xc3273d9b: return "cellAudioOutGetAvailableDeviceInfo"; - case 0xc7020f62: return "cellVideoOutSetGamma"; - case 0xc7087631: return "cellAudioOutRegisterDevice"; - case 0xe4645af8: return "cellAudioOutSetDeviceMode"; - case 0xeb6c50fb: return "cellAudioInSetDeviceMode"; - case 0xeb6fcff1: return "cellAudioInRegisterDevice"; - case 0xfa6bcc17: return "cellAudioInUnregisterDevice"; - case 0xfaa275a4: return "cellVideoOutGetScreenSize"; - case 0x571dc686: return "cellSysutilGetLicenseArea"; - case 0x074dbb39: return "cellUsbdAllocateMemory"; - case 0x0f411262: return "cellUsbdInterruptTransfer"; - case 0x254289ac: return "cellUsbdOpenPipe"; - case 0x2fb08e1e: return "cellUsbdScanStaticDescriptor"; - case 0x359befba: return "cellUsbdRegisterLdd"; - case 0x35f22ac3: return "cellUsbdEnd"; - case 0x4e456e81: return "cellUsbdFreeMemory"; - case 0x5c832bd7: return "cellUsbdSetThreadPriority2"; - case 0x5de3af36: return "cellUsbdGetPrivateData"; - case 0x63bfdb97: return "cellUsbdSetPrivateData"; - case 0x64951ac7: return "cellUsbdUnregisterLdd"; - case 0x7a1b6eab: return "cellUsbdHSIsochronousTransfer"; - case 0x7fe92c54: return "cellUsbdRegisterExtraLdd"; - case 0x90460081: return "cellUsbdUnregisterExtraLdd"; - case 0x9763e962: return "cellUsbdClosePipe"; - case 0x97cf128e: return "cellUsbdControlTransfer"; - case 0xac77eb78: return "cellUsbdBulkTransfer"; - case 0xbd554bcb: return "cellUsbdRegisterExtraLdd2"; - case 0xbdbd2428: return "cellUsbdGetDeviceSpeed"; - case 0xc24af1d7: return "cellUsbdSetThreadPriority"; - case 0xd0e766fe: return "cellUsbdInit"; - case 0xd5263dea: return "cellUsbdGetThreadPriority"; - case 0xdb819e03: return "cellUsbdGetDeviceLocation"; - case 0xde58c4c2: return "cellUsbdIsochronousTransfer"; - case 0x01a4cde0: return "cellUsbPspcmPollBindAsync"; - case 0x02955295: return "cellUsbPspcmRecvAsync"; - case 0x0f7b3b6d: return "cellUsbPspcmEnd"; - case 0x17f42197: return "cellUsbPspcmBindAsync"; - case 0x3caddf6c: return "cellUsbPspcmWaitSendAsync"; - case 0x3f22403e: return "cellUsbPspcmPollResetAsync"; - case 0x461dc8cc: return "cellUsbPspcmWaitRecvAsync"; - case 0x4abe830e: return "cellUsbPspcmWaitBindAsync"; - case 0x4af23efa: return "cellUsbPspcmSendAsync"; - case 0x4ef182dd: return "cellUsbPspcmResetAsync"; - case 0x657fcd36: return "cellUsbPspcmInit"; - case 0x7277d7c3: return "cellUsbPspcmSend"; - case 0x7b249315: return "cellUsbPspcmPollRecvAsync"; - case 0x7f0a3eaf: return "cellUsbPspcmPollSendAsync"; - case 0x7ff72b42: return "cellUsbPspcmUnregister"; - case 0x816799dd: return "cellUsbPspcmPollData"; - case 0x97670a90: return "cellUsbPspcmGetAddr"; - case 0xa4a5ddb4: return "cellUsbPspcmCancelBind"; - case 0xabe090e3: return "cellUsbPspcmBind"; - case 0xdb864d11: return "cellUsbPspcmWaitData"; - case 0xe3fbf64d: return "cellUsbPspcmRegister"; - case 0xe68a65ac: return "cellUsbPspcmReset"; - case 0xe76e79ab: return "cellUsbPspcmCancelWaitData"; - case 0xe840f449: return "cellUsbPspcmWaitResetAsync"; - case 0xf20df7fc: return "cellUsbPspcmCalcPoolSize"; - case 0xf9883d3b: return "cellUsbPspcmRecv"; - case 0xfa07d320: return "cellUsbPspcmClose"; - case 0x2b761140: return "cellUserInfoGetStat"; - case 0x3097cc1c: return "cellUserInfoSelectUser_ListType"; - case 0x55123a25: return "cellUserInfoSelectUser_SetList"; - case 0xb3516536: return "cellUserInfoEnableOverlay"; - case 0xc55e338b: return "cellUserInfoGetList"; - case 0x1bb79ff4: return "cellVideoExportProgress"; - case 0x2f457571: return "cellVideoExportInitialize2"; - case 0x6a24cc70: return "cellVideoExportInitialize"; - case 0x81296524: return "cellVideoExportFromFile"; - case 0xc15be817: return "cellVideoExportFinalize"; - case 0x122e0d0f: return "cellVideoUploadInitialize"; - case 0x0a563878: return "cellVoiceStart"; - case 0x18d3df30: return "cellVoiceDisconnectIPortFromOPort"; - case 0x20bafe31: return "cellVoiceDebugTopology"; - case 0x2a01013e: return "cellVoiceCreateNotifyEventQueue"; - case 0x2de54871: return "cellVoiceCreatePort"; - case 0x2f24fea3: return "cellVoiceUpdatePort"; - case 0x30f0b5ab: return "cellVoiceWriteToIPortEx"; - case 0x35d84910: return "cellVoiceSetNotifyEventQueue"; - case 0x36472c57: return "cellVoiceReadFromOPort"; - case 0x3dad26e7: return "cellVoiceWriteToIPort"; - case 0x474609e2: return "cellVoiceGetMuteFlag"; - case 0x54ac3519: return "cellVoiceGetPortInfo"; - case 0x762dc193: return "cellVoiceGetVolume"; - case 0x7bf17b15: return "cellVoiceResumePort"; - case 0x7e60adc6: return "cellVoiceSetBitRate"; - case 0x7f3963f7: return "cellVoiceResumePortAll"; - case 0x87c71b06: return "cellVoicePausePort"; - case 0x94d51f92: return "cellVoiceStartEx"; - case 0x9d0f4af1: return "cellVoiceSetPortAttr"; - case 0x9f70c475: return "cellVoiceDeletePort"; - case 0xae6a21d5: return "cellVoiceConnectIPortToOPort"; - case 0xb1a2c38f: return "cellVoiceInitEx"; - case 0xbef53a2b: return "cellVoiceGetBitRate"; - case 0xc7cf1182: return "cellVoiceInit"; - case 0xd14e784d: return "cellVoicePausePortAll"; - case 0xd3a84be1: return "cellVoiceStop"; - case 0xd4d80ea5: return "cellVoiceSetMuteFlagAll"; - case 0xd5ae37d8: return "cellVoiceSetVolume"; - case 0xd6811aa7: return "cellVoiceGetSignalState"; - case 0xdd000886: return "cellVoiceRemoveNotifyEventQueue"; - case 0xdde35a0c: return "cellVoiceSetMuteFlag"; - case 0xe0e1ae12: return "cellVoiceEnd"; - case 0xf629ed67: return "cellVoiceGetPortAttr"; - case 0xff0fa43a: return "cellVoiceResetPort"; - case 0x10ef39f6: return "cellVpostClose"; - case 0x40524325: return "cellVpostOpenEx"; - case 0x95e788c3: return "cellVpostQueryAttr"; - case 0xabb8cc3d: return "cellVpostExec"; - case 0xcd33f3e2: return "cellVpostOpen"; - case 0x02eb41bb: return "cellGemGetEnvironmentLightingColor"; - case 0x0ecd2261: return "cellGemUpdateStart"; - case 0x13ea7c64: return "cellGemInit"; - case 0x18ea899a: return "cellGemGetTrackerHue"; - case 0x1a13d010: return "cellGemConvertVideoFinish"; - case 0x1a2518a2: return "cellGemEnableMagnetometer"; - case 0x1b30cc22: return "cellGemGetRGB"; - case 0x1f6328d8: return "cellGemWriteExternalPort"; - case 0x2d2c2764: return "cellGemGetAllTrackableHues"; - case 0x2e0a170d: return "cellGemGetMemorySize"; - case 0x41ae9c31: return "cellGemUpdateFinish"; - case 0x4219de31: return "cellGemEnableCameraPitchAngleCorrection"; - case 0x49609306: return "cellGemSetRumble"; - case 0x6441d38d: return "cellGemGetState"; - case 0x6a5b7048: return "cellGemGetAccelerometerPositionInDevice"; - case 0x6db6b007: return "cellGemGetRumble"; - case 0x6dce048c: return "cellGemConvertVideoStart"; - case 0x6fc4c791: return "cellGemFilterState"; - case 0x77e08704: return "cellGemSetYaw"; - case 0x8befac67: return "cellGemGetCameraState"; - case 0x928ac5f8: return "cellGemTrackHues"; - case 0x92cc4b34: return "cellGemGetImageState"; - case 0x9b9714a4: return "cellGemClearStatusFlags"; - case 0x9e1dff96: return "cellGemGetInfo"; - case 0xa03ef587: return "cellGemPrepareCamera"; - case 0xafa99ead: return "cellGemCalibrate"; - case 0xb8ef56a6: return "cellGemGetHuePixels"; - case 0xc07896f9: return "cellGemPrepareVideoConvert"; - case 0xc7622586: return "cellGemHSVtoRGB"; - case 0xce6d7791: return "cellGemForceRGB"; - case 0xd37b127a: return "cellGemGetInertialState"; - case 0xde54e2fc: return "cellGemReset"; - case 0xe1f85a80: return "cellGemEnd"; - case 0xe3e4f0d6: return "cellGemInvalidateCalibration"; - case 0xfb5887f9: return "cellGemIsTrackableHue"; - case 0xfee33481: return "cellGemGetStatusFlags"; - case 0x40ad67eb: return "cellMediatorCreateContext"; - case 0x4aecea24: return "cellMediatorGetSignatureLength"; - case 0x4d249136: return "cellMediatorGetUserInfo"; - case 0x5d4431f0: return "cellMediatorFlushCache"; - case 0x6b8f5cb9: return "cellMediatorSign"; - case 0x85dc6981: return "cellMediatorPostReports"; - case 0x9d11991d: return "cellMediatorGetProviderUrl"; - case 0xa14c6000: return "cellMediatorReliablePostReports"; - case 0xc324f60c: return "cellMediatorCloseContext"; - case 0xf7e4a50a: return "cellMediatorGetStatus"; - case 0x0053e2d8: return "cellVdecOpenEx"; - case 0x16698e83: return "cellVdecClose"; - case 0x17c702b9: return "cellVdecGetPicItem"; - case 0x2bf4ddd2: return "cellVdecDecodeAu"; - case 0x807c861a: return "cellVdecGetPicture"; - case 0x824433f0: return "cellVdecEndSeq"; - case 0xb6bbcd5d: return "cellVdecOpen"; - case 0xc757c2aa: return "cellVdecStartSeq"; - case 0xc982a84a: return "cellVdecQueryAttrEx"; - case 0xe13ef6fc: return "cellVdecSetFrameRate"; - case 0xff6f6ebe: return "cellVdecQueryAttr"; - case 0x000e53cc: return "sceNpManagerSubSignout"; - case 0x01cd9cfd: return "sceNpCommerceGetChildProductSkuInfo"; - case 0x01fbbc9b: return "sceNpBasicSendMessageGui"; - case 0x03c741a7: return "sceNpMatchingGetResult"; - case 0x04372385: return "sceNpBasicGetFriendListEntry"; - case 0x04ca5e6a: return "sceNpScoreRecordGameData"; - case 0x0561448b: return "sceNpCommerceGetDataFlagAbort"; - case 0x05af1cb8: return "sceNpBasicGetMatchingInvitationEntry"; - case 0x05d65dff: return "sceNpScoreGetRankingByNpId"; - case 0x0968aa36: return "sceNpManagerGetTicket"; - case 0x14497465: return "sceNpMatchingQuickMatchGUI"; - case 0x155de760: return "sceNpSignalingGetConnectionInfo"; - case 0x166dcc11: return "sceNpLookupNpId"; - case 0x1672170e: return "sceNpScoreRecordScore"; - case 0x168a3117: return "sceNpBasicAddPlayersHistory"; - case 0x168fcece: return "sceNpManagerGetAccountAge"; - case 0x16f88a6f: return "sceNpManagerGetPsHandle"; - case 0x1a2704f7: return "sceNpScoreWaitAsync"; - case 0x1a3fcb69: return "sceNpCommerceGetSkuUserData"; - case 0x1ae8a549: return "sceNpBasicAddBlockListEntry"; - case 0x1fdb3ec2: return "sceNpLookupUserProfileWithAvatarSizeAsync"; - case 0x21206642: return "sceNpScoreGetRankingByRangeAsync"; - case 0x227f8763: return "sceNpScoreGetClansRankingByClanIdAsync"; - case 0x259113b8: return "sceNpScoreDestroyTitleCtx"; - case 0x260caedd: return "sceNpBasicGetFriendPresenceByNpId2"; - case 0x2687a127: return "sceNpSignalingGetCtxOpt"; - case 0x26b3bc94: return "sceNpMatchingGetResultGUI"; - case 0x26f33146: return "sceNpCommerceGetProductCategoryStart"; - case 0x2706eaa1: return "sceNpScoreSetPlayerCharacterId"; - case 0x276c72b2: return "sceNpSignalingSetCtxOpt"; - case 0x27c69eba: return "sceNpBasicAddFriend"; - case 0x29dd45dc: return "sceNpScoreSetTimeout"; - case 0x2a76895a: return "sceNpScoreGetClansRankingByClanId"; - case 0x2ad7837d: return "sceNpMatchingAcceptInvitationGUI"; - case 0x2be41ece: return "sceNpCommerceGetNumOfChildCategory"; - case 0x2cd2a1af: return "sceNpScoreSanitizeCommentAsync"; - case 0x2e1c5068: return "sceNpMatchingDestroyCtx"; - case 0x2ecd48ed: return "sceNpDrmVerifyUpgradeLicense"; - case 0x2f2c6b3e: return "sceNpProfileAbortGui"; - case 0x2fccbfe0: return "sceNpLookupUserProfileWithAvatarSize"; - case 0x30d1cbde: return "sceNpBasicGetMessageEntry"; - case 0x32200389: return "sceNpManagerGetMyLanguages"; - case 0x32c78a6a: return "sceNpBasicGetFriendPresenceByIndex"; - case 0x32cf311f: return "sceNpScoreInit"; - case 0x32febb4c: return "sceNpMatchingSearchJoinRoomGUI"; - case 0x34cc0ca4: return "sceNpMatchingKickRoomMember"; - case 0x34ce82a0: return "sceNpSignalingGetConnectionFromPeerAddress"; - case 0x359642a6: return "sceNpCommerceGetCategoryDescription"; - case 0x36d0c2c5: return "sceNpManagerGetAvatarUrl"; - case 0x39a69619: return "sceNpCommerceGetSkuId"; - case 0x3b02418d: return "sceNpScoreGetGameData"; - case 0x3cc8588a: return "sceNpMatchingCreateRoomGUI"; - case 0x3d1760dc: return "sceNpLookupAbortTransaction"; - case 0x3db7914d: return "sceNpScoreGetRankingByNpIdAsync"; - case 0x3f0808aa: return "sceNpBasicSetPresence"; - case 0x3f195b3a: return "sceNpCommerceGetProductCategoryResult"; - case 0x4026eac5: return "sceNpBasicRegisterContextSensitiveHandler"; - case 0x41ffd4f2: return "sceNpScoreGetClansMembersRankingByNpIdPcId"; - case 0x433fcb30: return "sceNpScoreGetClansMembersRankingByNpIdPcIdAsync"; - case 0x43b989f5: return "sceNpBasicSendMessageAttachment"; - case 0x442381f7: return "sceNpManagerSubSignin"; - case 0x45f8f3aa: return "sceNpCustomMenuRegisterActions"; - case 0x474b7b13: return "sceNpMatchingJoinRoomGUI"; - case 0x481ce0e8: return "sceNpBasicAbortGui"; - case 0x4885aa18: return "sceNpTerm"; - case 0x4a18a89e: return "sceNpMatchingSetRoomInfoNoLimit"; - case 0x4b9efb7a: return "sceNpManagerGetCachedInfo"; - case 0x4d5e0670: return "sceNpScoreGetClansMembersRankingByRangeAsync"; - case 0x4d9c615d: return "sceNpBasicGetClanMessageEntry"; - case 0x50b86d94: return "sceNpSignalingAddExtendedHandler"; - case 0x52a6b523: return "sceNpManagerUnregisterCallback"; - case 0x58fa4fcd: return "sceNpManagerGetTicketParam"; - case 0x5d543bbe: return "sceNpBasicGetMessageAttachmentEntry"; - case 0x5de61626: return "sceNpLookupDestroyTitleCtx"; - case 0x5e117ed5: return "sceNpLookupTitleStorageAsync"; - case 0x5e849303: return "sceNpBasicSetPresenceDetails2"; - case 0x5f2d9257: return "sceNpLookupInit"; - case 0x60440c73: return "sceNpManagerSubSigninAbortGui"; - case 0x60897c38: return "sceNpSignalingActivateConnection"; - case 0x6356082e: return "sceNpSignalingCreateCtx"; - case 0x6453b27b: return "sceNpBasicGetFriendPresenceByIndex2"; - case 0x64a704cc: return "sceNpBasicRecvMessageAttachmentLoad"; - case 0x64dbb89d: return "sceNpSignalingCancelPeerNetInfo"; - case 0x674bb9ff: return "sceNpCommerceGetProductCategoryAbort"; - case 0x691f429d: return "sceNpMatchingGetRoomInfo"; - case 0x6cb81eb2: return "sceNpCommerceDestroyProductCategory"; - case 0x6d4adc3b: return "sceNpScoreGetClansMembersRankingByRange"; - case 0x6e2ab18b: return "sceNpCommerceGetCategoryName"; - case 0x6ee62ed2: return "sceNpManagerGetContentRatingFlag"; - case 0x6f5e8143: return "sceNpScoreCreateTransactionCtx"; - case 0x6f8fd267: return "sceNpMatchingSetRoomInfo"; - case 0x71e5af7e: return "sceNpLookupSetTimeout"; - case 0x7208dc08: return "sceNpCommerceGetNumOfChildProductSku"; - case 0x73931bd0: return "sceNpBasicGetBlockListEntryCount"; - case 0x73a2e36b: return "sceNpMatchingGetRoomMemberListLocal"; - case 0x741fbf24: return "sceNpScoreGetClanMemberGameData"; - case 0x7508112e: return "sceNpLookupPollAsync"; - case 0x75eb50cb: return "sceNpSignalingGetPeerNetInfo"; - case 0x78d7f9ad: return "sceNpCommerceGetSkuPrice"; - case 0x79225aa3: return "sceNpCommerceGetCurrencyCode"; - case 0x7b7e9137: return "sceNpScoreGetClansRankingByRangeAsync"; - case 0x7be47e61: return "sceNpScoreCensorCommentAsync"; - case 0x7deb244c: return "sceNpScoreCensorComment"; - case 0x7e2fef28: return "sceNpManagerRequestTicket"; - case 0x806960ab: return "sceNpBasicRecvMessageCustom"; - case 0x816c6a5f: return "_sceNpSysutilClientFree"; - case 0x8297f1ec: return "sceNpManagerRequestTicket2"; - case 0x8440537c: return "sceNpLookupTerm"; - case 0x860b1756: return "sceNpLookupTitleSmallStorageAsync"; - case 0x8b7bbd73: return "sceNpMatchingSendInvitationGUI"; - case 0x8d1d096c: return "sceNpCommerceInitProductCategory"; - case 0x8d4518a0: return "sceNpCommerceSetDataFlagFinish"; - case 0x9153bdf4: return "sceNpBasicGetMessageAttachmentEntryCount"; - case 0x9281e87a: return "sceNpCommerceGetDataFlagFinish"; - case 0x936df4aa: return "sceNpCommerceGetProductId"; - case 0x9452f4f8: return "sceNpCommerceGetCategoryImageURL"; - case 0x9458f464: return "sceNpCustomMenuRegisterExceptionList"; - case 0x95c7bba3: return "sceNpSignalingTerminateConnection"; - case 0x9851f805: return "sceNpScoreTerm"; - case 0x99ac9952: return "sceNpCommerceSetDataFlagStart"; - case 0x9ad7fbd1: return "sceNpSignalingGetLocalNetInfo"; - case 0x9ee9f97e: return "sceNpLookupTitleStorage"; - case 0xa15f35fe: return "sceNpBasicGetPlayersHistoryEntryCount"; - case 0xa1709abd: return "sceNpManagerGetEntitlementById"; - case 0xa284bd1d: return "sceNpMatchingSetRoomSearchFlag"; - case 0xa7a090e5: return "sceNpScorePollAsync"; - case 0xa7bff757: return "sceNpManagerGetStatus"; - case 0xa85a4951: return "sceNpCommerceGetSkuDescription"; - case 0xa8afa7d4: return "sceNpBasicGetCustomInvitationEntryCount"; - case 0xa8cf8451: return "sceNpSignalingDestroyCtx"; - case 0xaa16695f: return "sceNpDrmProcessExitSpawn"; - case 0xac66568c: return "sceNpMatchingCreateCtx"; - case 0xacb9ee8e: return "sceNpBasicUnregisterHandler"; - case 0xad218faf: return "sceNpDrmIsAvailable"; - case 0xaee8cf71: return "sceNpCommerceGetCategoryId"; - case 0xaf3eba5a: return "sceNpCommerceDoCheckoutFinishAsync"; - case 0xaf505def: return "sceNpBasicGetMatchingInvitationEntryCount"; - case 0xaf57d9c9: return "sceNpCommerceGetCurrencyDecimals"; - case 0xafef640d: return "sceNpBasicGetFriendListEntryCount"; - case 0xb020684e: return "sceNpMatchingGetRoomInfoNoLimit"; - case 0xb082003b: return "sceNpScoreGetClansRankingByRange"; - case 0xb1c02d66: return "sceNpCommerceGetCurrencyInfo"; - case 0xb1e0718b: return "sceNpManagerGetAccountRegion"; - case 0xb5cb2d56: return "sceNpBasicRecvMessageAttachment"; - case 0xb6017827: return "sceNpLookupAvatarImage"; - case 0xb66d1c46: return "sceNpManagerGetEntitlementIdList"; - case 0xb9f93bbb: return "sceNpScoreCreateTitleCtx"; - case 0xba65de6d: return "sceNpCommerceGetChildCategoryInfo"; - case 0xbab91fc9: return "sceNpBasicGetPlayersHistoryEntry"; - case 0xbcc09fe7: return "sceNpBasicRegisterHandler"; - case 0xbcdbb2ab: return "sceNpBasicAddPlayersHistoryAsync"; - case 0xbd28fdbf: return "sceNpInit"; - case 0xbdc07fd5: return "sceNpManagerGetNetworkTime"; - case 0xbe07c708: return "sceNpManagerGetOnlineId"; - case 0xbe0e3ee2: return "sceNpDrmVerifyUpgradeLicense2"; - case 0xbe81c71c: return "sceNpBasicSetPresenceDetails"; - case 0xbef887e5: return "sceNpScoreGetClanMemberGameDataAsync"; - case 0xbf607ec6: return "sceNpBasicGetClanMessageEntryCount"; - case 0xbf9eea93: return "sceNpLookupAvatarImageAsync"; - case 0xc3a991ee: return "sceNpScoreGetRankingByNpIdPcId"; - case 0xc4b6cd8f: return "sceNpScoreGetRankingByNpIdPcIdAsync"; - case 0xc5f4cf82: return "sceNpScoreDestroyTransactionCtx"; - case 0xca0a2d04: return "sceNpSignalingGetConnectionStatus"; - case 0xca39c4b2: return "sceNpLookupTitleSmallStorage"; - case 0xccbe2e69: return "sceNpCommerceGetSkuImageURL"; - case 0xce81c7f0: return "sceNpLookupCreateTitleCtx"; - case 0xceeebc7a: return "sceNpProfileCallGui"; - case 0xcf51864b: return "sceNpDrmGetTimelimit"; - case 0xcfd469e4: return "sceNpCommerceGetProductCategoryFinish"; - case 0xd03cea35: return "sceNpCommerceGetDataFlagState"; - case 0xd053f113: return "sceNpBasicGetCustomInvitationEntry"; - case 0xd0958814: return "sceNpSignalingGetPeerNetInfoResult"; - case 0xd12e40ae: return "sceNpLookupNpIdAsync"; - case 0xd208f91d: return "sceNpUtilCmpNpId"; - case 0xd20d7798: return "sceNpMatchingKickRoomMemberWithOpt"; - case 0xd737fd2d: return "sceNpLookupWaitAsync"; - case 0xd7fb1fa6: return "sceNpFriendlistCustom"; - case 0xdae2d351: return "sceNpMatchingGrantOwnership"; - case 0xdb2e4dc2: return "sceNpScoreGetGameDataAsync"; - case 0xdbdb909f: return "sceNpCommerceGetDataFlagStart"; - case 0xddce7d15: return "sceNpScoreGetBoardInfoAsync"; - case 0xded17c26: return "sceNpScoreGetClansMembersRankingByNpId"; - case 0xdfd63b62: return "sceNpLookupUserProfile"; - case 0xe035f7d6: return "sceNpBasicGetEvent"; - case 0xe1c9f675: return "sceNpBasicMarkMessageAsUsed"; - case 0xe24eea19: return "sceNpMatchingGetRoomListLimitGUI"; - case 0xe2877bea: return "sceNpCommerceDestroyCtx"; - case 0xe36c660e: return "sceNpCommerceDoCheckoutStartAsync"; - case 0xe6c8f3f9: return "sceNpDrmProcessExitSpawn2"; - case 0xe7dcd3b4: return "sceNpManagerRegisterCallback"; - case 0xe853d388: return "sceNpSignalingGetConnectionFromNpId"; - case 0xe8a67160: return "sceNpScoreGetClansMembersRankingByNpIdAsync"; - case 0xea2e9ffc: return "sceNpLookupCreateTransactionCtx"; - case 0xeb5f2544: return "sceNpCommerceGetProductName"; - case 0xeb7a3d84: return "sceNpManagerGetChatRestrictionFlag"; - case 0xeb9df054: return "sceNpCommerceGetCategoryInfo"; - case 0xec0a1fbf: return "sceNpBasicSendMessage"; - case 0xecd503de: return "sceNpBasicGetMessageEntryCount"; - case 0xee0cc40c: return "_sceNpSysutilClientMalloc"; - case 0xee530059: return "sceNpCommerceGetSkuName"; - case 0xee5b20d9: return "sceNpScoreAbortTransaction"; - case 0xee64cf8e: return "sceNpMatchingGetRoomSearchFlag"; - case 0xf042b14f: return "sceNpDrmIsAvailable2"; - case 0xf0a9182b: return "sceNpFriendlist"; - case 0xf0b1e399: return "sceNpScoreRecordScoreAsync"; - case 0xf1b77918: return "sceNpScoreSanitizeComment"; - case 0xf283c143: return "sceNpDrmExecuteGamePurchase"; - case 0xf2b3338a: return "sceNpBasicGetBlockListEntry"; - case 0xf42c0df8: return "sceNpManagerGetOnlineName"; - case 0xf4e0f607: return "sceNpScoreGetBoardInfo"; - case 0xf59e1da8: return "sceNpFriendlistAbortGui"; - case 0xf5ff5f31: return "sceNpUtilCmpNpIdInOrder"; - case 0xf76847c2: return "sceNpScoreRecordGameDataAsync"; - case 0xf806c54c: return "sceNpMatchingLeaveRoom"; - case 0xf9732ac8: return "sceNpCustomMenuActionSetActivation"; - case 0xfb87cf5e: return "sceNpLookupDestroyTransactionCtx"; - case 0xfbc82301: return "sceNpScoreGetRankingByRange"; - case 0xfcac355a: return "sceNpCommerceCreateCtx"; - case 0xfd0eb5ae: return "sceNpSignalingDeactivateConnection"; - case 0xfd39ae13: return "sceNpBasicGetFriendPresenceByNpId"; - case 0xfe37a7f4: return "sceNpManagerGetNpId"; - case 0xff0a2378: return "sceNpLookupUserProfileAsync"; - case 0x01379fd7: return "sceNpMatching2DestroyContext"; - case 0x02065e3d: return "sceNpMatching2LeaveLobby"; - case 0x03a2f42a: return "sceNpMatching2RegisterLobbyMessageCallback"; - case 0x05bf2fbd: return "sceNpMatching2GetWorldInfoList"; - case 0x0884fc95: return "sceNpMatching2RegisterLobbyEventCallback"; - case 0x0b2218a3: return "sceNpMatching2GetLobbyMemberDataInternalList"; - case 0x0d22867f: return "sceNpMatching2SearchRoom"; - case 0x0ebe4c6b: return "sceNpMatching2SignalingGetConnectionStatus"; - case 0x1022e6d6: return "sceNpMatching2SetUserInfo"; - case 0x12034412: return "sceNpMatching2GetClanLobbyId"; - case 0x129663d0: return "sceNpMatching2GetLobbyMemberDataInternal"; - case 0x12d0b0f9: return "sceNpMatching2ContextStart"; - case 0x16b3e5a4: return "sceNpMatching2CreateServerContext"; - case 0x196a06f9: return "sceNpMatching2GetMemoryInfo"; - case 0x1f372697: return "sceNpMatching2LeaveRoom"; - case 0x215b0d75: return "sceNpMatching2SetRoomDataExternal"; - case 0x23009d07: return "sceNpMatching2Term2"; - case 0x26ae9ff8: return "sceNpMatching2SignalingGetConnectionInfo"; - case 0x28cad8b3: return "sceNpMatching2SendRoomMessage"; - case 0x29e78389: return "sceNpMatching2JoinLobby"; - case 0x2c5b7fc9: return "sceNpMatching2GetRoomMemberDataExternalList"; - case 0x2ed909dc: return "sceNpMatching2AbortRequest"; - case 0x2fe0da7d: return "sceNpMatching2Term"; - case 0x3457c0db: return "sceNpMatching2GetServerInfo"; - case 0x3c00c9d4: return "sceNpMatching2GetEventData"; - case 0x3cc27344: return "sceNpMatching2GetRoomSlotInfoLocal"; - case 0x3f3bd413: return "sceNpMatching2SendLobbyChatMessage"; - case 0x3f62c759: return "sceNpMatching2Init"; - case 0x41251f74: return "sceNp2Init"; - case 0x430ce063: return "sceNpMatching2AbortContextStart"; - case 0x490124fd: return "sceNpMatching2GetRoomMemberIdListLocal"; - case 0x5721e711: return "sceNpMatching2JoinRoom"; - case 0x58a04247: return "sceNpMatching2GetRoomMemberDataInternalLocal"; - case 0x62d446ac: return "sceNpMatching2GetCbQueueInfo"; - case 0x66f19527: return "sceNpMatching2KickoutRoomMember"; - case 0x6ba4c668: return "sceNpMatching2ContextStartAsync"; - case 0x6fcd84c1: return "sceNpMatching2SetSignalingOptParam"; - case 0x748029a2: return "sceNpMatching2RegisterContextCallback"; - case 0x7bf6e152: return "sceNpMatching2SendRoomChatMessage"; - case 0x817d1090: return "sceNpMatching2SetRoomDataInternal"; - case 0x8b209ca2: return "sceNpMatching2GetRoomDataInternal"; - case 0x8d3f8d49: return "sceNpMatching2SignalingGetPingInfo"; - case 0x8e5cfe9f: return "sceNpMatching2GetServerIdListLocal"; - case 0x8e930999: return "sceNpUtilBuildCdnUrl"; - case 0x9344d41f: return "sceNpMatching2GrantRoomOwner"; - case 0x9cbce3f2: return "sceNpMatching2CreateContext"; - case 0xa2b01449: return "sceNpMatching2GetSignalingOptParamLocal"; - case 0xa9e6103e: return "sceNpMatching2RegisterSignalingCallback"; - case 0xaa6c2c43: return "sceNpMatching2ClearEventData"; - case 0xaadb7c12: return "sceNp2Term"; - case 0xac98b03a: return "sceNpMatching2GetUserInfoList"; - case 0xb0c51412: return "sceNpMatching2GetRoomMemberDataInternal"; - case 0xb851aacf: return "sceNpMatching2SetRoomMemberDataInternal"; - case 0xba578d19: return "sceNpMatching2JoinProhibitiveRoom"; - case 0xbf014813: return "sceNpMatching2SignalingSetCtxOpt"; - case 0xc6b63b7e: return "sceNpMatching2DeleteServerContext"; - case 0xdb87b088: return "sceNpMatching2SetDefaultRequestOptParam"; - case 0xdcb6b27d: return "sceNpMatching2RegisterRoomEventCallback"; - case 0xde6d308b: return "sceNpMatching2GetRoomPasswordLocal"; - case 0xe4ac32ca: return "sceNpMatching2GetRoomDataExternalList"; - case 0xe7a3bc7a: return "sceNpMatching2CreateJoinRoom"; - case 0xe9946648: return "sceNpMatching2SignalingGetCtxOpt"; - case 0xefbd9357: return "sceNpMatching2GetLobbyInfoList"; - case 0xeffe5a16: return "sceNpMatching2GetLobbyMemberIdListLocal"; - case 0xefff8779: return "sceNpMatching2SendLobbyInvitation"; - case 0xf43c647a: return "sceNpMatching2ContextStop"; - case 0xf4babd3f: return "sceNpMatching2Init2"; - case 0xfa0583c6: return "sceNpMatching2SetLobbyMemberDataInternal"; - case 0xfee11e72: return "sceNpMatching2RegisterRoomMessageCallback"; - case 0x095e12c6: return "sceNpClansSendInvitationResponse"; - case 0x09f9e1a9: return "sceNpClansUpdateClanInfo"; - case 0x0df25834: return "sceNpClansRetrieveChallenges"; - case 0x1221a1bf: return "sceNpClansSearchByProfile"; - case 0x20472da0: return "sceNpClansGetMemberInfo"; - case 0x299ccc9b: return "sceNpClansCancelMembershipRequest"; - case 0x38dadf1f: return "sceNpClansGetAutoAcceptStatus"; - case 0x42332cb7: return "sceNpClansTerm"; - case 0x4826f6d5: return "sceNpClansDisbandClan"; - case 0x487de998: return "sceNpClansGetClanInfo"; - case 0x4d06aef7: return "sceNpClansAddBlacklistEntry"; - case 0x560f717b: return "sceNpClansLeaveClan"; - case 0x56bc5a7c: return "sceNpClansGetBlacklist"; - case 0x59743b2b: return "sceNpClansSendMembershipRequest"; - case 0x5bff9da1: return "sceNpClansRemoveBlacklistEntry"; - case 0x5da94854: return "sceNpClansUpdateAutoAcceptStatus"; - case 0x672399a8: return "sceNpClansGetClanListByNpId"; - case 0x726dffd5: return "sceNpClansCancelInvitation"; - case 0x727aa7f8: return "sceNpClansRetrieveAnnouncements"; - case 0x83d65529: return "sceNpClansPostChallenge"; - case 0x856ff5c0: return "sceNpClansGetMemberList"; - case 0x8e785b97: return "sceNpClansRetrievePostedChallenges"; - case 0x942dbdc4: return "sceNpClansSendMembershipResponse"; - case 0x9a72232d: return "sceNpClansCreateRequest"; - case 0x9b820047: return "sceNpClansInit"; - case 0x9cac2085: return "sceNpClansChangeMemberRole"; - case 0xa6a31a38: return "sceNpClansCreateClan"; - case 0xaa7912b5: return "sceNpClansKickMember"; - case 0xace0cfba: return "sceNpClansSearchByName"; - case 0xada45b84: return "sceNpClansPostAnnouncement"; - case 0xbc05ef31: return "sceNpClansSendInvitation"; - case 0xca4181b4: return "sceNpClansGetClanList"; - case 0xce6dc0f0: return "sceNpClansRemoveChallenge"; - case 0xd3346dc4: return "sceNpClansRemovePostedChallenge"; - case 0xd6551cd1: return "sceNpClansDestroyRequest"; - case 0xdbf300ca: return "sceNpClansJoinClan"; - case 0xe2590f60: return "sceNpClansRemoveAnnouncement"; - case 0xe82969e2: return "sceNpClansAbortRequest"; - case 0xf4a2d52b: return "sceNpClansUpdateMemberInfo"; - case 0x104551a6: return "sceNpCommerce2DoCheckoutStartAsync"; - case 0x146618df: return "sceNpCommerce2GetProductInfoListGetResult"; - case 0x150fdca3: return "sceNpCommerce2GetContentRatingDescriptor"; - case 0x1fa1b312: return "sceNpCommerce2GetStoreBrowseUserdata"; - case 0x2a910f05: return "sceNpCommerce2DestroyReq"; - case 0x3539d233: return "sceNpCommerce2Init"; - case 0x371a2edd: return "sceNpCommerce2GetCategoryContentsStart"; - case 0x3d627d81: return "sceNpCommerce2GetBGDLAvailability"; - case 0x410d42be: return "sceNpCommerce2DoDlListFinishAsync"; - case 0x4d4a094c: return "sceNpCommerce2Term"; - case 0x62023e98: return "sceNpCommerce2CreateSessionAbort"; - case 0x6ca9efd4: return "sceNpCommerce2DoDlListStartAsync"; - case 0x6f67ea80: return "sceNpCommerce2DestroyCtx"; - case 0x7370d8d0: return "sceNpCommerce2GetCategoryContentsCreateReq"; - case 0x8df0057f: return "sceNpCommerce2AbortReq"; - case 0x8f46325b: return "sceNpCommerce2GetProductInfoStart"; - case 0x91f8843d: return "sceNpCommerce2CreateSessionFinish"; - case 0x972ab46c: return "sceNpCommerce2GetContentInfo"; - case 0x9825a0fc: return "sceNpCommerce2DoProductBrowseStartAsync"; - case 0x9cde07cc: return "sceNpCommerce2GetProductInfoListStart"; - case 0x9d9cb96b: return "sceNpCommerce2DestroyGetCategoryContentsResult"; - case 0xa5a863fe: return "sceNpCommerce2SetBGDLAvailability"; - case 0xa975ebb4: return "sceNpCommerce2GetProductInfoCreateReq"; - case 0xa9f945b3: return "sceNpCommerce2DoProductCodeFinishAsync"; - case 0xac78c1f3: return "sceNpCommerce2GetContentRatingInfoFromCategoryInfo"; - case 0xb23e3bd1: return "sceNpCommerce2DoProductBrowseFinishAsync"; - case 0xbd49eab2: return "sceNpCommerce2GetCategoryInfo"; - case 0xbf5f58ea: return "sceNpCommerce2GetProductInfoGetResult"; - case 0xca0ea996: return "sceNpCommerce2GetCategoryContentsGetResult"; - case 0xcc18cd2c: return "sceNpCommerce2CreateSessionStart"; - case 0xd43a130e: return "sceNpCommerce2DoCheckoutFinishAsync"; - case 0xd8a473a3: return "sceNpCommerce2InitGetCategoryContentsResult"; - case 0xd9956ce7: return "sceNpCommerce2GetGameProductInfoFromGetProductInfoListResult"; - case 0xd9fdcec2: return "sceNpCommerce2CreateCtx"; - case 0xda8e322d: return "sceNpCommerce2GetPrice"; - case 0xdb19194c: return "sceNpCommerce2GetGameSkuInfoFromGameProductInfo"; - case 0xde7ab33d: return "sceNpCommerce2DoProductCodeStartAsync"; - case 0xe0f90e44: return "sceNpCommerce2InitGetProductInfoListResult"; - case 0xe1e7b5ac: return "sceNpCommerce2GetProductInfoListCreateReq"; - case 0xe51a4944: return "sceNpCommerce2GetGameProductInfoFromContentInfo"; - case 0xec324c8f: return "sceNpCommerce2GetContentRatingInfoFromGameProductInfo"; - case 0xeef51be0: return "sceNpCommerce2ExecuteStoreBrowse"; - case 0xef645654: return "sceNpCommerce2GetGameProductInfo"; - case 0xef8eafcd: return "sceNpCommerce2DestroyGetProductInfoResult"; - case 0xf6139b58: return "sceNpCommerce2DestroyGetProductInfoListResult"; - case 0xf798f5e3: return "sceNpCommerce2InitGetProductInfoResult"; - case 0xfc216890: return "sceNpCommerce2GetCategoryInfoFromContentInfo"; - case 0x079f0e87: return "sceNpTrophyGetGameProgress"; - case 0x1197b52c: return "sceNpTrophyRegisterContext"; - case 0x1c25470d: return "sceNpTrophyCreateHandle"; - case 0x27deda93: return "sceNpTrophySetSoundLevel"; - case 0x370136fe: return "sceNpTrophyGetRequiredDiskSpace"; - case 0x3741ecc7: return "sceNpTrophyDestroyContext"; - case 0x39567781: return "sceNpTrophyInit"; - case 0x48bd97c7: return "sceNpTrophyAbortHandle"; - case 0x49d18217: return "sceNpTrophyGetGameInfo"; - case 0x623cd2dc: return "sceNpTrophyDestroyHandle"; - case 0x8ceedd21: return "sceNpTrophyUnlockTrophy"; - case 0xa7fabf4d: return "sceNpTrophyTerm"; - case 0xb3ac3478: return "sceNpTrophyGetTrophyUnlockState"; - case 0xbaedf689: return "sceNpTrophyGetTrophyIcon"; - case 0xe3bf9a28: return "sceNpTrophyCreateContext"; - case 0xfce6d30a: return "sceNpTrophyGetTrophyInfo"; - case 0xff299e03: return "sceNpTrophyGetGameIcon"; - case 0x01711e81: return "sceNpTusDeleteMultiSlotDataVUser"; - case 0x0423e622: return "sceNpTusGetMultiSlotVariable"; - case 0x065b610d: return "sceNpTusSetMultiSlotVariableAsync"; - case 0x0835deb2: return "sceNpTusSetDataVUser"; - case 0x0d15043b: return "sceNpTusGetMultiUserVariable"; - case 0x17db7aa7: return "sceNpTusTryAndSetVariableVUserAsync"; - case 0x1904435e: return "sceNpTusCreateTransactionCtx"; - case 0x19bce18c: return "sceNpTusPollAsync"; - case 0x1fa5c87d: return "sceNpTusAddAndGetVariableAsync"; - case 0x225aed26: return "sceNpTusTerm"; - case 0x2357ba9e: return "sceNpTusGetMultiSlotVariableVUser"; - case 0x2ab21ea9: return "sceNpTusGetMultiSlotDataStatusVUserAsync"; - case 0x2d1b9f1a: return "sceNpTusGetMultiUserDataStatusVUser"; - case 0x2e162a62: return "sceNpTusDestroyTitleCtx"; - case 0x3175af23: return "sceNpTusDeleteMultiSlotDataAsync"; - case 0x325c6284: return "sceNpTusAbortTransaction"; - case 0x348dbcb4: return "sceNpTusGetMultiUserDataStatus"; - case 0x3602bc80: return "sceNpTusTryAndSetVariableVUser"; - case 0x368fec59: return "sceNpTusGetMultiUserDataStatusVUserAsync"; - case 0x38f364b0: return "sceNpTusGetDataVUserAsync"; - case 0x44eca8b4: return "sceNpTusDestroyTransactionCtx"; - case 0x47e9424a: return "sceNpTusTryAndSetVariable"; - case 0x5175abb9: return "sceNpTusGetDataAsync"; - case 0x59432970: return "sceNpTusSetTimeout"; - case 0x651fd79f: return "sceNpTusGetMultiSlotDataStatusAsync"; - case 0x6c511024: return "sceNpTusGetMultiUserVariableVUser"; - case 0x7caf58ee: return "sceNpTusCreateTitleCtx"; - case 0x7d5f0f0e: return "sceNpTusSetData"; - case 0x8ddd0d85: return "sceNpTusGetData"; - case 0x8f87a06b: return "sceNpTusInit"; - case 0x94989003: return "sceNpTusAddAndGetVariable"; - case 0x9549d22c: return "sceNpTusGetMultiUserVariableVUserAsync"; - case 0x96a06212: return "sceNpTusSetMultiSlotVariableVUserAsync"; - case 0x9cc0cf44: return "sceNpTusSetDataVUserAsync"; - case 0xa3abfadb: return "sceNpTusGetMultiSlotDataStatusVUser"; - case 0xa7993bf3: return "sceNpTusAddAndGetVariableVUserAsync"; - case 0xae4e590e: return "sceNpTusGetDataVUser"; - case 0xaf985783: return "sceNpTusDeleteMultiSlotVariable"; - case 0xb8e8ff22: return "sceNpTusWaitAsync"; - case 0xbb2877f2: return "sceNpTusGetMultiSlotVariableAsync"; - case 0xbbb244b7: return "sceNpTusTryAndSetVariableAsync"; - case 0xc2e18da8: return "sceNpTusDeleteMultiSlotVariableVUserAsync"; - case 0xc4e51fbf: return "sceNpTusDeleteMultiSlotVariableVUser"; - case 0xc66ba67e: return "sceNpTusGetMultiUserDataStatusAsync"; - case 0xc815b219: return "sceNpTusDeleteMultiSlotDataVUserAsync"; - case 0xc848d425: return "sceNpTusGetMultiSlotDataStatus"; - case 0xcc7a31cd: return "sceNpTusGetMultiUserVariableAsync"; - case 0xcc86a8f6: return "sceNpTusSetMultiSlotVariable"; - case 0xe0719847: return "sceNpTusDeleteMultiSlotData"; - case 0xe847341f: return "sceNpTusSetDataAsync"; - case 0xf5363608: return "sceNpTusDeleteMultiSlotVariableAsync"; - case 0xf60be06f: return "sceNpTusAddAndGetVariableVUser"; - case 0xf819be91: return "sceNpTusSetMultiSlotVariableVUser"; - case 0xfc7d346e: return "sceNpTusGetMultiSlotVariableVUserAsync"; - case 0x432b3cbf: return "sceNpUtilBandwidthTestShutdown"; - case 0xc2ced2b7: return "sceNpUtilBandwidthTestInitStart"; - case 0xc880f37d: return "sceNpUtilBandwidthTestGetStatus"; - case 0xc99ee313: return "sceNpUtilBandwidthTestAbort"; - case 0x02671310: return "cellFsSetDefaultContainer"; - case 0x0d5b4a14: return "cellFsReadWithOffset"; - case 0x0e2939e5: return "cellFsFtruncate"; - case 0x103b8632: return "cellFsAllocateFileAreaWithInitialData"; - case 0x190912f6: return "cellFsStReadGetCurrentAddr"; - case 0x1a108ab7: return "cellFsGetBlockSize"; - case 0x1ea02e2f: return "cellFsArcadeHddSerialNumber"; - case 0x2664c8ae: return "cellFsStReadInit"; - case 0x27800c6b: return "cellFsStRead"; - case 0x2796fdf3: return "cellFsRmdir"; - case 0x2cb51f0d: return "cellFsClose"; - case 0x2cf1296b: return "cellFsAllocateFileAreaByFdWithoutZeroFill"; - case 0x3140f6e1: return "cellFsSetIoBuffer"; - case 0x3394f037: return "cellFsAllocateFileAreaByFdWithInitialData"; - case 0x3a1c8393: return "cellFsTruncate2"; - case 0x3f61245c: return "cellFsOpendir"; - case 0x4cef342e: return "cellFsAioWrite"; - case 0x4d5ff8e2: return "cellFsRead"; - case 0x5c74903d: return "cellFsReaddir"; - case 0x606f9f42: return "cellFsChangeFileSizeWithoutAllocation"; - case 0x6d3bb15b: return "cellFsSdataOpenByFd"; - case 0x718bf5f8: return "cellFsOpen"; - case 0x75f16dc5: return "cellFsSetIoBufferFromDefaultContainer"; - case 0x7a0329a1: return "cellFsAllocateFileAreaWithoutZeroFill"; - case 0x7de6dced: return "cellFsStat"; - case 0x7f13fc8c: return "cellFsAioCancel"; - case 0x7f4677a8: return "cellFsUnlink"; - case 0x81f33783: return "cellFsStReadPutCurrentAddr"; - case 0x866f6aec: return "cellFsStReadWaitCallback"; - case 0x8cb722d5: return "cellFsWriteWithOffset"; - case 0x8df28ff9: return "cellFsStReadStart"; - case 0x8f71c5b2: return "cellFsStReadWait"; - case 0x91a1beaa: return "cellFsSetDiscReadRetrySetting"; - case 0x967a162b: return "cellFsFsync"; - case 0x99406d0b: return "cellFsChmod"; - case 0x9b882495: return "cellFsGetDirectoryEntries"; - case 0x9f951810: return "cellFsAioFinish"; - case 0xa01ee33a: return "cellFsRegisterConversionCallback"; - case 0xa397d042: return "cellFsLseek"; - case 0xaa3b4bcd: return "cellFsGetFreeSize"; - case 0xb1840b53: return "cellFsSdataOpen"; - case 0xb3afee8b: return "cellFsStReadGetRingBuf"; - case 0xba901fe6: return "cellFsMkdir"; - case 0xbd273a88: return "cellFsStReadGetRegid"; - case 0xbef554a4: return "cellFsUtime"; - case 0xc1c507e7: return "cellFsAioRead"; - case 0xc9dc3ac5: return "cellFsTruncate"; - case 0xcb588dba: return "cellFsFGetBlockSize"; - case 0xcf34969c: return "cellFsStReadGetStatus"; - case 0xd73938df: return "cellFsStReadFinish"; - case 0xdb869f20: return "cellFsAioInit"; - case 0xe15939c3: return "cellFsChangeFileSizeByFdWithoutAllocation"; - case 0xecdcf2ab: return "cellFsWrite"; - case 0xef3efa34: return "cellFsFstat"; - case 0xf12eecc8: return "cellFsRename"; - case 0xf8e5d9a0: return "cellFsStReadStop"; - case 0xf94baa80: return "cellFsUnregisterL10nCallbacks"; - case 0xff42dcc3: return "cellFsClosedir"; - case 0x068fcbc6: return "sys_config_start"; - case 0x0d5f2c14: return "cellPadClearBuf"; - case 0x0e2dfaad: return "cellPadInfoPressMode"; - case 0x1cf98800: return "cellPadInit"; - case 0x1f71ecbe: return "cellKbGetConfiguration"; - case 0x2073b7f6: return "cellKbClearBuf"; - case 0x20a97ba2: return "cellPadLddRegisterController"; - case 0x21a62e9b: return "cellMouseGetTabletDataList"; - case 0x2d16da4f: return "cellMouseSetTabletMode"; - case 0x2f1774d5: return "cellKbGetInfo"; - case 0x3138e632: return "cellMouseGetData"; - case 0x3aaad464: return "cellPadGetInfo"; - case 0x3ef66b95: return "cellMouseClearBuf"; - case 0x3f72c56e: return "cellKbSetLEDStatus"; - case 0x3f797dff: return "cellPadGetRawData"; - case 0x433f6ec0: return "cellKbInit"; - case 0x4ab1fa77: return "cellKbCnvRawCode"; - case 0x4cc9b68d: return "cellPadPeriphGetInfo"; - case 0x4d0b3b1f: return "cellMouseInfoTabletMode"; - case 0x4d9b75d5: return "cellPadEnd"; - case 0x578e3c98: return "cellPadSetPortSetting"; - case 0x5baf30fb: return "cellMouseGetInfo"; - case 0x5f81900c: return "sys_config_unregister_service"; - case 0x6ae10596: return "sys_config_add_service_listener"; - case 0x6bc09c61: return "cellPadGetDataExtra"; - case 0x6bd131f0: return "cellMouseGetDataList"; - case 0x6d367953: return "sys_config_stop"; - case 0x78200559: return "cellPadInfoSensorMode"; - case 0x78f058a2: return "sys_config_register_service"; - case 0x7c5d5fc1: return "cellPadDbgPeriphRegisterDevice"; - case 0x8a00f264: return "cellPadPeriphGetData"; - case 0x8b72cda1: return "cellPadGetData"; - case 0x8b8231e5: return "cellPadLddGetPortNo"; - case 0x94b98e39: return "cellPadDbgLddSetDataInsertMode"; - case 0xa328cc35: return "cellMouseGetRawData"; - case 0xa5f85e4d: return "cellKbSetCodeType"; - case 0xa703a51d: return "cellPadGetInfo2"; - case 0xa74396e5: return "cellPadDbgLddRegisterController"; - case 0xbafd6409: return "cellPadLddDataInsert"; - case 0xbe5be3ba: return "cellPadSetSensorMode"; - case 0xbfce3285: return "cellKbEnd"; - case 0xc9030138: return "cellMouseInit"; - case 0xcf3051f7: return "cellPadDbgGetData"; - case 0xdeefdfa7: return "cellKbSetReadMode"; - case 0xe10183ce: return "cellMouseEnd"; - case 0xe442faa8: return "cellPadLddUnregisterController"; - case 0xf5d9d571: return "sys_config_remove_service_listener"; - case 0xf65544ee: return "cellPadSetActDirect"; - case 0xf83f8182: return "cellPadSetPressMode"; - case 0xff0a21b7: return "cellKbRead"; - case 0x00acf0e5: return "spu_printf_finalize"; - case 0x00fb4a6b: return "spu_thread_sprintf"; - case 0x0125b2ca: return "_rand_int32_TT800"; - case 0x01508f24: return "raw_spu_write_float"; - case 0x0264f468: return "_Wctomb"; - case 0x02f4d325: return "spu_thread_read_double"; - case 0x02f52a3c: return "_filep_close_it"; - case 0x03becf3c: return "_Defloc"; - case 0x04a183fc: return "strcpy"; - case 0x04a1f19d: return "raw_spu_write_short"; - case 0x05d821c4: return "_Stoullx"; - case 0x077cdb23: return "btowc"; - case 0x07c7971d: return "_Stoldx"; - case 0x0871ffb0: return "mspace_malloc_usable_size"; - case 0x0891a3fa: return "_Tlsfree"; - case 0x09cbee1e: return "strxfrm"; - case 0x0a1d4b00: return "spu_thread_read_uint"; - case 0x0a4e2541: return "spu_thread_read_ldouble"; - case 0x0ae275a4: return "_Stolx"; - case 0x0b0d272f: return "_malloc_finalize"; - case 0x0b9d04d0: return "_Getnloc"; - case 0x0b9ecb98: return "toupper_ascii"; - case 0x0cae547f: return "raw_spu_write_double"; - case 0x0d2a593b: return "srand"; - case 0x0d8a2de0: return "_CStrxfrm"; - case 0x0df8809f: return "__call_functions_registered_with_atexit"; - case 0x0f60eb63: return "vfwscanf"; - case 0x0ff4722c: return "raw_spu_read_ushort"; - case 0x1096f8f1: return "ispunct_ascii"; - case 0x1098a99d: return "localeconv"; - case 0x112ea8ea: return "strspn"; - case 0x115e2f70: return "spu_thread_snprintf"; - case 0x116cda13: return "wcstol"; - case 0x118712ea: return "islower"; - case 0x11d270d2: return "exitspawn"; - case 0x126656b7: return "_Btowc"; - case 0x128b334f: return "raw_spu_read_mem"; - case 0x12a55fb7: return "mbrtowc"; - case 0x130d20a5: return "towlower"; - case 0x1365b52a: return "fcntl"; - case 0x13808972: return "wcstok"; - case 0x14052ae0: return "absi4"; - case 0x14348b57: return "divi4"; - case 0x145853cd: return "mspace_destroy"; - case 0x15362bc9: return "spu_thread_read_long"; - case 0x153b364a: return "mkdir"; - case 0x15bdcc00: return "rand"; - case 0x15c2e29d: return "isgraph_ascii"; - case 0x17752bab: return "wcsftime"; - case 0x17bc0136: return "_Lrv2d"; - case 0x17c031d7: return "spu_thread_read_ulong"; - case 0x1855b9b1: return "setlocale"; - case 0x1895908d: return "mspace_realloc"; - case 0x18e48b5d: return "wscanf"; - case 0x18f7b77d: return "_Dnorm"; - case 0x1970cd7e: return "getpid"; - case 0x19ccbb81: return "mktime"; - case 0x1ab01ea8: return "truncate"; - case 0x1abd0985: return "div"; - case 0x1ae06860: return "wcstoumax"; - case 0x1b4c3ff0: return "atexit"; - case 0x1c0e8ab6: return "vswscanf"; - case 0x1c2ef212: return "getwc"; - case 0x1cf4d80a: return "iswalpha"; - case 0x1dcd8609: return "_Strxfrmx"; - case 0x1dd0d4c5: return "spu_printf_attach_group"; - case 0x1df4732e: return "_Getptolower"; - case 0x1e9d2b4f: return "spu_thread_read_int"; - case 0x1ecae195: return "_Vacopy"; - case 0x1f913e8d: return "chmod"; - case 0x1f925c41: return "_allocate_mapped_pages"; - case 0x206612c4: return "spu_thread_read_ptr"; - case 0x216984ed: return "spu_thread_write_long"; - case 0x216fcd2a: return "_Atrealloc"; - case 0x21807b8e: return "towctrans"; - case 0x225702e1: return "_fs_initialize"; - case 0x22b0e566: return "_Stollx"; - case 0x23d3bca7: return "_Eadd"; - case 0x242c603e: return "_Frprep"; - case 0x243b52d8: return "_Mbtowcx"; - case 0x24802244: return "iswcntrl"; - case 0x24c9e021: return "abs"; - case 0x24e230d2: return "_Wctob"; - case 0x24f6cbdd: return "clock"; - case 0x253b7210: return "_rand_real2_TT800"; - case 0x25beee5a: return "__raw_spu_printf"; - case 0x25da8fbb: return "iscntrl"; - case 0x266311a0: return "localtime"; - case 0x2677568c: return "putchar"; - case 0x26f023d5: return "ftell"; - case 0x273b9711: return "sprintf"; - case 0x28b92ebf: return "raw_spu_read_uchar"; - case 0x296bc72f: return "_FDunscale"; - case 0x2b45cb34: return "wcsrtombs"; - case 0x2b7ba4ca: return "_Tlsset"; - case 0x2b81fb7f: return "readdir"; - case 0x2bc9dee6: return "raw_spu_read_short"; - case 0x2caea755: return "_Once"; - case 0x2d067448: return "ftruncate64"; - case 0x2d17ca7f: return "_Puttxt"; - case 0x2eea9f25: return "_Esub"; - case 0x2f45d39c: return "strlen"; - case 0x2fecec13: return "getwchar"; - case 0x30fb2899: return "_Getmem"; - case 0x312be3b3: return "_malloc_init_lv2"; - case 0x313f04ab: return "raw_spu_read_char"; - case 0x329a4540: return "_WPrintf"; - case 0x32e4a30a: return "_Mtxdst"; - case 0x336b4191: return "_Getint"; - case 0x33d6ae54: return "ferror"; - case 0x344eca7e: return "_WGetstr"; - case 0x34dd6650: return "_Getcloc"; - case 0x34e7c97e: return "_Unlocksyslock"; - case 0x3512ad38: return "tmpnam"; - case 0x355fd1fd: return "mbtowc"; - case 0x3574d37d: return "_Wcsxfrmx"; - case 0x36c067c1: return "_Stoll"; - case 0x36f2b4ed: return "strtoull"; - case 0x36feb965: return "raw_spu_write_llong"; - case 0x3704840e: return "_fs_finalize"; - case 0x38426d25: return "_Wctombx"; - case 0x3902363a: return "malloc_footprint"; - case 0x39bf419c: return "valloc"; - case 0x3a210c93: return "swscanf"; - case 0x3a840ae3: return "snprintf"; - case 0x3b22e88a: return "isxdigit"; - case 0x3b8097ac: return "_WScanf"; - case 0x3bce073b: return "putc"; - case 0x3bd9ce0a: return "fsync"; - case 0x3ca81c76: return "_Iswctype"; - case 0x3d1460e9: return "_Strerror"; - case 0x3d541975: return "atoi"; - case 0x3d5fdea7: return "vfwprintf"; - case 0x3d85d6f8: return "strcmp"; - case 0x3dbc3bee: return "opendir"; - case 0x3e57dfac: return "_Genld"; - case 0x3ec99a66: return "_Getptimes"; - case 0x3ee29d0b: return "_Stof"; - case 0x3f125e2e: return "spu_thread_write_short"; - case 0x3f4ccdc7: return "isdigit"; - case 0x3f650700: return "mspace_is_heap_empty"; - case 0x40a2599a: return "atol"; - case 0x40d04e4e: return "fwide"; - case 0x40e0ff25: return "_WGenld"; - case 0x41283333: return "isdigit_ascii"; - case 0x418bdfe1: return "_get_fd"; - case 0x4217b4cf: return "difftime"; - case 0x433fe2a9: return "fwscanf"; - case 0x44115dd0: return "_Geterrno"; - case 0x44796e5c: return "strerror"; - case 0x449317ed: return "_Fopen"; - case 0x44d7cae8: return "raw_spu_read_float"; - case 0x4544c2de: return "spu_thread_write_mem"; - case 0x4569518c: return "malloc_stats"; - case 0x459072c3: return "_init_TT800"; - case 0x4595c42b: return "wcsxfrm"; - case 0x468b45dc: return "mspace_calloc"; - case 0x4911ff9c: return "rand_int31_TT800"; - case 0x498a5036: return "raw_spu_write_mem"; - case 0x4a0049c6: return "_Getpctype"; - case 0x4ab5fbe2: return "_Printf"; - case 0x4b36c0e0: return "vfscanf"; - case 0x4b6a4010: return "vswprintf"; - case 0x4bb8e2b2: return "raw_spu_write_ushort"; - case 0x4c3f5f29: return "_Getgloballocale"; - case 0x4c7dc863: return "iswupper"; - case 0x4d348427: return "fputs"; - case 0x4e4be299: return "longjmp"; - case 0x4e72f810: return "wmemchr"; - case 0x4ffba189: return "feof"; - case 0x508196b4: return "raw_spu_printf"; - case 0x508e00c6: return "_Getloc"; - case 0x51b28904: return "_Stodx"; - case 0x526a496a: return "write"; - case 0x532b03be: return "raw_spu_read_uint"; - case 0x53eb43a1: return "_Getpmbstate"; - case 0x54b383bc: return "_Locvar"; - case 0x54c2844e: return "spu_raw_snprintf"; - case 0x54f57626: return "rewind"; - case 0x5516bbbf: return "iswctype"; - case 0x55d4866e: return "fgetws"; - case 0x5751acf9: return "_LDscale"; - case 0x575fb268: return "wctrans"; - case 0x57ff7dd7: return "_WStod"; - case 0x58320830: return "_WLitob"; - case 0x589b5314: return "strncat"; - case 0x5909e3c4: return "memset"; - case 0x59640bc6: return "raw_spu_read_ullong"; - case 0x59c1bb1f: return "_Getpwcstate"; - case 0x59e8dd58: return "strtoll"; - case 0x5a74f774: return "spu_thread_read_float"; - case 0x5b162b7f: return "memmove"; - case 0x5b4b6d6d: return "wcspbrk"; - case 0x5cc71eee: return "raw_spu_write_ldouble"; - case 0x5d43c1a3: return "_Mbtowc"; - case 0x5dbceee3: return "rand_int32_TT800"; - case 0x5e06c3fe: return "__getpid"; - case 0x5e7888f0: return "bsearch"; - case 0x5eb95641: return "_Stold"; - case 0x5f922a30: return "_Dscale"; - case 0x5f9a65c7: return "_WStold"; - case 0x5fa1e497: return "_Unlockfilelock"; - case 0x60627fb3: return "_LDunscale"; - case 0x6075a3c6: return "_Ld2rv"; - case 0x609080ec: return "isspace_ascii"; - case 0x6137d196: return "memalign"; - case 0x6287ac6a: return "iswdigit"; - case 0x62bf1d6c: return "swprintf"; - case 0x64aaf016: return "raw_spu_read_ldouble"; - case 0x6514dbe5: return "wcstold"; - case 0x6539ff6d: return "_Gentime"; - case 0x6545b7de: return "fgetpos"; - case 0x65e8d4d0: return "wcslen"; - case 0x6660fc8d: return "TlsGetValue"; - case 0x6687fba4: return "_Fgpos"; - case 0x66b71b17: return "wcsspn"; - case 0x67582370: return "spu_thread_write_double"; - case 0x676e3e7a: return "raw_spu_write_ptr"; - case 0x67d6334b: return "strtof"; - case 0x6823c180: return "iswprint"; - case 0x69106fd2: return "_init_by_array_TT800"; - case 0x692b497f: return "perror"; - case 0x6995f5e8: return "_Ldtob"; - case 0x69c27c12: return "fopen"; - case 0x69ff1b9b: return "fseek"; - case 0x6ba10474: return "_Tlsalloc"; - case 0x6cf78f3e: return "_Mtxunlock"; - case 0x6d5115b0: return "wcsncmp"; - case 0x6e988e5f: return "_rand_int31_TT800"; - case 0x7028dea9: return "_Locksyslock"; - case 0x703ec767: return "setvbuf"; - case 0x70b0e833: return "mblen"; - case 0x714c9618: return "__raw_spu_putfld"; - case 0x717b2502: return "stat"; - case 0x72236cbc: return "raw_spu_write_ullong"; - case 0x72b84004: return "spu_printf_attach_thread"; - case 0x73096858: return "wctob"; - case 0x7345b4be: return "_WStoll"; - case 0x73eae03d: return "strrchr"; - case 0x744d2505: return "ispunct"; - case 0x74fe4a7b: return "iswgraph"; - case 0x759e0635: return "malloc"; - case 0x75d4485c: return "rename"; - case 0x75f98579: return "wcscoll"; - case 0x76da0c84: return "ftruncate"; - case 0x76ed4243: return "_Wcsftime"; - case 0x770bfaee: return "wctype"; - case 0x77a602dd: return "free"; - case 0x77c15441: return "_WGetfloat"; - case 0x77e241bc: return "_Skip"; - case 0x7817edf0: return "raw_spu_write_uint"; - case 0x783636d1: return "spu_thread_read_char"; - case 0x78429d81: return "putwchar"; - case 0x79819dbf: return "fputc"; - case 0x7994c28d: return "_FDtentox"; - case 0x79eadf05: return "malloc_usable_size"; - case 0x7aaab95c: return "iswblank"; - case 0x7ae82e0f: return "vsprintf"; - case 0x7aee5acd: return "_Lockfilelock"; - case 0x7b5aac20: return "spu_thread_write_ptr"; - case 0x7b7a687a: return "_WPutfld"; - case 0x7b9c592e: return "spu_thread_read_ullong"; - case 0x7c1bcf37: return "isalnum_ascii"; - case 0x7c370679: return "_Foprep"; - case 0x7cec7b39: return "_Putfld"; - case 0x7d894764: return "_Readloc"; - case 0x7e7017b1: return "rmdir"; - case 0x7ea8d860: return "spu_printf_detach_group"; - case 0x7efd420a: return "_Daysto"; - case 0x7fd325c4: return "mspace_malloc_stats"; - case 0x7fdcf73e: return "wcscat"; - case 0x806fd281: return "isblank_ascii"; - case 0x809a143f: return "kill"; - case 0x813a9666: return "ungetwc"; - case 0x814d8cb0: return "fflush"; - case 0x81a0a858: return "_memset_int"; - case 0x82a3cc30: return "wcschr"; - case 0x82a4561a: return "_put_fd"; - case 0x831d70a5: return "memcpy"; - case 0x8342b757: return "utime"; - case 0x84378ddc: return "wcsncpy"; - case 0x86532174: return "imaxdiv"; - case 0x867275d7: return "_Stoul"; - case 0x86b4c669: return "tolower_ascii"; - case 0x8713c859: return "link"; - case 0x8725a1a7: return "_memset_vmx"; - case 0x87e8f748: return "memset_vmx"; - case 0x8809cdfd: return "_Getpwctytab"; - case 0x882689f2: return "_Makeloc"; - case 0x882e7760: return "raw_spu_write_uchar"; - case 0x889d5804: return "_Dunscale"; - case 0x88e009f5: return "vwprintf"; - case 0x896e1bfd: return "spu_thread_write_uchar"; - case 0x89b62f56: return "_Etentox"; - case 0x89f6f026: return "time"; - case 0x8a6830e7: return "abort"; - case 0x8a71132c: return "remove"; - case 0x8a847b51: return "tmpfile"; - case 0x8ab0abc6: return "strncpy"; - case 0x8b439438: return "clearerr"; - case 0x8b9d8dd2: return "iswpunct"; - case 0x8cb6bfdc: return "_Locsum"; - case 0x8d7ffaf1: return "_WStopfx"; - case 0x8e2484f1: return "_Emul"; - case 0x8ed71e8b: return "_WGetfld"; - case 0x8ef85e47: return "_WPuttxt"; - case 0x8f5dd179: return "_Nnl"; - case 0x90010029: return "gets"; - case 0x9027fd99: return "_WStoldx"; - case 0x90457fe3: return "raw_spu_read_long"; - case 0x90b27880: return "strtoumax"; - case 0x9234f738: return "raw_spu_read_int"; - case 0x93427cb9: return "setbuf"; - case 0x938bfcf7: return "spu_thread_write_char"; - case 0x93a3e3ac: return "tolower"; - case 0x9439e4cd: return "wcsncat"; - case 0x96b6baa6: return "spu_thread_read_mem"; - case 0x96e6303b: return "_WStoxflt"; - case 0x96ea4de6: return "wctomb"; - case 0x97896359: return "isspace"; - case 0x9800573c: return "_WLdtob"; - case 0x980d3ea7: return "_Getfld"; - case 0x9886810c: return "_FDnorm"; - case 0x98f0eeab: return "raw_spu_write_ulong"; - case 0x99782342: return "strncasecmp_ascii"; - case 0x99a72146: return "vsnprintf"; - case 0x99b38ce7: return "wmemmove"; - case 0x9a87bb3a: return "_Getmbcurmax"; - case 0x9abe8c74: return "wprintf"; - case 0x9c7028a5: return "spu_thread_write_uint"; - case 0x9c9d7b0d: return "strtold"; - case 0x9cab08d1: return "spu_thread_write_int"; - case 0x9d140351: return "_Destroytls"; - case 0x9eb25e00: return "strcoll"; - case 0x9eee5387: return "truncate64"; - case 0x9ff08d57: return "_Clearlocks"; - case 0xa0ab76d5: return "_absi4"; - case 0xa0bc0efb: return "mallinfo"; - case 0xa0ddba8e: return "_Stoulx"; - case 0xa1dbb466: return "_Gettime"; - case 0xa2945229: return "_WGetint"; - case 0xa30d4797: return "wcstoll"; - case 0xa3440924: return "closedir"; - case 0xa3da58f6: return "rand_real1_TT800"; - case 0xa45a0313: return "mspace_create"; - case 0xa483d50d: return "_rv2d"; - case 0xa53800c2: return "_malloc_finalize_lv2"; - case 0xa568db82: return "spu_thread_read_ushort"; - case 0xa57cc615: return "iswspace"; - case 0xa5bc0e19: return "getchar"; - case 0xa6463518: return "__rename"; - case 0xa650df19: return "toupper"; - case 0xa65886b8: return "_Findloc"; - case 0xa72a7595: return "calloc"; - case 0xa797790f: return "wcsstr"; - case 0xa82d70da: return "_Tlsget"; - case 0xa835be11: return "__cxa_atexit"; - case 0xa874036a: return "wcstof"; - case 0xa8a6f615: return "TlsSetValue"; - case 0xa8b07f1b: return "wmemcpy"; - case 0xa9f68eff: return "qsort"; - case 0xaa1e687d: return "isgraph"; - case 0xaa266d35: return "_malloc_init"; - case 0xaa9635d7: return "strcat"; - case 0xab4c7ca1: return "_CWcsxfrm"; - case 0xab77019f: return "fstat"; - case 0xabc27420: return "wcstoul"; - case 0xac758d20: return "wmemcmp"; - case 0xac893127: return "fgetc"; - case 0xace90be4: return "_Dtentox"; - case 0xad62a342: return "ldiv"; - case 0xad8e9ad0: return "_Initlocks"; - case 0xaec7c970: return "lseek"; - case 0xaf002043: return "independent_comalloc"; - case 0xaf44a615: return "fgets"; - case 0xaf6bdcb0: return "_Nonfatal_Assert"; - case 0xaf89fdbd: return "_Assert"; - case 0xafa39179: return "_WPutstr"; - case 0xb120f6ca: return "close"; - case 0xb17b79d0: return "isalpha"; - case 0xb18cc115: return "freopen"; - case 0xb1cc43e3: return "_CStrftime"; - case 0xb1f4779d: return "spu_thread_printf"; - case 0xb24cb8d6: return "_Locterm"; - case 0xb2702e15: return "wcrtomb"; - case 0xb2748a9f: return "_Freeloc"; - case 0xb30042ce: return "lldiv"; - case 0xb37982ea: return "_Getstr"; - case 0xb3c495bd: return "imaxabs"; - case 0xb3d98d59: return "_rand_real1_TT800"; - case 0xb400f226: return "isupper_ascii"; - case 0xb4225825: return "mbsinit"; - case 0xb43c25c7: return "wcstoull"; - case 0xb49eea74: return "_init_malloc_lock0"; - case 0xb4a54446: return "_Stofx"; - case 0xb4fc7078: return "_close_all_FILE"; - case 0xb529d259: return "isalnum"; - case 0xb569849d: return "reallocalign"; - case 0xb57bdf7b: return "iswxdigit"; - case 0xb5d353e8: return "_LDtentox"; - case 0xb6002508: return "_Putstr"; - case 0xb6257e3d: return "strncasecmp"; - case 0xb680e240: return "wcstombs"; - case 0xb6af290e: return "_WFrprep"; - case 0xb6d92ac3: return "strcasecmp"; - case 0xb738027a: return "strtok_r"; - case 0xb794631e: return "_WStofx"; - case 0xb7ab5127: return "wcsrchr"; - case 0xb7b793ed: return "get_state_TT800"; - case 0xb7ba4aeb: return "_WStoul"; - case 0xb7d3427f: return "iscntrl_ascii"; - case 0xb81cd66a: return "mbrlen"; - case 0xb9ed25d4: return "raw_spu_read_ulong"; - case 0xba62681f: return "mspace_memalign"; - case 0xbb605c96: return "pvalloc"; - case 0xbbd4582f: return "_Setloc"; - case 0xbc1d69c5: return "atoll"; - case 0xbc374779: return "_Getlname"; - case 0xbc5af0b5: return "fgetwc"; - case 0xbc7b4b8e: return "ctime"; - case 0xbe11beaa: return "_wremove"; - case 0xbe251a29: return "islower_ascii"; - case 0xbe6e5c58: return "spu_thread_read_uchar"; - case 0xbec43f86: return "raw_spu_read_ptr"; - case 0xbf5bf5ea: return "lseek64"; - case 0xbfcd1b3b: return "_Getdst"; - case 0xc01d9f97: return "printf"; - case 0xc08cc41d: return "wcstod"; - case 0xc0e27b2c: return "_Makestab"; - case 0xc155a73f: return "_WStoull"; - case 0xc15e657e: return "spu_raw_sprintf"; - case 0xc1a71972: return "_d2rv"; - case 0xc1b4bbb9: return "raw_spu_write_char"; - case 0xc1c8737c: return "_Getptoupper"; - case 0xc291e698: return "exit"; - case 0xc3c598e2: return "spu_printf_initialize"; - case 0xc3e14cbe: return "memcmp"; - case 0xc4178000: return "_rand_real3_TT800"; - case 0xc41c6e5d: return "_Scanf"; - case 0xc57337f8: return "_Fofind"; - case 0xc5c09834: return "strstr"; - case 0xc63c354f: return "_Exit"; - case 0xc69b2427: return "labs"; - case 0xc78df618: return "rand_real3_TT800"; - case 0xc7b62ab8: return "spu_thread_write_ullong"; - case 0xc9471fac: return "_Mtxinit"; - case 0xc94b27e3: return "_WStof"; - case 0xc95b20d3: return "fputwc"; - case 0xc9607d35: return "_Stopfx"; - case 0xc97a17d7: return "vsscanf"; - case 0xcab654bf: return "_Once_ctor"; - case 0xcb85ac70: return "mspace_malloc"; - case 0xcb9c535b: return "strftime"; - case 0xcbac7ad7: return "memchr"; - case 0xcbdc3a6d: return "raw_spu_write_int"; - case 0xcc5e0c72: return "_divi4"; - case 0xcca68e9c: return "putwc"; - case 0xce7a9e76: return "isprint_ascii"; - case 0xcecbcdc4: return "_Frv2d"; - case 0xcf863219: return "_Fwprep"; - case 0xcfbfb7a7: return "spu_printf_detach_thread"; - case 0xd14ece90: return "strtol"; - case 0xd1d69cb8: return "_Stod"; - case 0xd20f6601: return "independent_calloc"; - case 0xd2a99b1e: return "isprint"; - case 0xd2ac48d7: return "iswalnum"; - case 0xd360dcb4: return "fileno"; - case 0xd3964a09: return "__spu_thread_putfld"; - case 0xd40723d6: return "fread"; - case 0xd417eeb5: return "_Stoull"; - case 0xd4912ee3: return "_FDscale"; - case 0xd5c8cb55: return "spu_thread_write_ushort"; - case 0xd69c513d: return "_Wcscollx"; - case 0xd784459d: return "isupper"; - case 0xd7dc3a8f: return "strtod"; - case 0xd8b4eb20: return "__spu_thread_puttxt"; - case 0xd9674905: return "mspace_reallocalign"; - case 0xd9a4f812: return "atoff"; - case 0xda5a7eb8: return "strtoul"; - case 0xdaeada07: return "mallopt"; - case 0xdbf4c59c: return "cellPadGetCapabilityInfo"; - case 0xddbac025: return "strcasecmp_ascii"; - case 0xddc71a75: return "_SCE_Assert"; - case 0xde1bb092: return "init_by_array_TT800"; - case 0xde32a334: return "_Exitspawn"; - case 0xde7aff7a: return "memcpy16"; - case 0xdebee2af: return "strchr"; - case 0xdef86a83: return "isxdigit_ascii"; - case 0xdfb52083: return "_Stoxflt"; - case 0xe03c7ab1: return "_Fspos"; - case 0xe1858899: return "_Getpwctrtab"; - case 0xe1bd3587: return "fclose"; - case 0xe1e83c65: return "strncmp"; - case 0xe2c5274a: return "_WStoflt"; - case 0xe3812672: return "fdopen"; - case 0xe3cc73f3: return "puts"; - case 0xe3d91db3: return "raw_spu_read_double"; - case 0xe40ba755: return "strtok"; - case 0xe44bf0bf: return "atof"; - case 0xe469fb20: return "_Atexit"; - case 0xe48348e9: return "vprintf"; - case 0xe4c51d4c: return "wcstoimax"; - case 0xe5ea9e2b: return "_Isdst"; - case 0xe5f09c80: return "llabs"; - case 0xe60ee9e5: return "fputws"; - case 0xe6a7de0a: return "ungetc"; - case 0xe7def231: return "_Getfloat"; - case 0xe89071ad: return "isalpha_ascii"; - case 0xe9137453: return "fwprintf"; - case 0xe9a2cc40: return "raw_spu_write_long"; - case 0xe9b560a5: return "sscanf"; - case 0xeb26298c: return "gmtime"; - case 0xeb40c9ec: return "rand_real2_TT800"; - case 0xeb8abe73: return "vwscanf"; - case 0xec9e7cb9: return "spu_thread_read_llong"; - case 0xecddba69: return "_WStodx"; - case 0xed6ec979: return "fsetpos"; - case 0xeda48c80: return "malloc_trim"; - case 0xeddcee2c: return "init_TT800"; - case 0xedec777d: return "_Ttotm"; - case 0xeeeb4f3e: return "_get_state_TT800"; - case 0xeeffc9a6: return "_wrename"; - case 0xef110b6b: return "unlink"; - case 0xf06eed36: return "wmemset"; - case 0xf0776a44: return "wcscmp"; - case 0xf0e022c6: return "getc"; - case 0xf2bbbee9: return "_Litob"; - case 0xf2fca4b2: return "spu_thread_write_llong"; - case 0xf356418c: return "open"; - case 0xf3ef3678: return "wcscspn"; - case 0xf41355f9: return "wcscpy"; - case 0xf418ee84: return "_WFwprep"; - case 0xf4207734: return "spu_thread_write_ulong"; - case 0xf5a32994: return "_Getpcostate"; - case 0xf5ef229c: return "_Getpwcostate"; - case 0xf5f7dda8: return "towupper"; - case 0xf68e2ac9: return "_init_malloc_lock"; - case 0xf7583d67: return "vscanf"; - case 0xf7908e27: return "strcspn"; - case 0xf7a14a22: return "realloc"; - case 0xf7d51596: return "scanf"; - case 0xf7ddb471: return "_Setgloballocale"; - case 0xf88f26c4: return "fwrite"; - case 0xf8935fe3: return "spu_thread_write_float"; - case 0xf89dc648: return "strpbrk"; - case 0xf9dae72c: return "setjmp"; - case 0xf9dba140: return "_Mtxlock"; - case 0xf9e26b72: return "_Once_dtor"; - case 0xfa00d211: return "read"; - case 0xfae4b063: return "_Strcollx"; - case 0xfaec8c60: return "fprintf"; - case 0xfb0f0018: return "_Makewct"; - case 0xfb2081fd: return "vfprintf"; - case 0xfb81426d: return "iswlower"; - case 0xfb8ea4d2: return "_Fd2rv"; - case 0xfc0428a6: return "strdup"; - case 0xfc60575c: return "__spu_thread_printf"; - case 0xfc606237: return "mbsrtowcs"; - case 0xfcac2e8e: return "mbstowcs"; - case 0xfd0cb96d: return "spu_thread_read_short"; - case 0xfd461e85: return "spu_thread_write_ldouble"; - case 0xfd6a1ddb: return "raw_spu_read_llong"; - case 0xfd81f6ca: return "_Stoflt"; - case 0xfe0261aa: return "mspace_free"; - case 0xfe630fd9: return "isblank"; - case 0xfe88e97e: return "fscanf"; - case 0xff689124: return "strtoimax"; - case 0xffbae95e: return "asctime"; - case 0xffbd876b: return "__raw_spu_puttxt"; - case 0x003395d9: return "_Feraise"; - case 0x00367be0: return "fminl"; - case 0x007854f4: return "_FDclass"; - case 0x00fde072: return "f_powf"; - case 0x010818fc: return "asinf4"; - case 0x012d0a91: return "_fminf4"; - case 0x016556df: return "_sinf4"; - case 0x01b84b27: return "llround"; - case 0x01ecef7d: return "_FCbuild"; - case 0x02e68d44: return "_f_fmodf"; - case 0x032cc709: return "csin"; - case 0x03593d2c: return "_f_expf"; - case 0x03aea906: return "divf4"; - case 0x0522d1af: return "_recipf4"; - case 0x054aae63: return "_fdimf4"; - case 0x05cb1718: return "f_fdimf"; - case 0x05e27a13: return "log10f4fast"; - case 0x05efc660: return "asin"; - case 0x05f1dc9e: return "_FExp"; - case 0x07274304: return "csinh"; - case 0x07daed62: return "log2f4"; - case 0x07f400e3: return "_LCbuild"; - case 0x080414bd: return "conjl"; - case 0x08139bd2: return "_fmaxf4"; - case 0x0829a21d: return "asinhl"; - case 0x0a242ed5: return "sinf4"; - case 0x0b3f4e90: return "catanhf"; - case 0x0bb036a6: return "_cosf4"; - case 0x0c14cfcc: return "fesetenv"; - case 0x0c9b8305: return "hypotf4"; - case 0x0cbdae68: return "sinf"; - case 0x0cf9b8bd: return "_Erfc"; - case 0x0d86295d: return "_LCaddcr"; - case 0x0e53319f: return "_asinf4"; - case 0x0e8573dc: return "expm1l"; - case 0x0f02f882: return "llrintl"; - case 0x0f428f0f: return "rint"; - case 0x0f721a9d: return "_LCsubcc"; - case 0x10627248: return "f_fmodf"; - case 0x11c51388: return "tgamma"; - case 0x1225dd31: return "casinf"; - case 0x12de4e46: return "_powf4"; - case 0x12e04cd7: return "cimagl"; - case 0x1313a420: return "acos"; - case 0x137f7e77: return "expf4"; - case 0x14208b00: return "_asinf4fast"; - case 0x1498a072: return "_Cmulcr"; - case 0x16bf208a: return "log10f"; - case 0x17316bee: return "log2"; - case 0x178d98dd: return "atanf4fast"; - case 0x17cd5d87: return "_recipf4fast"; - case 0x182cd542: return "tgammal"; - case 0x18668ce3: return "exp"; - case 0x18b26998: return "remainderl"; - case 0x18ec6099: return "rintl"; - case 0x1988732d: return "clog10"; - case 0x1a1adede: return "rsqrtf4fast"; - case 0x1acb2b16: return "acosf4"; - case 0x1bbdcd9f: return "expm1f4"; - case 0x1bcdeb47: return "_LSinh"; - case 0x1be996cc: return "_LCdivcc"; - case 0x1c11885d: return "_floorf4"; - case 0x1d35bfe4: return "_LLog"; - case 0x1d5bf5d0: return "_modff4"; - case 0x1e623f95: return "truncf4"; - case 0x1e85ef02: return "f_atanf"; - case 0x1e9fd6ba: return "_sinf4fast"; - case 0x2033eeb7: return "csqrt"; - case 0x2118fe46: return "cexpl"; - case 0x21a37b3e: return "log1pf"; - case 0x21e6d304: return "ceil"; - case 0x22c3e308: return "_exp2f4"; - case 0x238af59b: return "fegetenv"; - case 0x23b985f7: return "floorf"; - case 0x241f9337: return "_FCmulcr"; - case 0x24497c52: return "cosf"; - case 0x246ea8d0: return "f_sqrtf"; - case 0x2627d6b2: return "erfc"; - case 0x266d2473: return "_Caddcr"; - case 0x26deed0b: return "cosl"; - case 0x26ef50ed: return "asinh"; - case 0x28faaa5a: return "ilogbf4"; - case 0x29685118: return "_negatef4"; - case 0x2a138d2b: return "truncf"; - case 0x2a4dcbad: return "cacosl"; - case 0x2a89ce33: return "llrintf"; - case 0x2af4b73b: return "fmax"; - case 0x2b282ebb: return "sqrtl"; - case 0x2bb0f2c9: return "logb"; - case 0x2c45fe6a: return "fmaxl"; - case 0x2c601f3b: return "csinl"; - case 0x2cbb6f53: return "f_hypotf"; - case 0x2dcab6a4: return "nanl"; - case 0x2df339bc: return "_f_floorf"; - case 0x2e69bb2a: return "_FCosh"; - case 0x2ec867b4: return "exp2f4fast"; - case 0x30bc7a53: return "logf4"; - case 0x315673f6: return "_Csubcc"; - case 0x31be25c3: return "scalblnf"; - case 0x31db8c89: return "atan2"; - case 0x321c55de: return "nexttowardl"; - case 0x3261de11: return "fesetexceptflag"; - case 0x329ec019: return "rsqrtf4"; - case 0x32f994a1: return "cosf4fast"; - case 0x33e5929b: return "_LDsign"; - case 0x33f27f25: return "_FCdivcr"; - case 0x3436f008: return "csinhf"; - case 0x3459748b: return "log10f4"; - case 0x347c1ee1: return "atanf4"; - case 0x34c0371e: return "powl"; - case 0x358d7f93: return "_f_lrintf"; - case 0x3593a445: return "clog"; - case 0x35b6e70a: return "lrintl"; - case 0x35d3f688: return "creal"; - case 0x36778d1b: return "coshf"; - case 0x373054d1: return "cpow"; - case 0x37345541: return "log1pl"; - case 0x376fb27f: return "sinhl"; - case 0x3792b12d: return "lroundl"; - case 0x38ba5590: return "ccosl"; - case 0x38e69f09: return "pow"; - case 0x398483aa: return "_expm1f4fast"; - case 0x39ef81c9: return "f_fmaxf"; - case 0x3ad203fa: return "lrint"; - case 0x3adc01d7: return "f_frexpf"; - case 0x3b802524: return "ldexpf4"; - case 0x3c057fbd: return "atanf"; - case 0x3c616743: return "_LDtest"; - case 0x3cb818fa: return "_f_fdimf"; - case 0x3d4efafb: return "atan2l"; - case 0x3d549f2a: return "ctanhl"; - case 0x3d901a10: return "_ceilf4"; - case 0x3da55602: return "fabsf"; - case 0x3dfa060f: return "scalbnl"; - case 0x3e7eb58f: return "frexpf4"; - case 0x3e919cba: return "scalbnf"; - case 0x3ec9de23: return "_cbrtf4"; - case 0x3eeedb0e: return "_Dclass"; - case 0x3f6262b3: return "f_fminf"; - case 0x3f701e78: return "_Poly"; - case 0x4020f5ef: return "cbrt"; - case 0x405f9727: return "_log1pf4fast"; - case 0x40a2e212: return "_fabsf4"; - case 0x4111b546: return "_LExp"; - case 0x411434bb: return "asinf"; - case 0x414c5ecc: return "_f_hypotf"; - case 0x4152669c: return "scalbln"; - case 0x417851ce: return "feholdexcept"; - case 0x418036e3: return "_FTgamma"; - case 0x4189a367: return "remquo"; - case 0x41d1b236: return "_f_rintf"; - case 0x430309a1: return "ldexpf"; - case 0x434881a0: return "cacosf"; - case 0x43d522f4: return "cabsl"; - case 0x44cd6308: return "remainder"; - case 0x44cf744b: return "tanhl"; - case 0x45034943: return "nan"; - case 0x452ac4bb: return "floorf4"; - case 0x453f9e91: return "cbrtf"; - case 0x46b66f76: return "csqrtl"; - case 0x46cf72d9: return "fdimf"; - case 0x47433144: return "expm1f4fast"; - case 0x475d855b: return "trunc"; - case 0x476b5591: return "fmaf"; - case 0x48157605: return "_f_llrintf"; - case 0x4826db61: return "fma"; - case 0x4875601d: return "_exp2f4fast"; - case 0x487bbd1c: return "tanf4"; - case 0x488df791: return "cexp"; - case 0x48d462a9: return "_FDint"; - case 0x4930ac11: return "logbl"; - case 0x4a5ae27d: return "f_exp2f"; - case 0x4a6ca9a6: return "powf4"; - case 0x4ab22a63: return "_Caddcc"; - case 0x4add664c: return "feclearexcept"; - case 0x4ae52dd3: return "exp2"; - case 0x4b03d5b2: return "f_rintf"; - case 0x4b584841: return "f_asinf"; - case 0x4cb5fa99: return "nexttoward"; - case 0x4d878773: return "remainderf4"; - case 0x4ddb926b: return "powf"; - case 0x4e010403: return "copysign"; - case 0x4eb5eb51: return "sin"; - case 0x4fa4f5ec: return "nexttowardf"; - case 0x501c412f: return "cargf"; - case 0x519ebb77: return "floor"; - case 0x547fb4a7: return "sinf4fast"; - case 0x54d2fb8c: return "rintf"; - case 0x5516d621: return "acosl"; - case 0x55c8a549: return "truncl"; - case 0x56c573a8: return "log1p"; - case 0x575e9b6e: return "asinl"; - case 0x58eb9e57: return "fabs"; - case 0x596ab55c: return "atanh"; - case 0x5b18eded: return "clogl"; - case 0x5b474c22: return "casinhl"; - case 0x5bfd37be: return "_FCaddcc"; - case 0x5e48dede: return "exp2f4"; - case 0x5ee10a95: return "catanh"; - case 0x5ee37927: return "_LErfc"; - case 0x60e9ff3c: return "_expm1f4"; - case 0x61250988: return "catanl"; - case 0x6261c0b5: return "_log10f4"; - case 0x63bbdfa6: return "_FCmulcc"; - case 0x642e3d18: return "_frexpf4"; - case 0x642f7d6b: return "f_copysignf"; - case 0x645557bd: return "copysignl"; - case 0x64abdb4d: return "csinhl"; - case 0x657d0e83: return "divf4fast"; - case 0x65935877: return "ilogbf"; - case 0x659e011e: return "sqrt"; - case 0x6636c4a5: return "frexpf"; - case 0x664e04b9: return "negatef4"; - case 0x6764c707: return "f_log2f"; - case 0x683cacb3: return "sinh"; - case 0x68a8957f: return "casinhf"; - case 0x68f72416: return "nextafterl"; - case 0x69040b9b: return "logbf4"; - case 0x69725dce: return "lgamma"; - case 0x6ad1c42b: return "_sincosf4"; - case 0x6b660894: return "_acosf4fast"; - case 0x6b6ab2a9: return "_LDclass"; - case 0x6c009c56: return "f_log10f"; - case 0x6c6285c6: return "acoshf"; - case 0x6cc4bd13: return "casinh"; - case 0x6ddd31b2: return "hypot"; - case 0x6df35518: return "floorl"; - case 0x6e9eb0dc: return "sincosf4fast"; - case 0x6ef6b083: return "_FCsubcr"; - case 0x6f5dd7d2: return "cexpf"; - case 0x6f639afb: return "f_llroundf"; - case 0x6fcc1e27: return "_FPoly"; - case 0x70357b12: return "_atanf4fast"; - case 0x7048396e: return "carg"; - case 0x705d9e24: return "f_acosf"; - case 0x70f71871: return "_FCdivcc"; - case 0x71293b71: return "_FLog"; - case 0x714adce1: return "log"; - case 0x71f2bc56: return "_divf4fast"; - case 0x728149e5: return "f_ldexpf"; - case 0x729b7269: return "cproj"; - case 0x72a3ed28: return "fesettrapenable"; - case 0x72f1f64b: return "_logbf4"; - case 0x734ca589: return "_f_cosf"; - case 0x742f12b4: return "_Sin"; - case 0x74902d4b: return "expf4fast"; - case 0x749440f9: return "lgammal"; - case 0x752fa85e: return "fmaxf4"; - case 0x758f33dc: return "nearbyint"; - case 0x75e3e2e9: return "nearbyintl"; - case 0x76afaf04: return "_sqrtf4"; - case 0x76e639ec: return "_atanf4"; - case 0x772f1e4d: return "lround"; - case 0x7793a86b: return "ctanf"; - case 0x7831a2e0: return "hypotl"; - case 0x78e4590a: return "acosh"; - case 0x790c53bd: return "_Fpcomp"; - case 0x7919f414: return "_f_nearbyintf"; - case 0x79ba9b5c: return "expl"; - case 0x7a893af1: return "_rsqrtf4"; - case 0x7ab679da: return "f_cosf"; - case 0x7c2eaeb5: return "fminf"; - case 0x7d02a5ca: return "sqrtf4fast"; - case 0x7d6191d0: return "_Cosh"; - case 0x7f381837: return "frexp"; - case 0x7f579e03: return "atan"; - case 0x7f91cd41: return "tanf4fast"; - case 0x812ed488: return "cabsf"; - case 0x81daf880: return "_LCsubcr"; - case 0x8217e783: return "cosh"; - case 0x833e6b0e: return "cimag"; - case 0x834f5917: return "ccosh"; - case 0x842cb14d: return "_log1pf4"; - case 0x8451edf0: return "sqrtf"; - case 0x889cccb0: return "llroundl"; - case 0x88fb4a66: return "recipf4fast"; - case 0x892f2590: return "fegetround"; - case 0x895cdb49: return "fmaxf"; - case 0x89b507b3: return "catanhl"; - case 0x89d1d168: return "_LAtan"; - case 0x8b168769: return "fdiml"; - case 0x8bd1deb2: return "_LTgamma"; - case 0x8bd67efc: return "erf"; - case 0x8c85369b: return "_f_fminf"; - case 0x8d5858db: return "_f_exp2f"; - case 0x8e01379e: return "cacoshf"; - case 0x8e258fa0: return "cacos"; - case 0x8ecae294: return "nextafter"; - case 0x8f2bcdb5: return "_logf4"; - case 0x8f96319e: return "log10l"; - case 0x8fb7bac7: return "_sqrtf4fast"; - case 0x904e646b: return "cargl"; - case 0x90f0242f: return "_f_sinf"; - case 0x9110708a: return "modfl"; - case 0x91cdfdb0: return "asinf4fast"; - case 0x9232baea: return "_FDtest"; - case 0x9245e01b: return "_divf4"; - case 0x9379e36e: return "tanf"; - case 0x938fb946: return "_tanf4fast"; - case 0x947ae18e: return "_LHypot"; - case 0x9558ed08: return "lrintf"; - case 0x95dfecb1: return "_FCsubcc"; - case 0x961688d1: return "f_nearbyintf"; - case 0x9616e336: return "_FHypot"; - case 0x964ac044: return "creall"; - case 0x96d1b95e: return "log2f4fast"; - case 0x9700d9cd: return "clogf"; - case 0x970a3432: return "cacosh"; - case 0x99a6c261: return "catanf"; - case 0x99c228fc: return "roundl"; - case 0x9a81e583: return "fmodf"; - case 0x9af30eaf: return "casin"; - case 0x9e289062: return "_f_ceilf"; - case 0x9e3ada21: return "logl"; - case 0x9e8130b6: return "ccos"; - case 0x9f03dd3e: return "lgammaf"; - case 0x9f0efc6e: return "exp2l"; - case 0x9f46f5a4: return "tgammaf"; - case 0x9f65bd34: return "fdimf4"; - case 0x9f78f052: return "cos"; - case 0x9fded78a: return "_acosf4"; - case 0xa0160c30: return "_copysignf4"; - case 0xa20827a8: return "ctanl"; - case 0xa2c81938: return "_LSin"; - case 0xa4578433: return "fmin"; - case 0xa46a70a1: return "atanhl"; - case 0xa4ca5cf2: return "llroundf"; - case 0xa56557b6: return "catan"; - case 0xa5d0b260: return "acoshl"; - case 0xa713f8cf: return "modf"; - case 0xa7658186: return "log1pf4"; - case 0xa823836b: return "ilogb"; - case 0xa8c16038: return "_FDsign"; - case 0xa8d180e8: return "_Cbuild"; - case 0xa92bcc85: return "cabs"; - case 0xa9e039c4: return "erfcf"; - case 0xaaa270dc: return "_LCdivcr"; - case 0xab377381: return "log2f"; - case 0xabdccc7a: return "f_atan2f"; - case 0xacca2f83: return "copysignf"; - case 0xad17e787: return "_Dint"; - case 0xad3a093d: return "_LCosh"; - case 0xad5d3e57: return "_FLgamma"; - case 0xaddce673: return "erfcl"; - case 0xafa13040: return "f_llrintf"; - case 0xafcfdad7: return "_Lgamma"; - case 0xafd9a625: return "cimagf"; - case 0xb0fa1592: return "clog10l"; - case 0xb24bd2f8: return "logbf"; - case 0xb348c5c2: return "_LLgamma"; - case 0xb412a8dc: return "_LDint"; - case 0xb4ef29d5: return "f_floorf"; - case 0xb4f4513e: return "_Tgamma"; - case 0xb54cc9a1: return "f_sinf"; - case 0xb5961d4e: return "_sincosf4fast"; - case 0xb598a495: return "fmodl"; - case 0xb5e28191: return "_FSin"; - case 0xb7696143: return "nextafterf"; - case 0xb79012ba: return "modff"; - case 0xb89863bc: return "_rsqrtf4fast"; - case 0xb8aa984e: return "_expf4"; - case 0xb94b9d13: return "_Dtest"; - case 0xb9d2ad22: return "remquol"; - case 0xba136594: return "csinf"; - case 0xba84eab5: return "coshl"; - case 0xbaf11866: return "ceilf"; - case 0xbb165807: return "expm1f"; - case 0xbb208b20: return "cbrtf4fast"; - case 0xbb761c89: return "remquof"; - case 0xbbaa300b: return "f_log1pf"; - case 0xbbf7354e: return "fegetexceptflag"; - case 0xbd7410d9: return "recipf4"; - case 0xbd8bb75c: return "asinhf"; - case 0xbf23f2e7: return "cprojl"; - case 0xbfda6837: return "_f_log10f"; - case 0xc0609820: return "nearbyintf"; - case 0xc0bcf25e: return "_logf4fast"; - case 0xc357b33a: return "frexpl"; - case 0xc406dd09: return "cbrtf4"; - case 0xc41f01db: return "fminf4"; - case 0xc477c0f6: return "f_lroundf"; - case 0xc4cccd1f: return "modff4"; - case 0xc7369fce: return "_Atan"; - case 0xc78ac9d0: return "scalbn"; - case 0xc7b45a19: return "_LFpcomp"; - case 0xc7f1d407: return "fmal"; - case 0xc7fb73d6: return "f_lrintf"; - case 0xc8910002: return "ilogbl"; - case 0xc8dd9279: return "expm1"; - case 0xc90f4bbc: return "_atan2f4"; - case 0xc9481758: return "_tanf4"; - case 0xc94fcc63: return "cbrtl"; - case 0xc977e1ea: return "fetestexcept"; - case 0xc984bf53: return "roundf"; - case 0xc9c536ce: return "_ldexpf4"; - case 0xca239640: return "fmodf4"; - case 0xca463458: return "_Log"; - case 0xcaaf7ae7: return "cprojf"; - case 0xcac167a5: return "_Cmulcc"; - case 0xcb6599c0: return "exp2f"; - case 0xcb6a147e: return "_cosf4fast"; - case 0xcbdf9afb: return "_log10f4fast"; - case 0xccc66f11: return "_FSinh"; - case 0xce91ff18: return "nanf"; - case 0xcfee82d8: return "_remainderf4"; - case 0xd0fd3ca8: return "_hypotf4"; - case 0xd125b89e: return "conjf"; - case 0xd1a3574c: return "clog10f"; - case 0xd231e30a: return "ldexpl"; - case 0xd28ef6dd: return "_Hypot"; - case 0xd2a666c9: return "ctanh"; - case 0xd3a346a8: return "tanl"; - case 0xd40f3f2c: return "erff"; - case 0xd42904b7: return "fabsl"; - case 0xd477852d: return "logf"; - case 0xd48eaae1: return "scalblnl"; - case 0xd4f37b9d: return "tanhf"; - case 0xd50277ad: return "tan"; - case 0xd54039cb: return "fegettrapenable"; - case 0xd5adc4b2: return "cpowl"; - case 0xd5d38552: return "_LCaddcc"; - case 0xd612fa16: return "_Sinh"; - case 0xd70df92a: return "_FCaddcr"; - case 0xd7653782: return "sinhf"; - case 0xd76a16da: return "_fmaf4"; - case 0xd8270894: return "fdim"; - case 0xd8c4096d: return "atan2f4"; - case 0xd8d157f5: return "f_expf"; - case 0xd8f79f4c: return "log10"; - case 0xd97852b7: return "sinl"; - case 0xd97ce5d4: return "fesetround"; - case 0xda217d1f: return "atanl"; - case 0xda31fc5d: return "_FFpcomp"; - case 0xdc14974c: return "fmaf4"; - case 0xdc151707: return "_f_log2f"; - case 0xdd8660d2: return "atan2f4fast"; - case 0xdd92118e: return "ceill"; - case 0xdddabb32: return "remainderf"; - case 0xde7833f2: return "_log2f4fast"; - case 0xdece76a6: return "acosf"; - case 0xdfd41734: return "_Exp"; - case 0xdffb4e3c: return "casinl"; - case 0xe1288c47: return "atanhf"; - case 0xe1c71b05: return "ccoshl"; - case 0xe2b596ec: return "ccosf"; - case 0xe2de89e6: return "csqrtf"; - case 0xe2f1d4b2: return "tanh"; - case 0xe31cc0d3: return "_ilogbf4"; - case 0xe3e379b8: return "_expf4fast"; - case 0xe584836c: return "_LPoly"; - case 0xe58fc9b5: return "erfl"; - case 0xe5a0be9f: return "_powf4fast"; - case 0xe5d2293f: return "_Force_raise"; - case 0xe5ea65e8: return "feraiseexcept"; - case 0xe6c1ff41: return "llrint"; - case 0xe769e5cf: return "fmod"; - case 0xe8fcf1f8: return "acosf4fast"; - case 0xe913a166: return "logf4fast"; - case 0xe92f3fb8: return "_f_fmaf"; - case 0xe93abfca: return "ctan"; - case 0xe9ac8223: return "_LCmulcr"; - case 0xe9f501df: return "crealf"; - case 0xea1e83e3: return "f_logf"; - case 0xeac62795: return "_Cdivcc"; - case 0xeac7ca2c: return "ceilf4"; - case 0xebb4e08a: return "hypotf"; - case 0xec43b983: return "_f_sqrtf"; - case 0xec7da0c8: return "_atan2f4fast"; - case 0xed05c265: return "sqrtf4"; - case 0xed9d1ac5: return "f_tanf"; - case 0xeda86c48: return "copysignf4"; - case 0xee0db701: return "_Csubcr"; - case 0xee204ac6: return "f_ceilf"; - case 0xee303936: return "_Dsign"; - case 0xeed82401: return "_f_logf"; - case 0xf0947035: return "ctanhf"; - case 0xf0ab77c1: return "ccoshf"; - case 0xf16568af: return "_FAtan"; - case 0xf19c5e94: return "sincosf4"; - case 0xf1aaa2f8: return "conj"; - case 0xf3bd7d08: return "_cbrtf4fast"; - case 0xf3ec0258: return "round"; - case 0xf4ad6ea8: return "ldexp"; - case 0xf537d837: return "_truncf4"; - case 0xf5cd1e19: return "cosf4"; - case 0xf7844153: return "_f_fmaxf"; - case 0xf83a372f: return "f_fmaf"; - case 0xf95b7769: return "powf4fast"; - case 0xf99da2fc: return "fabsf4"; - case 0xfa28434b: return "log2l"; - case 0xfa765d42: return "_Cdivcr"; - case 0xfa97afbf: return "feupdateenv"; - case 0xfae9e727: return "_f_copysignf"; - case 0xfb6e6213: return "log1pf4fast"; - case 0xfb932a56: return "atan2f"; - case 0xfbb4047a: return "lroundf"; - case 0xfbe88922: return "_FErfc"; - case 0xfcedabc3: return "_fmodf4"; - case 0xfcf08193: return "expf"; - case 0xfdec16e1: return "cacoshl"; - case 0xfe23dbe9: return "_log2f4"; - case 0xff036800: return "cpowf"; - case 0xfffe79bf: return "_LCmulcc"; - case 0x06a840f5: return "sys_dbg_set_stacksize_ppu_exception_handler"; - case 0x08ef08a9: return "sys_dbg_get_spu_thread_group_ids"; - case 0x113b0bea: return "sys_dbg_get_ppu_thread_ids"; - case 0x1860f909: return "sys_dbg_get_spu_thread_ids"; - case 0x22916f45: return "sys_dbg_register_ppu_exception_handler"; - case 0x24a3d413: return "sys_dbg_mat_set_condition"; - case 0x266c2bd3: return "sys_dbg_read_spu_thread_context2"; - case 0x3147c6ca: return "sys_dbg_enable_floating_point_enabled_exception"; - case 0x381ae33e: return "sys_dbg_get_event_queue_information"; - case 0x3e5eed36: return "sys_dbg_get_spu_thread_name"; - case 0x4b55f456: return "sys_dbg_get_ppu_thread_name"; - case 0x4ded9f6c: return "sys_dbg_signal_to_ppu_exception_handler"; - case 0x50453aa8: return "sys_dbg_get_mutex_information"; - case 0x580f8203: return "sys_dbg_vm_get_page_information"; - case 0x590a276e: return "sys_dbg_mat_get_condition"; - case 0x63bd413e: return "sys_dbg_get_cond_information"; - case 0x6b413178: return "sys_dbg_get_ppu_thread_status"; - case 0x7bdadb01: return "sys_dbg_get_lwcond_information"; - case 0x9794bb53: return "sys_dbg_get_rwlock_information"; - case 0x9ddb9dc3: return "sys_dbg_get_spu_thread_group_status"; - case 0xa2d6cbd2: return "sys_dbg_get_semaphore_information"; - case 0xab475d53: return "sys_dbg_set_mask_to_ppu_exception_handler"; - case 0xb9da87d3: return "sys_dbg_get_coredump_params"; - case 0xbb0ae221: return "sys_dbg_get_address_from_dabr"; - case 0xbd69e584: return "sys_dbg_get_spu_thread_group_name"; - case 0xc0eb9266: return "sys_dbg_finalize_ppu_exception_handler"; - case 0xc21ee635: return "sys_dbg_read_spu_thread_context"; - case 0xc353353a: return "sys_dbg_initialize_ppu_exception_handler"; - case 0xc5eef17f: return "sys_dbg_read_ppu_thread_context"; - case 0xc6d7ec13: return "sys_dbg_unregister_ppu_exception_handler"; - case 0xcb377e36: return "sys_dbg_get_lwmutex_information"; - case 0xd830062a: return "sys_dbg_signal_to_coredump_handler"; - case 0xdb14b37b: return "sys_dbg_set_address_to_dabr"; - case 0xdf856979: return "sys_dbg_get_event_flag_information"; - case 0xf254768c: return "sys_dbg_disable_floating_point_enabled_exception"; - case 0x051ee3ee: return "socketpoll"; - case 0x05bd4438: return "sys_net_get_udpp2p_test_param"; - case 0x10b81ed6: return "sys_net_set_udpp2p_test_param"; - case 0x139a9e9b: return "sys_net_initialize_network_ex"; - case 0x13efe7f5: return "getsockname"; - case 0x1d14d6e4: return "sys_net_get_lib_name_server"; - case 0x1f953b9f: return "recvfrom"; - case 0x27fb339d: return "sys_net_if_ctl"; - case 0x28e208bb: return "listen"; - case 0x368823c0: return "sys_net_get_netemu_test_param"; - case 0x3b27c780: return "sys_net_get_sockinfo"; - case 0x3f09e20a: return "socketselect"; - case 0x44328aa2: return "sys_net_close_dump"; - case 0x4ab0b9b9: return "sys_net_set_test_param"; - case 0x506ad863: return "inet_network"; - case 0x5420e419: return "sys_net_show_nameserver"; - case 0x566893ce: return "inet_lnaof"; - case 0x5a045bd1: return "getsockopt"; - case 0x6005cde1: return "_sys_net_errno_loc"; - case 0x64f66d35: return "connect"; - case 0x6db6e8cd: return "socketclose"; - case 0x71f4c717: return "gethostbyname"; - case 0x7687d48c: return "sys_net_set_resolver_configurations"; - case 0x79b61646: return "sys_net_show_route"; - case 0x858a930b: return "inet_ntoa"; - case 0x88f03575: return "setsockopt"; - case 0x89c9917c: return "sys_net_read_dump"; - case 0x8af3825e: return "inet_pton"; - case 0x8ccf05ed: return "sys_net_abort_resolver"; - case 0x8d1b77fb: return "sys_net_abort_socket"; - case 0x9647570b: return "sendto"; - case 0x9a318259: return "sys_net_set_lib_name_server"; - case 0x9c056962: return "socket"; - case 0xa50777c6: return "shutdown"; - case 0xa5a86557: return "sys_net_get_test_param"; - case 0xa765d029: return "sys_net_get_sockinfo_ex"; - case 0xa9a079e0: return "inet_aton"; - case 0xab447704: return "sys_net_open_dump"; - case 0xad09481b: return "sendmsg"; - case 0xb0a59804: return "bind"; - case 0xb4152c74: return "inet_makeaddr"; - case 0xb48636c4: return "sys_net_show_ifconfig"; - case 0xb68d5625: return "sys_net_finalize_network"; - case 0xc9157d30: return "_sys_net_h_errno_loc"; - case 0xc94f6939: return "accept"; - case 0xc98a3146: return "inet_ntop"; - case 0xc9d09c34: return "recvmsg"; - case 0xdabbc2c0: return "inet_addr"; - case 0xdc751b40: return "send"; - case 0xe2434507: return "sys_net_set_netemu_test_param"; - case 0xe39a62a7: return "inet_netof"; - case 0xf7ac8941: return "gethostbyaddr"; - case 0xf9ec2db6: return "getpeername"; - case 0xfba04f37: return "recv"; - case 0xfdb8f926: return "sys_net_free_thread_context"; - case 0x0341bb97: return "sys_prx_get_module_id_by_address"; - case 0x04e83d2c: return "_sys_strncmp"; - case 0x052d29a6: return "_sys_strcat"; - case 0x05c65656: return "sys_mempool_try_allocate_block"; - case 0x0618936b: return "_sys_vsnprintf"; - case 0x06574237: return "_sys_snprintf"; - case 0x1573dc3f: return "sys_lwmutex_lock"; - case 0x191f0c4a: return "_sys_strrchr"; - case 0x1ae10b92: return "_sys_spu_printf_attach_thread"; - case 0x1bc200f4: return "sys_lwmutex_unlock"; - case 0x1c9a942c: return "sys_lwcond_destroy"; - case 0x1ca525a2: return "_sys_strncasecmp"; - case 0x1ed454ce: return "sys_spu_elf_get_information"; - case 0x24a1ea07: return "sys_ppu_thread_create"; - case 0x25596f51: return "sys_mempool_get_count"; - case 0x26090058: return "sys_prx_load_module"; - case 0x27427742: return "_sys_memmove"; - case 0x2a6d9d51: return "sys_lwcond_wait"; - case 0x2c847572: return "_sys_process_atexitspawn"; - case 0x2d36462b: return "_sys_strlen"; - case 0x2f85c0ef: return "sys_lwmutex_create"; - case 0x3172759d: return "sys_game_get_temperature"; - case 0x318f17e1: return "_sys_memalign"; - case 0x350d454e: return "sys_ppu_thread_get_id"; - case 0x35168520: return "_sys_heap_malloc"; - case 0x3bd53c7b: return "_sys_memchr"; - case 0x3dd4a957: return "sys_ppu_thread_register_atexit"; - case 0x409ad939: return "sys_mmapper_free_memory"; - case 0x42b23552: return "sys_prx_register_library"; - case 0x44265c08: return "_sys_heap_memalign"; - case 0x459b4393: return "_sys_strcmp"; - case 0x45fe2fce: return "_sys_spu_printf_initialize"; - case 0x4643ba6e: return "sys_mmapper_unmap_memory"; - case 0x4a071d98: return "sys_interrupt_thread_disestablish"; - case 0x4b2f301a: return "_sys_tolower"; - case 0x5267cb35: return "sys_spinlock_unlock"; - case 0x52aadadf: return "sys_lwcond_signal_to"; - case 0x5fdfb2fe: return "_sys_spu_printf_detach_group"; - case 0x608212fc: return "sys_mempool_free_block"; - case 0x620e35a7: return "sys_game_get_system_sw_version"; - case 0x67f9fedb: return "sys_game_process_exitspawn2"; - case 0x68b9b011: return "_sys_memset"; - case 0x6bf66ea7: return "_sys_memcpy"; - case 0x6e05231d: return "sys_game_watchdog_stop"; - case 0x70258515: return "sys_mmapper_allocate_memory_from_container"; - case 0x71a8472a: return "sys_get_random_number"; - case 0x722a0254: return "sys_spinlock_trylock"; - case 0x74311398: return "sys_prx_get_my_module_id"; - case 0x744680a2: return "sys_initialize_tls"; - case 0x7498887b: return "_sys_strchr"; - case 0x791b9219: return "_sys_vsprintf"; - case 0x80fb0c19: return "sys_prx_stop_module"; - case 0x8461e528: return "sys_time_get_system_time"; - case 0x84bb6774: return "sys_prx_get_module_info"; - case 0x893305fa: return "sys_raw_spu_load"; - case 0x8985b5b6: return "_sys_heap_stats"; - case 0x8a2f159b: return "console_getc"; - case 0x8a561d92: return "_sys_heap_free"; - case 0x8bb03ab8: return "sys_game_board_storage_write"; - case 0x8c2bb498: return "sys_spinlock_initialize"; - case 0x96328741: return "_sys_process_at_Exitspawn"; - case 0x4f7172c9: return "sys_process_is_stack"; - case 0x996f7cf8: return "_sys_strncat"; - case 0x99c88692: return "_sys_strcpy"; - case 0x9d3c0f81: return "sys_mempool_destroy"; - case 0x9e0623b5: return "sys_game_watchdog_start"; - case 0x9f04f7af: return "_sys_printf"; - case 0x9f18429d: return "sys_prx_start_module"; - case 0x9f950780: return "sys_game_get_rtc_status"; - case 0xa146a143: return "sys_mempool_allocate_block"; - case 0xa1f9eafe: return "_sys_sprintf"; - case 0xa285139d: return "sys_spinlock_lock"; - case 0xa2c7ba64: return "sys_prx_exitspawn_with_level"; - case 0xa330ad84: return "sys_prx_load_module_on_memcontainer_by_fd"; - case 0xa3e3be68: return "sys_ppu_thread_once"; - case 0xa5d06bf0: return "sys_prx_get_module_list"; - case 0xaa6d9bff: return "sys_prx_load_module_on_memcontainer"; - case 0xac6fc404: return "sys_ppu_thread_unregister_atexit"; - case 0xacad8fb6: return "sys_game_watchdog_clear"; - case 0xaeb78725: return "sys_lwmutex_trylock"; - case 0xaede4b03: return "_sys_heap_delete_heap"; - case 0xaff080a4: return "sys_ppu_thread_exit"; - case 0xb257540b: return "sys_mmapper_allocate_memory"; - case 0xb27c8ae7: return "sys_prx_load_module_list"; - case 0xb2fcf2c8: return "_sys_heap_create_heap"; - case 0xb3bbcf2a: return "_sys_spu_printf_detach_thread"; - case 0xb6369393: return "_sys_heap_get_total_free_size"; - case 0xb995662e: return "sys_raw_spu_image_load"; - case 0xb9bf1078: return "_sys_heap_alloc_heap_memory"; - case 0xbdb18f83: return "_sys_malloc"; - case 0xc3476d0c: return "sys_lwmutex_destroy"; - case 0xc4fd6121: return "_sys_qsort"; - case 0xca9a60bf: return "sys_mempool_create"; - case 0xd0ea47a7: return "sys_prx_unregister_library"; - case 0xd1ad4570: return "_sys_heap_get_mallinfo"; - case 0xd3039d4d: return "_sys_strncpy"; - case 0xda0eb71a: return "sys_lwcond_create"; - case 0xdb6b3250: return "sys_spu_elf_get_segments"; - case 0xdc578057: return "sys_mmapper_map_memory"; - case 0xdd0c1e09: return "_sys_spu_printf_attach_group"; - case 0xdd3b27ac: return "_sys_spu_printf_finalize"; - case 0xe0998dbf: return "sys_prx_get_module_id_by_name"; - case 0xe0da8efd: return "sys_spu_image_close"; - case 0xe66bac36: return "console_putc"; - case 0xe6f2c1e7: return "sys_process_exit"; - case 0xe76964f5: return "sys_game_board_storage_read"; - case 0xe7ef3a80: return "sys_prx_load_module_list_on_memcontainer"; - case 0xe9a1bd84: return "sys_lwcond_signal_all"; - case 0xebe5f72f: return "sys_spu_image_import"; - case 0xeef75113: return "_sys_toupper"; - case 0xef68c17c: return "sys_prx_load_module_by_fd"; - case 0xef87a695: return "sys_lwcond_signal"; - case 0xf0aece0d: return "sys_prx_unload_module"; - case 0xf57e1d6f: return "console_write"; - case 0xf7f7fb20: return "_sys_free"; - case 0xfa7f693d: return "_sys_vprintf"; - case 0xfb5db080: return "_sys_memcmp"; - case 0xfc52a7a9: return "sys_game_process_exitspawn"; - } - - // check registered functions - if (fid < 0x100000000ull) - { - if (const auto func = get_ppu_func_by_nid(static_cast(fid))) - { - if (func->name) - { - return func->name; - } - } - } - - return ~fid < 1024 ? fmt::format("syscall_%lld", ~fid) : fmt::format("0x%08llX", fid); -}