mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-18 13:38:36 -07:00
target-arm: fix neon shift helper functions
Current code is broken at least on recent compilers, comparison between signed and unsigned types yield incorrect code and render the neon shift helper functions defunct. This is the third revision of this patch, casting all comparisons with the sizeof operator to signed ssize_t type to force comparisons to be between signed integral types. Signed-off-by: Juha Riihimäki <juha.riihimaki@nokia.com> Acked-by: Laurent Desnogues <laurent.desnogues@gmail.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
ca9a32e4f3
commit
50f67e95e2
1 changed files with 14 additions and 12 deletions
|
|
@ -392,7 +392,8 @@ NEON_VOP(abd_u32, neon_u32, 1)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8 || tmp <= -sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8 || \
|
||||||
|
tmp <= -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} else if (tmp < 0) { \
|
} else if (tmp < 0) { \
|
||||||
dest = src1 >> -tmp; \
|
dest = src1 >> -tmp; \
|
||||||
|
|
@ -420,9 +421,9 @@ uint64_t HELPER(neon_shl_u64)(uint64_t val, uint64_t shiftop)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} else if (tmp <= -sizeof(src1) * 8) { \
|
} else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = src1 >> (sizeof(src1) * 8 - 1); \
|
dest = src1 >> (sizeof(src1) * 8 - 1); \
|
||||||
} else if (tmp < 0) { \
|
} else if (tmp < 0) { \
|
||||||
dest = src1 >> -tmp; \
|
dest = src1 >> -tmp; \
|
||||||
|
|
@ -453,11 +454,11 @@ uint64_t HELPER(neon_shl_s64)(uint64_t valop, uint64_t shiftop)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} else if (tmp < -sizeof(src1) * 8) { \
|
} else if (tmp < -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = src1 >> (sizeof(src1) * 8 - 1); \
|
dest = src1 >> (sizeof(src1) * 8 - 1); \
|
||||||
} else if (tmp == -sizeof(src1) * 8) { \
|
} else if (tmp == -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = src1 >> (tmp - 1); \
|
dest = src1 >> (tmp - 1); \
|
||||||
dest++; \
|
dest++; \
|
||||||
dest >>= 1; \
|
dest >>= 1; \
|
||||||
|
|
@ -494,9 +495,10 @@ uint64_t HELPER(neon_rshl_s64)(uint64_t valop, uint64_t shiftop)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8 || tmp < -sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8 || \
|
||||||
|
tmp < -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} else if (tmp == -sizeof(src1) * 8) { \
|
} else if (tmp == -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = src1 >> (tmp - 1); \
|
dest = src1 >> (tmp - 1); \
|
||||||
} else if (tmp < 0) { \
|
} else if (tmp < 0) { \
|
||||||
dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \
|
dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \
|
||||||
|
|
@ -528,14 +530,14 @@ uint64_t HELPER(neon_rshl_u64)(uint64_t val, uint64_t shiftop)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8) { \
|
||||||
if (src1) { \
|
if (src1) { \
|
||||||
SET_QC(); \
|
SET_QC(); \
|
||||||
dest = ~0; \
|
dest = ~0; \
|
||||||
} else { \
|
} else { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} \
|
} \
|
||||||
} else if (tmp <= -sizeof(src1) * 8) { \
|
} else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = 0; \
|
dest = 0; \
|
||||||
} else if (tmp < 0) { \
|
} else if (tmp < 0) { \
|
||||||
dest = src1 >> -tmp; \
|
dest = src1 >> -tmp; \
|
||||||
|
|
@ -579,11 +581,11 @@ uint64_t HELPER(neon_qshl_u64)(CPUState *env, uint64_t val, uint64_t shiftop)
|
||||||
#define NEON_FN(dest, src1, src2) do { \
|
#define NEON_FN(dest, src1, src2) do { \
|
||||||
int8_t tmp; \
|
int8_t tmp; \
|
||||||
tmp = (int8_t)src2; \
|
tmp = (int8_t)src2; \
|
||||||
if (tmp >= sizeof(src1) * 8) { \
|
if (tmp >= (ssize_t)sizeof(src1) * 8) { \
|
||||||
if (src1) \
|
if (src1) \
|
||||||
SET_QC(); \
|
SET_QC(); \
|
||||||
dest = src1 >> 31; \
|
dest = src1 >> 31; \
|
||||||
} else if (tmp <= -sizeof(src1) * 8) { \
|
} else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \
|
||||||
dest = src1 >> 31; \
|
dest = src1 >> 31; \
|
||||||
} else if (tmp < 0) { \
|
} else if (tmp < 0) { \
|
||||||
dest = src1 >> -tmp; \
|
dest = src1 >> -tmp; \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue