mirror of
https://github.com/DaedalusX64/daedalus.git
synced 2025-04-02 10:21:48 -04:00
188 lines
7.1 KiB
C++
188 lines
7.1 KiB
C++
/*
|
|
Copyright (C) 2005 StrmnNrmn
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifndef SYSPSP_DYNAREC_ASSEMBLYWRITERPSP_H_
|
|
#define SYSPSP_DYNAREC_ASSEMBLYWRITERPSP_H_
|
|
|
|
#include "DynaRec/AssemblyBuffer.h"
|
|
#include "DynarecTargetPSP.h"
|
|
|
|
#include "Core/R4300OpCode.h"
|
|
|
|
class CAssemblyWriterPSP
|
|
{
|
|
public:
|
|
CAssemblyWriterPSP( CAssemblyBuffer * p_buffer_a, CAssemblyBuffer * p_buffer_b )
|
|
: mpCurrentBuffer( p_buffer_a )
|
|
, mpAssemblyBufferA( p_buffer_a )
|
|
, mpAssemblyBufferB( p_buffer_b )
|
|
{
|
|
}
|
|
|
|
public:
|
|
CAssemblyBuffer * GetAssemblyBuffer() const { return mpCurrentBuffer; }
|
|
void Finalise()
|
|
{
|
|
mpCurrentBuffer = nullptr;
|
|
mpAssemblyBufferA = nullptr;
|
|
mpAssemblyBufferB = nullptr;
|
|
}
|
|
|
|
void SetBufferA()
|
|
{
|
|
mpCurrentBuffer = mpAssemblyBufferA;
|
|
}
|
|
void SetBufferB()
|
|
{
|
|
mpCurrentBuffer = mpAssemblyBufferB;
|
|
}
|
|
bool IsBufferA() const
|
|
{
|
|
return mpCurrentBuffer == mpAssemblyBufferA;
|
|
}
|
|
|
|
// XXXX
|
|
private:
|
|
public:
|
|
void LoadConstant( EPspReg reg, s32 value );
|
|
|
|
void LoadRegister( EPspReg reg_dst, OpCodeValue load_op, EPspReg reg_base, s16 offset );
|
|
void StoreRegister( EPspReg reg_src, OpCodeValue store_op, EPspReg reg_base, s16 offset );
|
|
|
|
void NOP();
|
|
void LUI( EPspReg reg, u16 value );
|
|
|
|
void SW( EPspReg reg_src, EPspReg reg_base, s16 offset );
|
|
void SH( EPspReg reg_src, EPspReg reg_base, s16 offset );
|
|
void SB( EPspReg reg_src, EPspReg reg_base, s16 offset );
|
|
|
|
void LB( EPspReg reg_dst, EPspReg reg_base, s16 offset );
|
|
void LBU( EPspReg reg_dst, EPspReg reg_base, s16 offset );
|
|
void LH( EPspReg reg_dst, EPspReg reg_base, s16 offset );
|
|
void LHU( EPspReg reg_dst, EPspReg reg_base, s16 offset );
|
|
void LW( EPspReg reg_dst, EPspReg reg_base, s16 offset );
|
|
|
|
void LWC1( EPspFloatReg reg_dst, EPspReg reg_base, s16 offset );
|
|
void SWC1( EPspFloatReg reg_src, EPspReg reg_base, s16 offset );
|
|
|
|
CJumpLocation JAL( CCodeLabel target, bool insert_delay );
|
|
CJumpLocation J( CCodeLabel target, bool insert_delay );
|
|
|
|
void JR( EPspReg reg_link, bool insert_delay );
|
|
|
|
CJumpLocation BNE( EPspReg a, EPspReg b, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BEQ( EPspReg a, EPspReg b, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BNEL( EPspReg a, EPspReg b, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BEQL( EPspReg a, EPspReg b, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BLEZ( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BGTZ( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
|
|
CJumpLocation BLTZ( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BGEZ( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BLTZL( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BGEZL( EPspReg a, CCodeLabel target, bool insert_delay );
|
|
|
|
void EXT( EPspReg reg_dst, EPspReg reg_src, u32 size, u32 lsb );
|
|
void INS( EPspReg reg_dst, EPspReg reg_src, u32 msb, u32 lsb );
|
|
void ADDI( EPspReg reg_dst, EPspReg reg_src, s16 value );
|
|
void ADDIU( EPspReg reg_dst, EPspReg reg_src, s16 value );
|
|
void SLTI( EPspReg reg_dst, EPspReg reg_src, s16 value );
|
|
void SLTIU( EPspReg reg_dst, EPspReg reg_src, s16 value );
|
|
|
|
void ANDI( EPspReg reg_dst, EPspReg reg_src, u16 immediate );
|
|
void ORI( EPspReg reg_dst, EPspReg reg_src, u16 immediate );
|
|
void XORI( EPspReg reg_dst, EPspReg reg_src, u16 immediate );
|
|
|
|
void SLL( EPspReg reg_dst, EPspReg reg_src, u32 shift );
|
|
void SRL( EPspReg reg_dst, EPspReg reg_src, u32 shift );
|
|
void SRA( EPspReg reg_dst, EPspReg reg_src, u32 shift );
|
|
void SLLV( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void SRLV( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void SRAV( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
|
|
void MFLO( EPspReg rd );
|
|
void MFHI( EPspReg rd );
|
|
void MULT( EPspReg rs, EPspReg rt );
|
|
void MULTU( EPspReg rs, EPspReg rt );
|
|
void DIV( EPspReg rs, EPspReg rt );
|
|
void DIVU( EPspReg rs, EPspReg rt );
|
|
|
|
void ADD( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void ADDU( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void SUB( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void SUBU( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void AND( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void OR( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void XOR( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void NOR( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
|
|
void SLT( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
void SLTU( EPspReg rd, EPspReg rs, EPspReg rt );
|
|
|
|
void Cop1Op( ECop1Op cop1_op, EPspFloatReg fd, EPspFloatReg fs, ECop1OpFunction cop1_funct, EPspFloatReg ft );
|
|
void Cop1Op( ECop1Op cop1_op, EPspFloatReg fd, EPspFloatReg fs, ECop1OpFunction cop1_funct );
|
|
|
|
void CFC1( EPspReg rt, EPspFloatReg fs );
|
|
|
|
void MFC1( EPspReg rt, EPspFloatReg fs );
|
|
void MTC1( EPspFloatReg fs, EPspReg rt );
|
|
|
|
void ADD_S( EPspFloatReg fd, EPspFloatReg fs, EPspFloatReg ft );
|
|
void SUB_S( EPspFloatReg fd, EPspFloatReg fs, EPspFloatReg ft );
|
|
void MUL_S( EPspFloatReg fd, EPspFloatReg fs, EPspFloatReg ft );
|
|
void DIV_S( EPspFloatReg fd, EPspFloatReg fs, EPspFloatReg ft );
|
|
|
|
void SQRT_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
void ABS_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
void MOV_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
void NEG_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
|
|
void TRUNC_W_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
void FLOOR_W_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
void CVT_W_S( EPspFloatReg fd, EPspFloatReg fs );
|
|
|
|
void CMP_S( EPspFloatReg fs, ECop1OpFunction cmp_op, EPspFloatReg ft );
|
|
|
|
void CVT_S_W( EPspFloatReg fd, EPspFloatReg fs );
|
|
|
|
CJumpLocation BranchCop1( ECop1BCOp bc_op, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BC1F( CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BC1T( CCodeLabel target, bool insert_delay );
|
|
|
|
static void GetLoadConstantOps( EPspReg reg, s32 value, PspOpCode * p_op1, PspOpCode * p_op2 );
|
|
|
|
inline void AppendOp( PspOpCode op )
|
|
{
|
|
mpCurrentBuffer->EmitDWORD( op._u32 );
|
|
}
|
|
|
|
private:
|
|
CJumpLocation BranchOp( EPspReg a, OpCodeValue op, EPspReg b, CCodeLabel target, bool insert_delay );
|
|
CJumpLocation BranchRegImmOp( EPspReg a, ERegImmOp op, CCodeLabel target, bool insert_delay );
|
|
void SpecOpLogical( EPspReg rd, EPspReg rs, ESpecOp op, EPspReg rt );
|
|
|
|
private:
|
|
CAssemblyBuffer * mpCurrentBuffer;
|
|
CAssemblyBuffer * mpAssemblyBufferA;
|
|
CAssemblyBuffer * mpAssemblyBufferB;
|
|
};
|
|
|
|
#endif // SYSPSP_DYNAREC_ASSEMBLYWRITERPSP_H_
|