daedalus/Source/SysPSP/DynaRec/AssemblyWriterPSP.h
2019-05-03 20:32:33 -04:00

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_