Convert unaligned load/store to TCG.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4759 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
9fac3a3a7e
commit
c8c2227e91
6
configure
vendored
6
configure
vendored
@ -1280,28 +1280,22 @@ case "$target_cpu" in
|
|||||||
;;
|
;;
|
||||||
mips|mipsel)
|
mips|mipsel)
|
||||||
echo "TARGET_ARCH=mips" >> $config_mak
|
echo "TARGET_ARCH=mips" >> $config_mak
|
||||||
echo "CONFIG_DYNGEN_OP=yes" >> $config_mak
|
|
||||||
echo "#define TARGET_ARCH \"mips\"" >> $config_h
|
echo "#define TARGET_ARCH \"mips\"" >> $config_h
|
||||||
echo "#define TARGET_MIPS 1" >> $config_h
|
echo "#define TARGET_MIPS 1" >> $config_h
|
||||||
echo "#define TARGET_ABI_MIPSO32 1" >> $config_h
|
echo "#define TARGET_ABI_MIPSO32 1" >> $config_h
|
||||||
echo "#define CONFIG_DYNGEN_OP 1" >> $config_h
|
|
||||||
;;
|
;;
|
||||||
mipsn32|mipsn32el)
|
mipsn32|mipsn32el)
|
||||||
echo "TARGET_ARCH=mipsn32" >> $config_mak
|
echo "TARGET_ARCH=mipsn32" >> $config_mak
|
||||||
echo "CONFIG_DYNGEN_OP=yes" >> $config_mak
|
|
||||||
echo "#define TARGET_ARCH \"mipsn32\"" >> $config_h
|
echo "#define TARGET_ARCH \"mipsn32\"" >> $config_h
|
||||||
echo "#define TARGET_MIPS 1" >> $config_h
|
echo "#define TARGET_MIPS 1" >> $config_h
|
||||||
echo "#define TARGET_ABI_MIPSN32 1" >> $config_h
|
echo "#define TARGET_ABI_MIPSN32 1" >> $config_h
|
||||||
echo "#define CONFIG_DYNGEN_OP 1" >> $config_h
|
|
||||||
;;
|
;;
|
||||||
mips64|mips64el)
|
mips64|mips64el)
|
||||||
echo "TARGET_ARCH=mips64" >> $config_mak
|
echo "TARGET_ARCH=mips64" >> $config_mak
|
||||||
echo "CONFIG_DYNGEN_OP=yes" >> $config_mak
|
|
||||||
echo "#define TARGET_ARCH \"mips64\"" >> $config_h
|
echo "#define TARGET_ARCH \"mips64\"" >> $config_h
|
||||||
echo "#define TARGET_MIPS 1" >> $config_h
|
echo "#define TARGET_MIPS 1" >> $config_h
|
||||||
echo "#define TARGET_MIPS64 1" >> $config_h
|
echo "#define TARGET_MIPS64 1" >> $config_h
|
||||||
echo "#define TARGET_ABI_MIPSN64 1" >> $config_h
|
echo "#define TARGET_ABI_MIPSN64 1" >> $config_h
|
||||||
echo "#define CONFIG_DYNGEN_OP 1" >> $config_h
|
|
||||||
;;
|
;;
|
||||||
ppc)
|
ppc)
|
||||||
echo "TARGET_ARCH=ppc" >> $config_mak
|
echo "TARGET_ARCH=ppc" >> $config_mak
|
||||||
|
@ -6,6 +6,17 @@ DEF_HELPER(void, do_raise_exception_err, (int excp, int err))
|
|||||||
DEF_HELPER(void, do_raise_exception, (int excp))
|
DEF_HELPER(void, do_raise_exception, (int excp))
|
||||||
DEF_HELPER(void, do_interrupt_restart, (void))
|
DEF_HELPER(void, do_interrupt_restart, (void))
|
||||||
|
|
||||||
|
#ifdef TARGET_MIPS64
|
||||||
|
DEF_HELPER(void, do_ldl, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_ldr, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_sdl, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_sdr, (int mem_idx))
|
||||||
|
#endif
|
||||||
|
DEF_HELPER(void, do_lwl, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_lwr, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_swl, (int mem_idx))
|
||||||
|
DEF_HELPER(void, do_swr, (int mem_idx))
|
||||||
|
|
||||||
DEF_HELPER(void, do_clo, (void))
|
DEF_HELPER(void, do_clo, (void))
|
||||||
DEF_HELPER(void, do_clz, (void))
|
DEF_HELPER(void, do_clz, (void))
|
||||||
#ifdef TARGET_MIPS64
|
#ifdef TARGET_MIPS64
|
||||||
|
@ -19,29 +19,3 @@
|
|||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "exec.h"
|
|
||||||
#include "host-utils.h"
|
|
||||||
|
|
||||||
#ifndef CALL_FROM_TB0
|
|
||||||
#define CALL_FROM_TB0(func) func()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Load and store */
|
|
||||||
#define MEMSUFFIX _raw
|
|
||||||
#include "op_mem.c"
|
|
||||||
#undef MEMSUFFIX
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
#define MEMSUFFIX _user
|
|
||||||
#include "op_mem.c"
|
|
||||||
#undef MEMSUFFIX
|
|
||||||
|
|
||||||
#define MEMSUFFIX _super
|
|
||||||
#include "op_mem.c"
|
|
||||||
#undef MEMSUFFIX
|
|
||||||
|
|
||||||
#define MEMSUFFIX _kernel
|
|
||||||
#include "op_mem.c"
|
|
||||||
#undef MEMSUFFIX
|
|
||||||
#endif
|
|
||||||
|
@ -308,6 +308,343 @@ void do_dmultu (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
|
#define GET_LMASK(v) ((v) & 3)
|
||||||
|
#define GET_OFFSET(addr, offset) (addr + (offset))
|
||||||
|
#else
|
||||||
|
#define GET_LMASK(v) (((v) & 3) ^ 3)
|
||||||
|
#define GET_OFFSET(addr, offset) (addr - (offset))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void do_lwl(int mem_idx)
|
||||||
|
{
|
||||||
|
target_ulong tmp;
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define ldfun ldub_raw
|
||||||
|
#else
|
||||||
|
int (*ldfun)(target_ulong);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: ldfun = ldub_kernel; break;
|
||||||
|
case 1: ldfun = ldub_super; break;
|
||||||
|
default:
|
||||||
|
case 2: ldfun = ldub_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
tmp = ldfun(T0);
|
||||||
|
T1 = (T1 & 0x00FFFFFF) | (tmp << 24);
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) <= 2) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 1));
|
||||||
|
T1 = (T1 & 0xFF00FFFF) | (tmp << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) <= 1) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 2));
|
||||||
|
T1 = (T1 & 0xFFFF00FF) | (tmp << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) == 0) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 3));
|
||||||
|
T1 = (T1 & 0xFFFFFF00) | tmp;
|
||||||
|
}
|
||||||
|
T1 = (int32_t)T1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_lwr(int mem_idx)
|
||||||
|
{
|
||||||
|
target_ulong tmp;
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define ldfun ldub_raw
|
||||||
|
#else
|
||||||
|
int (*ldfun)(target_ulong);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: ldfun = ldub_kernel; break;
|
||||||
|
case 1: ldfun = ldub_super; break;
|
||||||
|
default:
|
||||||
|
case 2: ldfun = ldub_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
tmp = ldfun(T0);
|
||||||
|
T1 = (T1 & 0xFFFFFF00) | tmp;
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) >= 1) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -1));
|
||||||
|
T1 = (T1 & 0xFFFF00FF) | (tmp << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) >= 2) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -2));
|
||||||
|
T1 = (T1 & 0xFF00FFFF) | (tmp << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) == 3) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -3));
|
||||||
|
T1 = (T1 & 0x00FFFFFF) | (tmp << 24);
|
||||||
|
}
|
||||||
|
T1 = (int32_t)T1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_swl(int mem_idx)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define stfun stb_raw
|
||||||
|
#else
|
||||||
|
void (*stfun)(target_ulong, int);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: stfun = stb_kernel; break;
|
||||||
|
case 1: stfun = stb_super; break;
|
||||||
|
default:
|
||||||
|
case 2: stfun = stb_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
stfun(T0, (uint8_t)(T1 >> 24));
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) <= 2)
|
||||||
|
stfun(GET_OFFSET(T0, 1), (uint8_t)(T1 >> 16));
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) <= 1)
|
||||||
|
stfun(GET_OFFSET(T0, 2), (uint8_t)(T1 >> 8));
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) == 0)
|
||||||
|
stfun(GET_OFFSET(T0, 3), (uint8_t)T1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_swr(int mem_idx)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define stfun stb_raw
|
||||||
|
#else
|
||||||
|
void (*stfun)(target_ulong, int);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: stfun = stb_kernel; break;
|
||||||
|
case 1: stfun = stb_super; break;
|
||||||
|
default:
|
||||||
|
case 2: stfun = stb_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
stfun(T0, (uint8_t)T1);
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) >= 1)
|
||||||
|
stfun(GET_OFFSET(T0, -1), (uint8_t)(T1 >> 8));
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) >= 2)
|
||||||
|
stfun(GET_OFFSET(T0, -2), (uint8_t)(T1 >> 16));
|
||||||
|
|
||||||
|
if (GET_LMASK(T0) == 3)
|
||||||
|
stfun(GET_OFFSET(T0, -3), (uint8_t)(T1 >> 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(TARGET_MIPS64)
|
||||||
|
/* "half" load and stores. We must do the memory access inline,
|
||||||
|
or fault handling won't work. */
|
||||||
|
|
||||||
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
|
#define GET_LMASK64(v) ((v) & 7)
|
||||||
|
#else
|
||||||
|
#define GET_LMASK64(v) (((v) & 7) ^ 7)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void do_ldl(int mem_idx)
|
||||||
|
{
|
||||||
|
uint64_t tmp;
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define ldfun ldub_raw
|
||||||
|
#else
|
||||||
|
target_ulong (*ldfun)(target_ulong);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: ldfun = ldub_kernel; break;
|
||||||
|
case 1: ldfun = ldub_super; break;
|
||||||
|
default:
|
||||||
|
case 2: ldfun = ldub_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
tmp = ldfun(T0);
|
||||||
|
T1 = (T1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 6) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 1));
|
||||||
|
T1 = (T1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 5) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 2));
|
||||||
|
T1 = (T1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 4) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 3));
|
||||||
|
T1 = (T1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 3) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 4));
|
||||||
|
T1 = (T1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 2) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 5));
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 1) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 6));
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) == 0) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, 7));
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_ldr(int mem_idx)
|
||||||
|
{
|
||||||
|
uint64_t tmp;
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define ldfun ldub_raw
|
||||||
|
#else
|
||||||
|
target_ulong (*ldfun)(target_ulong);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: ldfun = ldub_kernel; break;
|
||||||
|
case 1: ldfun = ldub_super; break;
|
||||||
|
default:
|
||||||
|
case 2: ldfun = ldub_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
tmp = ldfun(T0);
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFFFFFF00ULL) | tmp;
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 1) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -1));
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFFFF00FFULL) | (tmp << 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 2) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -2));
|
||||||
|
T1 = (T1 & 0xFFFFFFFFFF00FFFFULL) | (tmp << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 3) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -3));
|
||||||
|
T1 = (T1 & 0xFFFFFFFF00FFFFFFULL) | (tmp << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 4) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -4));
|
||||||
|
T1 = (T1 & 0xFFFFFF00FFFFFFFFULL) | (tmp << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 5) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -5));
|
||||||
|
T1 = (T1 & 0xFFFF00FFFFFFFFFFULL) | (tmp << 40);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 6) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -6));
|
||||||
|
T1 = (T1 & 0xFF00FFFFFFFFFFFFULL) | (tmp << 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) == 7) {
|
||||||
|
tmp = ldfun(GET_OFFSET(T0, -7));
|
||||||
|
T1 = (T1 & 0x00FFFFFFFFFFFFFFULL) | (tmp << 56);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_sdl(int mem_idx)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define stfun stb_raw
|
||||||
|
#else
|
||||||
|
void (*stfun)(target_ulong, int);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: stfun = stb_kernel; break;
|
||||||
|
case 1: stfun = stb_super; break;
|
||||||
|
default:
|
||||||
|
case 2: stfun = stb_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
stfun(T0, (uint8_t)(T1 >> 56));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 6)
|
||||||
|
stfun(GET_OFFSET(T0, 1), (uint8_t)(T1 >> 48));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 5)
|
||||||
|
stfun(GET_OFFSET(T0, 2), (uint8_t)(T1 >> 40));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 4)
|
||||||
|
stfun(GET_OFFSET(T0, 3), (uint8_t)(T1 >> 32));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 3)
|
||||||
|
stfun(GET_OFFSET(T0, 4), (uint8_t)(T1 >> 24));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 2)
|
||||||
|
stfun(GET_OFFSET(T0, 5), (uint8_t)(T1 >> 16));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 1)
|
||||||
|
stfun(GET_OFFSET(T0, 6), (uint8_t)(T1 >> 8));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) <= 0)
|
||||||
|
stfun(GET_OFFSET(T0, 7), (uint8_t)T1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_sdr(int mem_idx)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
#define stfun stb_raw
|
||||||
|
#else
|
||||||
|
void (*stfun)(target_ulong, int);
|
||||||
|
|
||||||
|
switch (mem_idx)
|
||||||
|
{
|
||||||
|
case 0: stfun = stb_kernel; break;
|
||||||
|
case 1: stfun = stb_super; break;
|
||||||
|
default:
|
||||||
|
case 2: stfun = stb_user; break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
stfun(T0, (uint8_t)T1);
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 1)
|
||||||
|
stfun(GET_OFFSET(T0, -1), (uint8_t)(T1 >> 8));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 2)
|
||||||
|
stfun(GET_OFFSET(T0, -2), (uint8_t)(T1 >> 16));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 3)
|
||||||
|
stfun(GET_OFFSET(T0, -3), (uint8_t)(T1 >> 24));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 4)
|
||||||
|
stfun(GET_OFFSET(T0, -4), (uint8_t)(T1 >> 32));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 5)
|
||||||
|
stfun(GET_OFFSET(T0, -5), (uint8_t)(T1 >> 40));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) >= 6)
|
||||||
|
stfun(GET_OFFSET(T0, -6), (uint8_t)(T1 >> 48));
|
||||||
|
|
||||||
|
if (GET_LMASK64(T0) == 7)
|
||||||
|
stfun(GET_OFFSET(T0, -7), (uint8_t)(T1 >> 56));
|
||||||
|
}
|
||||||
|
#endif /* TARGET_MIPS64 */
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
void do_mfc0_random (void)
|
void do_mfc0_random (void)
|
||||||
{
|
{
|
||||||
|
@ -945,37 +945,6 @@ static always_inline void check_mips_64(DisasContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* load/store instructions. */
|
/* load/store instructions. */
|
||||||
#if defined(CONFIG_USER_ONLY)
|
|
||||||
#define op_ldst(name) gen_op_##name##_raw()
|
|
||||||
#define OP_LD_TABLE(width)
|
|
||||||
#define OP_ST_TABLE(width)
|
|
||||||
#else
|
|
||||||
#define op_ldst(name) (*gen_op_##name[ctx->mem_idx])()
|
|
||||||
#define OP_LD_TABLE(width) \
|
|
||||||
static GenOpFunc *gen_op_l##width[] = { \
|
|
||||||
&gen_op_l##width##_kernel, \
|
|
||||||
&gen_op_l##width##_super, \
|
|
||||||
&gen_op_l##width##_user, \
|
|
||||||
}
|
|
||||||
#define OP_ST_TABLE(width) \
|
|
||||||
static GenOpFunc *gen_op_s##width[] = { \
|
|
||||||
&gen_op_s##width##_kernel, \
|
|
||||||
&gen_op_s##width##_super, \
|
|
||||||
&gen_op_s##width##_user, \
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(TARGET_MIPS64)
|
|
||||||
OP_LD_TABLE(dl);
|
|
||||||
OP_LD_TABLE(dr);
|
|
||||||
OP_ST_TABLE(dl);
|
|
||||||
OP_ST_TABLE(dr);
|
|
||||||
#endif
|
|
||||||
OP_LD_TABLE(wl);
|
|
||||||
OP_LD_TABLE(wr);
|
|
||||||
OP_ST_TABLE(wl);
|
|
||||||
OP_ST_TABLE(wr);
|
|
||||||
|
|
||||||
#define OP_LD(insn,fname) \
|
#define OP_LD(insn,fname) \
|
||||||
void inline op_ldst_##insn(DisasContext *ctx) \
|
void inline op_ldst_##insn(DisasContext *ctx) \
|
||||||
{ \
|
{ \
|
||||||
@ -1094,25 +1063,29 @@ static void gen_ldst (DisasContext *ctx, uint32_t opc, int rt,
|
|||||||
opn = "scd";
|
opn = "scd";
|
||||||
break;
|
break;
|
||||||
case OPC_LDL:
|
case OPC_LDL:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(ldl);
|
tcg_gen_helper_0_1i(do_ldl, ctx->mem_idx);
|
||||||
gen_store_gpr(cpu_T[1], rt);
|
gen_store_gpr(cpu_T[1], rt);
|
||||||
opn = "ldl";
|
opn = "ldl";
|
||||||
break;
|
break;
|
||||||
case OPC_SDL:
|
case OPC_SDL:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(sdl);
|
tcg_gen_helper_0_1i(do_sdl, ctx->mem_idx);
|
||||||
opn = "sdl";
|
opn = "sdl";
|
||||||
break;
|
break;
|
||||||
case OPC_LDR:
|
case OPC_LDR:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(ldr);
|
tcg_gen_helper_0_1i(do_ldr, ctx->mem_idx);
|
||||||
gen_store_gpr(cpu_T[1], rt);
|
gen_store_gpr(cpu_T[1], rt);
|
||||||
opn = "ldr";
|
opn = "ldr";
|
||||||
break;
|
break;
|
||||||
case OPC_SDR:
|
case OPC_SDR:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(sdr);
|
tcg_gen_helper_0_1i(do_sdr, ctx->mem_idx);
|
||||||
opn = "sdr";
|
opn = "sdr";
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -1157,25 +1130,29 @@ static void gen_ldst (DisasContext *ctx, uint32_t opc, int rt,
|
|||||||
opn = "lbu";
|
opn = "lbu";
|
||||||
break;
|
break;
|
||||||
case OPC_LWL:
|
case OPC_LWL:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(lwl);
|
tcg_gen_helper_0_1i(do_lwl, ctx->mem_idx);
|
||||||
gen_store_gpr(cpu_T[1], rt);
|
gen_store_gpr(cpu_T[1], rt);
|
||||||
opn = "lwl";
|
opn = "lwl";
|
||||||
break;
|
break;
|
||||||
case OPC_SWL:
|
case OPC_SWL:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(swl);
|
tcg_gen_helper_0_1i(do_swl, ctx->mem_idx);
|
||||||
opn = "swr";
|
opn = "swr";
|
||||||
break;
|
break;
|
||||||
case OPC_LWR:
|
case OPC_LWR:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(lwr);
|
tcg_gen_helper_0_1i(do_lwr, ctx->mem_idx);
|
||||||
gen_store_gpr(cpu_T[1], rt);
|
gen_store_gpr(cpu_T[1], rt);
|
||||||
opn = "lwr";
|
opn = "lwr";
|
||||||
break;
|
break;
|
||||||
case OPC_SWR:
|
case OPC_SWR:
|
||||||
|
save_cpu_state(ctx, 1);
|
||||||
gen_load_gpr(cpu_T[1], rt);
|
gen_load_gpr(cpu_T[1], rt);
|
||||||
op_ldst(swr);
|
tcg_gen_helper_0_1i(do_swr, ctx->mem_idx);
|
||||||
opn = "swr";
|
opn = "swr";
|
||||||
break;
|
break;
|
||||||
case OPC_LL:
|
case OPC_LL:
|
||||||
|
Loading…
Reference in New Issue
Block a user