Skip to content

Commit 32736e4

Browse files
committed
Cleanup:
cpu/drcbex86.cpp: Don't use static address space accessors. This gives a big performance improvement. cpu/drcbeut.cpp: Made failure to resolve address space accessors fatal. cpu/drcbearm64.cpp: Removed fallback to static address space accessors. cpu/mips3/mibs3.cpp: Removed static address space accessors. All they were doing was hurting performance. cpu/drcbex64.cpp: Don't use goofy X64_WINDOWS_ABI macro, just check _WIN32. The only other environment that uses the Windows calling convention is (U)EFI, and we can move feature detection to util/abi.h if we ever need to care about it.
1 parent bf7061a commit 32736e4

10 files changed

+395
-434
lines changed

makefile

-1
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,6 @@ CPPCHECK_PARAMS += -I3rdparty/bx/include
16801680
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/emu
16811681
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/emu/layout
16821682
CPPCHECK_PARAMS += -I$(BUILDDIR)/generated/mame/layout
1683-
CPPCHECK_PARAMS += -DX64_WINDOWS_ABI
16841683
CPPCHECK_PARAMS += -DPTR64=1
16851684
CPPCHECK_PARAMS += -DMAME_DEBUG
16861685
CPPCHECK_PARAMS += -DMAME_PROFILER

src/devices/cpu/drcbearm64.cpp

+40-226
Original file line numberDiff line numberDiff line change
@@ -2054,66 +2054,29 @@ void drcbe_arm64::op_read(a64::Assembler &a, const uml::instruction &inst)
20542054
const parameter &spacesizep = inst.param(2);
20552055
assert(spacesizep.is_size_space());
20562056

2057-
const auto &trampolines = m_accessors[spacesizep.space()];
20582057
const auto &resolved = m_resolved_accessors[spacesizep.space()];
20592058

20602059
mov_reg_param(a, 4, REG_PARAM2, addrp);
20612060

20622061
if (spacesizep.size() == SIZE_BYTE)
20632062
{
2064-
if (resolved.read_byte)
2065-
{
2066-
get_imm_relative(a, REG_PARAM1, resolved.read_byte.obj);
2067-
call_arm_addr(a, resolved.read_byte.func);
2068-
}
2069-
else
2070-
{
2071-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2072-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_byte);
2073-
a.blr(TEMP_REG1);
2074-
}
2063+
get_imm_relative(a, REG_PARAM1, resolved.read_byte.obj);
2064+
call_arm_addr(a, resolved.read_byte.func);
20752065
}
20762066
else if (spacesizep.size() == SIZE_WORD)
20772067
{
2078-
if (resolved.read_word)
2079-
{
2080-
get_imm_relative(a, REG_PARAM1, resolved.read_word.obj);
2081-
call_arm_addr(a, resolved.read_word.func);
2082-
}
2083-
else
2084-
{
2085-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2086-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_word);
2087-
a.blr(TEMP_REG1);
2088-
}
2068+
get_imm_relative(a, REG_PARAM1, resolved.read_word.obj);
2069+
call_arm_addr(a, resolved.read_word.func);
20892070
}
20902071
else if (spacesizep.size() == SIZE_DWORD)
20912072
{
2092-
if (resolved.read_dword)
2093-
{
2094-
get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj);
2095-
call_arm_addr(a, resolved.read_dword.func);
2096-
}
2097-
else
2098-
{
2099-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2100-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_dword);
2101-
a.blr(TEMP_REG1);
2102-
}
2073+
get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj);
2074+
call_arm_addr(a, resolved.read_dword.func);
21032075
}
21042076
else if (spacesizep.size() == SIZE_QWORD)
21052077
{
2106-
if (resolved.read_qword)
2107-
{
2108-
get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj);
2109-
call_arm_addr(a, resolved.read_qword.func);
2110-
}
2111-
else
2112-
{
2113-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2114-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_qword);
2115-
a.blr(TEMP_REG1);
2116-
}
2078+
get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj);
2079+
call_arm_addr(a, resolved.read_qword.func);
21172080
}
21182081

21192082
mov_param_reg(a, inst.size(), dstp, REG_PARAM1);
@@ -2131,67 +2094,30 @@ void drcbe_arm64::op_readm(a64::Assembler &a, const uml::instruction &inst)
21312094
const parameter &spacesizep = inst.param(3);
21322095
assert(spacesizep.is_size_space());
21332096

2134-
const auto &trampolines = m_accessors[spacesizep.space()];
21352097
const auto &resolved = m_resolved_accessors[spacesizep.space()];
21362098

21372099
mov_reg_param(a, 4, REG_PARAM2, addrp);
21382100
mov_reg_param(a, inst.size(), REG_PARAM3, maskp);
21392101

21402102
if (spacesizep.size() == SIZE_BYTE)
21412103
{
2142-
if (resolved.read_byte_masked)
2143-
{
2144-
get_imm_relative(a, REG_PARAM1, resolved.read_byte_masked.obj);
2145-
call_arm_addr(a, resolved.read_byte_masked.func);
2146-
}
2147-
else
2148-
{
2149-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2150-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_byte_masked);
2151-
a.blr(TEMP_REG1);
2152-
}
2104+
get_imm_relative(a, REG_PARAM1, resolved.read_byte_masked.obj);
2105+
call_arm_addr(a, resolved.read_byte_masked.func);
21532106
}
21542107
else if (spacesizep.size() == SIZE_WORD)
21552108
{
2156-
if (resolved.read_word_masked)
2157-
{
2158-
get_imm_relative(a, REG_PARAM1, resolved.read_word_masked.obj);
2159-
call_arm_addr(a, resolved.read_word_masked.func);
2160-
}
2161-
else
2162-
{
2163-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2164-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_word_masked);
2165-
a.blr(TEMP_REG1);
2166-
}
2109+
get_imm_relative(a, REG_PARAM1, resolved.read_word_masked.obj);
2110+
call_arm_addr(a, resolved.read_word_masked.func);
21672111
}
21682112
else if (spacesizep.size() == SIZE_DWORD)
21692113
{
2170-
if (resolved.read_dword_masked)
2171-
{
2172-
get_imm_relative(a, REG_PARAM1, resolved.read_dword_masked.obj);
2173-
call_arm_addr(a, resolved.read_dword_masked.func);
2174-
}
2175-
else
2176-
{
2177-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2178-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_dword_masked);
2179-
a.blr(TEMP_REG1);
2180-
}
2114+
get_imm_relative(a, REG_PARAM1, resolved.read_dword_masked.obj);
2115+
call_arm_addr(a, resolved.read_dword_masked.func);
21812116
}
21822117
else if (spacesizep.size() == SIZE_QWORD)
21832118
{
2184-
if (resolved.read_qword_masked)
2185-
{
2186-
get_imm_relative(a, REG_PARAM1, resolved.read_qword_masked.obj);
2187-
call_arm_addr(a, resolved.read_qword_masked.func);
2188-
}
2189-
else
2190-
{
2191-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2192-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_qword_masked);
2193-
a.blr(TEMP_REG1);
2194-
}
2119+
get_imm_relative(a, REG_PARAM1, resolved.read_qword_masked.obj);
2120+
call_arm_addr(a, resolved.read_qword_masked.func);
21952121
}
21962122

21972123
mov_param_reg(a, inst.size(), dstp, REG_PARAM1);
@@ -2208,67 +2134,30 @@ void drcbe_arm64::op_write(a64::Assembler &a, const uml::instruction &inst)
22082134
const parameter &spacesizep = inst.param(2);
22092135
assert(spacesizep.is_size_space());
22102136

2211-
const auto &trampolines = m_accessors[spacesizep.space()];
22122137
const auto &resolved = m_resolved_accessors[spacesizep.space()];
22132138

22142139
mov_reg_param(a, 4, REG_PARAM2, addrp);
22152140
mov_reg_param(a, inst.size(), REG_PARAM3, srcp);
22162141

22172142
if (spacesizep.size() == SIZE_BYTE)
22182143
{
2219-
if (resolved.write_byte)
2220-
{
2221-
get_imm_relative(a, REG_PARAM1, resolved.write_byte.obj);
2222-
call_arm_addr(a, resolved.write_byte.func);
2223-
}
2224-
else
2225-
{
2226-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2227-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_byte);
2228-
a.blr(TEMP_REG1);
2229-
}
2144+
get_imm_relative(a, REG_PARAM1, resolved.write_byte.obj);
2145+
call_arm_addr(a, resolved.write_byte.func);
22302146
}
22312147
else if (spacesizep.size() == SIZE_WORD)
22322148
{
2233-
if (resolved.write_word)
2234-
{
2235-
get_imm_relative(a, REG_PARAM1, resolved.write_word.obj);
2236-
call_arm_addr(a, resolved.write_word.func);
2237-
}
2238-
else
2239-
{
2240-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2241-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_word);
2242-
a.blr(TEMP_REG1);
2243-
}
2149+
get_imm_relative(a, REG_PARAM1, resolved.write_word.obj);
2150+
call_arm_addr(a, resolved.write_word.func);
22442151
}
22452152
else if (spacesizep.size() == SIZE_DWORD)
22462153
{
2247-
if (resolved.write_dword)
2248-
{
2249-
get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj);
2250-
call_arm_addr(a, resolved.write_dword.func);
2251-
}
2252-
else
2253-
{
2254-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2255-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_dword);
2256-
a.blr(TEMP_REG1);
2257-
}
2154+
get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj);
2155+
call_arm_addr(a, resolved.write_dword.func);
22582156
}
22592157
else if (spacesizep.size() == SIZE_QWORD)
22602158
{
2261-
if (resolved.write_qword)
2262-
{
2263-
get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj);
2264-
call_arm_addr(a, resolved.write_qword.func);
2265-
}
2266-
else
2267-
{
2268-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2269-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_qword);
2270-
a.blr(TEMP_REG1);
2271-
}
2159+
get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj);
2160+
call_arm_addr(a, resolved.write_qword.func);
22722161
}
22732162
}
22742163

@@ -2285,7 +2174,6 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst)
22852174
assert(spacesizep.is_size_space());
22862175

22872176
// set up a call to the write handler
2288-
const auto &trampolines = m_accessors[spacesizep.space()];
22892177
const auto &resolved = m_resolved_accessors[spacesizep.space()];
22902178

22912179
mov_reg_param(a, 4, REG_PARAM2, addrp);
@@ -2294,59 +2182,23 @@ void drcbe_arm64::op_writem(a64::Assembler &a, const uml::instruction &inst)
22942182

22952183
if (spacesizep.size() == SIZE_BYTE)
22962184
{
2297-
if (resolved.write_byte_masked)
2298-
{
2299-
get_imm_relative(a, REG_PARAM1, resolved.write_byte_masked.obj);
2300-
call_arm_addr(a, resolved.write_byte_masked.func);
2301-
}
2302-
else
2303-
{
2304-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2305-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_byte_masked);
2306-
a.blr(TEMP_REG1);
2307-
}
2185+
get_imm_relative(a, REG_PARAM1, resolved.write_byte_masked.obj);
2186+
call_arm_addr(a, resolved.write_byte_masked.func);
23082187
}
23092188
else if (spacesizep.size() == SIZE_WORD)
23102189
{
2311-
if (resolved.write_word_masked)
2312-
{
2313-
get_imm_relative(a, REG_PARAM1, resolved.write_word_masked.obj);
2314-
call_arm_addr(a, resolved.write_word_masked.func);
2315-
}
2316-
else
2317-
{
2318-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2319-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_word_masked);
2320-
a.blr(TEMP_REG1);
2321-
}
2190+
get_imm_relative(a, REG_PARAM1, resolved.write_word_masked.obj);
2191+
call_arm_addr(a, resolved.write_word_masked.func);
23222192
}
23232193
else if (spacesizep.size() == SIZE_DWORD)
23242194
{
2325-
if (resolved.write_dword_masked)
2326-
{
2327-
get_imm_relative(a, REG_PARAM1, resolved.write_dword_masked.obj);
2328-
call_arm_addr(a, resolved.write_dword_masked.func);
2329-
}
2330-
else
2331-
{
2332-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2333-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_dword_masked);
2334-
a.blr(TEMP_REG1);
2335-
}
2195+
get_imm_relative(a, REG_PARAM1, resolved.write_dword_masked.obj);
2196+
call_arm_addr(a, resolved.write_dword_masked.func);
23362197
}
23372198
else if (spacesizep.size() == SIZE_QWORD)
23382199
{
2339-
if (resolved.write_qword_masked)
2340-
{
2341-
get_imm_relative(a, REG_PARAM1, resolved.write_qword_masked.obj);
2342-
call_arm_addr(a, resolved.write_qword_masked.func);
2343-
}
2344-
else
2345-
{
2346-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
2347-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_qword_masked);
2348-
a.blr(TEMP_REG1);
2349-
}
2200+
get_imm_relative(a, REG_PARAM1, resolved.write_qword_masked.obj);
2201+
call_arm_addr(a, resolved.write_qword_masked.func);
23502202
}
23512203
}
23522204

@@ -3924,40 +3776,21 @@ void drcbe_arm64::op_fread(a64::Assembler &a, const uml::instruction &inst)
39243776
assert(spacesizep.is_size_space());
39253777
assert((1 << spacesizep.size()) == inst.size());
39263778

3927-
const auto &trampolines = m_accessors[spacesizep.space()];
39283779
const auto &resolved = m_resolved_accessors[spacesizep.space()];
39293780

39303781
mov_reg_param(a, 4, REG_PARAM2, addrp);
39313782

39323783
if (inst.size() == 4)
39333784
{
3934-
if (resolved.read_dword)
3935-
{
3936-
get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj);
3937-
call_arm_addr(a, resolved.read_dword.func);
3938-
}
3939-
else
3940-
{
3941-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
3942-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_dword);
3943-
a.blr(TEMP_REG1);
3944-
}
3785+
get_imm_relative(a, REG_PARAM1, resolved.read_dword.obj);
3786+
call_arm_addr(a, resolved.read_dword.func);
39453787

39463788
mov_float_param_int_reg(a, inst.size(), dstp, REG_PARAM1.w());
39473789
}
39483790
else if (inst.size() == 8)
39493791
{
3950-
if (resolved.read_qword)
3951-
{
3952-
get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj);
3953-
call_arm_addr(a, resolved.read_qword.func);
3954-
}
3955-
else
3956-
{
3957-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
3958-
emit_ldr_mem(a, TEMP_REG1, &trampolines.read_qword);
3959-
a.blr(TEMP_REG1);
3960-
}
3792+
get_imm_relative(a, REG_PARAM1, resolved.read_qword.obj);
3793+
call_arm_addr(a, resolved.read_qword.func);
39613794

39623795
mov_float_param_int_reg(a, inst.size(), dstp, REG_PARAM1);
39633796
}
@@ -3975,7 +3808,6 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst)
39753808
assert(spacesizep.is_size_space());
39763809
assert((1 << spacesizep.size()) == inst.size());
39773810

3978-
const auto &trampolines = m_accessors[spacesizep.space()];
39793811
const auto &resolved = m_resolved_accessors[spacesizep.space()];
39803812

39813813
mov_reg_param(a, 4, REG_PARAM2, addrp);
@@ -3985,31 +3817,13 @@ void drcbe_arm64::op_fwrite(a64::Assembler &a, const uml::instruction &inst)
39853817

39863818
if (inst.size() == 4)
39873819
{
3988-
if (resolved.write_dword)
3989-
{
3990-
get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj);
3991-
call_arm_addr(a, resolved.write_dword.func);
3992-
}
3993-
else
3994-
{
3995-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
3996-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_dword);
3997-
a.blr(TEMP_REG1);
3998-
}
3820+
get_imm_relative(a, REG_PARAM1, resolved.write_dword.obj);
3821+
call_arm_addr(a, resolved.write_dword.func);
39993822
}
40003823
else if (inst.size() == 8)
40013824
{
4002-
if (resolved.write_qword)
4003-
{
4004-
get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj);
4005-
call_arm_addr(a, resolved.write_qword.func);
4006-
}
4007-
else
4008-
{
4009-
get_imm_relative(a, REG_PARAM1, (uintptr_t)m_space[spacesizep.space()]);
4010-
emit_ldr_mem(a, TEMP_REG1, &trampolines.write_qword);
4011-
a.blr(TEMP_REG1);
4012-
}
3825+
get_imm_relative(a, REG_PARAM1, resolved.write_qword.obj);
3826+
call_arm_addr(a, resolved.write_qword.func);
40133827
}
40143828
}
40153829

0 commit comments

Comments
 (0)