mirror of
https://github.com/qemu/qemu.git
synced 2024-11-25 11:53:39 +08:00
target-arm: Use global env in iwmmxt_helper.c helpers
Use the global 'env' variable in the helper functions in iwmmxt_helper.c. This means we don't need to pass env as an argument to them any more. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
2a3f75b42a
commit
947a2fa21b
@ -375,47 +375,47 @@ DEF_HELPER_2(iwmmxt_macsw, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_macuw, i64, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_setpsr_nz, i32, i64)
|
||||
|
||||
#define DEF_IWMMXT_HELPER_SIZE_ENV(name) \
|
||||
DEF_HELPER_3(iwmmxt_##name##b, i64, env, i64, i64) \
|
||||
DEF_HELPER_3(iwmmxt_##name##w, i64, env, i64, i64) \
|
||||
DEF_HELPER_3(iwmmxt_##name##l, i64, env, i64, i64) \
|
||||
#define DEF_IWMMXT_HELPER_SIZE(name) \
|
||||
DEF_HELPER_2(iwmmxt_##name##b, i64, i64, i64) \
|
||||
DEF_HELPER_2(iwmmxt_##name##w, i64, i64, i64) \
|
||||
DEF_HELPER_2(iwmmxt_##name##l, i64, i64, i64) \
|
||||
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(unpackl)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(unpackh)
|
||||
DEF_IWMMXT_HELPER_SIZE(unpackl)
|
||||
DEF_IWMMXT_HELPER_SIZE(unpackh)
|
||||
|
||||
DEF_HELPER_2(iwmmxt_unpacklub, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackluw, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpacklul, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhub, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhuw, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhul, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpacklsb, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpacklsw, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpacklsl, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhsb, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhsw, i64, env, i64)
|
||||
DEF_HELPER_2(iwmmxt_unpackhsl, i64, env, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpacklub, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackluw, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpacklul, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhub, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhuw, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhul, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpacklsb, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpacklsw, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpacklsl, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhsb, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhsw, i64, i64)
|
||||
DEF_HELPER_1(iwmmxt_unpackhsl, i64, i64)
|
||||
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(cmpeq)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(cmpgtu)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(cmpgts)
|
||||
DEF_IWMMXT_HELPER_SIZE(cmpeq)
|
||||
DEF_IWMMXT_HELPER_SIZE(cmpgtu)
|
||||
DEF_IWMMXT_HELPER_SIZE(cmpgts)
|
||||
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(mins)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(minu)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(maxs)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(maxu)
|
||||
DEF_IWMMXT_HELPER_SIZE(mins)
|
||||
DEF_IWMMXT_HELPER_SIZE(minu)
|
||||
DEF_IWMMXT_HELPER_SIZE(maxs)
|
||||
DEF_IWMMXT_HELPER_SIZE(maxu)
|
||||
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(subn)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(addn)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(subu)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(addu)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(subs)
|
||||
DEF_IWMMXT_HELPER_SIZE_ENV(adds)
|
||||
DEF_IWMMXT_HELPER_SIZE(subn)
|
||||
DEF_IWMMXT_HELPER_SIZE(addn)
|
||||
DEF_IWMMXT_HELPER_SIZE(subu)
|
||||
DEF_IWMMXT_HELPER_SIZE(addu)
|
||||
DEF_IWMMXT_HELPER_SIZE(subs)
|
||||
DEF_IWMMXT_HELPER_SIZE(adds)
|
||||
|
||||
DEF_HELPER_3(iwmmxt_avgb0, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_avgb1, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_avgw0, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_avgw1, i64, env, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_avgb0, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_avgb1, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_avgw0, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_avgw1, i64, i64, i64)
|
||||
|
||||
DEF_HELPER_2(iwmmxt_msadb, i64, i64, i64)
|
||||
|
||||
@ -434,26 +434,26 @@ DEF_HELPER_1(iwmmxt_msbb, i32, i64)
|
||||
DEF_HELPER_1(iwmmxt_msbw, i32, i64)
|
||||
DEF_HELPER_1(iwmmxt_msbl, i32, i64)
|
||||
|
||||
DEF_HELPER_3(iwmmxt_srlw, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_srll, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_srlq, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_sllw, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_slll, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_sllq, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_sraw, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_sral, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_sraq, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_rorw, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_rorl, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_rorq, i64, env, i64, i32)
|
||||
DEF_HELPER_3(iwmmxt_shufh, i64, env, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_srlw, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_srll, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_srlq, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_sllw, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_slll, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_sllq, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_sraw, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_sral, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_sraq, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_rorw, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_rorl, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_rorq, i64, i64, i32)
|
||||
DEF_HELPER_2(iwmmxt_shufh, i64, i64, i32)
|
||||
|
||||
DEF_HELPER_3(iwmmxt_packuw, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_packul, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_packuq, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_packsw, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_packsl, i64, env, i64, i64)
|
||||
DEF_HELPER_3(iwmmxt_packsq, i64, env, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packuw, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packul, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packuq, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packsw, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packsl, i64, i64, i64)
|
||||
DEF_HELPER_2(iwmmxt_packsq, i64, i64, i64)
|
||||
|
||||
DEF_HELPER_3(iwmmxt_muladdsl, i64, i64, i32, i32)
|
||||
DEF_HELPER_3(iwmmxt_muladdsw, i64, i64, i32, i32)
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
#include "exec.h"
|
||||
#include "helpers.h"
|
||||
|
||||
/* iwMMXt macros extracted from GNU gdb. */
|
||||
@ -162,8 +162,7 @@ uint64_t HELPER(iwmmxt_macuw)(uint64_t a, uint64_t b)
|
||||
SIMD64_SET(NBIT64(x), SIMD_NBIT) | \
|
||||
SIMD64_SET(ZBIT64(x), SIMD_ZBIT)
|
||||
#define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = \
|
||||
(((a >> SH0) & 0xff) << 0) | (((b >> SH0) & 0xff) << 8) | \
|
||||
@ -177,8 +176,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(CPUState *env, \
|
||||
NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \
|
||||
return a; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = \
|
||||
(((a >> SH0) & 0xffff) << 0) | \
|
||||
@ -190,8 +188,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(CPUState *env, \
|
||||
NZBIT8(a >> 32, 2) | NZBIT8(a >> 48, 3); \
|
||||
return a; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = \
|
||||
(((a >> SH0) & 0xffffffff) << 0) | \
|
||||
@ -200,8 +197,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(CPUState *env, \
|
||||
NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \
|
||||
return a; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(uint64_t x) \
|
||||
{ \
|
||||
x = \
|
||||
(((x >> SH0) & 0xff) << 0) | \
|
||||
@ -213,8 +209,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(CPUState *env, \
|
||||
NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \
|
||||
return x; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(uint64_t x) \
|
||||
{ \
|
||||
x = \
|
||||
(((x >> SH0) & 0xffff) << 0) | \
|
||||
@ -223,15 +218,13 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(CPUState *env, \
|
||||
NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \
|
||||
return x; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(uint64_t x) \
|
||||
{ \
|
||||
x = (((x >> SH0) & 0xffffffff) << 0); \
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \
|
||||
return x; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(uint64_t x) \
|
||||
{ \
|
||||
x = \
|
||||
((uint64_t) EXTEND8H((x >> SH0) & 0xff) << 0) | \
|
||||
@ -243,8 +236,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(CPUState *env, \
|
||||
NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \
|
||||
return x; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(uint64_t x) \
|
||||
{ \
|
||||
x = \
|
||||
((uint64_t) EXTEND16((x >> SH0) & 0xffff) << 0) | \
|
||||
@ -253,8 +245,7 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(CPUState *env, \
|
||||
NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \
|
||||
return x; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(CPUState *env, \
|
||||
uint64_t x) \
|
||||
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(uint64_t x) \
|
||||
{ \
|
||||
x = EXTEND32((x >> SH0) & 0xffffffff); \
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \
|
||||
@ -264,8 +255,7 @@ IWMMXT_OP_UNPACK(l, 0, 8, 16, 24)
|
||||
IWMMXT_OP_UNPACK(h, 32, 40, 48, 56)
|
||||
|
||||
#define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O) \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = \
|
||||
CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) | \
|
||||
@ -279,8 +269,7 @@ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(CPUState *env, \
|
||||
NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \
|
||||
return a; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) | \
|
||||
CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff); \
|
||||
@ -289,8 +278,7 @@ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(CPUState *env, \
|
||||
NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); \
|
||||
return a; \
|
||||
} \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(CPUState *env, \
|
||||
uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
a = CMP(0, Tl, O, 0xffffffff) | \
|
||||
CMP(32, Tl, O, 0xffffffff); \
|
||||
@ -329,7 +317,7 @@ IWMMXT_OP_CMP(adds, int8_t, int16_t, int32_t, +)
|
||||
#define AVGB(SHR) ((( \
|
||||
((a >> SHR) & 0xff) + ((b >> SHR) & 0xff) + round) >> 1) << SHR)
|
||||
#define IWMMXT_OP_AVGB(r) \
|
||||
uint64_t HELPER(iwmmxt_avgb##r)(CPUState *env, uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(iwmmxt_avgb##r)(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
const int round = r; \
|
||||
a = AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) | \
|
||||
@ -353,7 +341,7 @@ IWMMXT_OP_AVGB(1)
|
||||
#define AVGW(SHR) ((( \
|
||||
((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR)
|
||||
#define IWMMXT_OP_AVGW(r) \
|
||||
uint64_t HELPER(iwmmxt_avgw##r)(CPUState *env, uint64_t a, uint64_t b) \
|
||||
uint64_t HELPER(iwmmxt_avgw##r)(uint64_t a, uint64_t b) \
|
||||
{ \
|
||||
const int round = r; \
|
||||
a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48); \
|
||||
@ -464,7 +452,7 @@ uint32_t HELPER(iwmmxt_msbl)(uint64_t x)
|
||||
}
|
||||
|
||||
/* FIXME: Split wCASF setting into a separate op to avoid env use. */
|
||||
uint64_t HELPER(iwmmxt_srlw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_srlw)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) |
|
||||
(((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) |
|
||||
@ -476,7 +464,7 @@ uint64_t HELPER(iwmmxt_srlw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_srll)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_srll)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = ((x & (0xffffffffll << 0)) >> n) |
|
||||
((x >> n) & (0xffffffffll << 32));
|
||||
@ -485,14 +473,14 @@ uint64_t HELPER(iwmmxt_srll)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_srlq)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_srlq)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x >>= n;
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_sllw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_sllw)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) |
|
||||
(((x & (0xffffll << 16)) << n) & (0xffffll << 16)) |
|
||||
@ -504,7 +492,7 @@ uint64_t HELPER(iwmmxt_sllw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_slll)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_slll)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = ((x << n) & (0xffffffffll << 0)) |
|
||||
((x & (0xffffffffll << 32)) << n);
|
||||
@ -513,14 +501,14 @@ uint64_t HELPER(iwmmxt_slll)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_sllq)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_sllq)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x <<= n;
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_sraw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_sraw)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) |
|
||||
((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) |
|
||||
@ -532,7 +520,7 @@ uint64_t HELPER(iwmmxt_sraw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_sral)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_sral)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) |
|
||||
(((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32);
|
||||
@ -541,14 +529,14 @@ uint64_t HELPER(iwmmxt_sral)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_sraq)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_sraq)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (int64_t) x >> n;
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_rorw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_rorw)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = ((((x & (0xffffll << 0)) >> n) |
|
||||
((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) |
|
||||
@ -564,7 +552,7 @@ uint64_t HELPER(iwmmxt_rorw)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_rorl)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_rorl)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = ((x & (0xffffffffll << 0)) >> n) |
|
||||
((x >> n) & (0xffffffffll << 32)) |
|
||||
@ -575,14 +563,14 @@ uint64_t HELPER(iwmmxt_rorl)(CPUState *env, uint64_t x, uint32_t n)
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_rorq)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_rorq)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (x >> n) | (x << (64 - n));
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_shufh)(CPUState *env, uint64_t x, uint32_t n)
|
||||
uint64_t HELPER(iwmmxt_shufh)(uint64_t x, uint32_t n)
|
||||
{
|
||||
x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) |
|
||||
(((x >> ((n << 2) & 0x30)) & 0xffff) << 16) |
|
||||
@ -595,7 +583,7 @@ uint64_t HELPER(iwmmxt_shufh)(CPUState *env, uint64_t x, uint32_t n)
|
||||
}
|
||||
|
||||
/* TODO: Unsigned-Saturation */
|
||||
uint64_t HELPER(iwmmxt_packuw)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packuw)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |
|
||||
(((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |
|
||||
@ -609,7 +597,7 @@ uint64_t HELPER(iwmmxt_packuw)(CPUState *env, uint64_t a, uint64_t b)
|
||||
return a;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_packul)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packul)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |
|
||||
(((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);
|
||||
@ -619,7 +607,7 @@ uint64_t HELPER(iwmmxt_packul)(CPUState *env, uint64_t a, uint64_t b)
|
||||
return a;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_packuq)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packuq)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
|
||||
@ -628,7 +616,7 @@ uint64_t HELPER(iwmmxt_packuq)(CPUState *env, uint64_t a, uint64_t b)
|
||||
}
|
||||
|
||||
/* TODO: Signed-Saturation */
|
||||
uint64_t HELPER(iwmmxt_packsw)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packsw)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |
|
||||
(((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |
|
||||
@ -642,7 +630,7 @@ uint64_t HELPER(iwmmxt_packsw)(CPUState *env, uint64_t a, uint64_t b)
|
||||
return a;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_packsl)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packsl)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |
|
||||
(((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);
|
||||
@ -652,7 +640,7 @@ uint64_t HELPER(iwmmxt_packsl)(CPUState *env, uint64_t a, uint64_t b)
|
||||
return a;
|
||||
}
|
||||
|
||||
uint64_t HELPER(iwmmxt_packsq)(CPUState *env, uint64_t a, uint64_t b)
|
||||
uint64_t HELPER(iwmmxt_packsq)(uint64_t a, uint64_t b)
|
||||
{
|
||||
a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);
|
||||
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
|
||||
|
@ -1159,22 +1159,15 @@ static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
|
||||
gen_helper_iwmmxt_##name(cpu_M0, cpu_M0, cpu_V1); \
|
||||
}
|
||||
|
||||
#define IWMMXT_OP_ENV(name) \
|
||||
static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
|
||||
{ \
|
||||
iwmmxt_load_reg(cpu_V1, rn); \
|
||||
gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0, cpu_V1); \
|
||||
}
|
||||
#define IWMMXT_OP_SIZE(name) \
|
||||
IWMMXT_OP(name##b) \
|
||||
IWMMXT_OP(name##w) \
|
||||
IWMMXT_OP(name##l)
|
||||
|
||||
#define IWMMXT_OP_ENV_SIZE(name) \
|
||||
IWMMXT_OP_ENV(name##b) \
|
||||
IWMMXT_OP_ENV(name##w) \
|
||||
IWMMXT_OP_ENV(name##l)
|
||||
|
||||
#define IWMMXT_OP_ENV1(name) \
|
||||
#define IWMMXT_OP_1(name) \
|
||||
static inline void gen_op_iwmmxt_##name##_M0(void) \
|
||||
{ \
|
||||
gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0); \
|
||||
gen_helper_iwmmxt_##name(cpu_M0, cpu_M0); \
|
||||
}
|
||||
|
||||
IWMMXT_OP(maddsq)
|
||||
@ -1188,51 +1181,51 @@ IWMMXT_OP(muluhw)
|
||||
IWMMXT_OP(macsw)
|
||||
IWMMXT_OP(macuw)
|
||||
|
||||
IWMMXT_OP_ENV_SIZE(unpackl)
|
||||
IWMMXT_OP_ENV_SIZE(unpackh)
|
||||
IWMMXT_OP_SIZE(unpackl)
|
||||
IWMMXT_OP_SIZE(unpackh)
|
||||
|
||||
IWMMXT_OP_ENV1(unpacklub)
|
||||
IWMMXT_OP_ENV1(unpackluw)
|
||||
IWMMXT_OP_ENV1(unpacklul)
|
||||
IWMMXT_OP_ENV1(unpackhub)
|
||||
IWMMXT_OP_ENV1(unpackhuw)
|
||||
IWMMXT_OP_ENV1(unpackhul)
|
||||
IWMMXT_OP_ENV1(unpacklsb)
|
||||
IWMMXT_OP_ENV1(unpacklsw)
|
||||
IWMMXT_OP_ENV1(unpacklsl)
|
||||
IWMMXT_OP_ENV1(unpackhsb)
|
||||
IWMMXT_OP_ENV1(unpackhsw)
|
||||
IWMMXT_OP_ENV1(unpackhsl)
|
||||
IWMMXT_OP_1(unpacklub)
|
||||
IWMMXT_OP_1(unpackluw)
|
||||
IWMMXT_OP_1(unpacklul)
|
||||
IWMMXT_OP_1(unpackhub)
|
||||
IWMMXT_OP_1(unpackhuw)
|
||||
IWMMXT_OP_1(unpackhul)
|
||||
IWMMXT_OP_1(unpacklsb)
|
||||
IWMMXT_OP_1(unpacklsw)
|
||||
IWMMXT_OP_1(unpacklsl)
|
||||
IWMMXT_OP_1(unpackhsb)
|
||||
IWMMXT_OP_1(unpackhsw)
|
||||
IWMMXT_OP_1(unpackhsl)
|
||||
|
||||
IWMMXT_OP_ENV_SIZE(cmpeq)
|
||||
IWMMXT_OP_ENV_SIZE(cmpgtu)
|
||||
IWMMXT_OP_ENV_SIZE(cmpgts)
|
||||
IWMMXT_OP_SIZE(cmpeq)
|
||||
IWMMXT_OP_SIZE(cmpgtu)
|
||||
IWMMXT_OP_SIZE(cmpgts)
|
||||
|
||||
IWMMXT_OP_ENV_SIZE(mins)
|
||||
IWMMXT_OP_ENV_SIZE(minu)
|
||||
IWMMXT_OP_ENV_SIZE(maxs)
|
||||
IWMMXT_OP_ENV_SIZE(maxu)
|
||||
IWMMXT_OP_SIZE(mins)
|
||||
IWMMXT_OP_SIZE(minu)
|
||||
IWMMXT_OP_SIZE(maxs)
|
||||
IWMMXT_OP_SIZE(maxu)
|
||||
|
||||
IWMMXT_OP_ENV_SIZE(subn)
|
||||
IWMMXT_OP_ENV_SIZE(addn)
|
||||
IWMMXT_OP_ENV_SIZE(subu)
|
||||
IWMMXT_OP_ENV_SIZE(addu)
|
||||
IWMMXT_OP_ENV_SIZE(subs)
|
||||
IWMMXT_OP_ENV_SIZE(adds)
|
||||
IWMMXT_OP_SIZE(subn)
|
||||
IWMMXT_OP_SIZE(addn)
|
||||
IWMMXT_OP_SIZE(subu)
|
||||
IWMMXT_OP_SIZE(addu)
|
||||
IWMMXT_OP_SIZE(subs)
|
||||
IWMMXT_OP_SIZE(adds)
|
||||
|
||||
IWMMXT_OP_ENV(avgb0)
|
||||
IWMMXT_OP_ENV(avgb1)
|
||||
IWMMXT_OP_ENV(avgw0)
|
||||
IWMMXT_OP_ENV(avgw1)
|
||||
IWMMXT_OP(avgb0)
|
||||
IWMMXT_OP(avgb1)
|
||||
IWMMXT_OP(avgw0)
|
||||
IWMMXT_OP(avgw1)
|
||||
|
||||
IWMMXT_OP(msadb)
|
||||
|
||||
IWMMXT_OP_ENV(packuw)
|
||||
IWMMXT_OP_ENV(packul)
|
||||
IWMMXT_OP_ENV(packuq)
|
||||
IWMMXT_OP_ENV(packsw)
|
||||
IWMMXT_OP_ENV(packsl)
|
||||
IWMMXT_OP_ENV(packsq)
|
||||
IWMMXT_OP(packuw)
|
||||
IWMMXT_OP(packul)
|
||||
IWMMXT_OP(packuq)
|
||||
IWMMXT_OP(packsw)
|
||||
IWMMXT_OP(packsl)
|
||||
IWMMXT_OP(packsq)
|
||||
|
||||
static void gen_op_iwmmxt_set_mup(void)
|
||||
{
|
||||
@ -1966,13 +1959,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
|
||||
}
|
||||
switch ((insn >> 22) & 3) {
|
||||
case 1:
|
||||
gen_helper_iwmmxt_srlw(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_srlw(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 2:
|
||||
gen_helper_iwmmxt_srll(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_srll(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 3:
|
||||
gen_helper_iwmmxt_srlq(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_srlq(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
@ -1994,13 +1987,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
|
||||
}
|
||||
switch ((insn >> 22) & 3) {
|
||||
case 1:
|
||||
gen_helper_iwmmxt_sraw(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_sraw(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 2:
|
||||
gen_helper_iwmmxt_sral(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_sral(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 3:
|
||||
gen_helper_iwmmxt_sraq(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_sraq(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
@ -2022,13 +2015,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
|
||||
}
|
||||
switch ((insn >> 22) & 3) {
|
||||
case 1:
|
||||
gen_helper_iwmmxt_sllw(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_sllw(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 2:
|
||||
gen_helper_iwmmxt_slll(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_slll(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 3:
|
||||
gen_helper_iwmmxt_sllq(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_sllq(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
@ -2050,21 +2043,21 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
|
||||
tcg_temp_free_i32(tmp);
|
||||
return 1;
|
||||
}
|
||||
gen_helper_iwmmxt_rorw(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_rorw(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 2:
|
||||
if (gen_iwmmxt_shift(insn, 0x1f, tmp)) {
|
||||
tcg_temp_free_i32(tmp);
|
||||
return 1;
|
||||
}
|
||||
gen_helper_iwmmxt_rorl(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_rorl(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
case 3:
|
||||
if (gen_iwmmxt_shift(insn, 0x3f, tmp)) {
|
||||
tcg_temp_free_i32(tmp);
|
||||
return 1;
|
||||
}
|
||||
gen_helper_iwmmxt_rorq(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_rorq(cpu_M0, cpu_M0, tmp);
|
||||
break;
|
||||
}
|
||||
tcg_temp_free_i32(tmp);
|
||||
@ -2198,7 +2191,7 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
|
||||
rd0 = (insn >> 16) & 0xf;
|
||||
gen_op_iwmmxt_movq_M0_wRn(rd0);
|
||||
tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
|
||||
gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, tmp);
|
||||
gen_helper_iwmmxt_shufh(cpu_M0, cpu_M0, tmp);
|
||||
tcg_temp_free(tmp);
|
||||
gen_op_iwmmxt_movq_wRn_M0(wrd);
|
||||
gen_op_iwmmxt_set_mup();
|
||||
|
Loading…
Reference in New Issue
Block a user