summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/rsp/vldst.h
blob: fadc8be63c083db7d7cba858f37cb7a9762116cf (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
// license:BSD-3-Clause
// copyright-holders:Tyler J. Stachecki,Ryan Holtz

// LBV, LDV, LLV, LSV, SBV, SDV, SLV, SSV
inline void vec_lbdlsv_sbdlsv(uint32_t iw, uint32_t rs)
{
	const uint32_t shift_and_idx = (iw >> 11) & 0x3;
	rsp_vec_t dqm = _mm_loadl_epi64((rsp_vec_t *) (m_vec_helpers.bdls_lut[shift_and_idx]));

	const uint32_t addr = (rs + (sign_extend_6(iw) << shift_and_idx)) & 0xfff;
	const uint32_t element = (iw >> 7) & 0xf;
	uint16_t* regp = m_v[(iw >> 16) & 0x1f].s;

	if (iw >> 29 & 0x1)
	{
		vec_store_group1(addr, element, regp, vec_load_unshuffled_operand(regp), dqm);
	}
	else
	{
		vec_load_group1(addr, element, regp, vec_load_unshuffled_operand(regp), dqm);
	}
}

// LPV, LUV, SPV, SUV
inline void vec_lfhpuv_sfhpuv(uint32_t iw, uint32_t rs)
{
	static const enum rsp_mem_request_type fhpu_type_lut[4] = {
		RSP_MEM_REQUEST_PACK,
		RSP_MEM_REQUEST_UPACK,
		RSP_MEM_REQUEST_HALF,
		RSP_MEM_REQUEST_FOURTH
	};

	const uint32_t addr = (rs + (sign_extend_6(iw) << 3)) & 0xfff;
	const uint32_t element = (iw >> 7) & 0xf;
	uint16_t* regp = m_v[(iw >> 16) & 0x1f].s;

	rsp_mem_request_type request_type = fhpu_type_lut[((iw >> 11) & 0x1f) - 6];
	if ((iw >> 29) & 0x1)
	{
		vec_store_group2(addr, element, regp, vec_load_unshuffled_operand(regp), _mm_setzero_si128(), request_type);
	}
	else
	{
		vec_load_group2(addr, element, regp, vec_load_unshuffled_operand(regp), _mm_setzero_si128(), request_type);
	}
}

// LQV, LRV, SQV, SRV
inline void vec_lqrv_sqrv(uint32_t iw, uint32_t rs)
{
	rs &= 0xfff;

	const uint32_t addr = rs + (sign_extend_6(iw) << 4);
	const uint32_t element = (iw >> 7) & 0xf;
	uint16_t* regp = m_v[(iw >> 16) & 0x1f].s;

	memcpy(m_vdqm.s, m_vec_helpers.qr_lut[addr & 0xf], sizeof(m_vdqm.s));

	rsp_mem_request_type request_type = (iw >> 11 & 0x1) ? RSP_MEM_REQUEST_REST : RSP_MEM_REQUEST_QUAD;
	if ((iw >> 29) & 0x1)
	{
		vec_store_group4(addr, element, regp, vec_load_unshuffled_operand(regp), vec_load_unshuffled_operand(m_vdqm.s), request_type);
	}
	else
	{
		vec_load_group4(addr, element, regp, vec_load_unshuffled_operand(regp), vec_load_unshuffled_operand(m_vdqm.s), request_type);
	}
}