summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/rsp/rspcp2.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/rsp/rspcp2.h')
-rw-r--r--src/devices/cpu/rsp/rspcp2.h395
1 files changed, 0 insertions, 395 deletions
diff --git a/src/devices/cpu/rsp/rspcp2.h b/src/devices/cpu/rsp/rspcp2.h
deleted file mode 100644
index 7e374e71ae3..00000000000
--- a/src/devices/cpu/rsp/rspcp2.h
+++ /dev/null
@@ -1,395 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Ryan Holtz,Tyler J. Stachecki
-/***************************************************************************
-
- rspcp2.h
-
- Interface file for Reality Signal Processor (RSP) vector extensions.
-
-***************************************************************************/
-#ifndef MAME_CPU_RSP_RSPCP2_H
-#define MAME_CPU_RSP_RSPCP2_H
-
-#pragma once
-
-#include "rsp.h"
-#include "rspdiv.h"
-#include "cpu/drcuml.h"
-
-#define SIMD_OFF (1)
-
-#if (defined(__SSE2__) || defined(__SSE3__) || defined(__SSSE3__) || defined(__SSE4_1__) || defined(__SSE4_2__))
-#define SSE_AVAILABLE (1)
-#else
-#define SSE_AVAILABLE (0)
-#endif
-
-#if (SSE_AVAILABLE || defined(_MSC_VER)) && defined(PTR64) && !SIMD_OFF
-#define USE_SIMD (1)
-#else
-#define USE_SIMD (0)
-#endif
-
-#if USE_SIMD
-
-#ifdef _MSC_VER
-#define __align16 __declspec(align(16))
-#else
-#define __align16 __attribute__((aligned(16)))
-#endif
-
-#if (defined(__SSE4_2__) || defined(_MSC_VER))
-#include <nmmintrin.h>
-#elif (defined(__SSE4_1__) || defined(_MSC_VER))
-#include <smmintrin.h>
-#elif (defined(__SSSE3__) || defined(_MSC_VER))
-#include <tmmintrin.h>
-#elif (defined(__SSE3__ ) || defined(_MSC_VER))
-#include <pmmintrin.h>
-#else
-#include <emmintrin.h>
-#endif
-
-typedef __m128i rsp_vec_t;
-#endif
-
-union VECTOR_REG
-{
- uint64_t d[2];
- uint32_t l[4];
- uint16_t s[8];
- uint8_t b[16];
-#if USE_SIMD
- rsp_vec_t v;
-#endif
-};
-
-union ACCUMULATOR_REG
-{
- uint64_t q;
- uint32_t l[2];
- uint16_t w[4];
-};
-
-struct compiler_state;
-
-class rsp_device::cop2
-{
- friend class rsp_device;
-
-public:
- cop2(rsp_device &rsp, running_machine &machine);
-
-protected:
- virtual void init();
- virtual void start();
-
- virtual bool generate_cop2(drcuml_block &block, rsp_device::compiler_state &compiler, const opcode_desc *desc) { return true; }
- virtual bool generate_lwc2(drcuml_block &block, rsp_device::compiler_state &compiler, const opcode_desc *desc) { return true; }
- virtual bool generate_swc2(drcuml_block &block, rsp_device::compiler_state &compiler, const opcode_desc *desc) { return true; }
-
- virtual void state_string_export(const int index, std::string &str) const;
-
-public:
- virtual ~cop2();
-
- virtual void lbv() { }
- virtual void lsv() { }
- virtual void llv() { }
- virtual void ldv() { }
- virtual void lqv() { }
- virtual void lrv() { }
- virtual void lpv() { }
- virtual void luv() { }
- virtual void lhv() { }
- virtual void lfv() { }
- virtual void lwv() { }
- virtual void ltv() { }
- virtual void sbv() { }
- virtual void ssv() { }
- virtual void slv() { }
- virtual void sdv() { }
- virtual void sqv() { }
- virtual void srv() { }
- virtual void spv() { }
- virtual void suv() { }
- virtual void shv() { }
- virtual void sfv() { }
- virtual void swv() { }
- virtual void stv() { }
- virtual void vmulf() { }
- virtual void vmulu() { }
- virtual void vmudl() { }
- virtual void vmudm() { }
- virtual void vmudn() { }
- virtual void vmudh() { }
- virtual void vmacf() { }
- virtual void vmacu() { }
- virtual void vmadl() { }
- virtual void vmadm() { }
- virtual void vmadn() { }
- virtual void vmadh() { }
- virtual void vadd() { }
- virtual void vsub() { }
- virtual void vabs() { }
- virtual void vaddc() { }
- virtual void vsubc() { }
- virtual void vaddb() { }
- virtual void vsaw() { }
- virtual void vlt() { }
- virtual void veq() { }
- virtual void vne() { }
- virtual void vge() { }
- virtual void vcl() { }
- virtual void vch() { }
- virtual void vcr() { }
- virtual void vmrg() { }
- virtual void vand() { }
- virtual void vnand() { }
- virtual void vor() { }
- virtual void vnor() { }
- virtual void vxor() { }
- virtual void vnxor() { }
- virtual void vrcp() { }
- virtual void vrcpl() { }
- virtual void vrcph() { }
- virtual void vmov() { }
- virtual void vrsql() { }
- virtual void vrsqh() { }
- virtual void vrsq() { }
- virtual void mfc2();
- virtual void cfc2();
- virtual void mtc2();
- virtual void ctc2();
-
- virtual void handle_cop2(uint32_t op);
-
- void log_instruction_execution();
- virtual void cfunc_unimplemented_opcode() { }
-
- void dump(uint32_t op);
- void dump_dmem();
-
-protected:
- virtual bool generate_vector_opcode(drcuml_block &block, rsp_device::compiler_state &compiler, const opcode_desc *desc) { return true; }
-
- uint16_t SATURATE_ACCUM(int accum, int slice, uint16_t negative, uint16_t positive);
-
- // Data that needs to be stored close to the generated DRC code
- struct internal_rspcop2_state
- {
- uint32_t op;
- };
-
- internal_rspcop2_state *m_rspcop2_state;
- rsp_device& m_rsp;
- running_machine& m_machine;
- uint32_t m_vres[8]; /* used for temporary vector results */
-
-#if USE_SIMD
- __align16 VECTOR_REG m_v[32];
-#else
- VECTOR_REG m_v[32];
-#endif
- ACCUMULATOR_REG m_accum[8];
- uint16_t m_vflag[6][8];
-
- int32_t m_reciprocal_res;
- uint32_t m_reciprocal_high;
- int32_t m_dp_allowed;
-
-#if USE_SIMD
- enum rsp_flags_t {
- RSP_VCO = 0,
- RSP_VCC = 1,
- RSP_VCE = 2
- };
-
- enum rsp_acc_t {
- RSP_ACC_LO = 16,
- RSP_ACC_MD = 8,
- RSP_ACC_HI = 0,
- };
-
- enum rsp_mem_request_type {
- RSP_MEM_REQUEST_NONE,
- RSP_MEM_REQUEST_INT_MEM,
- RSP_MEM_REQUEST_VECTOR,
- RSP_MEM_REQUEST_FOURTH,
- RSP_MEM_REQUEST_HALF,
- RSP_MEM_REQUEST_PACK,
- RSP_MEM_REQUEST_QUAD,
- RSP_MEM_REQUEST_REST,
- RSP_MEM_REQUEST_UPACK
- };
-
- union aligned_rsp_1vect_t {
- rsp_vec_t __align;
- uint16_t s[8];
- };
-
- union aligned_rsp_2vect_t {
- rsp_vec_t __align[2];
- uint16_t s[16];
- };
-
- union aligned_rsp_3vect_t {
- rsp_vec_t __align[3];
- uint16_t s[24];
- };
-
- __align16 aligned_rsp_1vect_t m_vdqm;
- __align16 aligned_rsp_2vect_t m_flags[3];
- __align16 aligned_rsp_3vect_t m_acc;
- uint32_t m_dp_flag;
-
- typedef struct
- {
- rsp_vec_t dummy_for_alignment;
- const uint16_t logic_mask[2][8];
- const uint16_t vrsq_mask_table[8][8];
- const uint16_t shuffle_keys[16][8];
- const uint16_t sll_b2l_keys[16][8];
- const uint16_t sll_l2b_keys[16][8];
- const uint16_t srl_b2l_keys[16][8];
- const uint16_t ror_b2l_keys[16][8];
- const uint16_t rol_l2b_keys[16][8];
- const uint16_t ror_l2b_keys[16][8];
- const uint16_t qr_lut[16][8];
- const uint16_t bdls_lut[4][4];
- const uint16_t word_reverse[8];
- } vec_helpers_t;
-
- static const vec_helpers_t m_vec_helpers;
-
- rsp_vec_t vec_load_and_shuffle_operand(const uint16_t* src, uint32_t element);
- static inline uint32_t sign_extend_6(int32_t i) {
- return ((i << (32 - 7)) >> (32 - 7)) & 0xfff;
- }
- static inline rsp_vec_t vec_load_unshuffled_operand(const void* src)
- {
- return _mm_load_si128((rsp_vec_t*) src);
- }
- static inline void vec_write_operand(uint16_t* dest, rsp_vec_t src)
- {
- _mm_store_si128((rsp_vec_t*) dest, src);
- }
- static inline rsp_vec_t read_acc_lo(const uint16_t* acc)
- {
- return vec_load_unshuffled_operand(acc + sizeof(rsp_vec_t));
- }
- static inline rsp_vec_t read_acc_mid(const uint16_t* acc)
- {
- return vec_load_unshuffled_operand(acc + (sizeof(rsp_vec_t) >> 1));
- }
- static inline rsp_vec_t read_acc_hi(const void* acc)
- {
- return vec_load_unshuffled_operand(acc);
- }
- static inline rsp_vec_t read_vcc_lo(const uint16_t *vcc)
- {
- return vec_load_unshuffled_operand(vcc + (sizeof(rsp_vec_t) >> 1));
- }
- static inline rsp_vec_t read_vcc_hi(const uint16_t *vcc)
- {
- return vec_load_unshuffled_operand(vcc);
- }
- static inline rsp_vec_t read_vco_lo(const uint16_t *vco)
- {
- return vec_load_unshuffled_operand(vco + (sizeof(rsp_vec_t) >> 1));
- }
- static inline rsp_vec_t read_vco_hi(const uint16_t *vco)
- {
- return vec_load_unshuffled_operand(vco);
- }
- static inline rsp_vec_t read_vce(const uint16_t *vce)
- {
- return vec_load_unshuffled_operand(vce + (sizeof(rsp_vec_t) >> 1));
- }
- static inline void write_acc_lo(uint16_t *acc, rsp_vec_t acc_lo)
- {
- return vec_write_operand(acc + sizeof(rsp_vec_t), acc_lo);
- }
- static inline void write_acc_mid(uint16_t *acc, rsp_vec_t acc_mid)
- {
- return vec_write_operand(acc + (sizeof(rsp_vec_t) >> 1), acc_mid);
- }
- static inline void write_acc_hi(uint16_t *acc, rsp_vec_t acc_hi)
- {
- return vec_write_operand(acc, acc_hi);
- }
- static inline void write_vcc_lo(uint16_t *vcc, rsp_vec_t vcc_lo)
- {
- return vec_write_operand(vcc + (sizeof(rsp_vec_t) >> 1), vcc_lo);
- }
- static inline void write_vcc_hi(uint16_t *vcc, rsp_vec_t vcc_hi)
- {
- return vec_write_operand(vcc, vcc_hi);
- }
- static inline void write_vco_lo(uint16_t *vcc, rsp_vec_t vco_lo)
- {
- return vec_write_operand(vcc + (sizeof(rsp_vec_t) >> 1), vco_lo);
- }
- static inline void write_vco_hi(uint16_t *vcc, rsp_vec_t vco_hi)
- {
- return vec_write_operand(vcc, vco_hi);
- }
- static inline void write_vce(uint16_t *vce, rsp_vec_t vce_r)
- {
- return vec_write_operand(vce + (sizeof(rsp_vec_t) >> 1), vce_r);
- }
-
- static inline int16_t get_flags(const uint16_t *flags)
- {
- return _mm_movemask_epi8(_mm_packs_epi16(_mm_load_si128((rsp_vec_t*) (flags + (sizeof(rsp_vec_t) >> 1))), _mm_load_si128((rsp_vec_t*) flags)));
- }
-
- static inline rsp_vec_t vec_zero()
- {
- return _mm_setzero_si128();
- }
-
- void vec_load_group1(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm);
- void vec_load_group2(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm, rsp_mem_request_type request_type);
- void vec_load_group4(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm, rsp_mem_request_type request_type);
- void vec_store_group1(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm);
- void vec_store_group2(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm, rsp_mem_request_type request_type);
- void vec_store_group4(uint32_t addr, uint32_t element, uint16_t* regp, rsp_vec_t reg, rsp_vec_t dqm, rsp_mem_request_type request_type);
-
-#include "clamp.h"
-#include "vabs.h"
-#include "vadd.h"
-#include "vaddc.h"
-#include "vand.h"
-#include "vch.h"
-#include "vcmp.h"
-#include "vcl.h"
-#include "vcr.h"
-#include "vdivh.h"
-#include "vmac.h"
-#include "vmov.h"
-#include "vmrg.h"
-#include "vmul.h"
-#include "vmulh.h"
-#include "vmull.h"
-#include "vmulm.h"
-#include "vmuln.h"
-#include "vor.h"
-#include "vrcpsq.h"
-#include "vrsq.h"
-#include "vsub.h"
-#include "vsubc.h"
-#include "vxor.h"
-#include "vldst.h"
-#endif
-
-private:
- void handle_lwc2(uint32_t op);
- void handle_swc2(uint32_t op);
- void handle_vector_ops(uint32_t op);
-
- uint32_t m_div_in;
- uint32_t m_div_out;
-};
-
-#endif // MAME_CPU_RSP_RSPCP2_H