summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/rsp/rspcp2s.h
blob: f040ca9c52a726e96d59f8add9ea73589d9ae367 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/***************************************************************************

    rspcp2s.h

    Interface file for Reality Signal Processor (RSP) vector extensions
    using SSSE3 SIMD acceleration.

    Copyright the MESS team
    Released for general non-commercial use under the MAME license
    Visit http://mamedev.org for licensing and usage restrictions.

***************************************************************************/

#pragma once

#ifndef __RSPCP2S_H__
#define __RSPCP2S_H__

#include "cpu/drcuml.h"
#include "rsp.h"
#include "rspcp2.h"

#include <tmmintrin.h>

class rsp_cop2_simd : public rsp_cop2_drc
{
	friend class rsp_device;

	rsp_cop2_simd(rsp_device &rsp, running_machine &machine);

	virtual int generate_cop2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc);
	virtual int generate_lwc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc);
	virtual int generate_swc2(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc);

	virtual void state_string_export(const int index, astring &string);

public:
	virtual void lbv();
	virtual void lsv();
	virtual void llv();
	virtual void ldv();
	virtual void lqv();
	virtual void lrv();
	virtual void lpv();
	virtual void luv();
	virtual void lhv();
	virtual void lfv();
	virtual void lwv();
	virtual void ltv();
	virtual void sbv();
	virtual void ssv();
	virtual void slv();
	virtual void sdv();
	virtual void sqv();
	virtual void srv();
	virtual void spv();
	virtual void suv();
	virtual void shv();
	virtual void sfv();
	virtual void swv();
	virtual void stv();
	virtual void vmulf();
	virtual void vmulu();
	virtual void vmudl();
	virtual void vmudm();
	virtual void vmudn();
	virtual void vmudh();
	virtual void vmacf();
	virtual void vmacu();
	virtual void vmadl();
	virtual void vmadm();
	virtual void vmadn();
	virtual void vmadh();
	virtual void vadd();
	virtual void vsub();
	virtual void vabs();
	virtual void vaddc();
	virtual void vsubc();
	virtual void vaddb();
	virtual void vsaw();
	virtual void vlt();
	virtual void veq();
	virtual void vne();
	virtual void vge();
	virtual void vcl();
	virtual void vch();
	virtual void vcr();
	virtual void vmrg();
	virtual void vand();
	virtual void vnand();
	virtual void vor();
	virtual void vnor();
	virtual void vxor();
	virtual void vnxor();
	virtual void vrcp();
	virtual void vrcpl();
	virtual void vrcph();
	virtual void vmov();
	virtual void vrsql();
	virtual void vrsqh();
	virtual void vrsq();
	virtual void mfc2();
	virtual void cfc2();
	virtual void mtc2();
	virtual void ctc2();

#if SIMUL_SIMD
	void backup_regs();
	void restore_regs();
	void verify_regs();
#endif

private:
	virtual int     generate_vector_opcode(drcuml_block *block, rsp_device::compiler_state *compiler, const opcode_desc *desc);

	UINT16          ACCUM_H(int x);
	UINT16          ACCUM_M(int x);
	UINT16          ACCUM_L(int x);
	UINT16          ACCUM_LL(int x);
	UINT16          CARRY_FLAG(const int x);
	UINT16          COMPARE_FLAG(const int x);
	UINT16          CLIP1_FLAG(const int x);
	UINT16          ZERO_FLAG(const int x);
	UINT16          CLIP2_FLAG(const int x);
	UINT16          SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive);

	__m128i         m_accum_h;
	__m128i         m_accum_m;
	__m128i         m_accum_l;
	__m128i         m_accum_ll;

	// Mirror of v[] for now, to be used in parallel as
	// more vector ops are transitioned over
	__m128i         m_xv[32];
	__m128i         m_xvflag[6];

#if SIMUL_SIMD
	UINT32          m_old_r[35];
	UINT8           m_old_dmem[4096];

	UINT32          m_scalar_r[35];
	UINT8           m_scalar_dmem[4096];

	INT32           m_old_reciprocal_res;
	UINT32          m_old_reciprocal_high;
	INT32           m_old_dp_allowed;

	INT32           m_scalar_reciprocal_res;
	UINT32          m_scalar_reciprocal_high;
	INT32           m_scalar_dp_allowed;

	INT32           m_simd_reciprocal_res;
	UINT32          m_simd_reciprocal_high;
	INT32           m_simd_dp_allowed;
#endif
};

#endif /* __RSPCP2S_H__ */