Previous 199869 Revisions Next

r31834 Friday 29th August, 2014 at 20:01:29 UTC by Wilbert Pol
rsp.c: Modernised cpu core (nw)
[src/emu/cpu/rsp]rsp.c rsp.h rspdrc.c rspfe.c rspfe.h
[src/mame/machine]n64.c

trunk/src/mame/machine/n64.c
r31833r31834
24172417   /* configure fast RAM regions for DRC */
24182418   dynamic_cast<mips3_device *>(machine().device("maincpu"))->mips3drc_add_fastram(0x00000000, 0x007fffff, FALSE, rdram);
24192419
2420   rspdrc_set_options(machine().device("rsp"), RSPDRC_STRICT_VERIFY);
2421   rspdrc_flush_drc_cache(machine().device("rsp"));
2422   rspdrc_add_dmem(machine().device("rsp"), rsp_dmem);
2423   rspdrc_add_imem(machine().device("rsp"), rsp_imem);
2420   rsp_device *rsp = machine().device<rsp_device>("rsp");
2421   rsp->rspdrc_set_options(RSPDRC_STRICT_VERIFY);
2422   rsp->rspdrc_flush_drc_cache();
2423   rsp->rspdrc_add_dmem(rsp_dmem);
2424   rsp->rspdrc_add_imem(rsp_imem);
24242425
24252426   /* add a hook for battery save */
24262427   machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(n64_state::n64_machine_stop),this));
trunk/src/emu/cpu/rsp/rspdrc.c
r31833r31834
3636extern offs_t rsp_dasm_one(char *buffer, offs_t pc, UINT32 op);
3737
3838/***************************************************************************
39    DEBUGGING
40***************************************************************************/
41
42#define LOG_UML                         (0)
43#define LOG_NATIVE                      (0)
44
45#define SINGLE_INSTRUCTION_MODE         (0)
46
47
48/***************************************************************************
4939    CONSTANTS
5040***************************************************************************/
5141
r31833r31834
5343#define MAPVAR_PC                       M0
5444#define MAPVAR_CYCLES                   M1
5545
56/* size of the execution code cache */
57#define CACHE_SIZE                      (32 * 1024 * 1024)
58
59/* compilation boundaries -- how far back/forward does the analysis extend? */
60#define COMPILE_BACKWARDS_BYTES         128
61#define COMPILE_FORWARDS_BYTES          512
62#define COMPILE_MAX_INSTRUCTIONS        ((COMPILE_BACKWARDS_BYTES/4) + (COMPILE_FORWARDS_BYTES/4))
63#define COMPILE_MAX_SEQUENCE            64
64
6546/* exit codes */
6647#define EXECUTE_OUT_OF_CYCLES           0
6748#define EXECUTE_MISSING_CODE            1
r31833r31834
7455    MACROS
7556***************************************************************************/
7657
77#define R32(reg)                rsp->impstate->regmap[reg]
58#define R32(reg)                m_regmap[reg]
7859
7960/***************************************************************************
80    STRUCTURES & TYPEDEFS
81***************************************************************************/
82
83/* fast RAM info */
84struct fast_ram_info
85{
86   offs_t              start;                      /* start of the RAM block */
87   offs_t              end;                        /* end of the RAM block */
88   UINT8               readonly;                   /* TRUE if read-only */
89   void *              base;                       /* base in memory where the RAM lives */
90};
91
92
93/* internal compiler state */
94struct compiler_state
95{
96   UINT32              cycles;                     /* accumulated cycles */
97   UINT8               checkints;                  /* need to check interrupts before next instruction */
98   UINT8               checksoftints;              /* need to check software interrupts before next instruction */
99   code_label  labelnum;                   /* index for local labels */
100};
101
102struct rspimp_state
103{
104   /* core state */
105   drc_cache *         cache;                      /* pointer to the DRC code cache */
106   drcuml_state *      drcuml;                     /* DRC UML generator state */
107   rsp_frontend *      drcfe;                      /* pointer to the DRC front-end state */
108   UINT32              drcoptions;                 /* configurable DRC options */
109
110   /* internal stuff */
111   UINT8               cache_dirty;                /* true if we need to flush the cache */
112   UINT32              jmpdest;                    /* destination jump target */
113
114   /* parameters for subroutines */
115   UINT64              numcycles;                  /* return value from gettotalcycles */
116   const char *        format;                     /* format string for print_debug */
117   UINT32              arg0;                       /* print_debug argument 1 */
118   UINT32              arg1;                       /* print_debug argument 2 */
119   UINT32              arg2;                       /* print_debug argument 3 */
120   UINT32              arg3;                       /* print_debug argument 4 */
121   UINT32              vres[8];                    /* used for temporary vector results */
122
123   /* register mappings */
124   parameter   regmap[34];                 /* parameter to register mappings for all 32 integer registers */
125
126   /* subroutines */
127   code_handle *   entry;                      /* entry point */
128   code_handle *   nocode;                     /* nocode exception handler */
129   code_handle *   out_of_cycles;              /* out of cycles exception handler */
130   code_handle *   read8;                      /* read byte */
131   code_handle *   write8;                     /* write byte */
132   code_handle *   read16;                     /* read half */
133   code_handle *   write16;                    /* write half */
134   code_handle *   read32;                     /* read word */
135   code_handle *   write32;                    /* write word */
136};
137
138/***************************************************************************
139    FUNCTION PROTOTYPES
140***************************************************************************/
141
142static void code_flush_cache(rsp_state *rsp);
143static void code_compile_block(rsp_state *rsp, offs_t pc);
144
145static void cfunc_unimplemented(void *param);
146static void cfunc_set_cop0_reg(void *param);
147static void cfunc_get_cop0_reg(void *param);
148#if USE_SIMD
149static void cfunc_mfc2_simd(void *param);
150static void cfunc_cfc2_simd(void *param);
151static void cfunc_mtc2_simd(void *param);
152static void cfunc_ctc2_simd(void *param);
153#endif
154
155#if (!USE_SIMD || SIMUL_SIMD)
156static void cfunc_mfc2_scalar(void *param);
157static void cfunc_cfc2_scalar(void *param);
158static void cfunc_mtc2_scalar(void *param);
159static void cfunc_ctc2_scalar(void *param);
160#endif
161//static void cfunc_swc2(void *param);
162//static void cfunc_lwc2(void *param);
163static void cfunc_sp_set_status_cb(void *param);
164
165#if USE_SIMD
166static void cfunc_rsp_lbv_simd(void *param);
167static void cfunc_rsp_lsv_simd(void *param);
168static void cfunc_rsp_llv_simd(void *param);
169static void cfunc_rsp_ldv_simd(void *param);
170static void cfunc_rsp_lqv_simd(void *param);
171static void cfunc_rsp_lrv_simd(void *param);
172static void cfunc_rsp_lpv_simd(void *param);
173static void cfunc_rsp_luv_simd(void *param);
174static void cfunc_rsp_lhv_simd(void *param);
175static void cfunc_rsp_lfv_simd(void *param);
176static void cfunc_rsp_lwv_simd(void *param);
177static void cfunc_rsp_ltv_simd(void *param);
178
179static void cfunc_rsp_sbv_simd(void *param);
180static void cfunc_rsp_ssv_simd(void *param);
181static void cfunc_rsp_slv_simd(void *param);
182static void cfunc_rsp_sdv_simd(void *param);
183static void cfunc_rsp_sqv_simd(void *param);
184static void cfunc_rsp_srv_simd(void *param);
185static void cfunc_rsp_spv_simd(void *param);
186static void cfunc_rsp_suv_simd(void *param);
187static void cfunc_rsp_shv_simd(void *param);
188static void cfunc_rsp_sfv_simd(void *param);
189static void cfunc_rsp_swv_simd(void *param);
190static void cfunc_rsp_stv_simd(void *param);
191#endif
192
193#if (!USE_SIMD || SIMUL_SIMD)
194static void cfunc_rsp_lbv_scalar(void *param);
195static void cfunc_rsp_lsv_scalar(void *param);
196static void cfunc_rsp_llv_scalar(void *param);
197static void cfunc_rsp_ldv_scalar(void *param);
198static void cfunc_rsp_lqv_scalar(void *param);
199static void cfunc_rsp_lrv_scalar(void *param);
200static void cfunc_rsp_lpv_scalar(void *param);
201static void cfunc_rsp_luv_scalar(void *param);
202static void cfunc_rsp_lhv_scalar(void *param);
203static void cfunc_rsp_lfv_scalar(void *param);
204static void cfunc_rsp_lwv_scalar(void *param);
205static void cfunc_rsp_ltv_scalar(void *param);
206
207static void cfunc_rsp_sbv_scalar(void *param);
208static void cfunc_rsp_ssv_scalar(void *param);
209static void cfunc_rsp_slv_scalar(void *param);
210static void cfunc_rsp_sdv_scalar(void *param);
211static void cfunc_rsp_sqv_scalar(void *param);
212static void cfunc_rsp_srv_scalar(void *param);
213static void cfunc_rsp_spv_scalar(void *param);
214static void cfunc_rsp_suv_scalar(void *param);
215static void cfunc_rsp_shv_scalar(void *param);
216static void cfunc_rsp_sfv_scalar(void *param);
217static void cfunc_rsp_swv_scalar(void *param);
218static void cfunc_rsp_stv_scalar(void *param);
219#endif
220
221static void static_generate_entry_point(rsp_state *rsp);
222static void static_generate_nocode_handler(rsp_state *rsp);
223static void static_generate_out_of_cycles(rsp_state *rsp);
224static void static_generate_memory_accessor(rsp_state *rsp, int size, int iswrite, const char *name, code_handle *&handleptr);
225
226static int generate_lwc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
227static int generate_swc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
228static void generate_update_cycles(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, parameter param, int allow_exception);
229static void generate_checksum_block(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast);
230static void generate_sequence_instruction(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
231static void generate_delay_slot_and_branch(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg);
232static int generate_opcode(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
233static int generate_special(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
234static int generate_regimm(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
235static int generate_cop0(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
236static int generate_cop2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
237
238static void log_add_disasm_comment(rsp_state *rsp, drcuml_block *block, UINT32 pc, UINT32 op);
239
240/***************************************************************************
24161    HELPFUL DEFINES
24262***************************************************************************/
24363
r31833r31834
27797#define SIMD_EXTRACT16C(reg, value, element) value = _mm_extract_epi16(reg, element);
27898#define SIMD_INSERT16C(reg, value, element) reg = _mm_insert_epi16(reg, value, element);
27999
280#define VREG_B(reg, offset)         rsp->v[(reg)].b[(offset)^1]
281#define W_VREG_S(reg, offset)       rsp->v[(reg)].s[(offset)]
282#define VREG_S(reg, offset)         (INT16)rsp->v[(reg)].s[(offset)]
100#define VREG_B(reg, offset)         m_v[(reg)].b[(offset)^1]
101#define W_VREG_S(reg, offset)       m_v[(reg)].s[(offset)]
102#define VREG_S(reg, offset)         (INT16)m_v[(reg)].s[(offset)]
283103
284104#define VEC_EL_2(x,z)               (vector_elements_2[(x)][(z)])
285105
286#define ACCUM(x)        rsp->accum[x].q
106#define ACCUM(x)        m_accum[x].q
287107
288108#define CARRY       0
289109#define COMPARE     1
r31833r31834
291111#define ZERO        3
292112#define CLIP2       4
293113
114
294115#if USE_SIMD
295INLINE UINT16 VEC_ACCUM_H(const rsp_state *rsp, int x)
116static void cfunc_mfc2_simd(void *param);
117static void cfunc_cfc2_simd(void *param);
118static void cfunc_mtc2_simd(void *param);
119static void cfunc_ctc2_simd(void *param);
120#endif
121
122#if (!USE_SIMD || SIMUL_SIMD)
123static void cfunc_mfc2_scalar(void *param);
124static void cfunc_cfc2_scalar(void *param);
125static void cfunc_mtc2_scalar(void *param);
126static void cfunc_ctc2_scalar(void *param);
127#endif
128
129
130#if USE_SIMD
131inline UINT16 rsp_device::VEC_ACCUM_H(int x)
296132{
297133   UINT16 out;
298   SIMD_EXTRACT16(rsp->accum_h, out, x);
134   SIMD_EXTRACT16(m_accum_h, out, x);
299135   return out;
300136}
301137
302INLINE UINT16 VEC_ACCUM_M(const rsp_state *rsp, int x)
138inline UINT16 rsp_device::VEC_ACCUM_M(int x)
303139{
304140   UINT16 out;
305   SIMD_EXTRACT16(rsp->accum_m, out, x);
141   SIMD_EXTRACT16(m_accum_m, out, x);
306142   return out;
307143}
308144
309INLINE UINT16 VEC_ACCUM_L(const rsp_state *rsp, int x)
145inline UINT16 rsp_device::VEC_ACCUM_L(int x)
310146{
311147   UINT16 out;
312   SIMD_EXTRACT16(rsp->accum_l, out, x);
148   SIMD_EXTRACT16(m_accum_l, out, x);
313149   return out;
314150}
315151
316INLINE UINT16 VEC_ACCUM_LL(const rsp_state *rsp, int x)
152inline UINT16 rsp_device::VEC_ACCUM_LL(int x)
317153{
318154   UINT16 out;
319   SIMD_EXTRACT16(rsp->accum_ll, out, x);
155   SIMD_EXTRACT16(m_accum_ll, out, x);
320156   return out;
321157}
322158
323#define VEC_SET_ACCUM_H(v, x) SIMD_INSERT16(rsp->accum_h, v, x);
324#define VEC_SET_ACCUM_M(v, x) SIMD_INSERT16(rsp->accum_m, v, x);
325#define VEC_SET_ACCUM_L(v, x) SIMD_INSERT16(rsp->accum_l, v, x);
326#define VEC_SET_ACCUM_LL(v, x) SIMD_INSERT16(rsp->accum_ll, v, x);
159#define VEC_SET_ACCUM_H(v, x) SIMD_INSERT16(m_accum_h, v, x);
160#define VEC_SET_ACCUM_M(v, x) SIMD_INSERT16(m_>accum_m, v, x);
161#define VEC_SET_ACCUM_L(v, x) SIMD_INSERT16(m_accum_l, v, x);
162#define VEC_SET_ACCUM_LL(v, x) SIMD_INSERT16(m_accum_ll, v, x);
327163
328#define VEC_GET_SCALAR_VS1(out, i) SIMD_EXTRACT16(rsp->xv[VS1REG], out, i);
329#define VEC_GET_SCALAR_VS2(out, i) SIMD_EXTRACT16(rsp->xv[VS2REG], out, VEC_EL_2(EL, i));
164#define VEC_GET_SCALAR_VS1(out, i) SIMD_EXTRACT16(m_xv[VS1REG], out, i);
165#define VEC_GET_SCALAR_VS2(out, i) SIMD_EXTRACT16(m_xv[VS2REG], out, VEC_EL_2(EL, i));
330166
331INLINE UINT16 VEC_CARRY_FLAG(rsp_state *rsp, const int x)
167inline UINT16 rsp_device::VEC_CARRY_FLAG(const int x)
332168{
333169   UINT16 out;
334   SIMD_EXTRACT16(rsp->xvflag[CARRY], out, x);
170   SIMD_EXTRACT16(m_xvflag[CARRY], out, x);
335171   return out;
336172}
337173
338INLINE UINT16 VEC_COMPARE_FLAG(rsp_state *rsp, const int x)
174inline UINT16 rsp_device::VEC_COMPARE_FLAG(const int x)
339175{
340176   UINT16 out;
341   SIMD_EXTRACT16(rsp->xvflag[COMPARE], out, x);
177   SIMD_EXTRACT16(m_xvflag[COMPARE], out, x);
342178   return out;
343179}
344180
345INLINE UINT16 VEC_CLIP1_FLAG(rsp_state *rsp, const int x)
181inline UINT16 rsp_device::VEC_CLIP1_FLAG(const int x)
346182{
347183   UINT16 out;
348   SIMD_EXTRACT16(rsp->xvflag[CLIP1], out, x);
184   SIMD_EXTRACT16(m_xvflag[CLIP1], out, x);
349185   return out;
350186}
351187
352INLINE UINT16 VEC_ZERO_FLAG(rsp_state *rsp, const int x)
188inline UINT16 rsp_device::VEC_ZERO_FLAG(const int x)
353189{
354190   UINT16 out;
355   SIMD_EXTRACT16(rsp->xvflag[ZERO], out, x);
191   SIMD_EXTRACT16(m_xvflag[ZERO], out, x);
356192   return out;
357193}
358194
359INLINE UINT16 VEC_CLIP2_FLAG(rsp_state *rsp, const int x)
195inline UINT16 rsp_device::VEC_CLIP2_FLAG(const int x)
360196{
361197   UINT16 out;
362   SIMD_EXTRACT16(rsp->xvflag[CLIP2], out, x);
198   SIMD_EXTRACT16(m_xvflag[CLIP2], out, x);
363199   return out;
364200}
365201
366#define VEC_CLEAR_CARRY_FLAGS()     { rsp->xvflag[CARRY] = _mm_setzero_si128(); }
367#define VEC_CLEAR_COMPARE_FLAGS()   { rsp->xvflag[COMPARE] = _mm_setzero_si128(); }
368#define VEC_CLEAR_CLIP1_FLAGS()     { rsp->xvflag[CLIP1] = _mm_setzero_si128(); }
369#define VEC_CLEAR_ZERO_FLAGS()      { rsp->xvflag[ZERO] = _mm_setzero_si128(); }
370#define VEC_CLEAR_CLIP2_FLAGS()     { rsp->xvflag[CLIP2] = _mm_setzero_si128(); }
202#define VEC_CLEAR_CARRY_FLAGS()     { m_xvflag[CARRY] = _mm_setzero_si128(); }
203#define VEC_CLEAR_COMPARE_FLAGS()   { m_xvflag[COMPARE] = _mm_setzero_si128(); }
204#define VEC_CLEAR_CLIP1_FLAGS()     { m_xvflag[CLIP1] = _mm_setzero_si128(); }
205#define VEC_CLEAR_ZERO_FLAGS()      { m_xvflag[ZERO] = _mm_setzero_si128(); }
206#define VEC_CLEAR_CLIP2_FLAGS()     { m_xvflag[CLIP2] = _mm_setzero_si128(); }
371207
372#define VEC_SET_CARRY_FLAG(x)       { SIMD_INSERT16(rsp->xvflag[CARRY], 0xffff, x); }
373#define VEC_SET_COMPARE_FLAG(x)     { SIMD_INSERT16(rsp->xvflag[COMPARE], 0xffff, x); }
374#define VEC_SET_CLIP1_FLAG(x)       { SIMD_INSERT16(rsp->xvflag[CLIP1], 0xffff, x); }
375#define VEC_SET_ZERO_FLAG(x)        { SIMD_INSERT16(rsp->xvflag[ZERO], 0xffff, x); }
376#define VEC_SET_CLIP2_FLAG(x)       { SIMD_INSERT16(rsp->xvflag[CLIP2], 0xffff, x); }
208#define VEC_SET_CARRY_FLAG(x)       { SIMD_INSERT16(m_xvflag[CARRY], 0xffff, x); }
209#define VEC_SET_COMPARE_FLAG(x)     { SIMD_INSERT16(m_xvflag[COMPARE], 0xffff, x); }
210#define VEC_SET_CLIP1_FLAG(x)       { SIMD_INSERT16(m_xvflag[CLIP1], 0xffff, x); }
211#define VEC_SET_ZERO_FLAG(x)        { SIMD_INSERT16(m_xvflag[ZERO], 0xffff, x); }
212#define VEC_SET_CLIP2_FLAG(x)       { SIMD_INSERT16(m_xvflag[CLIP2], 0xffff, x); }
377213
378#define VEC_CLEAR_CARRY_FLAG(x)     { SIMD_INSERT16(rsp->xvflag[CARRY], 0, x); }
379#define VEC_CLEAR_COMPARE_FLAG(x)   { SIMD_INSERT16(rsp->xvflag[COMPARE], 0, x); }
380#define VEC_CLEAR_CLIP1_FLAG(x)     { SIMD_INSERT16(rsp->xvflag[CLIP1], 0, x); }
381#define VEC_CLEAR_ZERO_FLAG(x)      { SIMD_INSERT16(rsp->xvflag[ZERO], 0, x); }
382#define VEC_CLEAR_CLIP2_FLAG(x)     { SIMD_INSERT16(rsp->xvflag[CLIP2], 0, x); }
214#define VEC_CLEAR_CARRY_FLAG(x)     { SIMD_INSERT16(m_xvflag[CARRY], 0, x); }
215#define VEC_CLEAR_COMPARE_FLAG(x)   { SIMD_INSERT16(m_xvflag[COMPARE], 0, x); }
216#define VEC_CLEAR_CLIP1_FLAG(x)     { SIMD_INSERT16(m_xvflag[CLIP1], 0, x); }
217#define VEC_CLEAR_ZERO_FLAG(x)      { SIMD_INSERT16(m_xvflag[ZERO], 0, x); }
218#define VEC_CLEAR_CLIP2_FLAG(x)     { SIMD_INSERT16(m_xvflag[CLIP2], 0, x); }
383219
384220#endif
385221
386#define ACCUM_H(v, x)           (UINT16)rsp->accum[x].w[3]
387#define ACCUM_M(v, x)           (UINT16)rsp->accum[x].w[2]
388#define ACCUM_L(v, x)           (UINT16)rsp->accum[x].w[1]
389#define ACCUM_LL(v, x)          (UINT16)rsp->accum[x].w[0]
222#define ACCUM_H(x)           (UINT16)m_accum[x].w[3]
223#define ACCUM_M(x)           (UINT16)m_accum[x].w[2]
224#define ACCUM_L(x)           (UINT16)m_accum[x].w[1]
225#define ACCUM_LL(x)          (UINT16)m_accum[x].w[0]
390226
391#define SET_ACCUM_H(v, x)       rsp->accum[x].w[3] = v;
392#define SET_ACCUM_M(v, x)       rsp->accum[x].w[2] = v;
393#define SET_ACCUM_L(v, x)       rsp->accum[x].w[1] = v;
394#define SET_ACCUM_LL(v, x)      rsp->accum[x].w[0] = v;
227#define SET_ACCUM_H(v, x)       m_accum[x].w[3] = v;
228#define SET_ACCUM_M(v, x)       m_accum[x].w[2] = v;
229#define SET_ACCUM_L(v, x)       m_accum[x].w[1] = v;
230#define SET_ACCUM_LL(v, x)      m_accum[x].w[0] = v;
395231
396232#define SCALAR_GET_VS1(out, i)  out = VREG_S(VS1REG, i)
397233#define SCALAR_GET_VS2(out, i)  out = VREG_S(VS2REG, VEC_EL_2(EL, i))
398234
399#define CARRY_FLAG(rsp, x)          (rsp->vflag[CARRY][x & 7] != 0 ? 0xffff : 0)
400#define COMPARE_FLAG(rsp, x)        (rsp->vflag[COMPARE][x & 7] != 0 ? 0xffff : 0)
401#define CLIP1_FLAG(rsp, x)          (rsp->vflag[CLIP1][x & 7] != 0 ? 0xffff : 0)
402#define ZERO_FLAG(rsp, x)           (rsp->vflag[ZERO][x & 7] != 0 ? 0xffff : 0)
403#define CLIP2_FLAG(rsp, x)          (rsp->vflag[CLIP2][x & 7] != 0 ? 0xffff : 0)
235#define CARRY_FLAG(x)          (m_vflag[CARRY][x & 7] != 0 ? 0xffff : 0)
236#define COMPARE_FLAG(x)        (m_vflag[COMPARE][x & 7] != 0 ? 0xffff : 0)
237#define CLIP1_FLAG(x)          (m_vflag[CLIP1][x & 7] != 0 ? 0xffff : 0)
238#define ZERO_FLAG(x)           (m_vflag[ZERO][x & 7] != 0 ? 0xffff : 0)
239#define CLIP2_FLAG(x)          (m_vflag[CLIP2][x & 7] != 0 ? 0xffff : 0)
404240
405#define CLEAR_CARRY_FLAGS()         { memset(rsp->vflag[CARRY], 0, 16); }
406#define CLEAR_COMPARE_FLAGS()       { memset(rsp->vflag[COMPARE], 0, 16); }
407#define CLEAR_CLIP1_FLAGS()         { memset(rsp->vflag[CLIP1], 0, 16); }
408#define CLEAR_ZERO_FLAGS()          { memset(rsp->vflag[ZERO], 0, 16); }
409#define CLEAR_CLIP2_FLAGS()         { memset(rsp->vflag[CLIP2], 0, 16); }
241#define CLEAR_CARRY_FLAGS()         { memset(m_vflag[CARRY], 0, 16); }
242#define CLEAR_COMPARE_FLAGS()       { memset(m_vflag[COMPARE], 0, 16); }
243#define CLEAR_CLIP1_FLAGS()         { memset(m_vflag[CLIP1], 0, 16); }
244#define CLEAR_ZERO_FLAGS()          { memset(m_vflag[ZERO], 0, 16); }
245#define CLEAR_CLIP2_FLAGS()         { memset(m_vflag[CLIP2], 0, 16); }
410246
411#define SET_CARRY_FLAG(x)           { rsp->vflag[CARRY][x & 7] = 0xffff; }
412#define SET_COMPARE_FLAG(x)         { rsp->vflag[COMPARE][x & 7] = 0xffff; }
413#define SET_CLIP1_FLAG(x)           { rsp->vflag[CLIP1][x & 7] = 0xffff; }
414#define SET_ZERO_FLAG(x)            { rsp->vflag[ZERO][x & 7] = 0xffff; }
415#define SET_CLIP2_FLAG(x)           { rsp->vflag[CLIP2][x & 7] = 0xffff; }
247#define SET_CARRY_FLAG(x)           { m_vflag[CARRY][x & 7] = 0xffff; }
248#define SET_COMPARE_FLAG(x)         { m_vflag[COMPARE][x & 7] = 0xffff; }
249#define SET_CLIP1_FLAG(x)           { m_vflag[CLIP1][x & 7] = 0xffff; }
250#define SET_ZERO_FLAG(x)            { m_vflag[ZERO][x & 7] = 0xffff; }
251#define SET_CLIP2_FLAG(x)           { m_vflag[CLIP2][x & 7] = 0xffff; }
416252
417#define CLEAR_CARRY_FLAG(x)         { rsp->vflag[CARRY][x & 7] = 0; }
418#define CLEAR_COMPARE_FLAG(x)       { rsp->vflag[COMPARE][x & 7] = 0; }
419#define CLEAR_CLIP1_FLAG(x)         { rsp->vflag[CLIP1][x & 7] = 0; }
420#define CLEAR_ZERO_FLAG(x)          { rsp->vflag[ZERO][x & 7] = 0; }
421#define CLEAR_CLIP2_FLAG(x)         { rsp->vflag[CLIP2][x & 7] = 0; }
253#define CLEAR_CARRY_FLAG(x)         { m_vflag[CARRY][x & 7] = 0; }
254#define CLEAR_COMPARE_FLAG(x)       { m_vflag[COMPARE][x & 7] = 0; }
255#define CLEAR_CLIP1_FLAG(x)         { m_vflag[CLIP1][x & 7] = 0; }
256#define CLEAR_ZERO_FLAG(x)          { m_vflag[ZERO][x & 7] = 0; }
257#define CLEAR_CLIP2_FLAG(x)         { m_vflag[CLIP2][x & 7] = 0; }
422258
423INLINE rsp_state *get_safe_token(device_t *device)
424{
425   assert(device != NULL);
426   assert(device->type() == RSP_DRC);
427   return *(rsp_state **)downcast<legacy_cpu_device *>(device)->token();
428}
429259
430260/***************************************************************************
431261    INLINE FUNCTIONS
r31833r31834
459289    registers
460290-------------------------------------------------*/
461291
462INLINE void load_fast_iregs(rsp_state *rsp, drcuml_block *block)
292inline void rsp_device::load_fast_iregs(drcuml_block *block)
463293{
464294   int regnum;
465295
466   for (regnum = 0; regnum < ARRAY_LENGTH(rsp->impstate->regmap); regnum++)
467      if (rsp->impstate->regmap[regnum].is_int_register())
468         UML_MOV(block, ireg(rsp->impstate->regmap[regnum].ireg() - REG_I0), mem(&rsp->r[regnum]));
296   for (regnum = 0; regnum < ARRAY_LENGTH(m_regmap); regnum++)
297      if (m_regmap[regnum].is_int_register())
298         UML_MOV(block, ireg(m_regmap[regnum].ireg() - REG_I0), mem(&m_rsp_state->r[regnum]));
469299}
470300
471301
r31833r31834
474304    registers
475305-------------------------------------------------*/
476306
477INLINE void save_fast_iregs(rsp_state *rsp, drcuml_block *block)
307inline void rsp_device::save_fast_iregs(drcuml_block *block)
478308{
479309   int regnum;
480310
481   for (regnum = 0; regnum < ARRAY_LENGTH(rsp->impstate->regmap); regnum++)
482      if (rsp->impstate->regmap[regnum].is_int_register())
483         UML_MOV(block, mem(&rsp->r[regnum]), ireg(rsp->impstate->regmap[regnum].ireg() - REG_I0));
311   for (regnum = 0; regnum < ARRAY_LENGTH(m_regmap); regnum++)
312      if (m_regmap[regnum].is_int_register())
313         UML_MOV(block, mem(&m_rsp_state->r[regnum]), ireg(m_regmap[regnum].ireg() - REG_I0));
484314}
485315
486316/***************************************************************************
487317    CORE CALLBACKS
488318***************************************************************************/
489319
490void rspdrc_add_imem(device_t *device, UINT32 *base)
320void rsp_device::rspdrc_add_imem(UINT32 *base)
491321{
492   if (!device->machine().options().drc()) return;
493   rsp_state *rsp = get_safe_token(device);
494   rsp->imem32 = base;
495   rsp->imem16 = (UINT16*)base;
496   rsp->imem8 = (UINT8*)base;
322   m_imem32 = base;
323   m_imem16 = (UINT16*)base;
324   m_imem8 = (UINT8*)base;
497325}
498326
499void rspdrc_add_dmem(device_t *device, UINT32 *base)
327void rsp_device::rspdrc_add_dmem(UINT32 *base)
500328{
501   if (!device->machine().options().drc()) return;
502   rsp_state *rsp = get_safe_token(device);
503   rsp->dmem32 = base;
504   rsp->dmem16 = (UINT16*)base;
505   rsp->dmem8 = (UINT8*)base;
329   m_dmem32 = base;
330   m_dmem16 = (UINT16*)base;
331   m_dmem8 = (UINT8*)base;
506332}
507333
508INLINE UINT8 READ8(rsp_state *rsp, UINT32 address)
334inline UINT8 rsp_device::DM_READ8(UINT32 address)
509335{
510   UINT8 ret = rsp->dmem8[BYTE4_XOR_BE(address & 0xfff)];
336   UINT8 ret = m_dmem8[BYTE4_XOR_BE(address & 0xfff)];
511337   return ret;
512338}
513339
340inline void rsp_device::ccfunc_read8()
341{
342   m_rsp_state->arg0 = DM_READ8(m_rsp_state->arg0);
343}
344
514345static void cfunc_read8(void *param)
515346{
516   rsp_state *rsp = (rsp_state *)param;
517   rsp->impstate->arg0 = READ8(rsp, rsp->impstate->arg0);
347   ((rsp_device *)param)->ccfunc_read8();
518348}
519349
520INLINE UINT16 READ16(rsp_state *rsp, UINT32 address)
350inline UINT16 rsp_device::DM_READ16(UINT32 address)
521351{
522352   UINT16 ret;
523353   address &= 0xfff;
524   ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 8;
525   ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)];
354   ret = m_dmem8[BYTE4_XOR_BE(address)] << 8;
355   ret |= m_dmem8[BYTE4_XOR_BE(address + 1)];
526356   return ret;
527357}
528358
359inline void rsp_device::ccfunc_read16()
360{
361   m_rsp_state->arg0 = DM_READ16(m_rsp_state->arg0);
362}
363
529364static void cfunc_read16(void *param)
530365{
531   rsp_state *rsp = (rsp_state *)param;
532   rsp->impstate->arg0 = READ16(rsp, rsp->impstate->arg0);
366   ((rsp_device *)param)->ccfunc_read16();
533367}
534368
535INLINE UINT32 READ32(rsp_state *rsp, UINT32 address)
369inline UINT32 rsp_device::DM_READ32(UINT32 address)
536370{
537371   UINT32 ret;
538372   address &= 0xfff;
539   ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 24;
540   ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)] << 16;
541   ret |= rsp->dmem8[BYTE4_XOR_BE(address + 2)] << 8;
542   ret |= rsp->dmem8[BYTE4_XOR_BE(address + 3)];
373   ret = m_dmem8[BYTE4_XOR_BE(address)] << 24;
374   ret |= m_dmem8[BYTE4_XOR_BE(address + 1)] << 16;
375   ret |= m_dmem8[BYTE4_XOR_BE(address + 2)] << 8;
376   ret |= m_dmem8[BYTE4_XOR_BE(address + 3)];
543377   return ret;
544378}
545379
380inline void rsp_device::ccfunc_read32()
381{
382   m_rsp_state->arg0 = DM_READ32(m_rsp_state->arg0);
383}
384
546385static void cfunc_read32(void *param)
547386{
548   rsp_state *rsp = (rsp_state *)param;
549   rsp->impstate->arg0 = READ32(rsp, rsp->impstate->arg0);
387   ((rsp_device *)param)->ccfunc_read32();;
550388}
551389
552INLINE void WRITE8(rsp_state *rsp, UINT32 address, UINT8 data)
390inline void rsp_device::DM_WRITE8(UINT32 address, UINT8 data)
553391{
554392   address &= 0xfff;
555   rsp->dmem8[BYTE4_XOR_BE(address)] = data;
393   m_dmem8[BYTE4_XOR_BE(address)] = data;
556394}
557395
396inline void rsp_device::ccfunc_write8()
397{
398   DM_WRITE8(m_rsp_state->arg0, m_rsp_state->arg1);
399}
400
558401static void cfunc_write8(void *param)
559402{
560   rsp_state *rsp = (rsp_state *)param;
561   WRITE8(rsp, rsp->impstate->arg0, (UINT8)rsp->impstate->arg1);
403   ((rsp_device *)param)->ccfunc_write8();;
562404}
563405
564INLINE void WRITE16(rsp_state *rsp, UINT32 address, UINT16 data)
406inline void rsp_device::DM_WRITE16(UINT32 address, UINT16 data)
565407{
566408   address &= 0xfff;
567   rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 8;
568   rsp->dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff;
409   m_dmem8[BYTE4_XOR_BE(address)] = data >> 8;
410   m_dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff;
569411}
570412
413inline void rsp_device::ccfunc_write16()
414{
415   DM_WRITE16(m_rsp_state->arg0, m_rsp_state->arg1);
416}
417
571418static void cfunc_write16(void *param)
572419{
573   rsp_state *rsp = (rsp_state *)param;
574   WRITE16(rsp, rsp->impstate->arg0, (UINT16)rsp->impstate->arg1);
420   ((rsp_device *)param)->ccfunc_write16();;
575421}
576422
577INLINE void WRITE32(rsp_state *rsp, UINT32 address, UINT32 data)
423inline void rsp_device::DM_WRITE32(UINT32 address, UINT32 data)
578424{
579425   address &= 0xfff;
580   rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 24;
581   rsp->dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff;
582   rsp->dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff;
583   rsp->dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff;
426   m_dmem8[BYTE4_XOR_BE(address)] = data >> 24;
427   m_dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff;
428   m_dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff;
429   m_dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff;
584430}
585431
432inline void rsp_device::ccfunc_write32()
433{
434   DM_WRITE32(m_rsp_state->arg0, m_rsp_state->arg1);
435}
436
586437static void cfunc_write32(void *param)
587438{
588   rsp_state *rsp = (rsp_state *)param;
589   WRITE32(rsp, rsp->impstate->arg0, rsp->impstate->arg1);
439   ((rsp_device *)param)->ccfunc_write32();;
590440}
591441
592442/*****************************************************************************/
r31833r31834
595445    rspdrc_set_options - configure DRC options
596446-------------------------------------------------*/
597447
598void rspdrc_set_options(device_t *device, UINT32 options)
448void rsp_device::rspdrc_set_options(UINT32 options)
599449{
600   if (!device->machine().options().drc()) return;
601   rsp_state *rsp = get_safe_token(device);
602   rsp->impstate->drcoptions = options;
450   if (!machine().options().drc()) return;
451   m_drcoptions = options;
603452}
604453
605454
r31833r31834
609458-------------------------------------------------*/
610459
611460#ifdef UNUSED_CODE
612static void cfunc_printf_debug(void *param)
461inline void rs_device::cfunc_printf_debug()
613462{
614   rsp_state *rsp = (rsp_state *)param;
615   switch(rsp->impstate->arg2)
463   switch(m_arg2)
616464   {
617465      case 0: // WRITE8
618         printf("%04x:%02x\n", rsp->impstate->arg0 & 0xffff, (UINT8)rsp->impstate->arg1);
466         printf("%04x:%02x\n", m_rsp_state->arg0 & 0xffff, (UINT8)m_rsp_state->arg1);
619467         break;
620468      case 1: // WRITE16
621         printf("%04x:%04x\n", rsp->impstate->arg0 & 0xffff, (UINT16)rsp->impstate->arg1);
469         printf("%04x:%04x\n", m_rsp_state->arg0 & 0xffff, (UINT16)m_rsp_state->arg1);
622470         break;
623471      case 2: // WRITE32
624         printf("%04x:%08x\n", rsp->impstate->arg0 & 0xffff, rsp->impstate->arg1);
472         printf("%04x:%08x\n", m_rsp_state->arg0 & 0xffff, m_rsp_state->arg1);
625473         break;
626474      case 3: // READ8
627         printf("%04xr%02x\n", rsp->impstate->arg0 & 0xffff, (UINT8)rsp->impstate->arg1);
475         printf("%04xr%02x\n", m_rsp_state->arg0 & 0xffff, (UINT8)m_rsp_state->arg1);
628476         break;
629477      case 4: // READ16
630         printf("%04xr%04x\n", rsp->impstate->arg0 & 0xffff, (UINT16)rsp->impstate->arg1);
478         printf("%04xr%04x\n", m_rsp_state->arg0 & 0xffff, (UINT16)m_rsp_state->arg1);
631479         break;
632480      case 5: // READ32
633         printf("%04xr%08x\n", rsp->impstate->arg0 & 0xffff, rsp->impstate->arg1);
481         printf("%04xr%08x\n", m_rsp_state->arg0 & 0xffff, m_rsp_state->arg1);
634482         break;
635483      case 6: // Checksum
636         printf("Sum: %08x\n", rsp->impstate->arg0);
484         printf("Sum: %08x\n", m_rsp_state->arg0);
637485         break;
638486      case 7: // Checksum
639         printf("Correct Sum: %08x\n", rsp->impstate->arg0);
487         printf("Correct Sum: %08x\n", m_rsp_state->arg0);
640488         break;
641489      default: // ???
642         printf("%08x %08x\n", rsp->impstate->arg0 & 0xffff, rsp->impstate->arg1);
490         printf("%08x %08x\n", m_rsp_state->arg0 & 0xffff, m_rsp_state->arg1);
643491         break;
644492   }
645493}
494
495static void cfunc_printf_debug(void *param)
496{
497   ((rsp_device *)param)->ccfunc_printf_debug();
498}
646499#endif
647500
648static void cfunc_get_cop0_reg(void *param)
501inline void rsp_device::ccfunc_get_cop0_reg()
649502{
650   rsp_state *rsp = (rsp_state*)param;
651   int reg = rsp->impstate->arg0;
652   int dest = rsp->impstate->arg1;
503   int reg = m_rsp_state->arg0;
504   int dest = m_rsp_state->arg1;
653505
654506   if (reg >= 0 && reg < 8)
655507   {
656508      if(dest)
657509      {
658         rsp->r[dest] = (rsp->device->sp_reg_r_func)(reg, 0xffffffff);
510         m_rsp_state->r[dest] = m_sp_reg_r_func(reg, 0xffffffff);
659511      }
660512   }
661513   else if (reg >= 8 && reg < 16)
662514   {
663515      if(dest)
664516      {
665         rsp->r[dest] = (rsp->device->dp_reg_r_func)(reg - 8, 0xffffffff);
517         m_rsp_state->r[dest] = m_dp_reg_r_func(reg - 8, 0xffffffff);
666518      }
667519   }
668520   else
r31833r31834
671523   }
672524}
673525
674static void cfunc_set_cop0_reg(void *param)
526static void cfunc_get_cop0_reg(void *param)
675527{
676   rsp_state *rsp = (rsp_state*)param;
677   int reg = rsp->impstate->arg0;
678   UINT32 data = rsp->impstate->arg1;
528   ((rsp_device *)param)->ccfunc_get_cop0_reg();
529}
679530
531inline void rsp_device::ccfunc_set_cop0_reg()
532{
533   int reg = m_rsp_state->arg0;
534   UINT32 data = m_rsp_state->arg1;
535
680536   if (reg >= 0 && reg < 8)
681537   {
682      (rsp->device->sp_reg_w_func)(reg, data, 0xffffffff);
538      m_sp_reg_w_func(reg, data, 0xffffffff);
683539   }
684540   else if (reg >= 8 && reg < 16)
685541   {
686      (rsp->device->dp_reg_w_func)(reg - 8, data, 0xffffffff);
542      m_dp_reg_w_func(reg - 8, data, 0xffffffff);
687543   }
688544   else
689545   {
r31833r31834
691547   }
692548}
693549
694static void cfunc_unimplemented_opcode(void *param)
550static void cfunc_set_cop0_reg(void *param)
695551{
696   rsp_state *rsp = (rsp_state*)param;
697   int op = rsp->impstate->arg0;
698   if ((rsp->device->machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
699   {
700      char string[200];
701      rsp_dasm_one(string, rsp->ppc, op);
702      osd_printf_debug("%08X: %s\n", rsp->ppc, string);
703   }
704
705   fatalerror("RSP: unknown opcode %02X (%08X) at %08X\n", op >> 26, op, rsp->ppc);
552   ((rsp_device *)param)->ccfunc_set_cop0_reg();
706553}
707554
708static void unimplemented_opcode(rsp_state *rsp, UINT32 op)
555inline void rsp_device::ccfunc_unimplemented_opcode()
709556{
710   if ((rsp->device->machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
557   int op = m_rsp_state->arg0;
558   if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
711559   {
712560      char string[200];
713      rsp_dasm_one(string, rsp->ppc, op);
714      osd_printf_debug("%08X: %s\n", rsp->ppc, string);
561      rsp_dasm_one(string, m_ppc, op);
562      osd_printf_debug("%08X: %s\n", m_ppc, string);
715563   }
716564
717   fatalerror("RSP: unknown opcode %02X (%08X) at %08X\n", op >> 26, op, rsp->ppc);
565   fatalerror("RSP: unknown opcode %02X (%08X) at %08X\n", op >> 26, op, m_ppc);
718566}
719567
568static void cfunc_unimplemented_opcode(void *param)
569{
570   ((rsp_device *)param)->ccfunc_unimplemented_opcode();
571}
572
720573/*****************************************************************************/
721574
722575/* Legacy.  Going forward, this will be transitioned into unrolled opcode decodes. */
r31833r31834
757610static __m128i vec_shuf_inverse[16];
758611#endif
759612
760static void rspcom_init(rsp_state *rsp, legacy_cpu_device *device, device_irq_acknowledge_delegate irqcallback)
613void rsp_device::rspcom_init()
761614{
762   int regIdx = 0;
763   int accumIdx;
764
765   memset(rsp, 0, sizeof(*rsp));
766
767   rsp->irq_callback = irqcallback;
768   rsp->device = downcast<rsp_cpu_device *>(device);
769   rsp->program = &device->space(AS_PROGRAM);
770   rsp->direct = &rsp->program->direct();
771   rsp->device->resolve_cb();
772
773   // Inaccurate.  RSP registers power on to a random state...
774   for(regIdx = 0; regIdx < 32; regIdx++ )
775   {
776      rsp->r[regIdx] = 0;
777      rsp->v[regIdx].d[0] = 0;
778      rsp->v[regIdx].d[1] = 0;
779   }
780
781615#if USE_SIMD
782616   VEC_CLEAR_CARRY_FLAGS();
783617   VEC_CLEAR_COMPARE_FLAGS();
r31833r31834
793627   CLEAR_ZERO_FLAGS();
794628   CLEAR_CLIP2_FLAGS();
795629#endif
796   rsp->reciprocal_res = 0;
797   rsp->reciprocal_high = 0;
798630
799   // ...except for the accumulators.
800   for(accumIdx = 0; accumIdx < 8; accumIdx++ )
801   {
802      rsp->accum[accumIdx].q = 0;
803   }
804
805   rsp->sr = RSP_STATUS_HALT;
806   rsp->step_count = 0;
807
808631#if USE_SIMD
809632   vec_shuf_inverse[ 0] = _mm_set_epi16(0x0f0e, 0x0d0c, 0x0b0a, 0x0908, 0x0706, 0x0504, 0x0302, 0x0100); // none
810633   vec_shuf_inverse[ 1] = _mm_set_epi16(0x0f0e, 0x0d0c, 0x0b0a, 0x0908, 0x0706, 0x0504, 0x0302, 0x0100); // ???
r31833r31834
839662   vec_shuf[13] = _mm_set_epi16(0x0504, 0x0504, 0x0504, 0x0504, 0x0504, 0x0504, 0x0504, 0x0504); // 5
840663   vec_shuf[14] = _mm_set_epi16(0x0302, 0x0302, 0x0302, 0x0302, 0x0302, 0x0302, 0x0302, 0x0302); // 6
841664   vec_shuf[15] = _mm_set_epi16(0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100); // 7
842   rsp->accum_h = _mm_setzero_si128();
843   rsp->accum_m = _mm_setzero_si128();
844   rsp->accum_l = _mm_setzero_si128();
845   rsp->accum_ll = _mm_setzero_si128();
665   m_accum_h = _mm_setzero_si128();
666   m_accum_m = _mm_setzero_si128();
667   m_accum_l = _mm_setzero_si128();
668   m_accum_ll = _mm_setzero_si128();
846669   vec_neg1 = _mm_set_epi64x(0xffffffffffffffffL, 0xffffffffffffffffL);
847670   vec_zero = _mm_setzero_si128();
848671   vec_himask = _mm_set_epi64x(0xffff0000ffff0000L, 0xffff0000ffff0000L);
r31833r31834
858681#endif
859682}
860683
861static CPU_INIT( rsp )
862{
863   rsp_state *rsp;
864   drc_cache *cache;
865   UINT32 flags = 0;
866   int regnum;
867   //int elnum;
868684
869   /* allocate enough space for the cache and the core */
870   cache = auto_alloc(device->machine(), drc_cache(CACHE_SIZE + sizeof(*rsp)));
871
872   /* allocate the core memory */
873   *(rsp_state **)device->token() = rsp = (rsp_state *)cache->alloc_near(sizeof(*rsp));
874   memset(rsp, 0, sizeof(*rsp));
875
876   rspcom_init(rsp, device, irqcallback);
877
878   /* allocate the implementation-specific state from the full cache */
879   rsp->impstate = (rspimp_state *)cache->alloc_near(sizeof(*rsp->impstate));
880   memset(rsp->impstate, 0, sizeof(*rsp->impstate));
881   rsp->impstate->cache = cache;
882
883   /* initialize the UML generator */
884   if (LOG_UML)
885   {
886      flags |= DRCUML_OPTION_LOG_UML;
887   }
888   if (LOG_NATIVE)
889   {
890      flags |= DRCUML_OPTION_LOG_NATIVE;
891   }
892   rsp->impstate->drcuml = auto_alloc(device->machine(), drcuml_state(*device, *cache, flags, 8, 32, 2));
893
894   /* add symbols for our stuff */
895   rsp->impstate->drcuml->symbol_add(&rsp->pc, sizeof(rsp->pc), "pc");
896   rsp->impstate->drcuml->symbol_add(&rsp->icount, sizeof(rsp->icount), "icount");
897   for (regnum = 0; regnum < 32; regnum++)
898   {
899      char buf[10];
900      sprintf(buf, "r%d", regnum);
901      rsp->impstate->drcuml->symbol_add(&rsp->r[regnum], sizeof(rsp->r[regnum]), buf);
902   }
903   rsp->impstate->drcuml->symbol_add(&rsp->impstate->arg0, sizeof(rsp->impstate->arg0), "arg0");
904   rsp->impstate->drcuml->symbol_add(&rsp->impstate->arg1, sizeof(rsp->impstate->arg1), "arg1");
905   rsp->impstate->drcuml->symbol_add(&rsp->impstate->arg2, sizeof(rsp->impstate->arg2), "arg2");
906   rsp->impstate->drcuml->symbol_add(&rsp->impstate->arg3, sizeof(rsp->impstate->arg3), "arg3");
907   rsp->impstate->drcuml->symbol_add(&rsp->impstate->numcycles, sizeof(rsp->impstate->numcycles), "numcycles");
908
909   /* initialize the front-end helper */
910   rsp->impstate->drcfe = auto_alloc(device->machine(), rsp_frontend(*rsp, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
911
912   /* compute the register parameters */
913   for (regnum = 0; regnum < 32; regnum++)
914      rsp->impstate->regmap[regnum] = (regnum == 0) ? parameter(0) : parameter::make_memory(&rsp->r[regnum]);
915
916   /*
917   drcbe_info beinfo;
918   rsp->impstate->drcuml->get_backend_info(beinfo);
919   if (beinfo.direct_iregs > 2)
920   {
921       rsp->impstate->regmap[30] = I2;
922   }
923   if (beinfo.direct_iregs > 3)
924   {
925       rsp->impstate->regmap[31] = I3;
926   }
927   if (beinfo.direct_iregs > 4)
928   {
929       rsp->impstate->regmap[2] = I4;
930   }
931   if (beinfo.direct_iregs > 5)
932   {
933       rsp->impstate->regmap[3] = I5;
934   }
935   if (beinfo.direct_iregs > 6)
936   {
937       rsp->impstate->regmap[4] = I6;
938   }
939   */
940
941   /* mark the cache dirty so it is updated on next execute */
942   rsp->impstate->cache_dirty = TRUE;
943}
944
945static CPU_EXIT( rsp )
946{
947   rsp_state *rsp = get_safe_token(device);
948
949   /* clean up the DRC */
950   auto_free(device->machine(), rsp->impstate->drcfe);
951   auto_free(device->machine(), rsp->impstate->drcuml);
952   auto_free(device->machine(), rsp->impstate->cache);
953}
954
955
956static CPU_RESET( rsp )
957{
958   rsp_state *rsp = get_safe_token(device);
959   rsp->nextpc = ~0;
960}
961
962685#if USE_SIMD
963686// LBV
964687//
r31833r31834
969692//
970693// Load 1 byte to vector byte index
971694
972static void cfunc_rsp_lbv_simd(void *param)
695inline void rsp_device::ccfunc_rsp_lbv_simd()
973696{
974   rsp_state *rsp = (rsp_state*)param;
975   UINT32 op = rsp->impstate->arg0;
697   UINT32 op = m_rsp_state->arg0;
976698
977699   UINT32 ea = 0;
978700   int dest = (op >> 16) & 0x1f;
r31833r31834
984706      offset |= 0xffffffc0;
985707   }
986708
987   ea = (base) ? rsp->r[base] + offset : offset;
709   ea = (base) ? m_rsp_state->r[base] + offset : offset;
988710
989711   UINT16 element;
990   SIMD_EXTRACT16(rsp->xv[dest], element, (index >> 1));
712   SIMD_EXTRACT16(m_xv[dest], element, (index >> 1));
991713   element &= 0xff00 >> ((1-(index & 1)) * 8);
992   element |= READ8(rsp, ea) << ((1-(index & 1)) * 8);
993   SIMD_INSERT16(rsp->xv[dest], element, (index >> 1));
714   element |= DM_READ8(ea) << ((1-(index & 1)) * 8);
715   SIMD_INSERT16(m_xv[dest], element, (index >> 1));
994716}
717
718static void cfunc_rsp_lbv_simd(void *param)
719{
720   ((rsp_device *)param)->ccfunc_rsp_lbv_simd();
721}
995722#endif
996723
997724#if (!USE_SIMD || SIMUL_SIMD)
998static void cfunc_rsp_lbv_scalar(void *param)
725inline void rsp_device::ccfunc_rsp_lbv_scalar()
999726{
1000   rsp_state *rsp = (rsp_state*)param;
1001   UINT32 op = rsp->impstate->arg0;
727   UINT32 op = m_rsp_state->arg0;
1002728
1003729   UINT32 ea = 0;
1004730   int dest = (op >> 16) & 0x1f;
r31833r31834
1010736      offset |= 0xffffffc0;
1011737   }
1012738
1013   ea = (base) ? rsp->r[base] + offset : offset;
1014   VREG_B(dest, index) = READ8(rsp, ea);
739   ea = (base) ? m_rsp_state->r[base] + offset : offset;
740   VREG_B(dest, index) = DM_READ8(ea);
1015741}
742
743static void cfunc_rsp_lbv_scalar(void *param)
744{
745   ((rsp_device *)param)->ccfunc_rsp_lbv_scalar();
746}
1016747#endif
1017748
1018749#if USE_SIMD
r31833r31834
1025756//
1026757// Loads 2 bytes starting from vector byte index
1027758
1028static void cfunc_rsp_lsv_simd(void *param)
759inline void rsp_device::ccfunc_rsp_lsv_simd()
1029760{
1030   rsp_state *rsp = (rsp_state*)param;
1031   UINT32 op = rsp->impstate->arg0;
761   UINT32 op = m_rsp_state->arg0;
1032762   int dest = (op >> 16) & 0x1f;
1033763   int base = (op >> 21) & 0x1f;
1034764   int index = (op >> 7) & 0xe;
r31833r31834
1038768      offset |= 0xffffffc0;
1039769   }
1040770
1041   UINT32 ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
771   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
1042772   int end = index + 2;
1043773   for (int i = index; i < end; i++)
1044774   {
1045775      UINT16 element;
1046      SIMD_EXTRACT16(rsp->xv[dest], element, (i >> 1));
776      SIMD_EXTRACT16(m_xv[dest], element, (i >> 1));
1047777      element &= 0xff00 >> ((1 - (i & 1)) * 8);
1048      element |= READ8(rsp, ea) << ((1 - (i & 1)) * 8);
1049      SIMD_INSERT16(rsp->xv[dest], element, (i >> 1));
778      element |= DM_READ8(ea) << ((1 - (i & 1)) * 8);
779      SIMD_INSERT16(m_xv[dest], element, (i >> 1));
1050780      ea++;
1051781   }
1052782}
783
784static void cfunc_rsp_lsv_simd(void *param)
785{
786   ((rsp_device *)param)->ccfunc_rsp_lsv_simd();
787}
1053788#endif
1054789
1055790#if (!USE_SIMD || SIMUL_SIMD)
1056static void cfunc_rsp_lsv_scalar(void *param)
791inline void rsp_device::ccfunc_rsp_lsv_scalar()
1057792{
1058   rsp_state *rsp = (rsp_state*)param;
1059   UINT32 op = rsp->impstate->arg0;
793   UINT32 op = m_rsp_state->arg0;
1060794   int dest = (op >> 16) & 0x1f;
1061795   int base = (op >> 21) & 0x1f;
1062796   int index = (op >> 7) & 0xe;
r31833r31834
1066800      offset |= 0xffffffc0;
1067801   }
1068802
1069   UINT32 ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
803   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
1070804   int end = index + 2;
1071805   for (int i = index; i < end; i++)
1072806   {
1073      VREG_B(dest, i) = READ8(rsp, ea);
807      VREG_B(dest, i) = DM_READ8(ea);
1074808      ea++;
1075809   }
1076810}
811
812static void cfunc_rsp_lsv_scalar(void *param)
813{
814   ((rsp_device *)param)->ccfunc_rsp_lsv_scalar();
815}
1077816#endif
1078817
1079818#if USE_SIMD
r31833r31834
1086825//
1087826// Loads 4 bytes starting from vector byte index
1088827
1089static void cfunc_rsp_llv_simd(void *param)
828inline void rsp_device::ccfunc_rsp_llv_simd()
1090829{
1091   rsp_state *rsp = (rsp_state*)param;
1092   UINT32 op = rsp->impstate->arg0;
830   UINT32 op = m_rsp_state->arg0;
1093831   UINT32 ea = 0;
1094832   int dest = (op >> 16) & 0x1f;
1095833   int base = (op >> 21) & 0x1f;
r31833r31834
1100838      offset |= 0xffffffc0;
1101839   }
1102840
1103   ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
841   ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
1104842
1105843   int end = index + 4;
1106844
1107845   for (int i = index; i < end; i++)
1108846   {
1109847      UINT16 element;
1110      SIMD_EXTRACT16(rsp->xv[dest], element, (i >> 1));
848      SIMD_EXTRACT16(m_xv[dest], element, (i >> 1));
1111849      element &= 0xff00 >> ((1 - (i & 1)) * 8);
1112      element |= READ8(rsp, ea) << ((1 - (i & 1)) * 8);
1113      SIMD_INSERT16(rsp->xv[dest], element, (i >> 1));
850      element |= DM_READ8(ea) << ((1 - (i & 1)) * 8);
851      SIMD_INSERT16(m_xv[dest], element, (i >> 1));
1114852      ea++;
1115853   }
1116854}
1117855
856static void cfunc_rsp_llv_simd(void *param)
857{
858   ((rsp_device *)param)->ccfunc_rsp_llv_simd();
859}
1118860#endif
1119861
1120862#if (!USE_SIMD || SIMUL_SIMD)
1121863
1122static void cfunc_rsp_llv_scalar(void *param)
864inline void rsp_device::ccfunc_rsp_llv_scalar()
1123865{
1124   rsp_state *rsp = (rsp_state*)param;
1125   UINT32 op = rsp->impstate->arg0;
866   UINT32 op = m_rsp_state->arg0;
1126867   UINT32 ea = 0;
1127868   int dest = (op >> 16) & 0x1f;
1128869   int base = (op >> 21) & 0x1f;
r31833r31834
1133874      offset |= 0xffffffc0;
1134875   }
1135876
1136   ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
877   ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
1137878
1138879   int end = index + 4;
1139880
1140881   for (int i = index; i < end; i++)
1141882   {
1142      VREG_B(dest, i) = READ8(rsp, ea);
883      VREG_B(dest, i) = DM_READ8(ea);
1143884      ea++;
1144885   }
1145886}
887
888static void cfunc_rsp_llv_scalar(void *param)
889{
890   ((rsp_device *)param)->ccfunc_rsp_llv_scalar();
891}
1146892#endif
1147893
1148894#if USE_SIMD
r31833r31834
1155901//
1156902// Loads 8 bytes starting from vector byte index
1157903
1158static void cfunc_rsp_ldv_simd(void *param)
904inline void rsp_device::ccfunc_rsp_ldv_simd()
1159905{
1160   rsp_state *rsp = (rsp_state*)param;
1161   UINT32 op = rsp->impstate->arg0;
906   UINT32 op = m_rsp_state->arg0;
1162907   UINT32 ea = 0;
1163908   int dest = (op >> 16) & 0x1f;
1164909   int base = (op >> 21) & 0x1f;
r31833r31834
1169914      offset |= 0xffffffc0;
1170915   }
1171916
1172   ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
917   ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
1173918
1174919   int end = index + 8;
1175920
1176921   for (int i = index; i < end; i++)
1177922   {
1178923      UINT16 element;
1179      SIMD_EXTRACT16(rsp->xv[dest], element, (i >> 1));
924      SIMD_EXTRACT16(m_xv[dest], element, (i >> 1));
1180925      element &= 0xff00 >> ((1 - (i & 1)) * 8);
1181      element |= READ8(rsp, ea) << ((1 - (i & 1)) * 8);
1182      SIMD_INSERT16(rsp->xv[dest], element, (i >> 1));
926      element |= DM_READ8(ea) << ((1 - (i & 1)) * 8);
927      SIMD_INSERT16(m_xv[dest], element, (i >> 1));
1183928      ea++;
1184929   }
1185930}
1186931
932static void cfunc_rsp_ldv_simd(void *param)
933{
934   ((rsp_device *)param)->ccfunc_rsp_ldv_simd();
935}
1187936#endif
1188937
1189938#if (!USE_SIMD || SIMUL_SIMD)
1190939
1191static void cfunc_rsp_ldv_scalar(void *param)
940inline void rsp_device::ccfunc_rsp_ldv_scalar()
1192941{
1193   rsp_state *rsp = (rsp_state*)param;
1194   UINT32 op = rsp->impstate->arg0;
942   UINT32 op = m_rsp_state->arg0;
1195943   UINT32 ea = 0;
1196944   int dest = (op >> 16) & 0x1f;
1197945   int base = (op >> 21) & 0x1f;
r31833r31834
1202950      offset |= 0xffffffc0;
1203951   }
1204952
1205   ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
953   ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
1206954
1207955   int end = index + 8;
1208956
1209957   for (int i = index; i < end; i++)
1210958   {
1211      VREG_B(dest, i) = READ8(rsp, ea);
959      VREG_B(dest, i) = DM_READ8(ea);
1212960      ea++;
1213961   }
1214962}
963
964static void cfunc_rsp_ldv_scalar(void *param)
965{
966   ((rsp_device *)param)->ccfunc_rsp_ldv_scalar();
967}
1215968#endif
1216969
1217970#if USE_SIMD
r31833r31834
1224977//
1225978// Loads up to 16 bytes starting from vector byte index
1226979
1227static void cfunc_rsp_lqv_simd(void *param)
980inline void rsp_device::ccfunc_rsp_lqv_simd()
1228981{
1229   rsp_state *rsp = (rsp_state*)param;
1230   UINT32 op = rsp->impstate->arg0;
982   UINT32 op = m_rsp_state->arg0;
1231983   int dest = (op >> 16) & 0x1f;
1232984   int base = (op >> 21) & 0x1f;
1233985   int offset = (op & 0x7f);
r31833r31834
1236988      offset |= 0xffffffc0;
1237989   }
1238990
1239   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
991   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
1240992
1241993   int end = 16 - (ea & 0xf);
1242994   if (end > 16) end = 16;
r31833r31834
1244996   for (int i = 0; i < end; i++)
1245997   {
1246998      UINT16 element;
1247      SIMD_EXTRACT16(rsp->xv[dest], element, (i >> 1));
999      SIMD_EXTRACT16(m_xv[dest], element, (i >> 1));
12481000      element &= 0xff00 >> ((1 - (i & 1)) * 8);
1249      element |= READ8(rsp, ea) << ((1 - (i & 1)) * 8);
1250      SIMD_INSERT16(rsp->xv[dest], element, (i >> 1));
1001      element |= DM_READ8(ea) << ((1 - (i & 1)) * 8);
1002      SIMD_INSERT16(m_xv[dest], element, (i >> 1));
12511003      ea++;
12521004   }
12531005}
12541006
1007static void cfunc_rsp_lqv_simd(void *param)
1008{
1009   ((rsp_device *)param)->ccfunc_rsp_lqv_simd();
1010}
12551011#endif
12561012
12571013#if (!USE_SIMD || SIMUL_SIMD)
12581014
1259static void cfunc_rsp_lqv_scalar(void *param)
1015inline void rsp_device::ccfunc_rsp_lqv_scalar()
12601016{
1261   rsp_state *rsp = (rsp_state*)param;
1262   UINT32 op = rsp->impstate->arg0;
1017   UINT32 op = m_rsp_state->arg0;
12631018   int dest = (op >> 16) & 0x1f;
12641019   int base = (op >> 21) & 0x1f;
12651020   int offset = (op & 0x7f);
r31833r31834
12681023      offset |= 0xffffffc0;
12691024   }
12701025
1271   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1026   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
12721027
12731028   int end = 16 - (ea & 0xf);
12741029   if (end > 16) end = 16;
12751030
12761031   for (int i = 0; i < end; i++)
12771032   {
1278      VREG_B(dest, i) = READ8(rsp, ea);
1033      VREG_B(dest, i) = DM_READ8(ea);
12791034      ea++;
12801035   }
12811036}
1037
1038static void cfunc_rsp_lqv_scalar(void *param)
1039{
1040   ((rsp_device *)param)->ccfunc_rsp_lqv_scalar();
1041}
12821042#endif
12831043
12841044#if USE_SIMD
r31833r31834
12911051//
12921052// Stores up to 16 bytes starting from right side until 16-byte boundary
12931053
1294static void cfunc_rsp_lrv_simd(void *param)
1054inline void rsp_device::ccfunc_rsp_lrv_simd()
12951055{
1296   rsp_state *rsp = (rsp_state*)param;
1297   UINT32 op = rsp->impstate->arg0;
1056   UINT32 op = m_rsp_state->arg0;
12981057   int dest = (op >> 16) & 0x1f;
12991058   int base = (op >> 21) & 0x1f;
13001059   int index = (op >> 7) & 0xf;
r31833r31834
13041063      offset |= 0xffffffc0;
13051064   }
13061065
1307   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1066   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
13081067
13091068   index = 16 - ((ea & 0xf) - index);
13101069   ea &= ~0xf;
r31833r31834
13121071   for (int i = index; i < 16; i++)
13131072   {
13141073      UINT16 element;
1315      SIMD_EXTRACT16(rsp->xv[dest], element, (i >> 1));
1074      SIMD_EXTRACT16(m_xv[dest], element, (i >> 1));
13161075      element &= 0xff00 >> ((1-(i & 1)) * 8);
1317      element |= READ8(rsp, ea) << ((1-(i & 1)) * 8);
1318      SIMD_INSERT16(rsp->xv[dest], element, (i >> 1));
1076      element |= DM_READ8(ea) << ((1-(i & 1)) * 8);
1077      SIMD_INSERT16(m_xv[dest], element, (i >> 1));
13191078      ea++;
13201079   }
13211080}
13221081
1082static void cfunc_rsp_lrv_simd(void *param)
1083{
1084   ((rsp_device *)param)->ccfunc_rsp_lrv_simd();
1085}
13231086#endif
13241087
13251088#if (!USE_SIMD || SIMUL_SIMD)
13261089
1327static void cfunc_rsp_lrv_scalar(void *param)
1090inline void rsp_device::ccfunc_rsp_lrv_scalar()
13281091{
1329   rsp_state *rsp = (rsp_state*)param;
1330   UINT32 op = rsp->impstate->arg0;
1092   UINT32 op = m_rsp_state->arg0;
13311093   int dest = (op >> 16) & 0x1f;
13321094   int base = (op >> 21) & 0x1f;
13331095   int index = (op >> 7) & 0xf;
r31833r31834
13371099      offset |= 0xffffffc0;
13381100   }
13391101
1340   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1102   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
13411103
13421104   index = 16 - ((ea & 0xf) - index);
13431105   ea &= ~0xf;
13441106
13451107   for (int i = index; i < 16; i++)
13461108   {
1347      VREG_B(dest, i) = READ8(rsp, ea);
1109      VREG_B(dest, i) = DM_READ8(ea);
13481110      ea++;
13491111   }
13501112}
1113
1114static void cfunc_rsp_lrv_scalar(void *param)
1115{
1116   ((rsp_device *)param)->ccfunc_rsp_lrv_scalar();
1117}
13511118#endif
13521119
13531120#if USE_SIMD
r31833r31834
13601127//
13611128// Loads a byte as the upper 8 bits of each element
13621129
1363static void cfunc_rsp_lpv_simd(void *param)
1130inline void rsp_device::ccfunc_rsp_lpv_simd()
13641131{
1365   rsp_state *rsp = (rsp_state*)param;
1366   UINT32 op = rsp->impstate->arg0;
1132   UINT32 op = m_rsp_state->arg0;
13671133   int dest = (op >> 16) & 0x1f;
13681134   int base = (op >> 21) & 0x1f;
13691135   int index = (op >> 7) & 0xf;
r31833r31834
13731139      offset |= 0xffffffc0;
13741140   }
13751141
1376   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1142   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
13771143
13781144   for (int i = 0; i < 8; i++)
13791145   {
1380      SIMD_INSERT16(rsp->xv[dest], READ8(rsp, ea + (((16-index) + i) & 0xf)) << 8, i);
1146      SIMD_INSERT16(m_xv[dest], DM_READ8(ea + (((16-index) + i) & 0xf)) << 8, i);
13811147   }
13821148}
13831149
1150static void cfunc_rsp_lpv_simd(void *param)
1151{
1152   ((rsp_device *)param)->ccfunc_rsp_lpv_simd();
1153}
13841154#endif
13851155
13861156#if (!USE_SIMD || SIMUL_SIMD)
13871157
1388static void cfunc_rsp_lpv_scalar(void *param)
1158inline void rsp_device::ccfunc_rsp_lpv_scalar()
13891159{
1390   rsp_state *rsp = (rsp_state*)param;
1391   UINT32 op = rsp->impstate->arg0;
1160   UINT32 op = m_rsp_state->arg0;
13921161   int dest = (op >> 16) & 0x1f;
13931162   int base = (op >> 21) & 0x1f;
13941163   int index = (op >> 7) & 0xf;
r31833r31834
13981167      offset |= 0xffffffc0;
13991168   }
14001169
1401   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1170   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
14021171
14031172   for (int i = 0; i < 8; i++)
14041173   {
1405      W_VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + i) & 0xf)) << 8;
1174      W_VREG_S(dest, i) = DM_READ8(ea + (((16-index) + i) & 0xf)) << 8;
14061175   }
14071176}
1177
1178static void cfunc_rsp_lpv_scalar(void *param)
1179{
1180   ((rsp_device *)param)->ccfunc_rsp_lpv_scalar();
1181}
14081182#endif
14091183
14101184#if USE_SIMD
r31833r31834
14171191//
14181192// Loads a byte as the bits 14-7 of each element
14191193
1420static void cfunc_rsp_luv_simd(void *param)
1194inline void rsp_device::ccfunc_rsp_luv_simd()
14211195{
1422   rsp_state *rsp = (rsp_state*)param;
1423   UINT32 op = rsp->impstate->arg0;
1196   UINT32 op = m_rsp_state->arg0;
14241197   int dest = (op >> 16) & 0x1f;
14251198   int base = (op >> 21) & 0x1f;
14261199   int index = (op >> 7) & 0xf;
r31833r31834
14301203      offset |= 0xffffffc0;
14311204   }
14321205
1433   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1206   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
14341207
14351208   for (int i = 0; i < 8; i++)
14361209   {
1437      SIMD_INSERT16(rsp->xv[dest], READ8(rsp, ea + (((16-index) + i) & 0xf)) << 7, i);
1210      SIMD_INSERT16(m_xv[dest], DM_READ8(ea + (((16-index) + i) & 0xf)) << 7, i);
14381211   }
14391212}
14401213
1214static void cfunc_rsp_luv_simd(void *param)
1215{
1216   ((rsp_device *)param)->ccfunc_rsp_luv_simd();
1217}
14411218#endif
14421219
14431220#if (!USE_SIMD || SIMUL_SIMD)
14441221
1445static void cfunc_rsp_luv_scalar(void *param)
1222inline void rsp_device::ccfunc_rsp_luv_scalar()
14461223{
1447   rsp_state *rsp = (rsp_state*)param;
1448   UINT32 op = rsp->impstate->arg0;
1224   UINT32 op = m_rsp_state->arg0;
14491225   int dest = (op >> 16) & 0x1f;
14501226   int base = (op >> 21) & 0x1f;
14511227   int index = (op >> 7) & 0xf;
r31833r31834
14551231      offset |= 0xffffffc0;
14561232   }
14571233
1458   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1234   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
14591235
14601236   for (int i = 0; i < 8; i++)
14611237   {
1462      W_VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + i) & 0xf)) << 7;
1238      W_VREG_S(dest, i) = DM_READ8(ea + (((16-index) + i) & 0xf)) << 7;
14631239   }
14641240}
1241
1242static void cfunc_rsp_luv_scalar(void *param)
1243{
1244   ((rsp_device *)param)->ccfunc_rsp_luv_scalar();
1245}
14651246#endif
14661247
14671248#if USE_SIMD
r31833r31834
14741255//
14751256// Loads a byte as the bits 14-7 of each element, with 2-byte stride
14761257
1477static void cfunc_rsp_lhv_simd(void *param)
1258inline void rsp_device::ccfunc_rsp_lhv_simd()
14781259{
1479   rsp_state *rsp = (rsp_state*)param;
1480   UINT32 op = rsp->impstate->arg0;
1260   UINT32 op = m_rsp_state->arg0;
14811261   int dest = (op >> 16) & 0x1f;
14821262   int base = (op >> 21) & 0x1f;
14831263   int index = (op >> 7) & 0xf;
r31833r31834
14871267      offset |= 0xffffffc0;
14881268   }
14891269
1490   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1270   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
14911271
14921272   for (int i = 0; i < 8; i++)
14931273   {
1494      SIMD_INSERT16(rsp->xv[dest], READ8(rsp, ea + (((16-index) + (i<<1)) & 0xf)) << 7, i);
1274      SIMD_INSERT16(m_xv[dest], DM_READ8(ea + (((16-index) + (i<<1)) & 0xf)) << 7, i);
14951275   }
14961276}
14971277
1278static void cfunc_rsp_lhv_simd(void *param)
1279{
1280   ((rsp_device *)param)->ccfunc_rsp_lhv_simd();
1281}
14981282#endif
14991283
15001284#if (!USE_SIMD || SIMUL_SIMD)
15011285
1502static void cfunc_rsp_lhv_scalar(void *param)
1286inline void rsp_device::ccfunc_rsp_lhv_scalar()
15031287{
1504   rsp_state *rsp = (rsp_state*)param;
1505   UINT32 op = rsp->impstate->arg0;
1288   UINT32 op = m_rsp_state->arg0;
15061289   int dest = (op >> 16) & 0x1f;
15071290   int base = (op >> 21) & 0x1f;
15081291   int index = (op >> 7) & 0xf;
r31833r31834
15121295      offset |= 0xffffffc0;
15131296   }
15141297
1515   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1298   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
15161299
15171300   for (int i = 0; i < 8; i++)
15181301   {
1519      W_VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + (i<<1)) & 0xf)) << 7;
1302      W_VREG_S(dest, i) = DM_READ8(ea + (((16-index) + (i<<1)) & 0xf)) << 7;
15201303   }
15211304}
1305
1306static void cfunc_rsp_lhv_scalar(void *param)
1307{
1308   ((rsp_device *)param)->ccfunc_rsp_lhv_scalar();
1309}
15221310#endif
15231311
15241312#if USE_SIMD
r31833r31834
15301318//
15311319// Loads a byte as the bits 14-7 of upper or lower quad, with 4-byte stride
15321320
1533static void cfunc_rsp_lfv_simd(void *param)
1321inline void rsp_device::ccfunc_rsp_lfv_simd()
15341322{
1535   rsp_state *rsp = (rsp_state*)param;
1536   UINT32 op = rsp->impstate->arg0;
1323   UINT32 op = m_rsp_state->arg0;
15371324   int dest = (op >> 16) & 0x1f;
15381325   int base = (op >> 21) & 0x1f;
15391326   int index = (op >> 7) & 0xf;
r31833r31834
15431330      offset |= 0xffffffc0;
15441331   }
15451332
1546   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1333   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
15471334
15481335   // not sure what happens if 16-byte boundary is crossed...
15491336
r31833r31834
15511338
15521339   for (int i = index >> 1; i < end; i++)
15531340   {
1554      SIMD_INSERT16(rsp->xv[dest], READ8(rsp, ea) << 7, i);
1341      SIMD_INSERT16(m_xv[dest], DM_READ8(ea) << 7, i);
15551342      ea += 4;
15561343   }
15571344}
15581345
1346static void cfunc_rsp_lfv_simd(void *param)
1347{
1348   ((rsp_device *)param)->ccfunc_rsp_lfv_simd();
1349}
15591350#endif
15601351
15611352#if (!USE_SIMD || SIMUL_SIMD)
15621353
1563static void cfunc_rsp_lfv_scalar(void *param)
1354inline void rsp_device::ccfunc_rsp_lfv_scalar()
15641355{
1565   rsp_state *rsp = (rsp_state*)param;
1566   UINT32 op = rsp->impstate->arg0;
1356   UINT32 op = m_rsp_state->arg0;
15671357   int dest = (op >> 16) & 0x1f;
15681358   int base = (op >> 21) & 0x1f;
15691359   int index = (op >> 7) & 0xf;
r31833r31834
15731363      offset |= 0xffffffc0;
15741364   }
15751365
1576   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1366   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
15771367
15781368   // not sure what happens if 16-byte boundary is crossed...
15791369
r31833r31834
15811371
15821372   for (int i = index >> 1; i < end; i++)
15831373   {
1584      W_VREG_S(dest, i) = READ8(rsp, ea) << 7;
1374      W_VREG_S(dest, i) = DM_READ8(ea) << 7;
15851375      ea += 4;
15861376   }
15871377}
1378
1379static void cfunc_rsp_lfv_scalar(void *param)
1380{
1381   ((rsp_device *)param)->ccfunc_rsp_lfv_scalar();
1382}
15881383#endif
15891384
15901385#if USE_SIMD
r31833r31834
15981393// Loads the full 128-bit vector starting from vector byte index and wrapping to index 0
15991394// after byte index 15
16001395
1601static void cfunc_rsp_lwv_simd(void *param)
1396inline void rsp_device::ccfunc_rsp_lwv_simd()
16021397{
1603   rsp_state *rsp = (rsp_state*)param;
1604   UINT32 op = rsp->impstate->arg0;
1398   UINT32 op = m_rsp_state->arg0;
16051399   int dest = (op >> 16) & 0x1f;
16061400   int base = (op >> 21) & 0x1f;
16071401   int index = (op >> 7) & 0xf;
r31833r31834
16111405      offset |= 0xffffffc0;
16121406   }
16131407
1614   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1408   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
16151409   int end = (16 - index) + 16;
16161410
16171411   UINT8 val[16];
16181412   for (int i = (16 - index); i < end; i++)
16191413   {
1620      val[i & 0xf] = READ8(rsp, ea);
1414      val[i & 0xf] = DM_READ8(ea);
16211415      ea += 4;
16221416   }
16231417
1624   rsp->xv[dest] = _mm_set_epi8(val[15], val[14], val[13], val[12], val[11], val[10], val[ 9], val[ 8],
1418   m_xv[dest] = _mm_set_epi8(val[15], val[14], val[13], val[12], val[11], val[10], val[ 9], val[ 8],
16251419                           val[ 7], val[ 6], val[ 5], val[ 4], val[ 3], val[ 2], val[ 1], val[ 0]);
16261420}
16271421
1422static void cfunc_rsp_lwv_simd(void *param)
1423{
1424   ((rsp_device *)param)->ccfunc_rsp_lwv_simd();
1425}
16281426#endif
16291427
16301428#if (!USE_SIMD || SIMUL_SIMD)
16311429
1632static void cfunc_rsp_lwv_scalar(void *param)
1430inline void rsp_device::ccfunc_rsp_lwv_scalar()
16331431{
1634   rsp_state *rsp = (rsp_state*)param;
1635   UINT32 op = rsp->impstate->arg0;
1432   UINT32 op = m_rsp_state->arg0;
16361433   int dest = (op >> 16) & 0x1f;
16371434   int base = (op >> 21) & 0x1f;
16381435   int index = (op >> 7) & 0xf;
r31833r31834
16421439      offset |= 0xffffffc0;
16431440   }
16441441
1645   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1442   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
16461443   int end = (16 - index) + 16;
16471444
16481445   for (int i = (16 - index); i < end; i++)
16491446   {
1650      VREG_B(dest, i & 0xf) = READ8(rsp, ea);
1447      VREG_B(dest, i & 0xf) = DM_READ8(ea);
16511448      ea += 4;
16521449   }
16531450}
1451
1452static void cfunc_rsp_lwv_scalar(void *param)
1453{
1454   ((rsp_device *)param)->ccfunc_rsp_lwv_scalar();
1455}
16541456#endif
16551457
16561458#if USE_SIMD
r31833r31834
16631465//
16641466// Loads one element to maximum of 8 vectors, while incrementing element index
16651467
1666static void cfunc_rsp_ltv_simd(void *param)
1468inline void rsp_device::ccfunc_rsp_ltv_simd()
16671469{
1668   rsp_state *rsp = (rsp_state*)param;
1669   UINT32 op = rsp->impstate->arg0;
1470   UINT32 op = m_rsp_state->arg0;
16701471   int dest = (op >> 16) & 0x1f;
16711472   int base = (op >> 21) & 0x1f;
16721473   int index = (op >> 7) & 0xf;
r31833r31834
16831484
16841485   int element = 7 - (index >> 1);
16851486
1686   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1487   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
16871488
16881489   ea = ((ea + 8) & ~0xf) + (index & 1);
16891490   for (int i = vs; i < ve; i++)
16901491   {
16911492      element = (8 - (index >> 1) + (i - vs)) << 1;
1692      UINT16 value = (READ8(rsp, ea) << 8) | READ8(rsp, ea + 1);
1693      SIMD_INSERT16(rsp->xv[i], value, (element >> 1));
1493      UINT16 value = (DM_READ8(ea) << 8) | DM_READ8(ea + 1);
1494      SIMD_INSERT16(m_xv[i], value, (element >> 1));
16941495      ea += 2;
16951496   }
16961497}
16971498
1499static void cfunc_rsp_ltv_simd(void *param)
1500{
1501   ((rsp_device *)param)->ccfunc_rsp_ltv_simd();
1502}
16981503#endif
16991504
17001505#if (!USE_SIMD || SIMUL_SIMD)
17011506
1702static void cfunc_rsp_ltv_scalar(void *param)
1507inline void rsp_device::ccfunc_rsp_ltv_scalar()
17031508{
1704   rsp_state *rsp = (rsp_state*)param;
1705   UINT32 op = rsp->impstate->arg0;
1509   UINT32 op = m_rsp_state->arg0;
17061510   int dest = (op >> 16) & 0x1f;
17071511   int base = (op >> 21) & 0x1f;
17081512   int index = (op >> 7) & 0xf;
r31833r31834
17191523
17201524   int element = 7 - (index >> 1);
17211525
1722   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1526   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
17231527
17241528   ea = ((ea + 8) & ~0xf) + (index & 1);
17251529   for (int i = vs; i < ve; i++)
17261530   {
17271531      element = (8 - (index >> 1) + (i - vs)) << 1;
1728      VREG_B(i, (element & 0xf)) = READ8(rsp, ea);
1729      VREG_B(i, ((element + 1) & 0xf)) = READ8(rsp, ea + 1);
1532      VREG_B(i, (element & 0xf)) = DM_READ8(ea);
1533      VREG_B(i, ((element + 1) & 0xf)) = DM_READ8(ea + 1);
17301534      ea += 2;
17311535   }
17321536}
1537
1538static void cfunc_rsp_ltv_scalar(void *param)
1539{
1540   ((rsp_device *)param)->ccfunc_rsp_ltv_scalar();
1541}
17331542#endif
17341543
17351544#if USE_SIMD && SIMUL_SIMD
1736INLINE void cfunc_backup_regs(void *param)
1545inline void rsp_device::ccfunc_backup_regs()
17371546{
1738   rsp_state *rsp = (rsp_state*)param;
1739   memcpy(rsp->old_dmem, rsp->dmem8, sizeof(rsp->old_dmem));
1740   memcpy(rsp->old_r, rsp->r, sizeof(rsp->r));
1547   memcpy(m_old_dmem, m_dmem8, sizeof(m_old_dmem));
1548   memcpy(m_old_r, m_r, sizeof(m_r));
17411549
1742   rsp->simd_reciprocal_res = rsp->reciprocal_res;
1743   rsp->simd_reciprocal_high = rsp->reciprocal_high;
1744   rsp->simd_dp_allowed = rsp->dp_allowed;
1550   m_simd_reciprocal_res = m_reciprocal_res;
1551   m_simd_reciprocal_high = m_reciprocal_high;
1552   m_simd_dp_allowed = m_dp_allowed;
17451553
1746   rsp->reciprocal_res = rsp->old_reciprocal_res;
1747   rsp->reciprocal_high = rsp->old_reciprocal_high;
1748   rsp->dp_allowed = rsp->old_dp_allowed;
1554   m_reciprocal_res = m_old_reciprocal_res;
1555   m_reciprocal_high = m_old_reciprocal_high;
1556   m_dp_allowed = m_old_dp_allowed;
17491557}
17501558
1751INLINE void cfunc_restore_regs(void *param)
1559static void cfunc_backup_regs(void *param)
17521560{
1753   rsp_state *rsp = (rsp_state*)param;
1754   memcpy(rsp->scalar_r, rsp->r, sizeof(rsp->r));
1755   memcpy(rsp->r, rsp->old_r, sizeof(rsp->r));
1756   memcpy(rsp->scalar_dmem, rsp->dmem8, sizeof(rsp->scalar_dmem));
1757   memcpy(rsp->dmem8, rsp->old_dmem, sizeof(rsp->old_dmem));
1561   ((rsp_device *)param)->ccfunc_backup_regs();
1562}
17581563
1759   rsp->scalar_reciprocal_res = rsp->reciprocal_res;
1760   rsp->scalar_reciprocal_high = rsp->reciprocal_high;
1761   rsp->scalar_dp_allowed = rsp->dp_allowed;
1564inline void rsp_device::ccfunc_restore_regs()
1565{
1566   memcpy(m_scalar_r, m_r, sizeof(m_r));
1567   memcpy(m_r, m_old_r, sizeof(m_r));
1568   memcpy(m_scalar_dmem, m_dmem8, sizeof(m_scalar_dmem));
1569   memcpy(m_dmem8, m_old_dmem, sizeof(m_old_dmem));
17621570
1763   rsp->reciprocal_res = rsp->simd_reciprocal_res;
1764   rsp->reciprocal_high = rsp->simd_reciprocal_high;
1765   rsp->dp_allowed = rsp->simd_dp_allowed;
1571   m_scalar_reciprocal_res = m_reciprocal_res;
1572   m_scalar_reciprocal_high = m_reciprocal_high;
1573   m_scalar_dp_allowed = m_dp_allowed;
1574
1575   m_reciprocal_res = m_simd_reciprocal_res;
1576   m_reciprocal_high = m_simd_reciprocal_high;
1577   m_dp_allowed = m_simd_dp_allowed;
17661578}
17671579
1768INLINE void cfunc_verify_regs(void *param)
1580static void cfunc_restore_regs(void *param)
17691581{
1770   rsp_state *rsp = (rsp_state*)param;
1771   int op = rsp->impstate->arg0;
1772   if (VEC_ACCUM_H(rsp, 0) != ACCUM_H(rsp, 0)) fatalerror("ACCUM_H element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 0), ACCUM_H(rsp, 0), op);
1773   if (VEC_ACCUM_H(rsp, 1) != ACCUM_H(rsp, 1)) fatalerror("ACCUM_H element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 1), ACCUM_H(rsp, 1), op);
1774   if (VEC_ACCUM_H(rsp, 2) != ACCUM_H(rsp, 2)) fatalerror("ACCUM_H element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 2), ACCUM_H(rsp, 2), op);
1775   if (VEC_ACCUM_H(rsp, 3) != ACCUM_H(rsp, 3)) fatalerror("ACCUM_H element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 3), ACCUM_H(rsp, 3), op);
1776   if (VEC_ACCUM_H(rsp, 4) != ACCUM_H(rsp, 4)) fatalerror("ACCUM_H element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 4), ACCUM_H(rsp, 4), op);
1777   if (VEC_ACCUM_H(rsp, 5) != ACCUM_H(rsp, 5)) fatalerror("ACCUM_H element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 5), ACCUM_H(rsp, 5), op);
1778   if (VEC_ACCUM_H(rsp, 6) != ACCUM_H(rsp, 6)) fatalerror("ACCUM_H element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 6), ACCUM_H(rsp, 6), op);
1779   if (VEC_ACCUM_H(rsp, 7) != ACCUM_H(rsp, 7)) fatalerror("ACCUM_H element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(rsp, 7), ACCUM_H(rsp, 7), op);
1780   if (VEC_ACCUM_M(rsp, 0) != ACCUM_M(rsp, 0)) fatalerror("ACCUM_M element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 0), ACCUM_M(rsp, 0), op);
1781   if (VEC_ACCUM_M(rsp, 1) != ACCUM_M(rsp, 1)) fatalerror("ACCUM_M element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 1), ACCUM_M(rsp, 1), op);
1782   if (VEC_ACCUM_M(rsp, 2) != ACCUM_M(rsp, 2)) fatalerror("ACCUM_M element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 2), ACCUM_M(rsp, 2), op);
1783   if (VEC_ACCUM_M(rsp, 3) != ACCUM_M(rsp, 3)) fatalerror("ACCUM_M element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 3), ACCUM_M(rsp, 3), op);
1784   if (VEC_ACCUM_M(rsp, 4) != ACCUM_M(rsp, 4)) fatalerror("ACCUM_M element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 4), ACCUM_M(rsp, 4), op);
1785   if (VEC_ACCUM_M(rsp, 5) != ACCUM_M(rsp, 5)) fatalerror("ACCUM_M element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 5), ACCUM_M(rsp, 5), op);
1786   if (VEC_ACCUM_M(rsp, 6) != ACCUM_M(rsp, 6)) fatalerror("ACCUM_M element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 6), ACCUM_M(rsp, 6), op);
1787   if (VEC_ACCUM_M(rsp, 7) != ACCUM_M(rsp, 7)) fatalerror("ACCUM_M element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(rsp, 7), ACCUM_M(rsp, 7), op);
1788   if (VEC_ACCUM_L(rsp, 0) != ACCUM_L(rsp, 0)) fatalerror("ACCUM_L element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 0), ACCUM_L(rsp, 0), op);
1789   if (VEC_ACCUM_L(rsp, 1) != ACCUM_L(rsp, 1)) fatalerror("ACCUM_L element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 1), ACCUM_L(rsp, 1), op);
1790   if (VEC_ACCUM_L(rsp, 2) != ACCUM_L(rsp, 2)) fatalerror("ACCUM_L element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 2), ACCUM_L(rsp, 2), op);
1791   if (VEC_ACCUM_L(rsp, 3) != ACCUM_L(rsp, 3)) fatalerror("ACCUM_L element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 3), ACCUM_L(rsp, 3), op);
1792   if (VEC_ACCUM_L(rsp, 4) != ACCUM_L(rsp, 4)) fatalerror("ACCUM_L element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 4), ACCUM_L(rsp, 4), op);
1793   if (VEC_ACCUM_L(rsp, 5) != ACCUM_L(rsp, 5)) fatalerror("ACCUM_L element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 5), ACCUM_L(rsp, 5), op);
1794   if (VEC_ACCUM_L(rsp, 6) != ACCUM_L(rsp, 6)) fatalerror("ACCUM_L element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 6), ACCUM_L(rsp, 6), op);
1795   if (VEC_ACCUM_L(rsp, 7) != ACCUM_L(rsp, 7)) fatalerror("ACCUM_L element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(rsp, 7), ACCUM_L(rsp, 7), op);
1582   ((rsp_device *)param)->ccfunc_restore_regs();
1583}
1584
1585inline void rsp_device::ccfunc_verify_regs()
1586{
1587   int op = m_rsp_state->arg0;
1588   if (VEC_ACCUM_H(0) != ACCUM_H(0)) fatalerror("ACCUM_H element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(0), ACCUM_H(0), op);
1589   if (VEC_ACCUM_H(1) != ACCUM_H(1)) fatalerror("ACCUM_H element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(1), ACCUM_H(1), op);
1590   if (VEC_ACCUM_H(2) != ACCUM_H(2)) fatalerror("ACCUM_H element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(2), ACCUM_H(2), op);
1591   if (VEC_ACCUM_H(3) != ACCUM_H(3)) fatalerror("ACCUM_H element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(3), ACCUM_H(3), op);
1592   if (VEC_ACCUM_H(4) != ACCUM_H(4)) fatalerror("ACCUM_H element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(4), ACCUM_H(4), op);
1593   if (VEC_ACCUM_H(5) != ACCUM_H(5)) fatalerror("ACCUM_H element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(5), ACCUM_H(5), op);
1594   if (VEC_ACCUM_H(6) != ACCUM_H(6)) fatalerror("ACCUM_H element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(6), ACCUM_H(6), op);
1595   if (VEC_ACCUM_H(7) != ACCUM_H(7)) fatalerror("ACCUM_H element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_H(7), ACCUM_H(7), op);
1596   if (VEC_ACCUM_M(0) != ACCUM_M(0)) fatalerror("ACCUM_M element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(0), ACCUM_M(0), op);
1597   if (VEC_ACCUM_M(1) != ACCUM_M(1)) fatalerror("ACCUM_M element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(1), ACCUM_M(1), op);
1598   if (VEC_ACCUM_M(2) != ACCUM_M(2)) fatalerror("ACCUM_M element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(2), ACCUM_M(2), op);
1599   if (VEC_ACCUM_M(3) != ACCUM_M(3)) fatalerror("ACCUM_M element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(3), ACCUM_M(3), op);
1600   if (VEC_ACCUM_M(4) != ACCUM_M(4)) fatalerror("ACCUM_M element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(4), ACCUM_M(4), op);
1601   if (VEC_ACCUM_M(5) != ACCUM_M(5)) fatalerror("ACCUM_M element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(5), ACCUM_M(5), op);
1602   if (VEC_ACCUM_M(6) != ACCUM_M(6)) fatalerror("ACCUM_M element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(6), ACCUM_M(6), op);
1603   if (VEC_ACCUM_M(7) != ACCUM_M(7)) fatalerror("ACCUM_M element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_M(7), ACCUM_M(7), op);
1604   if (VEC_ACCUM_L(0) != ACCUM_L(0)) fatalerror("ACCUM_L element 0 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(0), ACCUM_L(0), op);
1605   if (VEC_ACCUM_L(1) != ACCUM_L(1)) fatalerror("ACCUM_L element 1 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(1), ACCUM_L(1), op);
1606   if (VEC_ACCUM_L(2) != ACCUM_L(2)) fatalerror("ACCUM_L element 2 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(2), ACCUM_L(2), op);
1607   if (VEC_ACCUM_L(3) != ACCUM_L(3)) fatalerror("ACCUM_L element 3 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(3), ACCUM_L(3), op);
1608   if (VEC_ACCUM_L(4) != ACCUM_L(4)) fatalerror("ACCUM_L element 4 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(4), ACCUM_L(4), op);
1609   if (VEC_ACCUM_L(5) != ACCUM_L(5)) fatalerror("ACCUM_L element 5 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(5), ACCUM_L(5), op);
1610   if (VEC_ACCUM_L(6) != ACCUM_L(6)) fatalerror("ACCUM_L element 6 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(6), ACCUM_L(6), op);
1611   if (VEC_ACCUM_L(7) != ACCUM_L(7)) fatalerror("ACCUM_L element 7 mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", VEC_ACCUM_L(7), ACCUM_L(7), op);
17961612   for (int i = 0; i < 32; i++)
17971613   {
1798      if (rsp->r[i] != rsp->scalar_r[i]) fatalerror("r[%d] mismatch (SIMD %08x vs. Scalar %08x) after op: %08x\n", i, rsp->r[i], rsp->scalar_r[i], op);
1614      if (m_rsp_state->r[i] != m_scalar_r[i]) fatalerror("r[%d] mismatch (SIMD %08x vs. Scalar %08x) after op: %08x\n", i, m_rsp_state->r[i], m_scalar_r[i], op);
17991615      for (int el = 0; el < 8; el++)
18001616      {
18011617         UINT16 out;
1802         SIMD_EXTRACT16(rsp->xv[i], out, el);
1618         SIMD_EXTRACT16(m_xv[i], out, el);
18031619         if ((UINT16)VREG_S(i, el) != out) fatalerror("Vector %d element %d mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", i, el, out, (UINT16)VREG_S(i, el), op);
18041620      }
18051621   }
18061622   for (int i = 0; i < 4096; i++)
18071623   {
1808      if (rsp->dmem8[i] != rsp->scalar_dmem[i]) fatalerror("dmem[%d] mismatch (SIMD %02x vs. Scalar %02x) after op: %08x\n", i, rsp->dmem8[i], rsp->scalar_dmem[i], op);
1624      if (m_dmem8[i] != m_scalar_dmem[i]) fatalerror("dmem[%d] mismatch (SIMD %02x vs. Scalar %02x) after op: %08x\n", i, m_dmem8[i], m_scalar_dmem[i], op);
18091625   }
18101626   for (int i = 0; i < 5; i++)
18111627   {
18121628      for (int el = 0; el < 8; el++)
18131629      {
18141630         UINT16 out;
1815         SIMD_EXTRACT16(rsp->xvflag[i], out, el);
1816         if (rsp->vflag[i][el] != out) fatalerror("flag[%d][%d] mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", i, el, out, rsp->vflag[i][el], op);
1631         SIMD_EXTRACT16(m_xvflag[i], out, el);
1632         if (m_vflag[i][el] != out) fatalerror("flag[%d][%d] mismatch (SIMD %04x vs. Scalar %04x) after op: %08x\n", i, el, out, m_vflag[i][el], op);
18171633      }
18181634   }
18191635}
1636
1637static void cfunc_verify_regs(void *param)
1638{
1639   ((rsp_device *)param)->ccfunc_verify_regs();
1640}
18201641#endif
18211642
18221643#if USE_SIMD
1823static int generate_lwc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
1644int rsp_device::generate_lwc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
18241645{
18251646   //int loopdest;
18261647   UINT32 op = desc->opptr.l[0];
r31833r31834
18381659   {
18391660      case 0x00:      /* LBV */
18401661         //UML_ADD(block, I0, R32(RSREG), offset);
1841         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1842         UML_CALLC(block, cfunc_rsp_lbv_simd, rsp);
1662         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1663         UML_CALLC(block, cfunc_rsp_lbv_simd, this);
18431664#if SIMUL_SIMD
1844         UML_CALLC(block, cfunc_backup_regs, rsp);
1845         UML_CALLC(block, cfunc_rsp_lbv_scalar, rsp);
1846         UML_CALLC(block, cfunc_restore_regs, rsp);
1847         UML_CALLC(block, cfunc_verify_regs, rsp);
1665         UML_CALLC(block, cfunc_backup_regs, this);
1666         UML_CALLC(block, cfunc_rsp_lbv_scalar, this);
1667         UML_CALLC(block, cfunc_restore_regs, this);
1668         UML_CALLC(block, cfunc_verify_regs, this);
18481669#endif
18491670         return TRUE;
18501671      case 0x01:      /* LSV */
1851         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1852         UML_CALLC(block, cfunc_rsp_lsv_simd, rsp);
1672         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1673         UML_CALLC(block, cfunc_rsp_lsv_simd, this);
18531674#if SIMUL_SIMD
1854         UML_CALLC(block, cfunc_backup_regs, rsp);
1855         UML_CALLC(block, cfunc_rsp_lsv_scalar, rsp);
1856         UML_CALLC(block, cfunc_restore_regs, rsp);
1857         UML_CALLC(block, cfunc_verify_regs, rsp);
1675         UML_CALLC(block, cfunc_backup_regs, this);
1676         UML_CALLC(block, cfunc_rsp_lsv_scalar, this);
1677         UML_CALLC(block, cfunc_restore_regs, this);
1678         UML_CALLC(block, cfunc_verify_regs, this);
18581679#endif
18591680         return TRUE;
18601681      case 0x02:      /* LLV */
1861         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1862         UML_CALLC(block, cfunc_rsp_llv_simd, rsp);
1682         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1683         UML_CALLC(block, cfunc_rsp_llv_simd, this);
18631684#if SIMUL_SIMD
1864         UML_CALLC(block, cfunc_backup_regs, rsp);
1865         UML_CALLC(block, cfunc_rsp_llv_scalar, rsp);
1866         UML_CALLC(block, cfunc_restore_regs, rsp);
1867         UML_CALLC(block, cfunc_verify_regs, rsp);
1685         UML_CALLC(block, cfunc_backup_regs, this);
1686         UML_CALLC(block, cfunc_rsp_llv_scalar, this);
1687         UML_CALLC(block, cfunc_restore_regs, this);
1688         UML_CALLC(block, cfunc_verify_regs, this);
18681689#endif
18691690         return TRUE;
18701691      case 0x03:      /* LDV */
1871         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1872         UML_CALLC(block, cfunc_rsp_ldv_simd, rsp);
1692         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1693         UML_CALLC(block, cfunc_rsp_ldv_simd, this);
18731694#if SIMUL_SIMD
1874         UML_CALLC(block, cfunc_backup_regs, rsp);
1875         UML_CALLC(block, cfunc_rsp_ldv_scalar, rsp);
1876         UML_CALLC(block, cfunc_restore_regs, rsp);
1877         UML_CALLC(block, cfunc_verify_regs, rsp);
1695         UML_CALLC(block, cfunc_backup_regs, this);
1696         UML_CALLC(block, cfunc_rsp_ldv_scalar, this);
1697         UML_CALLC(block, cfunc_restore_regs, this);
1698         UML_CALLC(block, cfunc_verify_regs, this);
18781699#endif
18791700         return TRUE;
18801701      case 0x04:      /* LQV */
1881         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1882         UML_CALLC(block, cfunc_rsp_lqv_simd, rsp);
1702         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1703         UML_CALLC(block, cfunc_rsp_lqv_simd, this);
18831704#if SIMUL_SIMD
1884         UML_CALLC(block, cfunc_backup_regs, rsp);
1885         UML_CALLC(block, cfunc_rsp_lqv_scalar, rsp);
1886         UML_CALLC(block, cfunc_restore_regs, rsp);
1887         UML_CALLC(block, cfunc_verify_regs, rsp);
1705         UML_CALLC(block, cfunc_backup_regs, this);
1706         UML_CALLC(block, cfunc_rsp_lqv_scalar, this);
1707         UML_CALLC(block, cfunc_restore_regs, this);
1708         UML_CALLC(block, cfunc_verify_regs, this);
18881709#endif
18891710         return TRUE;
18901711      case 0x05:      /* LRV */
1891         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1892         UML_CALLC(block, cfunc_rsp_lrv_simd, rsp);
1712         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1713         UML_CALLC(block, cfunc_rsp_lrv_simd, this);
18931714#if SIMUL_SIMD
1894         UML_CALLC(block, cfunc_backup_regs, rsp);
1895         UML_CALLC(block, cfunc_rsp_lrv_scalar, rsp);
1896         UML_CALLC(block, cfunc_restore_regs, rsp);
1897         UML_CALLC(block, cfunc_verify_regs, rsp);
1715         UML_CALLC(block, cfunc_backup_regs, this);
1716         UML_CALLC(block, cfunc_rsp_lrv_scalar, this);
1717         UML_CALLC(block, cfunc_restore_regs, this);
1718         UML_CALLC(block, cfunc_verify_regs, this);
18981719#endif
18991720         return TRUE;
19001721      case 0x06:      /* LPV */
1901         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1902         UML_CALLC(block, cfunc_rsp_lpv_simd, rsp);
1722         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1723         UML_CALLC(block, cfunc_rsp_lpv_simd, this);
19031724#if SIMUL_SIMD
1904         UML_CALLC(block, cfunc_backup_regs, rsp);
1905         UML_CALLC(block, cfunc_rsp_lpv_scalar, rsp);
1906         UML_CALLC(block, cfunc_restore_regs, rsp);
1907         UML_CALLC(block, cfunc_verify_regs, rsp);
1725         UML_CALLC(block, cfunc_backup_regs, this);
1726         UML_CALLC(block, cfunc_rsp_lpv_scalar, this);
1727         UML_CALLC(block, cfunc_restore_regs, this);
1728         UML_CALLC(block, cfunc_verify_regs, this);
19081729#endif
19091730         return TRUE;
19101731      case 0x07:      /* LUV */
1911         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1912         UML_CALLC(block, cfunc_rsp_luv_simd, rsp);
1732         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1733         UML_CALLC(block, cfunc_rsp_luv_simd, this);
19131734#if SIMUL_SIMD
1914         UML_CALLC(block, cfunc_backup_regs, rsp);
1915         UML_CALLC(block, cfunc_rsp_luv_scalar, rsp);
1916         UML_CALLC(block, cfunc_restore_regs, rsp);
1917         UML_CALLC(block, cfunc_verify_regs, rsp);
1735         UML_CALLC(block, cfunc_backup_regs, this);
1736         UML_CALLC(block, cfunc_rsp_luv_scalar, this);
1737         UML_CALLC(block, cfunc_restore_regs, this);
1738         UML_CALLC(block, cfunc_verify_regs, this);
19181739#endif
19191740         return TRUE;
19201741      case 0x08:      /* LHV */
1921         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1922         UML_CALLC(block, cfunc_rsp_lhv_simd, rsp);
1742         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1743         UML_CALLC(block, cfunc_rsp_lhv_simd, this);
19231744#if SIMUL_SIMD
1924         UML_CALLC(block, cfunc_backup_regs, rsp);
1925         UML_CALLC(block, cfunc_rsp_lhv_scalar, rsp);
1926         UML_CALLC(block, cfunc_restore_regs, rsp);
1927         UML_CALLC(block, cfunc_verify_regs, rsp);
1745         UML_CALLC(block, cfunc_backup_regs, this);
1746         UML_CALLC(block, cfunc_rsp_lhv_scalar, this);
1747         UML_CALLC(block, cfunc_restore_regs, this);
1748         UML_CALLC(block, cfunc_verify_regs, this);
19281749#endif
19291750         return TRUE;
19301751      case 0x09:      /* LFV */
1931         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1932         UML_CALLC(block, cfunc_rsp_lfv_simd, rsp);
1752         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1753         UML_CALLC(block, cfunc_rsp_lfv_simd, this);
19331754#if SIMUL_SIMD
1934         UML_CALLC(block, cfunc_backup_regs, rsp);
1935         UML_CALLC(block, cfunc_rsp_lfv_scalar, rsp);
1936         UML_CALLC(block, cfunc_restore_regs, rsp);
1937         UML_CALLC(block, cfunc_verify_regs, rsp);
1755         UML_CALLC(block, cfunc_backup_regs, this);
1756         UML_CALLC(block, cfunc_rsp_lfv_scalar, this);
1757         UML_CALLC(block, cfunc_restore_regs, this);
1758         UML_CALLC(block, cfunc_verify_regs, this);
19381759#endif
19391760         return TRUE;
19401761      case 0x0a:      /* LWV */
1941         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1942         UML_CALLC(block, cfunc_rsp_lwv_simd, rsp);
1762         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1763         UML_CALLC(block, cfunc_rsp_lwv_simd, this);
19431764#if SIMUL_SIMD
1944         UML_CALLC(block, cfunc_backup_regs, rsp);
1945         UML_CALLC(block, cfunc_rsp_lwv_scalar, rsp);
1946         UML_CALLC(block, cfunc_restore_regs, rsp);
1947         UML_CALLC(block, cfunc_verify_regs, rsp);
1765         UML_CALLC(block, cfunc_backup_regs, this);
1766         UML_CALLC(block, cfunc_rsp_lwv_scalar, this);
1767         UML_CALLC(block, cfunc_restore_regs, this);
1768         UML_CALLC(block, cfunc_verify_regs, this);
19481769#endif
19491770         return TRUE;
19501771      case 0x0b:      /* LTV */
1951         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1952         UML_CALLC(block, cfunc_rsp_ltv_simd, rsp);
1772         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1773         UML_CALLC(block, cfunc_rsp_ltv_simd, this);
19531774#if SIMUL_SIMD
1954         UML_CALLC(block, cfunc_backup_regs, rsp);
1955         UML_CALLC(block, cfunc_rsp_ltv_scalar, rsp);
1956         UML_CALLC(block, cfunc_restore_regs, rsp);
1957         UML_CALLC(block, cfunc_verify_regs, rsp);
1775         UML_CALLC(block, cfunc_backup_regs, this);
1776         UML_CALLC(block, cfunc_rsp_ltv_scalar, this);
1777         UML_CALLC(block, cfunc_restore_regs, this);
1778         UML_CALLC(block, cfunc_verify_regs, this);
19581779#endif
19591780         return TRUE;
19601781
r31833r31834
19651786
19661787#else
19671788
1968static int generate_lwc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
1789int rsp_device::generate_lwc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
19691790{
19701791   //int loopdest;
19711792   UINT32 op = desc->opptr.l[0];
r31833r31834
19831804   {
19841805      case 0x00:      /* LBV */
19851806         //UML_ADD(block, I0, R32(RSREG), offset);
1986         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1987         UML_CALLC(block, cfunc_rsp_lbv_scalar, rsp);
1807         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1808         UML_CALLC(block, cfunc_rsp_lbv_scalar, this);
19881809         return TRUE;
19891810      case 0x01:      /* LSV */
1990         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1991         UML_CALLC(block, cfunc_rsp_lsv_scalar, rsp);
1811         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1812         UML_CALLC(block, cfunc_rsp_lsv_scalar, this);
19921813         return TRUE;
19931814      case 0x02:      /* LLV */
1994         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1995         UML_CALLC(block, cfunc_rsp_llv_scalar, rsp);
1815         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1816         UML_CALLC(block, cfunc_rsp_llv_scalar, this);
19961817         return TRUE;
19971818      case 0x03:      /* LDV */
1998         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1999         UML_CALLC(block, cfunc_rsp_ldv_scalar, rsp);
1819         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1820         UML_CALLC(block, cfunc_rsp_ldv_scalar, this);
20001821         return TRUE;
20011822      case 0x04:      /* LQV */
2002         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2003         UML_CALLC(block, cfunc_rsp_lqv_scalar, rsp);
1823         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1824         UML_CALLC(block, cfunc_rsp_lqv_scalar, this);
20041825         return TRUE;
20051826      case 0x05:      /* LRV */
2006         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2007         UML_CALLC(block, cfunc_rsp_lrv_scalar, rsp);
1827         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1828         UML_CALLC(block, cfunc_rsp_lrv_scalar, this);
20081829         return TRUE;
20091830      case 0x06:      /* LPV */
2010         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2011         UML_CALLC(block, cfunc_rsp_lpv_scalar, rsp);
1831         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1832         UML_CALLC(block, cfunc_rsp_lpv_scalar, this);
20121833         return TRUE;
20131834      case 0x07:      /* LUV */
2014         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2015         UML_CALLC(block, cfunc_rsp_luv_scalar, rsp);
1835         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1836         UML_CALLC(block, cfunc_rsp_luv_scalar, this);
20161837         return TRUE;
20171838      case 0x08:      /* LHV */
2018         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2019         UML_CALLC(block, cfunc_rsp_lhv_scalar, rsp);
1839         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1840         UML_CALLC(block, cfunc_rsp_lhv_scalar, this);
20201841         return TRUE;
20211842      case 0x09:      /* LFV */
2022         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2023         UML_CALLC(block, cfunc_rsp_lfv_scalar, rsp);
1843         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1844         UML_CALLC(block, cfunc_rsp_lfv_scalar, this);
20241845         return TRUE;
20251846      case 0x0a:      /* LWV */
2026         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2027         UML_CALLC(block, cfunc_rsp_lwv_scalar, rsp);
1847         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1848         UML_CALLC(block, cfunc_rsp_lwv_scalar, this);
20281849         return TRUE;
20291850      case 0x0b:      /* LTV */
2030         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2031         UML_CALLC(block, cfunc_rsp_ltv_scalar, rsp);
1851         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
1852         UML_CALLC(block, cfunc_rsp_ltv_scalar, this);
20321853         return TRUE;
20331854
20341855      default:
r31833r31834
20471868//
20481869// Stores 1 byte from vector byte index
20491870
2050static void cfunc_rsp_sbv_simd(void *param)
1871inline void rsp_device::ccfunc_rsp_sbv_simd()
20511872{
2052   rsp_state *rsp = (rsp_state*)param;
2053   UINT32 op = rsp->impstate->arg0;
1873   UINT32 op = m_rsp_state->arg0;
20541874   int dest = (op >> 16) & 0x1f;
20551875   int base = (op >> 21) & 0x1f;
20561876   int index = (op >> 7) & 0xf;
r31833r31834
20601880      offset |= 0xffffffc0;
20611881   }
20621882
2063   UINT32 ea = (base) ? rsp->r[base] + offset : offset;
1883   UINT32 ea = (base) ? m_rsp_state->r[base] + offset : offset;
20641884   UINT16 value;
2065   SIMD_EXTRACT16(rsp->xv[dest], value, (index >> 1));
1885   SIMD_EXTRACT16(m_xv[dest], value, (index >> 1));
20661886   value >>= (1-(index & 1)) * 8;
2067   WRITE8(rsp, ea, (UINT8)value);
1887   DM_WRITE8(ea, (UINT8)value);
20681888}
20691889
1890static void cfunc_rsp_sbv_simd(void *param)
1891{
1892   ((rsp_device *)param)->ccfunc_rsp_sbv_simd();
1893}
20701894#endif
20711895
20721896#if (!USE_SIMD || SIMUL_SIMD)
20731897
2074static void cfunc_rsp_sbv_scalar(void *param)
1898inline void rsp_device::ccfunc_rsp_sbv_scalar()
20751899{
2076   rsp_state *rsp = (rsp_state*)param;
2077   UINT32 op = rsp->impstate->arg0;
1900   UINT32 op = m_rsp_state->arg0;
20781901   int dest = (op >> 16) & 0x1f;
20791902   int base = (op >> 21) & 0x1f;
20801903   int index = (op >> 7) & 0xf;
r31833r31834
20841907      offset |= 0xffffffc0;
20851908   }
20861909
2087   UINT32 ea = (base) ? rsp->r[base] + offset : offset;
2088   WRITE8(rsp, ea, VREG_B(dest, index));
1910   UINT32 ea = (base) ? m_rsp_state->r[base] + offset : offset;
1911   DM_WRITE8(ea, VREG_B(dest, index));
20891912}
1913
1914static void cfunc_rsp_sbv_scalar(void *param)
1915{
1916   ((rsp_device *)param)->ccfunc_rsp_sbv_scalar();
1917}
20901918#endif
20911919
20921920#if USE_SIMD
r31833r31834
20991927//
21001928// Stores 2 bytes starting from vector byte index
21011929
2102static void cfunc_rsp_ssv_simd(void *param)
1930inline void rsp_device::ccfunc_rsp_ssv_simd()
21031931{
2104   rsp_state *rsp = (rsp_state*)param;
2105   UINT32 op = rsp->impstate->arg0;
1932   UINT32 op = m_rsp_state->arg0;
21061933   int dest = (op >> 16) & 0x1f;
21071934   int base = (op >> 21) & 0x1f;
21081935   int index = (op >> 7) & 0xf;
r31833r31834
21121939      offset |= 0xffffffc0;
21131940   }
21141941
2115   UINT32 ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
1942   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
21161943
21171944   int end = index + 2;
21181945   for (int i = index; i < end; i++)
21191946   {
21201947      UINT16 value;
2121      SIMD_EXTRACT16(rsp->xv[dest], value, (i >> 1));
1948      SIMD_EXTRACT16(m_xv[dest], value, (i >> 1));
21221949      value >>= (1 - (i & 1)) * 8;
2123      WRITE8(rsp, ea, (UINT8)value);
1950      DM_WRITE8(ea, (UINT8)value);
21241951      ea++;
21251952   }
21261953}
21271954
1955static void cfunc_rsp_ssv_simd(void *param)
1956{
1957   ((rsp_device *)param)->ccfunc_rsp_ssv_simd();
1958}
21281959#endif
21291960
21301961#if (!USE_SIMD || SIMUL_SIMD)
21311962
2132static void cfunc_rsp_ssv_scalar(void *param)
1963inline void rsp_device::ccfunc_rsp_ssv_scalar()
21331964{
2134   rsp_state *rsp = (rsp_state*)param;
2135   UINT32 op = rsp->impstate->arg0;
1965   UINT32 op = m_rsp_state->arg0;
21361966   int dest = (op >> 16) & 0x1f;
21371967   int base = (op >> 21) & 0x1f;
21381968   int index = (op >> 7) & 0xf;
r31833r31834
21421972      offset |= 0xffffffc0;
21431973   }
21441974
2145   UINT32 ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
1975   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
21461976
21471977   int end = index + 2;
21481978   for (int i = index; i < end; i++)
21491979   {
2150      WRITE8(rsp, ea, VREG_B(dest, i));
1980      DM_WRITE8(ea, VREG_B(dest, i));
21511981      ea++;
21521982   }
21531983}
1984
1985static void cfunc_rsp_ssv_scalar(void *param)
1986{
1987   ((rsp_device *)param)->ccfunc_rsp_ssv_scalar();
1988}
21541989#endif
21551990
21561991#if USE_SIMD
r31833r31834
21631998//
21641999// Stores 4 bytes starting from vector byte index
21652000
2166static void cfunc_rsp_slv_simd(void *param)
2001inline void rsp_device::ccfunc_rsp_slv_simd()
21672002{
2168   rsp_state *rsp = (rsp_state*)param;
2169   UINT32 op = rsp->impstate->arg0;
2003   UINT32 op = m_rsp_state->arg0;
21702004   int dest = (op >> 16) & 0x1f;
21712005   int base = (op >> 21) & 0x1f;
21722006   int index = (op >> 7) & 0xf;
r31833r31834
21762010      offset |= 0xffffffc0;
21772011   }
21782012
2179   UINT32 ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
2013   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
21802014
21812015   int end = index + 4;
21822016   for (int i = index; i < end; i++)
21832017   {
21842018      UINT16 value;
2185      SIMD_EXTRACT16(rsp->xv[dest], value, (i >> 1));
2019      SIMD_EXTRACT16(m_xv[dest], value, (i >> 1));
21862020      value >>= (1 - (i & 1)) * 8;
2187      WRITE8(rsp, ea, (UINT8)value);
2021      DM_WRITE8(ea, (UINT8)value);
21882022      ea++;
21892023   }
21902024}
21912025
2026static void cfunc_rsp_slv_simd(void *param)
2027{
2028   ((rsp_device *)param)->ccfunc_rsp_slv_simd();
2029}
21922030#endif
21932031
21942032#if (!USE_SIMD || SIMUL_SIMD)
21952033
2196static void cfunc_rsp_slv_scalar(void *param)
2034inline void rsp_device::ccfunc_rsp_slv_scalar()
21972035{
2198   rsp_state *rsp = (rsp_state*)param;
2199   UINT32 op = rsp->impstate->arg0;
2036   UINT32 op = m_rsp_state->arg0;
22002037   int dest = (op >> 16) & 0x1f;
22012038   int base = (op >> 21) & 0x1f;
22022039   int index = (op >> 7) & 0xf;
r31833r31834
22062043      offset |= 0xffffffc0;
22072044   }
22082045
2209   UINT32 ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
2046   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
22102047
22112048   int end = index + 4;
22122049   for (int i = index; i < end; i++)
22132050   {
2214      WRITE8(rsp, ea, VREG_B(dest, i));
2051      DM_WRITE8(ea, VREG_B(dest, i));
22152052      ea++;
22162053   }
22172054}
2055
2056static void cfunc_rsp_slv_scalar(void *param)
2057{
2058   ((rsp_device *)param)->ccfunc_rsp_slv_scalar();
2059}
22182060#endif
22192061
22202062#if USE_SIMD
r31833r31834
22272069//
22282070// Stores 8 bytes starting from vector byte index
22292071
2230static void cfunc_rsp_sdv_simd(void *param)
2072inline void rsp_device::ccfunc_rsp_sdv_simd()
22312073{
2232   rsp_state *rsp = (rsp_state*)param;
2233   UINT32 op = rsp->impstate->arg0;
2074   UINT32 op = m_rsp_state->arg0;
22342075   int dest = (op >> 16) & 0x1f;
22352076   int base = (op >> 21) & 0x1f;
22362077   int index = (op >> 7) & 0x8;
r31833r31834
22392080   {
22402081      offset |= 0xffffffc0;
22412082   }
2242   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2083   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
22432084
22442085   int end = index + 8;
22452086   for (int i = index; i < end; i++)
22462087   {
22472088      UINT16 value;
2248      SIMD_EXTRACT16(rsp->xv[dest], value, (i >> 1));
2089      SIMD_EXTRACT16(m_xv[dest], value, (i >> 1));
22492090      value >>= (1 - (i & 1)) * 8;
2250      WRITE8(rsp, ea, (UINT8)value);
2091      DM_WRITE8(ea, (UINT8)value);
22512092      ea++;
22522093   }
22532094}
22542095
2096static void cfunc_rsp_sdv_simd(void *param)
2097{
2098   ((rsp_device *)param)->ccfunc_rsp_sdv_simd();
2099}
22552100#endif
22562101
22572102#if (!USE_SIMD || SIMUL_SIMD)
22582103
2259static void cfunc_rsp_sdv_scalar(void *param)
2104inline void rsp_device::ccfunc_rsp_sdv_scalar()
22602105{
2261   rsp_state *rsp = (rsp_state*)param;
2262   UINT32 op = rsp->impstate->arg0;
2106   UINT32 op = m_rsp_state->arg0;
22632107   int dest = (op >> 16) & 0x1f;
22642108   int base = (op >> 21) & 0x1f;
22652109   int index = (op >> 7) & 0x8;
r31833r31834
22682112   {
22692113      offset |= 0xffffffc0;
22702114   }
2271   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2115   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
22722116
22732117   int end = index + 8;
22742118   for (int i = index; i < end; i++)
22752119   {
2276      WRITE8(rsp, ea, VREG_B(dest, i));
2120      DM_WRITE8(ea, VREG_B(dest, i));
22772121      ea++;
22782122   }
22792123}
2124
2125static void cfunc_rsp_sdv_scalar(void *param)
2126{
2127   ((rsp_device *)param)->ccfunc_rsp_sdv_scalar();
2128}
22802129#endif
22812130
22822131#if USE_SIMD
r31833r31834
22892138//
22902139// Stores up to 16 bytes starting from vector byte index until 16-byte boundary
22912140
2292static void cfunc_rsp_sqv_simd(void *param)
2141inline void rsp_device::ccfunc_rsp_sqv_simd()
22932142{
2294   rsp_state *rsp = (rsp_state*)param;
2295   UINT32 op = rsp->impstate->arg0;
2143   UINT32 op = m_rsp_state->arg0;
22962144   int dest = (op >> 16) & 0x1f;
22972145   int base = (op >> 21) & 0x1f;
22982146   int index = (op >> 7) & 0xf;
r31833r31834
23022150      offset |= 0xffffffc0;
23032151   }
23042152
2305   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2153   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
23062154   int end = index + (16 - (ea & 0xf));
23072155   for (int i=index; i < end; i++)
23082156   {
23092157      UINT16 value;
2310      SIMD_EXTRACT16(rsp->xv[dest], value, (i >> 1));
2158      SIMD_EXTRACT16(m_xv[dest], value, (i >> 1));
23112159      value >>= (1-(i & 1)) * 8;
2312      WRITE8(rsp, ea, (UINT8)value);
2160      DM_WRITE8(ea, (UINT8)value);
23132161      ea++;
23142162   }
23152163}
23162164
2165static void cfunc_rsp_sqv_simd(void *param)
2166{
2167   ((rsp_device *)param)->ccfunc_rsp_sqv_simd();
2168}
23172169#endif
23182170
23192171#if (!USE_SIMD || SIMUL_SIMD)
23202172
2321static void cfunc_rsp_sqv_scalar(void *param)
2173inline void rsp_device::ccfunc_rsp_sqv_scalar()
23222174{
2323   rsp_state *rsp = (rsp_state*)param;
2324   UINT32 op = rsp->impstate->arg0;
2175   UINT32 op = m_rsp_state->arg0;
23252176   int dest = (op >> 16) & 0x1f;
23262177   int base = (op >> 21) & 0x1f;
23272178   int index = (op >> 7) & 0xf;
r31833r31834
23312182      offset |= 0xffffffc0;
23322183   }
23332184
2334   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2185   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
23352186   int end = index + (16 - (ea & 0xf));
23362187   for (int i=index; i < end; i++)
23372188   {
2338      WRITE8(rsp, ea, VREG_B(dest, i & 0xf));
2189      DM_WRITE8(ea, VREG_B(dest, i & 0xf));
23392190      ea++;
23402191   }
23412192}
2193
2194static void cfunc_rsp_sqv_scalar(void *param)
2195{
2196   ((rsp_device *)param)->ccfunc_rsp_sqv_scalar();
2197}
23422198#endif
23432199
23442200#if USE_SIMD
r31833r31834
23512207//
23522208// Stores up to 16 bytes starting from right side until 16-byte boundary
23532209
2354static void cfunc_rsp_srv_simd(void *param)
2210inline void rsp_device::ccfunc_rsp_srv_simd()
23552211{
2356   rsp_state *rsp = (rsp_state*)param;
2357   UINT32 op = rsp->impstate->arg0;
2212   UINT32 op = m_rsp_state->arg0;
23582213   int dest = (op >> 16) & 0x1f;
23592214   int base = (op >> 21) & 0x1f;
23602215   int index = (op >> 7) & 0xf;
r31833r31834
23642219      offset |= 0xffffffc0;
23652220   }
23662221
2367   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2222   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
23682223
23692224   int end = index + (ea & 0xf);
23702225   int o = (16 - (ea & 0xf)) & 0xf;
r31833r31834
23742229   {
23752230      UINT32 bi = (i + o) & 0xf;
23762231      UINT16 value;
2377      SIMD_EXTRACT16(rsp->xv[dest], value, (bi >> 1));
2232      SIMD_EXTRACT16(m_xv[dest], value, (bi >> 1));
23782233      value >>= (1-(bi & 1)) * 8;
2379      WRITE8(rsp, ea, (UINT8)value);
2234      DM_WRITE8(ea, (UINT8)value);
23802235      ea++;
23812236   }
23822237}
23832238
2239static void cfunc_rsp_srv_simd(void *param)
2240{
2241   ((rsp_device *)param)->ccfunc_rsp_srv_simd();
2242}
23842243#endif
23852244
23862245#if (!USE_SIMD || SIMUL_SIMD)
23872246
2388static void cfunc_rsp_srv_scalar(void *param)
2247inline void rsp_device::ccfunc_rsp_srv_scalar()
23892248{
2390   rsp_state *rsp = (rsp_state*)param;
2391   UINT32 op = rsp->impstate->arg0;
2249   UINT32 op = m_rsp_state->arg0;
23922250   int dest = (op >> 16) & 0x1f;
23932251   int base = (op >> 21) & 0x1f;
23942252   int index = (op >> 7) & 0xf;
r31833r31834
23982256      offset |= 0xffffffc0;
23992257   }
24002258
2401   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2259   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
24022260
24032261   int end = index + (ea & 0xf);
24042262   int o = (16 - (ea & 0xf)) & 0xf;
r31833r31834
24062264
24072265   for (int i = index; i < end; i++)
24082266   {
2409      WRITE8(rsp, ea, VREG_B(dest, ((i + o) & 0xf)));
2267      DM_WRITE8(ea, VREG_B(dest, ((i + o) & 0xf)));
24102268      ea++;
24112269   }
24122270}
2271
2272static void cfunc_rsp_srv_scalar(void *param)
2273{
2274   ((rsp_device *)param)->ccfunc_rsp_srv_scalar();
2275}
24132276#endif
24142277
24152278#if USE_SIMD
r31833r31834
24222285//
24232286// Stores upper 8 bits of each element
24242287
2425static void cfunc_rsp_spv_simd(void *param)
2288inline void rsp_device::ccfunc_rsp_spv_simd()
24262289{
2427   rsp_state *rsp = (rsp_state*)param;
2428   UINT32 op = rsp->impstate->arg0;
2290   UINT32 op = m_rsp_state->arg0;
24292291   int dest = (op >> 16) & 0x1f;
24302292   int base = (op >> 21) & 0x1f;
24312293   int index = (op >> 7) & 0xf;
r31833r31834
24352297      offset |= 0xffffffc0;
24362298   }
24372299
2438   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2300   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
24392301   int end = index + 8;
24402302   for (int i=index; i < end; i++)
24412303   {
24422304      if ((i & 0xf) < 8)
24432305      {
24442306         UINT16 value;
2445         SIMD_EXTRACT16(rsp->xv[dest], value, i);
2446         WRITE8(rsp, ea, (UINT8)(value >> 8));
2307         SIMD_EXTRACT16(m_xv[dest], value, i);
2308         DM_WRITE8(ea, (UINT8)(value >> 8));
24472309      }
24482310      else
24492311      {
24502312         UINT16 value;
2451         SIMD_EXTRACT16(rsp->xv[dest], value, i);
2452         WRITE8(rsp, ea, (UINT8)(value >> 7));
2313         SIMD_EXTRACT16(m_xv[dest], value, i);
2314         DM_WRITE8(ea, (UINT8)(value >> 7));
24532315      }
24542316      ea++;
24552317   }
24562318}
24572319
2320static void cfunc_rsp_spv_simd(void *param)
2321{
2322   ((rsp_device *)param)->ccfunc_rsp_spv_simd();
2323}
24582324#endif
24592325
24602326#if (!USE_SIMD || SIMUL_SIMD)
24612327
2462static void cfunc_rsp_spv_scalar(void *param)
2328inline void rsp_device::ccfunc_rsp_spv_scalar()
24632329{
2464   rsp_state *rsp = (rsp_state*)param;
2465   UINT32 op = rsp->impstate->arg0;
2330   UINT32 op = m_rsp_state->arg0;
24662331   int dest = (op >> 16) & 0x1f;
24672332   int base = (op >> 21) & 0x1f;
24682333   int index = (op >> 7) & 0xf;
r31833r31834
24722337      offset |= 0xffffffc0;
24732338   }
24742339
2475   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2340   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
24762341   int end = index + 8;
24772342   for (int i=index; i < end; i++)
24782343   {
24792344      if ((i & 0xf) < 8)
24802345      {
2481         WRITE8(rsp, ea, VREG_B(dest, (i & 0xf) << 1));
2346         DM_WRITE8(ea, VREG_B(dest, (i & 0xf) << 1));
24822347      }
24832348      else
24842349      {
2485         WRITE8(rsp, ea, VREG_S(dest, (i & 0x7)) >> 7);
2350         DM_WRITE8(ea, VREG_S(dest, (i & 0x7)) >> 7);
24862351      }
24872352      ea++;
24882353   }
24892354}
2355
2356static void cfunc_rsp_spv_scalar(void *param)
2357{
2358   ((rsp_device *)param)->ccfunc_rsp_spv_scalar();
2359}
24902360#endif
24912361
24922362#if USE_SIMD
r31833r31834
24992369//
25002370// Stores bits 14-7 of each element
25012371
2502static void cfunc_rsp_suv_simd(void *param)
2372inline void rsp_device::ccfunc_rsp_suv_simd()
25032373{
2504   rsp_state *rsp = (rsp_state*)param;
2505   UINT32 op = rsp->impstate->arg0;
2374   UINT32 op = m_rsp_state->arg0;
25062375   int dest = (op >> 16) & 0x1f;
25072376   int base = (op >> 21) & 0x1f;
25082377   int index = (op >> 7) & 0xf;
r31833r31834
25122381      offset |= 0xffffffc0;
25132382   }
25142383
2515   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2384   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
25162385   int end = index + 8;
25172386   for (int i=index; i < end; i++)
25182387   {
25192388      if ((i & 0xf) < 8)
25202389      {
25212390         UINT16 value;
2522         SIMD_EXTRACT16(rsp->xv[dest], value, i);
2523         WRITE8(rsp, ea, (UINT8)(value >> 7));
2391         SIMD_EXTRACT16(m_xv[dest], value, i);
2392         DM_WRITE8(ea, (UINT8)(value >> 7));
25242393      }
25252394      else
25262395      {
25272396         UINT16 value;
2528         SIMD_EXTRACT16(rsp->xv[dest], value, i);
2529         WRITE8(rsp, ea, (UINT8)(value >> 8));
2397         SIMD_EXTRACT16(m_xv[dest], value, i);
2398         DM_WRITE8(ea, (UINT8)(value >> 8));
25302399      }
25312400      ea++;
25322401   }
25332402}
25342403
2404static void cfunc_rsp_suv_simd(void *param)
2405{
2406   ((rsp_device *)param)->ccfunc_rsp_suv_simd();
2407}
25352408#endif
25362409
25372410#if (!USE_SIMD || SIMUL_SIMD)
25382411
2539static void cfunc_rsp_suv_scalar(void *param)
2412inline void rsp_device::ccfunc_rsp_suv_scalar()
25402413{
2541   rsp_state *rsp = (rsp_state*)param;
2542   UINT32 op = rsp->impstate->arg0;
2414   UINT32 op = m_rsp_state->arg0;
25432415   int dest = (op >> 16) & 0x1f;
25442416   int base = (op >> 21) & 0x1f;
25452417   int index = (op >> 7) & 0xf;
r31833r31834
25492421      offset |= 0xffffffc0;
25502422   }
25512423
2552   UINT32 ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
2424   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
25532425   int end = index + 8;
25542426   for (int i=index; i < end; i++)
25552427   {
25562428      if ((i & 0xf) < 8)
25572429      {
2558         WRITE8(rsp, ea, VREG_S(dest, (i & 0x7)) >> 7);
2430         DM_WRITE8(ea, VREG_S(dest, (i & 0x7)) >> 7);
25592431      }
25602432      else
25612433      {
2562         WRITE8(rsp, ea, VREG_B(dest, ((i & 0x7) << 1)));
2434         DM_WRITE8(ea, VREG_B(dest, ((i & 0x7) << 1)));
25632435      }
25642436      ea++;
25652437   }
25662438}
2439
2440static void cfunc_rsp_suv_scalar(void *param)
2441{
2442   ((rsp_device *)param)->ccfunc_rsp_suv_scalar();
2443}
25672444#endif
25682445
25692446#if USE_SIMD
r31833r31834
25762453//
25772454// Stores bits 14-7 of each element, with 2-byte stride
25782455
2579static void cfunc_rsp_shv_simd(void *param)
2456inline void rsp_device::ccfunc_rsp_shv_simd()
25802457{
2581   rsp_state *rsp = (rsp_state*)param;
2582   UINT32 op = rsp->impstate->arg0;
2458   UINT32 op = m_rsp_state->arg0;
25832459   int dest = (op >> 16) & 0x1f;
25842460   int base = (op >> 21) & 0x1f;
25852461   int index = (op >> 7) & 0xf;
r31833r31834
25892465      offset |= 0xffffffc0;
25902466   }
25912467
2592   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2468   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
25932469   for (int i=0; i < 8; i++)
25942470   {
25952471      int element = index + (i << 1);
25962472      UINT16 value;
2597      SIMD_EXTRACT16(rsp->xv[dest], value, element >> 1);
2598      WRITE8(rsp, ea, (value >> 7) & 0x00ff);
2473      SIMD_EXTRACT16(m_xv[dest], value, element >> 1);
2474      DM_WRITE8(ea, (value >> 7) & 0x00ff);
25992475      ea += 2;
26002476   }
26012477}
26022478
2479static void cfunc_rsp_shv_simd(void *param)
2480{
2481   ((rsp_device *)param)->ccfunc_rsp_shv_simd();
2482}
26032483#endif
26042484
26052485#if (!USE_SIMD || SIMUL_SIMD)
26062486
2607static void cfunc_rsp_shv_scalar(void *param)
2487inline void rsp_device::ccfunc_rsp_shv_scalar()
26082488{
2609   rsp_state *rsp = (rsp_state*)param;
2610   UINT32 op = rsp->impstate->arg0;
2489   UINT32 op = m_rsp_state->arg0;
26112490   int dest = (op >> 16) & 0x1f;
26122491   int base = (op >> 21) & 0x1f;
26132492   int index = (op >> 7) & 0xf;
r31833r31834
26172496      offset |= 0xffffffc0;
26182497   }
26192498
2620   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2499   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
26212500   for (int i=0; i < 8; i++)
26222501   {
26232502      int element = index + (i << 1);
26242503      UINT8 d = (VREG_B(dest, (element & 0xf)) << 1) |
26252504               (VREG_B(dest, ((element + 1) & 0xf)) >> 7);
2626      WRITE8(rsp, ea, d);
2505      DM_WRITE8(ea, d);
26272506      ea += 2;
26282507   }
26292508}
2509
2510static void cfunc_rsp_shv_scalar(void *param)
2511{
2512   ((rsp_device *)param)->ccfunc_rsp_shv_scalar();
2513}
26302514#endif
26312515
26322516#if USE_SIMD
r31833r31834
26392523//
26402524// Stores bits 14-7 of upper or lower quad, with 4-byte stride
26412525
2642static void cfunc_rsp_sfv_simd(void *param)
2526inline void rsp_device::ccfunc_rsp_sfv_simd()
26432527{
2644   rsp_state *rsp = (rsp_state*)param;
2645   UINT32 op = rsp->impstate->arg0;
2528   UINT32 op = m_rsp_state->arg0;
26462529   int dest = (op >> 16) & 0x1f;
26472530   int base = (op >> 21) & 0x1f;
26482531   int index = (op >> 7) & 0xf;
r31833r31834
26522535      offset |= 0xffffffc0;
26532536   }
26542537
2655   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2538   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
26562539   int eaoffset = ea & 0xf;
26572540   ea &= ~0xf;
26582541
r31833r31834
26612544   for (int i = index>>1; i < end; i++)
26622545   {
26632546      UINT16 value;
2664      SIMD_EXTRACT16(rsp->xv[dest], value, i);
2665      WRITE8(rsp, ea + (eaoffset & 0xf), (value >> 7) & 0x00ff);
2547      SIMD_EXTRACT16(m_xv[dest], value, i);
2548      DM_WRITE8(ea + (eaoffset & 0xf), (value >> 7) & 0x00ff);
26662549      eaoffset += 4;
26672550   }
26682551}
26692552
2553static void cfunc_rsp_sfv_simd(void *param)
2554{
2555   ((rsp_device *)param)->ccfunc_rsp_sfv_simd();
2556}
26702557#endif
26712558
26722559#if (!USE_SIMD || SIMUL_SIMD)
26732560
2674static void cfunc_rsp_sfv_scalar(void *param)
2561inline void rsp_device::ccfunc_rsp_sfv_scalar()
26752562{
2676   rsp_state *rsp = (rsp_state*)param;
2677   UINT32 op = rsp->impstate->arg0;
2563   UINT32 op = m_rsp_state->arg0;
26782564   int dest = (op >> 16) & 0x1f;
26792565   int base = (op >> 21) & 0x1f;
26802566   int index = (op >> 7) & 0xf;
r31833r31834
26842570      offset |= 0xffffffc0;
26852571   }
26862572
2687   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2573   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
26882574   int eaoffset = ea & 0xf;
26892575   ea &= ~0xf;
26902576
r31833r31834
26922578
26932579   for (int i = index>>1; i < end; i++)
26942580   {
2695      WRITE8(rsp, ea + (eaoffset & 0xf), VREG_S(dest, i) >> 7);
2581      DM_WRITE8(ea + (eaoffset & 0xf), VREG_S(dest, i) >> 7);
26962582      eaoffset += 4;
26972583   }
26982584}
2585
2586static void cfunc_rsp_sfv_scalar(void *param)
2587{
2588   ((rsp_device *)param)->ccfunc_rsp_sfv_scalar();
2589}
26992590#endif
27002591
27012592#if USE_SIMD
r31833r31834
27092600// Stores the full 128-bit vector starting from vector byte index and wrapping to index 0
27102601// after byte index 15
27112602
2712static void cfunc_rsp_swv_simd(void *param)
2603inline void rsp_device::ccfunc_rsp_swv_simd()
27132604{
2714   rsp_state *rsp = (rsp_state*)param;
2715   UINT32 op = rsp->impstate->arg0;
2605   UINT32 op = m_rsp_state->arg0;
27162606   int dest = (op >> 16) & 0x1f;
27172607   int base = (op >> 21) & 0x1f;
27182608   int index = (op >> 7) & 0xf;
r31833r31834
27222612      offset |= 0xffffffc0;
27232613   }
27242614
2725   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2615   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
27262616   int eaoffset = ea & 0xf;
27272617   ea &= ~0xf;
27282618
r31833r31834
27302620   for (int i = index; i < end; i++)
27312621   {
27322622      UINT16 value;
2733      SIMD_EXTRACT16(rsp->xv[dest], value, i >> 1);
2734      WRITE8(rsp, ea + (eaoffset & 0xf), (value >> ((1-(i & 1)) * 8)) & 0xff);
2623      SIMD_EXTRACT16(m_xv[dest], value, i >> 1);
2624      DM_WRITE8(ea + (eaoffset & 0xf), (value >> ((1-(i & 1)) * 8)) & 0xff);
27352625      eaoffset++;
27362626   }
27372627}
27382628
2629static void cfunc_rsp_swv_simd(void *param)
2630{
2631   ((rsp_device *)param)->ccfunc_rsp_swv_simd();
2632}
27392633#endif
27402634
27412635#if (!USE_SIMD || SIMUL_SIMD)
27422636
2743static void cfunc_rsp_swv_scalar(void *param)
2637inline void rsp_device::ccfunc_rsp_swv_scalar()
27442638{
2745   rsp_state *rsp = (rsp_state*)param;
2746   UINT32 op = rsp->impstate->arg0;
2639   UINT32 op = m_rsp_state->arg0;
27472640   int dest = (op >> 16) & 0x1f;
27482641   int base = (op >> 21) & 0x1f;
27492642   int index = (op >> 7) & 0xf;
r31833r31834
27532646      offset |= 0xffffffc0;
27542647   }
27552648
2756   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2649   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
27572650   int eaoffset = ea & 0xf;
27582651   ea &= ~0xf;
27592652
27602653   int end = index + 16;
27612654   for (int i = index; i < end; i++)
27622655   {
2763      WRITE8(rsp, ea + (eaoffset & 0xf), VREG_B(dest, i & 0xf));
2656      DM_WRITE8(ea + (eaoffset & 0xf), VREG_B(dest, i & 0xf));
27642657      eaoffset++;
27652658   }
27662659}
2660
2661static void cfunc_rsp_swv_scalar(void *param)
2662{
2663   ((rsp_device *)param)->ccfunc_rsp_swv_scalar();
2664}
27672665#endif
27682666
27692667#if USE_SIMD
r31833r31834
27762674//
27772675// Stores one element from maximum of 8 vectors, while incrementing element index
27782676
2779static void cfunc_rsp_stv_simd(void *param)
2677inline void rsp_device::ccfunc_rsp_stv_simd()
27802678{
2781   rsp_state *rsp = (rsp_state*)param;
2782   UINT32 op = rsp->impstate->arg0;
2679   UINT32 op = m_rsp_state->arg0;
27832680   int dest = (op >> 16) & 0x1f;
27842681   int base = (op >> 21) & 0x1f;
27852682   int index = (op >> 7) & 0xf;
r31833r31834
27992696
28002697   int element = 8 - (index >> 1);
28012698
2802   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2699   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
28032700   int eaoffset = (ea & 0xf) + (element * 2);
28042701   ea &= ~0xf;
28052702
28062703   for (int i = vs; i < ve; i++)
28072704   {
28082705      UINT16 value;
2809      SIMD_EXTRACT16(rsp->xv[i], value, element);
2810      WRITE16(rsp, ea + (eaoffset & 0xf), value);
2706      SIMD_EXTRACT16(m_xv[i], value, element);
2707      DM_WRITE16(ea + (eaoffset & 0xf), value);
28112708      eaoffset += 2;
28122709      element++;
28132710   }
28142711}
28152712
2713static void cfunc_rsp_stv_simd(void *param)
2714{
2715   ((rsp_device *)param)->ccfunc_rsp_stv_simd();
2716}
28162717#endif
28172718
28182719#if (!USE_SIMD || SIMUL_SIMD)
28192720
2820static void cfunc_rsp_stv_scalar(void *param)
2721inline void rsp_device::ccfunc_rsp_stv_scalar()
28212722{
2822   rsp_state *rsp = (rsp_state*)param;
2823   UINT32 op = rsp->impstate->arg0;
2723   UINT32 op = m_rsp_state->arg0;
28242724   int dest = (op >> 16) & 0x1f;
28252725   int base = (op >> 21) & 0x1f;
28262726   int index = (op >> 7) & 0xf;
r31833r31834
28402740
28412741   int element = 8 - (index >> 1);
28422742
2843   UINT32 ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
2743   UINT32 ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
28442744   int eaoffset = (ea & 0xf) + (element * 2);
28452745   ea &= ~0xf;
28462746
28472747   for (int i = vs; i < ve; i++)
28482748   {
2849      WRITE16(rsp, ea + (eaoffset & 0xf), VREG_S(i, element & 0x7));
2749      DM_WRITE16(ea + (eaoffset & 0xf), VREG_S(i, element & 0x7));
28502750      eaoffset += 2;
28512751      element++;
28522752   }
28532753}
28542754
2755static void cfunc_rsp_stv_scalar(void *param)
2756{
2757   ((rsp_device *)param)->ccfunc_rsp_stv_scalar();
2758}
28552759#endif
28562760
28572761#if USE_SIMD
2858static int generate_swc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
2762int rsp_device::generate_swc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
28592763{
28602764//  int loopdest;
28612765   UINT32 op = desc->opptr.l[0];
r31833r31834
28722776   switch ((op >> 11) & 0x1f)
28732777   {
28742778      case 0x00:      /* SBV */
2875         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2876         UML_CALLC(block, cfunc_rsp_sbv_simd, rsp);
2779         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2780         UML_CALLC(block, cfunc_rsp_sbv_simd, this);
28772781#if SIMUL_SIMD
2878         UML_CALLC(block, cfunc_backup_regs, rsp);
2879         UML_CALLC(block, cfunc_rsp_sbv_scalar, rsp);
2880         UML_CALLC(block, cfunc_restore_regs, rsp);
2881         UML_CALLC(block, cfunc_verify_regs, rsp);
2782         UML_CALLC(block, cfunc_backup_regs, this);
2783         UML_CALLC(block, cfunc_rsp_sbv_scalar, this);
2784         UML_CALLC(block, cfunc_restore_regs, this);
2785         UML_CALLC(block, cfunc_verify_regs, this);
28822786#endif
28832787         return TRUE;
28842788      case 0x01:      /* SSV */
2885         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2886         UML_CALLC(block, cfunc_rsp_ssv_simd, rsp);
2789         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2790         UML_CALLC(block, cfunc_rsp_ssv_simd, this);
28872791#if SIMUL_SIMD
2888         UML_CALLC(block, cfunc_backup_regs, rsp);
2889         UML_CALLC(block, cfunc_rsp_ssv_scalar, rsp);
2890         UML_CALLC(block, cfunc_restore_regs, rsp);
2891         UML_CALLC(block, cfunc_verify_regs, rsp);
2792         UML_CALLC(block, cfunc_backup_regs, this);
2793         UML_CALLC(block, cfunc_rsp_ssv_scalar, this);
2794         UML_CALLC(block, cfunc_restore_regs, this);
2795         UML_CALLC(block, cfunc_verify_regs, this);
28922796#endif
28932797         return TRUE;
28942798      case 0x02:      /* SLV */
2895         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2896         UML_CALLC(block, cfunc_rsp_slv_simd, rsp);
2799         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2800         UML_CALLC(block, cfunc_rsp_slv_simd, this);
28972801#if SIMUL_SIMD
2898         UML_CALLC(block, cfunc_backup_regs, rsp);
2899         UML_CALLC(block, cfunc_rsp_slv_scalar, rsp);
2900         UML_CALLC(block, cfunc_restore_regs, rsp);
2901         UML_CALLC(block, cfunc_verify_regs, rsp);
2802         UML_CALLC(block, cfunc_backup_regs, this);
2803         UML_CALLC(block, cfunc_rsp_slv_scalar, this);
2804         UML_CALLC(block, cfunc_restore_regs, this);
2805         UML_CALLC(block, cfunc_verify_regs, this);
29022806#endif
29032807         return TRUE;
29042808      case 0x03:      /* SDV */
2905         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2906         UML_CALLC(block, cfunc_rsp_sdv_simd, rsp);
2809         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2810         UML_CALLC(block, cfunc_rsp_sdv_simd, this);
29072811#if SIMUL_SIMD
2908         UML_CALLC(block, cfunc_backup_regs, rsp);
2909         UML_CALLC(block, cfunc_rsp_sdv_scalar, rsp);
2910         UML_CALLC(block, cfunc_restore_regs, rsp);
2911         UML_CALLC(block, cfunc_verify_regs, rsp);
2812         UML_CALLC(block, cfunc_backup_regs, this);
2813         UML_CALLC(block, cfunc_rsp_sdv_scalar, this);
2814         UML_CALLC(block, cfunc_restore_regs, this);
2815         UML_CALLC(block, cfunc_verify_regs, this);
29122816#endif
29132817         return TRUE;
29142818      case 0x04:      /* SQV */
2915         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2916         UML_CALLC(block, cfunc_rsp_sqv_simd, rsp);
2819         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2820         UML_CALLC(block, cfunc_rsp_sqv_simd, this);
29172821#if SIMUL_SIMD
2918         UML_CALLC(block, cfunc_backup_regs, rsp);
2919         UML_CALLC(block, cfunc_rsp_sqv_scalar, rsp);
2920         UML_CALLC(block, cfunc_restore_regs, rsp);
2921         UML_CALLC(block, cfunc_verify_regs, rsp);
2822         UML_CALLC(block, cfunc_backup_regs, this);
2823         UML_CALLC(block, cfunc_rsp_sqv_scalar, this);
2824         UML_CALLC(block, cfunc_restore_regs, this);
2825         UML_CALLC(block, cfunc_verify_regs, this);
29222826#endif
29232827         return TRUE;
29242828      case 0x05:      /* SRV */
2925         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2926         UML_CALLC(block, cfunc_rsp_srv_simd, rsp);
2829         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2830         UML_CALLC(block, cfunc_rsp_srv_simd, this);
29272831#if SIMUL_SIMD
2928         UML_CALLC(block, cfunc_backup_regs, rsp);
2929         UML_CALLC(block, cfunc_rsp_srv_scalar, rsp);
2930         UML_CALLC(block, cfunc_restore_regs, rsp);
2931         UML_CALLC(block, cfunc_verify_regs, rsp);
2832         UML_CALLC(block, cfunc_backup_regs, this);
2833         UML_CALLC(block, cfunc_rsp_srv_scalar, this);
2834         UML_CALLC(block, cfunc_restore_regs, this);
2835         UML_CALLC(block, cfunc_verify_regs, this);
29322836#endif
29332837         return TRUE;
29342838      case 0x06:      /* SPV */
2935         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2936         UML_CALLC(block, cfunc_rsp_spv_simd, rsp);
2839         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2840         UML_CALLC(block, cfunc_rsp_spv_simd, this);
29372841#if SIMUL_SIMD
2938         UML_CALLC(block, cfunc_backup_regs, rsp);
2939         UML_CALLC(block, cfunc_rsp_spv_scalar, rsp);
2940         UML_CALLC(block, cfunc_restore_regs, rsp);
2941         UML_CALLC(block, cfunc_verify_regs, rsp);
2842         UML_CALLC(block, cfunc_backup_regs, this);
2843         UML_CALLC(block, cfunc_rsp_spv_scalar, this);
2844         UML_CALLC(block, cfunc_restore_regs, this);
2845         UML_CALLC(block, cfunc_verify_regs, this);
29422846#endif
29432847         return TRUE;
29442848      case 0x07:      /* SUV */
2945         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2946         UML_CALLC(block, cfunc_rsp_suv_simd, rsp);
2849         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2850         UML_CALLC(block, cfunc_rsp_suv_simd, this);
29472851#if SIMUL_SIMD
2948         UML_CALLC(block, cfunc_backup_regs, rsp);
2949         UML_CALLC(block, cfunc_rsp_suv_scalar, rsp);
2950         UML_CALLC(block, cfunc_restore_regs, rsp);
2951         UML_CALLC(block, cfunc_verify_regs, rsp);
2852         UML_CALLC(block, cfunc_backup_regs, this);
2853         UML_CALLC(block, cfunc_rsp_suv_scalar, this);
2854         UML_CALLC(block, cfunc_restore_regs, this);
2855         UML_CALLC(block, cfunc_verify_regs, this);
29522856#endif
29532857         return TRUE;
29542858      case 0x08:      /* SHV */
2955         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2956         UML_CALLC(block, cfunc_rsp_shv_simd, rsp);
2859         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2860         UML_CALLC(block, cfunc_rsp_shv_simd, this);
29572861#if SIMUL_SIMD
2958         UML_CALLC(block, cfunc_backup_regs, rsp);
2959         UML_CALLC(block, cfunc_rsp_shv_scalar, rsp);
2960         UML_CALLC(block, cfunc_restore_regs, rsp);
2961         UML_CALLC(block, cfunc_verify_regs, rsp);
2862         UML_CALLC(block, cfunc_backup_regs, this);
2863         UML_CALLC(block, cfunc_rsp_shv_scalar, this);
2864         UML_CALLC(block, cfunc_restore_regs, this);
2865         UML_CALLC(block, cfunc_verify_regs, this);
29622866#endif
29632867         return TRUE;
29642868      case 0x09:      /* SFV */
2965         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2966         UML_CALLC(block, cfunc_rsp_sfv_simd, rsp);
2869         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2870         UML_CALLC(block, cfunc_rsp_sfv_simd, this);
29672871#if SIMUL_SIMD
2968         UML_CALLC(block, cfunc_backup_regs, rsp);
2969         UML_CALLC(block, cfunc_rsp_sfv_scalar, rsp);
2970         UML_CALLC(block, cfunc_restore_regs, rsp);
2971         UML_CALLC(block, cfunc_verify_regs, rsp);
2872         UML_CALLC(block, cfunc_backup_regs, this);
2873         UML_CALLC(block, cfunc_rsp_sfv_scalar, this);
2874         UML_CALLC(block, cfunc_restore_regs, this);
2875         UML_CALLC(block, cfunc_verify_regs, this);
29722876#endif
29732877         return TRUE;
29742878      case 0x0a:      /* SWV */
2975         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2976         UML_CALLC(block, cfunc_rsp_swv_simd, rsp);
2879         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2880         UML_CALLC(block, cfunc_rsp_swv_simd, this);
29772881#if SIMUL_SIMD
2978         UML_CALLC(block, cfunc_backup_regs, rsp);
2979         UML_CALLC(block, cfunc_rsp_swv_scalar, rsp);
2980         UML_CALLC(block, cfunc_restore_regs, rsp);
2981         UML_CALLC(block, cfunc_verify_regs, rsp);
2882         UML_CALLC(block, cfunc_backup_regs, this);
2883         UML_CALLC(block, cfunc_rsp_swv_scalar, this);
2884         UML_CALLC(block, cfunc_restore_regs, this);
2885         UML_CALLC(block, cfunc_verify_regs, this);
29822886#endif
29832887         return TRUE;
29842888      case 0x0b:      /* STV */
2985         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2986         UML_CALLC(block, cfunc_rsp_stv_simd, rsp);
2889         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2890         UML_CALLC(block, cfunc_rsp_stv_simd, this);
29872891#if SIMUL_SIMD
2988         UML_CALLC(block, cfunc_backup_regs, rsp);
2989         UML_CALLC(block, cfunc_rsp_stv_scalar, rsp);
2990         UML_CALLC(block, cfunc_restore_regs, rsp);
2991         UML_CALLC(block, cfunc_verify_regs, rsp);
2892         UML_CALLC(block, cfunc_backup_regs, this);
2893         UML_CALLC(block, cfunc_rsp_stv_scalar, this);
2894         UML_CALLC(block, cfunc_restore_regs, this);
2895         UML_CALLC(block, cfunc_verify_regs, this);
29922896#endif
29932897         return TRUE;
29942898
29952899      default:
2996         unimplemented_opcode(rsp, op);
2900         unimplemented_opcode(op);
29972901         return FALSE;
29982902   }
29992903
r31833r31834
30022906
30032907#else
30042908
3005static int generate_swc2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
2909int rsp_device::generate_swc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
30062910{
30072911//  int loopdest;
30082912   UINT32 op = desc->opptr.l[0];
r31833r31834
30192923   switch ((op >> 11) & 0x1f)
30202924   {
30212925      case 0x00:      /* SBV */
3022         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3023         UML_CALLC(block, cfunc_rsp_sbv_scalar, rsp);
2926         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2927         UML_CALLC(block, cfunc_rsp_sbv_scalar, this);
30242928         return TRUE;
30252929      case 0x01:      /* SSV */
3026         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3027         UML_CALLC(block, cfunc_rsp_ssv_scalar, rsp);
2930         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2931         UML_CALLC(block, cfunc_rsp_ssv_scalar, this);
30282932         return TRUE;
30292933      case 0x02:      /* SLV */
3030         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3031         UML_CALLC(block, cfunc_rsp_slv_scalar, rsp);
2934         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2935         UML_CALLC(block, cfunc_rsp_slv_scalar, this);
30322936         return TRUE;
30332937      case 0x03:      /* SDV */
3034         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3035         UML_CALLC(block, cfunc_rsp_sdv_scalar, rsp);
2938         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2939         UML_CALLC(block, cfunc_rsp_sdv_scalar, this);
30362940         return TRUE;
30372941      case 0x04:      /* SQV */
3038         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3039         UML_CALLC(block, cfunc_rsp_sqv_scalar, rsp);
2942         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2943         UML_CALLC(block, cfunc_rsp_sqv_scalar, this);
30402944         return TRUE;
30412945      case 0x05:      /* SRV */
3042         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3043         UML_CALLC(block, cfunc_rsp_srv_scalar, rsp);
2946         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2947         UML_CALLC(block, cfunc_rsp_srv_scalar, this);
30442948         return TRUE;
30452949      case 0x06:      /* SPV */
3046         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3047         UML_CALLC(block, cfunc_rsp_spv_scalar, rsp);
2950         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2951         UML_CALLC(block, cfunc_rsp_spv_scalar, this);
30482952         return TRUE;
30492953      case 0x07:      /* SUV */
3050         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3051         UML_CALLC(block, cfunc_rsp_suv_scalar, rsp);
2954         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2955         UML_CALLC(block, cfunc_rsp_suv_scalar, this);
30522956         return TRUE;
30532957      case 0x08:      /* SHV */
3054         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3055         UML_CALLC(block, cfunc_rsp_shv_scalar, rsp);
2958         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2959         UML_CALLC(block, cfunc_rsp_shv_scalar, this);
30562960         return TRUE;
30572961      case 0x09:      /* SFV */
3058         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3059         UML_CALLC(block, cfunc_rsp_sfv_scalar, rsp);
2962         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2963         UML_CALLC(block, cfunc_rsp_sfv_scalar, this);
30602964         return TRUE;
30612965      case 0x0a:      /* SWV */
3062         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3063         UML_CALLC(block, cfunc_rsp_swv_scalar, rsp);
2966         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2967         UML_CALLC(block, cfunc_rsp_swv_scalar, this);
30642968         return TRUE;
30652969      case 0x0b:      /* STV */
3066         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
3067         UML_CALLC(block, cfunc_rsp_stv_scalar, rsp);
2970         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
2971         UML_CALLC(block, cfunc_rsp_stv_scalar, this);
30682972         return TRUE;
30692973
30702974      default:
3071         unimplemented_opcode(rsp, op);
2975         unimplemented_opcode(op);
30722976         return FALSE;
30732977   }
30742978
r31833r31834
30772981#endif
30782982
30792983#if USE_SIMD
3080INLINE UINT16 VEC_SATURATE_ACCUM(rsp_state *rsp, int accum, int slice, UINT16 negative, UINT16 positive)
2984inline UINT16 rsp_device::VEC_SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive)
30812985{
3082   if ((INT16)VEC_ACCUM_H(rsp, accum) < 0)
2986   if ((INT16)VEC_ACCUM_H(accum) < 0)
30832987   {
3084      if ((UINT16)(VEC_ACCUM_H(rsp, accum)) != 0xffff)
2988      if ((UINT16)(VEC_ACCUM_H(accum)) != 0xffff)
30852989      {
30862990         return negative;
30872991      }
30882992      else
30892993      {
3090         if ((INT16)VEC_ACCUM_M(rsp, accum) >= 0)
2994         if ((INT16)VEC_ACCUM_M(accum) >= 0)
30912995         {
30922996            return negative;
30932997         }
r31833r31834
30952999         {
30963000            if (slice == 0)
30973001            {
3098               return VEC_ACCUM_L(rsp, accum);
3002               return VEC_ACCUM_L(accum);
30993003            }
31003004            else if (slice == 1)
31013005            {
3102               return VEC_ACCUM_M(rsp, accum);
3006               return VEC_ACCUM_M(accum);
31033007            }
31043008         }
31053009      }
31063010   }
31073011   else
31083012   {
3109      if ((UINT16)(VEC_ACCUM_H(rsp, accum)) != 0)
3013      if ((UINT16)(VEC_ACCUM_H(accum)) != 0)
31103014      {
31113015         return positive;
31123016      }
31133017      else
31143018      {
3115         if ((INT16)VEC_ACCUM_M(rsp, accum) < 0)
3019         if ((INT16)VEC_ACCUM_M(accum) < 0)
31163020         {
31173021            return positive;
31183022         }
r31833r31834
31203024         {
31213025            if (slice == 0)
31223026            {
3123               return VEC_ACCUM_L(rsp, accum);
3027               return VEC_ACCUM_L(accum);
31243028            }
31253029            else
31263030            {
3127               return VEC_ACCUM_M(rsp, accum);
3031               return VEC_ACCUM_M(accum);
31283032            }
31293033         }
31303034      }
r31833r31834
31343038#endif
31353039
31363040#if (!USE_SIMD || SIMUL_SIMD)
3137INLINE UINT16 SATURATE_ACCUM(rsp_state *rsp, int accum, int slice, UINT16 negative, UINT16 positive)
3041inline UINT16 rsp_device::SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive)
31383042{
3139   if ((INT16)ACCUM_H(rsp, accum) < 0)
3043   if ((INT16)ACCUM_H(accum) < 0)
31403044   {
3141      if ((UINT16)(ACCUM_H(rsp, accum)) != 0xffff)
3045      if ((UINT16)(ACCUM_H(accum)) != 0xffff)
31423046      {
31433047         return negative;
31443048      }
31453049      else
31463050      {
3147         if ((INT16)ACCUM_M(rsp, accum) >= 0)
3051         if ((INT16)ACCUM_M(accum) >= 0)
31483052         {
31493053            return negative;
31503054         }
r31833r31834
31523056         {
31533057            if (slice == 0)
31543058            {
3155               return ACCUM_L(rsp, accum);
3059               return ACCUM_L(accum);
31563060            }
31573061            else if (slice == 1)
31583062            {
3159               return ACCUM_M(rsp, accum);
3063               return ACCUM_M(accum);
31603064            }
31613065         }
31623066      }
31633067   }
31643068   else
31653069   {
3166      if ((UINT16)(ACCUM_H(rsp, accum)) != 0)
3070      if ((UINT16)(ACCUM_H(accum)) != 0)
31673071      {
31683072         return positive;
31693073      }
31703074      else
31713075      {
3172         if ((INT16)ACCUM_M(rsp, accum) < 0)
3076         if ((INT16)ACCUM_M(accum) < 0)
31733077         {
31743078            return positive;
31753079         }
r31833r31834
31773081         {
31783082            if (slice == 0)
31793083            {
3180               return ACCUM_L(rsp, accum);
3084               return ACCUM_L(accum);
31813085            }
31823086            else
31833087            {
3184               return ACCUM_M(rsp, accum);
3088               return ACCUM_M(accum);
31853089            }
31863090         }
31873091      }
r31833r31834
31903094}
31913095#endif
31923096
3193INLINE UINT16 SATURATE_ACCUM1(rsp_state *rsp, int accum, UINT16 negative, UINT16 positive)
3097inline UINT16 rsp_device::SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive)
31943098{
31953099   // Return negative if H<0 && (H!=0xffff || M >= 0)
31963100   // Return positive if H>0 || (H==0 && M<0)
31973101   // Return medium slice if H==0xffff && M<0
31983102   // Return medium slice if H==0 && M>=0
3199   if ((INT16)ACCUM_H(rsp, accum) < 0)
3103   if ((INT16)ACCUM_H(accum) < 0)
32003104   {
3201      if ((UINT16)(ACCUM_H(rsp, accum)) != 0xffff)
3105      if ((UINT16)(ACCUM_H(accum)) != 0xffff)
32023106      {
32033107         return negative;
32043108      }
32053109      else
32063110      {
3207         if ((INT16)ACCUM_M(rsp, accum) >= 0)
3111         if ((INT16)ACCUM_M(accum) >= 0)
32083112         {
32093113            return negative;
32103114         }
32113115         else
32123116         {
3213            return ACCUM_M(rsp, accum);
3117            return ACCUM_M(accum);
32143118         }
32153119      }
32163120   }
32173121   else
32183122   {
3219      if ((UINT16)(ACCUM_H(rsp, accum)) != 0)
3123      if ((UINT16)(ACCUM_H(accum)) != 0)
32203124      {
32213125         return positive;
32223126      }
32233127      else
32243128      {
3225         if ((INT16)ACCUM_M(rsp, accum) < 0)
3129         if ((INT16)ACCUM_M(accum) < 0)
32263130         {
32273131            return positive;
32283132         }
32293133         else
32303134         {
3231            return ACCUM_M(rsp, accum);
3135            return ACCUM_M(accum);
32323136         }
32333137      }
32343138   }
r31833r31834
32373141
32383142#if USE_SIMD
32393143#define VEC_WRITEBACK_RESULT() { \
3240      SIMD_INSERT16(rsp->xv[VDREG], vres[0], 0); \
3241      SIMD_INSERT16(rsp->xv[VDREG], vres[1], 1); \
3242      SIMD_INSERT16(rsp->xv[VDREG], vres[2], 2); \
3243      SIMD_INSERT16(rsp->xv[VDREG], vres[3], 3); \
3244      SIMD_INSERT16(rsp->xv[VDREG], vres[4], 4); \
3245      SIMD_INSERT16(rsp->xv[VDREG], vres[5], 5); \
3246      SIMD_INSERT16(rsp->xv[VDREG], vres[6], 6); \
3247      SIMD_INSERT16(rsp->xv[VDREG], vres[7], 7); \
3144      SIMD_INSERT16(m_xv[VDREG], vres[0], 0); \
3145      SIMD_INSERT16(m_xv[VDREG], vres[1], 1); \
3146      SIMD_INSERT16(m_xv[VDREG], vres[2], 2); \
3147      SIMD_INSERT16(m_xv[VDREG], vres[3], 3); \
3148      SIMD_INSERT16(m_xv[VDREG], vres[4], 4); \
3149      SIMD_INSERT16(m_xv[VDREG], vres[5], 5); \
3150      SIMD_INSERT16(m_xv[VDREG], vres[6], 6); \
3151      SIMD_INSERT16(m_xv[VDREG], vres[7], 7); \
32483152}
32493153#endif
32503154
r31833r31834
33583262//
33593263// Multiplies signed integer by signed integer * 2
33603264
3361INLINE void cfunc_rsp_vmulf_simd(void *param)
3265inline void rsp_device::ccfunc_rsp_vmulf_simd()
33623266{
3363   rsp_state *rsp = (rsp_state*)param;
3364   int op = rsp->impstate->arg0;
3267   int op = m_rsp_state->arg0;
33653268
33663269   INT16 vres[8];
33673270   for (int i = 0; i < 8; i++)
r31833r31834
33873290         VEC_SET_ACCUM_H((r < 0) ? 0xffff : 0, i);
33883291         VEC_SET_ACCUM_M((INT16)(r >> 16), i);
33893292         VEC_SET_ACCUM_L((UINT16)(r), i);
3390         vres[i] = VEC_ACCUM_M(rsp, i);
3293         vres[i] = VEC_ACCUM_M(i);
33913294      }
33923295   }
33933296   VEC_WRITEBACK_RESULT();
33943297}
33953298
3299static void cfunc_rsp_vmulf_simd(void *param)
3300{
3301   ((rsp_device *)param)->ccfunc_rsp_vmulf_simd();
3302}
33963303#endif
33973304
33983305#if (!USE_SIMD || SIMUL_SIMD)
33993306
3400INLINE void cfunc_rsp_vmulf_scalar(void *param)
3307inline void rsp_device::ccfunc_rsp_vmulf_scalar()
34013308{
3402   rsp_state *rsp = (rsp_state*)param;
3403   int op = rsp->impstate->arg0;
3309   int op = m_rsp_state->arg0;
34043310
34053311   INT16 vres[8];
34063312   for (int i = 0; i < 8; i++)
r31833r31834
34263332         SET_ACCUM_H((r < 0) ? 0xffff : 0, i);
34273333         SET_ACCUM_M((INT16)(r >> 16), i);
34283334         SET_ACCUM_L((UINT16)(r), i);
3429         vres[i] = ACCUM_M(rsp, i);
3335         vres[i] = ACCUM_M(i);
34303336      }
34313337   }
34323338   WRITEBACK_RESULT();
34333339}
3340
3341static void cfunc_rsp_vmulf_scalar(void *param)
3342{
3343   ((rsp_device *)param)->ccfunc_rsp_vmulf_scalar();
3344}
34343345#endif
34353346
34363347#if USE_SIMD
r31833r31834
34423353// ------------------------------------------------------
34433354//
34443355
3445INLINE void cfunc_rsp_vmulu_simd(void *param)
3356inline void rsp_device::ccfunc_rsp_vmulu_simd()
34463357{
3447   rsp_state *rsp = (rsp_state*)param;
3448   int op = rsp->impstate->arg0;
3358   int op = m_rsp_state->arg0;
34493359
34503360   INT16 vres[8];
34513361   for (int i = 0; i < 8; i++)
r31833r31834
34673377      {
34683378         vres[i] = 0;
34693379      }
3470      else if (((INT16)(VEC_ACCUM_H(rsp, i)) ^ (INT16)(VEC_ACCUM_M(rsp, i))) < 0)
3380      else if (((INT16)(VEC_ACCUM_H(i)) ^ (INT16)(VEC_ACCUM_M(i))) < 0)
34713381      {
34723382         vres[i] = -1;
34733383      }
34743384      else
34753385      {
3476         vres[i] = VEC_ACCUM_M(rsp, i);
3386         vres[i] = VEC_ACCUM_M(i);
34773387      }
34783388   }
34793389   VEC_WRITEBACK_RESULT();
34803390}
34813391
3392static void cfunc_rsp_vmulu_simd(void *param)
3393{
3394   ((rsp_device *)param)->ccfunc_rsp_vmulu_simd();
3395}
34823396#endif
34833397
34843398#if (!USE_SIMD || SIMUL_SIMD)
34853399
3486INLINE void cfunc_rsp_vmulu_scalar(void *param)
3400inline void rsp_device::ccfunc_rsp_vmulu_scalar()
34873401{
3488   rsp_state *rsp = (rsp_state*)param;
3489   int op = rsp->impstate->arg0;
3402   int op = m_rsp_state->arg0;
34903403
34913404   INT16 vres[8];
34923405   for (int i = 0; i < 8; i++)
r31833r31834
35083421      {
35093422         vres[i] = 0;
35103423      }
3511      else if (((INT16)(ACCUM_H(rsp, i)) ^ (INT16)(ACCUM_M(rsp, i))) < 0)
3424      else if (((INT16)(ACCUM_H(i)) ^ (INT16)(ACCUM_M(i))) < 0)
35123425      {
35133426         vres[i] = -1;
35143427      }
35153428      else
35163429      {
3517         vres[i] = ACCUM_M(rsp, i);
3430         vres[i] = ACCUM_M(i);
35183431      }
35193432   }
35203433   WRITEBACK_RESULT();
35213434}
3435
3436static void cfunc_rsp_vmulu_scalar(void *param)
3437{
3438   ((rsp_device *)param)->ccfunc_rsp_vmulu_scalar();
3439}
35223440#endif
35233441
35243442#if USE_SIMD
r31833r31834
35333451// The result is added into accumulator
35343452// The middle slice of accumulator is stored into destination element
35353453
3536INLINE void cfunc_rsp_vmudl_simd(void *param)
3454inline void rsp_device::ccfunc_rsp_vmudl_simd()
35373455{
3538   rsp_state *rsp = (rsp_state*)param;
3539   int op = rsp->impstate->arg0;
3456   int op = m_rsp_state->arg0;
35403457
3541   __m128i vsReg = rsp->xv[VS1REG];
3542   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3458   __m128i vsReg = m_xv[VS1REG];
3459   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
35433460
35443461   /* Unpack to obtain for 32-bit precision. */
35453462   __m128i unpackLo = _mm_mullo_epi16(vsReg, vtReg);
r31833r31834
35473464   __m128i loProduct = _mm_unpacklo_epi16(unpackLo, unpackHi);
35483465   __m128i hiProduct = _mm_unpackhi_epi16(unpackLo, unpackHi);
35493466
3550   rsp->xv[VDREG] = rsp->accum_l = RSPPackHi32to16(loProduct, hiProduct);
3467   m_xv[VDREG] = m_accum_l = RSPPackHi32to16(loProduct, hiProduct);
35513468
3552   rsp->accum_m = _mm_setzero_si128();
3553   rsp->accum_h = _mm_setzero_si128();
3469   m_accum_m = _mm_setzero_si128();
3470   m_accum_h = _mm_setzero_si128();
35543471}
35553472
3473static void cfunc_rsp_vmudl_simd(void *param)
3474{
3475   ((rsp_device *)param)->ccfunc_rsp_vmudl_simd();
3476}
35563477#endif
35573478
35583479#if (!USE_SIMD || SIMUL_SIMD)
35593480
3560INLINE void cfunc_rsp_vmudl_scalar(void *param)
3481inline void rsp_device::ccfunc_rsp_vmudl_scalar()
35613482{
3562   rsp_state *rsp = (rsp_state*)param;
3563   int op = rsp->impstate->arg0;
3483   int op = m_rsp_state->arg0;
35643484
35653485   INT16 vres[8];
35663486   for (int i = 0; i < 8; i++)
r31833r31834
35773497      SET_ACCUM_M(0, i);
35783498      SET_ACCUM_L((UINT16)(r >> 16), i);
35793499
3580      vres[i] = ACCUM_L(rsp, i);
3500      vres[i] = ACCUM_L(i);
35813501   }
35823502   WRITEBACK_RESULT();
35833503}
3504
3505static void cfunc_rsp_vmudl_scalar(void *param)
3506{
3507   ((rsp_device *)param)->ccfunc_rsp_vmudl_scalar();
3508}
35843509#endif
35853510
35863511#if USE_SIMD
r31833r31834
35953520// The result is stored into accumulator
35963521// The middle slice of accumulator is stored into destination element
35973522
3598INLINE void cfunc_rsp_vmudm_simd(void *param)
3523inline void rsp_device::ccfunc_rsp_vmudm_simd()
35993524{
3600   rsp_state *rsp = (rsp_state*)param;
3601   int op = rsp->impstate->arg0;
3525   int op = m_rsp_state->arg0;
36023526
36033527   __m128i vsRegLo, vsRegHi, vtRegLo, vtRegHi;
36043528
3605   __m128i vsReg = rsp->xv[VS1REG];
3606   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3529   __m128i vsReg = m_xv[VS1REG];
3530   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
36073531
36083532   /* Unpack to obtain for 32-bit precision. */
36093533   RSPSignExtend16to32(vsReg, &vsRegLo, &vsRegHi);
r31833r31834
36123536   /* Begin accumulating the products. */
36133537   __m128i loProduct = _mm_mullo_epi32(vsRegLo, vtRegLo);
36143538   __m128i hiProduct = _mm_mullo_epi32(vsRegHi, vtRegHi);
3615   rsp->accum_l = RSPPackLo32to16(loProduct, hiProduct);
3616   rsp->accum_m = rsp->xv[VDREG] = RSPPackHi32to16(loProduct, hiProduct);
3539   m_accum_l = RSPPackLo32to16(loProduct, hiProduct);
3540   m_accum_m = m_xv[VDREG] = RSPPackHi32to16(loProduct, hiProduct);
36173541
36183542   loProduct = _mm_cmplt_epi32(loProduct, _mm_setzero_si128());
36193543   hiProduct = _mm_cmplt_epi32(hiProduct, _mm_setzero_si128());
3620   rsp->accum_h = _mm_packs_epi32(loProduct, hiProduct);
3544   m_accum_h = _mm_packs_epi32(loProduct, hiProduct);
36213545}
36223546
3547static void cfunc_rsp_vmudm_simd(void *param)
3548{
3549   ((rsp_device *)param)->ccfunc_rsp_vmudm_simd();
3550}
36233551#endif
36243552
36253553#if (!USE_SIMD || SIMUL_SIMD)
36263554
3627INLINE void cfunc_rsp_vmudm_scalar(void *param)
3555inline void rsp_device::ccfunc_rsp_vmudm_scalar()
36283556{
3629   rsp_state *rsp = (rsp_state*)param;
3630   int op = rsp->impstate->arg0;
3557   int op = m_rsp_state->arg0;
36313558
36323559   INT16 vres[8];
36333560   for (int i = 0; i < 8; i++)
r31833r31834
36443571      SET_ACCUM_M((INT16)(r >> 16), i);
36453572      SET_ACCUM_L((UINT16)r, i);
36463573
3647      vres[i] = ACCUM_M(rsp, i);
3574      vres[i] = ACCUM_M(i);
36483575   }
36493576   WRITEBACK_RESULT();
36503577}
3578
3579static void cfunc_rsp_vmudm_scalar(void *param)
3580{
3581   ((rsp_device *)param)->ccfunc_rsp_vmudm_scalar();
3582}
36513583#endif
36523584
36533585#if USE_SIMD
r31833r31834
36623594// The result is stored into accumulator
36633595// The low slice of accumulator is stored into destination element
36643596
3665INLINE void cfunc_rsp_vmudn_simd(void *param)
3597inline void rsp_device::ccfunc_rsp_vmudn_simd()
36663598{
3667   rsp_state *rsp = (rsp_state*)param;
3668   int op = rsp->impstate->arg0;
3599   int op = m_rsp_state->arg0;
36693600
36703601   __m128i vsRegLo, vsRegHi, vtRegLo, vtRegHi;
36713602
3672   __m128i vsReg = rsp->xv[VS1REG];
3673   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3603   __m128i vsReg = m_xv[VS1REG];
3604   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
36743605
36753606   /* Unpack to obtain for 32-bit precision. */
36763607   RSPZeroExtend16to32(vsReg, &vsRegLo, &vsRegHi);
r31833r31834
36793610   /* Begin accumulating the products. */
36803611   __m128i loProduct = _mm_mullo_epi32(vsRegLo, vtRegLo);
36813612   __m128i hiProduct = _mm_mullo_epi32(vsRegHi, vtRegHi);
3682   rsp->xv[VDREG] = rsp->accum_l = RSPPackLo32to16(loProduct, hiProduct);
3683   rsp->accum_m = RSPPackHi32to16(loProduct, hiProduct);
3684   rsp->accum_h = _mm_cmplt_epi16(rsp->accum_m, _mm_setzero_si128());
3613   m_xv[VDREG] = m_accum_l = RSPPackLo32to16(loProduct, hiProduct);
3614   m_accum_m = RSPPackHi32to16(loProduct, hiProduct);
3615   m_accum_h = _mm_cmplt_epi16(m_accum_m, _mm_setzero_si128());
36853616}
36863617
3618static void cfunc_rsp_vmudn_simd(void *param)
3619{
3620   ((rsp_device *)param)->ccfunc_rsp_vmudn_simd();
3621}
36873622#endif
36883623
36893624#if (!USE_SIMD || SIMUL_SIMD)
36903625
3691INLINE void cfunc_rsp_vmudn_scalar(void *param)
3626inline void rsp_device::ccfunc_rsp_vmudn_scalar()
36923627{
3693   rsp_state *rsp = (rsp_state*)param;
3694   int op = rsp->impstate->arg0;
3628   int op = m_rsp_state->arg0;
36953629
36963630   INT16 vres[8] = { 0 };
36973631   for (int i = 0; i < 8; i++)
r31833r31834
37123646   }
37133647   WRITEBACK_RESULT();
37143648}
3649
3650static void cfunc_rsp_vmudn_scalar(void *param)
3651{
3652   ((rsp_device *)param)->ccfunc_rsp_vmudn_scalar();
3653}
37153654#endif
37163655
37173656#if USE_SIMD
r31833r31834
37263665// The result is stored into highest 32 bits of accumulator, the low slice is zero
37273666// The highest 32 bits of accumulator is saturated into destination element
37283667
3729INLINE void cfunc_rsp_vmudh_simd(void *param)
3668inline void rsp_device::ccfunc_rsp_vmudh_simd()
37303669{
3731   rsp_state *rsp = (rsp_state*)param;
3732   int op = rsp->impstate->arg0;
3670   int op = m_rsp_state->arg0;
37333671
37343672   __m128i vaccLow, vaccHigh;
37353673   __m128i unpackLo, unpackHi;
37363674
3737   __m128i vsReg = rsp->xv[VS1REG];
3738   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3675   __m128i vsReg = m_xv[VS1REG];
3676   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
37393677
37403678   /* Multiply the sources, accumulate the product. */
37413679   unpackLo = _mm_mullo_epi16(vsReg, vtReg);
r31833r31834
37443682   vaccLow = _mm_unpacklo_epi16(unpackLo, unpackHi);
37453683
37463684   /* Pack the accumulator and result back up. */
3747   rsp->xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
3748   rsp->accum_l = _mm_setzero_si128();
3749   rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3750   rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
3685   m_xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
3686   m_accum_l = _mm_setzero_si128();
3687   m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3688   m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
37513689}
37523690
3691static void cfunc_rsp_vmudh_simd(void *param)
3692{
3693   ((rsp_device *)param)->ccfunc_rsp_vmudh_simd();
3694}
37533695#endif
37543696
37553697#if (!USE_SIMD || SIMUL_SIMD)
37563698
3757INLINE void cfunc_rsp_vmudh_scalar(void *param)
3699inline void rsp_device::ccfunc_rsp_vmudh_scalar()
37583700{
3759   rsp_state *rsp = (rsp_state*)param;
3760   int op = rsp->impstate->arg0;
3701   int op = m_rsp_state->arg0;
37613702
37623703   INT16 vres[8];
37633704   for (int i = 0; i < 8; i++)
r31833r31834
37803721   }
37813722   WRITEBACK_RESULT();
37823723}
3724
3725static void cfunc_rsp_vmudh_scalar(void *param)
3726{
3727   ((rsp_device *)param)->ccfunc_rsp_vmudh_scalar();
3728}
37833729#endif
37843730
37853731#if USE_SIMD
r31833r31834
37913737// ------------------------------------------------------
37923738//
37933739
3794INLINE void cfunc_rsp_vmacf_simd(void *param)
3740inline void rsp_device::ccfunc_rsp_vmacf_simd()
37953741{
3796   rsp_state *rsp = (rsp_state*)param;
3797   int op = rsp->impstate->arg0;
3742   int op = m_rsp_state->arg0;
37983743
37993744   INT16 vres[8];
38003745   for (int i = 0; i < 8; i++)
r31833r31834
38073752
38083753      INT32 r = s1 * s2;
38093754
3810      UINT64 q = (UINT64)(UINT16)VEC_ACCUM_LL(rsp, i);
3811      q |= (((UINT64)(UINT16)VEC_ACCUM_L(rsp, i)) << 16);
3812      q |= (((UINT64)(UINT16)VEC_ACCUM_M(rsp, i)) << 32);
3813      q |= (((UINT64)(UINT16)VEC_ACCUM_H(rsp, i)) << 48);
3755      UINT64 q = (UINT64)(UINT16)VEC_ACCUM_LL(i);
3756      q |= (((UINT64)(UINT16)VEC_ACCUM_L(i)) << 16);
3757      q |= (((UINT64)(UINT16)VEC_ACCUM_M(i)) << 32);
3758      q |= (((UINT64)(UINT16)VEC_ACCUM_H(i)) << 48);
38143759
38153760      q += (INT64)(r) << 17;
38163761      VEC_SET_ACCUM_LL((UINT16)q, i);
r31833r31834
38183763      VEC_SET_ACCUM_M((UINT16)(q >> 32), i);
38193764      VEC_SET_ACCUM_H((UINT16)(q >> 48), i);
38203765
3821      vres[i] = VEC_SATURATE_ACCUM(rsp, i, 1, 0x8000, 0x7fff);
3766      vres[i] = VEC_SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
38223767   }
38233768   VEC_WRITEBACK_RESULT();
38243769/*
r31833r31834
38263771    __m128i vaccHigh;
38273772    __m128i vdReg, vdRegLo, vdRegHi;
38283773
3829    __m128i vsReg = rsp->xv[VS1REG];
3830    __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3774    __m128i vsReg = m_xv[VS1REG];
3775    __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
38313776
3832    __m128i vaccLow = rsp->accum_l;
3777    __m128i vaccLow = m_accum_l;
38333778
38343779    // Unpack to obtain for 32-bit precision.
38353780    RSPZeroExtend16to32(vaccLow, &vaccLow, &vaccHigh);
r31833r31834
38523797    vaccLow = _mm_add_epi32(vaccLow, vdRegLo);
38533798    vaccHigh = _mm_add_epi32(vaccHigh, vdRegHi);
38543799
3855    rsp->accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
3800    m_accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
38563801
38573802    // Multiply the MSB of sources, accumulate the product.
3858    vdRegLo = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
3859    vdRegHi = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
3803    vdRegLo = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
3804    vdRegHi = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
38603805
38613806    loProduct = _mm_srai_epi32(loProduct, 16);
38623807    hiProduct = _mm_srai_epi32(hiProduct, 16);
r31833r31834
38693814    vaccHigh = _mm_add_epi32(vdRegHi, vaccHigh);
38703815
38713816    // Clamp the accumulator and write it all out.
3872    rsp->xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
3873    rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3874    rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
3817    m_xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
3818    m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3819    m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
38753820*/
38763821}
38773822
3823static void cfunc_rsp_vmacf_simd(void *param)
3824{
3825   ((rsp_device *)param)->ccfunc_rsp_vmacf_simd();
3826}
38783827#endif
38793828
38803829#if (!USE_SIMD || SIMUL_SIMD)
38813830
3882INLINE void cfunc_rsp_vmacf_scalar(void *param)
3831inline void rsp_device::ccfunc_rsp_vmacf_scalar()
38833832{
3884   rsp_state *rsp = (rsp_state*)param;
3885   int op = rsp->impstate->arg0;
3833   int op = m_rsp_state->arg0;
38863834
38873835   INT16 vres[8];
38883836   for (int i = 0; i < 8; i++)
r31833r31834
38953843
38963844      INT32 r = s1 * s2;
38973845
3898      UINT64 q = (UINT64)(UINT16)ACCUM_LL(rsp, i);
3899      q |= (((UINT64)(UINT16)ACCUM_L(rsp, i)) << 16);
3900      q |= (((UINT64)(UINT16)ACCUM_M(rsp, i)) << 32);
3901      q |= (((UINT64)(UINT16)ACCUM_H(rsp, i)) << 48);
3846      UINT64 q = (UINT64)(UINT16)ACCUM_LL(i);
3847      q |= (((UINT64)(UINT16)ACCUM_L(i)) << 16);
3848      q |= (((UINT64)(UINT16)ACCUM_M(i)) << 32);
3849      q |= (((UINT64)(UINT16)ACCUM_H(i)) << 48);
39023850
39033851      q += (INT64)(r) << 17;
39043852      SET_ACCUM_LL((UINT16)q, i);
r31833r31834
39063854      SET_ACCUM_M((UINT16)(q >> 32), i);
39073855      SET_ACCUM_H((UINT16)(q >> 48), i);
39083856
3909      vres[i] = SATURATE_ACCUM(rsp, i, 1, 0x8000, 0x7fff);
3857      vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
39103858   }
39113859   WRITEBACK_RESULT();
39123860}
3861
3862static void cfunc_rsp_vmacf_scalar(void *param)
3863{
3864   ((rsp_device *)param)->ccfunc_rsp_vmacf_scalar();
3865}
39133866#endif
39143867
39153868#if USE_SIMD
r31833r31834
39213874// ------------------------------------------------------
39223875//
39233876
3924INLINE void cfunc_rsp_vmacu_simd(void *param)
3877inline void rsp_device::ccfunc_rsp_vmacu_simd()
39253878{
3926   rsp_state *rsp = (rsp_state*)param;
3927   int op = rsp->impstate->arg0;
3879   int op = m_rsp_state->arg0;
39283880
39293881   __m128i loProduct, hiProduct, unpackLo, unpackHi;
39303882   __m128i vaccHigh;
39313883   __m128i vdReg, vdRegLo, vdRegHi;
39323884
3933   __m128i vsReg = rsp->xv[VS1REG];
3934   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
3885   __m128i vsReg = m_xv[VS1REG];
3886   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
39353887
3936   __m128i vaccLow = rsp->accum_l;
3888   __m128i vaccLow = m_accum_l;
39373889
39383890   /* Unpack to obtain for 32-bit precision. */
39393891   RSPZeroExtend16to32(vaccLow, &vaccLow, &vaccHigh);
r31833r31834
39563908   vaccLow = _mm_add_epi32(vaccLow, vdRegLo);
39573909   vaccHigh = _mm_add_epi32(vaccHigh, vdRegHi);
39583910
3959   rsp->accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
3911   m_accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
39603912
39613913   /* Multiply the MSB of sources, accumulate the product. */
3962   vdRegLo = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
3963   vdRegHi = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
3914   vdRegLo = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
3915   vdRegHi = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
39643916
39653917   loProduct = _mm_srai_epi32(loProduct, 16);
39663918   hiProduct = _mm_srai_epi32(hiProduct, 16);
r31833r31834
39733925   vaccHigh = _mm_add_epi32(vdRegHi, vaccHigh);
39743926
39753927   /* Clamp the accumulator and write it all out. */
3976   rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3977   rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
3928   m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
3929   m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
39783930}
39793931
3932static void cfunc_rsp_vmacu_simd(void *param)
3933{
3934   ((rsp_device *)param)->ccfunc_rsp_vmacu_simd();
3935}
39803936#endif
39813937
39823938#if (!USE_SIMD || SIMUL_SIMD)
39833939
3984INLINE void cfunc_rsp_vmacu_scalar(void *param)
3940inline void rsp_device::ccfunc_rsp_vmacu_scalar()
39853941{
3986   rsp_state *rsp = (rsp_state*)param;
3987   int op = rsp->impstate->arg0;
3942   int op = m_rsp_state->arg0;
39883943
39893944   INT16 vres[8];
39903945   for (int i = 0; i < 8; i++)
r31833r31834
39963951      INT32 s2 = (INT32)(INT16)w2;
39973952
39983953      INT32 r1 = s1 * s2;
3999      UINT32 r2 = (UINT16)ACCUM_L(rsp, i) + ((UINT16)(r1) * 2);
4000      UINT32 r3 = (UINT16)ACCUM_M(rsp, i) + (UINT16)((r1 >> 16) * 2) + (UINT16)(r2 >> 16);
3954      UINT32 r2 = (UINT16)ACCUM_L(i) + ((UINT16)(r1) * 2);
3955      UINT32 r3 = (UINT16)ACCUM_M(i) + (UINT16)((r1 >> 16) * 2) + (UINT16)(r2 >> 16);
40013956
40023957      SET_ACCUM_L((UINT16)(r2), i);
40033958      SET_ACCUM_M((UINT16)(r3), i);
4004      SET_ACCUM_H(ACCUM_H(rsp, i) + (UINT16)(r3 >> 16) + (UINT16)(r1 >> 31), i);
3959      SET_ACCUM_H(ACCUM_H(i) + (UINT16)(r3 >> 16) + (UINT16)(r1 >> 31), i);
40053960
4006      if ((INT16)ACCUM_H(rsp, i) < 0)
3961      if ((INT16)ACCUM_H(i) < 0)
40073962      {
40083963         vres[i] = 0;
40093964      }
40103965      else
40113966      {
4012         if (ACCUM_H(rsp, i) != 0)
3967         if (ACCUM_H(i) != 0)
40133968         {
40143969            vres[i] = (INT16)0xffff;
40153970         }
40163971         else
40173972         {
4018            if ((INT16)ACCUM_M(rsp, i) < 0)
3973            if ((INT16)ACCUM_M(i) < 0)
40193974            {
40203975               vres[i] = (INT16)0xffff;
40213976            }
40223977            else
40233978            {
4024               vres[i] = ACCUM_M(rsp, i);
3979               vres[i] = ACCUM_M(i);
40253980            }
40263981         }
40273982      }
40283983   }
40293984   WRITEBACK_RESULT();
40303985}
3986
3987static void cfunc_rsp_vmacu_scalar(void *param)
3988{
3989   ((rsp_device *)param)->ccfunc_rsp_vmacu_scalar();
3990}
40313991#endif
40323992
40333993#if USE_SIMD
r31833r31834
40424002// Adds the higher 16 bits of the 32-bit result to accumulator
40434003// The low slice of accumulator is stored into destination element
40444004
4045INLINE void cfunc_rsp_vmadl_simd(void *param)
4005inline void rsp_device::ccfunc_rsp_vmadl_simd()
40464006{
4047   rsp_state *rsp = (rsp_state*)param;
4048   int op = rsp->impstate->arg0;
4007   int op = m_rsp_state->arg0;
40494008
40504009   INT16 vres[8];
40514010   for (int i = 0; i < 8; i++)
r31833r31834
40574016      UINT32 s2 = w2;
40584017
40594018      UINT32 r1 = s1 * s2;
4060      UINT32 r2 = (UINT16)VEC_ACCUM_L(rsp, i) + (r1 >> 16);
4061      UINT32 r3 = (UINT16)VEC_ACCUM_M(rsp, i) + (r2 >> 16);
4019      UINT32 r2 = (UINT16)VEC_ACCUM_L(i) + (r1 >> 16);
4020      UINT32 r3 = (UINT16)VEC_ACCUM_M(i) + (r2 >> 16);
40624021
40634022      VEC_SET_ACCUM_L((UINT16)r2, i);
40644023      VEC_SET_ACCUM_M((UINT16)r3, i);
4065      VEC_SET_ACCUM_H(VEC_ACCUM_H(rsp, i) + (INT16)(r3 >> 16), i);
4024      VEC_SET_ACCUM_H(VEC_ACCUM_H(i) + (INT16)(r3 >> 16), i);
40664025
4067      vres[i] = VEC_SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
4026      vres[i] = VEC_SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
40684027   }
40694028   VEC_WRITEBACK_RESULT();
40704029
r31833r31834
40724031   __m128i unpackHi, loProduct, hiProduct;
40734032   __m128i vdReg, vdRegLo, vdRegHi;
40744033
4075   __m128i vsReg = rsp->xv[VS1REG];
4076   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4034   __m128i vsReg = m_xv[VS1REG];
4035   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
40774036
4078   __m128i vaccLow = rsp->accum_l;
4037   __m128i vaccLow = m_accum_l;
40794038
40804039   // Unpack to obtain for 32-bit precision.
40814040   RSPZeroExtend16to32(vaccLow, &vaccLow, &vaccHigh);
r31833r31834
40874046
40884047   vaccLow = _mm_add_epi32(vaccLow, loProduct);
40894048   vaccHigh = _mm_add_epi32(vaccHigh, hiProduct);
4090   rsp->accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
4049   m_accum_l = vdReg = RSPPackLo32to16(vaccLow, vaccHigh);
40914050
40924051   // Finish accumulating whatever is left.
4093   vdRegLo = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
4094   vdRegHi = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
4052   vdRegLo = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
4053   vdRegHi = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
40954054
40964055   vaccLow = _mm_srai_epi32(vaccLow, 16);
40974056   vaccHigh = _mm_srai_epi32(vaccHigh, 16);
r31833r31834
40994058   vaccHigh = _mm_add_epi32(vdRegHi, vaccHigh);
41004059
41014060   // Clamp the accumulator and write it all out.
4102   rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4103   rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4104   rsp->xv[VDREG] = RSPClampLowToVal(vdReg, rsp->accum_m, rsp->accum_h);*/
4061   m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4062   m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4063   m_xv[VDREG] = RSPClampLowToVal(vdReg, m_accum_m, m_accum_h);*/
41054064}
41064065
4066static void cfunc_rsp_vmadl_simd(void *param)
4067{
4068   ((rsp_device *)param)->ccfunc_rsp_vmadl_simd();
4069}
41074070#endif
41084071
41094072#if (!USE_SIMD || SIMUL_SIMD)
41104073
4111INLINE void cfunc_rsp_vmadl_scalar(void *param)
4074inline void rsp_device::ccfunc_rsp_vmadl_scalar()
41124075{
4113   rsp_state *rsp = (rsp_state*)param;
4114   int op = rsp->impstate->arg0;
4076   int op = m_rsp_state->arg0;
41154077
41164078   INT16 vres[8];
41174079   for (int i = 0; i < 8; i++)
r31833r31834
41234085      UINT32 s2 = w2;
41244086
41254087      UINT32 r1 = s1 * s2;
4126      UINT32 r2 = (UINT16)ACCUM_L(rsp, i) + (r1 >> 16);
4127      UINT32 r3 = (UINT16)ACCUM_M(rsp, i) + (r2 >> 16);
4088      UINT32 r2 = (UINT16)ACCUM_L(i) + (r1 >> 16);
4089      UINT32 r3 = (UINT16)ACCUM_M(i) + (r2 >> 16);
41284090
41294091      SET_ACCUM_L((UINT16)r2, i);
41304092      SET_ACCUM_M((UINT16)r3, i);
4131      SET_ACCUM_H(ACCUM_H(rsp, i) + (INT16)(r3 >> 16), i);
4093      SET_ACCUM_H(ACCUM_H(i) + (INT16)(r3 >> 16), i);
41324094
4133      vres[i] = SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
4095      vres[i] = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
41344096   }
41354097   WRITEBACK_RESULT();
41364098}
4099
4100static void cfunc_rsp_vmadl_scalar(void *param)
4101{
4102   ((rsp_device *)param)->ccfunc_rsp_vmadl_scalar();
4103}
41374104#endif
41384105
41394106#if USE_SIMD
41404107// VMADM
41414108//
41424109
4143INLINE void cfunc_rsp_vmadm_simd(void *param)
4110inline void rsp_device::ccfunc_rsp_vmadm_simd()
41444111{
4145   rsp_state *rsp = (rsp_state*)param;
4146   int op = rsp->impstate->arg0;
4112   int op = m_rsp_state->arg0;
41474113
41484114   __m128i vaccLow, vaccHigh, loProduct, hiProduct;
41494115   __m128i vsRegLo, vsRegHi, vtRegLo, vtRegHi, vdRegLo, vdRegHi;
41504116
4151   __m128i vsReg = rsp->xv[VS1REG];
4152   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4117   __m128i vsReg = m_xv[VS1REG];
4118   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
41534119
41544120   /* Unpack to obtain for 32-bit precision. */
41554121   RSPSignExtend16to32(vsReg, &vsRegLo, &vsRegHi);
41564122   RSPZeroExtend16to32(vtReg, &vtRegLo, &vtRegHi);
4157   RSPZeroExtend16to32(rsp->accum_l, &vaccLow, &vaccHigh);
4123   RSPZeroExtend16to32(m_accum_l, &vaccLow, &vaccHigh);
41584124
41594125   /* Begin accumulating the products. */
41604126   loProduct = _mm_mullo_epi32(vsRegLo, vtRegLo);
r31833r31834
41694135   vaccLow = _mm_add_epi32(vaccLow, vdRegLo);
41704136   vaccHigh = _mm_add_epi32(vaccHigh, vdRegHi);
41714137
4172   rsp->accum_l = rsp->xv[VDREG] = RSPPackLo32to16(vaccLow, vaccHigh);
4138   m_accum_l = m_xv[VDREG] = RSPPackLo32to16(vaccLow, vaccHigh);
41734139
41744140   /* Multiply the MSB of sources, accumulate the product. */
4175   vdRegLo = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
4176   vdRegHi = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
4141   vdRegLo = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
4142   vdRegHi = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
41774143
41784144   loProduct = _mm_srai_epi32(loProduct, 16);
41794145   hiProduct = _mm_srai_epi32(hiProduct, 16);
r31833r31834
41864152   vaccHigh = _mm_add_epi32(vdRegHi, vaccHigh);
41874153
41884154   /* Clamp the accumulator and write it all out. */
4189   rsp->xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
4190   rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4191   rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4155   m_xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
4156   m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4157   m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
41924158}
41934159
4160static void cfunc_rsp_vmadm_simd(void *param)
4161{
4162   ((rsp_device *)param)->ccfunc_rsp_vmadm_simd();
4163}
41944164#endif
41954165
41964166#if (!USE_SIMD || SIMUL_SIMD)
41974167
4198INLINE void cfunc_rsp_vmadm_scalar(void *param)
4168inline void rsp_device::ccfunc_rsp_vmadm_scalar()
41994169{
4200   rsp_state *rsp = (rsp_state*)param;
4201   int op = rsp->impstate->arg0;
4170   int op = m_rsp_state->arg0;
42024171
42034172   INT16 vres[8];
42044173   for (int i = 0; i < 8; i++)
r31833r31834
42104179      UINT32 s2 = (UINT16)w2;
42114180
42124181      UINT32 r1 = s1 * s2;
4213      UINT32 r2 = (UINT16)ACCUM_L(rsp, i) + (UINT16)(r1);
4214      UINT32 r3 = (UINT16)ACCUM_M(rsp, i) + (r1 >> 16) + (r2 >> 16);
4182      UINT32 r2 = (UINT16)ACCUM_L(i) + (UINT16)(r1);
4183      UINT32 r3 = (UINT16)ACCUM_M(i) + (r1 >> 16) + (r2 >> 16);
42154184
42164185      SET_ACCUM_L((UINT16)r2, i);
42174186      SET_ACCUM_M((UINT16)r3, i);
4218      SET_ACCUM_H((UINT16)ACCUM_H(rsp, i) + (UINT16)(r3 >> 16), i);
4187      SET_ACCUM_H((UINT16)ACCUM_H(i) + (UINT16)(r3 >> 16), i);
42194188      if ((INT32)(r1) < 0)
42204189      {
4221         SET_ACCUM_H((UINT16)ACCUM_H(rsp, i) - 1, i);
4190         SET_ACCUM_H((UINT16)ACCUM_H(i) - 1, i);
42224191      }
42234192
4224      vres[i] = SATURATE_ACCUM(rsp, i, 1, 0x8000, 0x7fff);
4193      vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
42254194   }
42264195   WRITEBACK_RESULT();
42274196}
4197
4198static void cfunc_rsp_vmadm_scalar(void *param)
4199{
4200   ((rsp_device *)param)->ccfunc_rsp_vmadm_scalar();
4201}
42284202#endif
42294203
42304204#if USE_SIMD
42314205// VMADN
42324206//
42334207
4234INLINE void cfunc_rsp_vmadn_simd(void *param)
4208inline void rsp_device::ccfunc_rsp_vmadn_simd()
42354209{
4236   rsp_state *rsp = (rsp_state*)param;
4237   int op = rsp->impstate->arg0;
4210   int op = m_rsp_state->arg0;
42384211
42394212   INT16 vres[8];
42404213   for (int i = 0; i < 8; i++)
r31833r31834
42454218      INT32 s1 = (UINT16)w1;
42464219      INT32 s2 = (INT32)(INT16)w2;
42474220
4248      UINT64 q = (UINT64)VEC_ACCUM_LL(rsp, i);
4249      q |= (((UINT64)VEC_ACCUM_L(rsp, i)) << 16);
4250      q |= (((UINT64)VEC_ACCUM_M(rsp, i)) << 32);
4251      q |= (((UINT64)VEC_ACCUM_H(rsp, i)) << 48);
4221      UINT64 q = (UINT64)VEC_ACCUM_LL(i);
4222      q |= (((UINT64)VEC_ACCUM_L(i)) << 16);
4223      q |= (((UINT64)VEC_ACCUM_M(i)) << 32);
4224      q |= (((UINT64)VEC_ACCUM_H(i)) << 48);
42524225      q += (INT64)(s1*s2) << 16;
42534226
42544227      VEC_SET_ACCUM_LL((UINT16)q, i);
r31833r31834
42564229      VEC_SET_ACCUM_M((UINT16)(q >> 32), i);
42574230      VEC_SET_ACCUM_H((UINT16)(q >> 48), i);
42584231
4259      vres[i] = VEC_SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
4232      vres[i] = VEC_SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
42604233   }
42614234   VEC_WRITEBACK_RESULT();
42624235}
42634236/*INLINE void cfunc_rsp_vmadn_simd(void *param)
42644237{
42654238    rsp_state *rsp = (rsp_state*)param;
4266    int op = rsp->impstate->arg0;
4239    int op = m_rsp_state->arg0;
42674240
42684241    __m128i vaccLow, vaccHigh, loProduct, hiProduct;
42694242    __m128i vsRegLo, vsRegHi, vtRegLo, vtRegHi, vdRegLo, vdRegHi;
42704243
4271    __m128i vsReg = rsp->xv[VS1REG];
4272    __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4244    __m128i vsReg = m_xv[VS1REG];
4245    __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
42734246
4274    vaccLow = rsp->accum_l;
4247    vaccLow = m_accum_l;
42754248
42764249    RSPZeroExtend16to32(vsReg, &vsRegLo, &vsRegHi);
42774250    RSPSignExtend16to32(vtReg, &vtRegLo, &vtRegHi);
r31833r31834
42914264    vaccLow = _mm_add_epi32(vaccLow, vdRegLo);
42924265    vaccHigh = _mm_add_epi32(vaccHigh, vdRegHi);
42934266
4294    rsp->accum_l = RSPPackLo32to16(vaccLow, vaccHigh);
4267    m_accum_l = RSPPackLo32to16(vaccLow, vaccHigh);
42954268
42964269    // Multiply the MSB of sources, accumulate the product.
4297    vdRegLo = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
4298    vdRegHi = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
4270    vdRegLo = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
4271    vdRegHi = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
42994272
43004273    loProduct = _mm_srai_epi32(loProduct, 16);
43014274    hiProduct = _mm_srai_epi32(hiProduct, 16);
r31833r31834
43084281    vaccHigh = _mm_add_epi32(vdRegHi, vaccHigh);
43094282
43104283    // Clamp the accumulator and write it all out.
4311    rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4312    rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4313    rsp->xv[VDREG] = RSPClampLowToVal(rsp->accum_l, rsp->accum_m, rsp->accum_h);
4284    m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4285    m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4286    m_xv[VDREG] = RSPClampLowToVal(m_accum_l, m_accum_m, m_accum_h);
43144287}*/
43154288
4289static void cfunc_rsp_vmadn_simd(void *param)
4290{
4291   ((rsp_device *)param)->ccfunc_rsp_vmadn_simd();
4292}
43164293#endif
43174294
43184295#if (!USE_SIMD || SIMUL_SIMD)
43194296
4320INLINE void cfunc_rsp_vmadn_scalar(void *param)
4297inline void rsp_device::ccfunc_rsp_vmadn_scalar()
43214298{
4322   rsp_state *rsp = (rsp_state*)param;
4323   int op = rsp->impstate->arg0;
4299   int op = m_rsp_state->arg0;
43244300
43254301   INT16 vres[8];
43264302   for (int i = 0; i < 8; i++)
r31833r31834
43314307      INT32 s1 = (UINT16)w1;
43324308      INT32 s2 = (INT32)(INT16)w2;
43334309
4334      UINT64 q = (UINT64)ACCUM_LL(rsp, i);
4335      q |= (((UINT64)ACCUM_L(rsp, i)) << 16);
4336      q |= (((UINT64)ACCUM_M(rsp, i)) << 32);
4337      q |= (((UINT64)ACCUM_H(rsp, i)) << 48);
4310      UINT64 q = (UINT64)ACCUM_LL(i);
4311      q |= (((UINT64)ACCUM_L(i)) << 16);
4312      q |= (((UINT64)ACCUM_M(i)) << 32);
4313      q |= (((UINT64)ACCUM_H(i)) << 48);
43384314      q += (INT64)(s1*s2) << 16;
43394315
43404316      SET_ACCUM_LL((UINT16)q, i);
r31833r31834
43424318      SET_ACCUM_M((UINT16)(q >> 32), i);
43434319      SET_ACCUM_H((UINT16)(q >> 48), i);
43444320
4345      vres[i] = SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
4321      vres[i] = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
43464322   }
43474323   WRITEBACK_RESULT();
43484324}
4325
4326static void cfunc_rsp_vmadn_scalar(void *param)
4327{
4328   ((rsp_device *)param)->ccfunc_rsp_vmadn_scalar();
4329}
43494330#endif
43504331
43514332#if USE_SIMD
r31833r31834
43604341// The result is added into highest 32 bits of accumulator, the low slice is zero
43614342// The highest 32 bits of accumulator is saturated into destination element
43624343
4363INLINE void cfunc_rsp_vmadh_simd(void *param)
4344inline void rsp_device::ccfunc_rsp_vmadh_simd()
43644345{
4365   rsp_state *rsp = (rsp_state*)param;
4366   int op = rsp->impstate->arg0;
4346   int op = m_rsp_state->arg0;
43674347
4368   __m128i vsReg = rsp->xv[VS1REG];
4369   __m128i vtReg = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4348   __m128i vsReg = m_xv[VS1REG];
4349   __m128i vtReg = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
43704350
43714351   /* Unpack to obtain for 32-bit precision. */
4372   __m128i vaccLow = _mm_unpacklo_epi16(rsp->accum_m, rsp->accum_h);
4373   __m128i vaccHigh = _mm_unpackhi_epi16(rsp->accum_m, rsp->accum_h);
4352   __m128i vaccLow = _mm_unpacklo_epi16(m_accum_m, m_accum_h);
4353   __m128i vaccHigh = _mm_unpackhi_epi16(m_accum_m, m_accum_h);
43744354
43754355   /* Multiply the sources, accumulate the product. */
43764356   __m128i unpackLo = _mm_mullo_epi16(vsReg, vtReg);
r31833r31834
43814361   vaccHigh = _mm_add_epi32(vaccHigh, hiProduct);
43824362
43834363   /* Pack the accumulator and result back up. */
4384   rsp->xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
4385   rsp->accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4386   rsp->accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
4364   m_xv[VDREG] = _mm_packs_epi32(vaccLow, vaccHigh);
4365   m_accum_m = RSPPackLo32to16(vaccLow, vaccHigh);
4366   m_accum_h = RSPPackHi32to16(vaccLow, vaccHigh);
43874367}
43884368
4369static void cfunc_rsp_vmadh_simd(void *param)
4370{
4371   ((rsp_device *)param)->ccfunc_rsp_vmadh_simd();
4372}
43894373#endif
43904374
43914375#if (!USE_SIMD || SIMUL_SIMD)
43924376
4393INLINE void cfunc_rsp_vmadh_scalar(void *param)
4377inline void rsp_device::ccfunc_rsp_vmadh_scalar()
43944378{
4395   rsp_state *rsp = (rsp_state*)param;
4396   int op = rsp->impstate->arg0;
4379   int op = m_rsp_state->arg0;
43974380
43984381   INT16 vres[8];
43994382   for (int i = 0; i < 8; i++)
r31833r31834
44044387      INT32 s1 = (INT32)(INT16)w1;
44054388      INT32 s2 = (INT32)(INT16)w2;
44064389
4407      INT32 accum = (UINT32)(UINT16)ACCUM_M(rsp, i);
4408      accum |= ((UINT32)((UINT16)ACCUM_H(rsp, i))) << 16;
4390      INT32 accum = (UINT32)(UINT16)ACCUM_M(i);
4391      accum |= ((UINT32)((UINT16)ACCUM_H(i))) << 16;
44094392      accum += s1*s2;
44104393
44114394      SET_ACCUM_H((UINT16)(accum >> 16), i);
44124395      SET_ACCUM_M((UINT16)accum, i);
44134396
4414      vres[i] = SATURATE_ACCUM1(rsp, i, 0x8000, 0x7fff);
4397      vres[i] = SATURATE_ACCUM1(i, 0x8000, 0x7fff);
44154398   }
44164399   WRITEBACK_RESULT();
44174400}
4401
4402static void cfunc_rsp_vmadh_scalar(void *param)
4403{
4404   ((rsp_device *)param)->ccfunc_rsp_vmadh_scalar();
4405}
44184406#endif
44194407
44204408#if USE_SIMD
r31833r31834
44264414//
44274415// Adds two vector registers and carry flag, the result is saturated to 32767
44284416
4429INLINE void cfunc_rsp_vadd_simd(void *param)
4417inline void rsp_device::ccfunc_rsp_vadd_simd()
44304418{
4431   rsp_state *rsp = (rsp_state*)param;
4432   int op = rsp->impstate->arg0;
4419   int op = m_rsp_state->arg0;
44334420
4434   __m128i shuffled = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4435   __m128i carry = _mm_and_si128(rsp->xvflag[CARRY], vec_flagmask);
4436   rsp->accum_l = _mm_add_epi16(_mm_add_epi16(rsp->xv[VS1REG], shuffled), carry);
4421   __m128i shuffled = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4422   __m128i carry = _mm_and_si128(m_xvflag[CARRY], vec_flagmask);
4423   m_accum_l = _mm_add_epi16(_mm_add_epi16(m_xv[VS1REG], shuffled), carry);
44374424
4438   __m128i addvec = _mm_adds_epi16(rsp->xv[VS1REG], shuffled);
4425   __m128i addvec = _mm_adds_epi16(m_xv[VS1REG], shuffled);
44394426
44404427   carry = _mm_and_si128(carry, _mm_xor_si128(_mm_cmpeq_epi16(addvec, vec_32767), vec_neg1));
44414428   carry = _mm_and_si128(carry, _mm_xor_si128(_mm_cmpeq_epi16(addvec, vec_n32768), vec_neg1));
44424429
4443   rsp->xv[VDREG] = _mm_add_epi16(addvec, carry);
4430   m_xv[VDREG] = _mm_add_epi16(addvec, carry);
44444431
4445   rsp->xvflag[ZERO] = vec_zero;
4446   rsp->xvflag[CARRY] = vec_zero;
4432   m_xvflag[ZERO] = vec_zero;
4433   m_xvflag[CARRY] = vec_zero;
44474434}
44484435
4436static void cfunc_rsp_vadd_simd(void *param)
4437{
4438   ((rsp_Device *)param)->ccfunc_rsp_vadd_simd();
4439}
44494440#endif
44504441
44514442#if (!USE_SIMD || SIMUL_SIMD)
44524443
4453INLINE void cfunc_rsp_vadd_scalar(void *param)
4444inline void rsp_device::ccfunc_rsp_vadd_scalar()
44544445{
4455   rsp_state *rsp = (rsp_state*)param;
4456   int op = rsp->impstate->arg0;
4446   int op = m_rsp_state->arg0;
44574447
44584448   INT16 vres[8] = { 0 };
44594449   for (int i = 0; i < 8; i++)
r31833r31834
44634453      SCALAR_GET_VS2(w2, i);
44644454      INT32 s1 = (INT32)(INT16)w1;
44654455      INT32 s2 = (INT32)(INT16)w2;
4466      INT32 r = s1 + s2 + (((CARRY_FLAG(rsp, i)) != 0) ? 1 : 0);
4456      INT32 r = s1 + s2 + (((CARRY_FLAG(i)) != 0) ? 1 : 0);
44674457
44684458      SET_ACCUM_L((INT16)(r), i);
44694459
r31833r31834
44754465   CLEAR_CARRY_FLAGS();
44764466   WRITEBACK_RESULT();
44774467}
4468
4469static void cfunc_rsp_vadd_scalar(void *param)
4470{
4471   ((rsp_device *)param)->ccfunc_rsp_vadd_scalar();
4472}
44784473#endif
44794474
44804475#if USE_SIMD
r31833r31834
44884483// Subtracts two vector registers and carry flag, the result is saturated to -32768
44894484// TODO: check VS2REG == VDREG
44904485
4491INLINE void cfunc_rsp_vsub_simd(void *param)
4486inline void rsp_device::ccfunc_rsp_vsub_simd()
44924487{
4493   rsp_state *rsp = (rsp_state*)param;
4494   int op = rsp->impstate->arg0;
4488   int op = m_rsp_state->arg0;
44954489
4496   __m128i shuffled = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4497   __m128i carry = _mm_and_si128(rsp->xvflag[CARRY], vec_flagmask);
4498   __m128i unsat = _mm_sub_epi16(rsp->xv[VS1REG], shuffled);
4490   __m128i shuffled = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4491   __m128i carry = _mm_and_si128(m_xvflag[CARRY], vec_flagmask);
4492   __m128i unsat = _mm_sub_epi16(m_xv[VS1REG], shuffled);
44994493
45004494   __m128i vs2neg = _mm_cmplt_epi16(shuffled, vec_zero);
45014495   __m128i vs2pos = _mm_cmpeq_epi16(vs2neg, vec_zero);
45024496
4503   __m128i saturated = _mm_subs_epi16(rsp->xv[VS1REG], shuffled);
4497   __m128i saturated = _mm_subs_epi16(m_xv[VS1REG], shuffled);
45044498   __m128i carry_mask = _mm_cmpeq_epi16(unsat, saturated);
45054499   carry_mask = _mm_and_si128(vs2neg, carry_mask);
45064500
45074501   vs2neg = _mm_and_si128(carry_mask, carry);
45084502   vs2pos = _mm_and_si128(vs2pos, carry);
45094503   __m128i dest_carry = _mm_or_si128(vs2neg, vs2pos);
4510   rsp->xv[VDREG] = _mm_subs_epi16(saturated, dest_carry);
4504   m_xv[VDREG] = _mm_subs_epi16(saturated, dest_carry);
45114505
4512   rsp->accum_l = _mm_sub_epi16(unsat, carry);
4506   m_accum_l = _mm_sub_epi16(unsat, carry);
45134507
4514   rsp->xvflag[ZERO] = _mm_setzero_si128();
4515   rsp->xvflag[CARRY] = _mm_setzero_si128();
4508   m_xvflag[ZERO] = _mm_setzero_si128();
4509   m_xvflag[CARRY] = _mm_setzero_si128();
45164510}
45174511
4512static void cfunc_rsp_vsub_simd(void *param)
4513{
4514   ((rsp_device *)param)->ccfunc_rsp_vsub_simd();
4515}
45184516#endif
45194517
45204518#if (!USE_SIMD || SIMUL_SIMD)
45214519
4522INLINE void cfunc_rsp_vsub_scalar(void *param)
4520inline void rsp_device::ccfunc_rsp_vsub_scalar()
45234521{
4524   rsp_state *rsp = (rsp_state*)param;
4525   int op = rsp->impstate->arg0;
4522   int op = m_rsp_state->arg0;
45264523
45274524   INT16 vres[8];
45284525   for (int i = 0; i < 8; i++)
r31833r31834
45324529      SCALAR_GET_VS2(w2, i);
45334530      INT32 s1 = (INT32)(INT16)w1;
45344531      INT32 s2 = (INT32)(INT16)w2;
4535      INT32 r = s1 - s2 - (((CARRY_FLAG(rsp, i)) != 0) ? 1 : 0);
4532      INT32 r = s1 - s2 - (((CARRY_FLAG(i)) != 0) ? 1 : 0);
45364533
45374534      SET_ACCUM_L((INT16)(r), i);
45384535
r31833r31834
45454542   CLEAR_CARRY_FLAGS();
45464543   WRITEBACK_RESULT();
45474544}
4545
4546static void cfunc_rsp_vsub_scalar(void *param)
4547{
4548   ((rsp_device *)param)->ccfunc_rsp_vsub_scalar();
4549}
45484550#endif
45494551
45504552#if USE_SIMD
r31833r31834
45574559//
45584560// Changes the sign of source register 2 if source register 1 is negative and stores the result to destination register
45594561
4560INLINE void cfunc_rsp_vabs_simd(void *param)
4562inline void rsp_device::ccfunc_rsp_vabs_simd()
45614563{
4562   rsp_state *rsp = (rsp_state*)param;
4563   int op = rsp->impstate->arg0;
4564   int op = m_rsp_state->arg0;
45644565
4565   __m128i shuf2 = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4566   __m128i shuf2 = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
45664567   __m128i negs2 = _mm_sub_epi16(_mm_setzero_si128(), shuf2);
45674568   __m128i s2_n32768 = _mm_cmpeq_epi16(shuf2, vec_n32768);
4568   __m128i s1_lz = _mm_cmplt_epi16(rsp->xv[VS1REG], _mm_setzero_si128());
4569   __m128i s1_lz = _mm_cmplt_epi16(m_xv[VS1REG], _mm_setzero_si128());
45694570
4570   __m128i result_gz = _mm_and_si128(shuf2, _mm_cmpgt_epi16(rsp->xv[VS1REG], _mm_setzero_si128()));
4571   __m128i result_gz = _mm_and_si128(shuf2, _mm_cmpgt_epi16(m_xv[VS1REG], _mm_setzero_si128()));
45714572   __m128i result_n32768 = _mm_and_si128(s1_lz, _mm_and_si128(vec_32767, s2_n32768));
45724573   __m128i result_negs2 = _mm_and_si128(s1_lz, _mm_and_si128(negs2, _mm_xor_si128(s2_n32768, vec_neg1)));
4573   rsp->xv[VDREG] = rsp->accum_l = _mm_or_si128(result_gz, _mm_or_si128(result_n32768, result_negs2));
4574   m_xv[VDREG] = m_accum_l = _mm_or_si128(result_gz, _mm_or_si128(result_n32768, result_negs2));
45744575}
45754576
4577static void cfunc_rsp_vabs_simd(void *param)
4578{
4579   ((rsp_device *)param)->ccfunc_rsp_vabs_simd();
4580}
45764581#endif
45774582
45784583#if (!USE_SIMD || SIMUL_SIMD)
45794584
4580INLINE void cfunc_rsp_vabs_scalar(void *param)
4585inline void rsp_device::ccfunc_rsp_vabs_scalar()
45814586{
4582   rsp_state *rsp = (rsp_state*)param;
4583   int op = rsp->impstate->arg0;
4587   int op = m_rsp_state->arg0;
45844588
45854589   INT16 vres[8];
45864590   for (int i = 0; i < 8; i++)
r31833r31834
46134617   }
46144618   WRITEBACK_RESULT();
46154619}
4620
4621static void cfunc_rsp_vabs_scalar(void *param)
4622{
4623   ((rsp_device *)param)->ccfunc_rsp_vabs_scalar();
4624}
46164625#endif
46174626
46184627#if USE_SIMD
r31833r31834
46264635// Adds two vector registers, the carry out is stored into carry register
46274636// TODO: check VS2REG = VDREG
46284637
4629INLINE void cfunc_rsp_vaddc_simd(void *param)
4638inline void rsp_device::ccfunc_rsp_vaddc_simd()
46304639{
4631   rsp_state *rsp = (rsp_state*)param;
4632   int op = rsp->impstate->arg0;
4640   int op = m_rsp_state->arg0;
46334641
46344642   VEC_CLEAR_ZERO_FLAGS();
46354643   VEC_CLEAR_CARRY_FLAGS();
46364644
4637   __m128i shuf2 = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4638   __m128i vec7531 = _mm_and_si128(rsp->xv[VS1REG], vec_lomask);
4639   __m128i vec6420 = _mm_srli_epi32(rsp->xv[VS1REG], 16);
4645   __m128i shuf2 = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4646   __m128i vec7531 = _mm_and_si128(m_xv[VS1REG], vec_lomask);
4647   __m128i vec6420 = _mm_srli_epi32(m_xv[VS1REG], 16);
46404648   __m128i shuf7531 = _mm_and_si128(shuf2, vec_lomask);
46414649   __m128i shuf6420 = _mm_srli_epi32(shuf2, 16);
46424650   __m128i sum7531 = _mm_add_epi32(vec7531, shuf7531);
r31833r31834
46484656   sum7531 = _mm_and_si128(sum7531, vec_lomask);
46494657   sum6420 = _mm_and_si128(sum6420, vec_lomask);
46504658
4651   rsp->xvflag[CARRY] = _mm_or_si128(over6420, _mm_srli_epi32(over7531, 16));
4652   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(_mm_slli_epi32(sum6420, 16), sum7531);
4659   m_xvflag[CARRY] = _mm_or_si128(over6420, _mm_srli_epi32(over7531, 16));
4660   m_accum_l = m_xv[VDREG] = _mm_or_si128(_mm_slli_epi32(sum6420, 16), sum7531);
46534661}
46544662
4663static void cfunc_rsp_vaddc_simd(void *param)
4664{
4665   ((rsp_device *)param)->ccfunc_rsp_vaddc_simd();
4666}
46554667#endif
46564668
46574669#if (!USE_SIMD || SIMUL_SIMD)
46584670
4659INLINE void cfunc_rsp_vaddc_scalar(void *param)
4671inline void rsp_device::ccfunc_rsp_vaddc_scalar()
46604672{
4661   rsp_state *rsp = (rsp_state*)param;
4662   int op = rsp->impstate->arg0;
4673   int op = m_rsp_state->arg0;
46634674
46644675   CLEAR_ZERO_FLAGS();
46654676   CLEAR_CARRY_FLAGS();
r31833r31834
46844695   }
46854696   WRITEBACK_RESULT();
46864697}
4698
4699static void cfunc_rsp_vaddc_scalar(void *param)
4700{
4701   ((rsp_device *)param)->ccfunc_rsp_vaddc_scalar();
4702}
46874703#endif
46884704
46894705#if USE_SIMD
r31833r31834
46974713// Subtracts two vector registers, the carry out is stored into carry register
46984714// TODO: check VS2REG = VDREG
46994715
4700INLINE void cfunc_rsp_vsubc_simd(void *param)
4716inline void rsp_device::ccfunc_rsp_vsubc_simd()
47014717{
4702   rsp_state *rsp = (rsp_state*)param;
4703   int op = rsp->impstate->arg0;
4718   int op = m_rsp_state->arg0;
47044719
47054720   VEC_CLEAR_ZERO_FLAGS();
47064721   VEC_CLEAR_CARRY_FLAGS();
47074722
4708   __m128i shuf2 = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4709   __m128i vec7531 = _mm_and_si128(rsp->xv[VS1REG], vec_lomask);
4710   __m128i vec6420 = _mm_srli_epi32(rsp->xv[VS1REG], 16);
4723   __m128i shuf2 = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4724   __m128i vec7531 = _mm_and_si128(m_xv[VS1REG], vec_lomask);
4725   __m128i vec6420 = _mm_srli_epi32(m_xv[VS1REG], 16);
47114726   __m128i shuf7531 = _mm_and_si128(shuf2, vec_lomask);
47124727   __m128i shuf6420 = _mm_srli_epi32(shuf2, 16);
47134728   __m128i sum7531 = _mm_sub_epi32(vec7531, shuf7531);
r31833r31834
47204735   __m128i zero7531 = _mm_and_si128(_mm_xor_si128(_mm_cmpeq_epi16(sum7531, _mm_setzero_si128()), vec_neg1), vec_lomask);
47214736   __m128i zero6420 = _mm_and_si128(_mm_xor_si128(_mm_cmpeq_epi16(sum6420, _mm_setzero_si128()), vec_neg1), vec_lomask);
47224737
4723   rsp->xvflag[CARRY] = _mm_or_si128(over6420, _mm_srli_epi32(over7531, 16));
4724   rsp->xvflag[ZERO] = _mm_or_si128(_mm_slli_epi32(zero6420, 16), zero7531);
4738   m_xvflag[CARRY] = _mm_or_si128(over6420, _mm_srli_epi32(over7531, 16));
4739   m_xvflag[ZERO] = _mm_or_si128(_mm_slli_epi32(zero6420, 16), zero7531);
47254740
4726   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(_mm_slli_epi32(sum6420, 16), sum7531);
4741   m_accum_l = m_xv[VDREG] = _mm_or_si128(_mm_slli_epi32(sum6420, 16), sum7531);
47274742}
47284743
4744static void cfunc_rsp_vsubc_simd(void *param)
4745{
4746   ((rsp_device *)param)->ccfunc_rsp_vsubc_simd();
4747}
47294748#endif
47304749
47314750#if (!USE_SIMD || SIMUL_SIMD)
47324751
4733INLINE void cfunc_rsp_vsubc_scalar(void *param)
4752inline void rsp_device::ccfunc_rsp_vsubc_scalar()
47344753{
4735   rsp_state *rsp = (rsp_state*)param;
4736   int op = rsp->impstate->arg0;
4754   int op = m_rsp_state->arg0;
47374755
47384756
47394757   CLEAR_ZERO_FLAGS();
r31833r31834
47634781   }
47644782   WRITEBACK_RESULT();
47654783}
4784
4785static void cfunc_rsp_vsubc_scalar(void *param)
4786{
4787   ((rsp_device *)param)->ccfunc_rsp_vsubc_scalar();
4788}
47664789#endif
47674790
47684791#if USE_SIMD
r31833r31834
47754798//
47764799// Stores high, middle or low slice of accumulator to destination vector
47774800
4778INLINE void cfunc_rsp_vsaw_simd(void *param)
4801inline void rsp_device::ccfunc_rsp_vsaw_simd()
47794802{
4780   rsp_state *rsp = (rsp_state*)param;
4781   int op = rsp->impstate->arg0;
4803   int op = m_rsp_state->arg0;
47824804
47834805   switch (EL)
47844806   {
47854807      case 0x08:      // VSAWH
47864808      {
4787         rsp->xv[VDREG] = rsp->accum_h;
4809         m_xv[VDREG] = m_accum_h;
47884810         break;
47894811      }
47904812      case 0x09:      // VSAWM
47914813      {
4792         rsp->xv[VDREG] = rsp->accum_m;
4814         m_xv[VDREG] = m_accum_m;
47934815         break;
47944816      }
47954817      case 0x0a:      // VSAWL
47964818      {
4797         rsp->xv[VDREG] = rsp->accum_l;
4819         m_xv[VDREG] = m_accum_l;
47984820         break;
47994821      }
48004822      default:    fatalerror("RSP: VSAW: el = %d\n", EL);
48014823   }
48024824}
48034825
4826static void cfunc_rsp_vsaw_simd(void *param)
4827{
4828   ((rsp_device *)param)->ccfunc_rsp_vsaw_simd();
4829}
48044830#endif
48054831
48064832#if (!USE_SIMD || SIMUL_SIMD)
48074833
4808INLINE void cfunc_rsp_vsaw_scalar(void *param)
4834inline void rsp_device::ccfunc_rsp_vsaw_scalar()
48094835{
4810   rsp_state *rsp = (rsp_state*)param;
4811   int op = rsp->impstate->arg0;
4836   int op = m_rsp_state->arg0;
48124837
48134838   switch (EL)
48144839   {
r31833r31834
48164841      {
48174842         for (int i = 0; i < 8; i++)
48184843         {
4819            W_VREG_S(VDREG, i) = ACCUM_H(rsp, i);
4844            W_VREG_S(VDREG, i) = ACCUM_H(i);
48204845         }
48214846         break;
48224847      }
r31833r31834
48244849      {
48254850         for (int i = 0; i < 8; i++)
48264851         {
4827            W_VREG_S(VDREG, i) = ACCUM_M(rsp, i);
4852            W_VREG_S(VDREG, i) = ACCUM_M(i);
48284853         }
48294854         break;
48304855      }
r31833r31834
48324857      {
48334858         for (int i = 0; i < 8; i++)
48344859         {
4835            W_VREG_S(VDREG, i) = ACCUM_L(rsp, i);
4860            W_VREG_S(VDREG, i) = ACCUM_L(i);
48364861         }
48374862         break;
48384863      }
48394864      default:    fatalerror("RSP: VSAW: el = %d\n", EL);
48404865   }
48414866}
4867
4868static void cfunc_rsp_vsaw_scalar(void *param)
4869{
4870   ((rsp_device *)param)->ccfunc_rsp_vsaw_scalar();
4871}
48424872#endif
48434873
48444874#if USE_SIMD
r31833r31834
48524882// Sets compare flags if elements in VS1 are less than VS2
48534883// Moves the element in VS2 to destination vector
48544884
4855INLINE void cfunc_rsp_vlt_simd(void *param)
4885inline void rsp_device::ccfunc_rsp_vlt_simd()
48564886{
4857   rsp_state *rsp = (rsp_state*)param;
4858   int op = rsp->impstate->arg0;
4887   int op = m_rsp_state->arg0;
48594888
4860   rsp->xvflag[COMPARE] = rsp->xvflag[CLIP2] = _mm_setzero_si128();
4889   m_xvflag[COMPARE] = m_xvflag[CLIP2] = _mm_setzero_si128();
48614890
4862   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4863   __m128i zc_mask = _mm_and_si128(rsp->xvflag[ZERO], rsp->xvflag[CARRY]);
4864   __m128i lt_mask = _mm_cmplt_epi16(rsp->xv[VS1REG], shuf);
4865   __m128i eq_mask = _mm_and_si128(_mm_cmpeq_epi16(rsp->xv[VS1REG], shuf), zc_mask);
4891   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4892   __m128i zc_mask = _mm_and_si128(m_xvflag[ZERO], m_xvflag[CARRY]);
4893   __m128i lt_mask = _mm_cmplt_epi16(m_xv[VS1REG], shuf);
4894   __m128i eq_mask = _mm_and_si128(_mm_cmpeq_epi16(m_xv[VS1REG], shuf), zc_mask);
48664895
4867   rsp->xvflag[COMPARE] = _mm_or_si128(lt_mask, eq_mask);
4896   m_xvflag[COMPARE] = _mm_or_si128(lt_mask, eq_mask);
48684897
4869   __m128i result = _mm_and_si128(rsp->xv[VS1REG], rsp->xvflag[COMPARE]);
4870   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(rsp->xvflag[COMPARE], vec_neg1)));
4898   __m128i result = _mm_and_si128(m_xv[VS1REG], m_xvflag[COMPARE]);
4899   m_accum_l = m_xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(m_xvflag[COMPARE], vec_neg1)));
48714900
4872   rsp->xvflag[ZERO] = rsp->xvflag[CARRY] = _mm_setzero_si128();
4901   m_xvflag[ZERO] = m_xvflag[CARRY] = _mm_setzero_si128();
48734902}
48744903
4904static void void cfunc_rsp_vlt_simd(void *param)
4905{
4906   ((rsp_device *)param)->ccfunc_rsp_vlt_simd();
4907}
48754908#endif
48764909
48774910#if (!USE_SIMD || SIMUL_SIMD)
48784911
4879INLINE void cfunc_rsp_vlt_scalar(void *param)
4912inline void rsp_device::ccfunc_rsp_vlt_scalar()
48804913{
4881   rsp_state *rsp = (rsp_state*)param;
4882   int op = rsp->impstate->arg0;
4914   int op = m_rsp_state->arg0;
48834915
48844916   CLEAR_COMPARE_FLAGS();
48854917   CLEAR_CLIP2_FLAGS();
r31833r31834
48974929      }
48984930      else if (s1 == s2)
48994931      {
4900         if (ZERO_FLAG(rsp, i) != 0 && CARRY_FLAG(rsp, i) != 0)
4932         if (ZERO_FLAG(i) != 0 && CARRY_FLAG(i) != 0)
49014933         {
49024934            SET_COMPARE_FLAG(i);
49034935         }
49044936      }
49054937
4906      if (COMPARE_FLAG(rsp, i) != 0)
4938      if (COMPARE_FLAG(i) != 0)
49074939      {
49084940         vres[i] = s1;
49094941      }
r31833r31834
49194951   CLEAR_CARRY_FLAGS();
49204952   WRITEBACK_RESULT();
49214953}
4954
4955static void cfunc_rsp_vlt_scalar(void *param)
4956{
4957   ((rsp_device *)param)->ccfunc_rsp_vlt_scalar();
4958}
49224959#endif
49234960
49244961#if USE_SIMD
r31833r31834
49324969// Sets compare flags if elements in VS1 are equal with VS2
49334970// Moves the element in VS2 to destination vector
49344971
4935INLINE void cfunc_rsp_veq_simd(void *param)
4972inline void rsp_device::ccfunc_rsp_veq_simd()
49364973{
4937   rsp_state *rsp = (rsp_state*)param;
4938   int op = rsp->impstate->arg0;
4974   int op = m_rsp_state->arg0;
49394975
4940   rsp->xvflag[COMPARE] = rsp->xvflag[CLIP2] = _mm_setzero_si128();
4976   m_xvflag[COMPARE] = m_xvflag[CLIP2] = _mm_setzero_si128();
49414977
4942   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
4943   __m128i zero_mask = _mm_cmpeq_epi16(rsp->xvflag[ZERO], _mm_setzero_si128());
4944   __m128i eq_mask = _mm_cmpeq_epi16(rsp->xv[VS1REG], shuf);
4978   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
4979   __m128i zero_mask = _mm_cmpeq_epi16(m_xvflag[ZERO], _mm_setzero_si128());
4980   __m128i eq_mask = _mm_cmpeq_epi16(m_xv[VS1REG], shuf);
49454981
4946   rsp->xvflag[COMPARE] = _mm_and_si128(zero_mask, eq_mask);
4982   m_xvflag[COMPARE] = _mm_and_si128(zero_mask, eq_mask);
49474983
4948   __m128i result = _mm_and_si128(rsp->xv[VS1REG], rsp->xvflag[COMPARE]);
4949   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(rsp->xvflag[COMPARE], vec_neg1)));
4984   __m128i result = _mm_and_si128(m_xv[VS1REG], m_xvflag[COMPARE]);
4985   m_accum_l = m_xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(m_xvflag[COMPARE], vec_neg1)));
49504986
4951   rsp->xvflag[ZERO] = rsp->xvflag[CARRY] = _mm_setzero_si128();
4987   m_xvflag[ZERO] = m_xvflag[CARRY] = _mm_setzero_si128();
49524988}
49534989
4990static void cfunc_rsp_veq_simd(void *param)
4991{
4992   ((rsp_device *)param)->ccfunc_rsp_veq_simd();
4993}
49544994#endif
49554995
49564996#if (!USE_SIMD || SIMUL_SIMD)
49574997
4958INLINE void cfunc_rsp_veq_scalar(void *param)
4998inline void rsp_device::ccfunc_rsp_veq_scalar()
49594999{
4960   rsp_state *rsp = (rsp_state*)param;
4961   int op = rsp->impstate->arg0;
5000   int op = m_rsp_state->arg0;
49625001
49635002   CLEAR_COMPARE_FLAGS();
49645003   CLEAR_CLIP2_FLAGS();
r31833r31834
49705009      SCALAR_GET_VS1(s1, i);
49715010      SCALAR_GET_VS2(s2, i);
49725011
4973      if ((s1 == s2) && ZERO_FLAG(rsp, i) == 0)
5012      if ((s1 == s2) && ZERO_FLAG(i) == 0)
49745013      {
49755014         SET_COMPARE_FLAG(i);
49765015         vres[i] = s1;
r31833r31834
49875026   CLEAR_CARRY_FLAGS();
49885027   WRITEBACK_RESULT();
49895028}
5029
5030static void cfunc_rsp_veq_scalar(void *param)
5031{
5032   ((rsp_device *)param)->ccfunc_rsp_veq_scalar();
5033}
49905034#endif
49915035
49925036#if USE_SIMD
r31833r31834
50005044// Sets compare flags if elements in VS1 are not equal with VS2
50015045// Moves the element in VS2 to destination vector
50025046
5003INLINE void cfunc_rsp_vne_simd(void *param)
5047inline void rsp_device::ccfunc_rsp_vne_simd()
50045048{
5005   rsp_state *rsp = (rsp_state*)param;
5006   int op = rsp->impstate->arg0;
5049   int op = m_rsp_state->arg0;
50075050
5008   rsp->xvflag[COMPARE] = rsp->xvflag[CLIP2] = _mm_setzero_si128();
5051   m_xvflag[COMPARE] = m_xvflag[CLIP2] = _mm_setzero_si128();
50095052
5010   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5011   __m128i neq_mask = _mm_xor_si128(_mm_cmpeq_epi16(rsp->xv[VS1REG], shuf), vec_neg1);
5053   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5054   __m128i neq_mask = _mm_xor_si128(_mm_cmpeq_epi16(m_xv[VS1REG], shuf), vec_neg1);
50125055
5013   rsp->xvflag[COMPARE] = _mm_or_si128(rsp->xvflag[ZERO], neq_mask);
5056   m_xvflag[COMPARE] = _mm_or_si128(m_xvflag[ZERO], neq_mask);
50145057
5015   __m128i result = _mm_and_si128(rsp->xv[VS1REG], rsp->xvflag[COMPARE]);
5016   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(rsp->xvflag[COMPARE], vec_neg1)));
5058   __m128i result = _mm_and_si128(m_xv[VS1REG], m_xvflag[COMPARE]);
5059   m_accum_l = m_xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(m_xvflag[COMPARE], vec_neg1)));
50175060
5018   rsp->xvflag[ZERO] = rsp->xvflag[CARRY] = _mm_setzero_si128();
5061   m_xvflag[ZERO] = m_xvflag[CARRY] = _mm_setzero_si128();
50195062}
50205063
5064static void cfunc_rsp_vne_simd(void *param)
5065{
5066   ((rsp_device *)param)->ccfunc_rsp_vne_simd();
5067}
50215068#endif
50225069
50235070#if (!USE_SIMD || SIMUL_SIMD)
50245071
5025INLINE void cfunc_rsp_vne_scalar(void *param)
5072inline void rsp_device::ccfunc_rsp_vne_scalar()
50265073{
5027   rsp_state *rsp = (rsp_state*)param;
5028   int op = rsp->impstate->arg0;
5074   int op = m_rsp_state->arg0;
50295075
50305076   CLEAR_COMPARE_FLAGS();
50315077   CLEAR_CLIP2_FLAGS();
r31833r31834
50375083      SCALAR_GET_VS1(s1, i);
50385084      SCALAR_GET_VS2(s2, i);
50395085
5040      if (s1 != s2 || ZERO_FLAG(rsp, i) != 0)
5086      if (s1 != s2 || ZERO_FLAG(i) != 0)
50415087      {
50425088         SET_COMPARE_FLAG(i);
50435089         vres[i] = s1;
r31833r31834
50545100   CLEAR_CARRY_FLAGS();
50555101   WRITEBACK_RESULT();
50565102}
5103
5104static void cfunc_rsp_vne_scalar(void *param)
5105{
5106   ((rsp_device *)param)->ccfunc_rsp_vne_scalar();
5107}
50575108#endif
50585109
50595110#if USE_SIMD
r31833r31834
50675118// Sets compare flags if elements in VS1 are greater or equal with VS2
50685119// Moves the element in VS2 to destination vector
50695120
5070INLINE void cfunc_rsp_vge_simd(void *param)
5121inline void rsp_device::ccfunc_rsp_vge_simd()
50715122{
5072   rsp_state *rsp = (rsp_state*)param;
5073   int op = rsp->impstate->arg0;
5123   int op = m_rsp_state->arg0;
50745124
5075   rsp->xvflag[COMPARE] = rsp->xvflag[CLIP2] = _mm_setzero_si128();
5125   m_xvflag[COMPARE] = m_xvflag[CLIP2] = _mm_setzero_si128();
50765126
5077   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5078   __m128i zero_mask = _mm_cmpeq_epi16(rsp->xvflag[ZERO], _mm_setzero_si128());
5079   __m128i carry_mask = _mm_cmpeq_epi16(rsp->xvflag[CARRY], _mm_setzero_si128());
5127   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5128   __m128i zero_mask = _mm_cmpeq_epi16(m_xvflag[ZERO], _mm_setzero_si128());
5129   __m128i carry_mask = _mm_cmpeq_epi16(m_xvflag[CARRY], _mm_setzero_si128());
50805130   __m128i flag_mask = _mm_or_si128(zero_mask, carry_mask);
5081   __m128i eq_mask = _mm_and_si128(_mm_cmpeq_epi16(rsp->xv[VS1REG], shuf), flag_mask);
5082   __m128i gt_mask = _mm_cmpgt_epi16(rsp->xv[VS1REG], shuf);
5083   rsp->xvflag[COMPARE] = _mm_or_si128(eq_mask, gt_mask);
5131   __m128i eq_mask = _mm_and_si128(_mm_cmpeq_epi16(m_xv[VS1REG], shuf), flag_mask);
5132   __m128i gt_mask = _mm_cmpgt_epi16(m_xv[VS1REG], shuf);
5133   m_xvflag[COMPARE] = _mm_or_si128(eq_mask, gt_mask);
50845134
5085   __m128i result = _mm_and_si128(rsp->xv[VS1REG], rsp->xvflag[COMPARE]);
5086   rsp->accum_l = rsp->xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(rsp->xvflag[COMPARE], vec_neg1)));
5135   __m128i result = _mm_and_si128(m_xv[VS1REG], m_xvflag[COMPARE]);
5136   m_accum_l = m_xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, _mm_xor_si128(m_xvflag[COMPARE], vec_neg1)));
50875137
5088   rsp->xvflag[ZERO] = rsp->xvflag[CARRY] = _mm_setzero_si128();
5138   m_xvflag[ZERO] = m_xvflag[CARRY] = _mm_setzero_si128();
50895139}
50905140
5141static void cfunc_rsp_vge_simd(void *param)
5142{
5143   ((rsp_device *)param)->ccfunc_rsp_vge_simd();
5144}
50915145#endif
50925146
50935147#if (!USE_SIMD || SIMUL_SIMD)
50945148
5095INLINE void cfunc_rsp_vge_scalar(void *param)
5149inline void rsp_device::ccfunc_rsp_vge_scalar()
50965150{
5097   rsp_state *rsp = (rsp_state*)param;
5098   int op = rsp->impstate->arg0;
5151   int op = m_rsp_state->arg0;
50995152
51005153   CLEAR_COMPARE_FLAGS();
51015154   CLEAR_CLIP2_FLAGS();
r31833r31834
51065159      INT16 s1, s2;
51075160      SCALAR_GET_VS1(s1, i);
51085161      SCALAR_GET_VS2(s2, i);
5109      if ((s1 == s2 && (ZERO_FLAG(rsp, i) == 0 || CARRY_FLAG(rsp, i) == 0)) || s1 > s2)
5162      if ((s1 == s2 && (ZERO_FLAG(i) == 0 || CARRY_FLAG(i) == 0)) || s1 > s2)
51105163      {
51115164         SET_COMPARE_FLAG(i);
51125165         vres[i] = s1;
r31833r31834
51235176   CLEAR_CARRY_FLAGS();
51245177   WRITEBACK_RESULT();
51255178}
5179
5180static void cfunc_rsp_vge_scalar(void *param)
5181{
5182   ((rsp_device *)param)->ccfunc_rsp_vge_scalar();
5183}
51265184#endif
51275185
51285186#if USE_SIMD
r31833r31834
51355193//
51365194// Vector clip low
51375195
5138INLINE void cfunc_rsp_vcl_simd(void *param)
5196inline void rsp_device::ccfunc_rsp_vcl_simd()
51395197{
5140   rsp_state *rsp = (rsp_state*)param;
5141   int op = rsp->impstate->arg0;
5198   int op = m_rsp_state->arg0;
51425199   INT16 vres[8];
51435200
51445201   for (int i = 0; i < 8; i++)
r31833r31834
51475204      VEC_GET_SCALAR_VS1(s1, i);
51485205      VEC_GET_SCALAR_VS2(s2, i);
51495206
5150      if (VEC_CARRY_FLAG(rsp, i) != 0)
5207      if (VEC_CARRY_FLAG(i) != 0)
51515208      {
5152         if (VEC_ZERO_FLAG(rsp, i) != 0)
5209         if (VEC_ZERO_FLAG(i) != 0)
51535210         {
5154            if (VEC_COMPARE_FLAG(rsp, i) != 0)
5211            if (VEC_COMPARE_FLAG(i) != 0)
51555212            {
51565213               VEC_SET_ACCUM_L(-(UINT16)s2, i);
51575214            }
r31833r31834
51605217               VEC_SET_ACCUM_L(s1, i);
51615218            }
51625219         }
5163         else//VEC_ZERO_FLAG(rsp, i)==0
5220         else//VEC_ZERO_FLAG(i)==0
51645221         {
5165            if (VEC_CLIP1_FLAG(rsp, i) != 0)
5222            if (VEC_CLIP1_FLAG(i) != 0)
51665223            {
51675224               if (((UINT32)(UINT16)(s1) + (UINT32)(UINT16)(s2)) > 0x10000)
51685225               {//proper fix for Harvest Moon 64, r4
r31833r31834
51905247            }
51915248         }
51925249      }
5193      else//VEC_CARRY_FLAG(rsp, i)==0
5250      else//VEC_CARRY_FLAG(i)==0
51945251      {
5195         if (VEC_ZERO_FLAG(rsp, i) != 0)
5252         if (VEC_ZERO_FLAG(i) != 0)
51965253         {
5197            if (VEC_CLIP2_FLAG(rsp, i) != 0)
5254            if (VEC_CLIP2_FLAG(i) != 0)
51985255            {
51995256               VEC_SET_ACCUM_L(s2, i);
52005257            }
r31833r31834
52175274            }
52185275         }
52195276      }
5220      vres[i] = VEC_ACCUM_L(rsp, i);
5277      vres[i] = VEC_ACCUM_L(i);
52215278   }
52225279   VEC_CLEAR_ZERO_FLAGS();
52235280   VEC_CLEAR_CARRY_FLAGS();
r31833r31834
52255282   VEC_WRITEBACK_RESULT();
52265283}
52275284
5285static void cfunc_rsp_vcl_simd(void *param)
5286{
5287   ((rsp_device *)param)->ccfunc_rsp_vcl_simd();
5288}
52285289#endif
52295290
52305291#if (!USE_SIMD || SIMUL_SIMD)
52315292
5232INLINE void cfunc_rsp_vcl_scalar(void *param)
5293inline void rsp_device::ccfunc_rsp_vcl_scalar()
52335294{
5234   rsp_state *rsp = (rsp_state*)param;
5235   int op = rsp->impstate->arg0;
5295   int op = m_rsp_state->arg0;
52365296   INT16 vres[8];
52375297
52385298   for (int i = 0; i < 8; i++)
r31833r31834
52415301      SCALAR_GET_VS1(s1, i);
52425302      SCALAR_GET_VS2(s2, i);
52435303
5244      if (CARRY_FLAG(rsp, i) != 0)
5304      if (CARRY_FLAG(i) != 0)
52455305      {
5246         if (ZERO_FLAG(rsp, i) != 0)
5306         if (ZERO_FLAG(i) != 0)
52475307         {
5248            if (COMPARE_FLAG(rsp, i) != 0)
5308            if (COMPARE_FLAG(i) != 0)
52495309            {
52505310               SET_ACCUM_L(-(UINT16)s2, i);
52515311            }
r31833r31834
52545314               SET_ACCUM_L(s1, i);
52555315            }
52565316         }
5257         else//ZERO_FLAG(rsp, i)==0
5317         else//ZERO_FLAG(i)==0
52585318         {
5259            if (CLIP1_FLAG(rsp, i) != 0)
5319            if (CLIP1_FLAG(i) != 0)
52605320            {
52615321               if (((UINT32)(UINT16)(s1) + (UINT32)(UINT16)(s2)) > 0x10000)
52625322               {//proper fix for Harvest Moon 64, r4
r31833r31834
52845344            }
52855345         }
52865346      }
5287      else//CARRY_FLAG(rsp, i)==0
5347      else//CARRY_FLAG(i)==0
52885348      {
5289         if (ZERO_FLAG(rsp, i) != 0)
5349         if (ZERO_FLAG(i) != 0)
52905350         {
5291            if (CLIP2_FLAG(rsp, i) != 0)
5351            if (CLIP2_FLAG(i) != 0)
52925352            {
52935353               SET_ACCUM_L(s2, i);
52945354            }
r31833r31834
53115371            }
53125372         }
53135373      }
5314      vres[i] = ACCUM_L(rsp, i);
5374      vres[i] = ACCUM_L(i);
53155375   }
53165376   CLEAR_ZERO_FLAGS();
53175377   CLEAR_CARRY_FLAGS();
53185378   CLEAR_CLIP1_FLAGS();
53195379   WRITEBACK_RESULT();
53205380}
5381
5382static void cfunc_rsp_vcl_scalar(void *param)
5383{
5384   ((rsp_device *)param)->ccfunc_rsp_vcl_scalar();
5385}
53215386#endif
53225387
53235388#if USE_SIMD
r31833r31834
53305395//
53315396// Vector clip high
53325397
5333INLINE void cfunc_rsp_vch_simd(void *param)
5398inline void rsp_device::ccfunc_rsp_vch_simd()
53345399{
5335   rsp_state *rsp = (rsp_state*)param;
5336   int op = rsp->impstate->arg0;
5400   int op = m_rsp_state->arg0;
53375401
53385402   VEC_CLEAR_CARRY_FLAGS();
53395403   VEC_CLEAR_COMPARE_FLAGS();
r31833r31834
53645428   // accum set to s1 if (s1 ^ s2) < 0 && (s1 + s2) > 0)
53655429   // accum set to s1 if (s1 ^ s2) >= 0 && (s1 - s2) < 0
53665430
5367   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5368   __m128i s1_xor_s2 = _mm_xor_si128(rsp->xv[VS1REG], shuf);
5369   __m128i s1_plus_s2 = _mm_add_epi16(rsp->xv[VS1REG], shuf);
5370   __m128i s1_sub_s2 = _mm_sub_epi16(rsp->xv[VS1REG], shuf);
5431   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5432   __m128i s1_xor_s2 = _mm_xor_si128(m_xv[VS1REG], shuf);
5433   __m128i s1_plus_s2 = _mm_add_epi16(m_xv[VS1REG], shuf);
5434   __m128i s1_sub_s2 = _mm_sub_epi16(m_xv[VS1REG], shuf);
53715435   __m128i s2_neg = _mm_xor_si128(shuf, vec_neg1);
53725436
53735437   __m128i s2_lz = _mm_cmplt_epi16(shuf, _mm_setzero_si128());
r31833r31834
53805444   __m128i s1s2_sub_nz = _mm_xor_si128(_mm_cmpeq_epi16(s1_sub_s2, _mm_setzero_si128()), vec_neg1);
53815445   __m128i s1s2_sub_lz = _mm_cmplt_epi16(s1_sub_s2, _mm_setzero_si128());
53825446   __m128i s1s2_sub_gez = _mm_xor_si128(s1s2_sub_lz, vec_neg1);
5383   __m128i s1_nens2 = _mm_xor_si128(_mm_cmpeq_epi16(rsp->xv[VS1REG], s2_neg), vec_neg1);
5447   __m128i s1_nens2 = _mm_xor_si128(_mm_cmpeq_epi16(m_xv[VS1REG], s2_neg), vec_neg1);
53845448
53855449   __m128i ext_mask = _mm_and_si128(_mm_and_si128(s1s2_xor_lz, s1s2_plus_n1), vec_flagmask);
5386   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 0) << 0;
5387   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 1) << 1;
5388   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 2) << 2;
5389   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 3) << 3;
5390   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 4) << 4;
5391   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 5) << 5;
5392   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 6) << 6;
5393   rsp->flag[2] |= _mm_extract_epi16(ext_mask, 7) << 7;
5450   m_flag[2] |= _mm_extract_epi16(ext_mask, 0) << 0;
5451   m_flag[2] |= _mm_extract_epi16(ext_mask, 1) << 1;
5452   m_flag[2] |= _mm_extract_epi16(ext_mask, 2) << 2;
5453   m_flag[2] |= _mm_extract_epi16(ext_mask, 3) << 3;
5454   m_flag[2] |= _mm_extract_epi16(ext_mask, 4) << 4;
5455   m_flag[2] |= _mm_extract_epi16(ext_mask, 5) << 5;
5456   m_flag[2] |= _mm_extract_epi16(ext_mask, 6) << 6;
5457   m_flag[2] |= _mm_extract_epi16(ext_mask, 7) << 7;
53945458
53955459   __m128i carry_mask = _mm_and_si128(s1s2_xor_lz, vec_flagmask);
5396   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 0) << 0;
5397   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 1) << 1;
5398   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 2) << 2;
5399   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 3) << 3;
5400   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 4) << 4;
5401   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 5) << 5;
5402   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 6) << 6;
5403   rsp->flag[0] |= _mm_extract_epi16(carry_mask, 7) << 7;
5460   m_flag[0] |= _mm_extract_epi16(carry_mask, 0) << 0;
5461   m_flag[0] |= _mm_extract_epi16(carry_mask, 1) << 1;
5462   m_flag[0] |= _mm_extract_epi16(carry_mask, 2) << 2;
5463   m_flag[0] |= _mm_extract_epi16(carry_mask, 3) << 3;
5464   m_flag[0] |= _mm_extract_epi16(carry_mask, 4) << 4;
5465   m_flag[0] |= _mm_extract_epi16(carry_mask, 5) << 5;
5466   m_flag[0] |= _mm_extract_epi16(carry_mask, 6) << 6;
5467   m_flag[0] |= _mm_extract_epi16(carry_mask, 7) << 7;
54045468
54055469   __m128i z0_mask = _mm_and_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_nz), s1_nens2);
54065470   __m128i z1_mask = _mm_and_si128(_mm_and_si128(s1s2_xor_lz, s1s2_plus_nz), s1_nens2);
r31833r31834
54095473   z_mask = _mm_and_si128(_mm_or_si128(z_mask, _mm_srli_epi64(z_mask, 30)), vec_shiftmask4);
54105474   z_mask = _mm_or_si128(z_mask, _mm_srli_si128(z_mask, 7));
54115475   z_mask = _mm_or_si128(z_mask, _mm_srli_epi16(z_mask, 4));
5412   rsp->flag[0] |= (_mm_extract_epi16(z_mask, 0) << 8) & 0x00ff00;
5476   m_flag[0] |= (_mm_extract_epi16(z_mask, 0) << 8) & 0x00ff00;
54135477
54145478   __m128i f0_mask = _mm_and_si128(_mm_or_si128(_mm_and_si128(s1s2_xor_gez, s2_lz),         _mm_and_si128(s1s2_xor_lz, s1s2_plus_lez)), vec_flagmask);
54155479   __m128i f8_mask = _mm_and_si128(_mm_or_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_gez),  _mm_and_si128(s1s2_xor_lz, s2_lz)), vec_flagmask);
54165480   f0_mask = _mm_and_si128(f0_mask, vec_flagmask);
54175481   f8_mask = _mm_and_si128(f8_mask, vec_flagmask);
5418   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 0) << 0;
5419   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 1) << 1;
5420   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 2) << 2;
5421   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 3) << 3;
5422   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 4) << 4;
5423   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 5) << 5;
5424   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 6) << 6;
5425   rsp->flag[1] |= _mm_extract_epi16(f0_mask, 7) << 7;
5482   m_flag[1] |= _mm_extract_epi16(f0_mask, 0) << 0;
5483   m_flag[1] |= _mm_extract_epi16(f0_mask, 1) << 1;
5484   m_flag[1] |= _mm_extract_epi16(f0_mask, 2) << 2;
5485   m_flag[1] |= _mm_extract_epi16(f0_mask, 3) << 3;
5486   m_flag[1] |= _mm_extract_epi16(f0_mask, 4) << 4;
5487   m_flag[1] |= _mm_extract_epi16(f0_mask, 5) << 5;
5488   m_flag[1] |= _mm_extract_epi16(f0_mask, 6) << 6;
5489   m_flag[1] |= _mm_extract_epi16(f0_mask, 7) << 7;
54265490
5427   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 0) << 8;
5428   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 1) << 9;
5429   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 2) << 10;
5430   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 3) << 11;
5431   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 4) << 12;
5432   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 5) << 13;
5433   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 6) << 14;
5434   rsp->flag[1] |= _mm_extract_epi16(f8_mask, 7) << 15;
5491   m_flag[1] |= _mm_extract_epi16(f8_mask, 0) << 8;
5492   m_flag[1] |= _mm_extract_epi16(f8_mask, 1) << 9;
5493   m_flag[1] |= _mm_extract_epi16(f8_mask, 2) << 10;
5494   m_flag[1] |= _mm_extract_epi16(f8_mask, 3) << 11;
5495   m_flag[1] |= _mm_extract_epi16(f8_mask, 4) << 12;
5496   m_flag[1] |= _mm_extract_epi16(f8_mask, 5) << 13;
5497   m_flag[1] |= _mm_extract_epi16(f8_mask, 6) << 14;
5498   m_flag[1] |= _mm_extract_epi16(f8_mask, 7) << 15;
54355499#endif
54365500   INT16 vres[8];
54375501   UINT32 vce = 0;
r31833r31834
54965560   VEC_WRITEBACK_RESULT();
54975561}
54985562
5563static void cfunc_rsp_vch_simd(void *param)
5564{
5565   ((rsp_device *)param)->ccfunc_rsp_vch_simd();
5566}
54995567#endif
55005568
55015569#if (!USE_SIMD || SIMUL_SIMD)
55025570
5503INLINE void cfunc_rsp_vch_scalar(void *param)
5571inline void rsp_device::ccfunc_rsp_vch_scalar()
55045572{
5505   rsp_state *rsp = (rsp_state*)param;
5506   int op = rsp->impstate->arg0;
5573   int op = m_rsp_state->arg0;
55075574
55085575   CLEAR_CARRY_FLAGS();
55095576   CLEAR_COMPARE_FLAGS();
r31833r31834
55735640   }
55745641   WRITEBACK_RESULT();
55755642}
5643
5644static void cfunc_rsp_vch_scalar(void *param)
5645{
5646   ((rsp_device *)param)->ccfunc_rsp_vch_scalar();
5647}
55765648#endif
55775649
55785650#if USE_SIMD
r31833r31834
55855657//
55865658// Vector clip reverse
55875659
5588INLINE void cfunc_rsp_vcr_simd(void *param)
5660inline void rsp_device::ccfunc_rsp_vcr_simd()
55895661{
5590   rsp_state *rsp = (rsp_state*)param;
5591   int op = rsp->impstate->arg0;
5662   int op = m_rsp_state->arg0;
55925663
55935664   VEC_CLEAR_CARRY_FLAGS();
55945665   VEC_CLEAR_COMPARE_FLAGS();
r31833r31834
56085679
56095680   // accum set to s1 if (s1 ^ s2) < 0 && (s1 + s2) > 0)
56105681   // accum set to s1 if (s1 ^ s2) >= 0 && (s1 - s2) < 0
5611   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5612   __m128i s1_xor_s2 = _mm_xor_si128(rsp->xv[VS1REG], shuf);
5613   __m128i s1_plus_s2 = _mm_add_epi16(rsp->xv[VS1REG], shuf);
5614   __m128i s1_sub_s2 = _mm_sub_epi16(rsp->xv[VS1REG], shuf);
5682   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5683   __m128i s1_xor_s2 = _mm_xor_si128(m_xv[VS1REG], shuf);
5684   __m128i s1_plus_s2 = _mm_add_epi16(m_xv[VS1REG], shuf);
5685   __m128i s1_sub_s2 = _mm_sub_epi16(m_xv[VS1REG], shuf);
56155686   __m128i s2_neg = _mm_xor_si128(shuf, vec_neg1);
56165687
56175688   __m128i s2_lz = _mm_cmplt_epi16(shuf, _mm_setzero_si128());
r31833r31834
56245695
56255696   __m128i s1_mask = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_lz),   _mm_and_si128(s1s2_xor_lz, s1s2_plus_gz));
56265697   __m128i s2_mask = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_gez),  _mm_and_si128(s1s2_xor_lz, s1s2_plus_lez));
5627   rsp->accum_l = _mm_or_si128(_mm_and_si128(rsp->xv[VS1REG], s1_mask), _mm_and_si128(s2_neg, s2_mask));
5628   rsp->xv[VDREG] = rsp->accum_l;
5698   m_accum_l = _mm_or_si128(_mm_and_si128(m_xv[VS1REG], s1_mask), _mm_and_si128(s2_neg, s2_mask));
5699   m_xv[VDREG] = m_accum_l;
56295700
5630   rsp->xvflag[COMPARE] = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s2_lz),         _mm_and_si128(s1s2_xor_lz, s1s2_plus_lez));
5631   rsp->xvflag[CLIP2] = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_gez),  _mm_and_si128(s1s2_xor_lz, s2_lz));
5701   m_xvflag[COMPARE] = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s2_lz),         _mm_and_si128(s1s2_xor_lz, s1s2_plus_lez));
5702   m_xvflag[CLIP2] = _mm_or_si128(_mm_and_si128(s1s2_xor_gez, s1s2_sub_gez),  _mm_and_si128(s1s2_xor_lz, s2_lz));
56325703#endif
56335704   INT16 vres[8];
56345705   for (int i = 0; i < 8; i++)
r31833r31834
56705741         }
56715742      }
56725743
5673      vres[i] = VEC_ACCUM_L(rsp, i);
5744      vres[i] = VEC_ACCUM_L(i);
56745745   }
56755746   VEC_WRITEBACK_RESULT();
56765747}
56775748
5749static void cfunc_rsp_vcr_simd(void *param)
5750{
5751   ((rsp_device *)param)->ccfunc_rsp_vcr_simd();
5752}
56785753#endif
56795754
56805755#if (!USE_SIMD || SIMUL_SIMD)
56815756
5682INLINE void cfunc_rsp_vcr_scalar(void *param)
5757inline void rsp_device::ccfunc_rsp_vcr_scalar()
56835758{
5684   rsp_state *rsp = (rsp_state*)param;
5685   int op = rsp->impstate->arg0;
5759   int op = m_rsp_state->arg0;
56865760
56875761   CLEAR_CARRY_FLAGS();
56885762   CLEAR_COMPARE_FLAGS();
r31833r31834
57305804         }
57315805      }
57325806
5733      vres[i] = ACCUM_L(rsp, i);
5807      vres[i] = ACCUM_L(i);
57345808   }
57355809   WRITEBACK_RESULT();
57365810}
5811
5812static void cfunc_rsp_vcr_scalar(void *param)
5813{
5814   ((rsp_device *)param)->ccfunc_rsp_vcr_scalar();
5815}
57375816#endif
57385817
57395818#if USE_SIMD
r31833r31834
57465825//
57475826// Merges two vectors according to compare flags
57485827
5749INLINE void cfunc_rsp_vmrg_simd(void *param)
5828inline void rsp_device::ccfunc_rsp_vmrg_simd()
57505829{
5751   rsp_state *rsp = (rsp_state*)param;
5752   int op = rsp->impstate->arg0;
5830   int op = m_rsp_state->arg0;
57535831
5754   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5755   __m128i s2mask = _mm_cmpeq_epi16(rsp->xvflag[COMPARE], _mm_setzero_si128());
5832   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5833   __m128i s2mask = _mm_cmpeq_epi16(m_xvflag[COMPARE], _mm_setzero_si128());
57565834   __m128i s1mask = _mm_xor_si128(s2mask, vec_neg1);
5757   __m128i result = _mm_and_si128(rsp->xv[VS1REG], s1mask);
5758   rsp->xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, s2mask));
5759   rsp->accum_l = rsp->xv[VDREG];
5835   __m128i result = _mm_and_si128(m_xv[VS1REG], s1mask);
5836   m_xv[VDREG] = _mm_or_si128(result, _mm_and_si128(shuf, s2mask));
5837   m_accum_l = m_xv[VDREG];
57605838}
57615839
5840static void cfunc_rsp_vmrg_simd(void *param)
5841{
5842   ((rsp_device *)param)->ccfunc_rsp_vmrg_simd();
5843}
57625844#endif
57635845
57645846#if (!USE_SIMD || SIMUL_SIMD)
57655847
5766INLINE void cfunc_rsp_vmrg_scalar(void *param)
5848inline void rsp_device::ccfunc_rsp_vmrg_scalar()
57675849{
5768   rsp_state *rsp = (rsp_state*)param;
5769   int op = rsp->impstate->arg0;
5850   int op = m_rsp_state->arg0;
57705851
57715852   INT16 vres[8];
57725853   for (int i = 0; i < 8; i++)
r31833r31834
57745855      INT16 s1, s2;
57755856      SCALAR_GET_VS1(s1, i);
57765857      SCALAR_GET_VS2(s2, i);
5777      if (COMPARE_FLAG(rsp, i) != 0)
5858      if (COMPARE_FLAG(i) != 0)
57785859      {
57795860         vres[i] = s1;
57805861      }
r31833r31834
57875868   }
57885869   WRITEBACK_RESULT();
57895870}
5871
5872static void cfunc_rsp_vmrg_scalar(void *param)
5873{
5874   ((rsp_device *)param)->ccfunc_rsp_vmrg_scalar();
5875}
57905876#endif
57915877
57925878#if USE_SIMD
r31833r31834
57995885//
58005886// Bitwise AND of two vector registers
58015887
5802INLINE void cfunc_rsp_vand_simd(void *param)
5888inline void rsp_device::ccfunc_rsp_vand_simd()
58035889{
5804   rsp_state *rsp = (rsp_state*)param;
5805   int op = rsp->impstate->arg0;
5890   int op = m_rsp_state->arg0;
58065891
5807   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5808   rsp->xv[VDREG] = _mm_and_si128(rsp->xv[VS1REG], shuf);
5809   rsp->accum_l = rsp->xv[VDREG];
5892   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5893   m_xv[VDREG] = _mm_and_si128(m_xv[VS1REG], shuf);
5894   m_accum_l = m_xv[VDREG];
58105895}
58115896
5897static void cfunc_rsp_vand_simd(void *param)
5898{
5899   ((rsp_device *)param)->ccfunc_rsp_vand_simd();
5900}
58125901#endif
58135902
58145903#if (!USE_SIMD || SIMUL_SIMD)
58155904
5816INLINE void cfunc_rsp_vand_scalar(void *param)
5905inline void rsp_device::ccfunc_rsp_vand_scalar()
58175906{
5818   rsp_state *rsp = (rsp_state*)param;
5819   int op = rsp->impstate->arg0;
5907   int op = m_rsp_state->arg0;
58205908
58215909   INT16 vres[8];
58225910   for (int i = 0; i < 8; i++)
r31833r31834
58295917   }
58305918   WRITEBACK_RESULT();
58315919}
5920
5921static void cfunc_rsp_vand_scalar(void *param)
5922{
5923   ((rsp_device *)param)->ccfunc_rsp_vand_scalar();
5924}
58325925#endif
58335926
58345927#if USE_SIMD
r31833r31834
58415934//
58425935// Bitwise NOT AND of two vector registers
58435936
5844INLINE void cfunc_rsp_vnand_simd(void *param)
5937inline void rsp_device::ccfunc_rsp_vnand_simd()
58455938{
5846   rsp_state *rsp = (rsp_state*)param;
5847   int op = rsp->impstate->arg0;
5939   int op = m_rsp_state->arg0;
58485940
5849   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5850   rsp->xv[VDREG] = _mm_xor_si128(_mm_and_si128(rsp->xv[VS1REG], shuf), vec_neg1);
5851   rsp->accum_l = rsp->xv[VDREG];
5941   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5942   m_xv[VDREG] = _mm_xor_si128(_mm_and_si128(m_xv[VS1REG], shuf), vec_neg1);
5943   m_accum_l = m_xv[VDREG];
58525944}
58535945
5946static void cfunc_rsp_vnand_simd(void *param)
5947{
5948   ((rsp_device *)param)->ccfunc_rsp_vnand_simd();
5949}
58545950#endif
58555951
58565952#if (!USE_SIMD || SIMUL_SIMD)
58575953
5858INLINE void cfunc_rsp_vnand_scalar(void *param)
5954inline void rsp_device::ccfunc_rsp_vnand_scalar()
58595955{
5860   rsp_state *rsp = (rsp_state*)param;
5861   int op = rsp->impstate->arg0;
5956   int op = m_rsp_state->arg0;
58625957
58635958   INT16 vres[8];
58645959   for (int i = 0; i < 8; i++)
r31833r31834
58715966   }
58725967   WRITEBACK_RESULT();
58735968}
5969
5970static void cfunc_rsp_vnand_scalar(void *param)
5971{
5972   ((rsp_device *)param)->ccfunc_rsp_vnand_scalar();
5973}
58745974#endif
58755975
58765976#if USE_SIMD
r31833r31834
58835983//
58845984// Bitwise OR of two vector registers
58855985
5886INLINE void cfunc_rsp_vor_simd(void *param)
5986inline void rsp_device::ccfunc_rsp_vor_simd()
58875987{
5888   rsp_state *rsp = (rsp_state*)param;
5889   int op = rsp->impstate->arg0;
5988   int op = m_rsp_state->arg0;
58905989
5891   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5892   rsp->xv[VDREG] = _mm_or_si128(rsp->xv[VS1REG], shuf);
5893   rsp->accum_l = rsp->xv[VDREG];
5990   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
5991   m_xv[VDREG] = _mm_or_si128(m_xv[VS1REG], shuf);
5992   m_accum_l = m_xv[VDREG];
58945993}
58955994
5995static void cfunc_rsp_vor_simd(void *param)
5996{
5997   ((rsp_device *)param)->ccfunc_rsp_vor_simd();
5998}
58965999#endif
58976000
58986001#if (!USE_SIMD || SIMUL_SIMD)
58996002
5900INLINE void cfunc_rsp_vor_scalar(void *param)
6003inline void rsp_device::ccfunc_rsp_vor_scalar()
59016004{
5902   rsp_state *rsp = (rsp_state*)param;
5903   int op = rsp->impstate->arg0;
6005   int op = m_rsp_state->arg0;
59046006
59056007   INT16 vres[8];
59066008   for (int i = 0; i < 8; i++)
r31833r31834
59136015   }
59146016   WRITEBACK_RESULT();
59156017}
6018
6019static void cfunc_rsp_vor_scalar(void *param)
6020{
6021   ((rsp_device *)param)->ccfunc_rsp_vor_scalar();
6022}
59166023#endif
59176024
59186025#if USE_SIMD
r31833r31834
59256032//
59266033// Bitwise NOT OR of two vector registers
59276034
5928INLINE void cfunc_rsp_vnor_simd(void *param)
6035inline void rsp_device::ccfunc_rsp_vnor_simd()
59296036{
5930   rsp_state *rsp = (rsp_state*)param;
5931   int op = rsp->impstate->arg0;
6037   int op = m_rsp_state->arg0;
59326038
5933   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5934   rsp->xv[VDREG] = _mm_xor_si128(_mm_or_si128(rsp->xv[VS1REG], shuf), vec_neg1);
5935   rsp->accum_l = rsp->xv[VDREG];
6039   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
6040   m_xv[VDREG] = _mm_xor_si128(_mm_or_si128(m_xv[VS1REG], shuf), vec_neg1);
6041   m_accum_l = m_xv[VDREG];
59366042}
59376043
6044static void cfunc_rsp_vnor_simd(void *param)
6045{
6046   ((rsp_device *)param)->ccfunc_rsp_vnor_simd();
6047}
59386048#endif
59396049
59406050#if (!USE_SIMD || SIMUL_SIMD)
59416051
5942INLINE void cfunc_rsp_vnor_scalar(void *param)
6052inline void rsp_device::ccfunc_rsp_vnor_scalar()
59436053{
5944   rsp_state *rsp = (rsp_state*)param;
5945   int op = rsp->impstate->arg0;
6054   int op = m_rsp_state->arg0;
59466055
59476056   INT16 vres[8];
59486057   for (int i = 0; i < 8; i++)
r31833r31834
59556064   }
59566065   WRITEBACK_RESULT();
59576066}
6067
6068static void cfunc_rsp_vnor_scalar(void *param)
6069{
6070   ((rsp_device *)param)->ccfunc_rsp_vnor_scalar();
6071}
59586072#endif
59596073
59606074#if USE_SIMD
r31833r31834
59676081//
59686082// Bitwise XOR of two vector registers
59696083
5970INLINE void cfunc_rsp_vxor_simd(void *param)
6084inline void rsp_device::ccfunc_rsp_vxor_simd()
59716085{
5972   rsp_state *rsp = (rsp_state*)param;
5973   int op = rsp->impstate->arg0;
6086   int op = m_rsp_state->arg0;
59746087
5975   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
5976   rsp->xv[VDREG] = _mm_xor_si128(rsp->xv[VS1REG], shuf);
5977   rsp->accum_l = rsp->xv[VDREG];
6088   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
6089   m_xv[VDREG] = _mm_xor_si128(m_xv[VS1REG], shuf);
6090   m_accum_l = m_xv[VDREG];
59786091}
59796092
6093static void cfunc_rsp_vxor_simd(void *param)
6094{
6095   ((rsp_device *)param)->ccfunc_rsp_vxor_simd();
6096}
59806097#endif
59816098
59826099#if (!USE_SIMD || SIMUL_SIMD)
59836100
5984INLINE void cfunc_rsp_vxor_scalar(void *param)
6101inline void rsp_device::ccfunc_rsp_vxor_scalar()
59856102{
5986   rsp_state *rsp = (rsp_state*)param;
5987   int op = rsp->impstate->arg0;
6103   int op = m_rsp_state->arg0;
59886104
59896105   INT16 vres[8];
59906106   for (int i = 0; i < 8; i++)
r31833r31834
59976113   }
59986114   WRITEBACK_RESULT();
59996115}
6116
6117static void cfunc_rsp_vxor_scalar(void *param)
6118{
6119   ((rsp_device *)param)->ccfunc_rsp_vxor_scalar();
6120}
60006121#endif
60016122
60026123#if USE_SIMD
r31833r31834
60096130//
60106131// Bitwise NOT XOR of two vector registers
60116132
6012INLINE void cfunc_rsp_vnxor_simd(void *param)
6133inline void rsp_device::ccfunc_rsp_vnxor_simd()
60136134{
6014   rsp_state *rsp = (rsp_state*)param;
6015   int op = rsp->impstate->arg0;
6135   int op = m_rsp_state->arg0;
60166136
6017   __m128i shuf = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6018   rsp->xv[VDREG] = _mm_xor_si128(_mm_xor_si128(rsp->xv[VS1REG], shuf), vec_neg1);
6019   rsp->accum_l = rsp->xv[VDREG];
6137   __m128i shuf = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
6138   m_xv[VDREG] = _mm_xor_si128(_mm_xor_si128(m_xv[VS1REG], shuf), vec_neg1);
6139   m_accum_l = m_xv[VDREG];
60206140}
60216141
6142static void cfunc_rsp_vnxor_simd(void *param)
6143{
6144   ((rsp_device *)param)->ccfunc_rsp_vnxor_simd();
6145}
60226146#endif
60236147
60246148#if (!USE_SIMD || SIMUL_SIMD)
60256149
6026INLINE void cfunc_rsp_vnxor_scalar(void *param)
6150inline void rsp_device::ccfunc_rsp_vnxor_scalar()
60276151{
6028   rsp_state *rsp = (rsp_state*)param;
6029   int op = rsp->impstate->arg0;
6152   int op = m_rsp_state->arg0;
60306153
60316154   INT16 vres[8];
60326155   for (int i = 0; i < 8; i++)
r31833r31834
60396162   }
60406163   WRITEBACK_RESULT();
60416164}
6165
6166static void cfunc_rsp_vnxor_scalar(void *param)
6167{
6168   ((rsp_device *)param)->ccfunc_rsp_vnxor_scalar();
6169}
60426170#endif
60436171
60446172#if USE_SIMD
r31833r31834
60516179//
60526180// Calculates reciprocal
60536181
6054INLINE void cfunc_rsp_vrcp_simd(void *param)
6182inline void rsp_device::ccfunc_rsp_vrcp_simd()
60556183{
6056   rsp_state *rsp = (rsp_state*)param;
6057   int op = rsp->impstate->arg0;
6184   int op = m_rsp_state->arg0;
60586185
60596186   INT32 shifter = 0;
60606187   UINT16 urec;
60616188   INT32 rec;
6062   SIMD_EXTRACT16(rsp->xv[VS2REG], urec, EL);
6189   SIMD_EXTRACT16(m_xv[VS2REG], urec, EL);
60636190   rec = (INT16)urec;
60646191   INT32 datainput = (rec < 0) ? (-rec) : rec;
60656192   if (datainput)
r31833r31834
60956222   }
60966223   rec = temp;
60976224
6098   rsp->reciprocal_res = rec;
6099   rsp->dp_allowed = 0;
6225   m_reciprocal_res = rec;
6226   m_dp_allowed = 0;
61006227
6101   SIMD_INSERT16(rsp->xv[VDREG], (UINT16)rec, VS1REG);
6102   rsp->accum_l = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6228   SIMD_INSERT16(m_xv[VDREG], (UINT16)rec, VS1REG);
6229   m_accum_l = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
61036230}
61046231
6232static void cfunc_rsp_vrcp_simd(void *param)
6233{
6234   ((rsp_device *)param)->ccfunc_rsp_vrcp_simd();
6235}
61056236#endif
61066237
61076238#if (!USE_SIMD || SIMUL_SIMD)
61086239
6109INLINE void cfunc_rsp_vrcp_scalar(void *param)
6240inline void rsp_device::ccfunc_rsp_vrcp_scalar()
61106241{
6111   rsp_state *rsp = (rsp_state*)param;
6112   int op = rsp->impstate->arg0;
6242   int op = m_rsp_state->arg0;
61136243
61146244   INT32 shifter = 0;
61156245   INT32 rec = (INT16)(VREG_S(VS2REG, EL & 7));
r31833r31834
61476277   }
61486278   rec = temp;
61496279
6150   rsp->reciprocal_res = rec;
6151   rsp->dp_allowed = 0;
6280   m_reciprocal_res = rec;
6281   m_dp_allowed = 0;
61526282
61536283   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
61546284   for (int i = 0; i < 8; i++)
r31833r31834
61566286      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
61576287   }
61586288}
6289
6290static void cfunc_rsp_vrcp_scalar(void *param)
6291{
6292   ((rsp_device *)param)->ccfunc_rsp_vrcp_scalar();
6293}
61596294#endif
61606295
61616296#if USE_SIMD
r31833r31834
61686303//
61696304// Calculates reciprocal low part
61706305
6171INLINE void cfunc_rsp_vrcpl_simd(void *param)
6306inline void rsp_device::ccfunc_rsp_vrcpl_simd()
61726307{
6173   rsp_state *rsp = (rsp_state*)param;
6174   int op = rsp->impstate->arg0;
6308   int op = m_rsp_state->arg0;
61756309
61766310#if SIMUL_SIMD
6177   rsp->old_reciprocal_res = rsp->reciprocal_res;
6178   rsp->old_reciprocal_high = rsp->reciprocal_high;
6179   rsp->old_dp_allowed = rsp->dp_allowed;
6311   m_old_reciprocal_res = m_reciprocal_res;
6312   m_old_reciprocal_high = m_reciprocal_high;
6313   m_old_dp_allowed = m_dp_allowed;
61806314#endif
61816315
61826316   INT32 shifter = 0;
61836317
61846318   UINT16 urec;
6185   SIMD_EXTRACT16(rsp->xv[VS2REG], urec, EL);
6186   INT32 rec = (urec | rsp->reciprocal_high);
6319   SIMD_EXTRACT16(m_xv[VS2REG], urec, EL);
6320   INT32 rec = (urec | m_reciprocal_high);
61876321
61886322   INT32 datainput = rec;
61896323
61906324   if (rec < 0)
61916325   {
6192      if (rsp->dp_allowed)
6326      if (m_dp_allowed)
61936327      {
61946328         if (rec < -32768)
61956329         {
r31833r31834
62206354   }
62216355   else
62226356   {
6223      if (rsp->dp_allowed)
6357      if (m_dp_allowed)
62246358      {
62256359         shifter = 0;
62266360      }
r31833r31834
62476381   }
62486382   rec = temp;
62496383
6250   rsp->reciprocal_res = rec;
6251   rsp->dp_allowed = 0;
6384   m_reciprocal_res = rec;
6385   m_dp_allowed = 0;
62526386
6253   SIMD_INSERT16(rsp->xv[VDREG], (UINT16)rec, VS1REG);
6387   SIMD_INSERT16(m_xv[VDREG], (UINT16)rec, VS1REG);
62546388
62556389   for (int i = 0; i < 8; i++)
62566390   {
62576391      INT16 val;
6258      SIMD_EXTRACT16(rsp->xv[VS2REG], val, VEC_EL_2(EL, i));
6392      SIMD_EXTRACT16(m_xv[VS2REG], val, VEC_EL_2(EL, i));
62596393      VEC_SET_ACCUM_L(val, i);
62606394   }
62616395}
62626396
6397static void cfunc_rsp_vrcpl_simd(void *param)
6398{
6399   ((rsp_device *)param)->ccfunc_rsp_vrcpl_simd();
6400}
62636401#endif
62646402
62656403#if (!USE_SIMD || SIMUL_SIMD)
62666404
6267INLINE void cfunc_rsp_vrcpl_scalar(void *param)
6405inline void rsp_device::ccfunc_rsp_vrcpl_scalar()
62686406{
6269   rsp_state *rsp = (rsp_state*)param;
6270   int op = rsp->impstate->arg0;
6407   int op = m_rsp_state->arg0;
62716408
62726409   INT32 shifter = 0;
6273   INT32 rec = ((UINT16)(VREG_S(VS2REG, EL & 7)) | rsp->reciprocal_high);
6410   INT32 rec = ((UINT16)(VREG_S(VS2REG, EL & 7)) | m_reciprocal_high);
62746411   INT32 datainput = rec;
62756412
62766413   if (rec < 0)
62776414   {
6278      if (rsp->dp_allowed)
6415      if (m_dp_allowed)
62796416      {
62806417         if (rec < -32768)
62816418         {
r31833r31834
63066443   }
63076444   else
63086445   {
6309      if (rsp->dp_allowed)
6446      if (m_dp_allowed)
63106447      {
63116448         shifter = 0;
63126449      }
r31833r31834
63336470   }
63346471   rec = temp;
63356472
6336   rsp->reciprocal_res = rec;
6337   rsp->dp_allowed = 0;
6473   m_reciprocal_res = rec;
6474   m_dp_allowed = 0;
63386475
63396476   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
63406477
r31833r31834
63436480      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
63446481   }
63456482}
6483
6484static void cfunc_rsp_vrcpl_scalar(void *param)
6485{
6486   ((rsp_device *)param)->ccfunc_rsp_vrcpl_scalar();
6487}
63466488#endif
63476489
63486490#if USE_SIMD
r31833r31834
63556497//
63566498// Calculates reciprocal high part
63576499
6358INLINE void cfunc_rsp_vrcph_simd(void *param)
6500inline void rsp_device::ccfunc_rsp_vrcph_simd()
63596501{
6360   rsp_state *rsp = (rsp_state*)param;
6361   int op = rsp->impstate->arg0;
6502   int op = m_rsp_state->arg0;
63626503
63636504#if SIMUL_SIMD
6364   rsp->old_reciprocal_res = rsp->reciprocal_res;
6365   rsp->old_reciprocal_high = rsp->reciprocal_high;
6366   rsp->old_dp_allowed = rsp->dp_allowed;
6505   m_old_reciprocal_res = m_reciprocal_res;
6506   m_old_reciprocal_high = m_reciprocal_high;
6507   m_old_dp_allowed = m_dp_allowed;
63676508#endif
63686509
63696510   UINT16 rcph;
6370   SIMD_EXTRACT16(rsp->xv[VS2REG], rcph, EL);
6371   rsp->reciprocal_high = rcph << 16;
6372   rsp->dp_allowed = 1;
6511   SIMD_EXTRACT16(m_xv[VS2REG], rcph, EL);
6512   m_reciprocal_high = rcph << 16;
6513   m_dp_allowed = 1;
63736514
6374   rsp->accum_l = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6515   m_accum_l = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
63756516
6376   SIMD_INSERT16(rsp->xv[VDREG], (INT16)(rsp->reciprocal_res >> 16), VS1REG);
6517   SIMD_INSERT16(m_xv[VDREG], (INT16)(m_reciprocal_res >> 16), VS1REG);
63776518}
63786519
6520static void cfunc_rsp_vrcph_simd(void *param)
6521{
6522   ((rsp_device *)param)->ccfunc_rsp_vrcph_simd();
6523}
63796524#endif
63806525
63816526#if (!USE_SIMD || SIMUL_SIMD)
63826527
6383INLINE void cfunc_rsp_vrcph_scalar(void *param)
6528inline void rsp_device::ccfunc_rsp_vrcph_scalar()
63846529{
6385   rsp_state *rsp = (rsp_state*)param;
6386   int op = rsp->impstate->arg0;
6530   int op = m_rsp_state->arg0;
63876531
6388   rsp->reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
6389   rsp->dp_allowed = 1;
6532   m_reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
6533   m_dp_allowed = 1;
63906534
63916535   for (int i = 0; i < 8; i++)
63926536   {
63936537      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
63946538   }
63956539
6396   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(rsp->reciprocal_res >> 16);
6540   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(m_reciprocal_res >> 16);
63976541}
6542
6543static void cfunc_rsp_vrcph_scalar(void *param)
6544{
6545   ((rsp_device *)param)->ccfunc_rsp_vrcph_scalar();
6546}
63986547#endif
63996548
64006549#if USE_SIMD
r31833r31834
64076556//
64086557// Moves element from vector to destination vector
64096558
6410INLINE void cfunc_rsp_vmov_simd(void *param)
6559inline void rsp_device::ccfunc_rsp_vmov_simd()
64116560{
6412   rsp_state *rsp = (rsp_state*)param;
6413   int op = rsp->impstate->arg0;
6561   int op = m_rsp_state->arg0;
64146562
64156563   INT16 val;
6416   SIMD_EXTRACT16(rsp->xv[VS2REG], val, EL);
6417   SIMD_INSERT16(rsp->xv[VDREG], val, VS1REG);
6418   rsp->accum_l = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6564   SIMD_EXTRACT16(m_xv[VS2REG], val, EL);
6565   SIMD_INSERT16(m_xv[VDREG], val, VS1REG);
6566   m_accum_l = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
64196567}
64206568
6569static void cfunc_rsp_vmov_simd(void *param)
6570{
6571   ((rsp_device *)param)->ccfunc_rsp_vmov_simd();
6572}
64216573#endif
64226574
64236575#if (!USE_SIMD || SIMUL_SIMD)
64246576
6425INLINE void cfunc_rsp_vmov_scalar(void *param)
6577inline void rsp_device::ccfunc_rsp_vmov_scalar()
64266578{
6427   rsp_state *rsp = (rsp_state*)param;
6428   int op = rsp->impstate->arg0;
6579   int op = m_rsp_state->arg0;
64296580
64306581   W_VREG_S(VDREG, VS1REG & 7) = VREG_S(VS2REG, EL & 7);
64316582   for (int i = 0; i < 8; i++)
r31833r31834
64346585   }
64356586}
64366587
6588static void cfunc_rsp_vmov_scalar(void *param)
6589{
6590   ((rsp_device *)param)->ccfunc_rsp_vmov_scalar();
6591}
64376592#endif
64386593
64396594#if USE_SIMD
r31833r31834
64466601//
64476602// Calculates reciprocal square-root low part
64486603
6449INLINE void cfunc_rsp_vrsql_simd(void *param)
6604inline void rsp_device::ccfunc_rsp_vrsql_simd()
64506605{
6451   rsp_state *rsp = (rsp_state*)param;
6452   int op = rsp->impstate->arg0;
6606   int op = m_rsp_state->arg0;
64536607
64546608#if SIMUL_SIMD
6455   rsp->old_reciprocal_res = rsp->reciprocal_res;
6456   rsp->old_reciprocal_high = rsp->reciprocal_high;
6457   rsp->old_dp_allowed = rsp->dp_allowed;
6609   m_old_reciprocal_res = m_reciprocal_res;
6610   m_old_reciprocal_high = m_reciprocal_high;
6611   m_old_dp_allowed = m_dp_allowed;
64586612#endif
64596613
64606614   INT32 shifter = 0;
64616615   UINT16 val;
6462   SIMD_EXTRACT16(rsp->xv[VS2REG], val, EL);
6463   INT32 rec = rsp->reciprocal_high | val;
6616   SIMD_EXTRACT16(m_xv[VS2REG], val, EL);
6617   INT32 rec = m_reciprocal_high | val;
64646618   INT32 datainput = rec;
64656619
64666620   if (rec < 0)
64676621   {
6468      if (rsp->dp_allowed)
6622      if (m_dp_allowed)
64696623      {
64706624         if (rec < -32768)
64716625         {
r31833r31834
64956649   }
64966650   else
64976651   {
6498      if (rsp->dp_allowed)
6652      if (m_dp_allowed)
64996653      {
65006654         shifter = 0;
65016655      }
r31833r31834
65246678   }
65256679   rec = temp;
65266680
6527   rsp->reciprocal_res = rec;
6528   rsp->dp_allowed = 0;
6681   m_reciprocal_res = rec;
6682   m_dp_allowed = 0;
65296683
6530   SIMD_INSERT16(rsp->xv[VDREG], (UINT16)rec, VS1REG);
6531   rsp->accum_l = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6684   SIMD_INSERT16(m_xv[VDREG], (UINT16)rec, VS1REG);
6685   m_accum_l = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
65326686}
65336687
6688static void cfunc_rsp_vrsql_simd(void *param)
6689{
6690   ((rsp_device *)param)->ccfunc_rsp_vrsql_simd();
6691}
65346692#endif
65356693
65366694#if (!USE_SIMD || SIMUL_SIMD)
65376695
6538INLINE void cfunc_rsp_vrsql_scalar(void *param)
6696inline void rsp_device::ccfunc_rsp_vrsql_scalar()
65396697{
6540   rsp_state *rsp = (rsp_state*)param;
6541   int op = rsp->impstate->arg0;
6698   int op = m_rsp_state->arg0;
65426699
65436700   INT32 shifter = 0;
6544   INT32 rec = rsp->reciprocal_high | (UINT16)VREG_S(VS2REG, EL & 7);
6701   INT32 rec = m_reciprocal_high | (UINT16)VREG_S(VS2REG, EL & 7);
65456702   INT32 datainput = rec;
65466703
65476704   if (rec < 0)
65486705   {
6549      if (rsp->dp_allowed)
6706      if (m_dp_allowed)
65506707      {
65516708         if (rec < -32768)
65526709         {
r31833r31834
65766733   }
65776734   else
65786735   {
6579      if (rsp->dp_allowed)
6736      if (m_dp_allowed)
65806737      {
65816738         shifter = 0;
65826739      }
r31833r31834
66056762   }
66066763   rec = temp;
66076764
6608   rsp->reciprocal_res = rec;
6609   rsp->dp_allowed = 0;
6765   m_reciprocal_res = rec;
6766   m_dp_allowed = 0;
66106767
66116768   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)(rec & 0xffff);
66126769   for (int i = 0; i < 8; i++)
r31833r31834
66146771      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
66156772   }
66166773}
6774
6775static void cfunc_rsp_vrsql_scalar(void *param)
6776{
6777   ((rsp_device *)param)->ccfunc_rsp_vrsql_scalar();
6778}
66176779#endif
66186780
66196781#if USE_SIMD
r31833r31834
66266788//
66276789// Calculates reciprocal square-root high part
66286790
6629INLINE void cfunc_rsp_vrsqh_simd(void *param)
6791inline void rsp_device::ccfunc_rsp_vrsqh_simd()
66306792{
6631   rsp_state *rsp = (rsp_state*)param;
6632   int op = rsp->impstate->arg0;
6793   int op = m_rsp_state->arg0;
66336794
66346795#if SIMUL_SIMD
6635   rsp->old_reciprocal_res = rsp->reciprocal_res;
6636   rsp->old_reciprocal_high = rsp->reciprocal_high;
6637   rsp->old_dp_allowed = rsp->dp_allowed;
6796   m_old_reciprocal_res = m_reciprocal_res;
6797   m_old_reciprocal_high = m_reciprocal_high;
6798   m_old_dp_allowed = m_dp_allowed;
66386799#endif
66396800
66406801   UINT16 val;
6641   SIMD_EXTRACT16(rsp->xv[VS2REG], val, EL);
6642   rsp->reciprocal_high = val << 16;
6643   rsp->dp_allowed = 1;
6802   SIMD_EXTRACT16(m_xv[VS2REG], val, EL);
6803   m_reciprocal_high = val << 16;
6804   m_dp_allowed = 1;
66446805
6645   rsp->accum_l = _mm_shuffle_epi8(rsp->xv[VS2REG], vec_shuf_inverse[EL]);
6806   m_accum_l = _mm_shuffle_epi8(m_xv[VS2REG], vec_shuf_inverse[EL]);
66466807
6647   SIMD_INSERT16(rsp->xv[VDREG], (INT16)(rsp->reciprocal_res >> 16), VS1REG); // store high part
6808   SIMD_INSERT16(m_xv[VDREG], (INT16)(m_reciprocal_res >> 16), VS1REG); // store high part
66486809}
66496810
6811static void cfunc_rsp_vrsqh_simd(void *param)
6812{
6813   ((rsp_device *)param)->ccfunc_rsp_vrsqh_simd();
6814}
66506815#endif
66516816
66526817#if (!USE_SIMD || SIMUL_SIMD)
66536818
6654INLINE void cfunc_rsp_vrsqh_scalar(void *param)
6819inline void rsp_device::ccfunc_rsp_vrsqh_scalar()
66556820{
6656   rsp_state *rsp = (rsp_state*)param;
6657   int op = rsp->impstate->arg0;
6821   int op = m_rsp_state->arg0;
66586822
6659   rsp->reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
6660   rsp->dp_allowed = 1;
6823   m_reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
6824   m_dp_allowed = 1;
66616825
66626826   for (int i = 0; i < 8; i++)
66636827   {
66646828      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
66656829   }
66666830
6667   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(rsp->reciprocal_res >> 16);  // store high part
6831   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(m_reciprocal_res >> 16);  // store high part
66686832}
6833
6834static void cfunc_rsp_vrsqh_scalar(void *param)
6835{
6836   ((rsp_device *)param)->ccfunc_rsp_vrsqh_scalar();
6837}
66696838#endif
66706839
66716840
6672static void cfunc_sp_set_status_cb(void *param)
6841inline void rsp_device::ccfunc_sp_set_status_cb()
66736842{
6674   rsp_state *rsp = (rsp_state*)param;
6675   (rsp->device->sp_set_status_func)(0, rsp->impstate->arg0, 0xffffffff);
6843   m_sp_set_status_func(0, m_rsp_state->arg0, 0xffffffff);
66766844}
66776845
6678static CPU_EXECUTE( rsp )
6846void cfunc_sp_set_status_cb(void *param)
66796847{
6680   rsp_state *rsp = get_safe_token(device);
6681   drcuml_state *drcuml = rsp->impstate->drcuml;
6848   ((rsp_device *)param)->ccfunc_sp_set_status_cb();
6849}
6850
6851void rsp_device::execute_run_drc()
6852{
6853   drcuml_state *drcuml = m_drcuml;
66826854   int execute_result;
66836855
66846856   /* reset the cache if dirty */
6685   if (rsp->impstate->cache_dirty)
6686      code_flush_cache(rsp);
6687   rsp->impstate->cache_dirty = FALSE;
6857   if (m_cache_dirty)
6858      code_flush_cache();
6859   m_cache_dirty = FALSE;
66886860
66896861   /* execute */
66906862   do
66916863   {
6692      if( rsp->sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
6864      if( m_sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
66936865      {
6694         rsp->icount = MIN(rsp->icount, 0);
6866         m_rsp_state->icount = MIN(m_rsp_state->icount, 0);
66956867         break;
66966868      }
66976869
66986870      /* run as much as we can */
6699      execute_result = drcuml->execute(*rsp->impstate->entry);
6871      execute_result = drcuml->execute(*m_entry);
67006872
67016873      /* if we need to recompile, do it */
67026874      if (execute_result == EXECUTE_MISSING_CODE)
67036875      {
6704         code_compile_block(rsp, rsp->pc);
6876         code_compile_block(m_rsp_state->pc);
67056877      }
67066878      else if (execute_result == EXECUTE_UNMAPPED_CODE)
67076879      {
6708         fatalerror("Attempted to execute unmapped code at PC=%08X\n", rsp->pc);
6880         fatalerror("Attempted to execute unmapped code at PC=%08X\n", m_rsp_state->pc);
67096881      }
67106882      else if (execute_result == EXECUTE_RESET_CACHE)
67116883      {
6712         code_flush_cache(rsp);
6884         code_flush_cache();
67136885      }
67146886   } while (execute_result != EXECUTE_OUT_OF_CYCLES);
67156887}
r31833r31834
67236895    accessor to code_flush_cache
67246896-------------------------------------------------*/
67256897
6726void rspdrc_flush_drc_cache(device_t *device)
6898void rsp_device::rspdrc_flush_drc_cache()
67276899{
6728   if (!device->machine().options().drc()) return;
6729   rsp_state *rsp = get_safe_token(device);
6730   rsp->impstate->cache_dirty = TRUE;
6900   if (!machine().options().drc()) return;
6901   m_cache_dirty = TRUE;
67316902}
67326903
67336904/*-------------------------------------------------
r31833r31834
67356906    regenerate static code
67366907-------------------------------------------------*/
67376908
6738static void code_flush_cache(rsp_state *rsp)
6909void rsp_device::code_flush_cache()
67396910{
67406911   /* empty the transient cache contents */
6741   rsp->impstate->drcuml->reset();
6912   m_drcuml->reset();
67426913
67436914   try
67446915   {
67456916      /* generate the entry point and out-of-cycles handlers */
6746      static_generate_entry_point(rsp);
6747      static_generate_nocode_handler(rsp);
6748      static_generate_out_of_cycles(rsp);
6917      static_generate_entry_point();
6918      static_generate_nocode_handler();
6919      static_generate_out_of_cycles();
67496920
67506921      /* add subroutines for memory accesses */
6751      static_generate_memory_accessor(rsp, 1, FALSE, "read8",       rsp->impstate->read8);
6752      static_generate_memory_accessor(rsp, 1, TRUE,  "write8",      rsp->impstate->write8);
6753      static_generate_memory_accessor(rsp, 2, FALSE, "read16",      rsp->impstate->read16);
6754      static_generate_memory_accessor(rsp, 2, TRUE,  "write16",     rsp->impstate->write16);
6755      static_generate_memory_accessor(rsp, 4, FALSE, "read32",      rsp->impstate->read32);
6756      static_generate_memory_accessor(rsp, 4, TRUE,  "write32",     rsp->impstate->write32);
6922      static_generate_memory_accessor(1, FALSE, "read8",       m_read8);
6923      static_generate_memory_accessor(1, TRUE,  "write8",      m_write8);
6924      static_generate_memory_accessor(2, FALSE, "read16",      m_read16);
6925      static_generate_memory_accessor(2, TRUE,  "write16",     m_write16);
6926      static_generate_memory_accessor(4, FALSE, "read32",      m_read32);
6927      static_generate_memory_accessor(4, TRUE,  "write32",     m_write32);
67576928   }
67586929   catch (drcuml_block::abort_compilation &)
67596930   {
r31833r31834
67676938    given mode at the specified pc
67686939-------------------------------------------------*/
67696940
6770static void code_compile_block(rsp_state *rsp, offs_t pc)
6941void rsp_device::code_compile_block(offs_t pc)
67716942{
6772   drcuml_state *drcuml = rsp->impstate->drcuml;
6943   drcuml_state *drcuml = m_drcuml;
67736944   compiler_state compiler = { 0 };
67746945   const opcode_desc *seqhead, *seqlast;
67756946   const opcode_desc *desclist;
r31833r31834
67796950   g_profiler.start(PROFILER_DRC_COMPILE);
67806951
67816952   /* get a description of this sequence */
6782   desclist = rsp->impstate->drcfe->describe_code(pc);
6953   desclist = m_drcfe->describe_code(pc);
67836954
67846955   bool succeeded = false;
67856956   while (!succeeded)
r31833r31834
67966967            UINT32 nextpc;
67976968
67986969            /* add a code log entry */
6799            if (LOG_UML)
6970            if (RSP_LOG_UML)
68006971               block->append_comment("-------------------------");                 // comment
68016972
68026973            /* determine the last instruction in this sequence */
r31833r31834
68216992            else
68226993            {
68236994               UML_LABEL(block, seqhead->pc | 0x80000000);                             // label   seqhead->pc
6824               UML_HASHJMP(block, 0, seqhead->pc, *rsp->impstate->nocode);
6995               UML_HASHJMP(block, 0, seqhead->pc, *m_nocode);
68256996                                                                     // hashjmp <0>,seqhead->pc,nocode
68266997               continue;
68276998            }
68286999
68297000            /* validate this code block if we're not pointing into ROM */
6830            if (rsp->program->get_write_ptr(seqhead->physpc) != NULL)
6831               generate_checksum_block(rsp, block, &compiler, seqhead, seqlast);
7001            if (m_program->get_write_ptr(seqhead->physpc) != NULL)
7002               generate_checksum_block(block, &compiler, seqhead, seqlast);
68327003
68337004            /* label this instruction, if it may be jumped to locally */
68347005            if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET)
r31833r31834
68367007
68377008            /* iterate over instructions in the sequence and compile them */
68387009            for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next())
6839               generate_sequence_instruction(rsp, block, &compiler, curdesc);
7010               generate_sequence_instruction(block, &compiler, curdesc);
68407011
68417012            /* if we need to return to the start, do it */
68427013            if (seqlast->flags & OPFLAG_RETURN_TO_START)
r31833r31834
68477018               nextpc = seqlast->pc + (seqlast->skipslots + 1) * 4;
68487019
68497020            /* count off cycles and go there */
6850            generate_update_cycles(rsp, block, &compiler, nextpc, TRUE);            // <subtract cycles>
7021            generate_update_cycles(block, &compiler, nextpc, TRUE);            // <subtract cycles>
68517022
68527023            /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */
68537024            if (seqlast->next() == NULL || seqlast->next()->pc != nextpc)
6854               UML_HASHJMP(block, 0, nextpc, *rsp->impstate->nocode);          // hashjmp <mode>,nextpc,nocode
7025               UML_HASHJMP(block, 0, nextpc, *m_nocode);          // hashjmp <mode>,nextpc,nocode
68557026         }
68567027
68577028         /* end the sequence */
r31833r31834
68617032      }
68627033      catch (drcuml_block::abort_compilation &)
68637034      {
6864         code_flush_cache(rsp);
7035         code_flush_cache();
68657036      }
68667037   }
68677038}
r31833r31834
68757046    unimplemented opcdes
68767047-------------------------------------------------*/
68777048
7049inline void rsp_device::ccfunc_unimplemented()
7050{
7051   UINT32 opcode = m_rsp_state->arg0;
7052   fatalerror("PC=%08X: Unimplemented op %08X (%02X,%02X)\n", m_rsp_state->pc, opcode, opcode >> 26, opcode & 0x3f);
7053}
7054
68787055static void cfunc_unimplemented(void *param)
68797056{
6880   rsp_state *rsp = (rsp_state *)param;
6881   UINT32 opcode = rsp->impstate->arg0;
6882   fatalerror("PC=%08X: Unimplemented op %08X (%02X,%02X)\n", rsp->pc, opcode, opcode >> 26, opcode & 0x3f);
7057   ((rsp_device *)param)->ccfunc_unimplemented();
68837058}
68847059
6885
68867060/*-------------------------------------------------
68877061    cfunc_fatalerror - a generic fatalerror call
68887062-------------------------------------------------*/
r31833r31834
69047078    static entry point
69057079-------------------------------------------------*/
69067080
6907static void static_generate_entry_point(rsp_state *rsp)
7081void rsp_device::static_generate_entry_point()
69087082{
6909   drcuml_state *drcuml = rsp->impstate->drcuml;
7083   drcuml_state *drcuml = m_drcuml;
69107084   drcuml_block *block;
69117085
69127086   /* begin generating */
69137087   block = drcuml->begin_block(20);
69147088
69157089   /* forward references */
6916   alloc_handle(drcuml, &rsp->impstate->nocode, "nocode");
7090   alloc_handle(drcuml, &m_nocode, "nocode");
69177091
6918   alloc_handle(drcuml, &rsp->impstate->entry, "entry");
6919   UML_HANDLE(block, *rsp->impstate->entry);                                       // handle  entry
7092   alloc_handle(drcuml, &m_entry, "entry");
7093   UML_HANDLE(block, *m_entry);                                       // handle  entry
69207094
69217095   /* load fast integer registers */
6922   load_fast_iregs(rsp, block);
7096   load_fast_iregs(block);
69237097
69247098   /* generate a hash jump via the current mode and PC */
6925   UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode);                   // hashjmp <mode>,<pc>,nocode
7099   UML_HASHJMP(block, 0, mem(&m_rsp_state->pc), *m_nocode);                   // hashjmp <mode>,<pc>,nocode
69267100   block->end();
69277101}
69287102
r31833r31834
69327106    exception handler for "out of code"
69337107-------------------------------------------------*/
69347108
6935static void static_generate_nocode_handler(rsp_state *rsp)
7109void rsp_device::static_generate_nocode_handler()
69367110{
6937   drcuml_state *drcuml = rsp->impstate->drcuml;
7111   drcuml_state *drcuml = m_drcuml;
69387112   drcuml_block *block;
69397113
69407114   /* begin generating */
69417115   block = drcuml->begin_block(10);
69427116
69437117   /* generate a hash jump via the current mode and PC */
6944   alloc_handle(drcuml, &rsp->impstate->nocode, "nocode");
6945   UML_HANDLE(block, *rsp->impstate->nocode);                                      // handle  nocode
7118   alloc_handle(drcuml, &m_nocode, "nocode");
7119   UML_HANDLE(block, *m_nocode);                                      // handle  nocode
69467120   UML_GETEXP(block, I0);                                                      // getexp  i0
6947   UML_MOV(block, mem(&rsp->pc), I0);                                          // mov     [pc],i0
6948   save_fast_iregs(rsp, block);
7121   UML_MOV(block, mem(&m_rsp_state->pc), I0);                                          // mov     [pc],i0
7122   save_fast_iregs(block);
69497123   UML_EXIT(block, EXECUTE_MISSING_CODE);                                      // exit    EXECUTE_MISSING_CODE
69507124
69517125   block->end();
r31833r31834
69577131    out of cycles exception handler
69587132-------------------------------------------------*/
69597133
6960static void static_generate_out_of_cycles(rsp_state *rsp)
7134void rsp_device::static_generate_out_of_cycles()
69617135{
6962   drcuml_state *drcuml = rsp->impstate->drcuml;
7136   drcuml_state *drcuml = m_drcuml;
69637137   drcuml_block *block;
69647138
69657139   /* begin generating */
69667140   block = drcuml->begin_block(10);
69677141
69687142   /* generate a hash jump via the current mode and PC */
6969   alloc_handle(drcuml, &rsp->impstate->out_of_cycles, "out_of_cycles");
6970   UML_HANDLE(block, *rsp->impstate->out_of_cycles);                               // handle  out_of_cycles
7143   alloc_handle(drcuml, &m_out_of_cycles, "out_of_cycles");
7144   UML_HANDLE(block, *m_out_of_cycles);                               // handle  out_of_cycles
69717145   UML_GETEXP(block, I0);                                                      // getexp  i0
6972   UML_MOV(block, mem(&rsp->pc), I0);                                          // mov     <pc>,i0
6973   save_fast_iregs(rsp, block);
7146   UML_MOV(block, mem(&m_rsp_state->pc), I0);                                          // mov     <pc>,i0
7147   save_fast_iregs(block);
69747148   UML_EXIT(block, EXECUTE_OUT_OF_CYCLES);                                 // exit    EXECUTE_OUT_OF_CYCLES
69757149
69767150   block->end();
r31833r31834
69807154    static_generate_memory_accessor
69817155------------------------------------------------------------------*/
69827156
6983static void static_generate_memory_accessor(rsp_state *rsp, int size, int iswrite, const char *name, code_handle *&handleptr)
7157void rsp_device::static_generate_memory_accessor(int size, int iswrite, const char *name, code_handle *&handleptr)
69847158{
69857159   /* on entry, address is in I0; data for writes is in I1 */
69867160   /* on exit, read result is in I0 */
69877161   /* routine trashes I0-I1 */
6988   drcuml_state *drcuml = rsp->impstate->drcuml;
7162   drcuml_state *drcuml = m_drcuml;
69897163   drcuml_block *block;
69907164
69917165   /* begin generating */
r31833r31834
70007174   {
70017175      if (size == 1)
70027176      {
7003         UML_MOV(block, mem(&rsp->impstate->arg0), I0);              // mov     [arg0],i0 ; address
7004         UML_MOV(block, mem(&rsp->impstate->arg1), I1);              // mov     [arg1],i1 ; data
7005         UML_CALLC(block, cfunc_write8, rsp);                            // callc   cfunc_write8
7177         UML_MOV(block, mem(&m_rsp_state->arg0), I0);              // mov     [arg0],i0 ; address
7178         UML_MOV(block, mem(&m_rsp_state->arg1), I1);              // mov     [arg1],i1 ; data
7179         UML_CALLC(block, cfunc_write8, this);                            // callc   cfunc_write8
70067180      }
70077181      else if (size == 2)
70087182      {
7009         UML_MOV(block, mem(&rsp->impstate->arg0), I0);              // mov     [arg0],i0 ; address
7010         UML_MOV(block, mem(&rsp->impstate->arg1), I1);              // mov     [arg1],i1 ; data
7011         UML_CALLC(block, cfunc_write16, rsp);                           // callc   cfunc_write16
7183         UML_MOV(block, mem(&m_rsp_state->arg0), I0);              // mov     [arg0],i0 ; address
7184         UML_MOV(block, mem(&m_rsp_state->arg1), I1);              // mov     [arg1],i1 ; data
7185         UML_CALLC(block, cfunc_write16, this);                           // callc   cfunc_write16
70127186      }
70137187      else if (size == 4)
70147188      {
7015         UML_MOV(block, mem(&rsp->impstate->arg0), I0);              // mov     [arg0],i0 ; address
7016         UML_MOV(block, mem(&rsp->impstate->arg1), I1);              // mov     [arg1],i1 ; data
7017         UML_CALLC(block, cfunc_write32, rsp);                           // callc   cfunc_write32
7189         UML_MOV(block, mem(&m_rsp_state->arg0), I0);              // mov     [arg0],i0 ; address
7190         UML_MOV(block, mem(&m_rsp_state->arg1), I1);              // mov     [arg1],i1 ; data
7191         UML_CALLC(block, cfunc_write32, this);                           // callc   cfunc_write32
70187192      }
70197193   }
70207194   else
70217195   {
70227196      if (size == 1)
70237197      {
7024         UML_MOV(block, mem(&rsp->impstate->arg0), I0);          // mov     [arg0],i0 ; address
7025         UML_CALLC(block, cfunc_read8, rsp);                         // callc   cfunc_printf_debug
7026         UML_MOV(block, I0, mem(&rsp->impstate->arg0));          // mov     i0,[arg0],i0 ; result
7198         UML_MOV(block, mem(&m_rsp_state->arg0), I0);          // mov     [arg0],i0 ; address
7199         UML_CALLC(block, cfunc_read8, this);                         // callc   cfunc_printf_debug
7200         UML_MOV(block, I0, mem(&m_rsp_state->arg0));          // mov     i0,[arg0],i0 ; result
70277201      }
70287202      else if (size == 2)
70297203      {
7030         UML_MOV(block, mem(&rsp->impstate->arg0), I0);          // mov     [arg0],i0 ; address
7031         UML_CALLC(block, cfunc_read16, rsp);                        // callc   cfunc_read16
7032         UML_MOV(block, I0, mem(&rsp->impstate->arg0));          // mov     i0,[arg0],i0 ; result
7204         UML_MOV(block, mem(&m_rsp_state->arg0), I0);          // mov     [arg0],i0 ; address
7205         UML_CALLC(block, cfunc_read16, this);                        // callc   cfunc_read16
7206         UML_MOV(block, I0, mem(&m_rsp_state->arg0));          // mov     i0,[arg0],i0 ; result
70337207      }
70347208      else if (size == 4)
70357209      {
7036         UML_MOV(block, mem(&rsp->impstate->arg0), I0);          // mov     [arg0],i0 ; address
7037         UML_CALLC(block, cfunc_read32, rsp);                        // callc   cfunc_read32
7038         UML_MOV(block, I0, mem(&rsp->impstate->arg0));          // mov     i0,[arg0],i0 ; result
7210         UML_MOV(block, mem(&m_rsp_state->arg0), I0);          // mov     [arg0],i0 ; address
7211         UML_CALLC(block, cfunc_read32, this);                        // callc   cfunc_read32
7212         UML_MOV(block, I0, mem(&m_rsp_state->arg0));          // mov     i0,[arg0],i0 ; result
70397213      }
70407214   }
70417215   UML_RET(block);
r31833r31834
70547228    subtract cycles from the icount and generate
70557229    an exception if out
70567230-------------------------------------------------*/
7057static void generate_update_cycles(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, parameter param, int allow_exception)
7231void rsp_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, parameter param, int allow_exception)
70587232{
70597233   /* account for cycles */
70607234   if (compiler->cycles > 0)
70617235   {
7062      UML_SUB(block, mem(&rsp->icount), mem(&rsp->icount), MAPVAR_CYCLES);        // sub     icount,icount,cycles
7236      UML_SUB(block, mem(&m_rsp_state->icount), mem(&m_rsp_state->icount), MAPVAR_CYCLES);        // sub     icount,icount,cycles
70637237      UML_MAPVAR(block, MAPVAR_CYCLES, 0);                                        // mapvar  cycles,0
7064      UML_EXHc(block, COND_S, *rsp->impstate->out_of_cycles, param);
7238      UML_EXHc(block, COND_S, *m_out_of_cycles, param);
70657239   }
70667240   compiler->cycles = 0;
70677241}
r31833r31834
70717245    validate a sequence of opcodes
70727246-------------------------------------------------*/
70737247
7074static void generate_checksum_block(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast)
7248void rsp_device::generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast)
70757249{
70767250   const opcode_desc *curdesc;
7077   if (LOG_UML)
7251   if (RSP_LOG_UML)
70787252   {
70797253      block->append_comment("[Validation for %08X]", seqhead->pc | 0x1000);       // comment
70807254   }
70817255   /* loose verify or single instruction: just compare and fail */
7082   if (!(rsp->impstate->drcoptions & RSPDRC_STRICT_VERIFY) || seqhead->next() == NULL)
7256   if (!(m_drcoptions & RSPDRC_STRICT_VERIFY) || seqhead->next() == NULL)
70837257   {
70847258      if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP))
70857259      {
70867260         UINT32 sum = seqhead->opptr.l[0];
7087         void *base = rsp->direct->read_decrypted_ptr(seqhead->physpc | 0x1000);
7261         void *base = m_direct->read_decrypted_ptr(seqhead->physpc | 0x1000);
70887262         UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4);                         // load    i0,base,0,dword
70897263
70907264         if (seqhead->delay.first() != NULL && seqhead->physpc != seqhead->delay.first()->physpc)
70917265         {
7092            base = rsp->direct->read_decrypted_ptr(seqhead->delay.first()->physpc | 0x1000);
7266            base = m_direct->read_decrypted_ptr(seqhead->delay.first()->physpc | 0x1000);
70937267            UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4);                 // load    i1,base,dword
70947268            UML_ADD(block, I0, I0, I1);                     // add     i0,i0,i1
70957269
r31833r31834
70977271         }
70987272
70997273         UML_CMP(block, I0, sum);                                    // cmp     i0,opptr[0]
7100         UML_EXHc(block, COND_NE, *rsp->impstate->nocode, epc(seqhead));     // exne    nocode,seqhead->pc
7274         UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead));     // exne    nocode,seqhead->pc
71017275      }
71027276   }
71037277
r31833r31834
71057279   else
71067280   {
71077281      UINT32 sum = 0;
7108      void *base = rsp->direct->read_decrypted_ptr(seqhead->physpc | 0x1000);
7282      void *base = m_direct->read_decrypted_ptr(seqhead->physpc | 0x1000);
71097283      UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4);                             // load    i0,base,0,dword
71107284      sum += seqhead->opptr.l[0];
71117285      for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
71127286         if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
71137287         {
7114            base = rsp->direct->read_decrypted_ptr(curdesc->physpc | 0x1000);
7288            base = m_direct->read_decrypted_ptr(curdesc->physpc | 0x1000);
71157289            UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4);                     // load    i1,base,dword
71167290            UML_ADD(block, I0, I0, I1);                         // add     i0,i0,i1
71177291            sum += curdesc->opptr.l[0];
71187292
71197293            if (curdesc->delay.first() != NULL && (curdesc == seqlast || (curdesc->next() != NULL && curdesc->next()->physpc != curdesc->delay.first()->physpc)))
71207294            {
7121               base = rsp->direct->read_decrypted_ptr(curdesc->delay.first()->physpc | 0x1000);
7295               base = m_direct->read_decrypted_ptr(curdesc->delay.first()->physpc | 0x1000);
71227296               UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4);                 // load    i1,base,dword
71237297               UML_ADD(block, I0, I0, I1);                     // add     i0,i0,i1
71247298
r31833r31834
71267300            }
71277301         }
71287302      UML_CMP(block, I0, sum);                                            // cmp     i0,sum
7129      UML_EXHc(block, COND_NE, *rsp->impstate->nocode, epc(seqhead));         // exne    nocode,seqhead->pc
7303      UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead));         // exne    nocode,seqhead->pc
71307304   }
71317305}
71327306
r31833r31834
71367310    for a single instruction in a sequence
71377311-------------------------------------------------*/
71387312
7139static void generate_sequence_instruction(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
7313void rsp_device::generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
71407314{
71417315   offs_t expc;
71427316
71437317   /* add an entry for the log */
7144   if (LOG_UML && !(desc->flags & OPFLAG_VIRTUAL_NOOP))
7145      log_add_disasm_comment(rsp, block, desc->pc, desc->opptr.l[0]);
7318   if (RSP_LOG_UML && !(desc->flags & OPFLAG_VIRTUAL_NOOP))
7319      log_add_disasm_comment(block, desc->pc, desc->opptr.l[0]);
71467320
71477321   /* set the PC map variable */
71487322   expc = (desc->flags & OPFLAG_IN_DELAY_SLOT) ? desc->pc - 3 : desc->pc;
r31833r31834
71557329   UML_MAPVAR(block, MAPVAR_CYCLES, compiler->cycles);                             // mapvar  CYCLES,compiler->cycles
71567330
71577331   /* if we are debugging, call the debugger */
7158   if ((rsp->device->machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
7332   if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
71597333   {
7160      UML_MOV(block, mem(&rsp->pc), desc->pc);                                // mov     [pc],desc->pc
7161      save_fast_iregs(rsp, block);
7334      UML_MOV(block, mem(&m_rsp_state->pc), desc->pc);                                // mov     [pc],desc->pc
7335      save_fast_iregs(block);
71627336      UML_DEBUG(block, desc->pc);                                         // debug   desc->pc
71637337   }
71647338
r31833r31834
71667340#if 0
71677341   if (desc->flags & OPFLAG_COMPILER_UNMAPPED)
71687342   {
7169      UML_MOV(block, mem(&rsp->pc), desc->pc);                               // mov     [pc],desc->pc
7170      save_fast_iregs(rsp, block);
7343      UML_MOV(block, mem(&m_rsp_state->pc), desc->pc);                               // mov     [pc],desc->pc
7344      save_fast_iregs(block);
71717345      UML_EXIT(block, EXECUTE_UNMAPPED_CODE);                             // exit EXECUTE_UNMAPPED_CODE
71727346   }
71737347#endif
r31833r31834
71767350   /*else*/ if (!(desc->flags & OPFLAG_VIRTUAL_NOOP))
71777351   {
71787352      /* compile the instruction */
7179      if (!generate_opcode(rsp, block, compiler, desc))
7353      if (!generate_opcode(block, compiler, desc))
71807354      {
7181         UML_MOV(block, mem(&rsp->pc), desc->pc);                            // mov     [pc],desc->pc
7182         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7183         UML_CALLC(block, cfunc_unimplemented, rsp);                             // callc   cfunc_unimplemented
7355         UML_MOV(block, mem(&m_rsp_state->pc), desc->pc);                            // mov     [pc],desc->pc
7356         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7357         UML_CALLC(block, cfunc_unimplemented, this);                             // callc   cfunc_unimplemented
71847358      }
71857359   }
71867360}
r31833r31834
71897363    generate_delay_slot_and_branch
71907364------------------------------------------------------------------*/
71917365
7192static void generate_delay_slot_and_branch(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg)
7366void rsp_device::generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg)
71937367{
71947368   compiler_state compiler_temp = *compiler;
71957369   UINT32 op = desc->opptr.l[0];
r31833r31834
71977371   /* fetch the target register if dynamic, in case it is modified by the delay slot */
71987372   if (desc->targetpc == BRANCH_TARGET_DYNAMIC)
71997373   {
7200      UML_AND(block, mem(&rsp->impstate->jmpdest), R32(RSREG), 0x00000fff);
7201      UML_OR(block, mem(&rsp->impstate->jmpdest), mem(&rsp->impstate->jmpdest), 0x1000);
7374      UML_AND(block, mem(&m_rsp_state->jmpdest), R32(RSREG), 0x00000fff);
7375      UML_OR(block, mem(&m_rsp_state->jmpdest), mem(&m_rsp_state->jmpdest), 0x1000);
72027376   }
72037377
72047378   /* set the link if needed -- before the delay slot */
r31833r31834
72097383
72107384   /* compile the delay slot using temporary compiler state */
72117385   assert(desc->delay.first() != NULL);
7212   generate_sequence_instruction(rsp, block, &compiler_temp, desc->delay.first());     // <next instruction>
7386   generate_sequence_instruction(block, &compiler_temp, desc->delay.first());     // <next instruction>
72137387
72147388   /* update the cycles and jump through the hash table to the target */
72157389   if (desc->targetpc != BRANCH_TARGET_DYNAMIC)
72167390   {
7217      generate_update_cycles(rsp, block, &compiler_temp, desc->targetpc, TRUE);   // <subtract cycles>
7391      generate_update_cycles(block, &compiler_temp, desc->targetpc, TRUE);   // <subtract cycles>
72187392      if (desc->flags & OPFLAG_INTRABLOCK_BRANCH)
72197393         UML_JMP(block, desc->targetpc | 0x80000000);                            // jmp     desc->targetpc
72207394      else
7221         UML_HASHJMP(block, 0, desc->targetpc, *rsp->impstate->nocode);
7395         UML_HASHJMP(block, 0, desc->targetpc, *m_nocode);
72227396                                                               // hashjmp <mode>,desc->targetpc,nocode
72237397   }
72247398   else
72257399   {
7226      generate_update_cycles(rsp, block, &compiler_temp, mem(&rsp->impstate->jmpdest), TRUE);
7400      generate_update_cycles(block, &compiler_temp, mem(&m_rsp_state->jmpdest), TRUE);
72277401                                                               // <subtract cycles>
7228      UML_HASHJMP(block, 0, mem(&rsp->impstate->jmpdest), *rsp->impstate->nocode);
7402      UML_HASHJMP(block, 0, mem(&m_rsp_state->jmpdest), *m_nocode);
72297403                                                               // hashjmp <mode>,<rsreg>,nocode
72307404   }
72317405
r31833r31834
72457419
72467420#if USE_SIMD
72477421
7248static int generate_vector_opcode(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
7422int rsp_device::generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
72497423{
72507424   UINT32 op = desc->opptr.l[0];
72517425   // Opcode legend:
r31833r31834
72577431   switch (op & 0x3f)
72587432   {
72597433      case 0x00:      /* VMULF */
7260         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7261         UML_CALLC(block, cfunc_rsp_vmulf_simd, rsp);
7434         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7435         UML_CALLC(block, cfunc_rsp_vmulf_simd, this);
72627436#if SIMUL_SIMD
7263         UML_CALLC(block, cfunc_backup_regs, rsp);
7264         UML_CALLC(block, cfunc_rsp_vmulf_scalar, rsp);
7265         UML_CALLC(block, cfunc_restore_regs, rsp);
7266         UML_CALLC(block, cfunc_verify_regs, rsp);
7437         UML_CALLC(block, cfunc_backup_regs, this);
7438         UML_CALLC(block, cfunc_rsp_vmulf_scalar, this);
7439         UML_CALLC(block, cfunc_restore_regs, this);
7440         UML_CALLC(block, cfunc_verify_regs, this);
72677441#endif
72687442         return TRUE;
72697443
72707444      case 0x01:      /* VMULU */
7271         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7272         UML_CALLC(block, cfunc_rsp_vmulu_simd, rsp);
7445         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7446         UML_CALLC(block, cfunc_rsp_vmulu_simd, this);
72737447#if SIMUL_SIMD
7274         UML_CALLC(block, cfunc_backup_regs, rsp);
7275         UML_CALLC(block, cfunc_rsp_vmulu_scalar, rsp);
7276         UML_CALLC(block, cfunc_restore_regs, rsp);
7277         UML_CALLC(block, cfunc_verify_regs, rsp);
7448         UML_CALLC(block, cfunc_backup_regs, this);
7449         UML_CALLC(block, cfunc_rsp_vmulu_scalar, this);
7450         UML_CALLC(block, cfunc_restore_regs, this);
7451         UML_CALLC(block, cfunc_verify_regs, this);
72787452#endif
72797453         return TRUE;
72807454
72817455      case 0x04:      /* VMUDL */
7282         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7283         UML_CALLC(block, cfunc_rsp_vmudl_simd, rsp);
7456         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7457         UML_CALLC(block, cfunc_rsp_vmudl_simd, this);
72847458#if SIMUL_SIMD
7285         UML_CALLC(block, cfunc_backup_regs, rsp);
7286         UML_CALLC(block, cfunc_rsp_vmudl_scalar, rsp);
7287         UML_CALLC(block, cfunc_restore_regs, rsp);
7288         UML_CALLC(block, cfunc_verify_regs, rsp);
7459         UML_CALLC(block, cfunc_backup_regs, this);
7460         UML_CALLC(block, cfunc_rsp_vmudl_scalar, this);
7461         UML_CALLC(block, cfunc_restore_regs, this);
7462         UML_CALLC(block, cfunc_verify_regs, this);
72897463#endif
72907464         return TRUE;
72917465
72927466      case 0x05:      /* VMUDM */
7293         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7294         UML_CALLC(block, cfunc_rsp_vmudm_simd, rsp);
7467         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7468         UML_CALLC(block, cfunc_rsp_vmudm_simd, this);
72957469#if SIMUL_SIMD
7296         UML_CALLC(block, cfunc_backup_regs, rsp);
7297         UML_CALLC(block, cfunc_rsp_vmudm_scalar, rsp);
7298         UML_CALLC(block, cfunc_restore_regs, rsp);
7299         UML_CALLC(block, cfunc_verify_regs, rsp);
7470         UML_CALLC(block, cfunc_backup_regs, this);
7471         UML_CALLC(block, cfunc_rsp_vmudm_scalar, this);
7472         UML_CALLC(block, cfunc_restore_regs, this);
7473         UML_CALLC(block, cfunc_verify_regs, this);
73007474#endif
73017475         return TRUE;
73027476
73037477      case 0x06:      /* VMUDN */
7304         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7305         UML_CALLC(block, cfunc_rsp_vmudn_simd, rsp);
7478         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7479         UML_CALLC(block, cfunc_rsp_vmudn_simd, this);
73067480#if SIMUL_SIMD
7307         UML_CALLC(block, cfunc_backup_regs, rsp);
7308         UML_CALLC(block, cfunc_rsp_vmudn_scalar, rsp);
7309         UML_CALLC(block, cfunc_restore_regs, rsp);
7310         UML_CALLC(block, cfunc_verify_regs, rsp);
7481         UML_CALLC(block, cfunc_backup_regs, this);
7482         UML_CALLC(block, cfunc_rsp_vmudn_scalar, this);
7483         UML_CALLC(block, cfunc_restore_regs, this);
7484         UML_CALLC(block, cfunc_verify_regs, this);
73117485#endif
73127486         return TRUE;
73137487
73147488      case 0x07:      /* VMUDH */
7315         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7316         UML_CALLC(block, cfunc_rsp_vmudh_simd, rsp);
7489         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7490         UML_CALLC(block, cfunc_rsp_vmudh_simd, this);
73177491#if SIMUL_SIMD
7318         UML_CALLC(block, cfunc_backup_regs, rsp);
7319         UML_CALLC(block, cfunc_rsp_vmudh_scalar, rsp);
7320         UML_CALLC(block, cfunc_restore_regs, rsp);
7321         UML_CALLC(block, cfunc_verify_regs, rsp);
7492         UML_CALLC(block, cfunc_backup_regs, this);
7493         UML_CALLC(block, cfunc_rsp_vmudh_scalar, this);
7494         UML_CALLC(block, cfunc_restore_regs, this);
7495         UML_CALLC(block, cfunc_verify_regs, this);
73227496#endif
73237497         return TRUE;
73247498
73257499      case 0x08:      /* VMACF */
7326         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7327         UML_CALLC(block, cfunc_rsp_vmacf_simd, rsp);
7500         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7501         UML_CALLC(block, cfunc_rsp_vmacf_simd, this);
73287502#if SIMUL_SIMD
7329         UML_CALLC(block, cfunc_backup_regs, rsp);
7330         UML_CALLC(block, cfunc_rsp_vmacf_scalar, rsp);
7331         UML_CALLC(block, cfunc_restore_regs, rsp);
7332         UML_CALLC(block, cfunc_verify_regs, rsp);
7503         UML_CALLC(block, cfunc_backup_regs, this);
7504         UML_CALLC(block, cfunc_rsp_vmacf_scalar, this);
7505         UML_CALLC(block, cfunc_restore_regs, this);
7506         UML_CALLC(block, cfunc_verify_regs, this);
73337507#endif
73347508         return TRUE;
73357509
73367510      case 0x09:      /* VMACU */
7337         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7338         UML_CALLC(block, cfunc_rsp_vmacu_simd, rsp);
7511         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7512         UML_CALLC(block, cfunc_rsp_vmacu_simd, this);
73397513#if SIMUL_SIMD
7340         UML_CALLC(block, cfunc_backup_regs, rsp);
7341         UML_CALLC(block, cfunc_rsp_vmacu_scalar, rsp);
7342         UML_CALLC(block, cfunc_restore_regs, rsp);
7343         UML_CALLC(block, cfunc_verify_regs, rsp);
7514         UML_CALLC(block, cfunc_backup_regs, this);
7515         UML_CALLC(block, cfunc_rsp_vmacu_scalar, this);
7516         UML_CALLC(block, cfunc_restore_regs, this);
7517         UML_CALLC(block, cfunc_verify_regs, this);
73447518#endif
73457519         return TRUE;
73467520
73477521      case 0x0c:      /* VMADL */
7348         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7349         UML_CALLC(block, cfunc_rsp_vmadl_simd, rsp);
7522         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7523         UML_CALLC(block, cfunc_rsp_vmadl_simd, this);
73507524#if SIMUL_SIMD
7351         UML_CALLC(block, cfunc_backup_regs, rsp);
7352         UML_CALLC(block, cfunc_rsp_vmadl_scalar, rsp);
7353         UML_CALLC(block, cfunc_restore_regs, rsp);
7354         UML_CALLC(block, cfunc_verify_regs, rsp);
7525         UML_CALLC(block, cfunc_backup_regs, this);
7526         UML_CALLC(block, cfunc_rsp_vmadl_scalar, this);
7527         UML_CALLC(block, cfunc_restore_regs, this);
7528         UML_CALLC(block, cfunc_verify_regs, this);
73557529#endif
73567530         return TRUE;
73577531
73587532      case 0x0d:      /* VMADM */
7359         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7360         UML_CALLC(block, cfunc_rsp_vmadm_simd, rsp);
7533         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7534         UML_CALLC(block, cfunc_rsp_vmadm_simd, this);
73617535#if SIMUL_SIMD
7362         UML_CALLC(block, cfunc_backup_regs, rsp);
7363         UML_CALLC(block, cfunc_rsp_vmadm_scalar, rsp);
7364         UML_CALLC(block, cfunc_restore_regs, rsp);
7365         UML_CALLC(block, cfunc_verify_regs, rsp);
7536         UML_CALLC(block, cfunc_backup_regs, this);
7537         UML_CALLC(block, cfunc_rsp_vmadm_scalar, this);
7538         UML_CALLC(block, cfunc_restore_regs, this);
7539         UML_CALLC(block, cfunc_verify_regs, this);
73667540#endif
73677541         return TRUE;
73687542
73697543      case 0x0e:      /* VMADN */
7370         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7371         UML_CALLC(block, cfunc_rsp_vmadn_simd, rsp);
7544         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7545         UML_CALLC(block, cfunc_rsp_vmadn_simd, this);
73727546#if SIMUL_SIMD
7373         UML_CALLC(block, cfunc_backup_regs, rsp);
7374         UML_CALLC(block, cfunc_rsp_vmadn_scalar, rsp);
7375         UML_CALLC(block, cfunc_restore_regs, rsp);
7376         UML_CALLC(block, cfunc_verify_regs, rsp);
7547         UML_CALLC(block, cfunc_backup_regs, this);
7548         UML_CALLC(block, cfunc_rsp_vmadn_scalar, this);
7549         UML_CALLC(block, cfunc_restore_regs, this);
7550         UML_CALLC(block, cfunc_verify_regs, this);
73777551#endif
73787552         return TRUE;
73797553
73807554      case 0x0f:      /* VMADH */
7381         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7382         UML_CALLC(block, cfunc_rsp_vmadh_simd, rsp);
7555         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7556         UML_CALLC(block, cfunc_rsp_vmadh_simd, this);
73837557#if SIMUL_SIMD
7384         UML_CALLC(block, cfunc_backup_regs, rsp);
7385         UML_CALLC(block, cfunc_rsp_vmadh_scalar, rsp);
7386         UML_CALLC(block, cfunc_restore_regs, rsp);
7387         UML_CALLC(block, cfunc_verify_regs, rsp);
7558         UML_CALLC(block, cfunc_backup_regs, this);
7559         UML_CALLC(block, cfunc_rsp_vmadh_scalar, this);
7560         UML_CALLC(block, cfunc_restore_regs, this);
7561         UML_CALLC(block, cfunc_verify_regs, this);
73887562#endif
73897563         return TRUE;
73907564
73917565      case 0x10:      /* VADD */
7392         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7393         UML_CALLC(block, cfunc_rsp_vadd_simd, rsp);
7566         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7567         UML_CALLC(block, cfunc_rsp_vadd_simd, this);
73947568#if SIMUL_SIMD
7395         UML_CALLC(block, cfunc_backup_regs, rsp);
7396         UML_CALLC(block, cfunc_rsp_vadd_scalar, rsp);
7397         UML_CALLC(block, cfunc_restore_regs, rsp);
7398         UML_CALLC(block, cfunc_verify_regs, rsp);
7569         UML_CALLC(block, cfunc_backup_regs, this);
7570         UML_CALLC(block, cfunc_rsp_vadd_scalar, this);
7571         UML_CALLC(block, cfunc_restore_regs, this);
7572         UML_CALLC(block, cfunc_verify_regs, this);
73997573#endif
74007574         return TRUE;
74017575
74027576      case 0x11:      /* VSUB */
7403         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7404         UML_CALLC(block, cfunc_rsp_vsub_simd, rsp);
7577         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7578         UML_CALLC(block, cfunc_rsp_vsub_simd, this);
74057579#if SIMUL_SIMD
7406         UML_CALLC(block, cfunc_backup_regs, rsp);
7407         UML_CALLC(block, cfunc_rsp_vsub_scalar, rsp);
7408         UML_CALLC(block, cfunc_restore_regs, rsp);
7409         UML_CALLC(block, cfunc_verify_regs, rsp);
7580         UML_CALLC(block, cfunc_backup_regs, this);
7581         UML_CALLC(block, cfunc_rsp_vsub_scalar, this);
7582         UML_CALLC(block, cfunc_restore_regs, this);
7583         UML_CALLC(block, cfunc_verify_regs, this);
74107584#endif
74117585         return TRUE;
74127586
74137587      case 0x13:      /* VABS */
7414         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7415         UML_CALLC(block, cfunc_rsp_vabs_simd, rsp);
7588         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7589         UML_CALLC(block, cfunc_rsp_vabs_simd, this);
74167590#if SIMUL_SIMD
7417         UML_CALLC(block, cfunc_backup_regs, rsp);
7418         UML_CALLC(block, cfunc_rsp_vabs_scalar, rsp);
7419         UML_CALLC(block, cfunc_restore_regs, rsp);
7420         UML_CALLC(block, cfunc_verify_regs, rsp);
7591         UML_CALLC(block, cfunc_backup_regs, this);
7592         UML_CALLC(block, cfunc_rsp_vabs_scalar, this);
7593         UML_CALLC(block, cfunc_restore_regs, this);
7594         UML_CALLC(block, cfunc_verify_regs, this);
74217595#endif
74227596         return TRUE;
74237597
74247598      case 0x14:      /* VADDC */
7425         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7426         UML_CALLC(block, cfunc_rsp_vaddc_simd, rsp);
7599         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7600         UML_CALLC(block, cfunc_rsp_vaddc_simd, this);
74277601#if SIMUL_SIMD
7428         UML_CALLC(block, cfunc_backup_regs, rsp);
7429         UML_CALLC(block, cfunc_rsp_vaddc_scalar, rsp);
7430         UML_CALLC(block, cfunc_restore_regs, rsp);
7431         UML_CALLC(block, cfunc_verify_regs, rsp);
7602         UML_CALLC(block, cfunc_backup_regs, this);
7603         UML_CALLC(block, cfunc_rsp_vaddc_scalar, this);
7604         UML_CALLC(block, cfunc_restore_regs, this);
7605         UML_CALLC(block, cfunc_verify_regs, this);
74327606#endif
74337607         return TRUE;
74347608
74357609      case 0x15:      /* VSUBC */
7436         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7437         UML_CALLC(block, cfunc_rsp_vsubc_simd, rsp);
7610         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7611         UML_CALLC(block, cfunc_rsp_vsubc_simd, this);
74387612#if SIMUL_SIMD
7439         UML_CALLC(block, cfunc_backup_regs, rsp);
7440         UML_CALLC(block, cfunc_rsp_vsubc_scalar, rsp);
7441         UML_CALLC(block, cfunc_restore_regs, rsp);
7442         UML_CALLC(block, cfunc_verify_regs, rsp);
7613         UML_CALLC(block, cfunc_backup_regs, this);
7614         UML_CALLC(block, cfunc_rsp_vsubc_scalar, this);
7615         UML_CALLC(block, cfunc_restore_regs, this);
7616         UML_CALLC(block, cfunc_verify_regs, this);
74437617#endif
74447618         return TRUE;
74457619
74467620      case 0x1d:      /* VSAW */
7447         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7448         UML_CALLC(block, cfunc_rsp_vsaw_simd, rsp);
7621         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7622         UML_CALLC(block, cfunc_rsp_vsaw_simd, this);
74497623#if SIMUL_SIMD
7450         UML_CALLC(block, cfunc_backup_regs, rsp);
7451         UML_CALLC(block, cfunc_rsp_vsaw_scalar, rsp);
7452         UML_CALLC(block, cfunc_restore_regs, rsp);
7453         UML_CALLC(block, cfunc_verify_regs, rsp);
7624         UML_CALLC(block, cfunc_backup_regs, this);
7625         UML_CALLC(block, cfunc_rsp_vsaw_scalar, this);
7626         UML_CALLC(block, cfunc_restore_regs, this);
7627         UML_CALLC(block, cfunc_verify_regs, this);
74547628#endif
74557629         return TRUE;
74567630
74577631      case 0x20:      /* VLT */
7458         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7459         UML_CALLC(block, cfunc_rsp_vlt_simd, rsp);
7632         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7633         UML_CALLC(block, cfunc_rsp_vlt_simd, this);
74607634#if SIMUL_SIMD
7461         UML_CALLC(block, cfunc_backup_regs, rsp);
7462         UML_CALLC(block, cfunc_rsp_vlt_scalar, rsp);
7463         UML_CALLC(block, cfunc_restore_regs, rsp);
7464         UML_CALLC(block, cfunc_verify_regs, rsp);
7635         UML_CALLC(block, cfunc_backup_regs, this);
7636         UML_CALLC(block, cfunc_rsp_vlt_scalar, this);
7637         UML_CALLC(block, cfunc_restore_regs, this);
7638         UML_CALLC(block, cfunc_verify_regs, this);
74657639#endif
74667640         return TRUE;
74677641
74687642      case 0x21:      /* VEQ */
7469         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7470         UML_CALLC(block, cfunc_rsp_veq_simd, rsp);
7643         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7644         UML_CALLC(block, cfunc_rsp_veq_simd, this);
74717645#if SIMUL_SIMD
7472         UML_CALLC(block, cfunc_backup_regs, rsp);
7473         UML_CALLC(block, cfunc_rsp_veq_scalar, rsp);
7474         UML_CALLC(block, cfunc_restore_regs, rsp);
7475         UML_CALLC(block, cfunc_verify_regs, rsp);
7646         UML_CALLC(block, cfunc_backup_regs, this);
7647         UML_CALLC(block, cfunc_rsp_veq_scalar, this);
7648         UML_CALLC(block, cfunc_restore_regs, this);
7649         UML_CALLC(block, cfunc_verify_regs, this);
74767650#endif
74777651         return TRUE;
74787652
74797653      case 0x22:      /* VNE */
7480         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7481         UML_CALLC(block, cfunc_rsp_vne_simd, rsp);
7654         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7655         UML_CALLC(block, cfunc_rsp_vne_simd, this);
74827656#if SIMUL_SIMD
7483         UML_CALLC(block, cfunc_backup_regs, rsp);
7484         UML_CALLC(block, cfunc_rsp_vne_scalar, rsp);
7485         UML_CALLC(block, cfunc_restore_regs, rsp);
7486         UML_CALLC(block, cfunc_verify_regs, rsp);
7657         UML_CALLC(block, cfunc_backup_regs, this);
7658         UML_CALLC(block, cfunc_rsp_vne_scalar, this);
7659         UML_CALLC(block, cfunc_restore_regs, this);
7660         UML_CALLC(block, cfunc_verify_regs, this);
74877661#endif
74887662         return TRUE;
74897663
74907664      case 0x23:      /* VGE */
7491         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7492         UML_CALLC(block, cfunc_rsp_vge_simd, rsp);
7665         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7666         UML_CALLC(block, cfunc_rsp_vge_simd, this);
74937667#if SIMUL_SIMD
7494         UML_CALLC(block, cfunc_backup_regs, rsp);
7495         UML_CALLC(block, cfunc_rsp_vge_scalar, rsp);
7496         UML_CALLC(block, cfunc_restore_regs, rsp);
7497         UML_CALLC(block, cfunc_verify_regs, rsp);
7668         UML_CALLC(block, cfunc_backup_regs, this);
7669         UML_CALLC(block, cfunc_rsp_vge_scalar, this);
7670         UML_CALLC(block, cfunc_restore_regs, this);
7671         UML_CALLC(block, cfunc_verify_regs, this);
74987672#endif
74997673         return TRUE;
75007674
75017675      case 0x24:      /* VCL */
7502         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7503         UML_CALLC(block, cfunc_rsp_vcl_simd, rsp);
7676         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7677         UML_CALLC(block, cfunc_rsp_vcl_simd, this);
75047678#if SIMUL_SIMD
7505         UML_CALLC(block, cfunc_backup_regs, rsp);
7506         UML_CALLC(block, cfunc_rsp_vcl_scalar, rsp);
7507         UML_CALLC(block, cfunc_restore_regs, rsp);
7508         UML_CALLC(block, cfunc_verify_regs, rsp);
7679         UML_CALLC(block, cfunc_backup_regs, this);
7680         UML_CALLC(block, cfunc_rsp_vcl_scalar, this);
7681         UML_CALLC(block, cfunc_restore_regs, this);
7682         UML_CALLC(block, cfunc_verify_regs, this);
75097683#endif
75107684         return TRUE;
75117685
75127686      case 0x25:      /* VCH */
7513         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7514         UML_CALLC(block, cfunc_rsp_vch_simd, rsp);
7687         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7688         UML_CALLC(block, cfunc_rsp_vch_simd, this);
75157689#if SIMUL_SIMD
7516         UML_CALLC(block, cfunc_backup_regs, rsp);
7517         UML_CALLC(block, cfunc_rsp_vch_scalar, rsp);
7518         UML_CALLC(block, cfunc_restore_regs, rsp);
7519         UML_CALLC(block, cfunc_verify_regs, rsp);
7690         UML_CALLC(block, cfunc_backup_regs, this);
7691         UML_CALLC(block, cfunc_rsp_vch_scalar, this);
7692         UML_CALLC(block, cfunc_restore_regs, this);
7693         UML_CALLC(block, cfunc_verify_regs, this);
75207694#endif
75217695         return TRUE;
75227696
75237697      case 0x26:      /* VCR */
7524         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7525         UML_CALLC(block, cfunc_rsp_vcr_simd, rsp);
7698         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7699         UML_CALLC(block, cfunc_rsp_vcr_simd, this);
75267700#if SIMUL_SIMD
7527         UML_CALLC(block, cfunc_backup_regs, rsp);
7528         UML_CALLC(block, cfunc_rsp_vcr_scalar, rsp);
7529         UML_CALLC(block, cfunc_restore_regs, rsp);
7530         UML_CALLC(block, cfunc_verify_regs, rsp);
7701         UML_CALLC(block, cfunc_backup_regs, this);
7702         UML_CALLC(block, cfunc_rsp_vcr_scalar, this);
7703         UML_CALLC(block, cfunc_restore_regs, this);
7704         UML_CALLC(block, cfunc_verify_regs, this);
75317705#endif
75327706         return TRUE;
75337707
75347708      case 0x27:      /* VMRG */
7535         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7536         UML_CALLC(block, cfunc_rsp_vmrg_simd, rsp);
7709         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7710         UML_CALLC(block, cfunc_rsp_vmrg_simd, this);
75377711#if SIMUL_SIMD
7538         UML_CALLC(block, cfunc_backup_regs, rsp);
7539         UML_CALLC(block, cfunc_rsp_vmrg_scalar, rsp);
7540         UML_CALLC(block, cfunc_restore_regs, rsp);
7541         UML_CALLC(block, cfunc_verify_regs, rsp);
7712         UML_CALLC(block, cfunc_backup_regs, this);
7713         UML_CALLC(block, cfunc_rsp_vmrg_scalar, this);
7714         UML_CALLC(block, cfunc_restore_regs, this);
7715         UML_CALLC(block, cfunc_verify_regs, this);
75427716#endif
75437717         return TRUE;
75447718
75457719      case 0x28:      /* VAND */
7546         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7547         UML_CALLC(block, cfunc_rsp_vand_simd, rsp);
7720         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7721         UML_CALLC(block, cfunc_rsp_vand_simd, this);
75487722#if SIMUL_SIMD
7549         UML_CALLC(block, cfunc_backup_regs, rsp);
7550         UML_CALLC(block, cfunc_rsp_vand_scalar, rsp);
7551         UML_CALLC(block, cfunc_restore_regs, rsp);
7552         UML_CALLC(block, cfunc_verify_regs, rsp);
7723         UML_CALLC(block, cfunc_backup_regs, this);
7724         UML_CALLC(block, cfunc_rsp_vand_scalar, this);
7725         UML_CALLC(block, cfunc_restore_regs, this);
7726         UML_CALLC(block, cfunc_verify_regs, this);
75537727#endif
75547728         return TRUE;
75557729
75567730      case 0x29:      /* VNAND */
7557         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7558         UML_CALLC(block, cfunc_rsp_vnand_simd, rsp);
7731         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7732         UML_CALLC(block, cfunc_rsp_vnand_simd, this);
75597733#if SIMUL_SIMD
7560         UML_CALLC(block, cfunc_backup_regs, rsp);
7561         UML_CALLC(block, cfunc_rsp_vnand_scalar, rsp);
7562         UML_CALLC(block, cfunc_restore_regs, rsp);
7563         UML_CALLC(block, cfunc_verify_regs, rsp);
7734         UML_CALLC(block, cfunc_backup_regs, this);
7735         UML_CALLC(block, cfunc_rsp_vnand_scalar, this);
7736         UML_CALLC(block, cfunc_restore_regs, this);
7737         UML_CALLC(block, cfunc_verify_regs, this);
75647738#endif
75657739         return TRUE;
75667740
75677741      case 0x2a:      /* VOR */
7568         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7569         UML_CALLC(block, cfunc_rsp_vor_simd, rsp);
7742         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7743         UML_CALLC(block, cfunc_rsp_vor_simd, this);
75707744#if SIMUL_SIMD
7571         UML_CALLC(block, cfunc_backup_regs, rsp);
7572         UML_CALLC(block, cfunc_rsp_vor_scalar, rsp);
7573         UML_CALLC(block, cfunc_restore_regs, rsp);
7574         UML_CALLC(block, cfunc_verify_regs, rsp);
7745         UML_CALLC(block, cfunc_backup_regs, this);
7746         UML_CALLC(block, cfunc_rsp_vor_scalar, this);
7747         UML_CALLC(block, cfunc_restore_regs, this);
7748         UML_CALLC(block, cfunc_verify_regs, this);
75757749#endif
75767750         return TRUE;
75777751
75787752      case 0x2b:      /* VNOR */
7579         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7580         UML_CALLC(block, cfunc_rsp_vnor_simd, rsp);
7753         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7754         UML_CALLC(block, cfunc_rsp_vnor_simd, this);
75817755#if SIMUL_SIMD
7582         UML_CALLC(block, cfunc_backup_regs, rsp);
7583         UML_CALLC(block, cfunc_rsp_vnor_scalar, rsp);
7584         UML_CALLC(block, cfunc_restore_regs, rsp);
7585         UML_CALLC(block, cfunc_verify_regs, rsp);
7756         UML_CALLC(block, cfunc_backup_regs, this);
7757         UML_CALLC(block, cfunc_rsp_vnor_scalar, this);
7758         UML_CALLC(block, cfunc_restore_regs, this);
7759         UML_CALLC(block, cfunc_verify_regs, this);
75867760#endif
75877761         return TRUE;
75887762
75897763      case 0x2c:      /* VXOR */
7590         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7591         UML_CALLC(block, cfunc_rsp_vxor_simd, rsp);
7764         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7765         UML_CALLC(block, cfunc_rsp_vxor_simd, this);
75927766#if SIMUL_SIMD
7593         UML_CALLC(block, cfunc_backup_regs, rsp);
7594         UML_CALLC(block, cfunc_rsp_vxor_scalar, rsp);
7595         UML_CALLC(block, cfunc_restore_regs, rsp);
7596         UML_CALLC(block, cfunc_verify_regs, rsp);
7767         UML_CALLC(block, cfunc_backup_regs, this);
7768         UML_CALLC(block, cfunc_rsp_vxor_scalar, this);
7769         UML_CALLC(block, cfunc_restore_regs, this);
7770         UML_CALLC(block, cfunc_verify_regs, this);
75977771#endif
75987772         return TRUE;
75997773
76007774      case 0x2d:      /* VNXOR */
7601         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7602         UML_CALLC(block, cfunc_rsp_vnxor_simd, rsp);
7775         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7776         UML_CALLC(block, cfunc_rsp_vnxor_simd, this);
76037777#if SIMUL_SIMD
7604         UML_CALLC(block, cfunc_backup_regs, rsp);
7605         UML_CALLC(block, cfunc_rsp_vnxor_scalar, rsp);
7606         UML_CALLC(block, cfunc_restore_regs, rsp);
7607         UML_CALLC(block, cfunc_verify_regs, rsp);
7778         UML_CALLC(block, cfunc_backup_regs, this);
7779         UML_CALLC(block, cfunc_rsp_vnxor_scalar, this);
7780         UML_CALLC(block, cfunc_restore_regs, this);
7781         UML_CALLC(block, cfunc_verify_regs, this);
76087782#endif
76097783         return TRUE;
76107784
76117785      case 0x30:      /* VRCP */
7612         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7613         UML_CALLC(block, cfunc_rsp_vrcp_simd, rsp);
7786         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7787         UML_CALLC(block, cfunc_rsp_vrcp_simd, this);
76147788#if SIMUL_SIMD
7615         UML_CALLC(block, cfunc_backup_regs, rsp);
7616         UML_CALLC(block, cfunc_rsp_vrcp_scalar, rsp);
7617         UML_CALLC(block, cfunc_restore_regs, rsp);
7618         UML_CALLC(block, cfunc_verify_regs, rsp);
7789         UML_CALLC(block, cfunc_backup_regs, this);
7790         UML_CALLC(block, cfunc_rsp_vrcp_scalar, this);
7791         UML_CALLC(block, cfunc_restore_regs, this);
7792         UML_CALLC(block, cfunc_verify_regs, this);
76197793#endif
76207794         return TRUE;
76217795
76227796      case 0x31:      /* VRCPL */
7623         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7624         UML_CALLC(block, cfunc_rsp_vrcpl_simd, rsp);
7797         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7798         UML_CALLC(block, cfunc_rsp_vrcpl_simd, this);
76257799#if SIMUL_SIMD
7626         UML_CALLC(block, cfunc_backup_regs, rsp);
7627         UML_CALLC(block, cfunc_rsp_vrcpl_scalar, rsp);
7628         UML_CALLC(block, cfunc_restore_regs, rsp);
7629         UML_CALLC(block, cfunc_verify_regs, rsp);
7800         UML_CALLC(block, cfunc_backup_regs, this);
7801         UML_CALLC(block, cfunc_rsp_vrcpl_scalar, this);
7802         UML_CALLC(block, cfunc_restore_regs, this);
7803         UML_CALLC(block, cfunc_verify_regs, this);
76307804#endif
76317805         return TRUE;
76327806
76337807      case 0x32:      /* VRCPH */
7634         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7635         UML_CALLC(block, cfunc_rsp_vrcph_simd, rsp);
7808         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7809         UML_CALLC(block, cfunc_rsp_vrcph_simd, this);
76367810#if SIMUL_SIMD
7637         UML_CALLC(block, cfunc_backup_regs, rsp);
7638         UML_CALLC(block, cfunc_rsp_vrcph_scalar, rsp);
7639         UML_CALLC(block, cfunc_restore_regs, rsp);
7640         UML_CALLC(block, cfunc_verify_regs, rsp);
7811         UML_CALLC(block, cfunc_backup_regs, this);
7812         UML_CALLC(block, cfunc_rsp_vrcph_scalar, this);
7813         UML_CALLC(block, cfunc_restore_regs, this);
7814         UML_CALLC(block, cfunc_verify_regs, this);
76417815#endif
76427816         return TRUE;
76437817
76447818      case 0x33:      /* VMOV */
7645         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7646         UML_CALLC(block, cfunc_rsp_vmov_simd, rsp);
7819         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7820         UML_CALLC(block, cfunc_rsp_vmov_simd, this);
76477821#if SIMUL_SIMD
7648         UML_CALLC(block, cfunc_backup_regs, rsp);
7649         UML_CALLC(block, cfunc_rsp_vmov_scalar, rsp);
7650         UML_CALLC(block, cfunc_restore_regs, rsp);
7651         UML_CALLC(block, cfunc_verify_regs, rsp);
7822         UML_CALLC(block, cfunc_backup_regs, this);
7823         UML_CALLC(block, cfunc_rsp_vmov_scalar, this);
7824         UML_CALLC(block, cfunc_restore_regs, this);
7825         UML_CALLC(block, cfunc_verify_regs, this);
76527826#endif
76537827         return TRUE;
76547828
76557829      case 0x35:      /* VRSQL */
7656         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7657         UML_CALLC(block, cfunc_rsp_vrsql_simd, rsp);
7830         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7831         UML_CALLC(block, cfunc_rsp_vrsql_simd, this);
76587832#if SIMUL_SIMD
7659         UML_CALLC(block, cfunc_backup_regs, rsp);
7660         UML_CALLC(block, cfunc_rsp_vrsql_scalar, rsp);
7661         UML_CALLC(block, cfunc_restore_regs, rsp);
7662         UML_CALLC(block, cfunc_verify_regs, rsp);
7833         UML_CALLC(block, cfunc_backup_regs, this);
7834         UML_CALLC(block, cfunc_rsp_vrsql_scalar, this);
7835         UML_CALLC(block, cfunc_restore_regs, this);
7836         UML_CALLC(block, cfunc_verify_regs, this);
76637837#endif
76647838         return TRUE;
76657839
76667840      case 0x36:      /* VRSQH */
7667         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7668         UML_CALLC(block, cfunc_rsp_vrsqh_simd, rsp);
7841         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7842         UML_CALLC(block, cfunc_rsp_vrsqh_simd, this);
76697843#if SIMUL_SIMD
7670         UML_CALLC(block, cfunc_backup_regs, rsp);
7671         UML_CALLC(block, cfunc_rsp_vrsqh_scalar, rsp);
7672         UML_CALLC(block, cfunc_restore_regs, rsp);
7673         UML_CALLC(block, cfunc_verify_regs, rsp);
7844         UML_CALLC(block, cfunc_backup_regs, this);
7845         UML_CALLC(block, cfunc_rsp_vrsqh_scalar, this);
7846         UML_CALLC(block, cfunc_restore_regs, this);
7847         UML_CALLC(block, cfunc_verify_regs, this);
76747848#endif
76757849         return TRUE;
76767850
76777851      default:
7678         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7679         UML_CALLC(block, cfunc_unimplemented_opcode, rsp);
7852         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7853         UML_CALLC(block, cfunc_unimplemented_opcode, this);
76807854         return FALSE;
76817855   }
76827856}
76837857
76847858#else
76857859
7686static int generate_vector_opcode(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
7860int rsp_device::generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
76877861{
76887862   UINT32 op = desc->opptr.l[0];
76897863   // Opcode legend:
r31833r31834
76957869   switch (op & 0x3f)
76967870   {
76977871      case 0x00:      /* VMULF */
7698         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7699         UML_CALLC(block, cfunc_rsp_vmulf_scalar, rsp);
7872         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7873         UML_CALLC(block, cfunc_rsp_vmulf_scalar, this);
77007874         return TRUE;
77017875
77027876      case 0x01:      /* VMULU */
7703         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7704         UML_CALLC(block, cfunc_rsp_vmulu_scalar, rsp);
7877         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7878         UML_CALLC(block, cfunc_rsp_vmulu_scalar, this);
77057879         return TRUE;
77067880
77077881      case 0x04:      /* VMUDL */
7708         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7709         UML_CALLC(block, cfunc_rsp_vmudl_scalar, rsp);
7882         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7883         UML_CALLC(block, cfunc_rsp_vmudl_scalar, this);
77107884         return TRUE;
77117885
77127886      case 0x05:      /* VMUDM */
7713         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7714         UML_CALLC(block, cfunc_rsp_vmudm_scalar, rsp);
7887         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7888         UML_CALLC(block, cfunc_rsp_vmudm_scalar, this);
77157889         return TRUE;
77167890
77177891      case 0x06:      /* VMUDN */
7718         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7719         UML_CALLC(block, cfunc_rsp_vmudn_scalar, rsp);
7892         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7893         UML_CALLC(block, cfunc_rsp_vmudn_scalar, this);
77207894         return TRUE;
77217895
77227896      case 0x07:      /* VMUDH */
7723         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7724         UML_CALLC(block, cfunc_rsp_vmudh_scalar, rsp);
7897         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7898         UML_CALLC(block, cfunc_rsp_vmudh_scalar, this);
77257899         return TRUE;
77267900
77277901      case 0x08:      /* VMACF */
7728         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7729         UML_CALLC(block, cfunc_rsp_vmacf_scalar, rsp);
7902         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7903         UML_CALLC(block, cfunc_rsp_vmacf_scalar, this);
77307904         return TRUE;
77317905
77327906      case 0x09:      /* VMACU */
7733         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7734         UML_CALLC(block, cfunc_rsp_vmacu_scalar, rsp);
7907         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7908         UML_CALLC(block, cfunc_rsp_vmacu_scalar, this);
77357909         return TRUE;
77367910
77377911      case 0x0c:      /* VMADL */
7738         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7739         UML_CALLC(block, cfunc_rsp_vmadl_scalar, rsp);
7912         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7913         UML_CALLC(block, cfunc_rsp_vmadl_scalar, this);
77407914         return TRUE;
77417915
77427916      case 0x0d:      /* VMADM */
7743         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7744         UML_CALLC(block, cfunc_rsp_vmadm_scalar, rsp);
7917         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7918         UML_CALLC(block, cfunc_rsp_vmadm_scalar, this);
77457919         return TRUE;
77467920
77477921      case 0x0e:      /* VMADN */
7748         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7749         UML_CALLC(block, cfunc_rsp_vmadn_scalar, rsp);
7922         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7923         UML_CALLC(block, cfunc_rsp_vmadn_scalar, this);
77507924         return TRUE;
77517925
77527926      case 0x0f:      /* VMADH */
7753         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7754         UML_CALLC(block, cfunc_rsp_vmadh_scalar, rsp);
7927         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7928         UML_CALLC(block, cfunc_rsp_vmadh_scalar, this);
77557929         return TRUE;
77567930
77577931      case 0x10:      /* VADD */
7758         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7759         UML_CALLC(block, cfunc_rsp_vadd_scalar, rsp);
7932         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7933         UML_CALLC(block, cfunc_rsp_vadd_scalar, this);
77607934         return TRUE;
77617935
77627936      case 0x11:      /* VSUB */
7763         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7764         UML_CALLC(block, cfunc_rsp_vsub_scalar, rsp);
7937         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7938         UML_CALLC(block, cfunc_rsp_vsub_scalar, this);
77657939         return TRUE;
77667940
77677941      case 0x13:      /* VABS */
7768         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7769         UML_CALLC(block, cfunc_rsp_vabs_scalar, rsp);
7942         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7943         UML_CALLC(block, cfunc_rsp_vabs_scalar, this);
77707944         return TRUE;
77717945
77727946      case 0x14:      /* VADDC */
7773         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7774         UML_CALLC(block, cfunc_rsp_vaddc_scalar, rsp);
7947         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7948         UML_CALLC(block, cfunc_rsp_vaddc_scalar, this);
77757949         return TRUE;
77767950
77777951      case 0x15:      /* VSUBC */
7778         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7779         UML_CALLC(block, cfunc_rsp_vsubc_scalar, rsp);
7952         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7953         UML_CALLC(block, cfunc_rsp_vsubc_scalar, this);
77807954         return TRUE;
77817955
77827956      case 0x1d:      /* VSAW */
7783         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7784         UML_CALLC(block, cfunc_rsp_vsaw_scalar, rsp);
7957         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7958         UML_CALLC(block, cfunc_rsp_vsaw_scalar, this);
77857959         return TRUE;
77867960
77877961      case 0x20:      /* VLT */
7788         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7789         UML_CALLC(block, cfunc_rsp_vlt_scalar, rsp);
7962         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7963         UML_CALLC(block, cfunc_rsp_vlt_scalar, this);
77907964         return TRUE;
77917965
77927966      case 0x21:      /* VEQ */
7793         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7794         UML_CALLC(block, cfunc_rsp_veq_scalar, rsp);
7967         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7968         UML_CALLC(block, cfunc_rsp_veq_scalar, this);
77957969         return TRUE;
77967970
77977971      case 0x22:      /* VNE */
7798         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7799         UML_CALLC(block, cfunc_rsp_vne_scalar, rsp);
7972         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7973         UML_CALLC(block, cfunc_rsp_vne_scalar, this);
78007974         return TRUE;
78017975
78027976      case 0x23:      /* VGE */
7803         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7804         UML_CALLC(block, cfunc_rsp_vge_scalar, rsp);
7977         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7978         UML_CALLC(block, cfunc_rsp_vge_scalar, this);
78057979         return TRUE;
78067980
78077981      case 0x24:      /* VCL */
7808         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7809         UML_CALLC(block, cfunc_rsp_vcl_scalar, rsp);
7982         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7983         UML_CALLC(block, cfunc_rsp_vcl_scalar, this);
78107984         return TRUE;
78117985
78127986      case 0x25:      /* VCH */
7813         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7814         UML_CALLC(block, cfunc_rsp_vch_scalar, rsp);
7987         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7988         UML_CALLC(block, cfunc_rsp_vch_scalar, this);
78157989         return TRUE;
78167990
78177991      case 0x26:      /* VCR */
7818         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7819         UML_CALLC(block, cfunc_rsp_vcr_scalar, rsp);
7992         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7993         UML_CALLC(block, cfunc_rsp_vcr_scalar, this);
78207994         return TRUE;
78217995
78227996      case 0x27:      /* VMRG */
7823         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7824         UML_CALLC(block, cfunc_rsp_vmrg_scalar, rsp);
7997         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7998         UML_CALLC(block, cfunc_rsp_vmrg_scalar, this);
78257999         return TRUE;
78268000
78278001      case 0x28:      /* VAND */
7828         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7829         UML_CALLC(block, cfunc_rsp_vand_scalar, rsp);
8002         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8003         UML_CALLC(block, cfunc_rsp_vand_scalar, this);
78308004         return TRUE;
78318005
78328006      case 0x29:      /* VNAND */
7833         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7834         UML_CALLC(block, cfunc_rsp_vnand_scalar, rsp);
8007         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8008         UML_CALLC(block, cfunc_rsp_vnand_scalar, this);
78358009         return TRUE;
78368010
78378011      case 0x2a:      /* VOR */
7838         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7839         UML_CALLC(block, cfunc_rsp_vor_scalar, rsp);
8012         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8013         UML_CALLC(block, cfunc_rsp_vor_scalar, this);
78408014         return TRUE;
78418015
78428016      case 0x2b:      /* VNOR */
7843         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7844         UML_CALLC(block, cfunc_rsp_vnor_scalar, rsp);
8017         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8018         UML_CALLC(block, cfunc_rsp_vnor_scalar, this);
78458019         return TRUE;
78468020
78478021      case 0x2c:      /* VXOR */
7848         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7849         UML_CALLC(block, cfunc_rsp_vxor_scalar, rsp);
8022         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8023         UML_CALLC(block, cfunc_rsp_vxor_scalar, this);
78508024         return TRUE;
78518025
78528026      case 0x2d:      /* VNXOR */
7853         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7854         UML_CALLC(block, cfunc_rsp_vnxor_scalar, rsp);
8027         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8028         UML_CALLC(block, cfunc_rsp_vnxor_scalar, this);
78558029         return TRUE;
78568030
78578031      case 0x30:      /* VRCP */
7858         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7859         UML_CALLC(block, cfunc_rsp_vrcp_scalar, rsp);
8032         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8033         UML_CALLC(block, cfunc_rsp_vrcp_scalar, this);
78608034         return TRUE;
78618035
78628036      case 0x31:      /* VRCPL */
7863         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7864         UML_CALLC(block, cfunc_rsp_vrcpl_scalar, rsp);
8037         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8038         UML_CALLC(block, cfunc_rsp_vrcpl_scalar, this);
78658039         return TRUE;
78668040
78678041      case 0x32:      /* VRCPH */
7868         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7869         UML_CALLC(block, cfunc_rsp_vrcph_scalar, rsp);
8042         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8043         UML_CALLC(block, cfunc_rsp_vrcph_scalar, this);
78708044         return TRUE;
78718045
78728046      case 0x33:      /* VMOV */
7873         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7874         UML_CALLC(block, cfunc_rsp_vmov_scalar, rsp);
8047         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8048         UML_CALLC(block, cfunc_rsp_vmov_scalar, this);
78758049         return TRUE;
78768050
78778051      case 0x35:      /* VRSQL */
7878         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7879         UML_CALLC(block, cfunc_rsp_vrsql_scalar, rsp);
8052         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8053         UML_CALLC(block, cfunc_rsp_vrsql_scalar, this);
78808054         return TRUE;
78818055
78828056      case 0x36:      /* VRSQH */
7883         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7884         UML_CALLC(block, cfunc_rsp_vrsqh_scalar, rsp);
8057         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8058         UML_CALLC(block, cfunc_rsp_vrsqh_scalar, this);
78858059         return TRUE;
78868060
78878061      default:
7888         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
7889         UML_CALLC(block, cfunc_unimplemented_opcode, rsp);
8062         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8063         UML_CALLC(block, cfunc_unimplemented_opcode, this);
78908064         return FALSE;
78918065   }
78928066}
78938067#endif
78948068
7895static int generate_opcode(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
8069int rsp_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
78968070{
78978071   int in_delay_slot = ((desc->flags & OPFLAG_IN_DELAY_SLOT) != 0);
78988072   UINT32 op = desc->opptr.l[0];
r31833r31834
79048078      /* ----- sub-groups ----- */
79058079
79068080      case 0x00:  /* SPECIAL - MIPS I */
7907         return generate_special(rsp, block, compiler, desc);
8081         return generate_special(block, compiler, desc);
79088082
79098083      case 0x01:  /* REGIMM - MIPS I */
7910         return generate_regimm(rsp, block, compiler, desc);
8084         return generate_regimm(block, compiler, desc);
79118085
79128086      /* ----- jumps and branches ----- */
79138087
79148088      case 0x02:  /* J - MIPS I */
7915         generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);      // <next instruction + hashjmp>
8089         generate_delay_slot_and_branch(block, compiler, desc, 0);      // <next instruction + hashjmp>
79168090         return TRUE;
79178091
79188092      case 0x03:  /* JAL - MIPS I */
7919         generate_delay_slot_and_branch(rsp, block, compiler, desc, 31);     // <next instruction + hashjmp>
8093         generate_delay_slot_and_branch(block, compiler, desc, 31);     // <next instruction + hashjmp>
79208094         return TRUE;
79218095
79228096      case 0x04:  /* BEQ - MIPS I */
79238097         UML_CMP(block, R32(RSREG), R32(RTREG));                             // cmp    <rsreg>,<rtreg>
79248098         UML_JMPc(block, COND_NE, skip = compiler->labelnum++);              // jmp    skip,NE
7925         generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);      // <next instruction + hashjmp>
8099         generate_delay_slot_and_branch(block, compiler, desc, 0);      // <next instruction + hashjmp>
79268100         UML_LABEL(block, skip);                                             // skip:
79278101         return TRUE;
79288102
79298103      case 0x05:  /* BNE - MIPS I */
79308104         UML_CMP(block, R32(RSREG), R32(RTREG));                             // dcmp    <rsreg>,<rtreg>
79318105         UML_JMPc(block, COND_E, skip = compiler->labelnum++);                       // jmp     skip,E
7932         generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);      // <next instruction + hashjmp>
8106         generate_delay_slot_and_branch(block, compiler, desc, 0);      // <next instruction + hashjmp>
79338107         UML_LABEL(block, skip);                                             // skip:
79348108         return TRUE;
79358109
r31833r31834
79388112         {
79398113            UML_CMP(block, R32(RSREG), 0);                              // dcmp    <rsreg>,0
79408114            UML_JMPc(block, COND_G, skip = compiler->labelnum++);                   // jmp     skip,G
7941            generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);  // <next instruction + hashjmp>
8115            generate_delay_slot_and_branch(block, compiler, desc, 0);  // <next instruction + hashjmp>
79428116            UML_LABEL(block, skip);                                         // skip:
79438117         }
79448118         else
7945            generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);  // <next instruction + hashjmp>
8119            generate_delay_slot_and_branch(block, compiler, desc, 0);  // <next instruction + hashjmp>
79468120         return TRUE;
79478121
79488122      case 0x07:  /* BGTZ - MIPS I */
79498123         UML_CMP(block, R32(RSREG), 0);                                  // dcmp    <rsreg>,0
79508124         UML_JMPc(block, COND_LE, skip = compiler->labelnum++);                  // jmp     skip,LE
7951         generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);      // <next instruction + hashjmp>
8125         generate_delay_slot_and_branch(block, compiler, desc, 0);      // <next instruction + hashjmp>
79528126         UML_LABEL(block, skip);                                             // skip:
79538127         return TRUE;
79548128
r31833r31834
80048178
80058179      case 0x20:  /* LB - MIPS I */
80068180         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
8007         UML_CALLH(block, *rsp->impstate->read8);                                    // callh   read8
8181         UML_CALLH(block, *m_read8);                                    // callh   read8
80088182         if (RTREG != 0)
80098183            UML_SEXT(block, R32(RTREG), I0, SIZE_BYTE);                     // dsext   <rtreg>,i0,byte
80108184         if (!in_delay_slot)
8011            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8185            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80128186         return TRUE;
80138187
80148188      case 0x21:  /* LH - MIPS I */
80158189         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
8016         UML_CALLH(block, *rsp->impstate->read16);                               // callh   read16
8190         UML_CALLH(block, *m_read16);                               // callh   read16
80178191         if (RTREG != 0)
80188192            UML_SEXT(block, R32(RTREG), I0, SIZE_WORD);                     // dsext   <rtreg>,i0,word
80198193         if (!in_delay_slot)
8020            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8194            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80218195         return TRUE;
80228196
80238197      case 0x23:  /* LW - MIPS I */
80248198         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
8025         UML_CALLH(block, *rsp->impstate->read32);                               // callh   read32
8199         UML_CALLH(block, *m_read32);                               // callh   read32
80268200         if (RTREG != 0)
80278201            UML_MOV(block, R32(RTREG), I0);
80288202         if (!in_delay_slot)
8029            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8203            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80308204         return TRUE;
80318205
80328206      case 0x24:  /* LBU - MIPS I */
80338207         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
8034         UML_CALLH(block, *rsp->impstate->read8);                                    // callh   read8
8208         UML_CALLH(block, *m_read8);                                    // callh   read8
80358209         if (RTREG != 0)
80368210            UML_AND(block, R32(RTREG), I0, 0xff);                   // dand    <rtreg>,i0,0xff
80378211         if (!in_delay_slot)
8038            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8212            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80398213         return TRUE;
80408214
80418215      case 0x25:  /* LHU - MIPS I */
80428216         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
8043         UML_CALLH(block, *rsp->impstate->read16);                               // callh   read16
8217         UML_CALLH(block, *m_read16);                               // callh   read16
80448218         if (RTREG != 0)
80458219            UML_AND(block, R32(RTREG), I0, 0xffff);                 // dand    <rtreg>,i0,0xffff
80468220         if (!in_delay_slot)
8047            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8221            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80488222         return TRUE;
80498223
80508224      case 0x32:  /* LWC2 - MIPS I */
8051         return generate_lwc2(rsp, block, compiler, desc);
8225         return generate_lwc2(block, compiler, desc);
80528226
80538227
80548228      /* ----- memory store operations ----- */
r31833r31834
80568230      case 0x28:  /* SB - MIPS I */
80578231         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
80588232         UML_MOV(block, I1, R32(RTREG));                                 // mov     i1,<rtreg>
8059         UML_CALLH(block, *rsp->impstate->write8);                               // callh   write8
8233         UML_CALLH(block, *m_write8);                               // callh   write8
80608234         if (!in_delay_slot)
8061            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8235            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80628236         return TRUE;
80638237
80648238      case 0x29:  /* SH - MIPS I */
80658239         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
80668240         UML_MOV(block, I1, R32(RTREG));                                 // mov     i1,<rtreg>
8067         UML_CALLH(block, *rsp->impstate->write16);                              // callh   write16
8241         UML_CALLH(block, *m_write16);                              // callh   write16
80688242         if (!in_delay_slot)
8069            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8243            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80708244         return TRUE;
80718245
80728246      case 0x2b:  /* SW - MIPS I */
80738247         UML_ADD(block, I0, R32(RSREG), SIMMVAL);                        // add     i0,<rsreg>,SIMMVAL
80748248         UML_MOV(block, I1, R32(RTREG));                                 // mov     i1,<rtreg>
8075         UML_CALLH(block, *rsp->impstate->write32);                              // callh   write32
8249         UML_CALLH(block, *m_write32);                              // callh   write32
80768250         if (!in_delay_slot)
8077            generate_update_cycles(rsp, block, compiler, desc->pc + 4, TRUE);
8251            generate_update_cycles(block, compiler, desc->pc + 4, TRUE);
80788252         return TRUE;
80798253
80808254      case 0x3a:  /* SWC2 - MIPS I */
8081         return generate_swc2(rsp, block, compiler, desc);
8082         //UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);     // mov     [arg0],desc->opptr.l
8083         //UML_CALLC(block, cfunc_swc2, rsp);                                        // callc   cfunc_mfc2
8255         return generate_swc2(block, compiler, desc);
8256         //UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);     // mov     [arg0],desc->opptr.l
8257         //UML_CALLC(block, cfunc_swc2, this);                                        // callc   cfunc_mfc2
80848258         //return TRUE;
80858259
80868260      /* ----- coprocessor instructions ----- */
80878261
80888262      case 0x10:  /* COP0 - MIPS I */
8089         return generate_cop0(rsp, block, compiler, desc);
8263         return generate_cop0(block, compiler, desc);
80908264
80918265      case 0x12:  /* COP2 - MIPS I */
8092         return generate_cop2(rsp, block, compiler, desc);
8093         //UML_EXH(block, rsp->impstate->exception[EXCEPTION_INVALIDOP], 0);// exh     invalidop,0
8266         return generate_cop2(block, compiler, desc);
8267         //UML_EXH(block, m_exception[EXCEPTION_INVALIDOP], 0);// exh     invalidop,0
80948268         //return TRUE;
80958269
80968270
r31833r31834
81088282    'SPECIAL' group
81098283-------------------------------------------------*/
81108284
8111static int generate_special(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
8285int rsp_device::generate_special(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
81128286{
81138287   UINT32 op = desc->opptr.l[0];
81148288   UINT8 opswitch = op & 63;
r31833r31834
82328406      /* ----- jumps and branches ----- */
82338407
82348408      case 0x08:  /* JR - MIPS I */
8235         generate_delay_slot_and_branch(rsp, block, compiler, desc, 0);      // <next instruction + hashjmp>
8409         generate_delay_slot_and_branch(block, compiler, desc, 0);      // <next instruction + hashjmp>
82368410         return TRUE;
82378411
82388412      case 0x09:  /* JALR - MIPS I */
8239         generate_delay_slot_and_branch(rsp, block, compiler, desc, RDREG);  // <next instruction + hashjmp>
8413         generate_delay_slot_and_branch(block, compiler, desc, RDREG);  // <next instruction + hashjmp>
82408414         return TRUE;
82418415
82428416
82438417      /* ----- system calls ----- */
82448418
82458419      case 0x0d:  /* BREAK - MIPS I */
8246         UML_MOV(block, mem(&rsp->impstate->arg0), 3);                   // mov     [arg0],3
8247         UML_CALLC(block, cfunc_sp_set_status_cb, rsp);                      // callc   cfunc_sp_set_status_cb
8248         UML_MOV(block, mem(&rsp->icount), 0);                       // mov icount, #0
8420         UML_MOV(block, mem(&m_rsp_state->arg0), 3);                   // mov     [arg0],3
8421         UML_CALLC(block, cfunc_sp_set_status_cb, this);                      // callc   cfunc_sp_set_status_cb
8422         UML_MOV(block, mem(&m_rsp_state->icount), 0);                       // mov icount, #0
82498423
82508424         UML_EXIT(block, EXECUTE_OUT_OF_CYCLES);
82518425         return TRUE;
r31833r31834
82608434    'REGIMM' group
82618435-------------------------------------------------*/
82628436
8263static int generate_regimm(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
8437int rsp_device::generate_regimm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
82648438{
82658439   UINT32 op = desc->opptr.l[0];
82668440   UINT8 opswitch = RTREG;
r31833r31834
82748448         {
82758449            UML_CMP(block, R32(RSREG), 0);                              // dcmp    <rsreg>,0
82768450            UML_JMPc(block, COND_GE, skip = compiler->labelnum++);              // jmp     skip,GE
8277            generate_delay_slot_and_branch(rsp, block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
8451            generate_delay_slot_and_branch(block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
82788452                                                               // <next instruction + hashjmp>
82798453            UML_LABEL(block, skip);                                         // skip:
82808454         }
r31833r31834
82868460         {
82878461            UML_CMP(block, R32(RSREG), 0);                              // dcmp    <rsreg>,0
82888462            UML_JMPc(block, COND_L, skip = compiler->labelnum++);                   // jmp     skip,L
8289            generate_delay_slot_and_branch(rsp, block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
8463            generate_delay_slot_and_branch(block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
82908464                                                               // <next instruction + hashjmp>
82918465            UML_LABEL(block, skip);                                         // skip:
82928466         }
82938467         else
8294            generate_delay_slot_and_branch(rsp, block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
8468            generate_delay_slot_and_branch(block, compiler, desc, (opswitch & 0x10) ? 31 : 0);
82958469                                                               // <next instruction + hashjmp>
82968470         return TRUE;
82978471   }
r31833r31834
83038477    generate_cop2 - compile COP2 opcodes
83048478-------------------------------------------------*/
83058479
8306static int generate_cop2(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
8480int rsp_device::generate_cop2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
83078481{
83088482   UINT32 op = desc->opptr.l[0];
83098483   UINT8 opswitch = RSREG;
r31833r31834
83138487      case 0x00:  /* MFCz */
83148488         if (RTREG != 0)
83158489         {
8316            UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);    // mov     [arg0],desc->opptr.l
8490            UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);    // mov     [arg0],desc->opptr.l
83178491#if USE_SIMD
8318         UML_CALLC(block, cfunc_mfc2_simd, rsp);                                      // callc   cfunc_ctc2
8492         UML_CALLC(block, cfunc_mfc2_simd, this);                                      // callc   cfunc_ctc2
83198493#if SIMUL_SIMD
8320         UML_CALLC(block, cfunc_backup_regs, rsp);
8321         UML_CALLC(block, cfunc_mfc2_scalar, rsp);
8322         UML_CALLC(block, cfunc_restore_regs, rsp);
8323         UML_CALLC(block, cfunc_verify_regs, rsp);
8494         UML_CALLC(block, cfunc_backup_regs, this);
8495         UML_CALLC(block, cfunc_mfc2_scalar, this);
8496         UML_CALLC(block, cfunc_restore_regs, this);
8497         UML_CALLC(block, cfunc_verify_regs, this);
83248498#endif
83258499#else
8326         UML_CALLC(block, cfunc_mfc2_scalar, rsp);
8500         UML_CALLC(block, cfunc_mfc2_scalar, this);
83278501#endif
83288502            //UML_SEXT(block, R32(RTREG), I0, DWORD);                      // dsext   <rtreg>,i0,dword
83298503         }
r31833r31834
83328506      case 0x02:  /* CFCz */
83338507         if (RTREG != 0)
83348508         {
8335            UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);    // mov     [arg0],desc->opptr.l
8509            UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);    // mov     [arg0],desc->opptr.l
83368510#if USE_SIMD
8337         UML_CALLC(block, cfunc_cfc2_simd, rsp);                                      // callc   cfunc_ctc2
8511         UML_CALLC(block, cfunc_cfc2_simd, this);                                      // callc   cfunc_ctc2
83388512#if SIMUL_SIMD
8339         UML_CALLC(block, cfunc_backup_regs, rsp);
8340         UML_CALLC(block, cfunc_cfc2_scalar, rsp);
8341         UML_CALLC(block, cfunc_restore_regs, rsp);
8342         UML_CALLC(block, cfunc_verify_regs, rsp);
8513         UML_CALLC(block, cfunc_backup_regs, this);
8514         UML_CALLC(block, cfunc_cfc2_scalar, this);
8515         UML_CALLC(block, cfunc_restore_regs, this);
8516         UML_CALLC(block, cfunc_verify_regs, this);
83438517#endif
83448518#else
8345         UML_CALLC(block, cfunc_cfc2_scalar, rsp);
8519         UML_CALLC(block, cfunc_cfc2_scalar, this);
83468520#endif
83478521            //UML_SEXT(block, R32(RTREG), I0, DWORD);                      // dsext   <rtreg>,i0,dword
83488522         }
83498523         return TRUE;
83508524
83518525      case 0x04:  /* MTCz */
8352         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8526         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
83538527#if USE_SIMD
8354         UML_CALLC(block, cfunc_mtc2_simd, rsp);                                      // callc   cfunc_ctc2
8528         UML_CALLC(block, cfunc_mtc2_simd, this);                                      // callc   cfunc_ctc2
83558529#if SIMUL_SIMD
8356         UML_CALLC(block, cfunc_backup_regs, rsp);
8357         UML_CALLC(block, cfunc_mtc2_scalar, rsp);
8358         UML_CALLC(block, cfunc_restore_regs, rsp);
8359         UML_CALLC(block, cfunc_verify_regs, rsp);
8530         UML_CALLC(block, cfunc_backup_regs, this);
8531         UML_CALLC(block, cfunc_mtc2_scalar, this);
8532         UML_CALLC(block, cfunc_restore_regs, this);
8533         UML_CALLC(block, cfunc_verify_regs, this);
83608534#endif
83618535#else
8362         UML_CALLC(block, cfunc_mtc2_scalar, rsp);
8536         UML_CALLC(block, cfunc_mtc2_scalar, this);
83638537#endif
83648538         return TRUE;
83658539
83668540      case 0x06:  /* CTCz */
8367         UML_MOV(block, mem(&rsp->impstate->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
8541         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
83688542#if USE_SIMD
8369         UML_CALLC(block, cfunc_ctc2_simd, rsp);                                      // callc   cfunc_ctc2
8543         UML_CALLC(block, cfunc_ctc2_simd, this);                                      // callc   cfunc_ctc2
83708544#if SIMUL_SIMD
8371         UML_CALLC(block, cfunc_backup_regs, rsp);
8372         UML_CALLC(block, cfunc_ctc2_scalar, rsp);
8373         UML_CALLC(block, cfunc_restore_regs, rsp);
8374         UML_CALLC(block, cfunc_verify_regs, rsp);
8545         UML_CALLC(block, cfunc_backup_regs, this);
8546         UML_CALLC(block, cfunc_ctc2_scalar, this);
8547         UML_CALLC(block, cfunc_restore_regs, this);
8548         UML_CALLC(block, cfunc_verify_regs, this);
83758549#endif
83768550#else
8377         UML_CALLC(block, cfunc_ctc2_scalar, rsp);
8551         UML_CALLC(block, cfunc_ctc2_scalar, this);
83788552#endif
83798553         return TRUE;
83808554
83818555      case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
83828556      case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
8383         return generate_vector_opcode(rsp, block, compiler, desc);
8557         return generate_vector_opcode(block, compiler, desc);
83848558   }
83858559   return FALSE;
83868560}
r31833r31834
83898563    generate_cop0 - compile COP0 opcodes
83908564-------------------------------------------------*/
83918565
8392static int generate_cop0(rsp_state *rsp, drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
8566int rsp_device::generate_cop0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
83938567{
83948568   UINT32 op = desc->opptr.l[0];
83958569   UINT8 opswitch = RSREG;
r31833r31834
83998573      case 0x00:  /* MFCz */
84008574         if (RTREG != 0)
84018575         {
8402            UML_MOV(block, mem(&rsp->impstate->arg0), RDREG);               // mov     [arg0],<rdreg>
8403            UML_MOV(block, mem(&rsp->impstate->arg1), RTREG);               // mov     [arg1],<rtreg>
8404            UML_CALLC(block, cfunc_get_cop0_reg, rsp);                          // callc   cfunc_get_cop0_reg
8576            UML_MOV(block, mem(&m_rsp_state->arg0), RDREG);               // mov     [arg0],<rdreg>
8577            UML_MOV(block, mem(&m_rsp_state->arg1), RTREG);               // mov     [arg1],<rtreg>
8578            UML_CALLC(block, cfunc_get_cop0_reg, this);                          // callc   cfunc_get_cop0_reg
84058579            if(RDREG == 2)
84068580            {
8407               generate_update_cycles(rsp, block, compiler, mem(&rsp->pc), TRUE);
8408               UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode);
8581               generate_update_cycles(block, compiler, mem(&m_rsp_state->pc), TRUE);
8582               UML_HASHJMP(block, 0, mem(&m_rsp_state->pc), *m_nocode);
84098583            }
84108584         }
84118585         return TRUE;
84128586
84138587      case 0x04:  /* MTCz */
8414         UML_MOV(block, mem(&rsp->impstate->arg0), RDREG);                   // mov     [arg0],<rdreg>
8415         UML_MOV(block, mem(&rsp->impstate->arg1), R32(RTREG));                  // mov     [arg1],rtreg
8416         UML_CALLC(block, cfunc_set_cop0_reg, rsp);                              // callc   cfunc_set_cop0_reg
8588         UML_MOV(block, mem(&m_rsp_state->arg0), RDREG);                   // mov     [arg0],<rdreg>
8589         UML_MOV(block, mem(&m_rsp_state->arg1), R32(RTREG));                  // mov     [arg1],rtreg
8590         UML_CALLC(block, cfunc_set_cop0_reg, this);                              // callc   cfunc_set_cop0_reg
84178591         return TRUE;
84188592   }
84198593
r31833r31834
84218595}
84228596
84238597#if USE_SIMD
8424static void cfunc_mfc2_simd(void *param)
8598inline void rsp_device::ccfunc_mfc2_simd()
84258599{
8426   rsp_state *rsp = (rsp_state*)param;
8427   UINT32 op = rsp->impstate->arg0;
8600   UINT32 op = m_rsp_state->arg0;
84288601   int el = (op >> 7) & 0xf;
84298602
84308603   UINT16 out;
8431   SIMD_EXTRACT16(rsp->xv[VS1REG], out, (el >> 1));
8604   SIMD_EXTRACT16(m_xv[VS1REG], out, (el >> 1));
84328605   out >>= (1 - (el & 1)) * 8;
84338606   out &= 0x00ff;
84348607
84358608   el++;
84368609
84378610   UINT16 temp;
8438   SIMD_EXTRACT16(rsp->xv[VS1REG], temp, (el >> 1));
8611   SIMD_EXTRACT16(m_xv[VS1REG], temp, (el >> 1));
84398612   temp >>= (1 - (el & 1)) * 8;
84408613   temp &= 0x00ff;
84418614
8442   rsp->r[RTREG] = (INT32)(INT16)((out << 8) | temp);
8615   m_rsp_state->r[RTREG] = (INT32)(INT16)((out << 8) | temp);
84438616}
8617
8618static void cfunc_mfc2_simd(void *param)
8619{
8620   ((rsp_device *)param)->ccfunc_mfc2_simd();
8621}
84448622#endif
84458623
84468624#if (!USE_SIMD || SIMUL_SIMD)
8447static void cfunc_mfc2_scalar(void *param)
8625inline void rsp_device::ccfunc_mfc2_scalar()
84488626{
8449   rsp_state *rsp = (rsp_state*)param;
8450   UINT32 op = rsp->impstate->arg0;
8627   UINT32 op = m_rsp_state->arg0;
84518628   int el = (op >> 7) & 0xf;
84528629
84538630   UINT16 b1 = VREG_B(VS1REG, (el+0) & 0xf);
84548631   UINT16 b2 = VREG_B(VS1REG, (el+1) & 0xf);
84558632   if (RTREG) RTVAL = (INT32)(INT16)((b1 << 8) | (b2));
84568633}
8634
8635static void cfunc_mfc2_scalar(void *param)
8636{
8637   ((rsp_device *)param)->ccfunc_mfc2_scalar();
8638}
84578639#endif
84588640
84598641#if USE_SIMD
8460static void cfunc_cfc2_simd(void *param)
8642inline void rsp_device::ccfunc_cfc2_simd()
84618643{
8462   rsp_state *rsp = (rsp_state*)param;
8463   UINT32 op = rsp->impstate->arg0;
8644   UINT32 op = m_rsp_state->arg0;
84648645   if (RTREG)
84658646   {
84668647      switch(RDREG)
84678648      {
84688649         case 0:
8469            RTVAL = ((VEC_CARRY_FLAG(rsp, 0) & 1) << 0) |
8470                  ((VEC_CARRY_FLAG(rsp, 1) & 1) << 1) |
8471                  ((VEC_CARRY_FLAG(rsp, 2) & 1) << 2) |
8472                  ((VEC_CARRY_FLAG(rsp, 3) & 1) << 3) |
8473                  ((VEC_CARRY_FLAG(rsp, 4) & 1) << 4) |
8474                  ((VEC_CARRY_FLAG(rsp, 5) & 1) << 5) |
8475                  ((VEC_CARRY_FLAG(rsp, 6) & 1) << 6) |
8476                  ((VEC_CARRY_FLAG(rsp, 7) & 1) << 7) |
8477                  ((VEC_ZERO_FLAG(rsp, 0) & 1) << 8) |
8478                  ((VEC_ZERO_FLAG(rsp, 1) & 1) << 9) |
8479                  ((VEC_ZERO_FLAG(rsp, 2) & 1) << 10) |
8480                  ((VEC_ZERO_FLAG(rsp, 3) & 1) << 11) |
8481                  ((VEC_ZERO_FLAG(rsp, 4) & 1) << 12) |
8482                  ((VEC_ZERO_FLAG(rsp, 5) & 1) << 13) |
8483                  ((VEC_ZERO_FLAG(rsp, 6) & 1) << 14) |
8484                  ((VEC_ZERO_FLAG(rsp, 7) & 1) << 15);
8650            RTVAL = ((VEC_CARRY_FLAG(0) & 1) << 0) |
8651                  ((VEC_CARRY_FLAG(1) & 1) << 1) |
8652                  ((VEC_CARRY_FLAG(2) & 1) << 2) |
8653                  ((VEC_CARRY_FLAG(3) & 1) << 3) |
8654                  ((VEC_CARRY_FLAG(4) & 1) << 4) |
8655                  ((VEC_CARRY_FLAG(5) & 1) << 5) |
8656                  ((VEC_CARRY_FLAG(6) & 1) << 6) |
8657                  ((VEC_CARRY_FLAG(7) & 1) << 7) |
8658                  ((VEC_ZERO_FLAG(0) & 1) << 8) |
8659                  ((VEC_ZERO_FLAG(1) & 1) << 9) |
8660                  ((VEC_ZERO_FLAG(2) & 1) << 10) |
8661                  ((VEC_ZERO_FLAG(3) & 1) << 11) |
8662                  ((VEC_ZERO_FLAG(4) & 1) << 12) |
8663                  ((VEC_ZERO_FLAG(5) & 1) << 13) |
8664                  ((VEC_ZERO_FLAG(6) & 1) << 14) |
8665                  ((VEC_ZERO_FLAG(7) & 1) << 15);
84858666            if (RTVAL & 0x8000) RTVAL |= 0xffff0000;
84868667            break;
84878668         case 1:
8488            RTVAL = ((VEC_COMPARE_FLAG(rsp, 0) & 1) << 0) |
8489                  ((VEC_COMPARE_FLAG(rsp, 1) & 1) << 1) |
8490                  ((VEC_COMPARE_FLAG(rsp, 2) & 1) << 2) |
8491                  ((VEC_COMPARE_FLAG(rsp, 3) & 1) << 3) |
8492                  ((VEC_COMPARE_FLAG(rsp, 4) & 1) << 4) |
8493                  ((VEC_COMPARE_FLAG(rsp, 5) & 1) << 5) |
8494                  ((VEC_COMPARE_FLAG(rsp, 6) & 1) << 6) |
8495                  ((VEC_COMPARE_FLAG(rsp, 7) & 1) << 7) |
8496                  ((VEC_CLIP2_FLAG(rsp, 0) & 1) << 8) |
8497                  ((VEC_CLIP2_FLAG(rsp, 1) & 1) << 9) |
8498                  ((VEC_CLIP2_FLAG(rsp, 2) & 1) << 10) |
8499                  ((VEC_CLIP2_FLAG(rsp, 3) & 1) << 11) |
8500                  ((VEC_CLIP2_FLAG(rsp, 4) & 1) << 12) |
8501                  ((VEC_CLIP2_FLAG(rsp, 5) & 1) << 13) |
8502                  ((VEC_CLIP2_FLAG(rsp, 6) & 1) << 14) |
8503                  ((VEC_CLIP2_FLAG(rsp, 7) & 1) << 15);
8669            RTVAL = ((VEC_COMPARE_FLAG(0) & 1) << 0) |
8670                  ((VEC_COMPARE_FLAG(1) & 1) << 1) |
8671                  ((VEC_COMPARE_FLAG(2) & 1) << 2) |
8672                  ((VEC_COMPARE_FLAG(3) & 1) << 3) |
8673                  ((VEC_COMPARE_FLAG(4) & 1) << 4) |
8674                  ((VEC_COMPARE_FLAG(5) & 1) << 5) |
8675                  ((VEC_COMPARE_FLAG(6) & 1) << 6) |
8676                  ((VEC_COMPARE_FLAG(7) & 1) << 7) |
8677                  ((VEC_CLIP2_FLAG(0) & 1) << 8) |
8678                  ((VEC_CLIP2_FLAG(1) & 1) << 9) |
8679                  ((VEC_CLIP2_FLAG(2) & 1) << 10) |
8680                  ((VEC_CLIP2_FLAG(3) & 1) << 11) |
8681                  ((VEC_CLIP2_FLAG(4) & 1) << 12) |
8682                  ((VEC_CLIP2_FLAG(5) & 1) << 13) |
8683                  ((VEC_CLIP2_FLAG(6) & 1) << 14) |
8684                  ((VEC_CLIP2_FLAG(7) & 1) << 15);
85048685            if (RTVAL & 0x8000) RTVAL |= 0xffff0000;
85058686            break;
85068687         case 2:
8507            RTVAL = ((VEC_CLIP1_FLAG(rsp, 0) & 1) << 0) |
8508                  ((VEC_CLIP1_FLAG(rsp, 1) & 1) << 1) |
8509                  ((VEC_CLIP1_FLAG(rsp, 2) & 1) << 2) |
8510                  ((VEC_CLIP1_FLAG(rsp, 3) & 1) << 3) |
8511                  ((VEC_CLIP1_FLAG(rsp, 4) & 1) << 4) |
8512                  ((VEC_CLIP1_FLAG(rsp, 5) & 1) << 5) |
8513                  ((VEC_CLIP1_FLAG(rsp, 6) & 1) << 6) |
8514                  ((VEC_CLIP1_FLAG(rsp, 7) & 1) << 7);
8688            RTVAL = ((VEC_CLIP1_FLAG(0) & 1) << 0) |
8689                  ((VEC_CLIP1_FLAG(1) & 1) << 1) |
8690                  ((VEC_CLIP1_FLAG(2) & 1) << 2) |
8691                  ((VEC_CLIP1_FLAG(3) & 1) << 3) |
8692                  ((VEC_CLIP1_FLAG(4) & 1) << 4) |
8693                  ((VEC_CLIP1_FLAG(5) & 1) << 5) |
8694                  ((VEC_CLIP1_FLAG(6) & 1) << 6) |
8695                  ((VEC_CLIP1_FLAG(7) & 1) << 7);
85158696            break;
85168697      }
85178698   }
85188699}
8700
8701static void cfunc_cfc2_simd(void *param)
8702{
8703   ((rsp_device *)param)->ccfunc_cfc2_simd();
8704}
85198705#endif
85208706
85218707#if (!USE_SIMD || SIMUL_SIMD)
8522static void cfunc_cfc2_scalar(void *param)
8708inline void rsp_device::ccfunc_cfc2_scalar()
85238709{
8524   rsp_state *rsp = (rsp_state*)param;
8525   UINT32 op = rsp->impstate->arg0;
8710   UINT32 op = m_rsp_state->arg0;
85268711   if (RTREG)
85278712   {
85288713      switch(RDREG)
85298714      {
85308715         case 0:
8531            RTVAL = ((CARRY_FLAG(rsp, 0) & 1) << 0) |
8532                  ((CARRY_FLAG(rsp, 1) & 1) << 1) |
8533                  ((CARRY_FLAG(rsp, 2) & 1) << 2) |
8534                  ((CARRY_FLAG(rsp, 3) & 1) << 3) |
8535                  ((CARRY_FLAG(rsp, 4) & 1) << 4) |
8536                  ((CARRY_FLAG(rsp, 5) & 1) << 5) |
8537                  ((CARRY_FLAG(rsp, 6) & 1) << 6) |
8538                  ((CARRY_FLAG(rsp, 7) & 1) << 7) |
8539                  ((ZERO_FLAG(rsp, 0) & 1) << 8) |
8540                  ((ZERO_FLAG(rsp, 1) & 1) << 9) |
8541                  ((ZERO_FLAG(rsp, 2) & 1) << 10) |
8542                  ((ZERO_FLAG(rsp, 3) & 1) << 11) |
8543                  ((ZERO_FLAG(rsp, 4) & 1) << 12) |
8544                  ((ZERO_FLAG(rsp, 5) & 1) << 13) |
8545                  ((ZERO_FLAG(rsp, 6) & 1) << 14) |
8546                  ((ZERO_FLAG(rsp, 7) & 1) << 15);
8716            RTVAL = ((CARRY_FLAG(0) & 1) << 0) |
8717                  ((CARRY_FLAG(1) & 1) << 1) |
8718                  ((CARRY_FLAG(2) & 1) << 2) |
8719                  ((CARRY_FLAG(3) & 1) << 3) |
8720                  ((CARRY_FLAG(4) & 1) << 4) |
8721                  ((CARRY_FLAG(5) & 1) << 5) |
8722                  ((CARRY_FLAG(6) & 1) << 6) |
8723                  ((CARRY_FLAG(7) & 1) << 7) |
8724                  ((ZERO_FLAG(0) & 1) << 8) |
8725                  ((ZERO_FLAG(1) & 1) << 9) |
8726                  ((ZERO_FLAG(2) & 1) << 10) |
8727                  ((ZERO_FLAG(3) & 1) << 11) |
8728                  ((ZERO_FLAG(4) & 1) << 12) |
8729                  ((ZERO_FLAG(5) & 1) << 13) |
8730                  ((ZERO_FLAG(6) & 1) << 14) |
8731                  ((ZERO_FLAG(7) & 1) << 15);
85478732            if (RTVAL & 0x8000) RTVAL |= 0xffff0000;
85488733            break;
85498734         case 1:
8550            RTVAL = ((COMPARE_FLAG(rsp, 0) & 1) << 0) |
8551                  ((COMPARE_FLAG(rsp, 1) & 1) << 1) |
8552                  ((COMPARE_FLAG(rsp, 2) & 1) << 2) |
8553                  ((COMPARE_FLAG(rsp, 3) & 1) << 3) |
8554                  ((COMPARE_FLAG(rsp, 4) & 1) << 4) |
8555                  ((COMPARE_FLAG(rsp, 5) & 1) << 5) |
8556                  ((COMPARE_FLAG(rsp, 6) & 1) << 6) |
8557                  ((COMPARE_FLAG(rsp, 7) & 1) << 7) |
8558                  ((CLIP2_FLAG(rsp, 0) & 1) << 8) |
8559                  ((CLIP2_FLAG(rsp, 1) & 1) << 9) |
8560                  ((CLIP2_FLAG(rsp, 2) & 1) << 10) |
8561                  ((CLIP2_FLAG(rsp, 3) & 1) << 11) |
8562                  ((CLIP2_FLAG(rsp, 4) & 1) << 12) |
8563                  ((CLIP2_FLAG(rsp, 5) & 1) << 13) |
8564                  ((CLIP2_FLAG(rsp, 6) & 1) << 14) |
8565                  ((CLIP2_FLAG(rsp, 7) & 1) << 15);
8735            RTVAL = ((COMPARE_FLAG(0) & 1) << 0) |
8736                  ((COMPARE_FLAG(1) & 1) << 1) |
8737                  ((COMPARE_FLAG(2) & 1) << 2) |
8738                  ((COMPARE_FLAG(3) & 1) << 3) |
8739                  ((COMPARE_FLAG(4) & 1) << 4) |
8740                  ((COMPARE_FLAG(5) & 1) << 5) |
8741                  ((COMPARE_FLAG(6) & 1) << 6) |
8742                  ((COMPARE_FLAG(7) & 1) << 7) |
8743                  ((CLIP2_FLAG(0) & 1) << 8) |
8744                  ((CLIP2_FLAG(1) & 1) << 9) |
8745                  ((CLIP2_FLAG(2) & 1) << 10) |
8746                  ((CLIP2_FLAG(3) & 1) << 11) |
8747                  ((CLIP2_FLAG(4) & 1) << 12) |
8748                  ((CLIP2_FLAG(5) & 1) << 13) |
8749                  ((CLIP2_FLAG(6) & 1) << 14) |
8750                  ((CLIP2_FLAG(7) & 1) << 15);
85668751            if (RTVAL & 0x8000) RTVAL |= 0xffff0000;
85678752            break;
85688753         case 2:
8569            RTVAL = ((CLIP1_FLAG(rsp, 0) & 1) << 0) |
8570                  ((CLIP1_FLAG(rsp, 1) & 1) << 1) |
8571                  ((CLIP1_FLAG(rsp, 2) & 1) << 2) |
8572                  ((CLIP1_FLAG(rsp, 3) & 1) << 3) |
8573                  ((CLIP1_FLAG(rsp, 4) & 1) << 4) |
8574                  ((CLIP1_FLAG(rsp, 5) & 1) << 5) |
8575                  ((CLIP1_FLAG(rsp, 6) & 1) << 6) |
8576                  ((CLIP1_FLAG(rsp, 7) & 1) << 7);
8754            RTVAL = ((CLIP1_FLAG(0) & 1) << 0) |
8755                  ((CLIP1_FLAG(1) & 1) << 1) |
8756                  ((CLIP1_FLAG(2) & 1) << 2) |
8757                  ((CLIP1_FLAG(3) & 1) << 3) |
8758                  ((CLIP1_FLAG(4) & 1) << 4) |
8759                  ((CLIP1_FLAG(5) & 1) << 5) |
8760                  ((CLIP1_FLAG(6) & 1) << 6) |
8761                  ((CLIP1_FLAG(7) & 1) << 7);
85778762            break;
85788763      }
85798764   }
85808765}
8766
8767static void cfunc_cfc2_scalar(void *param)
8768{
8769   ((rsp_device *)param)->ccfunc_cfc2_scalar();
8770}
85818771#endif
85828772
85838773#if USE_SIMD
8584static void cfunc_mtc2_simd(void *param)
8774inline void rsp_device::ccfunc_mtc2_simd()
85858775{
8586   rsp_state *rsp = (rsp_state*)param;
8587   UINT32 op = rsp->impstate->arg0;
8776   UINT32 op = m_rsp_state->arg0;
85888777   int el = (op >> 7) & 0xf;
8589   SIMD_INSERT16(rsp->xv[VS1REG], RTVAL, el >> 1);
8778   SIMD_INSERT16(m_xv[VS1REG], RTVAL, el >> 1);
85908779}
8780
8781static void cfunc_mtc2_simd(void *param)
8782{
8783   ((rsp_device *)param)->ccfunc_mtc2_simd();
8784}
85918785#endif
85928786
85938787#if (!USE_SIMD || SIMUL_SIMD)
8594static void cfunc_mtc2_scalar(void *param)
8788inline void rsp_device::ccfunc_mtc2_scalar()
85958789{
8596   rsp_state *rsp = (rsp_state*)param;
8597   UINT32 op = rsp->impstate->arg0;
8790   UINT32 op = m_rsp_state->arg0;
85988791   int el = (op >> 7) & 0xf;
85998792   VREG_B(VS1REG, (el+0) & 0xf) = (RTVAL >> 8) & 0xff;
86008793   VREG_B(VS1REG, (el+1) & 0xf) = (RTVAL >> 0) & 0xff;
86018794}
8795
8796static void cfunc_mtc2_scalar(void *param)
8797{
8798   ((rsp_device *)param)->ccfunc_mtc2_scalar();
8799}
86028800#endif
86038801
86048802#if USE_SIMD
8605static void cfunc_ctc2_simd(void *param)
8803inline void rsp_device::ccfunc_ctc2_simd()
86068804{
8607   rsp_state *rsp = (rsp_state*)param;
8608   UINT32 op = rsp->impstate->arg0;
8805   UINT32 op = m_rsp_state->arg0;
86098806   switch(RDREG)
86108807   {
86118808      case 0:
86128809         VEC_CLEAR_CARRY_FLAGS();
86138810         VEC_CLEAR_ZERO_FLAGS();
8614         rsp->vflag[0][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8615         rsp->vflag[0][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8616         rsp->vflag[0][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8617         rsp->vflag[0][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8618         rsp->vflag[0][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8619         rsp->vflag[0][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8620         rsp->vflag[0][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8621         rsp->vflag[0][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8811         m_vflag[0][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8812         m_vflag[0][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8813         m_vflag[0][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8814         m_vflag[0][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8815         m_vflag[0][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8816         m_vflag[0][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8817         m_vflag[0][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8818         m_vflag[0][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
86228819         if (RTVAL & (1 << 0))  { VEC_SET_CARRY_FLAG(0); }
86238820         if (RTVAL & (1 << 1))  { VEC_SET_CARRY_FLAG(1); }
86248821         if (RTVAL & (1 << 2))  { VEC_SET_CARRY_FLAG(2); }
r31833r31834
86278824         if (RTVAL & (1 << 5))  { VEC_SET_CARRY_FLAG(5); }
86288825         if (RTVAL & (1 << 6))  { VEC_SET_CARRY_FLAG(6); }
86298826         if (RTVAL & (1 << 7))  { VEC_SET_CARRY_FLAG(7); }
8630         rsp->vflag[3][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8631         rsp->vflag[3][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8632         rsp->vflag[3][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8633         rsp->vflag[3][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8634         rsp->vflag[3][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8635         rsp->vflag[3][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8636         rsp->vflag[3][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8637         rsp->vflag[3][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
8827         m_vflag[3][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8828         m_vflag[3][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8829         m_vflag[3][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8830         m_vflag[3][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8831         m_vflag[3][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8832         m_vflag[3][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8833         m_vflag[3][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8834         m_vflag[3][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
86388835         if (RTVAL & (1 << 8))  { VEC_SET_ZERO_FLAG(0); }
86398836         if (RTVAL & (1 << 9))  { VEC_SET_ZERO_FLAG(1); }
86408837         if (RTVAL & (1 << 10)) { VEC_SET_ZERO_FLAG(2); }
r31833r31834
86478844      case 1:
86488845         VEC_CLEAR_COMPARE_FLAGS();
86498846         VEC_CLEAR_CLIP2_FLAGS();
8650         rsp->vflag[1][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8651         rsp->vflag[1][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8652         rsp->vflag[1][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8653         rsp->vflag[1][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8654         rsp->vflag[1][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8655         rsp->vflag[1][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8656         rsp->vflag[1][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8657         rsp->vflag[1][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8847         m_vflag[1][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8848         m_vflag[1][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8849         m_vflag[1][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8850         m_vflag[1][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8851         m_vflag[1][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8852         m_vflag[1][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8853         m_vflag[1][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8854         m_vflag[1][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
86588855         if (RTVAL & (1 << 0)) { VEC_SET_COMPARE_FLAG(0); }
86598856         if (RTVAL & (1 << 1)) { VEC_SET_COMPARE_FLAG(1); }
86608857         if (RTVAL & (1 << 2)) { VEC_SET_COMPARE_FLAG(2); }
r31833r31834
86638860         if (RTVAL & (1 << 5)) { VEC_SET_COMPARE_FLAG(5); }
86648861         if (RTVAL & (1 << 6)) { VEC_SET_COMPARE_FLAG(6); }
86658862         if (RTVAL & (1 << 7)) { VEC_SET_COMPARE_FLAG(7); }
8666         rsp->vflag[4][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8667         rsp->vflag[4][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8668         rsp->vflag[4][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8669         rsp->vflag[4][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8670         rsp->vflag[4][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8671         rsp->vflag[4][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8672         rsp->vflag[4][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8673         rsp->vflag[4][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
8863         m_vflag[4][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8864         m_vflag[4][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8865         m_vflag[4][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8866         m_vflag[4][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8867         m_vflag[4][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8868         m_vflag[4][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8869         m_vflag[4][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8870         m_vflag[4][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
86748871         if (RTVAL & (1 << 8))  { VEC_SET_CLIP2_FLAG(0); }
86758872         if (RTVAL & (1 << 9))  { VEC_SET_CLIP2_FLAG(1); }
86768873         if (RTVAL & (1 << 10)) { VEC_SET_CLIP2_FLAG(2); }
r31833r31834
86828879         break;
86838880      case 2:
86848881         VEC_CLEAR_CLIP1_FLAGS();
8685         rsp->vflag[2][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8686         rsp->vflag[2][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8687         rsp->vflag[2][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8688         rsp->vflag[2][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8689         rsp->vflag[2][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8690         rsp->vflag[2][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8691         rsp->vflag[2][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8692         rsp->vflag[2][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8882         m_vflag[2][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8883         m_vflag[2][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8884         m_vflag[2][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8885         m_vflag[2][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8886         m_vflag[2][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8887         m_vflag[2][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8888         m_vflag[2][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8889         m_vflag[2][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
86938890         if (RTVAL & (1 << 0)) { VEC_SET_CLIP1_FLAG(0); }
86948891         if (RTVAL & (1 << 1)) { VEC_SET_CLIP1_FLAG(1); }
86958892         if (RTVAL & (1 << 2)) { VEC_SET_CLIP1_FLAG(2); }
r31833r31834
87018898         break;
87028899   }
87038900}
8901
8902static void cfunc_ctc2_simd(void *param)
8903{
8904   ((rsp_device *)param)->ccfunc_ctc2_simd();
8905}
87048906#endif
87058907
87068908#if (!USE_SIMD || SIMUL_SIMD)
8707static void cfunc_ctc2_scalar(void *param)
8909inline void rsp_device::ccfunc_ctc2_scalar()
87088910{
8709   rsp_state *rsp = (rsp_state*)param;
8710   UINT32 op = rsp->impstate->arg0;
8911   UINT32 op = m_rsp_state->arg0;
87118912   switch(RDREG)
87128913   {
87138914      case 0:
87148915         CLEAR_CARRY_FLAGS();
87158916         CLEAR_ZERO_FLAGS();
8716         rsp->vflag[0][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8717         rsp->vflag[0][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8718         rsp->vflag[0][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8719         rsp->vflag[0][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8720         rsp->vflag[0][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8721         rsp->vflag[0][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8722         rsp->vflag[0][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8723         rsp->vflag[0][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8917         m_vflag[0][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8918         m_vflag[0][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8919         m_vflag[0][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8920         m_vflag[0][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8921         m_vflag[0][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8922         m_vflag[0][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8923         m_vflag[0][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8924         m_vflag[0][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
87248925         if (RTVAL & (1 << 0))  { SET_CARRY_FLAG(0); }
87258926         if (RTVAL & (1 << 1))  { SET_CARRY_FLAG(1); }
87268927         if (RTVAL & (1 << 2))  { SET_CARRY_FLAG(2); }
r31833r31834
87298930         if (RTVAL & (1 << 5))  { SET_CARRY_FLAG(5); }
87308931         if (RTVAL & (1 << 6))  { SET_CARRY_FLAG(6); }
87318932         if (RTVAL & (1 << 7))  { SET_CARRY_FLAG(7); }
8732         rsp->vflag[3][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8733         rsp->vflag[3][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8734         rsp->vflag[3][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8735         rsp->vflag[3][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8736         rsp->vflag[3][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8737         rsp->vflag[3][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8738         rsp->vflag[3][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8739         rsp->vflag[3][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
8933         m_vflag[3][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8934         m_vflag[3][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8935         m_vflag[3][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8936         m_vflag[3][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8937         m_vflag[3][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8938         m_vflag[3][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8939         m_vflag[3][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8940         m_vflag[3][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
87408941         if (RTVAL & (1 << 8))  { SET_ZERO_FLAG(0); }
87418942         if (RTVAL & (1 << 9))  { SET_ZERO_FLAG(1); }
87428943         if (RTVAL & (1 << 10)) { SET_ZERO_FLAG(2); }
r31833r31834
87498950      case 1:
87508951         CLEAR_COMPARE_FLAGS();
87518952         CLEAR_CLIP2_FLAGS();
8752         rsp->vflag[1][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8753         rsp->vflag[1][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8754         rsp->vflag[1][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8755         rsp->vflag[1][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8756         rsp->vflag[1][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8757         rsp->vflag[1][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8758         rsp->vflag[1][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8759         rsp->vflag[1][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8953         m_vflag[1][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8954         m_vflag[1][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8955         m_vflag[1][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8956         m_vflag[1][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8957         m_vflag[1][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8958         m_vflag[1][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8959         m_vflag[1][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8960         m_vflag[1][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
87608961         if (RTVAL & (1 << 0)) { SET_COMPARE_FLAG(0); }
87618962         if (RTVAL & (1 << 1)) { SET_COMPARE_FLAG(1); }
87628963         if (RTVAL & (1 << 2)) { SET_COMPARE_FLAG(2); }
r31833r31834
87658966         if (RTVAL & (1 << 5)) { SET_COMPARE_FLAG(5); }
87668967         if (RTVAL & (1 << 6)) { SET_COMPARE_FLAG(6); }
87678968         if (RTVAL & (1 << 7)) { SET_COMPARE_FLAG(7); }
8768         rsp->vflag[4][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8769         rsp->vflag[4][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8770         rsp->vflag[4][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8771         rsp->vflag[4][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8772         rsp->vflag[4][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8773         rsp->vflag[4][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8774         rsp->vflag[4][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8775         rsp->vflag[4][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
8969         m_vflag[4][0] = ((RTVAL >> 8) & 1) ? 0xffff : 0;
8970         m_vflag[4][1] = ((RTVAL >> 9) & 1) ? 0xffff : 0;
8971         m_vflag[4][2] = ((RTVAL >> 10) & 1) ? 0xffff : 0;
8972         m_vflag[4][3] = ((RTVAL >> 11) & 1) ? 0xffff : 0;
8973         m_vflag[4][4] = ((RTVAL >> 12) & 1) ? 0xffff : 0;
8974         m_vflag[4][5] = ((RTVAL >> 13) & 1) ? 0xffff : 0;
8975         m_vflag[4][6] = ((RTVAL >> 14) & 1) ? 0xffff : 0;
8976         m_vflag[4][7] = ((RTVAL >> 15) & 1) ? 0xffff : 0;
87768977         if (RTVAL & (1 << 8))  { SET_CLIP2_FLAG(0); }
87778978         if (RTVAL & (1 << 9))  { SET_CLIP2_FLAG(1); }
87788979         if (RTVAL & (1 << 10)) { SET_CLIP2_FLAG(2); }
r31833r31834
87848985         break;
87858986      case 2:
87868987         CLEAR_CLIP1_FLAGS();
8787         rsp->vflag[2][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8788         rsp->vflag[2][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8789         rsp->vflag[2][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8790         rsp->vflag[2][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8791         rsp->vflag[2][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8792         rsp->vflag[2][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8793         rsp->vflag[2][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8794         rsp->vflag[2][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
8988         m_vflag[2][0] = ((RTVAL >> 0) & 1) ? 0xffff : 0;
8989         m_vflag[2][1] = ((RTVAL >> 1) & 1) ? 0xffff : 0;
8990         m_vflag[2][2] = ((RTVAL >> 2) & 1) ? 0xffff : 0;
8991         m_vflag[2][3] = ((RTVAL >> 3) & 1) ? 0xffff : 0;
8992         m_vflag[2][4] = ((RTVAL >> 4) & 1) ? 0xffff : 0;
8993         m_vflag[2][5] = ((RTVAL >> 5) & 1) ? 0xffff : 0;
8994         m_vflag[2][6] = ((RTVAL >> 6) & 1) ? 0xffff : 0;
8995         m_vflag[2][7] = ((RTVAL >> 7) & 1) ? 0xffff : 0;
87958996         if (RTVAL & (1 << 0)) { SET_CLIP1_FLAG(0); }
87968997         if (RTVAL & (1 << 1)) { SET_CLIP1_FLAG(1); }
87978998         if (RTVAL & (1 << 2)) { SET_CLIP1_FLAG(2); }
r31833r31834
88039004         break;
88049005   }
88059006}
9007
9008static void cfunc_ctc2_scalar(void *param)
9009{
9010   ((rsp_device *)param)->ccfunc_ctc2_scalar();
9011}
88069012#endif
88079013
88089014/***************************************************************************
r31833r31834
88149020    including disassembly of a RSP instruction
88159021-------------------------------------------------*/
88169022
8817static void log_add_disasm_comment(rsp_state *rsp, drcuml_block *block, UINT32 pc, UINT32 op)
9023void rsp_device::log_add_disasm_comment(drcuml_block *block, UINT32 pc, UINT32 op)
88189024{
8819#if (LOG_UML)
9025#if (RSP_LOG_UML)
88209026   char buffer[100];
88219027   rsp_dasm_one(buffer, pc, op);
88229028   block->append_comment("%08X: %s", pc, buffer);                                  // comment
88239029#endif
88249030}
88259031
8826
8827static CPU_SET_INFO( rsp )
8828{
8829   rsp_state *rsp = get_safe_token(device);
8830
8831   switch (state)
8832   {
8833      /* --- the following bits of info are set as 64-bit signed integers --- */
8834      case CPUINFO_INT_PC:
8835      case CPUINFO_INT_REGISTER + RSP_PC:             rsp->pc = info->i;        break;
8836      case CPUINFO_INT_REGISTER + RSP_R0:             rsp->r[0] = info->i;        break;
8837      case CPUINFO_INT_REGISTER + RSP_R1:             rsp->r[1] = info->i;        break;
8838      case CPUINFO_INT_REGISTER + RSP_R2:             rsp->r[2] = info->i;        break;
8839      case CPUINFO_INT_REGISTER + RSP_R3:             rsp->r[3] = info->i;        break;
8840      case CPUINFO_INT_REGISTER + RSP_R4:             rsp->r[4] = info->i;        break;
8841      case CPUINFO_INT_REGISTER + RSP_R5:             rsp->r[5] = info->i;        break;
8842      case CPUINFO_INT_REGISTER + RSP_R6:             rsp->r[6] = info->i;        break;
8843      case CPUINFO_INT_REGISTER + RSP_R7:             rsp->r[7] = info->i;        break;
8844      case CPUINFO_INT_REGISTER + RSP_R8:             rsp->r[8] = info->i;        break;
8845      case CPUINFO_INT_REGISTER + RSP_R9:             rsp->r[9] = info->i;        break;
8846      case CPUINFO_INT_REGISTER + RSP_R10:            rsp->r[10] = info->i;        break;
8847      case CPUINFO_INT_REGISTER + RSP_R11:            rsp->r[11] = info->i;        break;
8848      case CPUINFO_INT_REGISTER + RSP_R12:            rsp->r[12] = info->i;        break;
8849      case CPUINFO_INT_REGISTER + RSP_R13:            rsp->r[13] = info->i;        break;
8850      case CPUINFO_INT_REGISTER + RSP_R14:            rsp->r[14] = info->i;        break;
8851      case CPUINFO_INT_REGISTER + RSP_R15:            rsp->r[15] = info->i;        break;
8852      case CPUINFO_INT_REGISTER + RSP_R16:            rsp->r[16] = info->i;        break;
8853      case CPUINFO_INT_REGISTER + RSP_R17:            rsp->r[17] = info->i;        break;
8854      case CPUINFO_INT_REGISTER + RSP_R18:            rsp->r[18] = info->i;        break;
8855      case CPUINFO_INT_REGISTER + RSP_R19:            rsp->r[19] = info->i;        break;
8856      case CPUINFO_INT_REGISTER + RSP_R20:            rsp->r[20] = info->i;        break;
8857      case CPUINFO_INT_REGISTER + RSP_R21:            rsp->r[21] = info->i;        break;
8858      case CPUINFO_INT_REGISTER + RSP_R22:            rsp->r[22] = info->i;        break;
8859      case CPUINFO_INT_REGISTER + RSP_R23:            rsp->r[23] = info->i;        break;
8860      case CPUINFO_INT_REGISTER + RSP_R24:            rsp->r[24] = info->i;        break;
8861      case CPUINFO_INT_REGISTER + RSP_R25:            rsp->r[25] = info->i;        break;
8862      case CPUINFO_INT_REGISTER + RSP_R26:            rsp->r[26] = info->i;        break;
8863      case CPUINFO_INT_REGISTER + RSP_R27:            rsp->r[27] = info->i;        break;
8864      case CPUINFO_INT_REGISTER + RSP_R28:            rsp->r[28] = info->i;        break;
8865      case CPUINFO_INT_REGISTER + RSP_R29:            rsp->r[29] = info->i;        break;
8866      case CPUINFO_INT_REGISTER + RSP_R30:            rsp->r[30] = info->i;        break;
8867      case CPUINFO_INT_SP:
8868      case CPUINFO_INT_REGISTER + RSP_R31:            rsp->r[31] = info->i;        break;
8869      case CPUINFO_INT_REGISTER + RSP_SR:             rsp->sr = info->i;           break;
8870      case CPUINFO_INT_REGISTER + RSP_NEXTPC:         rsp->nextpc = info->i;       break;
8871      case CPUINFO_INT_REGISTER + RSP_STEPCNT:        rsp->step_count = info->i;   break;
8872   }
8873}
8874
8875CPU_GET_INFO( rsp_drc )
8876{
8877   rsp_state *rsp = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
8878
8879   switch(state)
8880   {
8881      /* --- the following bits of info are returned as 64-bit signed integers --- */
8882      case CPUINFO_INT_CONTEXT_SIZE:                  info->i = sizeof(rsp_state);                    break;
8883      case CPUINFO_INT_INPUT_LINES:                   info->i = 1;                            break;
8884      case CPUINFO_INT_DEFAULT_IRQ_VECTOR:            info->i = 0;                            break;
8885      case CPUINFO_INT_ENDIANNESS:                    info->i = ENDIANNESS_BIG;               break;
8886      case CPUINFO_INT_CLOCK_MULTIPLIER:              info->i = 1;                            break;
8887      case CPUINFO_INT_CLOCK_DIVIDER:                 info->i = 1;                            break;
8888      case CPUINFO_INT_MIN_INSTRUCTION_BYTES:         info->i = 4;                            break;
8889      case CPUINFO_INT_MAX_INSTRUCTION_BYTES:         info->i = 4;                            break;
8890      case CPUINFO_INT_MIN_CYCLES:                    info->i = 1;                            break;
8891      case CPUINFO_INT_MAX_CYCLES:                    info->i = 1;                            break;
8892
8893      case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 32;                   break;
8894      case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 32;                  break;
8895      case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0;                   break;
8896      case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;                    break;
8897      case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;                    break;
8898      case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;                    break;
8899      case CPUINFO_INT_DATABUS_WIDTH + AS_IO:     info->i = 0;                    break;
8900      case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO:     info->i = 0;                    break;
8901      case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO:     info->i = 0;                    break;
8902
8903      case CPUINFO_INT_INPUT_STATE:                   info->i = CLEAR_LINE;                   break;
8904
8905      case CPUINFO_INT_PREVIOUSPC:                    info->i = rsp->ppc | 0x04000000;                        break;
8906
8907      case CPUINFO_INT_PC:    /* intentional fallthrough */
8908      case CPUINFO_INT_REGISTER + RSP_PC:             info->i = rsp->pc | 0x04000000;                     break;
8909
8910      case CPUINFO_INT_REGISTER + RSP_R0:             info->i = rsp->r[0];                        break;
8911      case CPUINFO_INT_REGISTER + RSP_R1:             info->i = rsp->r[1];                        break;
8912      case CPUINFO_INT_REGISTER + RSP_R2:             info->i = rsp->r[2];                        break;
8913      case CPUINFO_INT_REGISTER + RSP_R3:             info->i = rsp->r[3];                        break;
8914      case CPUINFO_INT_REGISTER + RSP_R4:             info->i = rsp->r[4];                        break;
8915      case CPUINFO_INT_REGISTER + RSP_R5:             info->i = rsp->r[5];                        break;
8916      case CPUINFO_INT_REGISTER + RSP_R6:             info->i = rsp->r[6];                        break;
8917      case CPUINFO_INT_REGISTER + RSP_R7:             info->i = rsp->r[7];                        break;
8918      case CPUINFO_INT_REGISTER + RSP_R8:             info->i = rsp->r[8];                        break;
8919      case CPUINFO_INT_REGISTER + RSP_R9:             info->i = rsp->r[9];                        break;
8920      case CPUINFO_INT_REGISTER + RSP_R10:            info->i = rsp->r[10];                   break;
8921      case CPUINFO_INT_REGISTER + RSP_R11:            info->i = rsp->r[11];                   break;
8922      case CPUINFO_INT_REGISTER + RSP_R12:            info->i = rsp->r[12];                   break;
8923      case CPUINFO_INT_REGISTER + RSP_R13:            info->i = rsp->r[13];                   break;
8924      case CPUINFO_INT_REGISTER + RSP_R14:            info->i = rsp->r[14];                   break;
8925      case CPUINFO_INT_REGISTER + RSP_R15:            info->i = rsp->r[15];                   break;
8926      case CPUINFO_INT_REGISTER + RSP_R16:            info->i = rsp->r[16];                   break;
8927      case CPUINFO_INT_REGISTER + RSP_R17:            info->i = rsp->r[17];                   break;
8928      case CPUINFO_INT_REGISTER + RSP_R18:            info->i = rsp->r[18];                   break;
8929      case CPUINFO_INT_REGISTER + RSP_R19:            info->i = rsp->r[19];                   break;
8930      case CPUINFO_INT_REGISTER + RSP_R20:            info->i = rsp->r[20];                   break;
8931      case CPUINFO_INT_REGISTER + RSP_R21:            info->i = rsp->r[21];                   break;
8932      case CPUINFO_INT_REGISTER + RSP_R22:            info->i = rsp->r[22];                   break;
8933      case CPUINFO_INT_REGISTER + RSP_R23:            info->i = rsp->r[23];                   break;
8934      case CPUINFO_INT_REGISTER + RSP_R24:            info->i = rsp->r[24];                   break;
8935      case CPUINFO_INT_REGISTER + RSP_R25:            info->i = rsp->r[25];                   break;
8936      case CPUINFO_INT_REGISTER + RSP_R26:            info->i = rsp->r[26];                   break;
8937      case CPUINFO_INT_REGISTER + RSP_R27:            info->i = rsp->r[27];                   break;
8938      case CPUINFO_INT_REGISTER + RSP_R28:            info->i = rsp->r[28];                   break;
8939      case CPUINFO_INT_REGISTER + RSP_R29:            info->i = rsp->r[29];                   break;
8940      case CPUINFO_INT_REGISTER + RSP_R30:            info->i = rsp->r[30];                   break;
8941      case CPUINFO_INT_SP:
8942      case CPUINFO_INT_REGISTER + RSP_R31:            info->i = rsp->r[31];                    break;
8943      case CPUINFO_INT_REGISTER + RSP_SR:             info->i = rsp->sr;                       break;
8944      case CPUINFO_INT_REGISTER + RSP_NEXTPC:         info->i = rsp->nextpc | 0x04000000;      break;
8945      case CPUINFO_INT_REGISTER + RSP_STEPCNT:        info->i = rsp->step_count;               break;
8946
8947      /* --- the following bits of info are returned as pointers to data or functions --- */
8948      case CPUINFO_FCT_SET_INFO:                      info->setinfo = CPU_SET_INFO_NAME(rsp);         break;
8949      case CPUINFO_FCT_INIT:                          info->init = CPU_INIT_NAME(rsp);                    break;
8950      case CPUINFO_FCT_RESET:                         info->reset = CPU_RESET_NAME(rsp);              break;
8951      case CPUINFO_FCT_EXIT:                          info->exit = CPU_EXIT_NAME(rsp);                    break;
8952      case CPUINFO_FCT_EXECUTE:                       info->execute = CPU_EXECUTE_NAME(rsp);          break;
8953      case CPUINFO_FCT_BURN:                          info->burn = NULL;                      break;
8954      case CPUINFO_FCT_DISASSEMBLE:                   info->disassemble = CPU_DISASSEMBLE_NAME(rsp);          break;
8955      case CPUINFO_PTR_INSTRUCTION_COUNTER:           info->icount = &rsp->icount;                break;
8956
8957      /* --- the following bits of info are returned as NULL-terminated strings --- */
8958      case CPUINFO_STR_NAME:                          strcpy(info->s, "RSP DRC");                 break;
8959      case CPUINFO_STR_SHORTNAME:                     strcpy(info->s, "rsp_drc");                 break;
8960      case CPUINFO_STR_FAMILY:                    strcpy(info->s, "RSP");                 break;
8961      case CPUINFO_STR_VERSION:                   strcpy(info->s, "1.0");                 break;
8962      case CPUINFO_STR_SOURCE_FILE:                       strcpy(info->s, __FILE__);              break;
8963      case CPUINFO_STR_CREDITS:                   strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break;
8964
8965      case CPUINFO_STR_FLAGS:                         strcpy(info->s, " ");                   break;
8966
8967      case CPUINFO_STR_REGISTER + RSP_PC:             sprintf(info->s, "PC: %08X", rsp->pc | 0x04000000); break;
8968
8969      case CPUINFO_STR_REGISTER + RSP_R0:             sprintf(info->s, "R0: %08X", rsp->r[0]); break;
8970      case CPUINFO_STR_REGISTER + RSP_R1:             sprintf(info->s, "R1: %08X", rsp->r[1]); break;
8971      case CPUINFO_STR_REGISTER + RSP_R2:             sprintf(info->s, "R2: %08X", rsp->r[2]); break;
8972      case CPUINFO_STR_REGISTER + RSP_R3:             sprintf(info->s, "R3: %08X", rsp->r[3]); break;
8973      case CPUINFO_STR_REGISTER + RSP_R4:             sprintf(info->s, "R4: %08X", rsp->r[4]); break;
8974      case CPUINFO_STR_REGISTER + RSP_R5:             sprintf(info->s, "R5: %08X", rsp->r[5]); break;
8975      case CPUINFO_STR_REGISTER + RSP_R6:             sprintf(info->s, "R6: %08X", rsp->r[6]); break;
8976      case CPUINFO_STR_REGISTER + RSP_R7:             sprintf(info->s, "R7: %08X", rsp->r[7]); break;
8977      case CPUINFO_STR_REGISTER + RSP_R8:             sprintf(info->s, "R8: %08X", rsp->r[8]); break;
8978      case CPUINFO_STR_REGISTER + RSP_R9:             sprintf(info->s, "R9: %08X", rsp->r[9]); break;
8979      case CPUINFO_STR_REGISTER + RSP_R10:            sprintf(info->s, "R10: %08X", rsp->r[10]); break;
8980      case CPUINFO_STR_REGISTER + RSP_R11:            sprintf(info->s, "R11: %08X", rsp->r[11]); break;
8981      case CPUINFO_STR_REGISTER + RSP_R12:            sprintf(info->s, "R12: %08X", rsp->r[12]); break;
8982      case CPUINFO_STR_REGISTER + RSP_R13:            sprintf(info->s, "R13: %08X", rsp->r[13]); break;
8983      case CPUINFO_STR_REGISTER + RSP_R14:            sprintf(info->s, "R14: %08X", rsp->r[14]); break;
8984      case CPUINFO_STR_REGISTER + RSP_R15:            sprintf(info->s, "R15: %08X", rsp->r[15]); break;
8985      case CPUINFO_STR_REGISTER + RSP_R16:            sprintf(info->s, "R16: %08X", rsp->r[16]); break;
8986      case CPUINFO_STR_REGISTER + RSP_R17:            sprintf(info->s, "R17: %08X", rsp->r[17]); break;
8987      case CPUINFO_STR_REGISTER + RSP_R18:            sprintf(info->s, "R18: %08X", rsp->r[18]); break;
8988      case CPUINFO_STR_REGISTER + RSP_R19:            sprintf(info->s, "R19: %08X", rsp->r[19]); break;
8989      case CPUINFO_STR_REGISTER + RSP_R20:            sprintf(info->s, "R20: %08X", rsp->r[20]); break;
8990      case CPUINFO_STR_REGISTER + RSP_R21:            sprintf(info->s, "R21: %08X", rsp->r[21]); break;
8991      case CPUINFO_STR_REGISTER + RSP_R22:            sprintf(info->s, "R22: %08X", rsp->r[22]); break;
8992      case CPUINFO_STR_REGISTER + RSP_R23:            sprintf(info->s, "R23: %08X", rsp->r[23]); break;
8993      case CPUINFO_STR_REGISTER + RSP_R24:            sprintf(info->s, "R24: %08X", rsp->r[24]); break;
8994      case CPUINFO_STR_REGISTER + RSP_R25:            sprintf(info->s, "R25: %08X", rsp->r[25]); break;
8995      case CPUINFO_STR_REGISTER + RSP_R26:            sprintf(info->s, "R26: %08X", rsp->r[26]); break;
8996      case CPUINFO_STR_REGISTER + RSP_R27:            sprintf(info->s, "R27: %08X", rsp->r[27]); break;
8997      case CPUINFO_STR_REGISTER + RSP_R28:            sprintf(info->s, "R28: %08X", rsp->r[28]); break;
8998      case CPUINFO_STR_REGISTER + RSP_R29:            sprintf(info->s, "R29: %08X", rsp->r[29]); break;
8999      case CPUINFO_STR_REGISTER + RSP_R30:            sprintf(info->s, "R30: %08X", rsp->r[30]); break;
9000      case CPUINFO_STR_REGISTER + RSP_R31:            sprintf(info->s, "R31: %08X", rsp->r[31]); break;
9001
9002#if USE_SIMD
9003      case CPUINFO_STR_REGISTER + RSP_V0:             sprintf(info->s, "V0: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 0], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 0], 0)); break;
9004      case CPUINFO_STR_REGISTER + RSP_V1:             sprintf(info->s, "V1: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 1], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 1], 0)); break;
9005      case CPUINFO_STR_REGISTER + RSP_V2:             sprintf(info->s, "V2: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 2], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 2], 0)); break;
9006      case CPUINFO_STR_REGISTER + RSP_V3:             sprintf(info->s, "V3: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 3], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 3], 0)); break;
9007      case CPUINFO_STR_REGISTER + RSP_V4:             sprintf(info->s, "V4: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 4], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 4], 0)); break;
9008      case CPUINFO_STR_REGISTER + RSP_V5:             sprintf(info->s, "V5: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 5], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 5], 0)); break;
9009      case CPUINFO_STR_REGISTER + RSP_V6:             sprintf(info->s, "V6: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 6], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 6], 0)); break;
9010      case CPUINFO_STR_REGISTER + RSP_V7:             sprintf(info->s, "V7: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 7], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 7], 0)); break;
9011      case CPUINFO_STR_REGISTER + RSP_V8:             sprintf(info->s, "V8: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 8], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 8], 0)); break;
9012      case CPUINFO_STR_REGISTER + RSP_V9:             sprintf(info->s, "V9: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)_mm_extract_epi16(rsp->xv[ 9], 7), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 6), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 5), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 4), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 3), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 2), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 1), (UINT16)_mm_extract_epi16(rsp->xv[ 9], 0)); break;
9013      case CPUINFO_STR_REGISTER + RSP_V10:            sprintf(info->s, "V10: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[10], 7), (UINT16)_mm_extract_epi16(rsp->xv[10], 6), (UINT16)_mm_extract_epi16(rsp->xv[10], 5), (UINT16)_mm_extract_epi16(rsp->xv[10], 4), (UINT16)_mm_extract_epi16(rsp->xv[10], 3), (UINT16)_mm_extract_epi16(rsp->xv[10], 2), (UINT16)_mm_extract_epi16(rsp->xv[10], 1), (UINT16)_mm_extract_epi16(rsp->xv[10], 0)); break;
9014      case CPUINFO_STR_REGISTER + RSP_V11:            sprintf(info->s, "V11: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[11], 7), (UINT16)_mm_extract_epi16(rsp->xv[11], 6), (UINT16)_mm_extract_epi16(rsp->xv[11], 5), (UINT16)_mm_extract_epi16(rsp->xv[11], 4), (UINT16)_mm_extract_epi16(rsp->xv[11], 3), (UINT16)_mm_extract_epi16(rsp->xv[11], 2), (UINT16)_mm_extract_epi16(rsp->xv[11], 1), (UINT16)_mm_extract_epi16(rsp->xv[11], 0)); break;
9015      case CPUINFO_STR_REGISTER + RSP_V12:            sprintf(info->s, "V12: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[12], 7), (UINT16)_mm_extract_epi16(rsp->xv[12], 6), (UINT16)_mm_extract_epi16(rsp->xv[12], 5), (UINT16)_mm_extract_epi16(rsp->xv[12], 4), (UINT16)_mm_extract_epi16(rsp->xv[12], 3), (UINT16)_mm_extract_epi16(rsp->xv[12], 2), (UINT16)_mm_extract_epi16(rsp->xv[12], 1), (UINT16)_mm_extract_epi16(rsp->xv[12], 0)); break;
9016      case CPUINFO_STR_REGISTER + RSP_V13:            sprintf(info->s, "V13: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[13], 7), (UINT16)_mm_extract_epi16(rsp->xv[13], 6), (UINT16)_mm_extract_epi16(rsp->xv[13], 5), (UINT16)_mm_extract_epi16(rsp->xv[13], 4), (UINT16)_mm_extract_epi16(rsp->xv[13], 3), (UINT16)_mm_extract_epi16(rsp->xv[13], 2), (UINT16)_mm_extract_epi16(rsp->xv[13], 1), (UINT16)_mm_extract_epi16(rsp->xv[13], 0)); break;
9017      case CPUINFO_STR_REGISTER + RSP_V14:            sprintf(info->s, "V14: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[14], 7), (UINT16)_mm_extract_epi16(rsp->xv[14], 6), (UINT16)_mm_extract_epi16(rsp->xv[14], 5), (UINT16)_mm_extract_epi16(rsp->xv[14], 4), (UINT16)_mm_extract_epi16(rsp->xv[14], 3), (UINT16)_mm_extract_epi16(rsp->xv[14], 2), (UINT16)_mm_extract_epi16(rsp->xv[14], 1), (UINT16)_mm_extract_epi16(rsp->xv[14], 0)); break;
9018      case CPUINFO_STR_REGISTER + RSP_V15:            sprintf(info->s, "V15: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[15], 7), (UINT16)_mm_extract_epi16(rsp->xv[15], 6), (UINT16)_mm_extract_epi16(rsp->xv[15], 5), (UINT16)_mm_extract_epi16(rsp->xv[15], 4), (UINT16)_mm_extract_epi16(rsp->xv[15], 3), (UINT16)_mm_extract_epi16(rsp->xv[15], 2), (UINT16)_mm_extract_epi16(rsp->xv[15], 1), (UINT16)_mm_extract_epi16(rsp->xv[15], 0)); break;
9019      case CPUINFO_STR_REGISTER + RSP_V16:            sprintf(info->s, "V16: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[16], 7), (UINT16)_mm_extract_epi16(rsp->xv[16], 6), (UINT16)_mm_extract_epi16(rsp->xv[16], 5), (UINT16)_mm_extract_epi16(rsp->xv[16], 4), (UINT16)_mm_extract_epi16(rsp->xv[16], 3), (UINT16)_mm_extract_epi16(rsp->xv[16], 2), (UINT16)_mm_extract_epi16(rsp->xv[16], 1), (UINT16)_mm_extract_epi16(rsp->xv[16], 0)); break;
9020      case CPUINFO_STR_REGISTER + RSP_V17:            sprintf(info->s, "V17: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[17], 7), (UINT16)_mm_extract_epi16(rsp->xv[17], 6), (UINT16)_mm_extract_epi16(rsp->xv[17], 5), (UINT16)_mm_extract_epi16(rsp->xv[17], 4), (UINT16)_mm_extract_epi16(rsp->xv[17], 3), (UINT16)_mm_extract_epi16(rsp->xv[17], 2), (UINT16)_mm_extract_epi16(rsp->xv[17], 1), (UINT16)_mm_extract_epi16(rsp->xv[17], 0)); break;
9021      case CPUINFO_STR_REGISTER + RSP_V18:            sprintf(info->s, "V18: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[18], 7), (UINT16)_mm_extract_epi16(rsp->xv[18], 6), (UINT16)_mm_extract_epi16(rsp->xv[18], 5), (UINT16)_mm_extract_epi16(rsp->xv[18], 4), (UINT16)_mm_extract_epi16(rsp->xv[18], 3), (UINT16)_mm_extract_epi16(rsp->xv[18], 2), (UINT16)_mm_extract_epi16(rsp->xv[18], 1), (UINT16)_mm_extract_epi16(rsp->xv[18], 0)); break;
9022      case CPUINFO_STR_REGISTER + RSP_V19:            sprintf(info->s, "V19: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[19], 7), (UINT16)_mm_extract_epi16(rsp->xv[19], 6), (UINT16)_mm_extract_epi16(rsp->xv[19], 5), (UINT16)_mm_extract_epi16(rsp->xv[19], 4), (UINT16)_mm_extract_epi16(rsp->xv[19], 3), (UINT16)_mm_extract_epi16(rsp->xv[19], 2), (UINT16)_mm_extract_epi16(rsp->xv[19], 1), (UINT16)_mm_extract_epi16(rsp->xv[19], 0)); break;
9023      case CPUINFO_STR_REGISTER + RSP_V20:            sprintf(info->s, "V20: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[20], 7), (UINT16)_mm_extract_epi16(rsp->xv[20], 6), (UINT16)_mm_extract_epi16(rsp->xv[20], 5), (UINT16)_mm_extract_epi16(rsp->xv[20], 4), (UINT16)_mm_extract_epi16(rsp->xv[20], 3), (UINT16)_mm_extract_epi16(rsp->xv[20], 2), (UINT16)_mm_extract_epi16(rsp->xv[20], 1), (UINT16)_mm_extract_epi16(rsp->xv[20], 0)); break;
9024      case CPUINFO_STR_REGISTER + RSP_V21:            sprintf(info->s, "V21: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[21], 7), (UINT16)_mm_extract_epi16(rsp->xv[21], 6), (UINT16)_mm_extract_epi16(rsp->xv[21], 5), (UINT16)_mm_extract_epi16(rsp->xv[21], 4), (UINT16)_mm_extract_epi16(rsp->xv[21], 3), (UINT16)_mm_extract_epi16(rsp->xv[21], 2), (UINT16)_mm_extract_epi16(rsp->xv[21], 1), (UINT16)_mm_extract_epi16(rsp->xv[21], 0)); break;
9025      case CPUINFO_STR_REGISTER + RSP_V22:            sprintf(info->s, "V22: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[22], 7), (UINT16)_mm_extract_epi16(rsp->xv[22], 6), (UINT16)_mm_extract_epi16(rsp->xv[22], 5), (UINT16)_mm_extract_epi16(rsp->xv[22], 4), (UINT16)_mm_extract_epi16(rsp->xv[22], 3), (UINT16)_mm_extract_epi16(rsp->xv[22], 2), (UINT16)_mm_extract_epi16(rsp->xv[22], 1), (UINT16)_mm_extract_epi16(rsp->xv[22], 0)); break;
9026      case CPUINFO_STR_REGISTER + RSP_V23:            sprintf(info->s, "V23: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[23], 7), (UINT16)_mm_extract_epi16(rsp->xv[23], 6), (UINT16)_mm_extract_epi16(rsp->xv[23], 5), (UINT16)_mm_extract_epi16(rsp->xv[23], 4), (UINT16)_mm_extract_epi16(rsp->xv[23], 3), (UINT16)_mm_extract_epi16(rsp->xv[23], 2), (UINT16)_mm_extract_epi16(rsp->xv[23], 1), (UINT16)_mm_extract_epi16(rsp->xv[23], 0)); break;
9027      case CPUINFO_STR_REGISTER + RSP_V24:            sprintf(info->s, "V24: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[24], 7), (UINT16)_mm_extract_epi16(rsp->xv[24], 6), (UINT16)_mm_extract_epi16(rsp->xv[24], 5), (UINT16)_mm_extract_epi16(rsp->xv[24], 4), (UINT16)_mm_extract_epi16(rsp->xv[24], 3), (UINT16)_mm_extract_epi16(rsp->xv[24], 2), (UINT16)_mm_extract_epi16(rsp->xv[24], 1), (UINT16)_mm_extract_epi16(rsp->xv[24], 0)); break;
9028      case CPUINFO_STR_REGISTER + RSP_V25:            sprintf(info->s, "V25: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[25], 7), (UINT16)_mm_extract_epi16(rsp->xv[25], 6), (UINT16)_mm_extract_epi16(rsp->xv[25], 5), (UINT16)_mm_extract_epi16(rsp->xv[25], 4), (UINT16)_mm_extract_epi16(rsp->xv[25], 3), (UINT16)_mm_extract_epi16(rsp->xv[25], 2), (UINT16)_mm_extract_epi16(rsp->xv[25], 1), (UINT16)_mm_extract_epi16(rsp->xv[25], 0)); break;
9029      case CPUINFO_STR_REGISTER + RSP_V26:            sprintf(info->s, "V26: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[26], 7), (UINT16)_mm_extract_epi16(rsp->xv[26], 6), (UINT16)_mm_extract_epi16(rsp->xv[26], 5), (UINT16)_mm_extract_epi16(rsp->xv[26], 4), (UINT16)_mm_extract_epi16(rsp->xv[26], 3), (UINT16)_mm_extract_epi16(rsp->xv[26], 2), (UINT16)_mm_extract_epi16(rsp->xv[26], 1), (UINT16)_mm_extract_epi16(rsp->xv[26], 0)); break;
9030      case CPUINFO_STR_REGISTER + RSP_V27:            sprintf(info->s, "V27: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[27], 7), (UINT16)_mm_extract_epi16(rsp->xv[27], 6), (UINT16)_mm_extract_epi16(rsp->xv[27], 5), (UINT16)_mm_extract_epi16(rsp->xv[27], 4), (UINT16)_mm_extract_epi16(rsp->xv[27], 3), (UINT16)_mm_extract_epi16(rsp->xv[27], 2), (UINT16)_mm_extract_epi16(rsp->xv[27], 1), (UINT16)_mm_extract_epi16(rsp->xv[27], 0)); break;
9031      case CPUINFO_STR_REGISTER + RSP_V28:            sprintf(info->s, "V28: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[28], 7), (UINT16)_mm_extract_epi16(rsp->xv[28], 6), (UINT16)_mm_extract_epi16(rsp->xv[28], 5), (UINT16)_mm_extract_epi16(rsp->xv[28], 4), (UINT16)_mm_extract_epi16(rsp->xv[28], 3), (UINT16)_mm_extract_epi16(rsp->xv[28], 2), (UINT16)_mm_extract_epi16(rsp->xv[28], 1), (UINT16)_mm_extract_epi16(rsp->xv[28], 0)); break;
9032      case CPUINFO_STR_REGISTER + RSP_V29:            sprintf(info->s, "V29: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[29], 7), (UINT16)_mm_extract_epi16(rsp->xv[29], 6), (UINT16)_mm_extract_epi16(rsp->xv[29], 5), (UINT16)_mm_extract_epi16(rsp->xv[29], 4), (UINT16)_mm_extract_epi16(rsp->xv[29], 3), (UINT16)_mm_extract_epi16(rsp->xv[29], 2), (UINT16)_mm_extract_epi16(rsp->xv[29], 1), (UINT16)_mm_extract_epi16(rsp->xv[29], 0)); break;
9033      case CPUINFO_STR_REGISTER + RSP_V30:            sprintf(info->s, "V30: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[30], 7), (UINT16)_mm_extract_epi16(rsp->xv[30], 6), (UINT16)_mm_extract_epi16(rsp->xv[30], 5), (UINT16)_mm_extract_epi16(rsp->xv[30], 4), (UINT16)_mm_extract_epi16(rsp->xv[30], 3), (UINT16)_mm_extract_epi16(rsp->xv[30], 2), (UINT16)_mm_extract_epi16(rsp->xv[30], 1), (UINT16)_mm_extract_epi16(rsp->xv[30], 0)); break;
9034      case CPUINFO_STR_REGISTER + RSP_V31:            sprintf(info->s, "V31: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(rsp->xv[31], 7), (UINT16)_mm_extract_epi16(rsp->xv[31], 6), (UINT16)_mm_extract_epi16(rsp->xv[31], 5), (UINT16)_mm_extract_epi16(rsp->xv[31], 4), (UINT16)_mm_extract_epi16(rsp->xv[31], 3), (UINT16)_mm_extract_epi16(rsp->xv[31], 2), (UINT16)_mm_extract_epi16(rsp->xv[31], 1), (UINT16)_mm_extract_epi16(rsp->xv[31], 0)); break;
9035#else
9036      case CPUINFO_STR_REGISTER + RSP_V0:             sprintf(info->s, "V0: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 0, 0), (UINT16)VREG_S( 0, 1), (UINT16)VREG_S( 0, 2), (UINT16)VREG_S( 0, 3), (UINT16)VREG_S( 0, 4), (UINT16)VREG_S( 0, 5), (UINT16)VREG_S( 0, 6), (UINT16)VREG_S( 0, 7)); break;
9037      case CPUINFO_STR_REGISTER + RSP_V1:             sprintf(info->s, "V1: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 1, 0), (UINT16)VREG_S( 1, 1), (UINT16)VREG_S( 1, 2), (UINT16)VREG_S( 1, 3), (UINT16)VREG_S( 1, 4), (UINT16)VREG_S( 1, 5), (UINT16)VREG_S( 1, 6), (UINT16)VREG_S( 1, 7)); break;
9038      case CPUINFO_STR_REGISTER + RSP_V2:             sprintf(info->s, "V2: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 2, 0), (UINT16)VREG_S( 2, 1), (UINT16)VREG_S( 2, 2), (UINT16)VREG_S( 2, 3), (UINT16)VREG_S( 2, 4), (UINT16)VREG_S( 2, 5), (UINT16)VREG_S( 2, 6), (UINT16)VREG_S( 2, 7)); break;
9039      case CPUINFO_STR_REGISTER + RSP_V3:             sprintf(info->s, "V3: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 3, 0), (UINT16)VREG_S( 3, 1), (UINT16)VREG_S( 3, 2), (UINT16)VREG_S( 3, 3), (UINT16)VREG_S( 3, 4), (UINT16)VREG_S( 3, 5), (UINT16)VREG_S( 3, 6), (UINT16)VREG_S( 3, 7)); break;
9040      case CPUINFO_STR_REGISTER + RSP_V4:             sprintf(info->s, "V4: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 4, 0), (UINT16)VREG_S( 4, 1), (UINT16)VREG_S( 4, 2), (UINT16)VREG_S( 4, 3), (UINT16)VREG_S( 4, 4), (UINT16)VREG_S( 4, 5), (UINT16)VREG_S( 4, 6), (UINT16)VREG_S( 4, 7)); break;
9041      case CPUINFO_STR_REGISTER + RSP_V5:             sprintf(info->s, "V5: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 5, 0), (UINT16)VREG_S( 5, 1), (UINT16)VREG_S( 5, 2), (UINT16)VREG_S( 5, 3), (UINT16)VREG_S( 5, 4), (UINT16)VREG_S( 5, 5), (UINT16)VREG_S( 5, 6), (UINT16)VREG_S( 5, 7)); break;
9042      case CPUINFO_STR_REGISTER + RSP_V6:             sprintf(info->s, "V6: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 6, 0), (UINT16)VREG_S( 6, 1), (UINT16)VREG_S( 6, 2), (UINT16)VREG_S( 6, 3), (UINT16)VREG_S( 6, 4), (UINT16)VREG_S( 6, 5), (UINT16)VREG_S( 6, 6), (UINT16)VREG_S( 6, 7)); break;
9043      case CPUINFO_STR_REGISTER + RSP_V7:             sprintf(info->s, "V7: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 7, 0), (UINT16)VREG_S( 7, 1), (UINT16)VREG_S( 7, 2), (UINT16)VREG_S( 7, 3), (UINT16)VREG_S( 7, 4), (UINT16)VREG_S( 7, 5), (UINT16)VREG_S( 7, 6), (UINT16)VREG_S( 7, 7)); break;
9044      case CPUINFO_STR_REGISTER + RSP_V8:             sprintf(info->s, "V8: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 8, 0), (UINT16)VREG_S( 8, 1), (UINT16)VREG_S( 8, 2), (UINT16)VREG_S( 8, 3), (UINT16)VREG_S( 8, 4), (UINT16)VREG_S( 8, 5), (UINT16)VREG_S( 8, 6), (UINT16)VREG_S( 8, 7)); break;
9045      case CPUINFO_STR_REGISTER + RSP_V9:             sprintf(info->s, "V9: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X",  (UINT16)VREG_S( 9, 0), (UINT16)VREG_S( 9, 1), (UINT16)VREG_S( 9, 2), (UINT16)VREG_S( 9, 3), (UINT16)VREG_S( 9, 4), (UINT16)VREG_S( 9, 5), (UINT16)VREG_S( 9, 6), (UINT16)VREG_S( 9, 7)); break;
9046      case CPUINFO_STR_REGISTER + RSP_V10:            sprintf(info->s, "V10: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(10, 0), (UINT16)VREG_S(10, 1), (UINT16)VREG_S(10, 2), (UINT16)VREG_S(10, 3), (UINT16)VREG_S(10, 4), (UINT16)VREG_S(10, 5), (UINT16)VREG_S(10, 6), (UINT16)VREG_S(10, 7)); break;
9047      case CPUINFO_STR_REGISTER + RSP_V11:            sprintf(info->s, "V11: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(11, 0), (UINT16)VREG_S(11, 1), (UINT16)VREG_S(11, 2), (UINT16)VREG_S(11, 3), (UINT16)VREG_S(11, 4), (UINT16)VREG_S(11, 5), (UINT16)VREG_S(11, 6), (UINT16)VREG_S(11, 7)); break;
9048      case CPUINFO_STR_REGISTER + RSP_V12:            sprintf(info->s, "V12: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(12, 0), (UINT16)VREG_S(12, 1), (UINT16)VREG_S(12, 2), (UINT16)VREG_S(12, 3), (UINT16)VREG_S(12, 4), (UINT16)VREG_S(12, 5), (UINT16)VREG_S(12, 6), (UINT16)VREG_S(12, 7)); break;
9049      case CPUINFO_STR_REGISTER + RSP_V13:            sprintf(info->s, "V13: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(13, 0), (UINT16)VREG_S(13, 1), (UINT16)VREG_S(13, 2), (UINT16)VREG_S(13, 3), (UINT16)VREG_S(13, 4), (UINT16)VREG_S(13, 5), (UINT16)VREG_S(13, 6), (UINT16)VREG_S(13, 7)); break;
9050      case CPUINFO_STR_REGISTER + RSP_V14:            sprintf(info->s, "V14: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(14, 0), (UINT16)VREG_S(14, 1), (UINT16)VREG_S(14, 2), (UINT16)VREG_S(14, 3), (UINT16)VREG_S(14, 4), (UINT16)VREG_S(14, 5), (UINT16)VREG_S(14, 6), (UINT16)VREG_S(14, 7)); break;
9051      case CPUINFO_STR_REGISTER + RSP_V15:            sprintf(info->s, "V15: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(15, 0), (UINT16)VREG_S(15, 1), (UINT16)VREG_S(15, 2), (UINT16)VREG_S(15, 3), (UINT16)VREG_S(15, 4), (UINT16)VREG_S(15, 5), (UINT16)VREG_S(15, 6), (UINT16)VREG_S(15, 7)); break;
9052      case CPUINFO_STR_REGISTER + RSP_V16:            sprintf(info->s, "V16: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(16, 0), (UINT16)VREG_S(16, 1), (UINT16)VREG_S(16, 2), (UINT16)VREG_S(16, 3), (UINT16)VREG_S(16, 4), (UINT16)VREG_S(16, 5), (UINT16)VREG_S(16, 6), (UINT16)VREG_S(16, 7)); break;
9053      case CPUINFO_STR_REGISTER + RSP_V17:            sprintf(info->s, "V17: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(17, 0), (UINT16)VREG_S(17, 1), (UINT16)VREG_S(17, 2), (UINT16)VREG_S(17, 3), (UINT16)VREG_S(17, 4), (UINT16)VREG_S(17, 5), (UINT16)VREG_S(17, 6), (UINT16)VREG_S(17, 7)); break;
9054      case CPUINFO_STR_REGISTER + RSP_V18:            sprintf(info->s, "V18: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(18, 0), (UINT16)VREG_S(18, 1), (UINT16)VREG_S(18, 2), (UINT16)VREG_S(18, 3), (UINT16)VREG_S(18, 4), (UINT16)VREG_S(18, 5), (UINT16)VREG_S(18, 6), (UINT16)VREG_S(18, 7)); break;
9055      case CPUINFO_STR_REGISTER + RSP_V19:            sprintf(info->s, "V19: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(19, 0), (UINT16)VREG_S(19, 1), (UINT16)VREG_S(19, 2), (UINT16)VREG_S(19, 3), (UINT16)VREG_S(19, 4), (UINT16)VREG_S(19, 5), (UINT16)VREG_S(19, 6), (UINT16)VREG_S(19, 7)); break;
9056      case CPUINFO_STR_REGISTER + RSP_V20:            sprintf(info->s, "V20: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(20, 0), (UINT16)VREG_S(20, 1), (UINT16)VREG_S(20, 2), (UINT16)VREG_S(20, 3), (UINT16)VREG_S(20, 4), (UINT16)VREG_S(20, 5), (UINT16)VREG_S(20, 6), (UINT16)VREG_S(20, 7)); break;
9057      case CPUINFO_STR_REGISTER + RSP_V21:            sprintf(info->s, "V21: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(21, 0), (UINT16)VREG_S(21, 1), (UINT16)VREG_S(21, 2), (UINT16)VREG_S(21, 3), (UINT16)VREG_S(21, 4), (UINT16)VREG_S(21, 5), (UINT16)VREG_S(21, 6), (UINT16)VREG_S(21, 7)); break;
9058      case CPUINFO_STR_REGISTER + RSP_V22:            sprintf(info->s, "V22: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(22, 0), (UINT16)VREG_S(22, 1), (UINT16)VREG_S(22, 2), (UINT16)VREG_S(22, 3), (UINT16)VREG_S(22, 4), (UINT16)VREG_S(22, 5), (UINT16)VREG_S(22, 6), (UINT16)VREG_S(22, 7)); break;
9059      case CPUINFO_STR_REGISTER + RSP_V23:            sprintf(info->s, "V23: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(23, 0), (UINT16)VREG_S(23, 1), (UINT16)VREG_S(23, 2), (UINT16)VREG_S(23, 3), (UINT16)VREG_S(23, 4), (UINT16)VREG_S(23, 5), (UINT16)VREG_S(23, 6), (UINT16)VREG_S(23, 7)); break;
9060      case CPUINFO_STR_REGISTER + RSP_V24:            sprintf(info->s, "V24: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(24, 0), (UINT16)VREG_S(24, 1), (UINT16)VREG_S(24, 2), (UINT16)VREG_S(24, 3), (UINT16)VREG_S(24, 4), (UINT16)VREG_S(24, 5), (UINT16)VREG_S(24, 6), (UINT16)VREG_S(24, 7)); break;
9061      case CPUINFO_STR_REGISTER + RSP_V25:            sprintf(info->s, "V25: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(25, 0), (UINT16)VREG_S(25, 1), (UINT16)VREG_S(25, 2), (UINT16)VREG_S(25, 3), (UINT16)VREG_S(25, 4), (UINT16)VREG_S(25, 5), (UINT16)VREG_S(25, 6), (UINT16)VREG_S(25, 7)); break;
9062      case CPUINFO_STR_REGISTER + RSP_V26:            sprintf(info->s, "V26: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(26, 0), (UINT16)VREG_S(26, 1), (UINT16)VREG_S(26, 2), (UINT16)VREG_S(26, 3), (UINT16)VREG_S(26, 4), (UINT16)VREG_S(26, 5), (UINT16)VREG_S(26, 6), (UINT16)VREG_S(26, 7)); break;
9063      case CPUINFO_STR_REGISTER + RSP_V27:            sprintf(info->s, "V27: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(27, 0), (UINT16)VREG_S(27, 1), (UINT16)VREG_S(27, 2), (UINT16)VREG_S(27, 3), (UINT16)VREG_S(27, 4), (UINT16)VREG_S(27, 5), (UINT16)VREG_S(27, 6), (UINT16)VREG_S(27, 7)); break;
9064      case CPUINFO_STR_REGISTER + RSP_V28:            sprintf(info->s, "V28: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(28, 0), (UINT16)VREG_S(28, 1), (UINT16)VREG_S(28, 2), (UINT16)VREG_S(28, 3), (UINT16)VREG_S(28, 4), (UINT16)VREG_S(28, 5), (UINT16)VREG_S(28, 6), (UINT16)VREG_S(28, 7)); break;
9065      case CPUINFO_STR_REGISTER + RSP_V29:            sprintf(info->s, "V29: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(29, 0), (UINT16)VREG_S(29, 1), (UINT16)VREG_S(29, 2), (UINT16)VREG_S(29, 3), (UINT16)VREG_S(29, 4), (UINT16)VREG_S(29, 5), (UINT16)VREG_S(29, 6), (UINT16)VREG_S(29, 7)); break;
9066      case CPUINFO_STR_REGISTER + RSP_V30:            sprintf(info->s, "V30: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(30, 0), (UINT16)VREG_S(30, 1), (UINT16)VREG_S(30, 2), (UINT16)VREG_S(30, 3), (UINT16)VREG_S(30, 4), (UINT16)VREG_S(30, 5), (UINT16)VREG_S(30, 6), (UINT16)VREG_S(30, 7)); break;
9067      case CPUINFO_STR_REGISTER + RSP_V31:            sprintf(info->s, "V31: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(31, 0), (UINT16)VREG_S(31, 1), (UINT16)VREG_S(31, 2), (UINT16)VREG_S(31, 3), (UINT16)VREG_S(31, 4), (UINT16)VREG_S(31, 5), (UINT16)VREG_S(31, 6), (UINT16)VREG_S(31, 7)); break;
9068#endif
9069      case CPUINFO_STR_REGISTER + RSP_SR:             sprintf(info->s, "SR: %08X",  rsp->sr);    break;
9070      case CPUINFO_STR_REGISTER + RSP_NEXTPC:         sprintf(info->s, "NPC: %08X", rsp->nextpc);break;
9071      case CPUINFO_STR_REGISTER + RSP_STEPCNT:        sprintf(info->s, "STEP: %d",  rsp->step_count);  break;
9072   }
9073}
9074
9075rsp_drc_device::rsp_drc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock)
9076   : rsp_cpu_device(mconfig, type, tag, owner, clock, CPU_GET_INFO_NAME(rsp_drc))
9077{
9078}
9079
9080const device_type RSP_DRC = &legacy_device_creator<rsp_drc_device>;
trunk/src/emu/cpu/rsp/rspfe.c
r31833r31834
2222//  rsp_frontend - constructor
2323//-------------------------------------------------
2424
25rsp_frontend::rsp_frontend(rsp_state &state, UINT32 window_start, UINT32 window_end, UINT32 max_sequence)
26   : drc_frontend(*state.device, window_start, window_end, max_sequence),
27      m_context(state)
25rsp_frontend::rsp_frontend(rsp_device &rsp, UINT32 window_start, UINT32 window_end, UINT32 max_sequence)
26   : drc_frontend(rsp, window_start, window_end, max_sequence),
27      m_rsp(rsp)
2828{
2929}
3030
r31833r31834
3939   UINT32 op, opswitch;
4040
4141   // fetch the opcode
42   op = desc.opptr.l[0] = m_context.direct->read_decrypted_dword(desc.physpc | 0x1000);
42   op = desc.opptr.l[0] = m_rsp.m_direct->read_decrypted_dword(desc.physpc | 0x1000);
4343
4444   // all instructions are 4 bytes and default to a single cycle each
4545   desc.length = 4;
trunk/src/emu/cpu/rsp/rsp.c
r31833r31834
88#include "debugger.h"
99#include "rsp.h"
1010#include "rspdiv.h"
11#include "rspfe.h"
1112
12CPU_DISASSEMBLE( rsp );
1313
14const device_type RSP = &device_creator<rsp_device>;
15
16
1417#define LOG_INSTRUCTION_EXECUTION       0
1518#define SAVE_DISASM                     0
1619#define SAVE_DMEM                       0
r31833r31834
2831
2932extern offs_t rsp_dasm_one(char *buffer, offs_t pc, UINT32 op);
3033
31INLINE rsp_state *get_safe_token(device_t *device)
32{
33   assert(device != NULL);
34   assert(device->type() == RSP_INT);
35   return (rsp_state *)downcast<legacy_cpu_device *>(device)->token();
36}
3734
3835#define SIMM16      ((INT32)(INT16)(op))
3936#define UIMM16      ((UINT16)(op))
4037#define UIMM26      (op & 0x03ffffff)
4138
42#define JUMP_ABS(addr)          { rsp->nextpc = 0x04001000 | (((addr) << 2) & 0xfff); }
43#define JUMP_ABS_L(addr,l)      { rsp->nextpc = 0x04001000 | (((addr) << 2) & 0xfff); rsp->r[l] = rsp->pc + 4; }
44#define JUMP_REL(offset)        { rsp->nextpc = 0x04001000 | ((rsp->pc + ((offset) << 2)) & 0xfff); }
45#define JUMP_REL_L(offset,l)    { rsp->nextpc = 0x04001000 | ((rsp->pc + ((offset) << 2)) & 0xfff); rsp->r[l] = rsp->pc + 4; }
46#define JUMP_PC(addr)           { rsp->nextpc = 0x04001000 | ((addr) & 0xfff); }
47#define JUMP_PC_L(addr,l)       { rsp->nextpc = 0x04001000 | ((addr) & 0xfff); rsp->r[l] = rsp->pc + 4; }
48#define LINK(l)                 { rsp->r[l] = rsp->pc + 4; }
39#define JUMP_ABS(addr)          { m_nextpc = 0x04001000 | (((addr) << 2) & 0xfff); }
40#define JUMP_ABS_L(addr,l)      { m_nextpc = 0x04001000 | (((addr) << 2) & 0xfff); m_rsp_state->r[l] = m_rsp_state->pc + 4; }
41#define JUMP_REL(offset)        { m_nextpc = 0x04001000 | ((m_rsp_state->pc + ((offset) << 2)) & 0xfff); }
42#define JUMP_REL_L(offset,l)    { m_nextpc = 0x04001000 | ((m_rsp_state->pc + ((offset) << 2)) & 0xfff); m_rsp_state->r[l] = m_rsp_state->pc + 4; }
43#define JUMP_PC(addr)           { m_nextpc = 0x04001000 | ((addr) & 0xfff); }
44#define JUMP_PC_L(addr,l)       { m_nextpc = 0x04001000 | ((addr) & 0xfff); m_rsp_state->r[l] = m_rsp_state->pc + 4; }
45#define LINK(l)                 { m_rsp_state->r[l] = m_rsp_state->pc + 4; }
4946
50#define VREG_B(reg, offset)     rsp->v[(reg)].b[(offset)^1]
51#define VREG_S(reg, offset)     rsp->v[(reg)].s[(offset)]
52#define VREG_L(reg, offset)     rsp->v[(reg)].l[(offset)]
47#define VREG_B(reg, offset)     m_v[(reg)].b[(offset)^1]
48#define VREG_S(reg, offset)     m_v[(reg)].s[(offset)]
49#define VREG_L(reg, offset)     m_v[(reg)].l[(offset)]
5350
54#define R_VREG_B(reg, offset)       rsp->v[(reg)].b[(offset)^1]
55#define R_VREG_S(reg, offset)       (INT16)rsp->v[(reg)].s[(offset)]
56#define R_VREG_L(reg, offset)       rsp->v[(reg)].l[(offset)]
51#define R_VREG_B(reg, offset)       m_v[(reg)].b[(offset)^1]
52#define R_VREG_S(reg, offset)       (INT16)m_v[(reg)].s[(offset)]
53#define R_VREG_L(reg, offset)       m_v[(reg)].l[(offset)]
5754
58#define W_VREG_B(reg, offset, val)  (rsp->v[(reg)].b[(offset)^1] = val)
59#define W_VREG_S(reg, offset, val)  (rsp->v[(reg)].s[(offset)] = val)
60#define W_VREG_L(reg, offset, val)  (rsp->v[(reg)].l[(offset)] = val)
55#define W_VREG_B(reg, offset, val)  (m_v[(reg)].b[(offset)^1] = val)
56#define W_VREG_S(reg, offset, val)  (m_v[(reg)].s[(offset)] = val)
57#define W_VREG_L(reg, offset, val)  (m_v[(reg)].l[(offset)] = val)
6158
6259#define VEC_EL_2(x,z)           (vector_elements[(x)][(z)])
6360
64#define ACCUM(x)        rsp->accum[((x))].q
65#define ACCUM_H(x)      rsp->accum[((x))].w[3]
66#define ACCUM_M(x)      rsp->accum[((x))].w[2]
67#define ACCUM_L(x)      rsp->accum[((x))].w[1]
61#define ACCUM(x)        m_accum[((x))].q
62#define ACCUM_H(x)      m_accum[((x))].w[3]
63#define ACCUM_M(x)      m_accum[((x))].w[2]
64#define ACCUM_L(x)      m_accum[((x))].w[1]
6865
6966#define CARRY       0
7067#define COMPARE     1
r31833r31834
7269#define ZERO        3
7370#define CLIP2       4
7471
75#define CARRY_FLAG(x)           (rsp->vflag[CARRY][x & 7] != 0 ? 0xffff : 0)
76#define COMPARE_FLAG(x)         (rsp->vflag[COMPARE][x & 7] != 0 ? 0xffff : 0)
77#define CLIP1_FLAG(x)           (rsp->vflag[CLIP1][x & 7] != 0 ? 0xffff : 0)
78#define ZERO_FLAG(x)            (rsp->vflag[ZERO][x & 7] != 0 ? 0xffff : 0)
79#define CLIP2_FLAG(x)           (rsp->vflag[CLIP2][x & 7] != 0 ? 0xffff : 0)
72#define CARRY_FLAG(x)           (m_vflag[CARRY][x & 7] != 0 ? 0xffff : 0)
73#define COMPARE_FLAG(x)         (m_vflag[COMPARE][x & 7] != 0 ? 0xffff : 0)
74#define CLIP1_FLAG(x)           (m_vflag[CLIP1][x & 7] != 0 ? 0xffff : 0)
75#define ZERO_FLAG(x)            (m_vflag[ZERO][x & 7] != 0 ? 0xffff : 0)
76#define CLIP2_FLAG(x)           (m_vflag[CLIP2][x & 7] != 0 ? 0xffff : 0)
8077
81#define CLEAR_CARRY_FLAGS()     { memset(rsp->vflag[0], 0, 16); }
82#define CLEAR_COMPARE_FLAGS()   { memset(rsp->vflag[1], 0, 16); }
83#define CLEAR_CLIP1_FLAGS()     { memset(rsp->vflag[2], 0, 16); }
84#define CLEAR_ZERO_FLAGS()      { memset(rsp->vflag[3], 0, 16); }
85#define CLEAR_CLIP2_FLAGS()     { memset(rsp->vflag[4], 0, 16); }
78#define CLEAR_CARRY_FLAGS()     { memset(m_vflag[0], 0, 16); }
79#define CLEAR_COMPARE_FLAGS()   { memset(m_vflag[1], 0, 16); }
80#define CLEAR_CLIP1_FLAGS()     { memset(m_vflag[2], 0, 16); }
81#define CLEAR_ZERO_FLAGS()      { memset(m_vflag[3], 0, 16); }
82#define CLEAR_CLIP2_FLAGS()     { memset(m_vflag[4], 0, 16); }
8683
87#define SET_CARRY_FLAG(x)       { rsp->vflag[0][x & 7] = 0xffff; }
88#define SET_COMPARE_FLAG(x)     { rsp->vflag[1][x & 7] = 0xffff; }
89#define SET_CLIP1_FLAG(x)       { rsp->vflag[2][x & 7] = 0xffff; }
90#define SET_ZERO_FLAG(x)        { rsp->vflag[3][x & 7] = 0xffff; }
91#define SET_CLIP2_FLAG(x)       { rsp->vflag[4][x & 7] = 0xffff; }
84#define SET_CARRY_FLAG(x)       { m_vflag[0][x & 7] = 0xffff; }
85#define SET_COMPARE_FLAG(x)     { m_vflag[1][x & 7] = 0xffff; }
86#define SET_CLIP1_FLAG(x)       { m_vflag[2][x & 7] = 0xffff; }
87#define SET_ZERO_FLAG(x)        { m_vflag[3][x & 7] = 0xffff; }
88#define SET_CLIP2_FLAG(x)       { m_vflag[4][x & 7] = 0xffff; }
9289
93#define CLEAR_CARRY_FLAG(x)     { rsp->vflag[0][x & 7] = 0; }
94#define CLEAR_COMPARE_FLAG(x)   { rsp->vflag[1][x & 7] = 0; }
95#define CLEAR_CLIP1_FLAG(x)     { rsp->vflag[2][x & 7] = 0; }
96#define CLEAR_ZERO_FLAG(x)      { rsp->vflag[3][x & 7] = 0; }
97#define CLEAR_CLIP2_FLAG(x)     { rsp->vflag[4][x & 7] = 0; }
90#define CLEAR_CARRY_FLAG(x)     { m_vflag[0][x & 7] = 0; }
91#define CLEAR_COMPARE_FLAG(x)   { m_vflag[1][x & 7] = 0; }
92#define CLEAR_CLIP1_FLAG(x)     { m_vflag[2][x & 7] = 0; }
93#define CLEAR_ZERO_FLAG(x)      { m_vflag[3][x & 7] = 0; }
94#define CLEAR_CLIP2_FLAG(x)     { m_vflag[4][x & 7] = 0; }
9895
99#define ROPCODE(pc)     rsp->program->read_dword(pc)
96#define ROPCODE(pc)     m_program->read_dword(pc)
10097
101INLINE UINT8 READ8(rsp_state *rsp, UINT32 address)
98
99/***************************************************************************
100    DEBUGGING
101***************************************************************************/
102
103#define SINGLE_INSTRUCTION_MODE         (0)
104
105/***************************************************************************
106    CONSTANTS
107***************************************************************************/
108
109/* compilation boundaries -- how far back/forward does the analysis extend? */
110#define COMPILE_BACKWARDS_BYTES         128
111#define COMPILE_FORWARDS_BYTES          512
112#define COMPILE_MAX_INSTRUCTIONS        ((COMPILE_BACKWARDS_BYTES/4) + (COMPILE_FORWARDS_BYTES/4))
113#define COMPILE_MAX_SEQUENCE            64
114
115/* size of the execution code cache */
116#define CACHE_SIZE                      (32 * 1024 * 1024)
117
118
119rsp_device::rsp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
120   : cpu_device(mconfig, RSP, "RSP", tag, owner, clock, "rsp", __FILE__)
121   , m_program_config("program", ENDIANNESS_BIG, 32, 32)
122   , m_cache(CACHE_SIZE + sizeof(internal_rsp_state))
123   , m_drcuml(NULL)
124//  , m_drcuml(*this, m_cache, ( RSP_LOG_UML ? DRCUML_OPTION_LOG_UML : 0 ) | ( RSP_LOG_NATIVE ? DRCUML_OPTION_LOG_NATIVE : 0 ), 8, 32, 2)
125   , m_drcfe(NULL)
126   , m_drcoptions(0)
127   , m_cache_dirty(TRUE)
128   , m_numcycles(0)
129   , m_format(NULL)
130   , m_arg2(0)
131   , m_arg3(0)
132   , m_entry(NULL)
133   , m_nocode(NULL)
134   , m_out_of_cycles(NULL)
135   , m_read8(NULL)
136   , m_write8(NULL)
137   , m_read16(NULL)
138   , m_write16(NULL)
139   , m_read32(NULL)
140   , m_write32(NULL)
141   , m_rsp_state(NULL)
142   , m_exec_output(NULL)
143#if SIMUL_SIMD
144   , m_old_reciprocal_res(0)
145   , m_old_reciprocal_high(0)
146   , m_old_dp_allowed(0)
147   , m_scalar_reciprocal_res(0)
148   , m_scalar_reciprocal_high(0)
149   , m_scalar_dp_allowed(0)
150   , m_simd_reciprocal_res(0)
151   , m_simd_reciprocal_high(0)
152   , m_simd_dp_allowed(0)
153#endif
154   , m_sr(0)
155   , m_step_count(0)
156#if USE_SIMD
157   , m_accum_h(0)
158   , m_accum_m(0)
159   , m_accum_l(0)
160   , m_accum_ll(0)
161#endif
162   , m_reciprocal_res(0)
163   , m_reciprocal_high(0)
164   , m_dp_allowed(0)
165   , m_ppc(0)
166   , m_nextpc(0)
167   , m_dmem32(NULL)
168   , m_dmem16(NULL)
169   , m_dmem8(NULL)
170   , m_imem32(NULL)
171   , m_imem16(NULL)
172   , m_imem8(NULL)
173   , m_debugger_temp(0)
174   , m_dp_reg_r_func(*this)
175   , m_dp_reg_w_func(*this)
176   , m_sp_reg_r_func(*this)
177   , m_sp_reg_w_func(*this)
178   , m_sp_set_status_func(*this)
102179{
180   m_isdrc = mconfig.options().drc() ? true : false;
181   memset(m_vres, 0, sizeof(m_vres));
182   memset(m_v, 0, sizeof(m_v));
183   memset(m_vflag, 0, sizeof(m_vflag));
184#if SIMUL_SIMD
185   memset(m_old_r, 0, sizeof(m_old_r));
186   memset(m_old_dmem, 0, sizeof(m_old_dmem));
187   memset(m_scalar_r, 0, sizeof(m_scalar_r));
188   memset(m_scalar_dmem, 0, sizeof(m_scalar_dmem));
189#endif
190#if USE_SIMD
191   memset(m_xv, 0, sizeof(m_xv));
192   memset(m_xvflag, 0, sizeof(m_xvflag));
193#endif
194   memset(m_accum, 0, sizeof(m_accum));
195}
196
197offs_t rsp_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
198{
199   extern CPU_DISASSEMBLE( rsp );
200   return CPU_DISASSEMBLE_NAME( rsp )(this, buffer, pc, oprom, opram, options);
201}
202
203inline UINT8 rsp_device::READ8(UINT32 address)
204{
103205   UINT8 ret;
104206   address = 0x04000000 | (address & 0xfff);
105   ret = rsp->program->read_byte(address);
207   ret = m_program->read_byte(address);
106208   //printf("%04xr%02x\n", address & 0x0000ffff, ret);
107209   return ret;
108210}
109211
110INLINE UINT16 READ16(rsp_state *rsp, UINT32 address)
212inline UINT16 rsp_device::READ16(UINT32 address)
111213{
112214   UINT16 ret;
113215   address = 0x04000000 | (address & 0xfff);
114216
115217   if(address & 1)
116218   {
117      ret = ((rsp->program->read_byte(address + 0) & 0xff) << 8) | (rsp->program->read_byte(address + 1) & 0xff);
219      ret = ((m_program->read_byte(address + 0) & 0xff) << 8) | (m_program->read_byte(address + 1) & 0xff);
118220   }
119221   else
120222   {
121      ret = rsp->program->read_word(address);
223      ret = m_program->read_word(address);
122224   }
123225
124226   //printf("%04xr%04x\n", address & 0x0000ffff, ret);
r31833r31834
126228   return ret;
127229}
128230
129INLINE UINT32 READ32(rsp_state *rsp, UINT32 address)
231inline UINT32 rsp_device::READ32(UINT32 address)
130232{
131233   UINT32 ret;
132234   address = 0x04000000 | (address & 0xfff);
133235
134236   if(address & 3)
135237   {
136      ret =  ((rsp->program->read_byte(address + 0) & 0xff) << 24) |
137            ((rsp->program->read_byte(address + 1) & 0xff) << 16) |
138            ((rsp->program->read_byte(address + 2) & 0xff) << 8) |
139            ((rsp->program->read_byte(address + 3) & 0xff) << 0);
238      ret =  ((m_program->read_byte(address + 0) & 0xff) << 24) |
239            ((m_program->read_byte(address + 1) & 0xff) << 16) |
240            ((m_program->read_byte(address + 2) & 0xff) << 8) |
241            ((m_program->read_byte(address + 3) & 0xff) << 0);
140242   }
141243   else
142244   {
143      ret = rsp->program->read_dword(address);
245      ret = m_program->read_dword(address);
144246   }
145247
146248   //printf("%04xr%08x\n", address & 0x0000ffff, ret);
147249   return ret;
148250}
149251
150INLINE void WRITE8(rsp_state *rsp, UINT32 address, UINT8 data)
252void rsp_device::WRITE8(UINT32 address, UINT8 data)
151253{
152254   address = 0x04000000 | (address & 0xfff);
153255   //printf("%04x:%02x\n", address & 0x0000ffff, data);
154   rsp->program->write_byte(address, data);
256   m_program->write_byte(address, data);
155257}
156258
157INLINE void WRITE16(rsp_state *rsp, UINT32 address, UINT16 data)
259void rsp_device::WRITE16(UINT32 address, UINT16 data)
158260{
159261   address = 0x04000000 | (address & 0xfff);
160262   //printf("%04x:%04x\n", address & 0x0000ffff, data);
161263
162264   if(address & 1)
163265   {
164      rsp->program->write_byte(address + 0, (data >> 8) & 0xff);
165      rsp->program->write_byte(address + 1, (data >> 0) & 0xff);
266      m_program->write_byte(address + 0, (data >> 8) & 0xff);
267      m_program->write_byte(address + 1, (data >> 0) & 0xff);
166268      return;
167269   }
168270
169   rsp->program->write_word(address, data);
271   m_program->write_word(address, data);
170272}
171273
172INLINE void WRITE32(rsp_state *rsp, UINT32 address, UINT32 data)
274void rsp_device::WRITE32(UINT32 address, UINT32 data)
173275{
174276   address = 0x04000000 | (address & 0xfff);
175277   //printf("%04x:%08x\n", address & 0x0000ffff, data);
176278
177279   if(address & 3)
178280   {
179      rsp->program->write_byte(address + 0, (data >> 24) & 0xff);
180      rsp->program->write_byte(address + 1, (data >> 16) & 0xff);
181      rsp->program->write_byte(address + 2, (data >> 8) & 0xff);
182      rsp->program->write_byte(address + 3, (data >> 0) & 0xff);
281      m_program->write_byte(address + 0, (data >> 24) & 0xff);
282      m_program->write_byte(address + 1, (data >> 16) & 0xff);
283      m_program->write_byte(address + 2, (data >> 8) & 0xff);
284      m_program->write_byte(address + 3, (data >> 0) & 0xff);
183285      return;
184286   }
185287
186   rsp->program->write_dword(address, data);
288   m_program->write_dword(address, data);
187289}
188290
189291/*****************************************************************************/
190292
191static UINT32 get_cop0_reg(rsp_state *rsp, int reg)
293UINT32 rsp_device::get_cop0_reg(int reg)
192294{
193295   reg &= 0xf;
194296   if (reg < 8)
195297   {
196      return (rsp->device->sp_reg_r_func)(reg, 0xffffffff);
298      return m_sp_reg_r_func(reg, 0xffffffff);
197299   }
198300   else if (reg >= 8 && reg < 16)
199301   {
200      return (rsp->device->dp_reg_r_func)(reg - 8, 0xffffffff);
302      return m_dp_reg_r_func(reg - 8, 0xffffffff);
201303   }
202304
203305   return 0;
204306}
205307
206static void set_cop0_reg(rsp_state *rsp, int reg, UINT32 data)
308void rsp_device::set_cop0_reg(int reg, UINT32 data)
207309{
208310   reg &= 0xf;
209311   if (reg < 8)
210312   {
211      (rsp->device->sp_reg_w_func)(reg, data, 0xffffffff);
313      m_sp_reg_w_func(reg, data, 0xffffffff);
212314   }
213315   else if (reg >= 8 && reg < 16)
214316   {
215      (rsp->device->dp_reg_w_func)(reg - 8, data, 0xffffffff);
317      m_dp_reg_w_func(reg - 8, data, 0xffffffff);
216318   }
217319}
218320
219static void unimplemented_opcode(rsp_state *rsp, UINT32 op)
321void rsp_device::unimplemented_opcode(UINT32 op)
220322{
221   if ((rsp->device->machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
323   if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
222324   {
223325      char string[200];
224      rsp_dasm_one(string, rsp->ppc, op);
225      osd_printf_debug("%08X: %s\n", rsp->ppc, string);
326      rsp_dasm_one(string, m_ppc, op);
327      osd_printf_debug("%08X: %s\n", m_ppc, string);
226328   }
227329
228330#if SAVE_DISASM
r31833r31834
255357   }
256358#endif
257359
258   fatalerror("RSP: unknown opcode %02X (%08X) at %08X\n", op >> 26, op, rsp->ppc);
360   fatalerror("RSP: unknown opcode %02X (%08X) at %08X\n", op >> 26, op, m_ppc);
259361}
260362
261363/*****************************************************************************/
r31833r31834
280382   { 7, 7, 7, 7, 7, 7, 7, 7 },     // 7
281383};
282384
283void rsp_cpu_device::resolve_cb()
385void rsp_device::resolve_cb()
284386{
285   dp_reg_r_func.resolve();
286   dp_reg_w_func.resolve();
287   sp_reg_r_func.resolve();
288   sp_reg_w_func.resolve();
289   sp_set_status_func.resolve();
387   m_dp_reg_r_func.resolve();
388   m_dp_reg_w_func.resolve();
389   m_sp_reg_r_func.resolve();
390   m_sp_reg_w_func.resolve();
391   m_sp_set_status_func.resolve();
290392}
291393
292static CPU_INIT( rsp )
394void rsp_device::device_start()
293395{
294   rsp_state *rsp = get_safe_token(device);
295   int regIdx;
296   int accumIdx;
396   m_rsp_state = (internal_rsp_state *)m_cache.alloc_near(sizeof(internal_rsp_state));
297397
298398   if (LOG_INSTRUCTION_EXECUTION)
299      rsp->exec_output = fopen("rsp_execute.txt", "wt");
399      m_exec_output = fopen("rsp_execute.txt", "wt");
300400
301   rsp->irq_callback = irqcallback;
302   rsp->device = downcast<rsp_cpu_device *>(device);
303   rsp->program = &device->space(AS_PROGRAM);
304   rsp->direct = &rsp->program->direct();
305   rsp->device->resolve_cb();
401   m_program = &space(AS_PROGRAM);
402   m_direct = &m_program->direct();
403   resolve_cb();
306404
307#if 1
308405   // Inaccurate.  RSP registers power on to a random state...
309   for(regIdx = 0; regIdx < 32; regIdx++ )
406   for(int regIdx = 0; regIdx < 32; regIdx++ )
310407   {
311      rsp->r[regIdx] = 0;
312      rsp->v[regIdx].d[0] = 0;
313      rsp->v[regIdx].d[1] = 0;
408      m_rsp_state->r[regIdx] = 0;
409      m_v[regIdx].d[0] = 0;
410      m_v[regIdx].d[1] = 0;
314411   }
315412   CLEAR_CARRY_FLAGS();
316413   CLEAR_COMPARE_FLAGS();
317414   CLEAR_CLIP1_FLAGS();
318415   CLEAR_ZERO_FLAGS();
319416   CLEAR_CLIP2_FLAGS();
320   //rsp->square_root_res = 0;
321   //rsp->square_root_high = 0;
322   rsp->reciprocal_res = 0;
323   rsp->reciprocal_high = 0;
324#endif
417   //m_square_root_res = 0;
418   //m_square_root_high = 0;
419   m_reciprocal_res = 0;
420   m_reciprocal_high = 0;
325421
326422   // ...except for the accumulators.
327423   // We're not calling machine.rand() because initializing something with machine.rand()
328424   //   makes me retch uncontrollably.
329   for(accumIdx = 0; accumIdx < 8; accumIdx++ )
425   for(int accumIdx = 0; accumIdx < 8; accumIdx++ )
330426   {
331      rsp->accum[accumIdx].q = 0;
427      m_accum[accumIdx].q = 0;
332428   }
333429
334   rsp->sr = RSP_STATUS_HALT;
335   rsp->step_count = 0;
430   m_sr = RSP_STATUS_HALT;
431   m_step_count = 0;
432
433   /* initialize the UML generator */
434   UINT32 drc_flags = 0;
435   if (RSP_LOG_UML)
436   {
437      drc_flags |= DRCUML_OPTION_LOG_UML;
438   }
439   if (RSP_LOG_NATIVE)
440   {
441      drc_flags |= DRCUML_OPTION_LOG_NATIVE;
442   }
443   m_drcuml = auto_alloc(machine(), drcuml_state(*this, m_cache, drc_flags, 8, 32, 2));
444
445   /* add symbols for our stuff */
446   m_drcuml->symbol_add(&m_rsp_state->pc, sizeof(m_rsp_state->pc), "pc");
447   m_drcuml->symbol_add(&m_rsp_state->icount, sizeof(m_rsp_state->icount), "icount");
448   for (int regnum = 0; regnum < 32; regnum++)
449   {
450      char buf[10];
451      sprintf(buf, "r%d", regnum);
452      m_drcuml->symbol_add(&m_rsp_state->r[regnum], sizeof(m_rsp_state->r[regnum]), buf);
453   }
454   m_drcuml->symbol_add(&m_rsp_state->arg0, sizeof(m_rsp_state->arg0), "arg0");
455   m_drcuml->symbol_add(&m_rsp_state->arg1, sizeof(m_rsp_state->arg1), "arg1");
456   m_drcuml->symbol_add(&m_arg2, sizeof(m_arg2), "arg2");
457   m_drcuml->symbol_add(&m_arg3, sizeof(m_arg3), "arg3");
458   m_drcuml->symbol_add(&m_numcycles, sizeof(m_numcycles), "numcycles");
459
460   /* initialize the front-end helper */
461   m_drcfe = auto_alloc(machine(), rsp_frontend(*this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE));
462
463   /* compute the register parameters */
464   for (int regnum = 0; regnum < 32; regnum++)
465   {
466      m_regmap[regnum] = (regnum == 0) ? uml::parameter(0) : uml::parameter::make_memory(&m_rsp_state->r[regnum]);
467   }
468
469    /*
470    drcbe_info beinfo;
471    m_drcuml->get_backend_info(beinfo);
472    if (beinfo.direct_iregs > 2)
473    {
474        m_regmap[30] = I2;
475    }
476    if (beinfo.direct_iregs > 3)
477    {
478        m_regmap[31] = I3;
479    }
480    if (beinfo.direct_iregs > 4)
481    {
482        m_regmap[2] = I4;
483    }
484    if (beinfo.direct_iregs > 5)
485    {
486        m_regmap[3] = I5;
487    }
488    if (beinfo.direct_iregs > 6)
489    {
490        m_regmap[4] = I6;
491    }
492    */
493
494   /* mark the cache dirty so it is updated on next execute */
495   m_cache_dirty = TRUE;
496
497   state_add( RSP_PC,      "PC", m_debugger_temp).callimport().callexport().formatstr("%08X");
498   state_add( RSP_R0,      "R0", m_rsp_state->r[0]).formatstr("%08X");
499   state_add( RSP_R1,      "R1", m_rsp_state->r[1]).formatstr("%08X");
500   state_add( RSP_R2,      "R2", m_rsp_state->r[2]).formatstr("%08X");
501   state_add( RSP_R3,      "R3", m_rsp_state->r[3]).formatstr("%08X");
502   state_add( RSP_R4,      "R4", m_rsp_state->r[4]).formatstr("%08X");
503   state_add( RSP_R5,      "R5", m_rsp_state->r[5]).formatstr("%08X");
504   state_add( RSP_R6,      "R6", m_rsp_state->r[6]).formatstr("%08X");
505   state_add( RSP_R7,      "R7", m_rsp_state->r[7]).formatstr("%08X");
506   state_add( RSP_R8,      "R8", m_rsp_state->r[8]).formatstr("%08X");
507   state_add( RSP_R9,      "R9", m_rsp_state->r[9]).formatstr("%08X");
508   state_add( RSP_R10,     "R10", m_rsp_state->r[10]).formatstr("%08X");
509   state_add( RSP_R11,     "R11", m_rsp_state->r[11]).formatstr("%08X");
510   state_add( RSP_R12,     "R12", m_rsp_state->r[12]).formatstr("%08X");
511   state_add( RSP_R13,     "R13", m_rsp_state->r[13]).formatstr("%08X");
512   state_add( RSP_R14,     "R14", m_rsp_state->r[14]).formatstr("%08X");
513   state_add( RSP_R15,     "R15", m_rsp_state->r[15]).formatstr("%08X");
514   state_add( RSP_R16,     "R16", m_rsp_state->r[16]).formatstr("%08X");
515   state_add( RSP_R17,     "R17", m_rsp_state->r[17]).formatstr("%08X");
516   state_add( RSP_R18,     "R18", m_rsp_state->r[18]).formatstr("%08X");
517   state_add( RSP_R19,     "R19", m_rsp_state->r[19]).formatstr("%08X");
518   state_add( RSP_R20,     "R20", m_rsp_state->r[20]).formatstr("%08X");
519   state_add( RSP_R21,     "R21", m_rsp_state->r[21]).formatstr("%08X");
520   state_add( RSP_R22,     "R22", m_rsp_state->r[22]).formatstr("%08X");
521   state_add( RSP_R23,     "R23", m_rsp_state->r[23]).formatstr("%08X");
522   state_add( RSP_R24,     "R24", m_rsp_state->r[24]).formatstr("%08X");
523   state_add( RSP_R25,     "R25", m_rsp_state->r[25]).formatstr("%08X");
524   state_add( RSP_R26,     "R26", m_rsp_state->r[26]).formatstr("%08X");
525   state_add( RSP_R27,     "R27", m_rsp_state->r[27]).formatstr("%08X");
526   state_add( RSP_R28,     "R28", m_rsp_state->r[28]).formatstr("%08X");
527   state_add( RSP_R29,     "R29", m_rsp_state->r[29]).formatstr("%08X");
528   state_add( RSP_R30,     "R30", m_rsp_state->r[30]).formatstr("%08X");
529   state_add( RSP_R31,     "R31", m_rsp_state->r[31]).formatstr("%08X");
530   state_add( RSP_SR,      "SR",  m_sr).formatstr("%08X");
531   state_add( RSP_NEXTPC,  "NPC", m_debugger_temp).callimport().callexport().formatstr("%08X");
532   state_add( RSP_STEPCNT, "STEP",  m_step_count).formatstr("%08X");
533
534   state_add( RSP_V0,      "V0",  m_debugger_temp).formatstr("%39s");
535   state_add( RSP_V1,      "V1",  m_debugger_temp).formatstr("%39s");
536   state_add( RSP_V2,      "V2",  m_debugger_temp).formatstr("%39s");
537   state_add( RSP_V3,      "V3",  m_debugger_temp).formatstr("%39s");
538   state_add( RSP_V4,      "V4",  m_debugger_temp).formatstr("%39s");
539   state_add( RSP_V5,      "V5",  m_debugger_temp).formatstr("%39s");
540   state_add( RSP_V6,      "V6",  m_debugger_temp).formatstr("%39s");
541   state_add( RSP_V7,      "V7",  m_debugger_temp).formatstr("%39s");
542   state_add( RSP_V8,      "V8",  m_debugger_temp).formatstr("%39s");
543   state_add( RSP_V9,      "V9",  m_debugger_temp).formatstr("%39s");
544   state_add( RSP_V10,     "V10", m_debugger_temp).formatstr("%39s");
545   state_add( RSP_V11,     "V11", m_debugger_temp).formatstr("%39s");
546   state_add( RSP_V12,     "V12", m_debugger_temp).formatstr("%39s");
547   state_add( RSP_V13,     "V13", m_debugger_temp).formatstr("%39s");
548   state_add( RSP_V14,     "V14", m_debugger_temp).formatstr("%39s");
549   state_add( RSP_V15,     "V15", m_debugger_temp).formatstr("%39s");
550   state_add( RSP_V16,     "V16", m_debugger_temp).formatstr("%39s");
551   state_add( RSP_V17,     "V17", m_debugger_temp).formatstr("%39s");
552   state_add( RSP_V18,     "V18", m_debugger_temp).formatstr("%39s");
553   state_add( RSP_V19,     "V19", m_debugger_temp).formatstr("%39s");
554   state_add( RSP_V20,     "V20", m_debugger_temp).formatstr("%39s");
555   state_add( RSP_V21,     "V21", m_debugger_temp).formatstr("%39s");
556   state_add( RSP_V22,     "V22", m_debugger_temp).formatstr("%39s");
557   state_add( RSP_V23,     "V23", m_debugger_temp).formatstr("%39s");
558   state_add( RSP_V24,     "V24", m_debugger_temp).formatstr("%39s");
559   state_add( RSP_V25,     "V25", m_debugger_temp).formatstr("%39s");
560   state_add( RSP_V26,     "V26", m_debugger_temp).formatstr("%39s");
561   state_add( RSP_V27,     "V27", m_debugger_temp).formatstr("%39s");
562   state_add( RSP_V28,     "V28", m_debugger_temp).formatstr("%39s");
563   state_add( RSP_V29,     "V29", m_debugger_temp).formatstr("%39s");
564   state_add( RSP_V30,     "V30", m_debugger_temp).formatstr("%39s");
565   state_add( RSP_V31,     "V31", m_debugger_temp).formatstr("%39s");
566
567   state_add( STATE_GENPC, "GENPC", m_debugger_temp).callimport().callexport().noshow();
568   state_add( STATE_GENFLAGS, "GENFLAGS", m_debugger_temp).formatstr("%1s").noshow();
569   state_add( STATE_GENSP, "GENSP", m_rsp_state->r[31]).noshow();
570   state_add( STATE_GENPCBASE, "GENPCBASE", m_debugger_temp).callimport().callexport().noshow();
571
572   m_icountptr = &m_rsp_state->icount;
336573}
337574
338static CPU_EXIT( rsp )
575void rsp_device::state_import(const device_state_entry &entry)
339576{
340   rsp_state *rsp = get_safe_token(device);
577   switch (entry.index())
578   {
579      case STATE_GENPC:
580      case RSP_PC:
581         m_rsp_state->pc = m_debugger_temp;
582         break;
341583
584      case STATE_GENPCBASE:
585         m_ppc = m_debugger_temp;
586         break;
587
588      case RSP_NEXTPC:
589         m_nextpc = m_debugger_temp;
590         break;
591   }
592}
593
594
595void rsp_device::state_export(const device_state_entry &entry)
596{
597   switch (entry.index())
598   {
599      case STATE_GENPC:
600      case RSP_PC:
601         m_debugger_temp = m_rsp_state->pc | 0x04000000;
602         break;
603
604      case STATE_GENPCBASE:
605         m_debugger_temp = m_ppc | 0x04000000;
606         break;
607
608      case RSP_NEXTPC:
609         m_debugger_temp = m_nextpc | 0x04000000;
610         break;
611   }
612}
613
614void rsp_device::state_string_export(const device_state_entry &entry, astring &string)
615{
616   switch (entry.index())
617   {
618      case STATE_GENFLAGS:
619         string.printf("");
620         break;
621
622#if USE_SIMD
623      case RSP_V0:
624         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 0], 7), (UINT16)_mm_extract_epi16(m_xv[ 0], 6), (UINT16)_mm_extract_epi16(m_xv[ 0], 5), (UINT16)_mm_extract_epi16(m_xv[ 0], 4), (UINT16)_mm_extract_epi16(m_xv[ 0], 3), (UINT16)_mm_extract_epi16(m_xv[ 0], 2), (UINT16)_mm_extract_epi16(m_xv[ 0], 1), (UINT16)_mm_extract_epi16(m_xv[ 0], 0));
625         break;
626      case RSP_V1:
627         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 1], 7), (UINT16)_mm_extract_epi16(m_xv[ 1], 6), (UINT16)_mm_extract_epi16(m_xv[ 1], 5), (UINT16)_mm_extract_epi16(m_xv[ 1], 4), (UINT16)_mm_extract_epi16(m_xv[ 1], 3), (UINT16)_mm_extract_epi16(m_xv[ 1], 2), (UINT16)_mm_extract_epi16(m_xv[ 1], 1), (UINT16)_mm_extract_epi16(m_xv[ 1], 0));
628         break;
629      case RSP_V2:
630         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 2], 7), (UINT16)_mm_extract_epi16(m_xv[ 2], 6), (UINT16)_mm_extract_epi16(m_xv[ 2], 5), (UINT16)_mm_extract_epi16(m_xv[ 2], 4), (UINT16)_mm_extract_epi16(m_xv[ 2], 3), (UINT16)_mm_extract_epi16(m_xv[ 2], 2), (UINT16)_mm_extract_epi16(m_xv[ 2], 1), (UINT16)_mm_extract_epi16(m_xv[ 2], 0));
631         break;
632      case RSP_V3:
633         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 3], 7), (UINT16)_mm_extract_epi16(m_xv[ 3], 6), (UINT16)_mm_extract_epi16(m_xv[ 3], 5), (UINT16)_mm_extract_epi16(m_xv[ 3], 4), (UINT16)_mm_extract_epi16(m_xv[ 3], 3), (UINT16)_mm_extract_epi16(m_xv[ 3], 2), (UINT16)_mm_extract_epi16(m_xv[ 3], 1), (UINT16)_mm_extract_epi16(m_xv[ 3], 0));
634         break;
635      case RSP_V4:
636         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 4], 7), (UINT16)_mm_extract_epi16(m_xv[ 4], 6), (UINT16)_mm_extract_epi16(m_xv[ 4], 5), (UINT16)_mm_extract_epi16(m_xv[ 4], 4), (UINT16)_mm_extract_epi16(m_xv[ 4], 3), (UINT16)_mm_extract_epi16(m_xv[ 4], 2), (UINT16)_mm_extract_epi16(m_xv[ 4], 1), (UINT16)_mm_extract_epi16(m_xv[ 4], 0));
637         break;
638      case RSP_V5:
639         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 5], 7), (UINT16)_mm_extract_epi16(m_xv[ 5], 6), (UINT16)_mm_extract_epi16(m_xv[ 5], 5), (UINT16)_mm_extract_epi16(m_xv[ 5], 4), (UINT16)_mm_extract_epi16(m_xv[ 5], 3), (UINT16)_mm_extract_epi16(m_xv[ 5], 2), (UINT16)_mm_extract_epi16(m_xv[ 5], 1), (UINT16)_mm_extract_epi16(m_xv[ 5], 0));
640         break;
641      case RSP_V6:
642         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 6], 7), (UINT16)_mm_extract_epi16(m_xv[ 6], 6), (UINT16)_mm_extract_epi16(m_xv[ 6], 5), (UINT16)_mm_extract_epi16(m_xv[ 6], 4), (UINT16)_mm_extract_epi16(m_xv[ 6], 3), (UINT16)_mm_extract_epi16(m_xv[ 6], 2), (UINT16)_mm_extract_epi16(m_xv[ 6], 1), (UINT16)_mm_extract_epi16(m_xv[ 6], 0));
643         break;
644      case RSP_V7:
645         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 7], 7), (UINT16)_mm_extract_epi16(m_xv[ 7], 6), (UINT16)_mm_extract_epi16(m_xv[ 7], 5), (UINT16)_mm_extract_epi16(m_xv[ 7], 4), (UINT16)_mm_extract_epi16(m_xv[ 7], 3), (UINT16)_mm_extract_epi16(m_xv[ 7], 2), (UINT16)_mm_extract_epi16(m_xv[ 7], 1), (UINT16)_mm_extract_epi16(m_xv[ 7], 0));
646         break;
647      case RSP_V8:
648         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 8], 7), (UINT16)_mm_extract_epi16(m_xv[ 8], 6), (UINT16)_mm_extract_epi16(m_xv[ 8], 5), (UINT16)_mm_extract_epi16(m_xv[ 8], 4), (UINT16)_mm_extract_epi16(m_xv[ 8], 3), (UINT16)_mm_extract_epi16(m_xv[ 8], 2), (UINT16)_mm_extract_epi16(m_xv[ 8], 1), (UINT16)_mm_extract_epi16(m_xv[ 8], 0));
649         break;
650      case RSP_V9:
651         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[ 9], 7), (UINT16)_mm_extract_epi16(m_xv[ 9], 6), (UINT16)_mm_extract_epi16(m_xv[ 9], 5), (UINT16)_mm_extract_epi16(m_xv[ 9], 4), (UINT16)_mm_extract_epi16(m_xv[ 9], 3), (UINT16)_mm_extract_epi16(m_xv[ 9], 2), (UINT16)_mm_extract_epi16(m_xv[ 9], 1), (UINT16)_mm_extract_epi16(m_xv[ 9], 0));
652         break;
653      case RSP_V10:
654         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[10], 7), (UINT16)_mm_extract_epi16(m_xv[10], 6), (UINT16)_mm_extract_epi16(m_xv[10], 5), (UINT16)_mm_extract_epi16(m_xv[10], 4), (UINT16)_mm_extract_epi16(m_xv[10], 3), (UINT16)_mm_extract_epi16(m_xv[10], 2), (UINT16)_mm_extract_epi16(m_xv[10], 1), (UINT16)_mm_extract_epi16(m_xv[10], 0));
655         break;
656      case RSP_V11:
657         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[11], 7), (UINT16)_mm_extract_epi16(m_xv[11], 6), (UINT16)_mm_extract_epi16(m_xv[11], 5), (UINT16)_mm_extract_epi16(m_xv[11], 4), (UINT16)_mm_extract_epi16(m_xv[11], 3), (UINT16)_mm_extract_epi16(m_xv[11], 2), (UINT16)_mm_extract_epi16(m_xv[11], 1), (UINT16)_mm_extract_epi16(m_xv[11], 0));
658         break;
659      case RSP_V12:
660         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[12], 7), (UINT16)_mm_extract_epi16(m_xv[12], 6), (UINT16)_mm_extract_epi16(m_xv[12], 5), (UINT16)_mm_extract_epi16(m_xv[12], 4), (UINT16)_mm_extract_epi16(m_xv[12], 3), (UINT16)_mm_extract_epi16(m_xv[12], 2), (UINT16)_mm_extract_epi16(m_xv[12], 1), (UINT16)_mm_extract_epi16(m_xv[12], 0));
661         break;
662      case RSP_V13:
663         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[13], 7), (UINT16)_mm_extract_epi16(m_xv[13], 6), (UINT16)_mm_extract_epi16(m_xv[13], 5), (UINT16)_mm_extract_epi16(m_xv[13], 4), (UINT16)_mm_extract_epi16(m_xv[13], 3), (UINT16)_mm_extract_epi16(m_xv[13], 2), (UINT16)_mm_extract_epi16(m_xv[13], 1), (UINT16)_mm_extract_epi16(m_xv[13], 0));
664         break;
665      case RSP_V14:
666         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[14], 7), (UINT16)_mm_extract_epi16(m_xv[14], 6), (UINT16)_mm_extract_epi16(m_xv[14], 5), (UINT16)_mm_extract_epi16(m_xv[14], 4), (UINT16)_mm_extract_epi16(m_xv[14], 3), (UINT16)_mm_extract_epi16(m_xv[14], 2), (UINT16)_mm_extract_epi16(m_xv[14], 1), (UINT16)_mm_extract_epi16(m_xv[14], 0));
667         break;
668      case RSP_V15:
669         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[15], 7), (UINT16)_mm_extract_epi16(m_xv[15], 6), (UINT16)_mm_extract_epi16(m_xv[15], 5), (UINT16)_mm_extract_epi16(m_xv[15], 4), (UINT16)_mm_extract_epi16(m_xv[15], 3), (UINT16)_mm_extract_epi16(m_xv[15], 2), (UINT16)_mm_extract_epi16(m_xv[15], 1), (UINT16)_mm_extract_epi16(m_xv[15], 0));
670         break;
671      case RSP_V16:
672         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[16], 7), (UINT16)_mm_extract_epi16(m_xv[16], 6), (UINT16)_mm_extract_epi16(m_xv[16], 5), (UINT16)_mm_extract_epi16(m_xv[16], 4), (UINT16)_mm_extract_epi16(m_xv[16], 3), (UINT16)_mm_extract_epi16(m_xv[16], 2), (UINT16)_mm_extract_epi16(m_xv[16], 1), (UINT16)_mm_extract_epi16(m_xv[16], 0));
673         break;
674      case RSP_V17:
675         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[17], 7), (UINT16)_mm_extract_epi16(m_xv[17], 6), (UINT16)_mm_extract_epi16(m_xv[17], 5), (UINT16)_mm_extract_epi16(m_xv[17], 4), (UINT16)_mm_extract_epi16(m_xv[17], 3), (UINT16)_mm_extract_epi16(m_xv[17], 2), (UINT16)_mm_extract_epi16(m_xv[17], 1), (UINT16)_mm_extract_epi16(m_xv[17], 0));
676         break;
677      case RSP_V18:
678         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[18], 7), (UINT16)_mm_extract_epi16(m_xv[18], 6), (UINT16)_mm_extract_epi16(m_xv[18], 5), (UINT16)_mm_extract_epi16(m_xv[18], 4), (UINT16)_mm_extract_epi16(m_xv[18], 3), (UINT16)_mm_extract_epi16(m_xv[18], 2), (UINT16)_mm_extract_epi16(m_xv[18], 1), (UINT16)_mm_extract_epi16(m_xv[18], 0));
679         break;
680      case RSP_V19:
681         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[19], 7), (UINT16)_mm_extract_epi16(m_xv[19], 6), (UINT16)_mm_extract_epi16(m_xv[19], 5), (UINT16)_mm_extract_epi16(m_xv[19], 4), (UINT16)_mm_extract_epi16(m_xv[19], 3), (UINT16)_mm_extract_epi16(m_xv[19], 2), (UINT16)_mm_extract_epi16(m_xv[19], 1), (UINT16)_mm_extract_epi16(m_xv[19], 0));
682         break;
683      case RSP_V20:
684         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[20], 7), (UINT16)_mm_extract_epi16(m_xv[20], 6), (UINT16)_mm_extract_epi16(m_xv[20], 5), (UINT16)_mm_extract_epi16(m_xv[20], 4), (UINT16)_mm_extract_epi16(m_xv[20], 3), (UINT16)_mm_extract_epi16(m_xv[20], 2), (UINT16)_mm_extract_epi16(m_xv[20], 1), (UINT16)_mm_extract_epi16(m_xv[20], 0));
685         break;
686      case RSP_V21:
687         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[21], 7), (UINT16)_mm_extract_epi16(m_xv[21], 6), (UINT16)_mm_extract_epi16(m_xv[21], 5), (UINT16)_mm_extract_epi16(m_xv[21], 4), (UINT16)_mm_extract_epi16(m_xv[21], 3), (UINT16)_mm_extract_epi16(m_xv[21], 2), (UINT16)_mm_extract_epi16(m_xv[21], 1), (UINT16)_mm_extract_epi16(m_xv[21], 0));
688         break;
689      case RSP_V22:
690         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[22], 7), (UINT16)_mm_extract_epi16(m_xv[22], 6), (UINT16)_mm_extract_epi16(m_xv[22], 5), (UINT16)_mm_extract_epi16(m_xv[22], 4), (UINT16)_mm_extract_epi16(m_xv[22], 3), (UINT16)_mm_extract_epi16(m_xv[22], 2), (UINT16)_mm_extract_epi16(m_xv[22], 1), (UINT16)_mm_extract_epi16(m_xv[22], 0));
691         break;
692      case RSP_V23:
693         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[23], 7), (UINT16)_mm_extract_epi16(m_xv[23], 6), (UINT16)_mm_extract_epi16(m_xv[23], 5), (UINT16)_mm_extract_epi16(m_xv[23], 4), (UINT16)_mm_extract_epi16(m_xv[23], 3), (UINT16)_mm_extract_epi16(m_xv[23], 2), (UINT16)_mm_extract_epi16(m_xv[23], 1), (UINT16)_mm_extract_epi16(m_xv[23], 0));
694         break;
695      case RSP_V24:
696         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[24], 7), (UINT16)_mm_extract_epi16(m_xv[24], 6), (UINT16)_mm_extract_epi16(m_xv[24], 5), (UINT16)_mm_extract_epi16(m_xv[24], 4), (UINT16)_mm_extract_epi16(m_xv[24], 3), (UINT16)_mm_extract_epi16(m_xv[24], 2), (UINT16)_mm_extract_epi16(m_xv[24], 1), (UINT16)_mm_extract_epi16(m_xv[24], 0));
697         break;
698      case RSP_V25:
699         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[25], 7), (UINT16)_mm_extract_epi16(m_xv[25], 6), (UINT16)_mm_extract_epi16(m_xv[25], 5), (UINT16)_mm_extract_epi16(m_xv[25], 4), (UINT16)_mm_extract_epi16(m_xv[25], 3), (UINT16)_mm_extract_epi16(m_xv[25], 2), (UINT16)_mm_extract_epi16(m_xv[25], 1), (UINT16)_mm_extract_epi16(m_xv[25], 0));
700         break;
701      case RSP_V26:
702         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[26], 7), (UINT16)_mm_extract_epi16(m_xv[26], 6), (UINT16)_mm_extract_epi16(m_xv[26], 5), (UINT16)_mm_extract_epi16(m_xv[26], 4), (UINT16)_mm_extract_epi16(m_xv[26], 3), (UINT16)_mm_extract_epi16(m_xv[26], 2), (UINT16)_mm_extract_epi16(m_xv[26], 1), (UINT16)_mm_extract_epi16(m_xv[26], 0));
703         break;
704      case RSP_V27:
705         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[27], 7), (UINT16)_mm_extract_epi16(m_xv[27], 6), (UINT16)_mm_extract_epi16(m_xv[27], 5), (UINT16)_mm_extract_epi16(m_xv[27], 4), (UINT16)_mm_extract_epi16(m_xv[27], 3), (UINT16)_mm_extract_epi16(m_xv[27], 2), (UINT16)_mm_extract_epi16(m_xv[27], 1), (UINT16)_mm_extract_epi16(m_xv[27], 0));
706         break;
707      case RSP_V28:
708         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[28], 7), (UINT16)_mm_extract_epi16(m_xv[28], 6), (UINT16)_mm_extract_epi16(m_xv[28], 5), (UINT16)_mm_extract_epi16(m_xv[28], 4), (UINT16)_mm_extract_epi16(m_xv[28], 3), (UINT16)_mm_extract_epi16(m_xv[28], 2), (UINT16)_mm_extract_epi16(m_xv[28], 1), (UINT16)_mm_extract_epi16(m_xv[28], 0));
709         break;
710      case RSP_V29:
711         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[29], 7), (UINT16)_mm_extract_epi16(m_xv[29], 6), (UINT16)_mm_extract_epi16(m_xv[29], 5), (UINT16)_mm_extract_epi16(m_xv[29], 4), (UINT16)_mm_extract_epi16(m_xv[29], 3), (UINT16)_mm_extract_epi16(m_xv[29], 2), (UINT16)_mm_extract_epi16(m_xv[29], 1), (UINT16)_mm_extract_epi16(m_xv[29], 0));
712         break;
713      case RSP_V30:
714         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[30], 7), (UINT16)_mm_extract_epi16(m_xv[30], 6), (UINT16)_mm_extract_epi16(m_xv[30], 5), (UINT16)_mm_extract_epi16(m_xv[30], 4), (UINT16)_mm_extract_epi16(m_xv[30], 3), (UINT16)_mm_extract_epi16(m_xv[30], 2), (UINT16)_mm_extract_epi16(m_xv[30], 1), (UINT16)_mm_extract_epi16(m_xv[30], 0));
715         break;
716      case RSP_V31:
717         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)_mm_extract_epi16(m_xv[31], 7), (UINT16)_mm_extract_epi16(m_xv[31], 6), (UINT16)_mm_extract_epi16(m_xv[31], 5), (UINT16)_mm_extract_epi16(m_xv[31], 4), (UINT16)_mm_extract_epi16(m_xv[31], 3), (UINT16)_mm_extract_epi16(m_xv[31], 2), (UINT16)_mm_extract_epi16(m_xv[31], 1), (UINT16)_mm_extract_epi16(m_xv[31], 0));
718         break;
719#else
720      case RSP_V0:
721         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 0, 0), (UINT16)VREG_S( 0, 1), (UINT16)VREG_S( 0, 2), (UINT16)VREG_S( 0, 3), (UINT16)VREG_S( 0, 4), (UINT16)VREG_S( 0, 5), (UINT16)VREG_S( 0, 6), (UINT16)VREG_S( 0, 7));
722         break;
723      case RSP_V1:
724         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 1, 0), (UINT16)VREG_S( 1, 1), (UINT16)VREG_S( 1, 2), (UINT16)VREG_S( 1, 3), (UINT16)VREG_S( 1, 4), (UINT16)VREG_S( 1, 5), (UINT16)VREG_S( 1, 6), (UINT16)VREG_S( 1, 7));
725         break;
726      case RSP_V2:
727         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 2, 0), (UINT16)VREG_S( 2, 1), (UINT16)VREG_S( 2, 2), (UINT16)VREG_S( 2, 3), (UINT16)VREG_S( 2, 4), (UINT16)VREG_S( 2, 5), (UINT16)VREG_S( 2, 6), (UINT16)VREG_S( 2, 7));
728         break;
729      case RSP_V3:
730         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 3, 0), (UINT16)VREG_S( 3, 1), (UINT16)VREG_S( 3, 2), (UINT16)VREG_S( 3, 3), (UINT16)VREG_S( 3, 4), (UINT16)VREG_S( 3, 5), (UINT16)VREG_S( 3, 6), (UINT16)VREG_S( 3, 7));
731         break;
732      case RSP_V4:
733         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 4, 0), (UINT16)VREG_S( 4, 1), (UINT16)VREG_S( 4, 2), (UINT16)VREG_S( 4, 3), (UINT16)VREG_S( 4, 4), (UINT16)VREG_S( 4, 5), (UINT16)VREG_S( 4, 6), (UINT16)VREG_S( 4, 7));
734         break;
735      case RSP_V5:
736         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 5, 0), (UINT16)VREG_S( 5, 1), (UINT16)VREG_S( 5, 2), (UINT16)VREG_S( 5, 3), (UINT16)VREG_S( 5, 4), (UINT16)VREG_S( 5, 5), (UINT16)VREG_S( 5, 6), (UINT16)VREG_S( 5, 7));
737         break;
738      case RSP_V6:
739         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 6, 0), (UINT16)VREG_S( 6, 1), (UINT16)VREG_S( 6, 2), (UINT16)VREG_S( 6, 3), (UINT16)VREG_S( 6, 4), (UINT16)VREG_S( 6, 5), (UINT16)VREG_S( 6, 6), (UINT16)VREG_S( 6, 7));
740         break;
741      case RSP_V7:
742         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 7, 0), (UINT16)VREG_S( 7, 1), (UINT16)VREG_S( 7, 2), (UINT16)VREG_S( 7, 3), (UINT16)VREG_S( 7, 4), (UINT16)VREG_S( 7, 5), (UINT16)VREG_S( 7, 6), (UINT16)VREG_S( 7, 7));
743         break;
744      case RSP_V8:
745         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 8, 0), (UINT16)VREG_S( 8, 1), (UINT16)VREG_S( 8, 2), (UINT16)VREG_S( 8, 3), (UINT16)VREG_S( 8, 4), (UINT16)VREG_S( 8, 5), (UINT16)VREG_S( 8, 6), (UINT16)VREG_S( 8, 7));
746         break;
747      case RSP_V9:
748         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S( 9, 0), (UINT16)VREG_S( 9, 1), (UINT16)VREG_S( 9, 2), (UINT16)VREG_S( 9, 3), (UINT16)VREG_S( 9, 4), (UINT16)VREG_S( 9, 5), (UINT16)VREG_S( 9, 6), (UINT16)VREG_S( 9, 7));
749         break;
750      case RSP_V10:
751         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(10, 0), (UINT16)VREG_S(10, 1), (UINT16)VREG_S(10, 2), (UINT16)VREG_S(10, 3), (UINT16)VREG_S(10, 4), (UINT16)VREG_S(10, 5), (UINT16)VREG_S(10, 6), (UINT16)VREG_S(10, 7));
752         break;
753      case RSP_V11:
754         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(11, 0), (UINT16)VREG_S(11, 1), (UINT16)VREG_S(11, 2), (UINT16)VREG_S(11, 3), (UINT16)VREG_S(11, 4), (UINT16)VREG_S(11, 5), (UINT16)VREG_S(11, 6), (UINT16)VREG_S(11, 7));
755         break;
756      case RSP_V12:
757         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(12, 0), (UINT16)VREG_S(12, 1), (UINT16)VREG_S(12, 2), (UINT16)VREG_S(12, 3), (UINT16)VREG_S(12, 4), (UINT16)VREG_S(12, 5), (UINT16)VREG_S(12, 6), (UINT16)VREG_S(12, 7));
758         break;
759      case RSP_V13:
760         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(13, 0), (UINT16)VREG_S(13, 1), (UINT16)VREG_S(13, 2), (UINT16)VREG_S(13, 3), (UINT16)VREG_S(13, 4), (UINT16)VREG_S(13, 5), (UINT16)VREG_S(13, 6), (UINT16)VREG_S(13, 7));
761         break;
762      case RSP_V14:
763         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(14, 0), (UINT16)VREG_S(14, 1), (UINT16)VREG_S(14, 2), (UINT16)VREG_S(14, 3), (UINT16)VREG_S(14, 4), (UINT16)VREG_S(14, 5), (UINT16)VREG_S(14, 6), (UINT16)VREG_S(14, 7));
764         break;
765      case RSP_V15:
766         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(15, 0), (UINT16)VREG_S(15, 1), (UINT16)VREG_S(15, 2), (UINT16)VREG_S(15, 3), (UINT16)VREG_S(15, 4), (UINT16)VREG_S(15, 5), (UINT16)VREG_S(15, 6), (UINT16)VREG_S(15, 7));
767         break;
768      case RSP_V16:
769         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(16, 0), (UINT16)VREG_S(16, 1), (UINT16)VREG_S(16, 2), (UINT16)VREG_S(16, 3), (UINT16)VREG_S(16, 4), (UINT16)VREG_S(16, 5), (UINT16)VREG_S(16, 6), (UINT16)VREG_S(16, 7));
770         break;
771      case RSP_V17:
772         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(17, 0), (UINT16)VREG_S(17, 1), (UINT16)VREG_S(17, 2), (UINT16)VREG_S(17, 3), (UINT16)VREG_S(17, 4), (UINT16)VREG_S(17, 5), (UINT16)VREG_S(17, 6), (UINT16)VREG_S(17, 7));
773         break;
774      case RSP_V18:
775         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(18, 0), (UINT16)VREG_S(18, 1), (UINT16)VREG_S(18, 2), (UINT16)VREG_S(18, 3), (UINT16)VREG_S(18, 4), (UINT16)VREG_S(18, 5), (UINT16)VREG_S(18, 6), (UINT16)VREG_S(18, 7));
776         break;
777      case RSP_V19:
778         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(19, 0), (UINT16)VREG_S(19, 1), (UINT16)VREG_S(19, 2), (UINT16)VREG_S(19, 3), (UINT16)VREG_S(19, 4), (UINT16)VREG_S(19, 5), (UINT16)VREG_S(19, 6), (UINT16)VREG_S(19, 7));
779         break;
780      case RSP_V20:
781         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(20, 0), (UINT16)VREG_S(20, 1), (UINT16)VREG_S(20, 2), (UINT16)VREG_S(20, 3), (UINT16)VREG_S(20, 4), (UINT16)VREG_S(20, 5), (UINT16)VREG_S(20, 6), (UINT16)VREG_S(20, 7));
782         break;
783      case RSP_V21:
784         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(21, 0), (UINT16)VREG_S(21, 1), (UINT16)VREG_S(21, 2), (UINT16)VREG_S(21, 3), (UINT16)VREG_S(21, 4), (UINT16)VREG_S(21, 5), (UINT16)VREG_S(21, 6), (UINT16)VREG_S(21, 7));
785         break;
786      case RSP_V22:
787         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(22, 0), (UINT16)VREG_S(22, 1), (UINT16)VREG_S(22, 2), (UINT16)VREG_S(22, 3), (UINT16)VREG_S(22, 4), (UINT16)VREG_S(22, 5), (UINT16)VREG_S(22, 6), (UINT16)VREG_S(22, 7));
788         break;
789      case RSP_V23:
790         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(23, 0), (UINT16)VREG_S(23, 1), (UINT16)VREG_S(23, 2), (UINT16)VREG_S(23, 3), (UINT16)VREG_S(23, 4), (UINT16)VREG_S(23, 5), (UINT16)VREG_S(23, 6), (UINT16)VREG_S(23, 7));
791         break;
792      case RSP_V24:
793         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(24, 0), (UINT16)VREG_S(24, 1), (UINT16)VREG_S(24, 2), (UINT16)VREG_S(24, 3), (UINT16)VREG_S(24, 4), (UINT16)VREG_S(24, 5), (UINT16)VREG_S(24, 6), (UINT16)VREG_S(24, 7));
794         break;
795      case RSP_V25:
796         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(25, 0), (UINT16)VREG_S(25, 1), (UINT16)VREG_S(25, 2), (UINT16)VREG_S(25, 3), (UINT16)VREG_S(25, 4), (UINT16)VREG_S(25, 5), (UINT16)VREG_S(25, 6), (UINT16)VREG_S(25, 7));
797         break;
798      case RSP_V26:
799         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(26, 0), (UINT16)VREG_S(26, 1), (UINT16)VREG_S(26, 2), (UINT16)VREG_S(26, 3), (UINT16)VREG_S(26, 4), (UINT16)VREG_S(26, 5), (UINT16)VREG_S(26, 6), (UINT16)VREG_S(26, 7));
800         break;
801      case RSP_V27:
802         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(27, 0), (UINT16)VREG_S(27, 1), (UINT16)VREG_S(27, 2), (UINT16)VREG_S(27, 3), (UINT16)VREG_S(27, 4), (UINT16)VREG_S(27, 5), (UINT16)VREG_S(27, 6), (UINT16)VREG_S(27, 7));
803         break;
804      case RSP_V28:
805         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(28, 0), (UINT16)VREG_S(28, 1), (UINT16)VREG_S(28, 2), (UINT16)VREG_S(28, 3), (UINT16)VREG_S(28, 4), (UINT16)VREG_S(28, 5), (UINT16)VREG_S(28, 6), (UINT16)VREG_S(28, 7));
806         break;
807      case RSP_V29:
808         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(29, 0), (UINT16)VREG_S(29, 1), (UINT16)VREG_S(29, 2), (UINT16)VREG_S(29, 3), (UINT16)VREG_S(29, 4), (UINT16)VREG_S(29, 5), (UINT16)VREG_S(29, 6), (UINT16)VREG_S(29, 7));
809         break;
810      case RSP_V30:
811         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(30, 0), (UINT16)VREG_S(30, 1), (UINT16)VREG_S(30, 2), (UINT16)VREG_S(30, 3), (UINT16)VREG_S(30, 4), (UINT16)VREG_S(30, 5), (UINT16)VREG_S(30, 6), (UINT16)VREG_S(30, 7));
812         break;
813      case RSP_V31:
814         string.printf("%04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X", (UINT16)VREG_S(31, 0), (UINT16)VREG_S(31, 1), (UINT16)VREG_S(31, 2), (UINT16)VREG_S(31, 3), (UINT16)VREG_S(31, 4), (UINT16)VREG_S(31, 5), (UINT16)VREG_S(31, 6), (UINT16)VREG_S(31, 7));
815         break;
816#endif
817
818   }
819}
820
821void rsp_device::device_stop()
822{
342823#if SAVE_DISASM
343824   {
344825      char string[200];
r31833r31834
364845
365846      for (i=0; i < 0x1000; i+=4)
366847      {
367         fprintf(dmem, "%08X: %08X\n", 0x04000000 + i, READ32(rsp, 0x04000000 + i));
848         fprintf(dmem, "%08X: %08X\n", 0x04000000 + i, READ32(0x04000000 + i));
368849      }
369850      fclose(dmem);
370851#endif
r31833r31834
372853
373854      for (i=0; i < 0x1000; i++)
374855      {
375         fputc(READ8(rsp, 0x04000000 + i), dmem);
856         fputc(READ8(0x04000000 + i), dmem);
376857      }
377858      fclose(dmem);
378859   }
379860#endif
380861
381   if (rsp->exec_output)
382      fclose(rsp->exec_output);
383   rsp->exec_output = NULL;
862   if (m_exec_output)
863      fclose(m_exec_output);
864   m_exec_output = NULL;
865
866   /* clean up the DRC */
867   if ( m_drcuml )
868   {
869      auto_free(machine(), m_drcuml);
870   }
871   if (m_drcfe )
872   {
873       auto_free(machine(), m_drcfe);
874   }
384875}
385876
386static CPU_RESET( rsp )
877void rsp_device::device_reset()
387878{
388   rsp_state *rsp = get_safe_token(device);
389   rsp->nextpc = ~0;
879   m_nextpc = ~0;
390880}
391881
392static void handle_lwc2(rsp_state *rsp, UINT32 op)
882void rsp_device::handle_lwc2(UINT32 op)
393883{
394884   int i, end;
395885   UINT32 ea;
r31833r31834
411901         //
412902         // Load 1 byte to vector byte index
413903
414         ea = (base) ? rsp->r[base] + offset : offset;
415         VREG_B(dest, index) = READ8(rsp, ea);
904         ea = (base) ? m_rsp_state->r[base] + offset : offset;
905         VREG_B(dest, index) = READ8(ea);
416906         break;
417907      }
418908      case 0x01:      /* LSV */
r31833r31834
424914         //
425915         // Loads 2 bytes starting from vector byte index
426916
427         ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
917         ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
428918
429919         end = index + 2;
430920
431921         for (i=index; i < end; i++)
432922         {
433            VREG_B(dest, i) = READ8(rsp, ea);
923            VREG_B(dest, i) = READ8(ea);
434924            ea++;
435925         }
436926         break;
r31833r31834
444934         //
445935         // Loads 4 bytes starting from vector byte index
446936
447         ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
937         ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
448938
449939         end = index + 4;
450940
451941         for (i=index; i < end; i++)
452942         {
453            VREG_B(dest, i) = READ8(rsp, ea);
943            VREG_B(dest, i) = READ8(ea);
454944            ea++;
455945         }
456946         break;
r31833r31834
464954         //
465955         // Loads 8 bytes starting from vector byte index
466956
467         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
957         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
468958
469959         end = index + 8;
470960
471961         for (i=index; i < end; i++)
472962         {
473            VREG_B(dest, i) = READ8(rsp, ea);
963            VREG_B(dest, i) = READ8(ea);
474964            ea++;
475965         }
476966         break;
r31833r31834
484974         //
485975         // Loads up to 16 bytes starting from vector byte index
486976
487         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
977         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
488978
489979         end = index + (16 - (ea & 0xf));
490980         if (end > 16) end = 16;
491981
492982         for (i=index; i < end; i++)
493983         {
494            VREG_B(dest, i) = READ8(rsp, ea);
984            VREG_B(dest, i) = READ8(ea);
495985            ea++;
496986         }
497987         break;
r31833r31834
505995         //
506996         // Stores up to 16 bytes starting from right side until 16-byte boundary
507997
508         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
998         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
509999
5101000         index = 16 - ((ea & 0xf) - index);
5111001         end = 16;
r31833r31834
5131003
5141004         for (i=index; i < end; i++)
5151005         {
516            VREG_B(dest, i) = READ8(rsp, ea);
1006            VREG_B(dest, i) = READ8(ea);
5171007            ea++;
5181008         }
5191009         break;
r31833r31834
5271017         //
5281018         // Loads a byte as the upper 8 bits of each element
5291019
530         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1020         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
5311021
5321022         for (i=0; i < 8; i++)
5331023         {
534            VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + i) & 0xf)) << 8;
1024            VREG_S(dest, i) = READ8(ea + (((16-index) + i) & 0xf)) << 8;
5351025         }
5361026         break;
5371027      }
r31833r31834
5441034         //
5451035         // Loads a byte as the bits 14-7 of each element
5461036
547         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1037         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
5481038
5491039         for (i=0; i < 8; i++)
5501040         {
551            VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + i) & 0xf)) << 7;
1041            VREG_S(dest, i) = READ8(ea + (((16-index) + i) & 0xf)) << 7;
5521042         }
5531043         break;
5541044      }
r31833r31834
5611051         //
5621052         // Loads a byte as the bits 14-7 of each element, with 2-byte stride
5631053
564         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1054         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
5651055
5661056         for (i=0; i < 8; i++)
5671057         {
568            VREG_S(dest, i) = READ8(rsp, ea + (((16-index) + (i<<1)) & 0xf)) << 7;
1058            VREG_S(dest, i) = READ8(ea + (((16-index) + (i<<1)) & 0xf)) << 7;
5691059         }
5701060         break;
5711061      }
r31833r31834
5781068         //
5791069         // Loads a byte as the bits 14-7 of upper or lower quad, with 4-byte stride
5801070
581         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1071         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
5821072
5831073         // not sure what happens if 16-byte boundary is crossed...
5841074
r31833r31834
5861076
5871077         for (i=index >> 1; i < end; i++)
5881078         {
589            VREG_S(dest, i) = READ8(rsp, ea) << 7;
1079            VREG_S(dest, i) = READ8(ea) << 7;
5901080            ea += 4;
5911081         }
5921082         break;
r31833r31834
6011091         // Loads the full 128-bit vector starting from vector byte index and wrapping to index 0
6021092         // after byte index 15
6031093
604         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1094         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
6051095
6061096         // not sure what happens if 16-byte boundary is crossed...
607         if ((ea & 0xf) > 0) fatalerror("RSP: LWV: 16-byte boundary crossing at %08X, recheck this!\n", rsp->ppc);
1097         if ((ea & 0xf) > 0) fatalerror("RSP: LWV: 16-byte boundary crossing at %08X, recheck this!\n", m_ppc);
6081098
6091099         end = (16 - index) + 16;
6101100
6111101         for (i=(16 - index); i < end; i++)
6121102         {
613            VREG_B(dest, i & 0xf) = READ8(rsp, ea);
1103            VREG_B(dest, i & 0xf) = READ8(ea);
6141104            ea += 4;
6151105         }
6161106         break;
r31833r31834
6361126
6371127         if (index & 1)  fatalerror("RSP: LTV: index = %d\n", index);
6381128
639         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1129         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
6401130
6411131         ea = ((ea + 8) & ~0xf) + (index & 1);
6421132         for (i=vs; i < ve; i++)
6431133         {
6441134            element = ((8 - (index >> 1) + (i-vs)) << 1);
645            VREG_B(i, (element & 0xf)) = READ8(rsp, ea);
646            VREG_B(i, ((element + 1) & 0xf)) = READ8(rsp, ea + 1);
1135            VREG_B(i, (element & 0xf)) = READ8(ea);
1136            VREG_B(i, ((element + 1) & 0xf)) = READ8(ea + 1);
6471137
6481138            ea += 2;
6491139         }
r31833r31834
6521142
6531143      default:
6541144      {
655         unimplemented_opcode(rsp, op);
1145         unimplemented_opcode(op);
6561146         break;
6571147      }
6581148   }
6591149}
6601150
661static void handle_swc2(rsp_state *rsp, UINT32 op)
1151void rsp_device::handle_swc2(UINT32 op)
6621152{
6631153   int i, end;
6641154   int eaoffset;
r31833r31834
6811171         //
6821172         // Stores 1 byte from vector byte index
6831173
684         ea = (base) ? rsp->r[base] + offset : offset;
685         WRITE8(rsp, ea, VREG_B(dest, index));
1174         ea = (base) ? m_rsp_state->r[base] + offset : offset;
1175         WRITE8(ea, VREG_B(dest, index));
6861176         break;
6871177      }
6881178      case 0x01:      /* SSV */
r31833r31834
6941184         //
6951185         // Stores 2 bytes starting from vector byte index
6961186
697         ea = (base) ? rsp->r[base] + (offset * 2) : (offset * 2);
1187         ea = (base) ? m_rsp_state->r[base] + (offset * 2) : (offset * 2);
6981188
6991189         end = index + 2;
7001190
7011191         for (i=index; i < end; i++)
7021192         {
703            WRITE8(rsp, ea, VREG_B(dest, i));
1193            WRITE8(ea, VREG_B(dest, i));
7041194            ea++;
7051195         }
7061196         break;
r31833r31834
7141204         //
7151205         // Stores 4 bytes starting from vector byte index
7161206
717         ea = (base) ? rsp->r[base] + (offset * 4) : (offset * 4);
1207         ea = (base) ? m_rsp_state->r[base] + (offset * 4) : (offset * 4);
7181208
7191209         end = index + 4;
7201210
7211211         for (i=index; i < end; i++)
7221212         {
723            WRITE8(rsp, ea, VREG_B(dest, i));
1213            WRITE8(ea, VREG_B(dest, i));
7241214            ea++;
7251215         }
7261216         break;
r31833r31834
7341224         //
7351225         // Stores 8 bytes starting from vector byte index
7361226
737         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1227         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
7381228
7391229         end = index + 8;
7401230
7411231         for (i=index; i < end; i++)
7421232         {
743            WRITE8(rsp, ea, VREG_B(dest, i));
1233            WRITE8(ea, VREG_B(dest, i));
7441234            ea++;
7451235         }
7461236         break;
r31833r31834
7541244         //
7551245         // Stores up to 16 bytes starting from vector byte index until 16-byte boundary
7561246
757         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1247         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
7581248
7591249         end = index + (16 - (ea & 0xf));
7601250
7611251         for (i=index; i < end; i++)
7621252         {
763            WRITE8(rsp, ea, VREG_B(dest, i & 0xf));
1253            WRITE8(ea, VREG_B(dest, i & 0xf));
7641254            ea++;
7651255         }
7661256         break;
r31833r31834
7751265         // Stores up to 16 bytes starting from right side until 16-byte boundary
7761266
7771267         int o;
778         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1268         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
7791269
7801270         end = index + (ea & 0xf);
7811271         o = (16 - (ea & 0xf)) & 0xf;
r31833r31834
7831273
7841274         for (i=index; i < end; i++)
7851275         {
786            WRITE8(rsp, ea, VREG_B(dest, ((i + o) & 0xf)));
1276            WRITE8(ea, VREG_B(dest, ((i + o) & 0xf)));
7871277            ea++;
7881278         }
7891279         break;
r31833r31834
7971287         //
7981288         // Stores upper 8 bits of each element
7991289
800         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1290         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
8011291         end = index + 8;
8021292
8031293         for (i=index; i < end; i++)
8041294         {
8051295            if ((i & 0xf) < 8)
8061296            {
807               WRITE8(rsp, ea, VREG_B(dest, ((i & 0xf) << 1)));
1297               WRITE8(ea, VREG_B(dest, ((i & 0xf) << 1)));
8081298            }
8091299            else
8101300            {
811               WRITE8(rsp, ea, VREG_S(dest, (i & 0x7)) >> 7);
1301               WRITE8(ea, VREG_S(dest, (i & 0x7)) >> 7);
8121302            }
8131303            ea++;
8141304         }
r31833r31834
8231313         //
8241314         // Stores bits 14-7 of each element
8251315
826         ea = (base) ? rsp->r[base] + (offset * 8) : (offset * 8);
1316         ea = (base) ? m_rsp_state->r[base] + (offset * 8) : (offset * 8);
8271317         end = index + 8;
8281318
8291319         for (i=index; i < end; i++)
8301320         {
8311321            if ((i & 0xf) < 8)
8321322            {
833               WRITE8(rsp, ea, VREG_S(dest, (i & 0x7)) >> 7);
1323               WRITE8(ea, VREG_S(dest, (i & 0x7)) >> 7);
8341324            }
8351325            else
8361326            {
837               WRITE8(rsp, ea, VREG_B(dest, ((i & 0x7) << 1)));
1327               WRITE8(ea, VREG_B(dest, ((i & 0x7) << 1)));
8381328            }
8391329            ea++;
8401330         }
r31833r31834
8491339         //
8501340         // Stores bits 14-7 of each element, with 2-byte stride
8511341
852         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1342         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
8531343
8541344         for (i=0; i < 8; i++)
8551345         {
8561346            UINT8 d = ((VREG_B(dest, ((index + (i << 1) + 0) & 0xf))) << 1) |
8571347                     ((VREG_B(dest, ((index + (i << 1) + 1) & 0xf))) >> 7);
8581348
859            WRITE8(rsp, ea, d);
1349            WRITE8(ea, d);
8601350            ea += 2;
8611351         }
8621352         break;
r31833r31834
8721362
8731363         // FIXME: only works for index 0 and index 8
8741364
875         if (index & 0x7)    osd_printf_debug("RSP: SFV: index = %d at %08X\n", index, rsp->ppc);
1365         if (index & 0x7)    osd_printf_debug("RSP: SFV: index = %d at %08X\n", index, m_ppc);
8761366
877         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1367         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
8781368
8791369         eaoffset = ea & 0xf;
8801370         ea &= ~0xf;
r31833r31834
8831373
8841374         for (i=index >> 1; i < end; i++)
8851375         {
886            WRITE8(rsp, ea + (eaoffset & 0xf), VREG_S(dest, i) >> 7);
1376            WRITE8(ea + (eaoffset & 0xf), VREG_S(dest, i) >> 7);
8871377            eaoffset += 4;
8881378         }
8891379         break;
r31833r31834
8981388         // Stores the full 128-bit vector starting from vector byte index and wrapping to index 0
8991389         // after byte index 15
9001390
901         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1391         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
9021392
9031393         eaoffset = ea & 0xf;
9041394         ea &= ~0xf;
r31833r31834
9071397
9081398         for (i=index; i < end; i++)
9091399         {
910            WRITE8(rsp, ea + (eaoffset & 0xf), VREG_B(dest, i & 0xf));
1400            WRITE8(ea + (eaoffset & 0xf), VREG_B(dest, i & 0xf));
9111401            eaoffset++;
9121402         }
9131403         break;
r31833r31834
9291419
9301420         element = 8 - (index >> 1);
9311421
932         ea = (base) ? rsp->r[base] + (offset * 16) : (offset * 16);
1422         ea = (base) ? m_rsp_state->r[base] + (offset * 16) : (offset * 16);
9331423
9341424         eaoffset = (ea & 0xf) + (element * 2);
9351425         ea &= ~0xf;
9361426
9371427         for (i=vs; i < ve; i++)
9381428         {
939            WRITE16(rsp, ea + (eaoffset & 0xf), VREG_S(i, element & 0x7));
1429            WRITE16(ea + (eaoffset & 0xf), VREG_S(i, element & 0x7));
9401430            eaoffset += 2;
9411431            element++;
9421432         }
r31833r31834
9451435
9461436      default:
9471437      {
948         unimplemented_opcode(rsp, op);
1438         unimplemented_opcode(op);
9491439         break;
9501440      }
9511441   }
9521442}
9531443
954INLINE UINT16 SATURATE_ACCUM(rsp_state *rsp, int accum, int slice, UINT16 negative, UINT16 positive)
1444inline UINT16 rsp_device::SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive)
9551445{
9561446   if ((INT16)ACCUM_H(accum) < 0)
9571447   {
r31833r31834
10071497   return 0;
10081498}
10091499
1010INLINE UINT16 SATURATE_ACCUM1(rsp_state *rsp, int accum, UINT16 negative, UINT16 positive)
1500inline UINT16 rsp_device::SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive)
10111501{
10121502   if ((INT16)ACCUM_H(accum) < 0)
10131503   {
r31833r31834
10491539   return 0;
10501540}
10511541
1052#define WRITEBACK_RESULT() {memcpy(&rsp->v[VDREG].s[0], &vres[0], 16);}
1542#define WRITEBACK_RESULT() {memcpy(&m_v[VDREG].s[0], &vres[0], 16);}
10531543
10541544#if 0
10551545static float float_round(float input)
r31833r31834
10691559}
10701560#endif
10711561
1072static void handle_vector_ops(rsp_state *rsp, UINT32 op)
1562void rsp_device::handle_vector_ops(UINT32 op)
10731563{
10741564   int i;
10751565   UINT32 VS1REG = (op >> 11) & 0x1f;
r31833r31834
13151805            r = s1 * s2;
13161806
13171807            ACCUM(i) += (INT64)(r) << 17;
1318            res = SATURATE_ACCUM(rsp, i, 1, 0x8000, 0x7fff);
1808            res = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
13191809
13201810            vres[i] = res;
13211811         }
r31833r31834
14061896            ACCUM_M(i) = (UINT16)(r3);
14071897            ACCUM_H(i) += (INT16)(r3 >> 16);
14081898
1409            res = SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
1899            res = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
14101900
14111901            vres[i] = res;
14121902         }
r31833r31834
14441934            if ((INT32)(r1) < 0)
14451935               ACCUM_H(i) -= 1;
14461936
1447            res = SATURATE_ACCUM(rsp, i, 1, 0x8000, 0x7fff);
1937            res = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
14481938
14491939            vres[i] = res;
14501940         }
r31833r31834
14741964
14751965            ACCUM(i) += (INT64)(s1*s2)<<16;
14761966
1477            res = SATURATE_ACCUM(rsp, i, 0, 0x0000, 0xffff);
1967            res = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
14781968            vres[i] = res;
14791969         }
14801970         WRITEBACK_RESULT();
r31833r31834
15021992            s1 = (INT32)(INT16)VREG_S(VS1REG, i);
15031993            s2 = (INT32)(INT16)VREG_S(VS2REG, sel);
15041994
1505            rsp->accum[i].l[1] += s1*s2;
1995            m_accum[i].l[1] += s1*s2;
15061996
1507            res = SATURATE_ACCUM1(rsp, i, 0x8000, 0x7fff);
1997            res = SATURATE_ACCUM1(i, 0x8000, 0x7fff);
15081998
15091999            vres[i] = res;
15102000         }
r31833r31834
23512841         }
23522842         rec = temp;
23532843
2354         rsp->reciprocal_res = rec;
2355         rsp->dp_allowed = 0;
2844         m_reciprocal_res = rec;
2845         m_dp_allowed = 0;
23562846
23572847         VREG_S(VDREG, del) = (UINT16)(rec & 0xffff);
23582848
r31833r31834
23792869         int sel = EL & 7;
23802870         INT32 shifter = 0;
23812871
2382         INT32 rec = ((UINT16)(VREG_S(VS2REG, sel)) | ((UINT32)(rsp->reciprocal_high) & 0xffff0000));
2872         INT32 rec = ((UINT16)(VREG_S(VS2REG, sel)) | ((UINT32)(m_reciprocal_high) & 0xffff0000));
23832873
23842874         INT32 datainput = rec;
23852875
23862876         if (rec < 0)
23872877         {
2388            if (rsp->dp_allowed)
2878            if (m_dp_allowed)
23892879            {
23902880               if (rec < -32768)
23912881               {
r31833r31834
24162906         }
24172907         else
24182908         {
2419            if (rsp->dp_allowed)
2909            if (m_dp_allowed)
24202910            {
24212911               shifter = 0;
24222912            }
r31833r31834
24432933         }
24442934         rec = temp;
24452935
2446         rsp->reciprocal_res = rec;
2447         rsp->dp_allowed = 0;
2936         m_reciprocal_res = rec;
2937         m_dp_allowed = 0;
24482938
24492939         VREG_S(VDREG, del) = (UINT16)(rec & 0xffff);
24502940
r31833r31834
24692959         int del = VS1REG & 7;
24702960         int sel = EL & 7;
24712961
2472         rsp->reciprocal_high = (VREG_S(VS2REG, sel)) << 16;
2473         rsp->dp_allowed = 1;
2962         m_reciprocal_high = (VREG_S(VS2REG, sel)) << 16;
2963         m_dp_allowed = 1;
24742964
24752965         for (i = 0; i < 8; i++)
24762966         {
r31833r31834
24782968            ACCUM_L(i) = VREG_S(VS2REG, sel);
24792969         }
24802970
2481         VREG_S(VDREG, del) = (INT16)(rsp->reciprocal_res >> 16);
2971         VREG_S(VDREG, del) = (INT16)(m_reciprocal_res >> 16);
24822972
24832973         break;
24842974      }
r31833r31834
25543044         }
25553045         rec = temp;
25563046
2557         rsp->reciprocal_res = rec;
2558         rsp->dp_allowed = 0;
3047         m_reciprocal_res = rec;
3048         m_dp_allowed = 0;
25593049
25603050         VREG_S(VDREG, del) = (UINT16)(rec & 0xffff);
25613051
r31833r31834
25813071         int sel = EL & 7;
25823072         INT32 shifter = 0;
25833073
2584         INT32 rec = ((UINT16)(VREG_S(VS2REG, sel)) | ((UINT32)(rsp->reciprocal_high) & 0xffff0000));
3074         INT32 rec = ((UINT16)(VREG_S(VS2REG, sel)) | ((UINT32)(m_reciprocal_high) & 0xffff0000));
25853075
25863076         INT32 datainput = rec;
25873077
25883078         if (rec < 0)
25893079         {
2590            if (rsp->dp_allowed)
3080            if (m_dp_allowed)
25913081            {
25923082               if (rec < -32768)//VDIV.C,208
25933083               {
r31833r31834
26173107         }
26183108         else
26193109         {
2620            if (rsp->dp_allowed)
3110            if (m_dp_allowed)
26213111            {
26223112               shifter = 0;
26233113            }
r31833r31834
26463136         }
26473137         rec = temp;
26483138
2649         rsp->reciprocal_res = rec;
2650         rsp->dp_allowed = 0;
3139         m_reciprocal_res = rec;
3140         m_dp_allowed = 0;
26513141
26523142         VREG_S(VDREG, del) = (UINT16)(rec & 0xffff);
26533143
r31833r31834
26723162         int del = VS1REG & 7;
26733163         int sel = EL & 7;
26743164
2675         rsp->reciprocal_high = (VREG_S(VS2REG, sel)) << 16;
2676         rsp->dp_allowed = 1;
3165         m_reciprocal_high = (VREG_S(VS2REG, sel)) << 16;
3166         m_dp_allowed = 1;
26773167
26783168         for (i=0; i < 8; i++)
26793169         {
r31833r31834
26813171            ACCUM_L(i) = VREG_S(VS2REG, sel);
26823172         }
26833173
2684         VREG_S(VDREG, del) = (INT16)(rsp->reciprocal_res >> 16);    // store high part
3174         VREG_S(VDREG, del) = (INT16)(m_reciprocal_res >> 16);    // store high part
26853175         break;
26863176      }
26873177
r31833r31834
26973187         break;
26983188      }
26993189
2700      default:    unimplemented_opcode(rsp, op); break;
3190      default:    unimplemented_opcode(op); break;
27013191   }
27023192}
27033193
2704static CPU_EXECUTE( rsp )
3194void rsp_device::execute_run()
27053195{
2706   rsp_state *rsp = get_safe_token(device);
2707   UINT32 op;
3196   if (m_isdrc)
3197   {
3198      execute_run_drc();
3199      return;
3200   }
27083201
2709   rsp->pc = 0x4001000 | (rsp->pc & 0xfff);
3202   m_rsp_state->pc = 0x4001000 | (m_rsp_state->pc & 0xfff);
27103203
2711   if( rsp->sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
3204   if( m_sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
27123205   {
2713      rsp->icount = MIN(rsp->icount, 0);
3206      m_rsp_state->icount = MIN(m_rsp_state->icount, 0);
27143207   }
27153208
2716   while (rsp->icount > 0)
3209   while (m_rsp_state->icount > 0)
27173210   {
2718      rsp->ppc = rsp->pc;
2719      debugger_instruction_hook(device, rsp->pc);
3211      m_ppc = m_rsp_state->pc;
3212      debugger_instruction_hook(this, m_rsp_state->pc);
27203213
2721      op = ROPCODE(rsp->pc);
2722      if (rsp->nextpc != ~0)
3214      UINT32 op = ROPCODE(m_rsp_state->pc);
3215      if (m_nextpc != ~0)
27233216      {
2724         rsp->pc = rsp->nextpc;
2725         rsp->nextpc = ~0;
3217         m_rsp_state->pc = m_nextpc;
3218         m_nextpc = ~0;
27263219      }
27273220      else
27283221      {
2729         rsp->pc += 4;
3222         m_rsp_state->pc += 4;
27303223      }
27313224
27323225      switch (op >> 26)
r31833r31834
27453238               case 0x09:  /* JALR */      JUMP_PC_L(RSVAL, RDREG); break;
27463239               case 0x0d:  /* BREAK */
27473240               {
2748                  (rsp->device->sp_set_status_func)(0, 0x3, 0xffffffff);
2749                  rsp->icount = MIN(rsp->icount, 1);
3241                  m_sp_set_status_func(0, 0x3, 0xffffffff);
3242                  m_rsp_state->icount = MIN(m_rsp_state->icount, 1);
27503243
2751                  if (LOG_INSTRUCTION_EXECUTION) fprintf(rsp->exec_output, "\n---------- break ----------\n\n");
3244                  if (LOG_INSTRUCTION_EXECUTION) fprintf(m_exec_output, "\n---------- break ----------\n\n");
27523245
27533246                  break;
27543247               }
r31833r31834
27623255               case 0x27:  /* NOR */       if (RDREG) RDVAL = ~(RSVAL | RTVAL); break;
27633256               case 0x2a:  /* SLT */       if (RDREG) RDVAL = (INT32)RSVAL < (INT32)RTVAL; break;
27643257               case 0x2b:  /* SLTU */      if (RDREG) RDVAL = (UINT32)RSVAL < (UINT32)RTVAL; break;
2765               default:    unimplemented_opcode(rsp, op); break;
3258               default:    unimplemented_opcode(op); break;
27663259            }
27673260            break;
27683261         }
r31833r31834
27753268               case 0x01:  /* BGEZ */      if ((INT32)(RSVAL) >= 0) JUMP_REL(SIMM16); break;
27763269               case 0x10:  /* BLTZAL */    if ((INT32)(RSVAL) < 0) JUMP_REL_L(SIMM16, 31); break;
27773270               case 0x11:  /* BGEZAL */    if ((INT32)(RSVAL) >= 0) JUMP_REL_L(SIMM16, 31); break;
2778               default:    unimplemented_opcode(rsp, op); break;
3271               default:    unimplemented_opcode(op); break;
27793272            }
27803273            break;
27813274         }
r31833r31834
27993292         {
28003293            switch ((op >> 21) & 0x1f)
28013294            {
2802               case 0x00:  /* MFC0 */      if (RTREG) RTVAL = get_cop0_reg(rsp, RDREG); break;
2803               case 0x04:  /* MTC0 */      set_cop0_reg(rsp, RDREG, RTVAL); break;
2804               default:    unimplemented_opcode(rsp, op); break;
3295               case 0x00:  /* MFC0 */      if (RTREG) RTVAL = get_cop0_reg(RDREG); break;
3296               case 0x04:  /* MTC0 */      set_cop0_reg(RDREG, RTVAL); break;
3297               default:    unimplemented_opcode(op); break;
28053298            }
28063299            break;
28073300         }
r31833r31834
29783471               case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
29793472               case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
29803473               {
2981                  handle_vector_ops(rsp, op);
3474                  handle_vector_ops(op);
29823475                  break;
29833476               }
29843477
2985               default:    unimplemented_opcode(rsp, op); break;
3478               default:    unimplemented_opcode(op); break;
29863479            }
29873480            break;
29883481         }
29893482
2990         case 0x20:  /* LB */        if (RTREG) RTVAL = (INT32)(INT8)READ8(rsp, RSVAL + SIMM16); break;
2991         case 0x21:  /* LH */        if (RTREG) RTVAL = (INT32)(INT16)READ16(rsp, RSVAL + SIMM16); break;
2992         case 0x23:  /* LW */        if (RTREG) RTVAL = READ32(rsp, RSVAL + SIMM16); break;
2993         case 0x24:  /* LBU */       if (RTREG) RTVAL = (UINT8)READ8(rsp, RSVAL + SIMM16); break;
2994         case 0x25:  /* LHU */       if (RTREG) RTVAL = (UINT16)READ16(rsp, RSVAL + SIMM16); break;
2995         case 0x28:  /* SB */        WRITE8(rsp, RSVAL + SIMM16, RTVAL); break;
2996         case 0x29:  /* SH */        WRITE16(rsp, RSVAL + SIMM16, RTVAL); break;
2997         case 0x2b:  /* SW */        WRITE32(rsp, RSVAL + SIMM16, RTVAL); break;
2998         case 0x32:  /* LWC2 */      handle_lwc2(rsp, op); break;
2999         case 0x3a:  /* SWC2 */      handle_swc2(rsp, op); break;
3483         case 0x20:  /* LB */        if (RTREG) RTVAL = (INT32)(INT8)READ8(RSVAL + SIMM16); break;
3484         case 0x21:  /* LH */        if (RTREG) RTVAL = (INT32)(INT16)READ16(RSVAL + SIMM16); break;
3485         case 0x23:  /* LW */        if (RTREG) RTVAL = READ32(RSVAL + SIMM16); break;
3486         case 0x24:  /* LBU */       if (RTREG) RTVAL = (UINT8)READ8(RSVAL + SIMM16); break;
3487         case 0x25:  /* LHU */       if (RTREG) RTVAL = (UINT16)READ16(RSVAL + SIMM16); break;
3488         case 0x28:  /* SB */        WRITE8(RSVAL + SIMM16, RTVAL); break;
3489         case 0x29:  /* SH */        WRITE16(RSVAL + SIMM16, RTVAL); break;
3490         case 0x2b:  /* SW */        WRITE32(RSVAL + SIMM16, RTVAL); break;
3491         case 0x32:  /* LWC2 */      handle_lwc2(op); break;
3492         case 0x3a:  /* SWC2 */      handle_swc2(op); break;
30003493
30013494         default:
30023495         {
3003            unimplemented_opcode(rsp, op);
3496            unimplemented_opcode(op);
30043497            break;
30053498         }
30063499      }
r31833r31834
30113504         static UINT32 prev_regs[32];
30123505         static VECTOR_REG prev_vecs[32];
30133506         char string[200];
3014         rsp_dasm_one(string, rsp->ppc, op);
3507         rsp_dasm_one(string, m_ppc, op);
30153508
3016         fprintf(rsp->exec_output, "%08X: %s", rsp->ppc, string);
3509         fprintf(m_exec_output, "%08X: %s", m_ppc, string);
30173510
30183511         l = strlen(string);
30193512         if (l < 36)
30203513         {
30213514            for (i=l; i < 36; i++)
30223515            {
3023               fprintf(rsp->exec_output, " ");
3516               fprintf(m_exec_output, " ");
30243517            }
30253518         }
30263519
3027         fprintf(rsp->exec_output, "| ");
3520         fprintf(m_exec_output, "| ");
30283521
30293522         for (i=0; i < 32; i++)
30303523         {
3031            if (rsp->r[i] != prev_regs[i])
3524            if (m_rsp_state->r[i] != prev_regs[i])
30323525            {
3033               fprintf(rsp->exec_output, "R%d: %08X ", i, rsp->r[i]);
3526               fprintf(m_exec_output, "R%d: %08X ", i, m_rsp_state->r[i]);
30343527            }
3035            prev_regs[i] = rsp->r[i];
3528            prev_regs[i] = m_rsp_state->r[i];
30363529         }
30373530
30383531         for (i=0; i < 32; i++)
30393532         {
3040            if (rsp->v[i].d[0] != prev_vecs[i].d[0] || rsp->v[i].d[1] != prev_vecs[i].d[1])
3533            if (m_v[i].d[0] != prev_vecs[i].d[0] || m_v[i].d[1] != prev_vecs[i].d[1])
30413534            {
3042               fprintf(rsp->exec_output, "V%d: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X ", i,
3535               fprintf(m_exec_output, "V%d: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X ", i,
30433536               (UINT16)VREG_S(i,0), (UINT16)VREG_S(i,1), (UINT16)VREG_S(i,2), (UINT16)VREG_S(i,3), (UINT16)VREG_S(i,4), (UINT16)VREG_S(i,5), (UINT16)VREG_S(i,6), (UINT16)VREG_S(i,7));
30443537            }
3045            prev_vecs[i].d[0] = rsp->v[i].d[0];
3046            prev_vecs[i].d[1] = rsp->v[i].d[1];
3538            prev_vecs[i].d[0] = m_v[i].d[0];
3539            prev_vecs[i].d[1] = m_v[i].d[1];
30473540         }
30483541
3049         fprintf(rsp->exec_output, "\n");
3542         fprintf(m_exec_output, "\n");
30503543
30513544      }
30523545
3053      --rsp->icount;
3546      --m_rsp_state->icount;
30543547
3055      if( rsp->sr & RSP_STATUS_SSTEP )
3548      if( m_sr & RSP_STATUS_SSTEP )
30563549      {
3057         if( rsp->step_count )
3550         if( m_step_count )
30583551         {
3059            rsp->step_count--;
3552            m_step_count--;
30603553         }
30613554         else
30623555         {
3063            rsp->sr |= RSP_STATUS_BROKE;
3556            m_sr |= RSP_STATUS_BROKE;
30643557         }
30653558      }
30663559
3067      if( rsp->sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
3560      if( m_sr & ( RSP_STATUS_HALT | RSP_STATUS_BROKE ) )
30683561      {
3069         rsp->icount = MIN(rsp->icount, 0);
3562         m_rsp_state->icount = MIN(m_rsp_state->icount, 0);
30703563      }
30713564
30723565   }
30733566}
30743567
30753568
3076
3077
3078/*****************************************************************************/
3079
3080static CPU_SET_INFO( rsp )
3081{
3082   rsp_state *rsp = get_safe_token(device);
3083
3084   switch (state)
3085   {
3086      /* --- the following bits of info are set as 64-bit signed integers --- */
3087      case CPUINFO_INT_PC:
3088      case CPUINFO_INT_REGISTER + RSP_PC:             rsp->pc = info->i;        break;
3089      case CPUINFO_INT_REGISTER + RSP_R0:             rsp->r[0] = info->i;        break;
3090      case CPUINFO_INT_REGISTER + RSP_R1:             rsp->r[1] = info->i;        break;
3091      case CPUINFO_INT_REGISTER + RSP_R2:             rsp->r[2] = info->i;        break;
3092      case CPUINFO_INT_REGISTER + RSP_R3:             rsp->r[3] = info->i;        break;
3093      case CPUINFO_INT_REGISTER + RSP_R4:             rsp->r[4] = info->i;        break;
3094      case CPUINFO_INT_REGISTER + RSP_R5:             rsp->r[5] = info->i;        break;
3095      case CPUINFO_INT_REGISTER + RSP_R6:             rsp->r[6] = info->i;        break;
3096      case CPUINFO_INT_REGISTER + RSP_R7:             rsp->r[7] = info->i;        break;
3097      case CPUINFO_INT_REGISTER + RSP_R8:             rsp->r[8] = info->i;        break;
3098      case CPUINFO_INT_REGISTER + RSP_R9:             rsp->r[9] = info->i;        break;
3099      case CPUINFO_INT_REGISTER + RSP_R10:            rsp->r[10] = info->i;        break;
3100      case CPUINFO_INT_REGISTER + RSP_R11:            rsp->r[11] = info->i;        break;
3101      case CPUINFO_INT_REGISTER + RSP_R12:            rsp->r[12] = info->i;        break;
3102      case CPUINFO_INT_REGISTER + RSP_R13:            rsp->r[13] = info->i;        break;
3103      case CPUINFO_INT_REGISTER + RSP_R14:            rsp->r[14] = info->i;        break;
3104      case CPUINFO_INT_REGISTER + RSP_R15:            rsp->r[15] = info->i;        break;
3105      case CPUINFO_INT_REGISTER + RSP_R16:            rsp->r[16] = info->i;        break;
3106      case CPUINFO_INT_REGISTER + RSP_R17:            rsp->r[17] = info->i;        break;
3107      case CPUINFO_INT_REGISTER + RSP_R18:            rsp->r[18] = info->i;        break;
3108      case CPUINFO_INT_REGISTER + RSP_R19:            rsp->r[19] = info->i;        break;
3109      case CPUINFO_INT_REGISTER + RSP_R20:            rsp->r[20] = info->i;        break;
3110      case CPUINFO_INT_REGISTER + RSP_R21:            rsp->r[21] = info->i;        break;
3111      case CPUINFO_INT_REGISTER + RSP_R22:            rsp->r[22] = info->i;        break;
3112      case CPUINFO_INT_REGISTER + RSP_R23:            rsp->r[23] = info->i;        break;
3113      case CPUINFO_INT_REGISTER + RSP_R24:            rsp->r[24] = info->i;        break;
3114      case CPUINFO_INT_REGISTER + RSP_R25:            rsp->r[25] = info->i;        break;
3115      case CPUINFO_INT_REGISTER + RSP_R26:            rsp->r[26] = info->i;        break;
3116      case CPUINFO_INT_REGISTER + RSP_R27:            rsp->r[27] = info->i;        break;
3117      case CPUINFO_INT_REGISTER + RSP_R28:            rsp->r[28] = info->i;        break;
3118      case CPUINFO_INT_REGISTER + RSP_R29:            rsp->r[29] = info->i;        break;
3119      case CPUINFO_INT_REGISTER + RSP_R30:            rsp->r[30] = info->i;        break;
3120      case CPUINFO_INT_SP:
3121      case CPUINFO_INT_REGISTER + RSP_R31:            rsp->r[31] = info->i;        break;
3122      case CPUINFO_INT_REGISTER + RSP_SR:             rsp->sr = info->i;           break;
3123      case CPUINFO_INT_REGISTER + RSP_NEXTPC:         rsp->nextpc = info->i;       break;
3124      case CPUINFO_INT_REGISTER + RSP_STEPCNT:        rsp->step_count = info->i;   break;
3125   }
3126}
3127
3128CPU_GET_INFO( rsp_int )
3129{
3130   rsp_state *rsp = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
3131
3132   switch(state)
3133   {
3134      /* --- the following bits of info are returned as 64-bit signed integers --- */
3135      case CPUINFO_INT_CONTEXT_SIZE:                  info->i = sizeof(rsp_state);            break;
3136      case CPUINFO_INT_INPUT_LINES:                   info->i = 1;                            break;
3137      case CPUINFO_INT_DEFAULT_IRQ_VECTOR:            info->i = 0;                            break;
3138      case CPUINFO_INT_ENDIANNESS:                    info->i = ENDIANNESS_BIG;               break;
3139      case CPUINFO_INT_CLOCK_MULTIPLIER:              info->i = 1;                            break;
3140      case CPUINFO_INT_CLOCK_DIVIDER:                 info->i = 1;                            break;
3141      case CPUINFO_INT_MIN_INSTRUCTION_BYTES:         info->i = 4;                            break;
3142      case CPUINFO_INT_MAX_INSTRUCTION_BYTES:         info->i = 4;                            break;
3143      case CPUINFO_INT_MIN_CYCLES:                    info->i = 1;                            break;
3144      case CPUINFO_INT_MAX_CYCLES:                    info->i = 1;                            break;
3145
3146      case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 32;                   break;
3147      case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 32;                  break;
3148      case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0;                   break;
3149      case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;                    break;
3150      case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;                    break;
3151      case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;                    break;
3152      case CPUINFO_INT_DATABUS_WIDTH + AS_IO:     info->i = 0;                    break;
3153      case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO:     info->i = 0;                    break;
3154      case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO:     info->i = 0;                    break;
3155
3156      case CPUINFO_INT_INPUT_STATE:                   info->i = CLEAR_LINE;                   break;
3157
3158      case CPUINFO_INT_PREVIOUSPC:                    info->i = rsp->ppc;                     break;
3159
3160      case CPUINFO_INT_PC:    /* intentional fallthrough */
3161      case CPUINFO_INT_REGISTER + RSP_PC:             info->i = rsp->pc;                      break;
3162
3163      case CPUINFO_INT_REGISTER + RSP_R0:             info->i = rsp->r[0];                        break;
3164      case CPUINFO_INT_REGISTER + RSP_R1:             info->i = rsp->r[1];                        break;
3165      case CPUINFO_INT_REGISTER + RSP_R2:             info->i = rsp->r[2];                        break;
3166      case CPUINFO_INT_REGISTER + RSP_R3:             info->i = rsp->r[3];                        break;
3167      case CPUINFO_INT_REGISTER + RSP_R4:             info->i = rsp->r[4];                        break;
3168      case CPUINFO_INT_REGISTER + RSP_R5:             info->i = rsp->r[5];                        break;
3169      case CPUINFO_INT_REGISTER + RSP_R6:             info->i = rsp->r[6];                        break;
3170      case CPUINFO_INT_REGISTER + RSP_R7:             info->i = rsp->r[7];                        break;
3171      case CPUINFO_INT_REGISTER + RSP_R8:             info->i = rsp->r[8];                        break;
3172      case CPUINFO_INT_REGISTER + RSP_R9:             info->i = rsp->r[9];                        break;
3173      case CPUINFO_INT_REGISTER + RSP_R10:            info->i = rsp->r[10];                   break;
3174      case CPUINFO_INT_REGISTER + RSP_R11:            info->i = rsp->r[11];                   break;
3175      case CPUINFO_INT_REGISTER + RSP_R12:            info->i = rsp->r[12];                   break;
3176      case CPUINFO_INT_REGISTER + RSP_R13:            info->i = rsp->r[13];                   break;
3177      case CPUINFO_INT_REGISTER + RSP_R14:            info->i = rsp->r[14];                   break;
3178      case CPUINFO_INT_REGISTER + RSP_R15:            info->i = rsp->r[15];                   break;
3179      case CPUINFO_INT_REGISTER + RSP_R16:            info->i = rsp->r[16];                   break;
3180      case CPUINFO_INT_REGISTER + RSP_R17:            info->i = rsp->r[17];                   break;
3181      case CPUINFO_INT_REGISTER + RSP_R18:            info->i = rsp->r[18];                   break;
3182      case CPUINFO_INT_REGISTER + RSP_R19:            info->i = rsp->r[19];                   break;
3183      case CPUINFO_INT_REGISTER + RSP_R20:            info->i = rsp->r[20];                   break;
3184      case CPUINFO_INT_REGISTER + RSP_R21:            info->i = rsp->r[21];                   break;
3185      case CPUINFO_INT_REGISTER + RSP_R22:            info->i = rsp->r[22];                   break;
3186      case CPUINFO_INT_REGISTER + RSP_R23:            info->i = rsp->r[23];                   break;
3187      case CPUINFO_INT_REGISTER + RSP_R24:            info->i = rsp->r[24];                   break;
3188      case CPUINFO_INT_REGISTER + RSP_R25:            info->i = rsp->r[25];                   break;
3189      case CPUINFO_INT_REGISTER + RSP_R26:            info->i = rsp->r[26];                   break;
3190      case CPUINFO_INT_REGISTER + RSP_R27:            info->i = rsp->r[27];                   break;
3191      case CPUINFO_INT_REGISTER + RSP_R28:            info->i = rsp->r[28];                   break;
3192      case CPUINFO_INT_REGISTER + RSP_R29:            info->i = rsp->r[29];                   break;
3193      case CPUINFO_INT_REGISTER + RSP_R30:            info->i = rsp->r[30];                   break;
3194      case CPUINFO_INT_SP:
3195      case CPUINFO_INT_REGISTER + RSP_R31:            info->i = rsp->r[31];                   break;
3196      case CPUINFO_INT_REGISTER + RSP_SR:             info->i = rsp->sr;                       break;
3197      case CPUINFO_INT_REGISTER + RSP_NEXTPC:         info->i = rsp->nextpc;                   break;
3198      case CPUINFO_INT_REGISTER + RSP_STEPCNT:        info->i = rsp->step_count;               break;
3199
3200      /* --- the following bits of info are returned as pointers to data or functions --- */
3201      case CPUINFO_FCT_SET_INFO:                      info->setinfo = CPU_SET_INFO_NAME(rsp);         break;
3202      case CPUINFO_FCT_INIT:                          info->init = CPU_INIT_NAME(rsp);                    break;
3203      case CPUINFO_FCT_RESET:                         info->reset = CPU_RESET_NAME(rsp);              break;
3204      case CPUINFO_FCT_EXIT:                          info->exit = CPU_EXIT_NAME(rsp);                    break;
3205      case CPUINFO_FCT_EXECUTE:                       info->execute = CPU_EXECUTE_NAME(rsp);          break;
3206      case CPUINFO_FCT_BURN:                          info->burn = NULL;                      break;
3207      case CPUINFO_FCT_DISASSEMBLE:                   info->disassemble = CPU_DISASSEMBLE_NAME(rsp);          break;
3208      case CPUINFO_PTR_INSTRUCTION_COUNTER:           info->icount = &rsp->icount;                break;
3209
3210      /* --- the following bits of info are returned as NULL-terminated strings --- */
3211      case CPUINFO_STR_NAME:                          strcpy(info->s, "RSP");                 break;
3212      case CPUINFO_STR_SHORTNAME:                     strcpy(info->s, "rsp");                 break;
3213      case CPUINFO_STR_FAMILY:                    strcpy(info->s, "RSP");                 break;
3214      case CPUINFO_STR_VERSION:                   strcpy(info->s, "1.0");                 break;
3215      case CPUINFO_STR_SOURCE_FILE:                       strcpy(info->s, __FILE__);              break;
3216      case CPUINFO_STR_CREDITS:                   strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break;
3217
3218      case CPUINFO_STR_FLAGS:                         strcpy(info->s, " ");                   break;
3219
3220      case CPUINFO_STR_REGISTER + RSP_PC:             sprintf(info->s, "PC: %08X", rsp->pc);  break;
3221
3222      case CPUINFO_STR_REGISTER + RSP_R0:             sprintf(info->s, "R0: %08X", rsp->r[0]); break;
3223      case CPUINFO_STR_REGISTER + RSP_R1:             sprintf(info->s, "R1: %08X", rsp->r[1]); break;
3224      case CPUINFO_STR_REGISTER + RSP_R2:             sprintf(info->s, "R2: %08X", rsp->r[2]); break;
3225      case CPUINFO_STR_REGISTER + RSP_R3:             sprintf(info->s, "R3: %08X", rsp->r[3]); break;
3226      case CPUINFO_STR_REGISTER + RSP_R4:             sprintf(info->s, "R4: %08X", rsp->r[4]); break;
3227      case CPUINFO_STR_REGISTER + RSP_R5:             sprintf(info->s, "R5: %08X", rsp->r[5]); break;
3228      case CPUINFO_STR_REGISTER + RSP_R6:             sprintf(info->s, "R6: %08X", rsp->r[6]); break;
3229      case CPUINFO_STR_REGISTER + RSP_R7:             sprintf(info->s, "R7: %08X", rsp->r[7]); break;
3230      case CPUINFO_STR_REGISTER + RSP_R8:             sprintf(info->s, "R8: %08X", rsp->r[8]); break;
3231      case CPUINFO_STR_REGISTER + RSP_R9:             sprintf(info->s, "R9: %08X", rsp->r[9]); break;
3232      case CPUINFO_STR_REGISTER + RSP_R10:            sprintf(info->s, "R10: %08X", rsp->r[10]); break;
3233      case CPUINFO_STR_REGISTER + RSP_R11:            sprintf(info->s, "R11: %08X", rsp->r[11]); break;
3234      case CPUINFO_STR_REGISTER + RSP_R12:            sprintf(info->s, "R12: %08X", rsp->r[12]); break;
3235      case CPUINFO_STR_REGISTER + RSP_R13:            sprintf(info->s, "R13: %08X", rsp->r[13]); break;
3236      case CPUINFO_STR_REGISTER + RSP_R14:            sprintf(info->s, "R14: %08X", rsp->r[14]); break;
3237      case CPUINFO_STR_REGISTER + RSP_R15:            sprintf(info->s, "R15: %08X", rsp->r[15]); break;
3238      case CPUINFO_STR_REGISTER + RSP_R16:            sprintf(info->s, "R16: %08X", rsp->r[16]); break;
3239      case CPUINFO_STR_REGISTER + RSP_R17:            sprintf(info->s, "R17: %08X", rsp->r[17]); break;
3240      case CPUINFO_STR_REGISTER + RSP_R18:            sprintf(info->s, "R18: %08X", rsp->r[18]); break;
3241      case CPUINFO_STR_REGISTER + RSP_R19:            sprintf(info->s, "R19: %08X", rsp->r[19]); break;
3242      case CPUINFO_STR_REGISTER + RSP_R20:            sprintf(info->s, "R20: %08X", rsp->r[20]); break;
3243      case CPUINFO_STR_REGISTER + RSP_R21:            sprintf(info->s, "R21: %08X", rsp->r[21]); break;
3244      case CPUINFO_STR_REGISTER + RSP_R22:            sprintf(info->s, "R22: %08X", rsp->r[22]); break;
3245      case CPUINFO_STR_REGISTER + RSP_R23:            sprintf(info->s, "R23: %08X", rsp->r[23]); break;
3246      case CPUINFO_STR_REGISTER + RSP_R24:            sprintf(info->s, "R24: %08X", rsp->r[24]); break;
3247      case CPUINFO_STR_REGISTER + RSP_R25:            sprintf(info->s, "R25: %08X", rsp->r[25]); break;
3248      case CPUINFO_STR_REGISTER + RSP_R26:            sprintf(info->s, "R26: %08X", rsp->r[26]); break;
3249      case CPUINFO_STR_REGISTER + RSP_R27:            sprintf(info->s, "R27: %08X", rsp->r[27]); break;
3250      case CPUINFO_STR_REGISTER + RSP_R28:            sprintf(info->s, "R28: %08X", rsp->r[28]); break;
3251      case CPUINFO_STR_REGISTER + RSP_R29:            sprintf(info->s, "R29: %08X", rsp->r[29]); break;
3252      case CPUINFO_STR_REGISTER + RSP_R30:            sprintf(info->s, "R30: %08X", rsp->r[30]); break;
3253      case CPUINFO_STR_REGISTER + RSP_R31:            sprintf(info->s, "R31: %08X", rsp->r[31]); break;
3254      case CPUINFO_STR_REGISTER + RSP_SR:             sprintf(info->s, "SR: %08X",  rsp->sr);    break;
3255      case CPUINFO_STR_REGISTER + RSP_NEXTPC:         sprintf(info->s, "NPC: %08X", rsp->nextpc);break;
3256      case CPUINFO_STR_REGISTER + RSP_STEPCNT:        sprintf(info->s, "STEP: %d",  rsp->step_count);  break;
3257   }
3258}
3259
3260rsp_cpu_device::rsp_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, cpu_get_info_func get_info)
3261   : legacy_cpu_device(mconfig, type, tag, owner, clock, get_info),
3262      dp_reg_r_func(*this),
3263      dp_reg_w_func(*this),
3264      sp_reg_r_func(*this),
3265      sp_reg_w_func(*this),
3266      sp_set_status_func(*this)
3267{
3268}
3269
3270rsp_int_device::rsp_int_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock)
3271   : rsp_cpu_device(mconfig, type, tag, owner, clock, CPU_GET_INFO_NAME(rsp_int))
3272{
3273}
3274
3275const device_type RSP_INT = &legacy_device_creator<rsp_drc_device>;
3276
3277const device_type RSP = &legacy_device_creator_drc<rsp_int_device, rsp_drc_device>;
trunk/src/emu/cpu/rsp/rspfe.h
r31833r31834
3636{
3737public:
3838   // construction/destruction
39   rsp_frontend(rsp_state &state, UINT32 window_start, UINT32 window_end, UINT32 max_sequence);
39   rsp_frontend(rsp_device &rsp, UINT32 window_start, UINT32 window_end, UINT32 max_sequence);
4040
4141protected:
4242   // required overrides
r31833r31834
5050   bool describe_cop2(UINT32 op, opcode_desc &desc);
5151
5252   // internal state
53   rsp_state &m_context;
53   rsp_device &m_rsp;
5454};
5555
5656
trunk/src/emu/cpu/rsp/rsp.h
r31833r31834
1616#ifndef __RSP_H__
1717#define __RSP_H__
1818
19
20#include "cpu/drcfe.h"
21#include "cpu/drcuml.h"
22
1923#define USE_SIMD        (0)
2024#define SIMUL_SIMD      (0)
25#define RSP_LOG_UML     (0)
26#define RSP_LOG_NATIVE  (0)
2127
2228#if USE_SIMD
2329#include <tmmintrin.h>
r31833r31834
7278};
7379
7480/***************************************************************************
75    PUBLIC FUNCTIONS
76***************************************************************************/
77
78void rspdrc_flush_drc_cache(device_t *device);
79void rspdrc_set_options(device_t *device, UINT32 options);
80void rspdrc_add_dmem(device_t *device, UINT32 *base);
81void rspdrc_add_imem(device_t *device, UINT32 *base);
82
83/***************************************************************************
8481    HELPER MACROS
8582***************************************************************************/
8683
r31833r31834
9289#define RDREG           ((op >> 11) & 31)
9390#define SHIFT           ((op >> 6) & 31)
9491
95#define RSVAL           (rsp->r[RSREG])
96#define RTVAL           (rsp->r[RTREG])
97#define RDVAL           (rsp->r[RDREG])
92#define RSVAL           (m_rsp_state->r[RSREG])
93#define RTVAL           (m_rsp_state->r[RTREG])
94#define RDVAL           (m_rsp_state->r[RDREG])
9895
9996#define FRREG           ((op >> 21) & 31)
10097#define FTREG           ((op >> 16) & 31)
r31833r31834
144141};
145142
146143#define MCFG_RSP_DP_REG_R_CB(_devcb) \
147   devcb = &rsp_cpu_device::static_set_dp_reg_r_callback(*device, DEVCB_##_devcb);
144   devcb = &rsp_device::static_set_dp_reg_r_callback(*device, DEVCB_##_devcb);
148145
149146#define MCFG_RSP_DP_REG_W_CB(_devcb) \
150   devcb = &rsp_cpu_device::static_set_dp_reg_w_callback(*device, DEVCB_##_devcb);
147   devcb = &rsp_device::static_set_dp_reg_w_callback(*device, DEVCB_##_devcb);
151148
152149#define MCFG_RSP_SP_REG_R_CB(_devcb) \
153   devcb = &rsp_cpu_device::static_set_sp_reg_r_callback(*device, DEVCB_##_devcb);
150   devcb = &rsp_device::static_set_sp_reg_r_callback(*device, DEVCB_##_devcb);
154151
155152#define MCFG_RSP_SP_REG_W_CB(_devcb) \
156   devcb = &rsp_cpu_device::static_set_sp_reg_w_callback(*device, DEVCB_##_devcb);
153   devcb = &rsp_device::static_set_sp_reg_w_callback(*device, DEVCB_##_devcb);
157154
158155#define MCFG_RSP_SP_SET_STATUS_CB(_devcb) \
159   devcb = &rsp_cpu_device::static_set_status_callback(*device, DEVCB_##_devcb);
156   devcb = &rsp_device::static_set_status_callback(*device, DEVCB_##_devcb);
160157
161class rsp_cpu_device : public legacy_cpu_device
158
159class rsp_frontend;
160
161class rsp_device : public cpu_device
162162{
163protected:
163   friend class rsp_frontend;
164
165public:
164166   // construction/destruction
165   rsp_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, cpu_get_info_func info);
167   rsp_device(const machine_config &mconfig, const char *_tag, device_t *_owner, UINT32 _clock);
166168
167public:
168169   void resolve_cb();
169   template<class _Object> static devcb_base &static_set_dp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).dp_reg_r_func.set_callback(object); }
170   template<class _Object> static devcb_base &static_set_dp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).dp_reg_w_func.set_callback(object); }
171   template<class _Object> static devcb_base &static_set_sp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_reg_r_func.set_callback(object); }
172   template<class _Object> static devcb_base &static_set_sp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_reg_w_func.set_callback(object); }
173   template<class _Object> static devcb_base &static_set_status_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_set_status_func.set_callback(object); }
170   template<class _Object> static devcb_base &static_set_dp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_device &>(device).m_dp_reg_r_func.set_callback(object); }
171   template<class _Object> static devcb_base &static_set_dp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_device &>(device).m_dp_reg_w_func.set_callback(object); }
172   template<class _Object> static devcb_base &static_set_sp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_device &>(device).m_sp_reg_r_func.set_callback(object); }
173   template<class _Object> static devcb_base &static_set_sp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_device &>(device).m_sp_reg_w_func.set_callback(object); }
174   template<class _Object> static devcb_base &static_set_status_callback(device_t &device, _Object object) { return downcast<rsp_device &>(device).m_sp_set_status_func.set_callback(object); }
174175
176   void rspdrc_flush_drc_cache();
177   void rspdrc_set_options(UINT32 options);
178   void rspdrc_add_dmem(UINT32 *base);
179   void rspdrc_add_imem(UINT32 *base);
175180
176   devcb_read32 dp_reg_r_func;
177   devcb_write32 dp_reg_w_func;
178   devcb_read32 sp_reg_r_func;
179   devcb_write32 sp_reg_w_func;
180   devcb_write32 sp_set_status_func;
181};
181   void ccfunc_read8();
182   void ccfunc_read16();
183   void ccfunc_read32();
184   void ccfunc_write8();
185   void ccfunc_write16();
186   void ccfunc_write32();
187   void ccfunc_get_cop0_reg();
188   void ccfunc_set_cop0_reg();
189   void ccfunc_unimplemented_opcode();
190   void ccfunc_sp_set_status_cb();
191   void ccfunc_unimplemented();
192#if USE_SIMD
193   void ccfunc_rsp_lbv_simd();
194   void ccfunc_rsp_lsv_simd();
195   void ccfunc_rsp_llv_simd();
196   void ccfunc_rsp_ldv_simd();
197   void ccfunc_rsp_lqv_simd();
198   void ccfunc_rsp_lrv_simd();
199   void ccfunc_rsp_lpv_simd();
200   void ccfunc_rsp_luv_simd();
201   void ccfunc_rsp_lhv_simd();
202   void ccfunc_rsp_lfv_simd();
203   void ccfunc_rsp_lwv_simd();
204   void ccfunc_rsp_ltv_simd();
205   void ccfunc_rsp_sbv_simd();
206   void ccfunc_rsp_ssv_simd();
207   void ccfunc_rsp_slv_simd();
208   void ccfunc_rsp_sdv_simd();
209   void ccfunc_rsp_sqv_simd();
210   void ccfunc_rsp_srv_simd();
211   void ccfunc_rsp_spv_simd();
212   void ccfunc_rsp_suv_simd();
213   void ccfunc_rsp_shv_simd();
214   void ccfunc_rsp_sfv_simd();
215   void ccfunc_rsp_swv_simd();
216   void ccfunc_rsp_stv_simd();
217   void ccfunc_rsp_vmulf_simd();
218   void ccfunc_rsp_vmulu_simd();
219   void ccfunc_rsp_vmudl_simd();
220   void ccfunc_rsp_vmudm_simd();
221   void ccfunc_rsp_vmudn_simd();
222   void ccfunc_rsp_vmudh_simd();
223   void ccfunc_rsp_vmacf_simd();
224   void ccfunc_rsp_vmacu_simd();
225   void ccfunc_rsp_vmadl_simd();
226   void ccfunc_rsp_vmadm_simd();
227   void ccfunc_rsp_vmadn_simd();
228   void ccfunc_rsp_vmadh_simd();
229   void ccfunc_rsp_vadd_simd();
230   void ccfunc_rsp_vsub_simd();
231   void ccfunc_rsp_vabs_simd();
232   void ccfunc_rsp_vaddc_simd();
233   void ccfunc_rsp_vsubc_simd();
234   void ccfunc_rsp_vsaw_simd();
235   void ccfunc_rsp_vlt_simd();
236   void ccfunc_rsp_veq_simd();
237   void ccfunc_rsp_vne_simd();
238   void ccfunc_rsp_vge_simd();
239   void ccfunc_rsp_vcl_simd();
240   void ccfunc_rsp_vch_simd();
241   void ccfunc_rsp_vcr_simd();
242   void ccfunc_rsp_vmrg_simd();
243   void ccfunc_rsp_vand_simd();
244   void ccfunc_rsp_vnand_simd();
245   void ccfunc_rsp_vor_simd();
246   void ccfunc_rsp_vnor_simd();
247   void ccfunc_rsp_vxor_simd();
248   void ccfunc_rsp_vnxor_simd();
249   void ccfunc_rsp_vrcp_simd();
250   void ccfunc_rsp_vrcpl_simd();
251   void ccfunc_rsp_vrcph_simd();
252   void ccfunc_rsp_vmov_simd();
253   void ccfunc_rsp_vrsql_simd();
254   void ccfunc_rsp_vrsqh_simd();
255   void ccfunc_mfc2_simd();
256   void ccfunc_cfc2_simd();
257   void ccfunc_mtc2_simd();
258   void ccfunc_ctc2_simd();
259#endif
260#if (!USE_SIMD || SIMUL_SIMD)
261   void ccfunc_rsp_lbv_scalar();
262   void ccfunc_rsp_lsv_scalar();
263   void ccfunc_rsp_llv_scalar();
264   void ccfunc_rsp_ldv_scalar();
265   void ccfunc_rsp_lqv_scalar();
266   void ccfunc_rsp_lrv_scalar();
267   void ccfunc_rsp_lpv_scalar();
268   void ccfunc_rsp_luv_scalar();
269   void ccfunc_rsp_lhv_scalar();
270   void ccfunc_rsp_lfv_scalar();
271   void ccfunc_rsp_lwv_scalar();
272   void ccfunc_rsp_ltv_scalar();
273   void ccfunc_rsp_sbv_scalar();
274   void ccfunc_rsp_ssv_scalar();
275   void ccfunc_rsp_slv_scalar();
276   void ccfunc_rsp_sdv_scalar();
277   void ccfunc_rsp_sqv_scalar();
278   void ccfunc_rsp_srv_scalar();
279   void ccfunc_rsp_spv_scalar();
280   void ccfunc_rsp_suv_scalar();
281   void ccfunc_rsp_shv_scalar();
282   void ccfunc_rsp_sfv_scalar();
283   void ccfunc_rsp_swv_scalar();
284   void ccfunc_rsp_stv_scalar();
285   void ccfunc_rsp_vmulf_scalar();
286   void ccfunc_rsp_vmulu_scalar();
287   void ccfunc_rsp_vmudl_scalar();
288   void ccfunc_rsp_vmudm_scalar();
289   void ccfunc_rsp_vmudn_scalar();
290   void ccfunc_rsp_vmudh_scalar();
291   void ccfunc_rsp_vmacf_scalar();
292   void ccfunc_rsp_vmacu_scalar();
293   void ccfunc_rsp_vmadl_scalar();
294   void ccfunc_rsp_vmadm_scalar();
295   void ccfunc_rsp_vmadn_scalar();
296   void ccfunc_rsp_vmadh_scalar();
297   void ccfunc_rsp_vadd_scalar();
298   void ccfunc_rsp_vsub_scalar();
299   void ccfunc_rsp_vabs_scalar();
300   void ccfunc_rsp_vaddc_scalar();
301   void ccfunc_rsp_vsubc_scalar();
302   void ccfunc_rsp_vsaw_scalar();
303   void ccfunc_rsp_vlt_scalar();
304   void ccfunc_rsp_veq_scalar();
305   void ccfunc_rsp_vne_scalar();
306   void ccfunc_rsp_vge_scalar();
307   void ccfunc_rsp_vcl_scalar();
308   void ccfunc_rsp_vch_scalar();
309   void ccfunc_rsp_vcr_scalar();
310   void ccfunc_rsp_vmrg_scalar();
311   void ccfunc_rsp_vand_scalar();
312   void ccfunc_rsp_vnand_scalar();
313   void ccfunc_rsp_vor_scalar();
314   void ccfunc_rsp_vnor_scalar();
315   void ccfunc_rsp_vxor_scalar();
316   void ccfunc_rsp_vnxor_scalar();
317   void ccfunc_rsp_vrcp_scalar();
318   void ccfunc_rsp_vrcpl_scalar();
319   void ccfunc_rsp_vrcph_scalar();
320   void ccfunc_rsp_vmov_scalar();
321   void ccfunc_rsp_vrsql_scalar();
322   void ccfunc_rsp_vrsqh_scalar();
323   void ccfunc_mfc2_scalar();
324   void ccfunc_cfc2_scalar();
325   void ccfunc_mtc2_scalar();
326   void ccfunc_ctc2_scalar();
327#endif
328#if USE_SIMD && SIMUL_SIMD
329   void ccfunc_backup_regs();
330   void ccfunc_restore_regs();
331   void ccfunc_verify_regs();
332#endif
182333
334protected:
335   // device-level overrides
336   virtual void device_start();
337   virtual void device_reset();
338   virtual void device_stop();
183339
184struct rspimp_state;
185struct rsp_state
186{
187   FILE *exec_output;
340   // device_execute_interface overrides
341   virtual UINT32 execute_min_cycles() const { return 1; }
342   virtual UINT32 execute_max_cycles() const { return 1; }
343   virtual UINT32 execute_input_lines() const { return 1; }
344   virtual UINT32 execute_default_irq_vector() const { return 0; }
345   virtual void execute_run();
346   virtual void execute_set_input(int inputnum, int state) { }
188347
189   UINT32 pc;
190   UINT32 r[35];
191   VECTOR_REG v[32];
192   UINT16 vflag[6][8];
348   // device_memory_interface overrides
349   virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; }
193350
351   // device_state_interface overrides
352   virtual void state_import(const device_state_entry &entry);
353   virtual void state_export(const device_state_entry &entry);
354   void state_string_export(const device_state_entry &entry, astring &string);
355
356   // device_disasm_interface overrides
357   virtual UINT32 disasm_min_opcode_bytes() const { return 4; }
358   virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
359   virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
360
361private:
362   address_space_config m_program_config;
363
364   /* fast RAM info */
365   struct fast_ram_info
366   {
367      offs_t              start;                      /* start of the RAM block */
368      offs_t              end;                        /* end of the RAM block */
369      UINT8               readonly;                   /* TRUE if read-only */
370      void *              base;                       /* base in memory where the RAM lives */
371   };
372
373
374   /* internal compiler state */
375   struct compiler_state
376   {
377      UINT32              cycles;                   /* accumulated cycles */
378      UINT8               checkints;                /* need to check interrupts before next instruction */
379      UINT8               checksoftints;            /* need to check software interrupts before next instruction */
380      uml::code_label     labelnum;                 /* index for local labels */
381   };
382
383
384   /* core state */
385   drc_cache           m_cache;                      /* pointer to the DRC code cache */
386   drcuml_state *      m_drcuml;                     /* DRC UML generator state */
387   rsp_frontend *      m_drcfe;                      /* pointer to the DRC front-end state */
388   UINT32              m_drcoptions;                 /* configurable DRC options */
389
390   /* internal stuff */
391   UINT8               m_cache_dirty;                /* true if we need to flush the cache */
392
393   /* parameters for subroutines */
394   UINT64              m_numcycles;                  /* return value from gettotalcycles */
395   const char *        m_format;                     /* format string for print_debug */
396   UINT32              m_arg2;                       /* print_debug argument 3 */
397   UINT32              m_arg3;                       /* print_debug argument 4 */
398   UINT32              m_vres[8];                    /* used for temporary vector results */
399
400   /* register mappings */
401   uml::parameter   m_regmap[34];                 /* parameter to register mappings for all 32 integer registers */
402
403   /* subroutines */
404   uml::code_handle *   m_entry;                      /* entry point */
405   uml::code_handle *   m_nocode;                     /* nocode exception handler */
406   uml::code_handle *   m_out_of_cycles;              /* out of cycles exception handler */
407   uml::code_handle *   m_read8;                      /* read byte */
408   uml::code_handle *   m_write8;                     /* write byte */
409   uml::code_handle *   m_read16;                     /* read half */
410   uml::code_handle *   m_write16;                    /* write half */
411   uml::code_handle *   m_read32;                     /* read word */
412   uml::code_handle *   m_write32;                    /* write word */
413
414   struct internal_rsp_state
415   {
416      UINT32 pc;
417      UINT32 r[35];
418      UINT32 arg0;
419      UINT32 arg1;
420      UINT32 jmpdest;
421      int icount;
422   };
423
424   internal_rsp_state *m_rsp_state;
425
426   FILE *m_exec_output;
427
428   VECTOR_REG m_v[32];
429   UINT16 m_vflag[6][8];
430
194431#if SIMUL_SIMD
195   UINT32 old_r[35];
196   UINT8 old_dmem[4096];
432   UINT32 m_old_r[35];
433   UINT8 m_old_dmem[4096];
197434
198   UINT32 scalar_r[35];
199   UINT8 scalar_dmem[4096];
435   UINT32 m_scalar_r[35];
436   UINT8 m_scalar_dmem[4096];
200437
201   INT32 old_reciprocal_res;
202   UINT32 old_reciprocal_high;
203   INT32 old_dp_allowed;
438   INT32 m_old_reciprocal_res;
439   UINT32 m_old_reciprocal_high;
440   INT32 m_old_dp_allowed;
204441
205   INT32 scalar_reciprocal_res;
206   UINT32 scalar_reciprocal_high;
207   INT32 scalar_dp_allowed;
442   INT32 m_scalar_reciprocal_res;
443   UINT32 m_scalar_reciprocal_high;
444   INT32 m_scalar_dp_allowed;
208445
209   INT32 simd_reciprocal_res;
210   UINT32 simd_reciprocal_high;
211   INT32 simd_dp_allowed;
446   INT32 m_simd_reciprocal_res;
447   UINT32 m_simd_reciprocal_high;
448   INT32 m_simd_dp_allowed;
212449#endif
213450
214451#if USE_SIMD
215452   // Mirror of v[] for now, to be used in parallel as
216453   // more vector ops are transitioned over
217   __m128i xv[32];
218   __m128i xvflag[6];
454   __m128i m_xv[32];
455   __m128i m_xvflag[6];
219456#endif
220   UINT32 sr;
221   UINT32 step_count;
457   UINT32 m_sr;
458   UINT32 m_step_count;
222459
223   ACCUMULATOR_REG accum[8];
460   ACCUMULATOR_REG m_accum[8];
224461#if USE_SIMD
225   __m128i accum_h;
226   __m128i accum_m;
227   __m128i accum_l;
228   __m128i accum_ll;
462   __m128i m_accum_h;
463   __m128i m_accum_m;
464   __m128i m_accum_l;
465   __m128i m_accum_ll;
229466#endif
230   INT32 reciprocal_res;
231   UINT32 reciprocal_high;
232   INT32 dp_allowed;
467   INT32 m_reciprocal_res;
468   UINT32 m_reciprocal_high;
469   INT32 m_dp_allowed;
233470
234   UINT32 ppc;
235   UINT32 nextpc;
471   UINT32 m_ppc;
472   UINT32 m_nextpc;
236473
237   device_irq_acknowledge_delegate irq_callback;
238   rsp_cpu_device *device;
239   address_space *program;
240   direct_read_data *direct;
241   int icount;
474   address_space *m_program;
475protected:
476   direct_read_data *m_direct;
242477
243   UINT32 *dmem32;
244   UINT16 *dmem16;
245   UINT8 *dmem8;
478private:
479   UINT32 *m_dmem32;
480   UINT16 *m_dmem16;
481   UINT8 *m_dmem8;
246482
247   UINT32 *imem32;
248   UINT16 *imem16;
249   UINT8 *imem8;
483   UINT32 *m_imem32;
484   UINT16 *m_imem16;
485   UINT8 *m_imem8;
250486
251   rspimp_state* impstate;
252};
487   UINT32 m_debugger_temp;
488   bool m_isdrc;
253489
254CPU_GET_INFO( rsp_int );
490   devcb_read32 m_dp_reg_r_func;
491   devcb_write32 m_dp_reg_w_func;
492   devcb_read32 m_sp_reg_r_func;
493   devcb_write32 m_sp_reg_w_func;
494   devcb_write32 m_sp_set_status_func;
255495
256class rsp_int_device : public rsp_cpu_device
257{
258public:
259   rsp_int_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock);
496   UINT8 READ8(UINT32 address);
497   UINT16 READ16(UINT32 address);
498   UINT32 READ32(UINT32 address);
499   void WRITE8(UINT32 address, UINT8 data);
500   void WRITE16(UINT32 address, UINT16 data);
501   void WRITE32(UINT32 address, UINT32 data);
502   UINT32 get_cop0_reg(int reg);
503   void set_cop0_reg(int reg, UINT32 data);
504   void unimplemented_opcode(UINT32 op);
505   void handle_lwc2(UINT32 op);
506   void handle_swc2(UINT32 op);
507   UINT16 SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive);
508   UINT16 SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive);
509   void handle_vector_ops(UINT32 op);
510#if USE_SIMD
511   UINT16 VEC_ACCUM_H(int x);
512   UINT16 VEC_ACCUM_M(int x);
513   UINT16 VEC_ACCUM_L(int x);
514   UINT16 VEC_ACCUM_LL(int x);
515   UINT16 VEC_CARRY_FLAG(const int x);
516   UINT16 VEC_COMPARE_FLAG(const int x);
517   UINT16 VEC_CLIP1_FLAG(const int x);
518   UINT16 VEC_ZERO_FLAG(const int x);
519   UINT16 VEC_CLIP2_FLAG(const int x);
520   UINT16 VEC_SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive);
521#endif
522   void load_fast_iregs(drcuml_block *block);
523   void save_fast_iregs(drcuml_block *block);
524   UINT8 DM_READ8(UINT32 address);
525   UINT16 DM_READ16(UINT32 address);
526   UINT32 DM_READ32(UINT32 address);
527   void DM_WRITE8(UINT32 address, UINT8 data);
528   void DM_WRITE16(UINT32 address, UINT16 data);
529   void DM_WRITE32(UINT32 address, UINT32 data);
530   void rspcom_init();
531   int generate_lwc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
532   int generate_swc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
533   void execute_run_drc();
534   void code_flush_cache();
535   void code_compile_block(offs_t pc);
536   void static_generate_entry_point();
537   void static_generate_nocode_handler();
538   void static_generate_out_of_cycles();
539   void static_generate_memory_accessor(int size, int iswrite, const char *name, uml::code_handle *&handleptr);
540   void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, int allow_exception);
541   void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast);
542   void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
543   void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg);
544   int generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
545   int generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
546   int generate_special(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
547   int generate_regimm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
548   int generate_cop2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
549   int generate_cop0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
550   void log_add_disasm_comment(drcuml_block *block, UINT32 pc, UINT32 op);
260551};
261552
262extern const device_type RSP_INT;
263553
264CPU_GET_INFO( rsp_drc );
265
266class rsp_drc_device : public rsp_cpu_device
267{
268public:
269   rsp_drc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock);
270};
271
272extern const device_type RSP_DRC;
273
274554extern const device_type RSP;
275555
276extern offs_t rsp_dasm_one(char *buffer, offs_t pc, UINT32 op);
277556
278557#endif /* __RSP_H__ */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team