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

#include "emu.h"
#include "arcompact_helper.ipp"

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                 IIII I      SS SSSS
// LR b,[c]                        0010 0bbb 0010 1010   0BBB CCCC CCRR RRRR
// LR b,[limm]                     0010 0bbb 0010 1010   0BBB 1111 10RR RRRR (+ Limm)
// LR b,[u6]                       0010 0bbb 0110 1010   0BBB uuuu uu00 0000
// LR b,[s12]                      0010 0bbb 1010 1010   0BBB ssss ssSS SSSS
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

uint32_t arcompact_device::handleop32_LR(uint32_t op)
{
	switch ((op & 0x00c00000) >> 22)
	{
	case 0x00:
	{
		int size = 4;
		uint8_t breg = common32_get_breg(op);
		uint8_t creg = common32_get_creg(op);
		if (creg == REG_LIMM)
		{
			get_limm_32bit_opcode();
			size = 8;
		}
		uint32_t c = m_regs[creg];
		m_regs[breg] = READAUX(c);
		return m_pc + size;
	}
	case 0x01:
	{
		int size = 4;
		uint8_t breg = common32_get_breg(op);
		uint32_t u = common32_get_u6(op);
		uint32_t c = u;
		m_regs[breg] = READAUX(c);
		return m_pc + size;
	}
	case 0x02:
	{
		int size = 4;
		uint8_t breg = common32_get_breg(op);
		uint32_t S = common32_get_s12(op);
		uint32_t c = (uint32_t)S;
		m_regs[breg] = READAUX(c);
		return m_pc + size;
	}
	case 0x03:
	{
		switch ((op & 0x00000020) >> 5)
		{
		case 0x00:
		{
			int size = 4;
			fatalerror("handleop32_LR_cc_f_b_b_c (LR)\n");
			return m_pc + size;
		}
		case 0x01:
		{
			int size = 4;
			uint8_t breg = common32_get_breg(op);
			uint32_t u = common32_get_u6(op);
			uint32_t c = u;
			uint8_t condition = common32_get_condition(op);
			if (!check_condition(condition))
				return m_pc + size;
			m_regs[breg] = READAUX(c);
			return m_pc + size;
		}
		}
		return 0;
	}
	}
	return 0;
}

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                                 IIII I      SS SSSS
// SR b,[c]                        0010 0bbb 0010 1011   0BBB CCCC CCRR RRRR
// SR b,[limm]                     0010 0bbb 0010 1011   0BBB 1111 10RR RRRR (+ Limm)
// SR b,[u6]                       0010 0bbb 0110 1011   0BBB uuuu uu00 0000
// SR b,[s12]                      0010 0bbb 1010 1011   0BBB ssss ssSS SSSS
// SR limm,[c]                     0010 0110 0010 1011   0111 CCCC CCRR RRRR (+ Limm)
// SR limm,[u6]                    0010 0110 0110 1011   0111 uuuu uu00 0000
// SR limm,[s12]                   0010 0110 1010 1011   0111 ssss ssSS SSSS (+ Limm)
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

uint32_t arcompact_device::handleop32_SR(uint32_t op)
{
	switch ((op & 0x00c00000) >> 22)
	{
	case 0x00:
	{
		uint8_t breg = common32_get_breg(op);
		uint8_t creg = common32_get_creg(op);
		int size = check_limm(breg, creg);
		uint32_t b = m_regs[breg];
		uint32_t c = m_regs[creg];
		WRITEAUX(c, b);
		return m_pc + size;
	}
	case 0x01:
	{
		uint8_t breg = common32_get_breg(op);
		uint32_t u = common32_get_u6(op);
		int size = check_limm(breg);
		uint32_t b = m_regs[breg];
		uint32_t c = u;
		WRITEAUX(c, b);
		return m_pc + size;
	}
	case 0x02:
	{
		uint8_t breg = common32_get_breg(op);
		uint32_t S = common32_get_s12(op);
		int size = check_limm(breg);
		uint32_t b = m_regs[breg];
		uint32_t c = (uint32_t)S;
		WRITEAUX(c, b);
		return m_pc + size;
	}
	case 0x03:
	{
		switch ((op & 0x00000020) >> 5)
		{
		case 0x00:
		{
			int size = 4;
			fatalerror("handleop32_SR_cc_f_b_b_c (SR)\n");
			return m_pc + size;
		}
		case 0x01:
		{
			uint8_t breg = common32_get_breg(op);
			uint32_t u = common32_get_u6(op);
			int size = check_limm(breg);
			uint32_t b = m_regs[breg];
			uint32_t c = u;
			uint8_t condition = common32_get_condition(op);
			if (!check_condition(condition))
				return m_pc + size;
			WRITEAUX(c, b);
			return m_pc + size;
		}
		}
		return 0;
	}
	}
	return 0;
}