Revert "target-arm: Use global env in iwmmxt_helper.c helpers"

This reverts commit 947a2fa21b,
returning the iwmmxt helpers to passing env in as a parameter.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2011-05-25 13:22:31 +00:00
parent 48e2faf222
commit 477955bd55
3 changed files with 163 additions and 144 deletions

View File

@ -375,47 +375,47 @@ DEF_HELPER_2(iwmmxt_macsw, i64, i64, i64)
DEF_HELPER_2(iwmmxt_macuw, i64, i64, i64) DEF_HELPER_2(iwmmxt_macuw, i64, i64, i64)
DEF_HELPER_1(iwmmxt_setpsr_nz, i32, i64) DEF_HELPER_1(iwmmxt_setpsr_nz, i32, i64)
#define DEF_IWMMXT_HELPER_SIZE(name) \ #define DEF_IWMMXT_HELPER_SIZE_ENV(name) \
DEF_HELPER_2(iwmmxt_##name##b, i64, i64, i64) \ DEF_HELPER_3(iwmmxt_##name##b, i64, env, i64, i64) \
DEF_HELPER_2(iwmmxt_##name##w, i64, i64, i64) \ DEF_HELPER_3(iwmmxt_##name##w, i64, env, i64, i64) \
DEF_HELPER_2(iwmmxt_##name##l, i64, i64, i64) \ DEF_HELPER_3(iwmmxt_##name##l, i64, env, i64, i64) \
DEF_IWMMXT_HELPER_SIZE(unpackl) DEF_IWMMXT_HELPER_SIZE_ENV(unpackl)
DEF_IWMMXT_HELPER_SIZE(unpackh) DEF_IWMMXT_HELPER_SIZE_ENV(unpackh)
DEF_HELPER_1(iwmmxt_unpacklub, i64, i64) DEF_HELPER_2(iwmmxt_unpacklub, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackluw, i64, i64) DEF_HELPER_2(iwmmxt_unpackluw, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpacklul, i64, i64) DEF_HELPER_2(iwmmxt_unpacklul, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhub, i64, i64) DEF_HELPER_2(iwmmxt_unpackhub, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhuw, i64, i64) DEF_HELPER_2(iwmmxt_unpackhuw, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhul, i64, i64) DEF_HELPER_2(iwmmxt_unpackhul, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpacklsb, i64, i64) DEF_HELPER_2(iwmmxt_unpacklsb, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpacklsw, i64, i64) DEF_HELPER_2(iwmmxt_unpacklsw, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpacklsl, i64, i64) DEF_HELPER_2(iwmmxt_unpacklsl, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhsb, i64, i64) DEF_HELPER_2(iwmmxt_unpackhsb, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhsw, i64, i64) DEF_HELPER_2(iwmmxt_unpackhsw, i64, env, i64)
DEF_HELPER_1(iwmmxt_unpackhsl, i64, i64) DEF_HELPER_2(iwmmxt_unpackhsl, i64, env, i64)
DEF_IWMMXT_HELPER_SIZE(cmpeq) DEF_IWMMXT_HELPER_SIZE_ENV(cmpeq)
DEF_IWMMXT_HELPER_SIZE(cmpgtu) DEF_IWMMXT_HELPER_SIZE_ENV(cmpgtu)
DEF_IWMMXT_HELPER_SIZE(cmpgts) DEF_IWMMXT_HELPER_SIZE_ENV(cmpgts)
DEF_IWMMXT_HELPER_SIZE(mins) DEF_IWMMXT_HELPER_SIZE_ENV(mins)
DEF_IWMMXT_HELPER_SIZE(minu) DEF_IWMMXT_HELPER_SIZE_ENV(minu)
DEF_IWMMXT_HELPER_SIZE(maxs) DEF_IWMMXT_HELPER_SIZE_ENV(maxs)
DEF_IWMMXT_HELPER_SIZE(maxu) DEF_IWMMXT_HELPER_SIZE_ENV(maxu)
DEF_IWMMXT_HELPER_SIZE(subn) DEF_IWMMXT_HELPER_SIZE_ENV(subn)
DEF_IWMMXT_HELPER_SIZE(addn) DEF_IWMMXT_HELPER_SIZE_ENV(addn)
DEF_IWMMXT_HELPER_SIZE(subu) DEF_IWMMXT_HELPER_SIZE_ENV(subu)
DEF_IWMMXT_HELPER_SIZE(addu) DEF_IWMMXT_HELPER_SIZE_ENV(addu)
DEF_IWMMXT_HELPER_SIZE(subs) DEF_IWMMXT_HELPER_SIZE_ENV(subs)
DEF_IWMMXT_HELPER_SIZE(adds) DEF_IWMMXT_HELPER_SIZE_ENV(adds)
DEF_HELPER_2(iwmmxt_avgb0, i64, i64, i64) DEF_HELPER_3(iwmmxt_avgb0, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_avgb1, i64, i64, i64) DEF_HELPER_3(iwmmxt_avgb1, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_avgw0, i64, i64, i64) DEF_HELPER_3(iwmmxt_avgw0, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_avgw1, i64, i64, i64) DEF_HELPER_3(iwmmxt_avgw1, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_msadb, 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_msbw, i32, i64)
DEF_HELPER_1(iwmmxt_msbl, i32, i64) DEF_HELPER_1(iwmmxt_msbl, i32, i64)
DEF_HELPER_2(iwmmxt_srlw, i64, i64, i32) DEF_HELPER_3(iwmmxt_srlw, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_srll, i64, i64, i32) DEF_HELPER_3(iwmmxt_srll, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_srlq, i64, i64, i32) DEF_HELPER_3(iwmmxt_srlq, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_sllw, i64, i64, i32) DEF_HELPER_3(iwmmxt_sllw, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_slll, i64, i64, i32) DEF_HELPER_3(iwmmxt_slll, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_sllq, i64, i64, i32) DEF_HELPER_3(iwmmxt_sllq, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_sraw, i64, i64, i32) DEF_HELPER_3(iwmmxt_sraw, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_sral, i64, i64, i32) DEF_HELPER_3(iwmmxt_sral, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_sraq, i64, i64, i32) DEF_HELPER_3(iwmmxt_sraq, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_rorw, i64, i64, i32) DEF_HELPER_3(iwmmxt_rorw, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_rorl, i64, i64, i32) DEF_HELPER_3(iwmmxt_rorl, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_rorq, i64, i64, i32) DEF_HELPER_3(iwmmxt_rorq, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_shufh, i64, i64, i32) DEF_HELPER_3(iwmmxt_shufh, i64, env, i64, i32)
DEF_HELPER_2(iwmmxt_packuw, i64, i64, i64) DEF_HELPER_3(iwmmxt_packuw, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_packul, i64, i64, i64) DEF_HELPER_3(iwmmxt_packul, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_packuq, i64, i64, i64) DEF_HELPER_3(iwmmxt_packuq, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_packsw, i64, i64, i64) DEF_HELPER_3(iwmmxt_packsw, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_packsl, i64, i64, i64) DEF_HELPER_3(iwmmxt_packsl, i64, env, i64, i64)
DEF_HELPER_2(iwmmxt_packsq, i64, i64, i64) DEF_HELPER_3(iwmmxt_packsq, i64, env, i64, i64)
DEF_HELPER_3(iwmmxt_muladdsl, i64, i64, i32, i32) DEF_HELPER_3(iwmmxt_muladdsl, i64, i64, i32, i32)
DEF_HELPER_3(iwmmxt_muladdsw, i64, i64, i32, i32) DEF_HELPER_3(iwmmxt_muladdsw, i64, i64, i32, i32)

View File

@ -23,7 +23,7 @@
#include <stdio.h> #include <stdio.h>
#include "cpu.h" #include "cpu.h"
#include "exec.h" #include "exec-all.h"
#include "helper.h" #include "helper.h"
/* iwMMXt macros extracted from GNU gdb. */ /* iwMMXt macros extracted from GNU gdb. */
@ -162,7 +162,8 @@ uint64_t HELPER(iwmmxt_macuw)(uint64_t a, uint64_t b)
SIMD64_SET(NBIT64(x), SIMD_NBIT) | \ SIMD64_SET(NBIT64(x), SIMD_NBIT) | \
SIMD64_SET(ZBIT64(x), SIMD_ZBIT) SIMD64_SET(ZBIT64(x), SIMD_ZBIT)
#define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3) \ #define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3) \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = \ a = \
(((a >> SH0) & 0xff) << 0) | (((b >> SH0) & 0xff) << 8) | \ (((a >> SH0) & 0xff) << 0) | (((b >> SH0) & 0xff) << 8) | \
@ -176,7 +177,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(uint64_t a, uint64_t b) \
NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \
return a; \ return a; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = \ a = \
(((a >> SH0) & 0xffff) << 0) | \ (((a >> SH0) & 0xffff) << 0) | \
@ -188,7 +190,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(uint64_t a, uint64_t b) \
NZBIT8(a >> 32, 2) | NZBIT8(a >> 48, 3); \ NZBIT8(a >> 32, 2) | NZBIT8(a >> 48, 3); \
return a; \ return a; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = \ a = \
(((a >> SH0) & 0xffffffff) << 0) | \ (((a >> SH0) & 0xffffffff) << 0) | \
@ -197,7 +200,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(uint64_t a, uint64_t b) \
NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \ NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \
return a; \ return a; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = \ x = \
(((x >> SH0) & 0xff) << 0) | \ (((x >> SH0) & 0xff) << 0) | \
@ -209,7 +213,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(uint64_t x) \
NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \
return x; \ return x; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = \ x = \
(((x >> SH0) & 0xffff) << 0) | \ (((x >> SH0) & 0xffff) << 0) | \
@ -218,13 +223,15 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(uint64_t x) \
NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \
return x; \ return x; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = (((x >> SH0) & 0xffffffff) << 0); \ x = (((x >> SH0) & 0xffffffff) << 0); \
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \
return x; \ return x; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = \ x = \
((uint64_t) EXTEND8H((x >> SH0) & 0xff) << 0) | \ ((uint64_t) EXTEND8H((x >> SH0) & 0xff) << 0) | \
@ -236,7 +243,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(uint64_t x) \
NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \
return x; \ return x; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = \ x = \
((uint64_t) EXTEND16((x >> SH0) & 0xffff) << 0) | \ ((uint64_t) EXTEND16((x >> SH0) & 0xffff) << 0) | \
@ -245,7 +253,8 @@ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(uint64_t x) \
NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \
return x; \ return x; \
} \ } \
uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(uint64_t x) \ uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(CPUState *env, \
uint64_t x) \
{ \ { \
x = EXTEND32((x >> SH0) & 0xffffffff); \ x = EXTEND32((x >> SH0) & 0xffffffff); \
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \
@ -255,7 +264,8 @@ IWMMXT_OP_UNPACK(l, 0, 8, 16, 24)
IWMMXT_OP_UNPACK(h, 32, 40, 48, 56) IWMMXT_OP_UNPACK(h, 32, 40, 48, 56)
#define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O) \ #define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O) \
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = \ a = \
CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) | \ CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) | \
@ -269,7 +279,8 @@ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(uint64_t a, uint64_t b) \
NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \
return a; \ return a; \
} \ } \
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) | \ a = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) | \
CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff); \ CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff); \
@ -278,7 +289,8 @@ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(uint64_t a, uint64_t b) \
NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); \ NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); \
return a; \ return a; \
} \ } \
uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(uint64_t a, uint64_t b) \ uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(CPUState *env, \
uint64_t a, uint64_t b) \
{ \ { \
a = CMP(0, Tl, O, 0xffffffff) | \ a = CMP(0, Tl, O, 0xffffffff) | \
CMP(32, Tl, O, 0xffffffff); \ CMP(32, Tl, O, 0xffffffff); \
@ -317,7 +329,7 @@ IWMMXT_OP_CMP(adds, int8_t, int16_t, int32_t, +)
#define AVGB(SHR) ((( \ #define AVGB(SHR) ((( \
((a >> SHR) & 0xff) + ((b >> SHR) & 0xff) + round) >> 1) << SHR) ((a >> SHR) & 0xff) + ((b >> SHR) & 0xff) + round) >> 1) << SHR)
#define IWMMXT_OP_AVGB(r) \ #define IWMMXT_OP_AVGB(r) \
uint64_t HELPER(iwmmxt_avgb##r)(uint64_t a, uint64_t b) \ uint64_t HELPER(iwmmxt_avgb##r)(CPUState *env, uint64_t a, uint64_t b) \
{ \ { \
const int round = r; \ const int round = r; \
a = AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) | \ a = AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) | \
@ -341,7 +353,7 @@ IWMMXT_OP_AVGB(1)
#define AVGW(SHR) ((( \ #define AVGW(SHR) ((( \
((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR) ((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR)
#define IWMMXT_OP_AVGW(r) \ #define IWMMXT_OP_AVGW(r) \
uint64_t HELPER(iwmmxt_avgw##r)(uint64_t a, uint64_t b) \ uint64_t HELPER(iwmmxt_avgw##r)(CPUState *env, uint64_t a, uint64_t b) \
{ \ { \
const int round = r; \ const int round = r; \
a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48); \ a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48); \
@ -452,7 +464,7 @@ uint32_t HELPER(iwmmxt_msbl)(uint64_t x)
} }
/* FIXME: Split wCASF setting into a separate op to avoid env use. */ /* FIXME: Split wCASF setting into a separate op to avoid env use. */
uint64_t HELPER(iwmmxt_srlw)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_srlw)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) | x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) |
(((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) | (((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) |
@ -464,7 +476,7 @@ uint64_t HELPER(iwmmxt_srlw)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_srll)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_srll)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = ((x & (0xffffffffll << 0)) >> n) | x = ((x & (0xffffffffll << 0)) >> n) |
((x >> n) & (0xffffffffll << 32)); ((x >> n) & (0xffffffffll << 32));
@ -473,14 +485,14 @@ uint64_t HELPER(iwmmxt_srll)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_srlq)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_srlq)(CPUState *env, uint64_t x, uint32_t n)
{ {
x >>= n; x >>= n;
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
return x; return x;
} }
uint64_t HELPER(iwmmxt_sllw)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_sllw)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) | x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) |
(((x & (0xffffll << 16)) << n) & (0xffffll << 16)) | (((x & (0xffffll << 16)) << n) & (0xffffll << 16)) |
@ -492,7 +504,7 @@ uint64_t HELPER(iwmmxt_sllw)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_slll)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_slll)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = ((x << n) & (0xffffffffll << 0)) | x = ((x << n) & (0xffffffffll << 0)) |
((x & (0xffffffffll << 32)) << n); ((x & (0xffffffffll << 32)) << n);
@ -501,14 +513,14 @@ uint64_t HELPER(iwmmxt_slll)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_sllq)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_sllq)(CPUState *env, uint64_t x, uint32_t n)
{ {
x <<= n; x <<= n;
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
return x; return x;
} }
uint64_t HELPER(iwmmxt_sraw)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_sraw)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) | x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) |
((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) | ((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) |
@ -520,7 +532,7 @@ uint64_t HELPER(iwmmxt_sraw)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_sral)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_sral)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) | x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) |
(((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32); (((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32);
@ -529,14 +541,14 @@ uint64_t HELPER(iwmmxt_sral)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_sraq)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_sraq)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (int64_t) x >> n; x = (int64_t) x >> n;
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
return x; return x;
} }
uint64_t HELPER(iwmmxt_rorw)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_rorw)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = ((((x & (0xffffll << 0)) >> n) | x = ((((x & (0xffffll << 0)) >> n) |
((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) | ((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) |
@ -552,7 +564,7 @@ uint64_t HELPER(iwmmxt_rorw)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_rorl)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_rorl)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = ((x & (0xffffffffll << 0)) >> n) | x = ((x & (0xffffffffll << 0)) >> n) |
((x >> n) & (0xffffffffll << 32)) | ((x >> n) & (0xffffffffll << 32)) |
@ -563,14 +575,14 @@ uint64_t HELPER(iwmmxt_rorl)(uint64_t x, uint32_t n)
return x; return x;
} }
uint64_t HELPER(iwmmxt_rorq)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_rorq)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (x >> n) | (x << (64 - n)); x = (x >> n) | (x << (64 - n));
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);
return x; return x;
} }
uint64_t HELPER(iwmmxt_shufh)(uint64_t x, uint32_t n) uint64_t HELPER(iwmmxt_shufh)(CPUState *env, uint64_t x, uint32_t n)
{ {
x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) | x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) |
(((x >> ((n << 2) & 0x30)) & 0xffff) << 16) | (((x >> ((n << 2) & 0x30)) & 0xffff) << 16) |
@ -583,7 +595,7 @@ uint64_t HELPER(iwmmxt_shufh)(uint64_t x, uint32_t n)
} }
/* TODO: Unsigned-Saturation */ /* TODO: Unsigned-Saturation */
uint64_t HELPER(iwmmxt_packuw)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packuw)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |
(((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |
@ -597,7 +609,7 @@ uint64_t HELPER(iwmmxt_packuw)(uint64_t a, uint64_t b)
return a; return a;
} }
uint64_t HELPER(iwmmxt_packul)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packul)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |
(((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);
@ -607,7 +619,7 @@ uint64_t HELPER(iwmmxt_packul)(uint64_t a, uint64_t b)
return a; return a;
} }
uint64_t HELPER(iwmmxt_packuq)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packuq)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =
@ -616,7 +628,7 @@ uint64_t HELPER(iwmmxt_packuq)(uint64_t a, uint64_t b)
} }
/* TODO: Signed-Saturation */ /* TODO: Signed-Saturation */
uint64_t HELPER(iwmmxt_packsw)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packsw)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |
(((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |
@ -630,7 +642,7 @@ uint64_t HELPER(iwmmxt_packsw)(uint64_t a, uint64_t b)
return a; return a;
} }
uint64_t HELPER(iwmmxt_packsl)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packsl)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |
(((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);
@ -640,7 +652,7 @@ uint64_t HELPER(iwmmxt_packsl)(uint64_t a, uint64_t b)
return a; return a;
} }
uint64_t HELPER(iwmmxt_packsq)(uint64_t a, uint64_t b) uint64_t HELPER(iwmmxt_packsq)(CPUState *env, uint64_t a, uint64_t b)
{ {
a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);
env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =

View File

@ -1207,15 +1207,22 @@ static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
gen_helper_iwmmxt_##name(cpu_M0, cpu_M0, cpu_V1); \ gen_helper_iwmmxt_##name(cpu_M0, cpu_M0, cpu_V1); \
} }
#define IWMMXT_OP_SIZE(name) \ #define IWMMXT_OP_ENV(name) \
IWMMXT_OP(name##b) \ static inline void gen_op_iwmmxt_##name##_M0_wRn(int rn) \
IWMMXT_OP(name##w) \ { \
IWMMXT_OP(name##l) iwmmxt_load_reg(cpu_V1, rn); \
gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0, cpu_V1); \
}
#define IWMMXT_OP_1(name) \ #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) \
static inline void gen_op_iwmmxt_##name##_M0(void) \ static inline void gen_op_iwmmxt_##name##_M0(void) \
{ \ { \
gen_helper_iwmmxt_##name(cpu_M0, cpu_M0); \ gen_helper_iwmmxt_##name(cpu_M0, cpu_env, cpu_M0); \
} }
IWMMXT_OP(maddsq) IWMMXT_OP(maddsq)
@ -1229,51 +1236,51 @@ IWMMXT_OP(muluhw)
IWMMXT_OP(macsw) IWMMXT_OP(macsw)
IWMMXT_OP(macuw) IWMMXT_OP(macuw)
IWMMXT_OP_SIZE(unpackl) IWMMXT_OP_ENV_SIZE(unpackl)
IWMMXT_OP_SIZE(unpackh) IWMMXT_OP_ENV_SIZE(unpackh)
IWMMXT_OP_1(unpacklub) IWMMXT_OP_ENV1(unpacklub)
IWMMXT_OP_1(unpackluw) IWMMXT_OP_ENV1(unpackluw)
IWMMXT_OP_1(unpacklul) IWMMXT_OP_ENV1(unpacklul)
IWMMXT_OP_1(unpackhub) IWMMXT_OP_ENV1(unpackhub)
IWMMXT_OP_1(unpackhuw) IWMMXT_OP_ENV1(unpackhuw)
IWMMXT_OP_1(unpackhul) IWMMXT_OP_ENV1(unpackhul)
IWMMXT_OP_1(unpacklsb) IWMMXT_OP_ENV1(unpacklsb)
IWMMXT_OP_1(unpacklsw) IWMMXT_OP_ENV1(unpacklsw)
IWMMXT_OP_1(unpacklsl) IWMMXT_OP_ENV1(unpacklsl)
IWMMXT_OP_1(unpackhsb) IWMMXT_OP_ENV1(unpackhsb)
IWMMXT_OP_1(unpackhsw) IWMMXT_OP_ENV1(unpackhsw)
IWMMXT_OP_1(unpackhsl) IWMMXT_OP_ENV1(unpackhsl)
IWMMXT_OP_SIZE(cmpeq) IWMMXT_OP_ENV_SIZE(cmpeq)
IWMMXT_OP_SIZE(cmpgtu) IWMMXT_OP_ENV_SIZE(cmpgtu)
IWMMXT_OP_SIZE(cmpgts) IWMMXT_OP_ENV_SIZE(cmpgts)
IWMMXT_OP_SIZE(mins) IWMMXT_OP_ENV_SIZE(mins)
IWMMXT_OP_SIZE(minu) IWMMXT_OP_ENV_SIZE(minu)
IWMMXT_OP_SIZE(maxs) IWMMXT_OP_ENV_SIZE(maxs)
IWMMXT_OP_SIZE(maxu) IWMMXT_OP_ENV_SIZE(maxu)
IWMMXT_OP_SIZE(subn) IWMMXT_OP_ENV_SIZE(subn)
IWMMXT_OP_SIZE(addn) IWMMXT_OP_ENV_SIZE(addn)
IWMMXT_OP_SIZE(subu) IWMMXT_OP_ENV_SIZE(subu)
IWMMXT_OP_SIZE(addu) IWMMXT_OP_ENV_SIZE(addu)
IWMMXT_OP_SIZE(subs) IWMMXT_OP_ENV_SIZE(subs)
IWMMXT_OP_SIZE(adds) IWMMXT_OP_ENV_SIZE(adds)
IWMMXT_OP(avgb0) IWMMXT_OP_ENV(avgb0)
IWMMXT_OP(avgb1) IWMMXT_OP_ENV(avgb1)
IWMMXT_OP(avgw0) IWMMXT_OP_ENV(avgw0)
IWMMXT_OP(avgw1) IWMMXT_OP_ENV(avgw1)
IWMMXT_OP(msadb) IWMMXT_OP(msadb)
IWMMXT_OP(packuw) IWMMXT_OP_ENV(packuw)
IWMMXT_OP(packul) IWMMXT_OP_ENV(packul)
IWMMXT_OP(packuq) IWMMXT_OP_ENV(packuq)
IWMMXT_OP(packsw) IWMMXT_OP_ENV(packsw)
IWMMXT_OP(packsl) IWMMXT_OP_ENV(packsl)
IWMMXT_OP(packsq) IWMMXT_OP_ENV(packsq)
static void gen_op_iwmmxt_set_mup(void) static void gen_op_iwmmxt_set_mup(void)
{ {
@ -2007,13 +2014,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
} }
switch ((insn >> 22) & 3) { switch ((insn >> 22) & 3) {
case 1: case 1:
gen_helper_iwmmxt_srlw(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_srlw(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 2: case 2:
gen_helper_iwmmxt_srll(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_srll(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 3: case 3:
gen_helper_iwmmxt_srlq(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_srlq(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
} }
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
@ -2035,13 +2042,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
} }
switch ((insn >> 22) & 3) { switch ((insn >> 22) & 3) {
case 1: case 1:
gen_helper_iwmmxt_sraw(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_sraw(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 2: case 2:
gen_helper_iwmmxt_sral(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_sral(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 3: case 3:
gen_helper_iwmmxt_sraq(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_sraq(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
} }
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
@ -2063,13 +2070,13 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
} }
switch ((insn >> 22) & 3) { switch ((insn >> 22) & 3) {
case 1: case 1:
gen_helper_iwmmxt_sllw(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_sllw(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 2: case 2:
gen_helper_iwmmxt_slll(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_slll(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 3: case 3:
gen_helper_iwmmxt_sllq(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_sllq(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
} }
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
@ -2091,21 +2098,21 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
return 1; return 1;
} }
gen_helper_iwmmxt_rorw(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_rorw(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 2: case 2:
if (gen_iwmmxt_shift(insn, 0x1f, tmp)) { if (gen_iwmmxt_shift(insn, 0x1f, tmp)) {
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
return 1; return 1;
} }
gen_helper_iwmmxt_rorl(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_rorl(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
case 3: case 3:
if (gen_iwmmxt_shift(insn, 0x3f, tmp)) { if (gen_iwmmxt_shift(insn, 0x3f, tmp)) {
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
return 1; return 1;
} }
gen_helper_iwmmxt_rorq(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_rorq(cpu_M0, cpu_env, cpu_M0, tmp);
break; break;
} }
tcg_temp_free_i32(tmp); tcg_temp_free_i32(tmp);
@ -2239,7 +2246,7 @@ static int disas_iwmmxt_insn(CPUState *env, DisasContext *s, uint32_t insn)
rd0 = (insn >> 16) & 0xf; rd0 = (insn >> 16) & 0xf;
gen_op_iwmmxt_movq_M0_wRn(rd0); gen_op_iwmmxt_movq_M0_wRn(rd0);
tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f)); tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
gen_helper_iwmmxt_shufh(cpu_M0, cpu_M0, tmp); gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, tmp);
tcg_temp_free(tmp); tcg_temp_free(tmp);
gen_op_iwmmxt_movq_wRn_M0(wrd); gen_op_iwmmxt_movq_wRn_M0(wrd);
gen_op_iwmmxt_set_mup(); gen_op_iwmmxt_set_mup();