summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/powerpc/ppcfe.h
blob: 40b82bd8756426562daf03d50f8a33af25f8d992 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************

    ppcfe.h

    Front-end for PowerPC recompiler

***************************************************************************/
#ifndef MAME_CPU_POWERPC_PPCFE_H
#define MAME_CPU_POWERPC_PPCFE_H

#pragma once

#include "ppc.h"

#include "cpu/drcfe.h"


//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

class ppc_device::frontend : public drc_frontend
{
public:
	// register flags 0
	static constexpr u32 REGFLAG_R(unsigned n)      { return 1U << n; }
	static constexpr u32 REGFLAG_RZ(unsigned n)     { return !n ? 0U : REGFLAG_R(n); }

	// register flags 1
	static constexpr u32 REGFLAG_FR(unsigned n)     { return 1U << n; }

	// register flags 2
	static constexpr u32 REGFLAG_CR(unsigned n)     { return 0xf0000000U >> (4 * n); }
	static constexpr u32 REGFLAG_CR_BIT(unsigned n) { return 0x80000000U >> n; }

	// register flags 3
	static constexpr u32 REGFLAG_XER_CA             = 1U << 0;
	static constexpr u32 REGFLAG_XER_OV             = 1U << 1;
	static constexpr u32 REGFLAG_XER_SO             = 1U << 2;
	static constexpr u32 REGFLAG_XER_COUNT          = 1U << 3;
	static constexpr u32 REGFLAG_CTR                = 1U << 4;
	static constexpr u32 REGFLAG_LR                 = 1U << 5;
	static constexpr u32 REGFLAG_FPSCR(unsigned n)  { return 1U << (6 + n); }

	// construction/destruction
	frontend(ppc_device &ppc, uint32_t window_start, uint32_t window_end, uint32_t max_sequence);

protected:
	// required overrides
	virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override;

private:
	// inlines
	uint32_t compute_spr(uint32_t spr) const { return ((spr >> 5) | (spr << 5)) & 0x3ff; }
	bool is_403_class() const { return (m_ppc.m_flavor == ppc_device::PPC_MODEL_403GA || m_ppc.m_flavor == ppc_device::PPC_MODEL_403GB || m_ppc.m_flavor == ppc_device::PPC_MODEL_403GC || m_ppc.m_flavor == ppc_device::PPC_MODEL_403GCX || m_ppc.m_flavor == ppc_device::PPC_MODEL_405GP); }
	bool is_601_class() const { return (m_ppc.m_flavor == ppc_device::PPC_MODEL_601); }
	bool is_602_class() const { return (m_ppc.m_flavor == ppc_device::PPC_MODEL_602); }
	bool is_603_class() const { return (m_ppc.m_flavor == ppc_device::PPC_MODEL_603 || m_ppc.m_flavor == ppc_device::PPC_MODEL_603E || m_ppc.m_flavor == ppc_device::PPC_MODEL_603EV || m_ppc.m_flavor == ppc_device::PPC_MODEL_603R); }

	// internal helpers
	bool describe_13(uint32_t op, opcode_desc &desc, const opcode_desc *prev);
	bool describe_1f(uint32_t op, opcode_desc &desc, const opcode_desc *prev);
	bool describe_3b(uint32_t op, opcode_desc &desc, const opcode_desc *prev);
	bool describe_3f(uint32_t op, opcode_desc &desc, const opcode_desc *prev);

	// internal state
	ppc_device &m_ppc;
};


#endif // MAME_CPU_POWERPC_PPCFE_H